
„Die größte Primzahl ist
2 32582657 -1 . Und ich bestätige stolz, dass ich mich an alle seine Zahlen erinnert habe ... in binärer Form. "
Karl PomeranceEine natürliche Zahl heißt Primzahl, wenn sie nur zwei verschiedene Teiler hat: einen und sich selbst. Die Aufgabe, Primzahlen zu finden, verfolgt Mathematiker schon sehr lange. Dieses Problem hatte lange Zeit keine direkte praktische Anwendung, aber mit dem Aufkommen der Kryptographie mit öffentlichen Schlüsseln änderte sich alles. Dieser Artikel beschreibt verschiedene Möglichkeiten zur Suche nach Primzahlen, die sowohl von rein akademischem Interesse sind als auch heute in der Kryptographie verwendet werden.
Sieb von Eratosthenes
Sieb von Eratosthenes - ein Algorithmus, der vom antiken griechischen Mathematiker Eratosthenes vorgeschlagen wurde. Mit dieser Methode können Sie alle Primzahlen finden, die kleiner als eine bestimmte Zahl
n sind . Das Wesentliche der Methode ist wie folgt. Betrachten wir eine Reihe von Zahlen von 2 bis
n. Kreuzen Sie alle durch 2 teilbaren Zahlen mit Ausnahme von 2 an. Von der Menge (wir eliminieren) gehen wir zur nächsten „nicht eliminierten“ Zahl - 3, streichen Sie alles, was durch 3 teilbar ist, erneut durch. Wir gehen zur nächsten verbleibenden Zahl - 5 und so weiter, bis wir wir kommen zu
n . Nach dem Ausführen der obigen Schritte verbleiben nur Primzahlen in der ursprünglichen Liste.
Der Algorithmus kann leicht optimiert werden. Da einer der Teiler der Anzahl
n der zusammengesetzten erforderlich
leqslant sqrtn kann der Algorithmus nach dem Löschen der durch teilbaren Zahlen gestoppt werden
sqrtn .
Illustration der Funktionsweise des Algorithmus aus Wikipedia:
Die Komplexität des Algorithmus ist
O(n log logn) Gleichzeitig ist es erforderlich, Informationen darüber zu speichern, welche Nummern durchgestrichen wurden
O(n) Speicher.
Es gibt eine Reihe von Optimierungen, um diese Indikatoren zu reduzieren. Ein Trick, der als
Radfaktorisierung bezeichnet wird, besteht darin, nur Zahlen in die ursprüngliche Liste aufzunehmen,
die mit den ersten Primzahlen
koprime sind (z. B. weniger als 30). Theoretisch wird vorgeschlagen, die ersten einfachen bis etwa zu nehmen
sqrt logn . Dies reduziert die Komplexität des Algorithmus in
log logn mal. Neben den Verbrauch von Speichern zu reduzieren verwendete sogenannte Segmentierung. Der anfängliche Satz von Zahlen ist in Größenabschnitte unterteilt
leqslant sqrtn und für jedes Segment wird das Eratosthenes-Sieb separat angewendet. Der Speicherverbrauch wird auf reduziert
O( sqrtn) .
Atkin-Sieb
Ein besserer Algorithmus zum Sieben von zusammengesetzten Zahlen wurde von Atkin und Bershtein vorgeschlagen und als
Atkin-Sieb bezeichnet . Diese Methode basiert auf den folgenden drei Eigenschaften von Primzahlen.
Eigenschaft 1Wenn
n eine positive Zahl ist, die kein Vielfaches des Quadrats einer Primzahl ist und so, dass
n äquiv.1( mod4) . Dann ist
n genau dann eine Primzahl, wenn die Anzahl der Wurzeln der Gleichung
4x2+y2=n seltsam.
Eigenschaft 2Wenn
n eine positive Zahl ist, die kein Vielfaches des Quadrats einer Primzahl ist und so, dass
n equiv1( mod6) . Dann ist
n genau dann eine Primzahl, wenn die Anzahl der Wurzeln der Gleichung
3x2+y2=n seltsam.
Eigenschaft 3Wenn
n eine positive Zahl ist, die kein Vielfaches des Quadrats einer Primzahl ist und so, dass
N equiv11( mod12) . Dann ist
n genau dann eine Primzahl, wenn die Anzahl der Wurzeln der Gleichung
3x2−y2=n seltsam.
Hinweise für diese Eigenschaften finden Sie in
diesem Artikel .
In der Anfangsphase Siebes Atkin Algorithmus ist ein Array der Größe
A n, gefüllt mit Nullen. Um Primzahlen zu bestimmen, alle
X,y< sqrtn . Für jedes solche Paar wird berechnet
4x2+y2 ,
3x2+y2 ,
3x2−y2 und den Wert der Elemente des Arrays
A[4x2+y2] ,
A[3x2+y2] ,
A[3x2−y2] erhöht sich um eins. Am Ende des Algorithmus sind die Indizes aller Elemente des Arrays mit ungeraden Werten entweder Primzahlen oder Quadrate einer Primzahl. Im letzten Schritt des Algorithmus werden die Quadrate der im Satz verbleibenden Zahlen durchgestrichen.
Aus der Beschreibung des Algorithmus folgt, dass die rechnerische Komplexität des Atkin-Siebs und der Speicherverbrauch sind
O(n) . Bei Verwendung der Radfaktorisierung und -segmentierung wird die Komplexitätsschätzung des Algorithmus auf reduziert
O(n/ log logn) und Speicherverbrauch bis zu
O( sqrtn) .
Mersenne-Zahlen und Luke-Lemer-Test
Mit solchen Komplexitätsindikatoren kann natürlich auch das für Atkin optimierte Sieb nicht zur Suche nach wirklich großen Primzahlen verwendet werden. Glücklicherweise gibt es schnelle Tests, um zu überprüfen, ob eine bestimmte Zahl eine Primzahl ist. Im Gegensatz zu Siebalgorithmen sind solche Tests nicht für die Suche nach allen Primzahlen ausgelegt, sondern können nur mit einiger Wahrscheinlichkeit feststellen, ob eine bestimmte Zahl eine Primzahl ist.
Eine solche Testmethode ist der
Luc-Lemer-Test . Dies ist ein deterministischer und bedingungsloser Test der Einfachheit. Dies bedeutet, dass das Bestehen des Tests die Einfachheit der Nummer garantiert. Leider ist der Test nur für Zahlen besonderer Art gedacht
2p−1 wobei
p eine natürliche Zahl ist. Solche Nummern werden Mersenne-Nummern genannt.
Der Luke-Lemer-Test behauptet, dass die Mersenne-Nummer
Mp=2p−1 prime genau dann, wenn
p prime ist und
Mp teilt
(p−1) Mitglied der Sequenz
Sk rekursiv setzen:
S1=4,Sk=S2k−1−2 für
k>1 .
Für die Nummer
Mp p Bitlänge ist die rechnerische Komplexität des Algorithmus
displaystyleO(p3) .
Aufgrund der Einfachheit und des Determinismus des Tests sind die größten bekannten Primzahlen Mersenne-Zahlen. Der größte bekannte Primzahl bisher -
282,589,933−1 Die Dezimalschreibweise besteht aus 24.862.048 Stellen. Sie können diese Schönheit
hier bewundern.
Satz von Fermat und Miller-Rabin-Test
Es sind nicht viele Mersenne-Primzahlen bekannt, daher erfordert die Kryptographie mit öffentlichen Schlüsseln eine andere Methode zur Suche nach Primzahlen. Eine solche Methode ist der
Fermat-Einfachheitstest . Es basiert auf Fermats kleinem Satz, der besagt, dass wenn
n eine Primzahl ist, für jedes
a , das nicht durch
n teilbar ist, die Gleichheit gilt
An−1 equiv1 PMODn . Der Beweis des Satzes ist auf
Wikipedia zu finden.
Der Fermat-Einfachheitstest ist ein Wahrscheinlichkeitstest, der darin besteht, mehrere Werte von
a aufzuzählen, wenn mindestens einer von ihnen die Ungleichung erfüllt
an−1 not equiv1 pmodn dann ist die Zahl
n zusammengesetzt. Ansonsten ist
n wahrscheinlich eine Primzahl. Je mehr Werte von
a im Test verwendet werden, desto höher ist die Wahrscheinlichkeit, dass
n eine Primzahl ist.
Leider gibt es zusammengesetzte Zahlen
n für welchen Vergleich
an−1 equiv1 pmodn gilt für alle
eine wechselseitige Primzahl mit
n . Solche Zahlen werden
Carmichael-Zahlen genannt . Zusammengesetzte Zahlen, die den Fermat-Test erfolgreich bestehen, werden als pseudo-einfaches Fermat bezeichnet. Die Anzahl der pseudo-einfachen Fermat ist unendlich, daher ist der Fermat-Test nicht der zuverlässigste Weg, um Primzahlen zu bestimmen.
Miller-Rabin-TestZuverlässigere Ergebnisse können erzielt werden, indem der kleine Satz von Fermat und die Tatsache kombiniert werden, dass es für eine Primzahl
p keine anderen Wurzeln der Gleichung gibt
x2 equiv1 pmodp außer 1 und -1. Der Miller-Rabin-Test zählt mehrere Werte von
a auf und überprüft, ob die folgenden Bedingungen erfüllt sind.
Sei
p eine Primzahl und
p−1=2sd , dann gilt für jede mindestens eine der Bedingungen:
- ad equiv pm1 pmodp
- Es gibt eine ganze Zahl r <s, so dass a2rd equiv−1 pmodp
Nach dem Satz von Fermat
ap−1 equiv1 pmodp und seitdem
p−1=2sd aus der Eigenschaft der Wurzeln der Gleichung
x2 equiv1 pmodp Daraus folgt, dass wenn wir eine solche finden, dass eine der Bedingungen nicht erfüllt ist,
p eine zusammengesetzte Zahl ist. Wenn eine der Bedingungen erfüllt ist, wird die Zahl
a nach Miller als Zeuge der Einfachheit der Zahl
n bezeichnet , und die Zahl
n selbst ist wahrscheinlich eine Primzahl.
Je mehr Zeugen der Einfachheit gefunden werden, desto höher ist die Wahrscheinlichkeit, dass
n eine Primzahl ist. Nach Rabins Theorem beträgt die Wahrscheinlichkeit, dass eine zufällig ausgewählte Zahl
a die Einfachheit der zusammengesetzten Zahl bezeugt, ungefähr
1/4 .
Wenn wir also
k Zufallszahlen
a prüfen, dann die Wahrscheinlichkeit, die zusammengesetzte Zahl als Primzahl zu nehmen
ca.(1/4)k .
Die Komplexität des Algorithmus
O(k log3p) Dabei ist
k die Anzahl der Prüfungen.
Aufgrund seiner Geschwindigkeit und hohen Genauigkeit wird der Miller-Rabin-Test häufig bei der Suche nach Primzahlen verwendet. Bei der Überprüfung großer Zahlen auf Einfachheit verwenden viele moderne kryptografische Bibliotheken nur diesen Test, und wie Martin Albrecht in seiner
Arbeit gezeigt hat , reicht dies nicht immer aus.
Er konnte solche zusammengesetzten Zahlen generieren, die den Einfachheitstest in den Bibliotheken OpenSSL, CryptLib, JavaScript Big Number und vielen anderen erfolgreich bestanden haben.
Luke Test und Baillie - PSW Test
Um Schwachstellen in Situationen zu vermeiden, in denen eine von einem Angreifer generierte zusammengesetzte Zahl als Primzahl dargestellt wird, schlägt Martin Albrecht die Verwendung des
Baillie-PSW- Tests vor. Trotz der Tatsache, dass der Baillie-PSW-Test probabilistisch ist, wurden bisher keine Verbindungsnummern gefunden, die diesen Test erfolgreich bestehen. Für die Suche nach einer solchen Zahl im Jahr 1980 versprachen die Autoren des Algorithmus eine Belohnung von 30 US-Dollar. Der Preis wurde noch nicht beansprucht.
Eine Reihe von Forschern
überprüfte alle Zahlen bis zu
264 und keine einzige Verbindungsnummer hat den Baillie-PSW-Test bestanden. Daher für Zahlen weniger
264 Der Test wird als deterministisch angesehen.
Der Kern des Tests besteht darin, die Anzahl während einer Ausfallzeit durch zwei verschiedene Methoden konsistent zu überprüfen. Eine dieser Methoden ist der oben bereits beschriebene Miller-Rabin-Test. Der zweite ist
Lukes Test für starke Pseudo-Einfachheit .
Luke Starker Pseudo-EinfachheitstestLuc -
Sequenzen - Rekursive Sequenzpaaren
\ {U_ {n} (P, Q) \}, \ {V_ {n} (P, Q) \} beschrieben durch die Ausdrücke:
displaystyleU0(P,Q)=0, quadU1(P,Q)=1, quadUn+2(P,Q)=P cdotUn+1(P,Q)−Q cdotUn(P,Q),n geq0
displaystyleV0(P,Q)=2, quadV1(P,Q)=P, quadVn+2(P,Q)=P cdotVn+1(P,Q)−Q cdotVn(P,Q),n geq0
Lass
Un(P,Q) und
Vn(P,Q) - Luc-Sequenz, wo die ganzen Zahlen P und Q die Bedingung
displaystyleD=P2−4Q neq0Wir berechnen
das Jacobi-Symbol :
left( fracDp right)= varepsilon .
Finden Sie solche
r, s, für die die Gleichheit
n−ε=2rsFür Primzahl
n gilt eine der folgenden Bedingungen:
- n teilt Us
- n teilt V2js für einige j <r
Ansonsten ist
n zusammengesetzt.
Die Wahrscheinlichkeit, dass eine zusammengesetzte Zahl
n den Luc-Test für ein gegebenes Parameterpaar P, Q erfolgreich besteht, überschreitet 4/15 nicht. Daher ist diese Wahrscheinlichkeit nach
k- maliger Anwendung des Tests
(4/15)k .
Die Miller-Rabin- und Luke-Tests erzeugen disjunkte Sätze von pseudo-einfachen Zahlen. Wenn die Zahl
p beide Tests bestanden hat, ist dies einfach. Auf dieser Eigenschaft basiert der Baillie-PSW-Test.
Fazit
Je nach Aufgabenstellung können Sie verschiedene Suchmethoden Primzahlen verwenden. Wenn Sie beispielsweise nach großen Mersenne-Primzahlen suchen, wird zunächst mit dem Sieb von Eratosthenes oder Atkin eine Liste von Primzahlen bis zu einer bestimmten Grenze festgelegt
108 . Dann wird für jede Zahl
p aus der Liste unter Verwendung des Luc-Lemer-Tests auf Einfachheit geprüft
Mp=2p−1 .
Um eine große Primzahl in kryptographische Zwecke zu erzeugen, wird
eine Zufallszahl ausgewählt und überprüft von Miller-Rabin - Test oder das zuverlässigere Baillie-PSW. Nach
dem Primzahlverteilungssatz ist für eine zufällig ausgewählte Zahl von 1 bis
n die Wahrscheinlichkeit, Primzahl zu sein, ungefähr gleich
frac1 lnn . Um eine Primzahl von 1024 Bits zu finden, reicht es daher aus, etwa tausend Optionen zu sortieren.
PS-Quellen
Umsetzung aller beschriebenen Algorithmen auf der Go finden Sie unter
GitHub .