Probabilistische Primzahlensuche - S T A F F
Probabilistische Primzahlensuche - S T A F F
Probabilistische Primzahlensuche - S T A F F
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
BFH Module 7311 (Informatik Seminar)<br />
<strong>Probabilistische</strong> <strong>Primzahlensuche</strong><br />
Florian Leuenberger<br />
29. Mai 2013<br />
29.05.2013 leuef1 Seite 1/15
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
Inhaltsverzeichnis<br />
Abstrakt................................................................................................................................................3<br />
Primzahlen im Allgemeinen.................................................................................................................4<br />
Definition.........................................................................................................................................4<br />
Einsatzgebiet....................................................................................................................................4<br />
Kryptographie.............................................................................................................................4<br />
Pseudo-Zufallszahlengenerator...................................................................................................4<br />
Getriebe.......................................................................................................................................4<br />
Grösste bekannte Primzahl..............................................................................................................4<br />
<strong>Primzahlensuche</strong>...................................................................................................................................5<br />
Probedivision...................................................................................................................................5<br />
Sieb des Eratosthenes.......................................................................................................................5<br />
Sieb von Atkin.................................................................................................................................5<br />
Algorithmus ...............................................................................................................................5<br />
<strong>Probabilistische</strong> <strong>Primzahlensuche</strong>........................................................................................................6<br />
Fermatscher Primzahltest.................................................................................................................6<br />
Kleiner Satz von Fermat ............................................................................................................6<br />
Fermatscher Primzahltest............................................................................................................6<br />
Fermatsche Pseudoprimzahlen....................................................................................................6<br />
Aussage vom Fermatschen Primzahltest.....................................................................................6<br />
Lucas-Test........................................................................................................................................7<br />
Lucas-Test...................................................................................................................................7<br />
Beispiel...................................................................................................................................7<br />
Verbesserter Lucas-Test..............................................................................................................8<br />
Beispiel...................................................................................................................................8<br />
Solovay-Strassen-Test......................................................................................................................9<br />
Jacobi-Symbol.............................................................................................................................9<br />
Solovay-Strassen-Test.................................................................................................................9<br />
Aussage vom Solovay-Strassen-Test..........................................................................................9<br />
Miller-Rabin-Test...........................................................................................................................10<br />
Miller-Rabin-Test......................................................................................................................10<br />
Algorithmus..............................................................................................................................10<br />
Aussage vom Miller-Rabin-Test...............................................................................................10<br />
Beispiel......................................................................................................................................11<br />
Zusammenfassung..............................................................................................................................12<br />
Referenzen..........................................................................................................................................13<br />
Anhang...............................................................................................................................................14<br />
Umsetzung in Java.........................................................................................................................14<br />
Fermat-Test...............................................................................................................................14<br />
Miller-Rabin-Test......................................................................................................................15<br />
29.05.2013 leuef1 Seite 2/15
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
Abstrakt<br />
Primzahlen sind im Laufe der Zeit immer grösser und wichtiger geworden. Dies führte auch zu<br />
neuen Algorithmen, die grosse Zahlen schneller als prim oder zusammengesetzt erkennen können.<br />
Im Bereich der Kryptographie reicht es aus, zusammengesetzte Zahlen mit grossen Faktoren zu<br />
benutzen. Dies führt zu der probabilistischen <strong>Primzahlensuche</strong>, welche mit enormer Effizienz<br />
grosse Zahlen als prim, resp. Pseudoprimzahlen erkennen kann.<br />
29.05.2013 leuef1 Seite 3/15
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
Primzahlen im Allgemeinen<br />
Definition<br />
„Eine Primzahl ist eine natürliche Zahl, die genau zwei natürliche Zahlen als Teiler hat.“ [1]<br />
Eine Primzahl ist also nur durch eins und durch sich selbst ganzzahlig teilbar. Eine Primzahl heisst<br />
prim, alle anderen natürlichen Zahlen heissen zusammengesetzt. Die Zahlen null und eins sind<br />
weder prim noch zusammengesetzt.<br />
Einsatzgebiet<br />
Wo werden Primzahlen eingesetzt?<br />
Kryptographie<br />
Primzahlen spielen in der Kryptographie eine grosse Rolle. Zwei Primzahlen zu multiplizieren ist<br />
einfach, jedoch die resultierende Zahl zu Faktorisieren ist schwierig. Mit diesem wissen und einigen<br />
mathematischen Verfahren kann man ein gutes asymmetrisches Verschlüsselungsverfahren bauen,<br />
wobei man die multiplizierte Zahl (öffentlicher Schlüssel) herausgibt und die Primzahlen (geheimer<br />
Schlüssel) geheim hält. Mit dem öffentlichen Schlüssel kann man nun Texte verschlüsseln und nur<br />
der Inhaber des geheimen Schlüssel kann sie wieder entschlüsseln.<br />
Pseudo-Zufallszahlengenerator<br />
Einfache Zufallszahlengeneratoren benutzen Primzahlen zur Erzeugung von zufällig aussehenden<br />
Zahlenfolgen. Die generierten Zahlen sind nicht wirklich zufällig, da sie deterministisch erzeugt<br />
wurden, sind aber besser Verteilt als wenn man die Zufallsgeneratoren ohne Beachtung auf die<br />
Primzahlen machen würde.<br />
Getriebe<br />
Um der Verstärkung des Verschleisses zwischen Ketten und Zahnräder zu vermeiden, sollten die<br />
Anzahl von Zähnen an den Zahnräder prim sein. So greifen nicht regelmässig dieselben Bolzen in<br />
eine Zahnlücke.<br />
Grösste bekannte Primzahl<br />
Grösste bekannte Primzahl: 2 57885161 – 1<br />
Dezimalstellen: 17425170<br />
Entdeckungsjahr: 2013<br />
Entdecker:<br />
Cooper, Woltman, Kurowski et al.<br />
Genutzter Computer: GIMPS<br />
29.05.2013 leuef1 Seite 4/15
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
<strong>Primzahlensuche</strong><br />
Probedivision<br />
Der einfachste Primzahltest ist die Probedivision. Dabei probiert man nacheinander, ob die Zahl n<br />
durch eine der Primzahlen zwischen 2 und der Wurzel von n teilbar ist. Ist sie das nicht, dann ist n<br />
eine Primzahl. Die Probedivision ist jedoch viel zu aufwendig, sodass sie in der Praxis als<br />
Primzahltest nicht zum Einsatz kommt.<br />
Sieb des Eratosthenes<br />
Das Sieb des Eratosthenes ist ein Algorithmus, der eine Liste von Primzahlen erzeugt. Da diese<br />
Liste bis zu einer frei wählbaren Grenze alle Primzahlen enthält, kann sie für einen Primzahltest<br />
verwendet werden. Man überprüft dazu, ob die übergebene Zahl in der Liste ist. Auch dieses<br />
Verfahren ist für große Zahlen zu aufwendig und kann daher nicht als Primzahltest verwendet<br />
werden.<br />
Sieb von Atkin<br />
Das Sieb von Atkin ist ein schneller, moderner Algorithmus zur Bestimmung aller Primzahlen bis<br />
zu einer vorgegebenen Grenze. Es ist eine optimierte Version des antiken Sieb des Eratosthenes. Die<br />
Performance ist bei einem kleinen Limit von z.B. 100 noch etwas langsamer als bei dem Sieb des<br />
Eratosthenes, aber je größer das Limit, desto größer ist der Zeitvorteil gegenüber der alten<br />
Siebmethode.<br />
Algorithmus<br />
Beim Sieb von Atkin wird mit einer Ergebnisliste und einer Siebliste gearbeitet. Am Anfang wird<br />
die Ergebnisliste mit 2, 3 und 5 gefüllt, die Siebliste mit jeder positiven Zahl bis zur vorgegebenen<br />
Grenze. Alle Einträge in der Siebliste werden initial als nicht-prim markiert.<br />
Danach wird für jeden Eintrag n in der Siebliste folgendes durchgeführt (invertieren bedeutet von<br />
prim zu nicht-prim oder umgekehrt wechseln):<br />
• Falls n modulo 60 den Rest 1, 13, 17, 29, 37, 41, 49, oder 53 ergibt, invertiere n für jede<br />
mögliche Lösung der Gleichung: 4x 2 + y 2 =n<br />
• Falls n modulo 60 den Rest 7, 19, 31, oder 43 ergibt, invertiere n für jede mögliche Lösung<br />
der Gleichung: 3x 2 + y 2 =n<br />
• Falls n modulo 60 den Rest 11, 23, 47, oder 59 ergibt, invertiere n für jede mögliche Lösung<br />
der Gleichung: 3x 2 − y 2 =n , wobei x> y<br />
Als letztes wird für jeden Eintrag n in der Siebliste, beginnend mit der niedrigsten, folgendes<br />
durchgeführt:<br />
• Fall n nicht als prim markiert ist, fahre mit dem nächsten Eintrag fort.<br />
• Füge n in die Ergebnisliste ein.<br />
• Quadriere n und markiere alle Vielfachen von diesem Quadrat als nicht-prim.<br />
29.05.2013 leuef1 Seite 5/15
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
<strong>Probabilistische</strong> <strong>Primzahlensuche</strong><br />
Fermatscher Primzahltest<br />
„Der fermatsche Primzahltest ist ein Primzahltest, der auf dem kleinen fermatschen Satz beruht. Er<br />
dient dazu, Primzahlen von zusammengesetzten Zahlen zu unterscheiden“ [2]<br />
Kleiner Satz von Fermat<br />
Falls p eine Primzahl ist und a eine ganze Zahl, dann gilt<br />
a p ≡ a(mod p)<br />
Insbesondere gilt: Wenn p kein Teiler von a ist, dann ist<br />
a ( p−1) ≡1(mod p)<br />
Euler war der Erste, der den kleinen Satz von Fermat bewiesen hatte. [3]<br />
Fermatscher Primzahltest<br />
Für den fermatschen Primzahltest wird nun die Umkehrung des kleinen Satz von Fermat genutzt.<br />
Setzt man die zu testende Zahl n und eine teilerfremde Basis a in die Formel so erhalten wir<br />
a (n − 1) ≡ 1(mod n)<br />
Falls dies nicht zutrifft kann n keine Primzahl sein. Falls dies jedoch zutrifft, hat die Zahl eine<br />
gewisse Wahrscheinlichkeit, dass sie prim ist. Um die Wahrscheinlichkeit zu erhöhen wird der Test<br />
mit verschiedenen Basen durchgeführt. Wenn der Test nun überall zutrifft ist die Zahl vermutlich<br />
prim.<br />
Fermatsche Pseudoprimzahlen<br />
Fermatsche Pseudoprimzahlen nennt man diese Zahlen, die den Fermatschen Primzahlentest<br />
bestehen, jedoch keine Primzahlen sind. Für n
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
Lucas-Test<br />
Der Lucas-Test ist eine Weiterentwicklung des Fermatschen Primzahltests durch den Mathematiker<br />
Édouard Lucas. Der Test wurde in den 50er Jahren von Derrick Lehmer und später nochmals von<br />
John Brillhart und John L. Selfridge verbessert. [4]<br />
Lucas-Test<br />
Eine natürliche Zahl n ist genau dann eine Primzahl, wenn es ein a mit 1
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
Verbesserter Lucas-Test<br />
Eine natürliche Zahl n ist genau dann eine Primzahl, wenn es ein a mit 1
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
Solovay-Strassen-Test<br />
Der Solovay-Strassen-Test (nach Robert M. Solovay und Volker Strassen) ist ein probabilistischer<br />
Primzahltest und beruht auf dem Monte-Carlo-Algorithmus.[5]<br />
Jacobi-Symbol<br />
Das Jacobi-Symbol J(a,p) liefert drei Unterschiedliche Resultate:<br />
0 wenn a≡0(mod p)<br />
1 wenn a ≠ 0(mod p) und ein x existiert, dass a≡ x 2 (mod p)<br />
-1 wenn keines zutrifft<br />
Solovay-Strassen-Test<br />
Für eine zu prüfende Zahl n wird zufällig eine natürliche Zahl a mit 1
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
Miller-Rabin-Test<br />
„Er ist ein probabilistischer Primzahltest, für den aber für Zahlen unter 10 16 eine deterministische<br />
Verwendung möglich ist“ [6]<br />
Miller-Rabin-Test<br />
Der Miller-Rabin-Test funktioniert ähnlich die der Solovay-Strassen-Test. Er ist jedoch schneller<br />
und genauer, dass heisst der Miller-Rabin-Test erkennt mehr zusammengesetzten Zahlen als der<br />
Solovay-Strassen-Test und in jedem Fall alle zusammengesetzte Zahlen die auch der Solovay-<br />
Strassen-Test erkennt.<br />
Algorithmus<br />
Die zu testende Zahle n.<br />
Zuerst berechnet man die Variablen d und j nach folgendem Prinzip<br />
n – 1=d∗2 j<br />
oder anders ausgedrückt, wird n mit 1 subtrahiert. Die resultierende Zahl wird solange durch 2<br />
geteilt wie es eine ganzzahlige Lösung ergibt. Für d setzen wir das Schlussresultat dieser Prozedur.<br />
Für j setzen wir die Anzahl der Teilungen durch 2.<br />
Danach testen man die Zahl mit einer zufällig gewählten Basis a (1 < a < n). Trifft die Aussage<br />
a d ≡1(mod n)<br />
oder<br />
a (d ∗2r) ≡−1(mod n)<br />
mit 1≤r≤ j zu, so ist die zu testende Zahl wahrscheinlich prim. Um eine höhere<br />
Wahrscheinlichkeit zu erreichen müsste der Test mit einer anderen Basis a wiederholt werden.<br />
Aussage vom Miller-Rabin-Test<br />
Für die Basen a 1
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
Beispiel<br />
Wir prüfen die Zahl 317 und testen mit der Basis 2<br />
n – 1=d∗2 j<br />
316=d∗2 j<br />
316=79∗2 2<br />
Die Zahl 316 kann man 2 mal durch 2 teilen (316/2 = 158, 158/2 = 79, 79 ist nicht durch 2 teilbar),<br />
daraus folgt d = 79 und j = 2.<br />
Nun überprüfen wir ob<br />
oder<br />
stimmt.<br />
a d ≡ 1(mod n)<br />
2 79 ≡ 203(mod 317)<br />
a (d∗2r) ≡−1(mod n)<br />
2 (79∗21) ≡−1(mod 317)<br />
Da die zweite Formel stimmt ist die Zahl 317 wahrscheinlich prim.<br />
Machen wir dasselbe für die Zahl 319.<br />
n –1=d ∗2 j<br />
318=d∗2 j<br />
318=159∗2 1<br />
Die Zahl 318 kann man 1 mal durch 2 teilen (318/2 = 159, 159 ist nicht durch 2 teilbar), daraus<br />
folgt d = 159 und j = 1.<br />
Wir testen ob<br />
oder<br />
stimmt.<br />
a d ≡ 1(mod n)<br />
2 159 ≡ 171(mod 319)<br />
a (d∗2r) ≡−1(mod n)<br />
2 (159∗21) ≡ 212(mod 319)<br />
Da keine der Formel zutrifft wissen wir, dass die Zahl 319 keine Primzahl ist. (319 = 11 * 29)<br />
29.05.2013 leuef1 Seite 11/15
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
Zusammenfassung<br />
Um grosse Zahlen als prim resp. als starke Pseudoprimzahlen zu erkennen ist der Miller-Rabin-Test<br />
die beste Wahl. Er bestimmt die Zahlen mit der höchsten Wahrscheinlichkeit und ist sehr effizient.<br />
Um jedoch eine deterministische Aussage über eine Zahl zu erlangen muss ein deterministischer<br />
Algorithmus, der dadurch länger braucht, verwendet werden. In der Kryptographie genügt es mit<br />
starken Pseudoprimzahlen zu rechnen. Deshalb wird dort hauptsächlich der Miller-Rabin-Test<br />
eingesetzt, da er der effizienteste ist.<br />
29.05.2013 leuef1 Seite 12/15
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
Referenzen<br />
[1] Armin Leutbecher: Zahlentheorie: Eine Einführung in die Algebra. Springer, 1996<br />
[2] http://de.wikipedia.org/wiki/Fermatscher_Primzahltest<br />
[3] Paulo Ribenboim: Die Welt der Primzahlen, Springer Verlag, 2004<br />
[4] http://de.wikipedia.org/wiki/Lucas-Test_(Mathematik)<br />
[5] http://de.wikipedia.org/wiki/Solovay-Strassen-Test<br />
[6] http://de.wikipedia.org/wiki/Miller-Rabin-Test<br />
29.05.2013 leuef1 Seite 13/15
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
Anhang<br />
Umsetzung in Java<br />
Fermat-Test<br />
// die zu überprüfende Zahl number<br />
public boolean checkFermat(BigInteger number){<br />
// die Zahl '1' als BigInteger inizialisieren (einfacher zum rechnen mit BigInteger)<br />
BigInteger one = BigInteger.valueOf(1);<br />
// der Exponent berechnen (number - 1)<br />
BigInteger exponent = number.subtract(one);<br />
// mit jeder basis durchtesten<br />
for (int i : basen){<br />
// aktuelle Basis als BigInteger<br />
BigInteger base = BigInteger.valueOf(i);<br />
// überprüfen ob number = Basis (korrekterweise müsste überprüft werden, ob Basis und<br />
number teilerfremd sind)<br />
if (base.compareTo(number) == 0)<br />
return true;<br />
// kleiner Fermatscher Test ( a^(n-1) = 1 mod n )<br />
BigInteger checkone = base.modPow(exponent, number);<br />
}<br />
// überprüfen ob das Resultat 1 ist, falls nicht => number ist nicht prim<br />
if (checkone.compareTo(one) != 0)<br />
return false;<br />
}<br />
// alle Tests mit den Basen bestanden, number ist prim<br />
return true;<br />
29.05.2013 leuef1 Seite 14/15
BFH <strong>Probabilistische</strong> <strong>Primzahlensuche</strong> Module 7311<br />
Miller-Rabin-Test<br />
// die zu überprüfende Zahl number<br />
public boolean checkMiller(BigInteger number){<br />
// die Zahl '1' und '2' als BigInteger inizialisieren (einfacher zum rechnen mit BigInteger)<br />
BigInteger one = BigInteger.valueOf(1);<br />
BigInteger two = BigInteger.valueOf(2);<br />
// false zurückgeben, falls number kleiner als 2 ist<br />
if (number.compareTo(BigInteger.valueOf(1)) < 1)<br />
return false;<br />
// true zurückgeben fall number = 2 oder 3<br />
if (number.compareTo(BigInteger.valueOf(3)) < 1)<br />
return true;<br />
// d berechnen (number - 1)<br />
BigInteger d = number.subtract(one);<br />
// d ist das selbe wie '-1' mod number, speichern als minusone zum späteren überprüfen<br />
BigInteger minusone = d;<br />
int j = 0;<br />
// d durch 2 teilen solange es geht, d merken und anzahl teilungen als j abspeichern<br />
while(!d.testBit(0)){<br />
d = d.divide(two);<br />
j++;<br />
}<br />
// mit jeder basis durchtesten<br />
for (int i : basen){<br />
// aktuelle Basis als BigInteger<br />
BigInteger base = BigInteger.valueOf(i);<br />
// überprüfen ob number = Basis (korrekterweise müsste überprüft werden, ob Basis und<br />
number teilerfremd sind)<br />
if (number.compareTo(base) < 1)<br />
continue;<br />
// überprüfen ob a^(n-1) = 1 mod n<br />
BigInteger checkone = base.modPow(d, number);<br />
nächsten Test<br />
// falls das Resultat 1 oder -1 ist => Test bestanden, falls nicht => weiter zum<br />
if (checkone.compareTo(one) == 0 || checkone.compareTo(minusone) == 0)<br />
continue;<br />
// überprüfen ob a^(d * 2r) = -1 mod n<br />
boolean checkBreak = false;<br />
for (int r=1; r keine primzahl<br />
if (checkone.compareTo(one) == 0){<br />
return false;<br />
}<br />
// überprüfen ob Resultat = -1<br />
if (checkone.compareTo(minusone) == 0){<br />
checkBreak = true;<br />
break;<br />
}<br />
}<br />
if (checkBreak)<br />
continue;<br />
}<br />
// Test nicht bestanden, number ist nicht prim<br />
return false;<br />
}<br />
// alle Tests mit den Basen bestanden, number ist prim (wahrscheinlichkeit 1 / 4^10)<br />
return true;<br />
29.05.2013 leuef1 Seite 15/15