16.01.2014 Aufrufe

Probabilistische Primzahlensuche - S T A F F

Probabilistische Primzahlensuche - S T A F F

Probabilistische Primzahlensuche - S T A F F

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!