Avatar billede Slettet bruger
30. august 2008 - 22:35 Der er 15 kommentarer og
3 løsninger

Hjælp til løsning af ligning

Hej eksperter,

Hvordan finder jeg a i følgende ligning:
c = (a + b) % 255

c og b er kendte.
Avatar billede arne_v Ekspert
30. august 2008 - 22:41 #1
Der er mange loesninger.

Men:

a = c - b

må være en løsning.
Avatar billede pidgeot Nybegynder
30. august 2008 - 22:50 #2
Og bare for lige at komme med en mere detaljeret forklaring:

Træk (b % 255) fra c (hvis dette er negativt, så læg 255 til). Det giver dig a % 255.

Eks.:
b = 1016, c = 42

b % 255 = 251
c - (b % 255) = -209 => 46

Du kan se det er rigtigt ved at indsætte a i din ligning:
c = (46 + 1016) % 255
c = 1062 % 255
c = 42

Grundet modulus operatoren kan du ikke vide hvad det nøjagtige værdi var - da a % x = a+x % x (eller sagt på en anden måde, a % x = a+n*x, hvor n er et heltal). (selvfølgelig med mindre du ved at a er indenfor et lille nok interval)
Avatar billede liebmann Nybegynder
30. august 2008 - 22:52 #3
Hvad står %-tegnet for ?
Ligningen er:
c = a%255 + b%255
a%255 = c - b%255
Hvis % står for *% (gange procent) så
a = C/2,55 + b
Hvis % er divisionstegn så:
a = c/255 + b
Avatar billede pidgeot Nybegynder
30. august 2008 - 22:54 #4
% er modulus, dvs. divisionsrest. Det er mest i programmeringsmæssig sammenhæng man bruger %, hvilket kommer af at det er det opeartoren hedder i eks. C.

I matematisk sammenhæng ville man normalt skrive "mod".
Avatar billede Slettet bruger
30. august 2008 - 23:14 #5
Hmm... Okay, jeg bliver helt forvirret nu. Jeg forklarer lige yderligere:

Jeg anvender denne ligning (eller disse ligninger) i en krypteringsmotor under udvikling. Krypteringsalgoritmen er:
result += (subject[i] + addition + codex[i % (codex.length() - 1)]) % 255; // VC++

Se, det skulle jeg gerne have regnet godt nok ud - så vidt jeg kan forudse, danner algoritmen koder, der kun kan brydes med brute force. Jeg har før arbejdet med et lignende projekt, jeg fik til at virke - men nu ved jeg ikke, hvor jeg gjorte af kildekoden. Derfor står jeg nu med et problem: Hvordan omvender jeg koden? For at forenkle den:
result = c
subject[i] = a
addition + codex[i % (codex.length() - 1)] = b
Derfor: c = (a + b) % 255

Hvordan pokker får jeg omvendt den algoritme?! Jeg er forvirret!
Avatar billede Slettet bruger
30. august 2008 - 23:19 #6
PS: Da a er en værdi af typen byte (0-255) og udtryk for en char (enkelt karakter), er a=2 lige så godt som a=257.
Avatar billede pidgeot Nybegynder
30. august 2008 - 23:31 #7
Char er begrænset til 0-255 (hvilket er 256 værdier, ikke 255), og derfor får du ikke en entydig værdi hvor c = 0 ((a+b) & 0xFF kunne være både 0 og 255). Dermed kan du opnå et unikt resultat ved at bruge % 256 (= & 0xFF - det bør din compiler dog optimere til i den situation) i stedet. Når den ændring er fortaget, så er den nøjagtige fremgangsmåde beskrevet tidligere (fordi dit interval ikke er større end X værdier, hvor X er det du skriver efter %, så kan man bestemme værdien entydigt).

Jeg vil i øvrigt lige minde om Unicode, hvis det her program har blot den mindste relevans udenfor et meget lukket miljø (det er min holdning at man skal have en exceptionel god grund for ikke at bruge Unicode nu om dage). Der skal du huske at de tegn man arbejder med, TCHAR i Windows, fylder 16 bit, så du skal i så fald måske have konverteret dit subject til en anden datatype til krypteringen/dekrypteringen.
Avatar billede arne_v Ekspert
30. august 2008 - 23:36 #8
den simpleste formel vil nok være

a = (c - b + 256) % 256

hvis det er unsigned char.
Avatar billede arne_v Ekspert
30. august 2008 - 23:37 #9
char i C/C++ er desværre (!) default -128..127 ikke 0..255
Avatar billede arne_v Ekspert
30. august 2008 - 23:39 #10
unicode behøver ikke være et problem selvom man processer bytes - noget encoded i 2 bytes
bliver bare krypteret og dekrypteret som 2 separate bytes
Avatar billede pidgeot Nybegynder
30. august 2008 - 23:55 #11
Det er korrekt at det ikke behøver være et problem - jeg gør bare opmærksom på at man lige skal huske at der skal en konvertering ind til/fra TCHAR ud fra de bytes man har.
Avatar billede Slettet bruger
31. august 2008 - 00:25 #12
Okay!
result += (subject[i] - addition - codex[i % (codex.length() - 1)]) % 256;
Dvs. a = (c - b) % 256, hvilket jeg har prøvet 100 gange før - det viser sig imidlertid, at compileren ikke rebuildede hele projektet, men i stedet debuggede sidste kompilering - hvorfor?
Nå, nu har jeg i hvert fald fået det til at fungere. Så kan jeg komme videre til næste problemstilling: Hvilken konvertering snakker I helt præcist om mht. Unicode. Jeg vil anvende krypteringsalgoritmen således:
1) Læs rå tekst fra fil
2) Omdan tekst via algoritme
3) Gem omdannet tekst til ny fil
Har 8/16-bitkonflikten så noget at sige?
Avatar billede arne_v Ekspert
31. august 2008 - 00:46 #13
Hvis du læser chars, krypterer chars, dekrypterer chars og skriver chars så har du ikke
noget problem.
Avatar billede Slettet bruger
31. august 2008 - 09:12 #14
Skønt. Må jeg få nogle svar? :)
Avatar billede arne_v Ekspert
31. august 2008 - 18:33 #15
.
Avatar billede Slettet bruger
31. august 2008 - 19:00 #16
pidgeot?
Avatar billede pidgeot Nybegynder
31. august 2008 - 21:29 #17
Værsgo :)
Avatar billede Slettet bruger
01. september 2008 - 07:32 #18
Sårn!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester