www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

vorherige Seite 1 2 3 nächste Seite

Blacksoul

Gepostet:
31.01.2007 19:04

   
Genial! ich danke euch!

ich hoffe mal, dass der Code nun so richtig ist, jedoch bin ich mir net sicher, da ich ja nur die Teile probieren konnte:

multcaesar:: String -> Int -> String
multcaesar "" n = ""
multcaesar (x:xs) n = (chr ((( ord x)*n) `mod` 255)) :multcaesar xs n

demultcaesar :: String -> Int -> String
demultcaesar "" n = ""
demultcaesar (x:xs) n = (chr (((ord x) * (mult_inverse n)) `mod` 257)) : demultcaesar xs n

mult_inverse :: Int -> Int
mult_inverse n = [x|x <- [1..256], (x * n) `mod` 257 == 1]


Eine kleine Erklärung, die ich vlt noch morgen vorlegen muss:

multcaesar:
gesucht ist das verschlüsselte w, bei einem modulo p=257, damit es beim zurückrechnen von jeder zahl darunter 1..256 ein Inverse-->(wie kann man das wort erklären?)<-- gibt, da 257 eine Primzahl ist, und einem Faktor n:

c = n*w mod p (mal von dir geklaut^^)

demultcaesar: w = n'c mod p

n' multiplikative inverse zu n, wenn man jetzt noch wüsste was das "inverse" eigentlich ist, bzw. was der begriff bedeutet, wie man den erklären kann^^ bzw. was ist en e "umkehrfunktion" ^^

und inverse gibt eben die umkehrfunkt aus, wobei dee begriff mir so wenig sagt^^..

------------------------------------------------
Ich danke Euch auf jeden Fall schonmal für alles^^....da werd ich wohl euch in nächster Zeit öfter beschäftigen :D


Zum Seitenanfang    
 
Siracusa

Gepostet:
31.01.2007 22:08

   
Hi nochmal,

der Vorschlag von Jacke mit 1/n funktioniert hier eben nicht, weil man nicht wie gewohnt in den reelen Zahlen rechnet, sondern in einem Ring mit ganzen Zahlen. Und 1/n ergibt nicht wieder eine ganze Zahl.

Das Inverse ist ein mathematischer Begriff. Du kannst dir das Inverse zu einem Element e aus einer Menge (z.B. reele Zahlen) wie so eine Art Anti-Element vorstellen, die beide zusammen wieder ein neutrales Element ergeben. Das Inverse von e bzgl. der Addidion ist also -e. Oder bzgl. der Multiplikation 1/e. Bei der Rechnung im Ring ist das finden des Inversen nur etwas komplizierter. Am besten läßt sich das durch eine Formel beschreiben. Wenn e und eine Primzahl p gegeben sind und folgende Gleichung ist erfüllt: e*e' mod p = 1. Dann ist das e' das Inverse zu e im Ring modulo p. Kannst ja bei Wikipedia mal nach "Körper (Algebra)" oder "Ring (Mathematik)" suchen.

Dann noch zum Code:
mult_inverse gibt bei dir noch ne Liste zurück. Soll aber ein int sein, du brauchst also nur noch head vor die Liste schreiben, dann wird das erste Element der Liste zurückgegeben.
Und bei den anderen beiden Funktionen fehlen noch die Verschiebungen +1 und -1. Weil z.B. zu 0 kein Inverses existiert. Und der Modul muß in beiden Funktionen gleich sein, also 257.

Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Blacksoul

Gepostet:
31.01.2007 22:18

   
ach..bei multcaesar hatte ich das nur kopier...257 muss da logisch hin^^...

das mit der verschiebung versteh ich im moment leider nicht : mit dem 1+ und -1 aber es müsste dann so aussehen oder(von dir mal kurz zu so abgeguckt^^):


multcaesar:: String -> Int -> String
multcaesar "" n = ""
multcaesar (x:xs) n = chr((mod(n*( 1+ord x) 257 )-1) :multcaesar xs n

demultcaesar :: String -> Int -> String
demultcaesar "" n = ""
demultcaesar (x:xs) n = chr((mod((mult_inverse n)*( 1+ord x) 257 )-1) : demultcaesar xs n

mult_inverse :: Int -> Int
mult_inverse n = [x|x <- [1..256], (x * n) `mod` 257 == 1]


so richtig?

das mit dem inverse glaube ich verstanden zu haben...danke :)
Zum Seitenanfang    
 
Jacke

Gepostet:
31.01.2007 23:06

   
hier mal eine funktionierende variante ohne modulo

Type :? for help
Main> encode "a" 3
"\291"
Main> decode (encode "a" 3) 3
"a"
Main> decode (encode "test" 3) 3
"test"
Main>


encode "" _ = []
encode (w:ws) n = (chr(n*ord w)::Char) : encode ws n

decode "" _ = []
decode (w:ws) n = (chr((ord w) `div` n)) : decode ws n

gruß Jacke

ps: deine mult_inverse funktion gibt übrigens eine list zurrück...
Zum Seitenanfang    
 
Blacksoul

Gepostet:
31.01.2007 23:24

   
stimmt...hab das head([x|x <- [1..256], (x * n) `mod` 257 == 1]) < ? vergessen..
----> obwohl ich immer nur eine zahl zurückbekommen habe..

bei deiner version gibt es doch dann aber auch verschlüsselungen über das ascii-system hinaus am ende oder?
Zum Seitenanfang    
 
Siracusa

Gepostet:
01.02.2007 02:35

   
Ja Wahnsinn, Jacke!!!

Keine Ahnung warum das funktioniert, aber es funktioniert.
decode (encode ls 123) 123 == ls where ls = ['\0'..'\255']  ==> True

Smilie
Komplizierter ist also nicht immer besser. ^^
Zum Seitenanfang    
 
Jacke

Gepostet:
01.02.2007 07:51

   
ja die lösung ohne modulo geht weiter als der ascii satz...:-(
Zum Seitenanfang    
 
Blacksoul

Gepostet:
01.02.2007 14:19

   
So..ich wollte nochmal allen danken.. :)

hab 14 Punkte bekommen -> 1 :)

dankööö^^

mfg
Zum Seitenanfang    
 
Siracusa

Gepostet:
01.02.2007 18:34

   
Achso, jetzt hab ich's auch geschnallt, der rechnet mit Unicode-Zeichen.
Zum Seitenanfang    
 
Blacksoul

Gepostet:
01.02.2007 20:21

   
"Achso, jetzt hab ich's auch geschnallt, der rechnet mit Unicode-Zeichen."

Hä? :D
Zum Seitenanfang    
 

vorherige Seite 1 2 3 nächste Seite