Entwickler-Ecke
Sonstiges (Delphi) - Primzahl zufällig erstellen
derDoc - Mo 10.03.03 18:49
Titel: Primzahl zufällig erstellen
Ich bin zur Zeit auf der Suche nach einer Möglichkeit, eine Primzahl zufällig zu erstellen. Kennt jemand dafür eine vernünftige Lösung?
Segelflieger - Mo 10.03.03 19:22
Also, mein Vorschlag wäre:
Eine Zufallszahl mit random(max) erzeugen und überprüfen, ob es sich um eine Primzahl handelt. Wenn nicht, dann einfach so lange um 1 erhöhen, bis eine Primzahl daraus wird.
[url=
http://www.delphi-forum.de/viewtopic.php?t=8434]Hier[/url] geht es um eine funktion, mit der man überprüfen kann, ob es eine Primzahl ist.
MfG
derDoc - Mo 10.03.03 20:29
Ich hatte eigentlich gehofft, dass es da eine elegantere Lösung gäbe.
tommie-lie - Mo 10.03.03 20:34
also eigentlich ist Segelfliegers Methode schon eine recht gute und einfache.
Aber du könntest auch einen Pool an Primzahlen anlegen (zum Beispiel mit 'nem array oder so) und dann durch eine Zufallszahl eine Zahl aus diesem array schnappen. Aber dafür musst du deinen Pool erstmal haben. Aber das ist im Prinzip das Vorgehen bei Zufallszahlen aus bestimmten Bereichen. Normalerweise umfasst dieser Bereich alle Zahlen und ist daher sowieso im Zahlensystem festgelegt, aber abstrakt funktioniert auch ein "normaler" Zufallsgeneraor nach diesem Prinzip (siehe 49 Zahlen beim Lotto).
derDoc - Mo 10.03.03 20:37
Dann müsste ich aber erst wie du schon schreibst einen Pool von Primzahlen haben. Also kann mir jemand sagen, wo ich alle Primzahlen im Bereich von 2^512 Zahlen herbekommen kann?
tommie-lie - Mo 10.03.03 20:42
oben steht ein Link, und da drücken Sie dann drauf...
und schon kannst du iterativ jede Zahl durchgehen und wenn sie prim ist, gehört sie auch in den Pool. Aber 2^512 wird eh nicht machbar sein, weil selbst der Int64 nur 64 bit für eine Zahl hat, nicht 512. Die Zahlen könntest du also schon gar nicht darstellen (sowas wie addieren und so weiter geht auch nicht, auch kein IntToStr, selbst eine simple Ausgabe auf den Bildschirm wäre also nichts). Dafür bräuchtest du eine Unit für große Integerzahlen. Müsstest mal bei Torry oder sonstwo suchen...
derDoc - Mo 10.03.03 21:21
Das Erstellen von 512 Bit Integern ist nicht mein Problem, eigentlich hatte ich gehofft, dass jemand mal eine Funktion geschrieben hatte oder dass es irgendwo im Internet eine Liste mit Primzahlen gibt und jemand diese kennen würde.
derDoc - Mo 10.03.03 22:52
Klar kann ich dir das sagen. Im Prinzip geht es um einen simplen RSA Algorithmus, aber ich muss ihn noch auf große Zahlen auslegen. Das kann ich aber erst machen, wenn ich auch kleine hinbekomme.
Motzi - Di 11.03.03 11:40
Du willst dir einen Primzahlen-Pool für alle Primzahlen im Bereich von 2^512 anlegen?!? Na dann würd ich dir mal empfehlen dir noch ein paar Festplatten zuzulegen..! :wink:
Ne, also in dem Zahlenbereich kannst du einen Primzahlenpool vergessen! Normalerweise wird eine Zufallszahl erzeugt (wenn möglich mit einem kryptographisch sicheren Pseudo-Zufallsalgorithmus) und diese dann getestet ob sie prim ist. Ist das nicht der Fall wird eine neue Zufallszahl berechnet und wieder getestet, usw. Wichtig hierbei ist, dass nicht die (bei kleinen Primzahlen übliche) Methode angewandt wird, bei der für alle Zahlen < Sqrt(Zufallszahl) getestet wird ob sie Teiler der Zufallszahl ist, denn das dauert dann ewig (Prinzip der Primfaktorisierung (allerdings die ineffizienteste Methode))! Es gibt noch ein paar andere Test, die zwar nicht mit 100%iger, aber mit ausreichender Sicherheit feststellen ob eine Zahl prim ist oder nicht (mir falln nur grad die Namen dieser Tests nicht ein.. müsste zuhaus nochmal nachschaun).
Christian S. - Di 11.03.03 11:52
Zitat: |
Es gibt noch ein paar andere Test, die zwar nicht mit 100%iger, aber mit ausreichender Sicherheit feststellen ob eine Zahl prim ist oder nicht (mir falln nur grad die Namen dieser Tests nicht ein.. müsste zuhaus nochmal nachschaun). |
Einen sehr beliebten habe ich gestern in dem Thread zum Thema "ist prim" gepostet!
Motzi - Di 11.03.03 15:02
Peter Lustig hat folgendes geschrieben: |
Einen sehr beliebten habe ich gestern in dem Thread zum Thema "ist prim" gepostet! |
Du meinst den Miller-Rabin.. habs schon gesehen..
Es gibt aber auch noch bessere / schnellere... ich schau zu Hause noch mal nach! Aber es sei schonmal gesagt.. diese Algos sind noch wesentlich komplizierter als Miller-Rabin, da bei einem zB das Jacobi-Symbol verwendet wird und für das gibt es in der Unit Maths keine Implementierung -> sprich die muss man dann auch noch selber machn...
Christian S. - Di 11.03.03 15:21
Vom Jacobi-Symbol habe ich noch nie gehört und im Bronstein habe ich es auch nicht gefunden. Was ist denn das?
Der Algorithmus sollte natürlich auch für große Zahlen - sprich Units, die wahrscheinlich eine sehr begrenzte Anzahl an mathematischen Funktionen implementieren - nicht allzu schwer umsetzbar sein. Bei Miller-Rabin habe ich das in Java mal für BigInteger gemacht, das war nicht allzu schwer und die Sicherheit, die man nach kurzer Zeit (also 50 oder 100 Tests) erreichen kann, ist sehr hoch.
derDoc - Di 11.03.03 15:33
Also ich habe gerade mal den Algorithmus von Peter Lustig in das Programm geschrieben und werde mal die Zeit nehmen.
Christian S. - Di 11.03.03 16:17
Habe gerade (mit dem korrigierten Quelltext, siehe anderer Thread) die Primzahl 4544663 1000mal getestet. Mein XP2000+ hat dafür 16 Millisekunden benötigt. Die Fehlerwahrscheinlichkeit beträgt dabei dann 9,3*10^(-302)!
MfG,
Peter
O'rallY - Fr 19.09.03 17:06
Ich hab bei Swissdelphicenter diesen Code entdeckt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85:
| function IsPrime(N: Cardinal): Boolean; register; asm TEST EAX,1 JNZ @@1 CMP EAX,2 SETE AL RET @@1: CMP EAX,73 JE @@E PUSH ESI PUSH EDI PUSH EBX PUSH EBP PUSH EAX LEA EBP,[EAX - 1] MOV ECX,32 MOV ESI,EBP @@2: DEC ECX SHL ESI,1 JNC @@2 PUSH ECX PUSH ESI CMP EAX,08A8D7Fh JAE @@3 CALL @@5 JC @@4 MOV EAX,73 PUSH OFFSET @@4 JMP @@5 CALL @@5 JC @@4 MOV EAX,7 CALL @@5 JC @@4 MOV EAX,61 CALL @@5 @@4: SETNC AL ADD ESP,4 * 3 POP EBP POP EBX POP EDI POP ESI RET @@5: MOV EBX,[ESP + 12] MOV ECX,[ESP + 8] MOV ESI,[ESP + 4] MOV EDI,EAX @@6: DEC ECX MUL EAX DIV EBX MOV EAX,EDX SHL ESI,1 JNC @@7 MUL EDI DIV EBX AND ESI,ESI MOV EAX,EDX @@7: JNZ @@6 CMP EAX,1 JE @@A @@8: CMP EAX,EBP JE @@A DEC ECX JNG @@9 MUL EAX DIV EBX CMP EDX,1 MOV EAX,EDX JNE @@8 @@9: STC @@A: RET @@B: DB 3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71 @@C: MOV EDX,OFFSET @@B MOV ECX,18 @@D: CMP AL,[EDX + ECX] JE @@E DEC ECX JNL @@D @@E: SETE AL end; |
//edit: Beim Debuggen heißt es allerdings bei
JAE @@3 "Undeclared identifier: '@@3'".
Und da ich keine Ahnung von Assambler hab... Ich würd jetzt einfach mal sagen, dass die Variable (?) @@3 nicht defeniert wurde :?.
DaRkFiRe - Sa 20.09.03 10:32
Das is ne Sprungadresse - und die wird sicher irgendwo zwischen @@2 und @@4 liegen, oder? Quasi wie ne Funktion aufrufen, die gar nich existiert.
Nach einer ersten halbwegs logischen Überlegung müsste die Zeile, wo
"// now if (N @@3: MOV EAX,2" steht, @@3 sein.
Probiert ma... Kein Bock, mein Delphi aufzumachen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!