Seminararbeit Primzahlerzeugung

Transcription

Seminararbeit Primzahlerzeugung
Westfälische Wilhelms-Universität Münster
Seminararbeit
Primzahlerzeugung
Im Rahmen des Seminars „Multimedia“
Tobias Brockmann
Themensteller: Prof. Dr. Herbert Kuchen
Betreuer: Christian Arndt
Institut für Wirtschaftsinformatik
Praktische Informatik in der Wirtschaft
Inhaltsverzeichnis
1
Einleitung................................................................................................................... 3
2
Primzahlen in der Informatik..................................................................................... 4
3
Definition von Primzahlen......................................................................................... 6
3.1
Eigenschaften von Primzahlen.......................................................................... 6
3.2
Der Satz von Euklid.......................................................................................... 7
3.3
Der kleine Satz von Fermat .............................................................................. 8
3.4
Besondere Primzahlen ...................................................................................... 8
3.4.1
3.4.2
4
5
Mersenne-Primzahlen ................................................................................... 8
Pseudoprimzahlen......................................................................................... 9
Testen von Primzahlen ............................................................................................ 11
4.1
Das Sieb des Eratosthenes .............................................................................. 11
4.2
Test durch Probedivision ................................................................................ 13
4.3
Der Fermat-Test .............................................................................................. 14
4.4
Der Miller-Rabin-Test .................................................................................... 15
4.5
Der Lucas-Lehmer-Test .................................................................................. 16
4.6
Beispiel einer Primzahltest-Implementierung in JAVA ................................. 17
Zusammenfassung ................................................................................................... 21
Literaturverzeichnis ........................................................................................................ 23
II
Kapitel 1: Einleitung
1 Einleitung
Seit den frühen Anfängen der Mathematik wird den Primzahlen großes Interesse
entgegengebracht. Oft hatte das etwas mit Zahlenmystik zu tun. So nimmt die Zahl
sieben in Märchen und vielen Religionen eine besondere Rolle ein. Durchsucht man die
Buchtitel einer Bibliothek nach der Zahl sieben, bekommt man weitaus mehr Treffer als
bei der Suche nach den benachbarten Zahlen 6 und 8 [RS07, S. 102].
Ein materieller Nutzen der jahrtausendealten Forschung zeigt sich erstmalig in den
letzten Jahren in Form von effektiven Verschlüsselungstechniken auf Basis von großen
Primzahlen. Noch vor nicht langer Zeit hätte wohl niemand eine so in den Alltag
hineinreichende praktische Anwendung der Zahlentheorie für möglich gehalten [RS07,
102].
Das Interesse an der Primzahlenforschung ist bis heute ungebrochen. Das GIMPS
(Great Internet Mersenne Prime Search) Projekt der Central Missouri State University
konnte im September 2006 die größte bisher gefundene Mersenne-Primzahl mit
9.808.358 dezimalen Stellen ermitteln. Ziel des GIMPS-Projektes ist es, die erste
Primzahl mit mehr als 10 Millionen dezimalen Stellen zu finden – auf sie ist ein
Preisgeld von 100.000 $ ausgesetzt (siehe www.mersenne.org).
Die Suche nach einem effizienten Algorithmus zur Primfaktorenzerlegung und der
Beweis für die Unendlichkeit von Primzahlzwillingen gelten als ungelöste Probleme der
Mathematik.
In dieser Seminararbeit wird im zweiten Kapitel zunächst die Relevanz von Primzahlen
in
der
Informatik
beschrieben
und
ein
kurzer
Ausblick
auf
das
RSA-
Verschlüsselungsverfahren gegeben, bei dem Primzahlen die Grundlage für die
Verschlüsselung darstellen. Im dritten Kapitel „Definition von Primzahlen“ werden
dann die grundlegenden Eigenschaften von Primzahlen erarbeitet und die Spezialfälle
der Mersenne- und Pseudoprimzahlen vorgestellt.
Die für Public-Key-Kryptosysteme benötigten sehr großen Primzahlen werden mithilfe
von Primzahltests ermittelt [BU01, 105]. Im vierten Kapitel werden fünf typische
Verfahren zum Testen von Primzahlen beschrieben und anhand von Beispielen
verdeutlicht. Ein ausgewählter Primzahltest wird exemplarisch in JAVA implementiert.
3
Kapitel 2: Primzahlen in der Informatik
2 Primzahlen in der Informatik
Seit mehreren Jahrhunderten haben Rechenmaschinen eine Relevanz für die
Primzahlforschung. Selbst die ersten einfachen Rechenmaschinen wurden zur Lösung
von mathematischen Primzahlproblemen verwendet. Ohne sie wären bis heute viele
mathematische Probleme ungelöst geblieben. Mit Eintritt des Computerzeitalters Mitte
des 20. Jahrhunderts wurden Computer auch zum Finden von großen Primzahlen
genutzt. Seitdem wurden regelmäßig neue Primzahlen entdeckt. Es bestand also nur ein
Nutzen für die Primzahlforschung, wohingegen die Informatik bis dahin keine
Verwendung für Primzahlen hatte.
Dieser Nutzen von Primzahlen für die Informatik existiert erst seit der Entwicklung von
Kodierungs-
und
Verschlüsselungsverfahren
Ende
der
70er
Jahre.
Ein
Kodierungsverfahren, das Primzahlpotenzen verwendet, ist der Reed-Solomon-Code.
Die wichtigste praktische Anwendung für Primzahlen findet sich jedoch in
Public-Key-Kryptosystemen wie dem RSA-Verfahren.
Ein zentrales Problem von symmetrischen Verschlüsselungsverfahren ist, dass bei jeder
Datenübertragung zuvor ein geheimer Schlüssel übertragen werden muss. Dieser
Schlüssel wird zum Ver- und zum Entschlüsseln der Daten verwendet, d. h., der
Schlüssel muss sowohl auf der Absender- als auch auf der Empfängerseite vorhanden
sein. Dazu muss ein sicherer Übertragungskanal zur Verfügung stehen, z. B. die
Übermittlung des Schlüssels mit einem Kurier. Die Komplexität dieses Verfahrens
steigt mit der Teilnehmerzahl des Netzwerkes.
Abhilfe schafft ein asymmetrisches Public-Key-Kryptosystem, bei dem es einen
öffentlichen Schlüssel gibt, auf den jeder Zugriff hat. Er wird zum Verschlüsseln von
Nachrichten verwendet. Das Gegenstück stellt ein geheimer privater Schlüssel da, mit
dem die Nachrichten entschlüsselt werden können [BU01, S. 113].
Beim RSA-Verfahren werden sehr große Primzahlen genutzt, um elektronische
Nachrichten zu verschlüsseln. Seine Sicherheit hängt eng mit der Schwierigkeit
zusammen, große Zahlen in ihre Primfaktoren zu zerlegen [BRK01, S. 174].
Die Idee des RSA-Verfahrens besteht darin, dass ein privater Schlüssel, der aus dem
Zahlenpaar (d , N ) besteht, zum Entschlüsseln und zum Signieren der Nachricht
verwendet wird. Dieser Schlüssel ist geheim, wird nicht übertragen und kann nur mit
4
Kapitel 2: Primzahlen in der Informatik
sehr hohem Aufwand aus dem öffentlichen Schlüssel berechnet werden. Der öffentliche
Schlüssel besteht aus dem Zahlenpaar (e, N ) , er wird zum Verschlüsseln und zum
Überprüfen von Signaturen verwendet. Die Zahl N ist bei beiden Schlüsseln identisch,
sie wird als RSA-Modul bezeichnet. Das Vorgehen von RSA soll nun in drei
grundlegenden Schritten vorgestellt werden.
1. Es werden zwei Primzahlen p ≠ q gewählt und das RSA-Modul N = p * q bestimmt.
2. Wähle e =∈ 1 < e < ( p − 1)(q − 1) und gcd(e, ( p − 1)(q − 1)) = 1
3. Berechnen des Entschlüsselungsexponenten d, für den gilt d * e ≡ 1 mod( p − 1)(q − 1)
Der öffentliche Schlüssel ist (e, N ) , während der private Schlüssel d ist. Die Zahlen p
und q werden nicht mehr benötigt und können gelöscht werden [BU01, S. 179].
Eine Nachricht kann nicht übertragen werden, wenn der private Schlüssel d nicht
bekannt ist. Um d zu bestimmen, ist es notwendig, die Primzahlen p und q aus N durch
Faktorisierung zu bestimmen. Der effizienteste Faktorisierungsalgorithmus, dessen
Laufzeit bewiesen werden kann, benutzt quadratische Formen. Es handelt sich um einen
1
probabilistischen Algorithmus mit erwarteter Laufzeit Ln [ ,1 + o(1)] [BU01, S. 147f.].
2
Bislang ist kein Faktorisierungsalgorithmus bekannt, der in polynomialer Laufzeit
(siehe Kap 4.6) arbeitet. Das Zerlegen einer sehr großen Zahl in ihre Primfaktoren ist
demnach in vertretbarer Zeit nicht möglich. Public-Key-Kryptosysteme gelten als sicher
und haben den Vorteil, dass im Gegensatz zu den symmetrischen Verfahren kein
geheimer Schlüssel übertragen wird. Es reicht aus, einen öffentlichen Schlüssel zentral
bereitzustellen.
Unglücklicherweise kennt man bis heute kein einfaches Verfahren, mit dem sich
ausschließlich Primzahlen erzeugen lassen. Andererseits ist bekannt, dass es sehr viele
Primzahlen gibt. Um zufällige große Primzahlen zu generieren, wird eine natürliche
Zahl der gewünschten Größe erzeugt und dann mithilfe von Primzahltests (siehe Kap. 4)
auf Primalität untersucht [BU01, S. 105].
5
Kapitel 3: Definition von Primzahlen
3 Definition von Primzahlen
3.1 Eigenschaften von Primzahlen
Eine Primzahl lässt sich durch grundlegende Eigenschaften charakterisieren, die im
Folgenden kurz beschrieben werden.
Eine natürliche Zahl n ≥ 2 mit genau zwei Teilern wird als Primzahl bezeichnet, wenn
ihre einzigen positiven Teiler 1 und n sind. Ist eine natürliche ganze Zahl n ≥ 2 keine
Primzahl, so wird sie als zusammengesetzte Zahl bezeichnet [BU98, S. 5]. Die Folge
der Primzahlen beginnt also aufsteigend sortiert wie folgt:
2, 3, 5, 7, 11, 13, 17, 19, 23
Daraus lässt sich ableiten, dass sich eine Primzahl nicht aus dem Produkt zweier
natürlicher Zahlen n > 1 darstellen lässt. Im Umkehrschluss besagt der Fundamentalsatz
der Arithmetik, dass sich jede von eins verschiedene natürliche Zahl als Produkt endlich
vieler Primzahlen darstellen lässt [BU98, S. 7].
Die Zerlegung einer natürlichen Zahl in ihre Primteiler wird als Primfaktorenzerlegung
bezeichnet. Ist die Folge der Faktoren aufsteigend sortiert, wird dies als Eindeutigkeit
der Primfaktorenzerlegung bezeichnet.
Beispiel: Die Zahl n = 105 lässt sich eindeutig durch die Primzahlen 3, 5, 7 darstellen.
Primzahlen entsprechen immer der Form 2k + 1 , wobei „k“ eine natürliche Zahl ist. Das
bedeutet, dass mit Ausnahme der Zahl 2 alle Primzahlen ungrade sind.
Primzahlen lassen sich in zwei Kategorien einteilen: Primzahlen der Form 4k+1 oder
4k+3, wobei „k“ eine natürliche Zahl ist. Die Zahl 2 lässt sich nach dem oben genannten
Schema nicht klassifizieren und stellt somit eine Ausnahme da.
Die größte bislang gefundene Primzahl ist 232.582.657 − 1. Es handelt sich hier um eine
Mersenne-Primzahl (siehe Kap. 3.4.1) mit 9.808.358 dezimalen Stellen. Euklid hat
bereits im vierten Jahrhundert vor Christus festgestellt, dass es unendlich viele
Primzahlen gibt. Diese Aussage wird als „Satz von Euklid bezeichnet“ (siehe Kap. 3.2).
Zusammenfassend lässt sich folgende Definition für Primzahlen herleiten:
Primzahlen stellen eine unendliche Folge von ungraden natürlichen Zahlen n > 2 da, die
nur durch 1 und sich selbst ohne Rest teilbar sind.
6
Kapitel 3: Definition von Primzahlen
3.2 Der Satz von Euklid
Der Satz von Euklid liefert die Antwort auf die These, dass es unendlich viele
Primzahlen gibt. Um dies mathematisch zu belegen, verwendete Euklid einen
Widerspruchsbeweis.
Angenommen, p1 ; p 2 ;... p n sei die Menge an endlichen Primzahlen. Definiert man P als
P = p1 p 2 ... p n + 1 und p als eine Primzahl, die P teilt, dann kann p keine Zahl der
Menge
p1 ; p 2 ;... p n
sein.
Denn
andernfalls
müsste
p
auch
die
Differenz
P- p1 ; p 2 ;... p n = 1 teilen, was aber unmöglich ist. Daher ist p eine zusätzliche Primzahl,
sodass p1 ; p 2 ;... p n nicht die Menge aller Primzahlen ist [RI88; S. 03]. Damit ist obige
Annahme widerlegt.
Beispiel: Die Menge der Primzahlen sei 2, 3, 5, 7, dann ergibt sich für P = 211,
p muss dann eine Primzahl sein, die P teilt. Das wäre in diesem Fall p = 211, da 211
selbst eine Primzahl ist.
Eine praktische Anwendung findet der Satz von Euklid, indem zu einer oder mehreren
gegebenen Primzahlen mindestens eine Primzahl berechnet werden kann. Dazu wird das
Produkt der Primzahlen berechnet und 1 hinzuaddiert. Anschließend führt man von der
zuvor berechneten Zahl eine Primfaktorenzerlegung durch. Alle Primfaktoren, die zuvor
nicht in der Primzahlmenge waren, sind neu gefundene Primzahlen.
Euklids Beweis ist zwar recht einfach, doch gibt er keinerlei Auskunft über die
Beschaffenheit der neuen Primzahl. Es ist nur bekannt, dass sie in ihrer Größe höchstens
gleich P = p1 p 2 ... p n + 1 ist. Daher ist die Zahl P für manche Indizes n selbst schon eine
Primzahl, für andere n aber zerlegbar [RI06, S. 4].
n
Beispiel: P = 1 + ∏ pi
i =1
Sei 2, 5, 11 die Menge der Primzahlen, ergibt sich für P = 1 + 2*5*11 = 111.
Die Primfaktorenzerlegung ergibt dann: 111 = 3 * 37. Die Zahlen 3 und 37 sind dann
zwei neu gefundene Primzahlen.
7
Kapitel 3: Definition von Primzahlen
3.3 Der kleine Satz von Fermat
Der Satz von Fermat ist ein Lehrsatz der Zahlentheorie. Er macht Aussagen über die
Eigenschaften von Primzahlen und wurde im 17. Jahrhundert von Pierre de Fermat
aufgestellt:
Ist p eine Primzahl, n eine ganze Zahl und p kein Teiler von n, so gilt n p −1 ≡ 1 mod p
für alle natürlichen Zahlen. Anders ausgedrückt: np-1 ergibt bei der Division durch p
immer den Rest 1 [BE01, S120].
Beweis: Die Aussage ist richtig für n = 1 . Angenommen, sie gelte für ein n, dann ist
durch Induktion (n + 1) p = n p + 1 = n + 1(mod p ) . Somit ist der Satz für jede natürliche
Zahl n bewiesen. Weitere Beweise finden sich in [RI06, S. 17ff.].
Der Satz von Fermat eröffnet die Möglichkeit festzustellen, ob eine natürliche Zahl n
zusammengesetzt oder prim ist. Ergibt sich beim Teilen von n durch p nicht 1, dann ist
die Zahl n zusammengesetzt. Ergibt sich jedoch der Rest 1, dann kann n sowohl
Primzahl als auch zusammengesetzt sein [BU98, S. 99–100].
Beispiel: n = 2; p = 5, dann gilt 2 4 = 16 , Division durch p ergibt 3 * 5 + 1. Nach dem
kleinen Satz von Fermat handelt es sich bei der Zahl p um eine Primzahl. Das Beispiel
n = 2; p = 341 ergibt 2 340 ≡ 1 mod 341 und damit handelte es sich nach dem kleinen
Satz von Fermat um eine Primzahl, obwohl n = 341 = 11 * 31 und damit
zusammengesetzt ist. Der Satz von Fermat bildet die Grundlage für Algorithmen zum
Testen von Primzahlen [BU01, S. 107].
3.4 Besondere Primzahlen
3.4.1 Mersenne-Primzahlen
Der Mönch Marin Mersenne (1588–1645) entdeckte, dass es Primzahlen der Form
M p = 2 p - 1 gibt.
Falls eine Zahl der Form 2 p − 1 prim ist, so muss dies auch schon für den Exponenten
gelten. Darüber hinaus lässt sich leicht nachprüfen, dass Zahlen der Form 2 p − 1
Primzahlen sind und somit auch p Primzahl ist. Bei der Suche nach MersennePrimzahlen hat man den Vorteil, dass nur noch die Zahlen zu überprüfen sind, bei denen
8
Kapitel 3: Definition von Primzahlen
p eine Primzahl ist. Ein entsprechender Beweis findet sich im Artikel „A note on
Mersenne numbers“ von Ligh, S. & Neal, L [RI06, S. 77].
Beispiel: Die Primzahlen M 2 = 2 2 − 1 = 3 und M 3 = 2 3 − 1 = 7
sind Mersenne
Primzahlen. Die Primzahl M 11 = 211 − 1 = 2047 ist faktorisierbar als 23 * 89 und damit
zusammengesetzt.
Bereits zu Mersennes Zeit war bekannt, dass einige Zahlen prim und andere zerlegbar
sind. Das gezeigte Verfahren ermittelt mit umso höherer Wahrscheinlichkeit eine
Primzahl, je größer der Exponent p ist. Es wird vermutet, dass es unendlich viele
Mersenne-Primzahlen gibt. Einen Beweis dafür gibt es jedoch bis heute nicht. Bisher
wurden 44 Mersenne-Primzahlen gefunden. Die letzte und größte wurde am 04.09.2006
von dem GIMPS-Projekt bestimmt. Es ist die Zahl 232.582.657 − 1, eine Zahl mit
9.808.358 dezimalen Stellen. Eine Liste mit allen bisher bekannten MersennePrimzahlen findet sich unter: www.Primzahlen.de
Zur Überprüfung einer Mersenne-Primzahl wird der Lucas-Lehmer-Test verwendet.
Obwohl er zu den effektivsten Primzahltests gehört, benötigt er bei sehr großen pWerten O (n 2 log n) Zeit (siehe Kap. 4.6). In der Praxis bedeutet dies, dass trotz der
polynomiellen Laufzeit eine hohe Rechenleistung zum Auffinden der Primzahlen
notwendig ist. Weitere Informationen finden sich auf der Internetseite des GIMPSProjekts (www.mersenne.org) [RI06, S. 80].
3.4.2 Pseudoprimzahlen
Eine Pseudoprimzahl ist eine zusammengesetzte Zahl, die gewisse Eigenschaften
besitzt, von denen man annehmen würde, dass sie nur auf eine Primzahl zutreffen
[RI06, S. 89]. Entdeckt wurden Pseudoprimzahlen bei der Suche nach Algorithmen zur
Überprüfung von Primzahlen. Da diese Algorithmen nicht perfekt arbeiteten, wurden
Zahlen als Primzahlen identifiziert, die eigentlich keine sind, sich jedoch mit dem
verwendeten Algorithmus wie Primzahlen verhalten. Es existieren verschiedene
Pseudoprimzahlen,
die
bekanntesten
sind
allerdings
die
Fermat’schen
Pseudoprimzahlen. Sie leiten sich direkt vom „kleinen Satz des Fermat“ (siehe Kap 2.3)
ab. Zu der Klasse der Fermat’schen Pseudoprimzahlen zählen die CarmichaelPrimzahlen, die Euler’schen Pseudoprimzahlen und die starken Pseudoprimzahlen
[RI06, S. 96–101]. Bei der Untersuchung von Pseudoprimzahlen werden die gleichen
9
Kapitel 3: Definition von Primzahlen
Fragen wie im Falle der Primzahlen gestellt. So ist z. B. von Interesse, wie viele
Pseudoprimzahlen es gibt, wie sie verteilt sind, wie man erkennen kann, ob eine
Pseudoprimzahl prim ist, und wie man Pseudoprimzahlen generieren kann [RI06,
S. 91].
Zunächst soll der Aufbau einer Carmichael-Primzahl kurz vorgestellt werden.
Carmichael-Primzahlen sind zusammengesetzte Zahlen n, für die die Kongruenz
a n −1 ≡ 1 mod(n) gilt. Für die Basis a muss gelten: 2 ≤ a ≤ n − 2 und ggT (a, n) = 1 .
Unter diesen Bedingungen verhalten sich zusammengesetzte Zahlen auf verschiedenen
Basen a ≥ 2 wie Primzahlen [RI06, S 93]. Aufgrund der Tatsache, dass es unendlich
viele
Primzahlen
gibt,
existieren
auch
unendlich
viele
Carmichael-Zahlen.
Entsprechende Beweise finden sich in [RI06, S. 94].
Beispiel: Die kleinste Carmichael-Primzahl ist n = 561 = 3 * 11 * 17 . Es gilt hier für alle
Basen a, die keinen Primfaktor mit n = 561 gemeinsam haben. Für Basis a = 3 wird die
oben genannte Bedingung nicht erfüllt, denn 3560 ≡ 375 mod 561 .
Die Euler’schen Pseudoprimzahlen sind wie folgt definiert: „Eine ungerade natürliche
zusammengesetzte Zahl n wird als Eulersche Pseudoprimzahl zur Basis a ≥ 2
a
bezeichnet, wenn a und n teilerfremd sind und es gilt: ( ) ≡ a
n
n −1
2
mod n “. Beweise sind
[RI06, S. 96f.] zu entnehmen.
Bei einer starken Pseudoprimzahl handelt es sich immer um eine Euler’sche
Pseudoprimzahl, allerdings ist nicht jede Euler’sche Primzahl auch eine starke
Pseudoprimzahl [RI06, S. 98].
Eine zusammengesetzte Zahl n = d * 2 s + 1 mit ungeradem d und s ≥ 1 sowie a
dergestalt, dass 1 < a < n und ggT(a, n) = 1, ist genau dann eine starke Pseudoprimzahl,
wenn eine der beiden folgenden Bedingungen erfüllt ist:
r
d2
≡ − 1 mod n mit 0 ≤ r ≤ ( s − 1) . Entsprechende Beweise
a d ≡ 1 mod n oder a
finden sich [RI06, S. 98ff.].
Beispiel: Sei n = 341; d = 85; s = 2 .
Dann ist 341 eine starke Pseudoprimzahl zur Basis a = 47 , denn 47 85 ≡ 1 mod 341 .
10
Kapitel 3: Definition von Primzahlen
Ebenfalls ist 341 eine starke Pseudoprimzahl zur Basis a = 61 , denn
1
6185*2 ≡ −1 mod 341 .
11
Kapitel 4: Testen von Primzahlen
4 Testen von Primzahlen
Ein Primzahltest ist ein mathematisches Verfahren, mit dem in N Schritten ermittelt
werden kann, ob eine gegebene Zahl eine Primzahl ist, oder das im Falle der
Zerlegbarkeit die Primfaktoren liefert. Für eine gegebene Zahl N müssen nur alle Zahlen
n = 1, 2, 3 …bis hin zur Zahl
N daraufhin geprüft werden, ob sie ein Teiler von N
sind. Wenn dies für kein n der Fall ist, handelt es sich um eine Primzahl [RI06, S. 15].
Ein entsprechender Beweis findet sich im Buch von Johannes Buchmann: Einführung in
die Kryptographie S. 105 Theorem 6.1.1.
Praktische Anwendung finden Primzahltests bei asymmetrischen Verschlüsselungsverfahren in der Informatik, wobei Primzahlen mit mehreren hundert Dezimalstellen
benötigt werden. Da „echte“ Primzahltests eine nicht vertretbare exponentielle Laufzeit
haben, verwendet man Primzahltests, die auf der Basis von Monte-Carlo-Algorithmen
beruhen.
Monte-Carlo-Algorithmen sind randomisierte Algorithmen, die mit einer nach oben
beschränkten Wahrscheinlichkeit ein falsches Ergebnis liefern dürfen. Dafür sind sie im
Vergleich zu deterministischen Algorithmen effizienter. Ihr Nachteil besteht darin, dass
nicht wirklich sicher festgestellt werden kann, ob die gegebene Zahl eine Primzahl ist.
Die Wahrscheinlichkeit, eine zusammengesetzte Zahl fälschlicherweise als Primzahl zu
identifizieren, kann zwar durch wiederholtes Ausführen des Algorithmus beliebig klein
werden, aber nicht null werden [WA06, S. 160].
In dem folgenden Kapitel wird zunächst ein Verfahren zur Bestimmung aller möglichen
Primzahlen vorgestellt, das „Sieb des Eratosthenes“.
In Kapitel 4.2 wird der Primzahltest durch Probedivision beschrieben. Der Fermat-Test,
der Miller-Rabin-Test und der Lucas-Lehmer-Test für Mersenne-Primzahlen werden in
den darauf folgenden Kapiteln vorgestellt. Die Implementierung eines Primzahltests
wird in Kapitel 4.6 durchgeführt.
4.1 Das Sieb des Eratosthenes
Das Sieb des Eratosthenes ist ein Verfahren zur Bestimmung aller Primzahlen p mit
x < p < x , wenn sämtliche p ≤ x bereits bekannt sind [BU98. S. 285]. Im
eigentlichen Sinne ist es kein Primzahltest, sondern ein Verfahren zum Erzeugen von
12
Kapitel 4: Testen von Primzahlen
Primzahlenlisten. Da diese Liste bis zu einer frei wählbaren Grenze alle Primzahlen
enthält, kann sie als Primzahltest verwendet werden. Es wird lediglich überprüft, ob die
gesuchte Zahl in der Liste ist.
Um eine Primzahlliste zu erstellen, wird wie folgt vorgegangen.
1. Zuerst werden alle Zahlen N = {2, 3, 4,…n} bis zu einem frei wählbaren
Maximalwert S aufgeschrieben.
2. Alle Zahlen der Menge N sind zunächst potenzielle Primzahlen. Die kleinste Zahl N i
ist immer eine Primzahl.
3. Nun werden alle Vielfachen der Primzahl
bis zur Schranke S als
Ni
zusammengesetzt markiert.
4. Es wird dann die nächstkleinste Primzahl N i +1 ausgewählt und Schritt 3 ausgeführt.
Die Schritte 3 und 4 werden so lange wiederholt, bis das Quadrat der Primzahl N i + n
größer als die Schranke S ist. Dann sind alle Primzahlen kleiner oder gleich S bestimmt
[RE07, S. 102].
Die Vorgehensweise zur Erstellung einer Primzahlliste wird nun anhand eines Beispiels
(N = 30) illustriert. Zunächst werden alle Zahlen von 1–30 notiert [RI06 S. 16].
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Die Primzahlen
30 müssen bekannt sein. Es sind die Zahlen 2, 3, 5. Die Zahl 1 ist per
Definition keine Primzahl und wird aus der Liste gestrichen [BU98, S. 286].
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Die Zahl 2 ist die kleinste Primzahl. Alle ihre Vielfachen der Form 2n mit natürlichen
Zahlen n > 2 sind jedoch zusammengesetzt. Die Zahlen 4, 6, 8 … sind aus der Liste zu
streichen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
13
Kapitel 4: Testen von Primzahlen
Die kleinste nun noch nicht betrachtete Zahl ist 3. Mögliche „echte“ Teiler, also Teiler,
die ungleich 1 und ungleich der Zahl selbst sind, wären kleiner. Weil die Zahl 3 nicht
gestrichen wurde, besitzt sie keinen solchen Teiler und ist damit Primzahl. Andererseits
folgt, dass alle Zahlen 3n mit n ≥ 2 keine Primzahlen sind. Die Zahlen 6, 9, 12 … sind
somit zu streichen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Dabei fällt auf, dass einige Zahlen bereits im vorherigen Schritt gestrichen wurden
(z. B. 6 und 12). Es ist jedoch schneller, dies in Kauf zu nehmen, als einen irgendwie
gearteten Test einzubauen, der mehrfaches Streichen verhindert. Nun sind alle
Vielfachen der nächstkleinsten und noch nicht gestrichenen Zahl zu streichen. In diesem
Fall ist das die Zahl 5. Das Verfahren wird fortgesetzt, bis alle Zahlen zur Obergrenze x
erfasst worden sind. Jede nicht gestrichene Zahl in der Liste ist eine Primzahl [RS07,
S. 103].
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Es ergibt sich die Primzahlliste 2, 3, 5, 7, 11, 13,17, 19, 23, 29.
4.2 Test durch Probedivision
Gegeben sei eine natürliche Zahl n, die auf Primalität zu überprüfen ist. Grundlage für
den Test durch Probedivision ist der folgende Zusammenhang:
Wenn n eine zusammengesetzte natürliche Zahl ist, dann hat n einen Primteiler p, der
nicht größer ist als
n [BU01, S. 105].
Um eine Zahl n auf Primalität zu überprüfen, muss für alle Primzahlen p, die nicht
größer als
n sind, überprüft werden, ob sie n teilen. Dazu ist es notwendig, die
Primzahlen p zu bestimmen oder in einer Tabelle nachzusehen. Alternativ kann auch
geprüft werden, ob n durch eine ungerade Zahl Z ohne Rest teilbar ist, für die gilt:
Z ≤ n und n > 1. Wird diese Bedingung erfüllt, dann kann n keine Primzahl sein.
Andernfalls ist n eine Primzahl [BU01, S. 105].
14
Kapitel 4: Testen von Primzahlen
Beweis: Sei eine natürliche Zahl n zusammengesetzt n = pm, wobei p eine Primzahl ist
und m ≥ 2 . Ist p > n , so ist m < n und hat einen Primteiler p ∈ 2 ≤ m < n . Dieser
ist auch Primteiler von n [RS62].
Beispiel: Mithilfe der Probedivision soll die Zahl n = 15413 auf Primalität überprüft
werden. Es gilt
 n  = 124. Es muss getestet werden, ob eine der Primzahlen p ≤ 124
ein Teiler von n ist. Die Primzahlen p ≤ 124 sind, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31,
37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113. Keine
dieser Zahlen teilt n. Daher ist n Primzahl.
Alternativ kann getestet werden, ob eine ungerade Zahl zwischen 1 und 124 n ohne Rest
teilt, also die Zahlen 3, 5, 7, 9, 11, 13, 15 ...123. Keine dieser Zahlen teilt n ohne Rest,
damit muss n selbst eine Primzahl sein.
4.3 Der Fermat-Test
Der Fermat-Test beruht auf dem kleinen Satz von Fermat (siehe Kap 3.3). Er eröffnet
die Möglichkeit festzustellen, ob eine natürliche Zahl p zusammengesetzt ist. Ergibt das
Theorem y = n p −1 mod p den Wert y ≠ 1 , so ist p zusammengesetzt und somit keine
Primzahl. Ergibt sich der Wert y = 1 , so kann p sowohl Primzahl als auch
zusammengesetzt sein [BU01, S. 107].
Der Fermat-Test kann also nur zeigen, dass p keine Primzahl ist. Lässt sich mit dem
Fermat-Test auch für unterschiedliche Basen n ≥ 2 kein Beweis finden, dass p
zusammengesetzt ist, dann kann mit großer Wahrscheinlichkeit davon ausgegangen
werden, dass p eine Primzahl ist [BU01, S. 107].
Beispiel: Sei p = 341 = 11 * 31 und n = 2, dann gilt 2 340 ≡ 1 mod 341 , daher müsste nach
dem Fermat-Test p als Primzahl klassifiziert werden, obwohl p augenscheinlich eine
zusammengesetzte Zahl ist. Der Fermat-Test zu Basis n = 3 zeigt, dass
3340 ≡ 56 mod 341 und p somit keine Primzahl ist.
15
Kapitel 4: Testen von Primzahlen
4.4 Der Miller-Rabin-Test
Der Miller-Rabin-Test ist ein Algorithmus aus dem Gebiet der mathematischen
Zahlentheorie. Er ist nach Garry Miller und Michael O. Rabin benannt. Alternativ wird
er auch als Miller-Selfridge-Rabin-Test bezeichnet [YA02, S. 202]. Im vorherigen
Kapitel wurde beschrieben, dass mit dem Fermat-Test niemals Gewissheit besteht, ob
eine Zahl prim ist (siehe Kap 4.3). Der Miller-Rabin-Test verwendet als Grundlage eine
Verschärfung des kleinen Satzes von Fermat. Mit ihm ist es möglich, mit einer
Wahrscheinlichkeit von
herauszufinden,
(Beweis
ob
siehe
(1 / 2) s , wobei s die Anzahl der Iterationen angibt,
eine
F.
natürliche
Zahl
Rienhardt:
zusammengesetzt
Der
ist.
Miller-Rabin-Test,
www.bitnuts.de/rienhardt/docs/miller_rabin.pdf)
Wird festgestellt, dass eine Zahl eine Primzahl ist, ist dies kein sicheres Ergebnis. Die
Wahrscheinlichkeit, eine Zahl falsch zu klassifizieren, sinkt mit der Anzahl der
Iterationen. Die Zahlen, die fälschlicherweise vom Miller-Rabin-Test als Primzahlen
identifiziert werden, bezeichnet man als starke Pseudoprimzahlen (siehe Kap 3.4.2). Da
der Algorithmus nicht immer ein korrektes Ergebnis liefert, zählt er zur Klasse der
Monte-Carlo-Algorithmen [BU01, S. 109].
Es gilt hier: n ist eine ungerade natürliche Zahl und s = max{r ∈ N : 2 r teilt (n − 1)} .
Damit ist also 2 s die größte Potenz von 2, die n-1 teilt. Setze d =
n −1
. Dann ist d eine
2s
ungerade Zahl. Ist nun n eine ungerade Zahl und a eine zu n teilerfremde ganze Zahl, so
gilt für den Miller-Rabin Test Folgendes: a d ≡ 1 mod n oder aber es findet sich ein r in
der Menge {0, 1, 2,…, s-1}, für das gilt a
2r d
≡ − 1 mod n . Eine dieser beiden
Bedingungen ist notwendig, um n als Primzahl zu identifizieren. Findet sich also eine
Zahl a, die teilerfremd zu n ist und für die weder a d ≡ 1 mod n noch a 2
r
d
≡ −1 mod n
gilt, so ist die Zahl n zusammengesetzt. Eine solche Zahl a wird als Zeuge der Primalität
von n bezeichnet [BU01, S. 109 / BRK01, S. 167ff.]
16
Kapitel 4: Testen von Primzahlen
Beispiel: Sei n = 149, dann ist n -1 = 148.
2 7 = 128 teilt 148 nicht
2 6 = 64 teilt 148 nicht
2 5 = 32 teilt 148 nicht
2 4 = 16 teilt 148 nicht
2 3 = 8 teilt 148 nicht
Für
wert 148
d ergibt
sichdamit
dannist
d =s = 2
2 2den
= 4 teilt
=37*4,
Die Basis a sei hier a = 14, die Menge
Für den Wert d ergibt sich dann d = 37. Jetzt können die beiden notwendigen
Bedingungen anhand einer zufällig gewählten Basis a geprüft werden.
Die Basis a sei hier a = 14, die Menge r beträgt {0,1}
1. a d ≡ 1 mod n , daraus ergibt sich 14 37 ≡ 44 mod 149
2. a 2
r
d
≡ −1 mod n ergibt
für r = 0 14 37 ≡ −105 mod 149
1
für r = 1 14 2 37 ≡ −1 mod 149
Damit ist die Zahl 149 als Primzahl identifiziert. Die Basis a = 14 ist Zeuge der
Primalität. Wird der Vorgang für weitere Basen a wiederholt, erhöht sich die
Wahrscheinlichkeit, mit der die Zahl n als richtig klassifiziert wird.
4.5 Der Lucas-Lehmer-Test
Der Lucas-Lehmer-Test ist ein Verfahren, um Mersenne-Primzahlen zu überprüfen.
Entwickelt wurde der Test von Eduardo Luca und Derrick Henry Lehmer, der die
Arbeiten von Luca fortsetzte. Als mathematische Grundlagen dienen Lucas-Folgen.
Häufigste Verwendung findet der Test beim Suchen von sehr großen Primzahlen. Er ist
seit Jahren die effizienteste Methode, um die größten zurzeit bekannten Primzahlen zu
entdecken, und wird als Standardtestverfahren beim GIMPS-Projekt eingesetzt.
Verwendet werden kann der Lucas-Lehmer-Test nur bei Mersenne-Primzahlen ab der
Größe M 3 = 2 3 − 1 = 7 .
17
Kapitel 4: Testen von Primzahlen
Der Algorithmus funktioniert wie folgt:
Es sei p eine ungerade Zahl und die rekursive Folge S (k + 1) definiert durch S (1) = 4
und S (k + 1) = S (k )² − 2 . Dann ist jede Mersenne-Primzahl M p = 2p – 1 eine Primzahl,
wenn S ( p − 1) durch M p teilbar ist. In dieser von Lucas und Lehmer beschriebenen
Grundform werden die Zahlen S(k) sehr schnell sehr groß. Deshalb werden aus
praktischen Gründen alle Zwischenschritte direkt mit modulo M p ausgerechnet. Es gilt
also: S (1) = 4 und S (k + 1) = S (k )² − 2 mod M p . Die rekursive Folge wird so lange
ausgeführt, bis der Wert S(p-1) berechnet wurde. M p ist eine Primzahl, wenn gilt
S ( p − 1) = 0 , wenn sich also S(p-1) ohne Rest durch S (k )² − 2 mod M p teilen lässt.
Weiterführende Informationen über Lucas folgen; Beweise, die dem Lucas-LehmerTest zugrunde liegen, finden sich in: The Annals of Mathematics, 2nd Ser., Vol. 31, No.
3 (Jul., 1930), pp. 419–448.
Beispiel: Zu prüfen ist die Mersenne-Primzahl M 5 = 2 5−1 =31 . Es ergibt sich Folgendes:
S (1) = 4
S (2) = (4² − 2) mod 31 = 14
S (3) = (14² − 2) mod 31 = 8
S (4) = (8² − 2) mod 31 = 0
Da S(4) = 62 ohne Rest durch 31 teilbar ist, ist M 5 = 2 5−1 =31 eine Primzahl.
18
Kapitel 4: Testen von Primzahlen
4.6 Beispiel einer Primzahltest-Implementierung in JAVA
Die in den vorangegangenen Kapiteln vorgestellten Primzahltests sollen zunächst
bezüglich ihrer Laufzeitkomplexität und ihrer Relevanz für die Praxis miteinander
verglichen werden. Anhand dieses Vergleiches wird dann ein Primzahltest ausgewählt
und beispielhaft in JAVA implementiert.
Primzahltest
Laufzeitkomplexität
Relevanz Praxis
Geringe Relevanz,
schlechte Laufzeit auch bei
Sieb des Eratosthenes
Exponentielle Laufzeit
kleinen Zahlen. Wird genutzt,
um Primzahltabellen zu
erstellen.
Exponentielle Laufzeit
Test durch Probedivision
O(2
log( n +1)
2
)
Mittlere Relevanz,
deterministischer Test, aber
schlechte Laufzeit bei großen
Zahlen
Keine Relevanz,
Logarithmische Laufzeit
Fermat-Test
O(log n)
Primzahlen können nicht
eindeutig bestimmt werden
Hohe Relevanz,
Miller-Rabin-Test
Kubische Laufzeit
schnelles Verfahren bei kleinen
O(log n)³
Zahlen. Anwendung bei
Verschlüsselungsverfahren.
Hohe Relevanz,
Polynomiale Laufzeit
Lucas-Lehmer-Test
O(n 2 log n)
Standard-Testverfahren bei der
Suche nach großen Primzahlen.
Allerdings nur MersennePrimzahlen.
Tabelle 1: Vergleich von Primzahltest
Ein effizienter Primzahltest dürfte nur eine polynomiale Laufzeit haben. Das bedeutet,
dass die Anzahl der „einfachen Rechenschritte“, die er für die Zahl n benötigt, durch
C·(log n)k für die Konstanten k und C abgeschätzt werden kann. Bei Problemen, die in
Polynomialzeit lösbar sind, wächst die benötigte Rechenzeit mit Problemkomplexität
nicht schneller als eine Polynomfunktion. Das Besondere an der polynomialen Laufzeit
ist, dass sie die Grenze zwischen praktisch lösbaren und nicht lösbaren Problemen
19
Kapitel 4: Testen von Primzahlen
darstellt. Probleme, die nicht in Polynomialzeit lösbar sind, wachsen schon bei geringen
Problemgrößen so schnell, dass sie nicht mit verfügbaren Rechnern und nicht in
überschaubaren Zeiträumen gelöst werden können [RI06, S. 111].
Für eine eventuelle Implementierung eignen sich anhand der oben genannten Kriterien
nur der Miller-Rabin- und der Lucas-Lehmer-Test.
Der einzige Test, der in polynomieller Laufzeit arbeitet, ist der Lucas-Lehmer-Test.
Leider ist er nur für die Überprüfung von Mersenne-Primzahlen geeignet. In der Praxis
wird der Lucas-Lehmer-Test als Standardverfahren bei der Suche nach der größten
Mersenne-Primzahl eingesetzt.
Der Miller-Rabin-Test wird genutzt, um Primzahlen für Public-key-Kryptosysteme zu
finden, und stellt damit eine direkte praktische Anwendung da. Die bei Public-KeyKryptosystemen notwendigen Primzahlen der Größenordnung von 100-stelligen
Dezimalzahlen lassen sich trotz der kubischen Laufzeit mit dem Miller-Rabin-Test in
adäquater Zeit bestimmen.
Aufgrund des höheren praktischen Nutzens und der Anwendbarkeit auf natürliche
Zahlen stellt der Miller-Rabin-Test das günstigste Verfahren da. Er soll im Folgenden
beispielhaft implementiert werden.
**/Die Methode zeuge realisiert den Fermat-Test
* Die Funktion an-1 mod n wird durch fortgesetztes
* Multiplizieren und Quadrieren erreicht.
*/
boolean zeuge(int a, int n){
int f = 1, x;
for (int i = length(n-1)-1; i >= 0; i--){
x = f;
f = x * x % n;
//Nach dem Quadrieren wird geprüft, ob das Ergebnis ist
//Sind x != 1 und x != n-1 ist n zusammengesetzt.
if (f == 1 && x != 1 && x != n - 1) return true;
//Prüfen, ob an-1 mod n 1, wenn ja, wird true
//zurückgegeben
if (bit(i, n - 1) == 1) f = f * a % n;}
return f != 1;}
**/ Die
* mit
* Die
* Die
*/
boolean
int
for
Methode miller_rabin ruft die Methode Zeuge k-mal auf.
zufälligem Zeugen a = {2, ..., n-2)
Methode liefert true, falls eins zeuge für n gefunden wurde
Ausgabe false bedeutet, n ist eine Primzahl
miller_rabin(int n, int k){
a;
(int I = 0; I < k; i++){
a = random(2, n - 2);
if (zeuge(a, n)) return true;}
return false; }
20
Kapitel 4: Testen von Primzahlen
Es lässt sich zeigen, dass die Wahrscheinlichkeit dafür, dass eine ungerade zusammengesetzte Zahl n durch den Miller-Rabin-Test nicht als zusammengesetzt entlarvt wird,
1/2k entspricht. Bei einer Erhöhung der Anzahl der Versuche k sinkt die Fehlerrate
exponentiell auf beliebig kleine Werte.
21
Kapitel 5: Zusammenfassung
5 Zusammenfassung
Wie im 2. Kapitel gezeigt wurde, hängt die Sicherheit von Verschlüsselungsverfahren
eng mit der Schwierigkeit zusammen, natürliche Zahlen in ihre Primfaktoren zu
zerlegen. In den letzten Jahren wurden immer effizientere Faktorisierungsmethoden
entwickelt. Trotzdem ist RSA bei einer Schlüssellänge von 1924 Bit sicher. Alle bisher
bekannten Faktorisierungsmethoden würden die gesuchten Primfaktoren nicht in einer
menschlichen Lebensspanne ermitteln können. Eine wachsende Vernetzung und die
zunehmende
Zahl
von
sicherheitskritischen
Webanwendungen
lassen
sichere
Verschlüsselungsverfahren immer wichtiger werden. Die zunehmende Bedeutung von
Primzahltests und Faktorisierungsalgorithmen in der Informatik ist die logische
Konsequenz.
Eine Definition und die grundlegenden Eigenschaften von Primzahlen wurden im
dritten Kapitel beschrieben. Zwei besondere Typen von Primzahlen sind die MersennePrimzahlen (Kap 3.4.1) und die Pseudoprimzahlen (3.4.2), bei denen eine natürliche
zusammengesetzte Zahl bestimmte Eigenschaften einer Primzahl hat.
Bislang existiert noch kein effizientes Verfahren, um Primzahlen zu erzeugen. Es ist nur
möglich, eine natürliche Zahl auf Primalität zu überprüfen. Dazu gibt es verschiedene
Primzahltestverfahren. Eine Möglichkeit, Primzahllisten zu erzeugen, bietet das Sieb
das Eratosthenes, mit dem hiermit Primzahllisten bis zu einer bestimmten Größe in
adäquater Zeit bestimmen lassen. Der Test durch Probedivision ist ein deterministisches
Verfahren. Er findet nach n Versuchen immer heraus, ob eine Zahl prim ist oder nicht.
Allerdings ist er in der Praxis aufgrund seiner exponentiellen Laufzeit bei großen
Zahlen nicht anwendbar. Der Test von Fermat bildet die Grundlage für den
probabilistischen Miller-Rabin-Test. Mit ihm können natürliche Zahlen in kubischer
Laufzeit auf Primalität überprüft werden. Um Mersenne-Primzahlen zu überprüfen,
eignet sich der Lucas-Lehmer-Test, das einzige hier besprochene Verfahren, das in
polynomialer Laufzeit arbeitet. Alle eben genannten Primzahltestverfahren wurden
ausführlich im vierten Kapitel vorgestellt.
In Zukunft werden Primzahlen ein interessantes Gebiet für die Forschung bleiben. Sei
es, dass das GIMPS-Projekt das Auffinden der 45. Mersenne-Primzahl vermeldet oder
es einem Mathematiker gelingt, eines der bislang ungelösten Primzahlprobleme zu
lösen.
22
Kapitel 5: Zusammenfassung
Eine Faktorisierung von großen Primzahlen ist bislang in vertretbarer Zeit nicht
möglich. Sollte es gelingen, einen effizienten Algorithmus zu finden, der das beherrscht,
könnten Public-Key-Kryptosysteme wie RSA nicht mehr als sicher gelten.
23
Literaturverzeichnis
[RE07]
Kristina Reiss, Gerald Schmieder: Basiswissen Zahlentheorie „Eine
Einführung in Zahlen und Zahlbereiche“, 2. Auflage, Springer Verlag 2007.
[BRK01] Andreas Bartholome, Josef Rung, Hans Kern: Zahlentheorie für Einsteiger,
3. Auflage, Vieweg Verlag 2001.
[BU01]
Johannes Buchmann: Einführung in die Kryptographie, 2. Auflage, Springer
Verlag 2001.
[PI84]
Herbert Pieper: Zahlen aus Primzahlen, 2. Auflage, Birkhäuser Verlag
1984.
[RI06]
Paulo Ribenboim: Die Welt der Primzahlen, 2. Auflage, Springer Verlag
2006.
[RI88]
Paulo Ribenboim: The book of prime number records, 1. ed. Springer
Verlag 1988.
[BU98]
Peter Bundschuh: Einführung in die Zahlentheorie, 4. Auflage, Springer
Verlag 1998.
[BE01]
Albrecht Beutelspacher: Moderne Verfahren der Kryptographie. 4. Auflage,
Vieweg Verlag 2001.
[RS62]
Rosser and Schoenfeld: “Approximate Formulas for some functions of
prime numbers”. Illinois Journal of Mathematics 6:64–94, 1962.
[YA02]
Song Y. Yan: Number theory for computing, 2. Auflage. Springer, 2002.
[WA06]
Rolf Wanka: Approximationsalgorithmen. Eine Einführung (Leitfäden u.
Monographien der Informatik). 1. Auflage, Teubner 2006.