Implementation des Miller-Rabin-Tests in Python3 |
| 09.03.2024, 11:50 | Malcang | Auf diesen Beitrag antworten » | ||||||||
Implementation des Miller-Rabin-Tests in Python3
ich arbeite gerade mit dem Miller-Rabin-Test, den ich als Vergleich zu einem anderen Primzahltest heranziehen möchte. Allerdings hatte ich bisher noch keine Beührungspunkte damit und frage mich daher, ob meine Implementation ok ist oder ob/wo ich etwas verbessern kann. Hier erstmal mein Code:
Überprüfe ich nun damit, so kommt nach 4.2 Sekunden das Ergebnis >>False<<. Ich habe keine Idee, wie eine Benchmark dazu aussehen könnte. |
||||||||||
| 09.03.2024, 16:35 | Romaxx | Auf diesen Beitrag antworten » | ||||||||
Was mir spontan auffällt, ist, dass du rounds als input definierst, es aber nirgends verwendest. Weiterhin loopst du über 1 bis t und t = 1. Ich habe nicht weiter hineingeschaut. Als Benchmark kannst du gegen die theoretische Wahrscheinlichkeit testen, mit der der Test richtig liegt. Wiki schreibt dazu (Stichwort: Abschnitt Zuverlässigkeit auf deutsche Wiki Seite): Nach Schritten ist die Wahrscheinlichkeit, eine zusammengesetzte Zahl für prim zu halten, kleiner als , also z. B. nach vier Schritten kleiner als 0,4 % und nach zehn Schritten kleiner als . Lass deinen Code für ein festes N tausend mal laufen und vergleiche Theorie gegen Testlauf. EDIT: Ich sehe gerade, dass t doch größer als 1 sein kann in Zeile 10. |
||||||||||
| 09.03.2024, 17:27 | Malcang | Auf diesen Beitrag antworten » | ||||||||
Hi Romaxx, danke für deine Antwort.
Meinst du dass t=1 sein könnte? Das passiert nicht, denn bei einer (großen) ungeraden Zahl N subtrahiere ich eins und spalte dann t mal die zwei ab.
Aber ich frage mich, wie lange sollte der Code brauchen? Ich habe einen Primzahltest, der ist bisher dreimal so schnell als der RM. Das freut mich natürlich, aber möglicherweise ist meine Implementation von RM ja auch einfach nur schlecht
|
||||||||||
| 09.03.2024, 17:51 | Romaxx | Auf diesen Beitrag antworten » | ||||||||
Ja, siehe meinen EDIT.
D.h. dir geht es nicht um die richtige Implementierung (richtiger Output), sondern um Geschwindigkeit, d.h. Qualität der Implementierung? Hm, da habe ich kurzer Hand keine Meinung zu. Eventuell schaue ich mir bei Gelegenheit diesen Test noch etwas genauer an, um dann eine qualifizierte Meinung dazu äußern zu können. |
||||||||||
| 09.03.2024, 19:09 | Malcang | Auf diesen Beitrag antworten » | ||||||||
Um beides. Als Vorlage für meinen Code habe ich mich bei Otto Forster orientiert, der ihn für seine Programmiersprache Aribas ausgelegt hat. [attach]57617[/attach] |
||||||||||
| 09.03.2024, 20:42 | HAL 9000 | Auf diesen Beitrag antworten » | ||||||||
Ist das Absicht, dass du eine Testzahl nimmst, der man auch ohne nennenswerte Rechnung sofort ansieht, dass sie keine Primzahl ist? |
||||||||||
| Anzeige | ||||||||||
|
|
||||||||||
| 10.03.2024, 08:14 | Malcang | Auf diesen Beitrag antworten » | ||||||||
Nein. Aber so ist doch eigentlich umso anschaulicher wenn der Test dafür einige Zeit braucht, wir aber nicht
|
||||||||||
| 11.03.2024, 08:57 | HAL 9000 | Auf diesen Beitrag antworten » | ||||||||
Ja Ok, für Kandidaten wird die Schleifenzahl natürlich dann maximal ausgenutzt, wenn keine Primzahl ist. Was ja für sowie Exponenten mit ungeraden Primteilern ganz sicher der Fall ist: Für gilt . Und für Zweiterpotenzen wäre es eine echte Sensation, da mal auf eine Primzahl zu treffen: Ist für meines Wissens nach noch nicht gelungen.
|
||||||||||
| 11.03.2024, 09:15 | Malcang | Auf diesen Beitrag antworten » | ||||||||
Ich hatte die Hoffnung, dass ich überprüfen könnte, aber dafür fehlt mir der RAM
Danke HAL für deinen Einwand. Also der Hintergrund meiner Frage ist der: Ich habe ja einen "eigenen" Primzahltest und möchte den gerne mit etablierten Tests vergleichen. Daher habe ich den Miller-Rabin auf diese Weise implementiert. Nun gibt es aber auch eine Variante des Tests im Package gmpy2, der ist natürlich 100x schneller. Aber da kenne ich mich leider nicht aus um zu entscheiden, ob das noch ein "Äpfel mit Äpfel" Vergleich ist. Denn gmpy2 ist ja in C geschrieben. Also hätte ich jetzt gedacht, dass ich damit ja ganz andere Methoden ausreizen kann, als sie mir python zur Verfügung stellt. Wenn ich "meinen" Test in C schreiben würde, wäre der ja möglicherweise auch schneller. Aber ich will halt bei python bleiben. |
||||||||||
| 11.03.2024, 10:02 | HAL 9000 | Auf diesen Beitrag antworten » | ||||||||
So "natürlich" empfinde ich das gar nicht: Mag sein, dass Python eine Interpretersprache ist, aber für sehr große Zahlen wird das Gros der für dein Skript benötigten Zeit doch in den gmpy2.powmod-Zeilen verbracht, und dort wirken dann ja bereits die schnellen C-Routinen dieser Library. Ist ja nicht so, dass du Millionen Schleifen innerhalb des Python-Codes zu bewältigen hast! Ich weiß daher leider auch nicht, was hier der Grund für die deutlich geringere Performance ist.
|
||||||||||
| 11.03.2024, 10:19 | Malcang | Auf diesen Beitrag antworten » | ||||||||
Ah, danke HAL! Klar, wenn ich "nur" auf python aus bin, dann hätte ich ja in meinem eigenen Test auch auf gmpy2 verzichten müssen. Von daher nutze ich hier nur die schnellen C-Routinen zum Potenzieren. Und genau das mache ich ja auch im Miller-Rabin. Wenn ich das richtig verstanden habe, sind die Codes also doch "vergleichbar", so wie sie dort sind. Es geht mir gar nicht so sehr darum, dass der Miller-Rabin in dieser Implementation "besonders schnell" ist, sondern dass er meinem Test als Vergleich dient. Denn wenn der MR-Test in einer kompilierten Sprache 100x schneller läuft, tut es meiner das in dieser Sprache ja möglicherweise auch. Habe ich dich richtig verstanden? |
||||||||||
| 16.05.2024, 11:58 | newbie-02 | Auf diesen Beitrag antworten » | ||||||||
| Miller Rabin Test in Python Hinweis auf jemanden der über das Thema doziert: Der Miller-Rabin-Test: youtube watch?v=Tqq6hxxnhEs&list=PLb0zKSynM2PBYzz6l37rWH3B_n_7P40QP und Der Miller-Rabin-Test in Python: youtube watch?v=5x4Ho1-ZTmA&list=PLb0zKSynM2PBYzz6l37rWH3B_n_7P40QP und Hinweis den ich erhielt nachdem ich wegen 'langsam' nachgefragt hatte: 'der Miller-Rabin-Test ist korrekt implementiert, aber aus didaktischen Gründen nicht optimiert. Ersetzen Sie (a**d)%p durch pow(a,d,p), dann sollte es schneller gehen.' vielleicht hilft es dem Einen oder Anderen ... |
||||||||||
|
|
Verwandte Themen
| Die Beliebtesten » |
| Die Größten » |
| Die Neuesten » |
|
