Bis jetzt glaube ich, dass der schnellste Primzahltestalgorithmus Strong Probable Prime (SPRP) ist. Ich zitiere aus den Nvidia CUDA Foren:
Eines der praktischeren Nischeprobleme in der Zahlentheorie hat mit der Identifizierung von Primzahlen zu tun. Gegeben N, wie können Sie effizient bestimmen, ob es eine Primzahl ist oder nicht? Dies ist nicht nur ein theoretisches Problem, es könnte ein echtes sein, das im Code benötigt wird, vielleicht wenn Sie dynamisch eine Primzahl-Hashtabellengröße innerhalb bestimmter Bereiche finden müssen. Wenn N etwa auf der Größenordnung von 2^30 liegt, möchten Sie wirklich 30000 Divisionstests durchführen, um nach Faktoren zu suchen? Offensichtlich nicht.
Die häufige praktische Lösung für dieses Problem ist ein einfacher Test namens Euler Probable Prime Test und eine leistungsstärkere Verallgemeinerung namens Strong Probable Prime (SPRP). Dies ist ein Test, der für eine ganze Zahl N probabilistisch als prim oder nicht klassifizieren kann, und wiederholte Tests können die Korrektheitswahrscheinlichkeit erhöhen. Der langsame Teil des Tests selbst besteht hauptsächlich darin, einen Wert ähnlich wie A^(N-1) modulo N zu berechnen. Jeder, der RSA-Public-Key-Verschlüsselungsvarianten implementiert hat, hat diesen Algorithmus verwendet. Er ist nützlich sowohl für große ganze Zahlen (wie 512 Bit) als auch normale 32 oder 64 Bit-Integers.
Der Test kann von einer probabilistischen Ablehnung in einen definitiven Beweis für Primzahlverhältnisse umgewandelt werden, indem bestimmte Testeingabeparameter vorberechnet werden, die bekannt sind, um für Bereiche von N immer erfolgreich zu sein. Leider ist die Entdeckung dieser "besten bekannten Tests" effektiv die Suche nach einem riesigen (in der Tat unendlichen) Bereich. 1980 wurde eine erste Liste nützlicher Tests von Carl Pomerance erstellt (berühmt dafür, derjenige zu sein, der RSA-129 mit seinem quadratischen Siebalgorithmus faktorisieren konnte). Später verbesserte Jaeschke die Ergebnisse signifikant im Jahr 1993. 2004 verbesserten Zhang und Tang die Theorie und Grenzen des Suchbereichs. Greathouse und Livingstone haben bis jetzt die modernsten Ergebnisse im Web veröffentlicht, unter http://math.crg4.com/primes.html, die besten Ergebnisse eines riesigen Suchbereichs.
Weitere Informationen finden Sie hier: http://primes.utm.edu/prove/prove2_3.html und http://forums.nvidia.com/index.php?showtopic=70483
Wenn Sie einfach eine Möglichkeit benötigen, sehr große Primzahlen zu erzeugen und sich nicht darum kümmern, alle Primzahlen < als eine ganze Zahl n zu erzeugen, können Sie den Lucas-Lehmer-Test verwenden, um Mersenne-Primzahlen zu überprüfen. Eine Mersenne-Primzahl ist in der Form von 2^p -1. Ich denke, dass der Lucas-Lehmer-Test der schnellste Algorithmus ist, der für Mersenne-Primzahlen entdeckt wurde.
Und wenn Sie nicht nur den schnellsten Algorithmus verwenden möchten, sondern auch die schnellste Hardware, versuchen Sie, ihn mit Nvidia CUDA zu implementieren, schreiben Sie einen Kernel für CUDA und führen Sie ihn auf der GPU aus.
Sie können sogar etwas Geld verdienen, wenn Sie große genug Primzahlen entdecken, EFF vergibt Preise von $50K bis $250K: https://www.eff.org/awards/coop
0 Stimmen
Ein altes Artikel, das ich gefunden habe, aber interessant aussieht: Spaß mit Primzahlen
30 Stimmen
@Jaider dies scheitert bereits bei Zahlen so niedrig wie 7 (111). Es scheitert auch für 1001=9. Und offensichtlich scheitert es für fast alle Primzahlen im Allgemeinen (deckt nicht den Fall 2^p - 1 ab, die Mersenne-Primzahlen sind - klassisch generierte Beispiele - die immer in Form von 111...1 sein werden)
2 Stimmen
@Kasperasky - Sie haben nicht erwähnt, welches Sieb? Sie meinen wahrscheinlich das Sieb von Eranthoses!
0 Stimmen
Sieb des Eratosthenes Algorithmus
1 Stimmen
Es ist erstaunlich zu sehen, wie viele Antworten es gibt, wenn die Frage absolut unmöglich zu beantworten ist, ohne den Zahlenbereich zu kennen, der abgedeckt werden soll. Wenn Sie alle Primzahlen möchten, ist kein schneller Algorithmus erforderlich.
0 Stimmen
@YvesDaoust ... und mit der besten Antwort, die eindeutig falsch ist, und der zweitbesten Antwort, die keine Antwort ist (im Grunde genommen sagt sie: "Jemand anderes hat es bereits gemacht, nutze ihre Ergebnisse").
1 Stimmen
@WillNess: Würde
int p[]= {2, 3};
als "schnellster Algorithmus zum Auffinden von Primzahlen" gelten?0 Stimmen
@YvesDaoust "...unter 4", vielleicht (mit der fest codierten 4). Andernfalls muss der benötigte Bereich angegeben werden (auch wenn es [0,+inf) ist).
1 Stimmen
@WillNess: Ich frage mich, ob eine einzige Primzahl ausreichen würde, um "numberS" zu befriedigen.
0 Stimmen
@YvesDaoust auch keine Zahlen können die Antwort sein, zum Beispiel für Primzahlen über 5 unter 7.