Welcher ist der schnellste Algorithmus, um Primzahlen zu finden?
Das ist der Schnellste Algorithmus, um herauszufinden, Primzahlen mit C++? Ich habe verwendet sieve-Algorithmus, aber ich immer noch wollen, dass es schneller!
InformationsquelleAutor der Frage kasperasky | 2009-01-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine sehr schnelle Umsetzung der Sieb des Atkin ist Dan Bernstein ' s primegen. Dieses Sieb ist effizienter als die Sieb des Eratosthenes. Seine Seite hat einige benchmark-Informationen.
InformationsquelleAutor der Antwort Greg Hewgill
Wenn es wirklich schnell sein, können Sie auch eine Liste von Primzahlen:
http://www.bigprimes.net/archive/prime/
Wenn Sie müssen nur wissen, ob eine bestimmte Zahl eine Primzahl ist, gibt es verschiedene prime-tests aufgelistet auf wikipedia. Sie sind wahrscheinlich die Schnellste Methode, um zu bestimmen, wenn große zahlen sind Primzahlen, vor allem, weil Sie kann Ihnen sagen, ob eine Zahl nicht eine Primzahl ist.
InformationsquelleAutor der Antwort Georg Schölly
Er, ich weiß, ich bin eine Frage, die der Nekromant Antworten auf alte Fragen, aber ich habe gerade gefunden diese Frage suchen im Netz nach Möglichkeiten, effizient zu implementieren Primzahlen-tests.
Bis jetzt, glaube ich, dass die Schnellste Primzahl-Test-Algorithmus ist Stark Wahrscheinlich Prime (SPRP). Ich zitiere von Nvidia CUDA Foren:
Siehe hier für mehr info:
http://primes.utm.edu/prove/prove2_3.html und http://forums.nvidia.com/index.php?showtopic=70483
Wenn Sie müssen nur einen Weg zur Erzeugung von sehr großen Primzahlen und kümmern sich nicht um die Generierung aller Primzahlen < eine ganze Zahl n, die Sie verwenden können, Lucas-Lehmer-test, um zu überprüfen, Mersenne Primzahlen. Eine Mersenne-Zahl in der form 2^p-1. Ich denke, dass Lucas-Lehmer-test ist der Schnellste Algorithmus entdeckt für Mersenne-zahlen.
Und wenn Sie nicht nur wollen, verwenden Sie die Schnellste Algorithmus, aber auch die Schnellste hardware hat, versuchen Sie es zu implementieren, mithilfe von Nvidia CUDA, schreiben einen kernel für CUDA und führen Sie es auf der GPU.
Können Sie sogar Geld verdienen, wenn Sie entdecken groß genug Primzahlen, EFF gibt Preise von $50K $250K:
https://www.eff.org/awards/coop
InformationsquelleAutor der Antwort Mack
Es ist ein 100% mathematischen test, der prüft, ob eine Zahl
P
eine Primzahl ist oder nicht, genannt AKS Primality Test.Das Konzept ist einfach: gegeben sei eine Zahl
P
wenn alle Koeffizienten von(x-1)^P - (x^P-1)
sind teilbar durchP
dannP
eine Primzahl ist, andernfalls ist es eine zusammengesetzte Zahl.Beispielsweise gegeben
P = 3
hätte das Polynom:Und die Koeffizienten sind beide teilbar durch
3
daher die Zahl eine Primzahl ist.Beispiel und wo
P = 4
die NICHT eine Primzahl ergeben würde:Und hier können wir sehen, dass die Koeffizienten
6
ist nicht teilbar durch4
daher ist es NICHT prim.Das Polynom
(x-1)^P
wirdP+1
Bedingungen und entdeckt werden können Kombination. Also, dieser test wird inO(n)
Laufzeit, also ich weiß nicht, wie sinnvoll das wäre, da kann man einfach Durchlaufeni
von 0 bisp
und Prüfung für den Rest.InformationsquelleAutor der Antwort Kousha
Ist dein problem, zu entscheiden, ob eine bestimmte Zahl eine Primzahl ist? Dann brauchen Sie eine primality test (leicht). Oder wollen Sie alle Primzahlen bis zu einer gegebenen Zahl ist? In diesem Fall prime durchsiebt gut sind (einfach, aber erfordern Speicher). Oder benötigen Sie die Primfaktoren einer Zahl? Dies würde erfordern, die Faktorisierung (schwierig für große zahlen, wenn Sie wirklich wollen, dass die effizientesten Methoden). Wie groß sind die zahlen, die Sie suchen? 16 bit? 32 bit? größer?
Einer cleveren und effizienten Weise zu pre-compute-Tabellen von Primzahlen, und halten Sie Sie in eine Datei mit einem bit-level-Codierung. Die Datei wird als eine lange bit-Vektor in der Erwägung, dass bit n repräsentiert die ganze Zahl n ist. Wenn n eine Primzahl ist, dessen bit gesetzt ist und null sonst. Lookup ist sehr schnell (Sie berechnen den byte-offset und eine bit-Maske) und benötigt nicht das laden der Datei im Speicher.
InformationsquelleAutor der Antwort Christian Lindig
Hängt es von Ihrer Anwendung. Es gibt einige überlegungen:
Den Miller-Rabin-und Analog-tests, die sind nur schneller als ein Sieb für zahlen über einer bestimmten Größe (irgendwo um ein paar Millionen, glaube ich). Unten, mit einem trial-division (wenn Sie nur ein paar zahlen) oder ein Sieb ist schneller.
InformationsquelleAutor der Antwort Svante
Rabin-Miller ist ein standard probabilistic primality test. (Sie führen es K-mal und die Eingabe-Zahl ist entweder definitiv composite, oder es ist wahrscheinlich prim mit Fehlerwahrscheinlichkeit 4K. (ein paar hundert Iterationen, und es ist fast sicher sagen Sie die Wahrheit)
Gibt es eine nicht-probabilistische (deterministisch) Variante des Rabin-Miller.
Den Great Internet Mersenne Prime Search (GIMPS), die gefunden hat, den Weltrekord für die größte bewährten prime (274,207,281 - 1. Juni 2017), verwendet mehrere algorithmenaber dies sind die Primzahlen, die in speziellen Formen. Aber die GIMPS-Seite oben enthält einige Allgemeine deterministische primality tests. Sie erscheinen, um anzuzeigen, welcher Algorithmus ist "Schnellste" hängt von der Größe der Zahl getestet werden. Wenn Ihre Zahl passt in 64 bit, dann sollten Sie wahrscheinlich nicht verwenden eine Methode sollte die Arbeit auf Primzahlen mit mehreren Millionen stellen.
InformationsquelleAutor der Antwort Jason S
Ich immer verwenden Sie diese Methode für die Berechnung der folgenden zahlen Primzahlen mit dem Sieb-Algorithmus.
InformationsquelleAutor der Antwort Osman Goni Nahid
InformationsquelleAutor der Antwort Tjandra
InformationsquelleAutor der Antwort vidura
Ich weiß, es ist etwas später, aber dies könnte nützlich sein für die Menschen, die hier ankommen, aus sucht. Wie auch immer, hier einige JavaScript, die sich auf die Tatsache, dass nur die wichtigsten Faktoren geprüft werden müssen, so dass die früher Primzahlen erzeugt durch den code wieder verwendet als test-Faktoren für spätere. Natürlich alle selbst und mod 5 Werte herausgefiltert, die erste. Das Ergebnis wird im array P, und dieser code kann crunch 10 Millionen Primzahlen, die in unter 1,5 Sekunden auf einem i7-PC (oder 100 Millionen, die in über 20). Umgeschrieben in C sollte es sehr schnell.
InformationsquelleAutor der Antwort Robin Nixon
InformationsquelleAutor der Antwort Gaurav