Probabilistische Primzahltests Gliederung

Werbung
Probabilistische Primzahltests
Für die Kryptographie sind Primzahlen von fundamentaler Bedeutung. Man benötigt sehr große
Primzahlen, um Nachrichten zu verschlüsseln. Um effizient nach großen Primzahlen suchen zu
können, braucht man Algorithmen, die möglichst schnell entscheiden können, ob eine gegebene
ungerade Zahl n ∈ N prim ist. Deterministische Algorithmen entscheiden mit Sicherheit, ob n
prim ist. Schneller und daher wichtiger in der Praxis sind aber probabilistische Algorithmen, die
nur aussagen, dass n mit einer gewissen Wahrscheinlichkeit prim ist.
Name
Fermat Test
Kriterium
n prim ⇒ für alle a ∈ Un gilt:
an−1 ≡n 1
SolovayStrassen
Test
n prim ⇔ für alle a ∈ Un gilt:
a
Miller-Rabin
Test
Fermat
n−1
2
≡n
a
n
SoStra
n prim ⇔ für alle a ∈ Un gilt:
am ≡n 1
MR1
oder für ein s < t:
s
a2
m
≡n −1
MR2
wobei n − 1 = 2t m
Bemerkungen
Es gibt Zahlen n, bei denen alle a ∈
Un die Fermat-Bedingung erfüllen, obwohl n gar nicht prim ist. Diese heißen
Carmichael-Zahlen.
SoStra ⇒ Fermat.
Bei zusammengetztem n erfüllen
höchstens noch die Hälfte der Einheiten die Sostra-Bedingung. Durch
k-fache Prüfung der Bedingung sinkt
die Irrtumswahrscheinlichkeit also als
1 k
gegen 0.
2
MR ⇒ Fermat.
MR ⇒ SoStra.
Bei zusammengesetztem n erfüllen
nur noch höchstens ein Viertel der
Einheiten die MR-Bedingung; die
Irrtumswahrscheinlichkeit bei k-facher
k
Prüfung sinkt also als 41 gegen 0.
Die MR-Bedingungen lassen sich
schneller überprüfen als SoStra und
Fermat.
Gliederung
0. Grundlagen
1. Fermat Test
2. Solovay-Strassen Test
3. Miller-Rabin Test
Anhang: Magma-Code
Seminar Algorithmische Zahlentheorie
0.1 Kleiner Satz von Fermat
0.2 Chinesischer Restsatz
1.1 Algorithmus
1.2 Carmichel-Zahlen
2.1 Solovay-Strassen verschärft Fermat
2.2 Solovay-Strassen-Kriterium notwendig für prim
2.3 Solovay-Strassen-Kriterium hinreichend für prim
2.4 Fehlerwahrscheinlichkeit von Solovay-Strassen
halbiert sich in jedem Schritt
3.1 Miller-Rabin notwendig für prim
3.2 Miller-Rabin verschärft Fermat
3.3 Miller-Rabin hinreichend für prim
3.4, 3.5 Weiteres zum Miller-Rabin Test
Implementierungen der Tests von Fermat, SolovayStrassen und Miller-Rabin
04.05.2017
Ralph Welshofer und Joachim Siegert
0. Grundlagen
Die folgenden Tests beruhen auf dem chinesischen Restsatz und entwickeln den kleinen Satz von
Fermat weiter. Wir formulieren beide für Restklassen. Dabei bezeichne Un die Einheitengruppe
(engl. unit group“ ) modulo n, d. h. Un := (Z/nZ)× . Damit enthält Un genau die Restklassen
”
der Zahlen a, die zu n teilerfremd sind.
Kleiner Satz von Fermat: Sei n ∈ N. Dann gilt: n prim ⇒ an−1 ≡n 1 für alle a ∈ Un .
Beweis: Sei n prim und a ∈ Un . Da n prim ist, hat die Einheitengruppe genau n − 1 Elemente.
In endlichen Gruppen gilt stets: ElementGruppenordnung =Neutralelement. Also an−1 ≡n 1 für alle
a ∈ Un .
Chinesischer Restsatz: Sei n = m1 · . . . · mr ein Produkt teilerfremder Zahlen m1 , . . . mr .
Dann gibt es zu jedem Kongruenzgleichungssystem
x ≡m 1 c 1
x ≡m 2 c 2
...
x ≡m r c r
genau eine Lösung a in Z/nZ. Diese bijektive Zuordnung a ↔ (c1 , . . . , cr ) ist homomorph,
also ein Isomorphismus
Z/nZ ' Z/m1 Z × . . . × Z/mr Z.
Beweis und Algorithmus zur Lösung eines Kongruenzgleichungssystems: Siehe [G §4]. Wir halten
noch eine Folgerung fest:
Z/nZ ' Z/m1 Z × . . . × Z/mr Z
⇒
⇒
⇔
×
Chinesischer Restsatz
×
(Z/nZ) ' (Z/m1 Z × . . . × Z/mr Z)
×
×
(Z/nZ) ' (Z/m1 Z) × . . . × (Z/mr Z)
[G Lemma 4.6(i)]
×
Un ' Um1 × . . . × Umr
[G Lemma 4.6(ii)]
in kürzerer Notation
Insbesondere für die Einheitengruppen können wir den chinesischen Restsatz also einsetzen, und
das werden wir uns in den folgenden Beweisen mehrfach zu Nutze machen.
Seminar Algorithmische Zahlentheorie
04.05.2017
Ralph Welshofer und Joachim Siegert
1. Der Fermat Test
Ist n prim, so erfüllen alle a ∈ Un die Fermat-Bedingung an−1 ≡n 1. Damit können wir eine Zahl
n wie folgt testen:
Wähle zufälliges a ∈ {2, . . . , n − 1}.
Falls an−1 6≡n 1, so n sicher nicht prim.
Falls an−1 ≡n 1, so n vielleicht prim.
Wiederhole ggf. mit neuem a.
Beweis: Angenommen, der Algorithmus stößt auf ein 1 < a < n mit an−1 6≡n 1. Entweder ist a eine Einheit oder nicht. Falls a eine Einheit ist, so haben wir eine Einheit, die die Fermat-Bedingung
verletzt; dann kann n nicht prim sein. Falls a keine Einheit ist, so ist a nicht teilerfremd zu n,
also hat n weitere Teiler neben 1 und sich selbst und kann daher ebenfalls nicht prim sein.
Ein a, das die Bedingung des Primzahltests erfüllt, heißt Zeuge. Ist n aber gar nicht prim und
a trotzdem ein Zeuge, so heißt a spezieller ein falscher Zeuge. Ein a, das die Bedingung verletzt
und daher beweist, dass n nicht prim, nennen wir Gegenzeuge.
Die Aussage, dass n vielleicht prim“ ist, lässt sich beim Fermat Test nicht leicht mit einer Wahr”
scheinlichkeit quantifizieren. Eine Schwierigkeit ist folgende: Es gibt zusammengesetzte Zahlen
n, so dass dennoch alle a ∈ Un die Fermat-Bedingung erfüllen. Solche Zahlen, zu denen alle
Einheiten falsche Fermat-Zeugen sind, heißen Carmichael-Zahlen. Die kleinste Carmichael-Zahl
ist 561 = 3 · 11 · 17. Die folgenden Tests sollen besser mit ihnen zurechtkommen als der Fermat
Test. Dafür werden sie folgende Eigenschaft solcher Zahlen ausnutzen:
Lemma: Carmichael-Zahlen sind quadratfrei. Ist n ∈ N eine ungerade zusammengesetzte Zahl, so dass alle a ∈ Un die Fermat-Bedingung an−1 ≡n 1 erfüllen, dann lautet die
Primfaktorzerlegung n = p11 · . . . · p1r , d. h. kein Primfaktor tritt in einer Potenz größer als 1
auf (n ist Produkt paarweise verschiedener Primzahlen).
Beweis: Sei n eine ungerade zusammengesetzte Zahl mit an−1 ≡n 1 für alle a ∈ Un . Angenommen,
es gäbe eine Primpotenz pe (e > 1), die n teilt. Dann können wir n schreiben als n = pe m mit
m (Produkt der übrigen Primfaktoren) teilerfremd zu pe . Gemäß chinesischem Restsatz gilt
Un ' Upe × Um .
Sei ζ eine Primitivwurzel modulo pe , d. h. ein Erzeuger von Upe . Der chinesische Restsatz liefert
ein a ∈ Un mit der simultanen Kongruenz
a ≡p e ζ
a ≡m 1
(diese Wahl ist beliebig)
Nach Annahme gilt ferner an−1 ≡n 1. Da pe ein Teiler von n ist, gilt also erst recht an−1 ≡pe 1.
Mit obiger Kongruenz folgt ζ n−1 ≡pe an−1 ≡pe 1. Also muss ord (ζ) ein Teiler von n − 1 sein.
Wir erhalten
ord (ζ) = ϕ(pe ) = pe−1 (p − 1) | n − 1
⇒
pe−1 | n − 1
e>1
⇒
p | n − 1,
unmöglich, da p | n. Also kann es keine Primpotenz geben, die n teilt, d. h. n muss quadratfrei
sein.
Seminar Algorithmische Zahlentheorie
04.05.2017
Ralph Welshofer und Joachim Siegert
2. Der Solovay-Strassen Test
Der Solovay-Strassen Test entwickelt den Fermat Test weiter, indem er eine Bedingung testet,
die nicht nur notwendig, sondern auch hinreichend für Primzahlen ist. Wenn also für gegebenes
n alle a ∈ Un die Solovay-Strassen Bedingung erfüllen, so muss n prim sein. Wir können sogar
abschätzen: Ist n zusammengesetzt, so sind höchstens die Hälfte der a ∈ Un falsche Zeugen.
Dieser Test lässt sich daher probabilistisch nutzen: Mit jedem gefundenen Zeugen halbiert sich
die Wahrscheinlichkeit, dass n nicht prim ist.
Solovay-Strassen-Kriterium: Sei n ∈ N ungerade. Dann gilt:
n−1
a
für alle a ∈ Un
n prim ⇔ a 2 ≡n
n
wobei rechts das Jacobi-Symbol steht. Ist n nicht prim, so erfüllen höchstens noch die Hälfte
der a ∈ Un diese Gleichung.
Beweis:
(1) Solovay-Strassen verschärft Fermat Bedingung
Sei n ∈ N eine ungerade Zahl und a ∈ Un ein Element, das die Solovay-Strassen Bedingung erfüllt.
Da n ungerade ist und a teilerfremd zu n, nimmt das Jacobi-Symbol einen der Werte ±1 an. Es
gilt also:
n−1
2
a
⇒
n−1
a
≡n ±1
nach Annahme
≡n 1
durch Quadrieren
Jedes a, das die Solovay-Strassen-Bedingung erfüllt, erfüllt also erst recht die Fermat-Bedingung.
(2) Ist n prim, so erfüllen alle a ∈ Un die Solovay-Strassen Bedingung
a
n−1
2
Sei n ∈ N ungerade und eine Primzahl. Dann gilt a
≡n
für alle a ∈ Un gemäß dem
n
Lemma von Euler (vgl. Referat vom 27.4.).
(3) Ist n nicht prim, so verletzt ein a ∈ Un die Solovay-Strassen Bedingung
Sei n ∈ N eine ungerade zusammengesetzte Zahl. Angenommen, alle a ∈ Un würden die SolovayStrassen Bedingung erfüllen. Gemäß (1) erfüllen sie dann alle erst recht die Fermat Bedingung.
Somit ist n eine Carmichael-Zahl. Mit obigem Lemma ist also n = p1 ·. . . pr ein Produkt paarweise
verschiedener Primzahlen. Gemäß chinesischem Restsatz gilt die Isomorphie
Un ' Up1 × . . . × Upr
Wieder sei ζ eine Primitvwurzel modulo p1 . Der chinesische Restsatz garantiert nun ein eindeutiges a in Un , das folgende Kongruenzen erfüllt:
a ≡p1 ζ
a ≡p2 1
...
a ≡pr 1
Seminar Algorithmische Zahlentheorie
04.05.2017
Ralph Welshofer und Joachim Siegert
Damit gilt für das Jacobi-Symbol:
a
a
=
n
p1 · · · pr
a
a
a
=
...
p1
p2
pr
ζ
1
1
=
···
p1
p2
pr
= −1 · 1
···
Multiplikativität des Jacobi-Symbols
a
b
mit der Regel a ≡m b ⇒
=
m
m
1
siehe unten
= −1
denn 1 = 12 ist ein Quadrat modulo jeder Zahl, und eine Primitivwurzel modulo Primzahl (außer
2) ist niemals ein Quadrat: Wäre nämlich ζ ≡p1 b2 für ein b ∈ Up1 , so wäre, da hζi = Up1 die
ganze Gruppe erzeugt, zugleich b ≡p1 ζ k für ein k ∈ N, also ζ ≡p1 ζ 2k und daher 1 ≡p1 ζ 2k−1 ,
also ord (ζ) ein Teiler von 2k − 1, insbesondere ungerade. Aber ord (ζ) = p1 − 1 gerade (da p1
Primzahl größer als 2), unmöglich. Daher gilt
ζ
= −1.
p1
Nach Widerspruchsannahme erfüllen alle Einheiten die Solovay-Strassen-Bedingung, insbesondere das von uns konstruierte a:
n−1
a
2
≡n
a
≡n −1.
n
n−1
n−1
Wegen a 2 ≡n −1 gilt erst recht a 2 ≡p2 −1. Aber das ist unmöglich, denn a ist so konstrun−1
iert, dass a ≡p2 1, also auch a 2 ≡p2 1, und da p2 eine Primzahl größer als 2 ist, gilt 1 6≡p2 −1.
Bei einer zusammengesetzten Zahl n muss es also mindestens einen Gegenzeugen zur SolovayStrassen Bedingung geben.
(4) Ist n nicht prim, so sind höchstens die Hälfte der a ∈ Un falsche Zeugen
Sei n eine zusammengesetzte Zahl. Dann ist die Menge der falschen Solovay-Strassen-Zeugen
n−1
a
2
F = a ∈ Un | a
≡n
n
eine Untergruppe von Un , wie wir mit dem Untergruppenkriterium sehen: Seinen a, b ∈ F falsche
Zeugen. Dann gilt für ab−1 :
(ab−1 )
n−1
2
n−1
n−1
≡n a 2 (b 2 )−1
−1
a
b
≡n
n n
−1 a
b
≡n
n
n
−1 ab
≡n
n
denn
denn a, b ∈ F
b−1
b
bb−1
1
=
=
=1
n
n
n
n
Multiplikativität des Jacobi-Symbols
und damit ist auch ab−1 ∈ F , also F eine Untergruppe von Un . F muss sogar eine echte Untergruppe sein, denn in (3) haben wir gesehen, dass nicht ganz Un aus falschen Zeugen bestehen
kann. Als echte Untergruppe der endlichen Gruppe Un ist F höchstens halb so groß wie Un .
Für die Praxis bedeutet dies: Mit jedem zufälligen a ∈ Un , das die Solovay-Strassen-Bedingung
erfüllt, halbiert sich die Wahrscheinlichkeit, dass n keine Primzahl ist. Durch k-faches Testen
k
konvergiert die Fehlerwahrscheinlichkeit dieses Primzahltests als 21 rasch gegen null.
Seminar Algorithmische Zahlentheorie
04.05.2017
Ralph Welshofer und Joachim Siegert
3. Der Miller-Rabin Test
Der Miller-Rabin Test ist eine noch mächtigere Weiterentwicklung des Fermat Tests und erfreut
sich in der Praxis großer Beliebtheit. Um ihn zu verstehen, überlegen wir uns zuerst an einem
Beispiel, wie man schnell potenzieren kann. Wir wollen untersuchen, ob n = 2017 eine Primzahl ist. Dazu wählen wir zufälliges a aus U2017 . Für den Fermat Test müssten wir nun a2016
berechnen. Die definitorisch naheliegende Herangehensweise a2016 = a · a · a · . . . · a erfordert 2015
Multiplikationen. Das geht besser: Wir zerlegen n−1 = 2016 = 4·504 = 16·126 = 32·63 = 25 ·63
in seinen geraden und seinen ungeraden Anteil und Potenzieren nun durch
a2016 = a63·32 = (a63 )32
= (((((a63 )2 )2 )2 )2 )2
Notieren wir n − 1 = m · 2t , wobei m der ungerade Anteil ist (hier: m = 63 und t = 5), so lautet
t
t
dies allgemein: an−1 = am2 = (am )2 . Die ungerade Potenz a63 lässt sich übrigens ihrerseits mit
Hilfe schrittweisen Quadrierens effizient berechnen:
a63 = a32+16+8+4+2+1 = a32 a16 a8 a4 a2 a
= ((((a2 )2 )2 )2 )2 (((a2 )2 )2 )2 ((a2 )2 )2 (a2 )2 a2 a
Nun von rechts unten aus startend: Wir rechnen a mal (a mal a), merken uns letzeren Zwischenwert, rechnen erneut mal a, und so fortfahrend benötigen wir insgesamt nur elf (!) Multiplikationen, bis wir bei a2016 angekommen sind. Unterwegs, im zehnten Schritt, erhalten wir als
n−1
Zwischenergebnis a 2 , denjenigen Wert, den wir für den Solovay-Strassen Test bräuchten.
s
(1) Ist n prim, so ist am ≡n 1 oder es gibt ein s < t mit (am )2 ≡n −1
Sei n eine Primzahl. Laut kleinem Satz von Fermat ist dann an−1 ≡n 1. Wir zerlegen n−1 = m·2t
t−1
t−1
in geraden und ungeraden Anteil. Für die nächstkleinere Stufe (am )2
gilt ((am )2 )2 =
t
(am )2 = an−1 ≡n 1; sie ist eine Quadratwurzel der Eins.
t−1
Es muss also (am )2
≡n ±1 sein: n ist prim, also Z/nZ ein Körper, und über einem Körper
hat die Gleichung x2 = 1 ⇔ x2 − 1 = 0 ⇔ (x − 1)(x + 1) = 0 nur ±1 als Lösungen. ∗
s
t
(am )2 ≡n 1
t−1
(am )2
(am )2
≡n 1
t−1
≡n −1
...
1
(am )2 ≡n 1
0
(am )2 ≡n 1
0
(am )2 ≡n −1
Ist ein (am )2 ≡n 1, so folgt
s−1
wiederum (am )2
≡n ±1, und
es ergibt sich nebenstehender
Baum. Jeder Zweig entspricht
dabei einer Quadratur bzw. Radizierung.
t
Damit sich letztlich (am )2 ≡n 1
ergeben kann, muss also am ≡n
1 gelten (unteres linkes Blatt)
s
oder (am )2 ≡n −1 für ein s ∈
{0, . . . , t − 1} (rechte Blätter),
wie behauptet.
s
(2) Ist am ≡n 1 oder es gibt ein s < t mit (am )2 ≡n −1, so folgt an−1 ≡n 1
Starten wir in einem der Blätter des obigen Baumes, so ergibt sich durch (mindestens einfaches)
Quadrieren sogleich 1 als Wert und dieser ändert sich unter weiterem Quadrieren nicht mehr.
∗ Gegenbeispiel für n nicht prim: In Z/8Z ist 12 ≡ 1 und 32 ≡ 9 ≡ 1 und 52 ≡ 25 ≡ 1 und 72 ≡ 49 ≡ 1,
8
8
8
8
8
8
8
womit die Gleichung x2 ≡8 1 vier Lösungen besitzt. Dass Polynome zweiten Grades höchstens zwei Nullstellen
haben, ist nur über Körpern wahr.
Seminar Algorithmische Zahlentheorie
04.05.2017
Ralph Welshofer und Joachim Siegert
Miller-Rabin-Kriterium: Sei n ∈ N ungerade, und n − 1 = 2t m (mit m ungerade) die
Zerlegung von n − 1 in Zweierpotenz und übrigen Faktor. Es gilt:
n prim ⇔ alle a ∈ Un erfüllen mindestens eine der Bedingungen
am ≡n 1
2s m
a
(MR1)
≡n −1 für ein s ∈ {0, . . . , t − 1}
(MR2)
Beweis:
In (1) haben wir gezeigt: n prim ⇒ alle a ∈ Un erfüllen MR1 oder MR2. In (2) haben wir
gezeigt, dass jedes a ∈ Un , das MR1 oder MR2 erfüllt, erst recht die Fermat-Bedingung erfüllt.
Bleibt zu zeigen:
(3) Ist n nicht prim, so verletzt ein a ∈ Un die Miller-Rabin-Bedingung
Sei n ∈ N eine ungerade zusammengesetzte Zahl. Angenommen, alle a ∈ Un würden eine der
Bedingungen MR1 und MR2 erfüllen. Da alle a die Miller-Rabin-Bedingung erfüllen, erfüllen sie
laut (2) auch die Fermat-Bedingung. Somit ist n eine Carmichael-Zahl. Wieder nutzen wir, dass
n = p1 · . . . · pr quadratfrei,ist. Da n zusammengesetzt und quadratfrei ist, gibt es also mindestens
zwei Primfaktoren p1 und p2 . Da wir von vornherein ungerades n betrachten, sind diese beiden
Primfaktoren beide ungleich 2. Wieder setzen wir den chinesischen Restsatz ein:
Un ' Up1 × . . . × Upr
und wählen ein a ∈ Un wie folgt: Sei ζ erneut eine Primitivwurzel modulo p1 . Sei nun a dasjenige
Element von Un mit
a ≡p 1 ζ
a ≡p 2 1
Nach Annahme erfüllt a eine der Bedingungen MR1 und MR2. Falls a MR1 erfüllt, so gilt
am ≡n 1. Also erst recht am ≡p1 1. Wegen a ≡p1 ζ folgt ζ m ≡p1 am ≡p1 1. Also ist ord (ζ) ein
Teiler von m:
ord (ζ) = p1 − 1 | m,
unmöglich, da p1 − 1 gerade, m jedoch ungerade ist.
Falls a die andere Bedingung MR2 erfüllt, so a2
s
erst recht a2 m ≡p2 −1, und mit a ≡p2 1 folgt:
s
12
m
s
m
≡n −1 für ein s ∈ {0, . . . , t − 1}. Also
≡p2 −1,
unmöglich, da 1 unter Potenzieren immer 1 bleibt, und 1 ≡p −1 nur für p = 2 gilt; in allen
anderen Restklassenringen sind 1 und −1 verschieden. Es kann also nicht sein, dass bei einer
zusammengesetzten Zahl n alle a ∈ Un die Miller-Rabin-Bedingung erfüllen.
Der Miller-Rabin Test verwendet also, wie auch Solovay-Strassen, eine genau dann, wenn“”
Bedingung für Primzahlen. Er lässt sich aber deutlich schneller ausführen: Erstens genügen ihm
n−1
oft schon kleinere Potenzen als a 2 , die für die Prüfung gemäß Fermat oder Solovay-Strassen
ohnehin als Zwischenwerte nötig wären, und zweitens braucht er diese Potenzen nur mit ±1 zu
vergleichen anstatt noch ein Jacobi-Symbol berechnen zu müssen.
Seminar Algorithmische Zahlentheorie
04.05.2017
Ralph Welshofer und Joachim Siegert
Der Miller-Rabin Test ist nicht nur schneller als der Solovay-Strassen Test, sondern auch
gründlicher:
(4) Miller-Rabin verschärft Solovay-Strassen
Ohne Beweis. Siehe dazu [K 131ff]. Da jedes a ∈ Un , das die Miller-Rabin-Bedingung erfüllt, erst
recht die Solovay-Strassen-Bedingung erfüllt, ist der Miller-Rabin Test mindestens so gründlich
wie der Solovay-Strassen Test; seine Fehlerwahrscheinlichkeit muss sich in jedem Schritt also
mindestens halbieren. Tatsächlich gilt sogar:
(5) Ist n nicht prim, so sind höchstens ein Viertel der a ∈ Un falsche Zeugen
Ohne Beweis. Siehe dazu [MSP 92f]. Die Tests von Solovay-Strassen und Miller-Rabin sind also
schrittweise Weiterentwicklungen des kleinen Satzes von Fermat, die es ermöglichen, effizient zu
testen, ob eine gegebene Zahl prim ist. Die Wahrscheinlichkeit, dass eine zusammengesetzte Zahl
diese Tests besteht, kann so schnell so weit gesenkt werden, dass sie vernachlässigbar wird beispielsweise gegenüber der Wahrscheinlichkeit eines Hardware-Fehlers. Somit sind probabilistische
Primzahltests für viele kryptographische Anwendungen das Mittel der Wahl.
Literatur
[G]
[K]
Gerkmann, R.: Zahlentheorie, Vorlesungsskript aus dem WS2016/17.
Koblitz, N.: A course in number theory and cryptrography, Graduate Texts in
Mathematics 114, 2. Auflage, Springer 1994.
[MSP] Müller-Stach, S./Piontkowski, J.: Elementare und algebraische Zahlentheorie,
2. Auflage, Vieweg+Teubner 2011.
Seminar Algorithmische Zahlentheorie
04.05.2017
Ralph Welshofer und Joachim Siegert
Anhang: Magma-Code
1
2
3
// Fermat Test
n:=561;
R:=ResidueClassRing(n);
4
5
6
7
8
9
10
11
12
13
14
for i:=1 to 10 do
a:=Random(R);
print "a=",a;
if (not (a^(n-1) eq 1)) then
print "a^(n-1)=",a^(n-1), "also", n, "keine Primzahl";
break;
else
print a, "^(",n-1,")=",a^(n-1)," erfuellt die Fermat-Bedingung";
end if;
end for;
Testet die Zahl n (hier 561) höchstens zehn mal (Zeile 5/14), indem für ein zufälliges Element
von Z/nZ (Zeile 6) die Fermat-Bedingung überprüft wird. Ist diese verletzt, so bricht der Test
mit der Meldung ab, dass n keine Primzahl ist (Zeile 9, 10).
1
2
3
// Solovay-Strassen Test
n:=41041;
R:=ResidueClassRing(n);
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for k:=1 to 10 do
a:=Random(1,n);
if (not (GCD(a,n) eq 1)) then
print a,"nicht teilerfremd zu",n,"also n sicher nicht prim";
break;
else
if (not ((R!a)^((n-1) div 2) eq JacobiSymbol(a,n))) then
print a,"^(n-1)/2=",(R!a)^((n-1) div 2),"aber Jacobi-Symbol=",
JacobiSymbol(a,n), "also",n, "sicher nicht prim";
break;
else
print a,"^(n-1)/2=",(R!a)^((n-1) div 2),"und Jacobi-Symbol=",
JacobiSymbol(a,n), "also",n, "max. mit Wkeit",(1/2)^k,"nicht prim";
end if;
end if;
end for;
Gegenüber dem Fermat Test kommt die if-Schaltung in Zeilen 7/10 hinzu: Wir prüfen erst, ob
das gezogene a < n teilerfremd zu n ist. Wenn nein, dann ist n sicher nicht prim; Ende des Tests
(Zeile 9). Wenn ja, dann ist a eine Einheit, und wir prüfen, ob die Solovay-Strassen-Bedingung
erfüllt ist. Erfüllt die Einheit sie (Zeile 15ff), dann sinkt die Wahrscheinlichkeit, dass n nicht
k
prim ist, auf 21 . Diese Prüfung auf Teilerfremdheit (Zeile 7) kostet zwar Rechenzeit, die wir
uns im Fermat Test sparen konnten, aber nur dank der Gewissheit, eine Einheit zu untersuchen,
erhalten wir dann die in 2.3 und 2.4 bewiesene Fehlerabschätzung.
Etwas Sorgfalt ist übrigens bei der Wahl der Typen geboten: Zeile 6 muss a ∈ Z als ganze Zahl
generieren, weil die Funktion JacobiSymbol (Zeile 11) nur ganze Zahlen akzeptiert. An allen
anderen Stellen wollen wir stattdessen die Restklasse [a]n ∈ Z/nZ betrachten, was wir jeweils
durch den typecast R!a erzwingen (interpretiert a als Element von R = Z/nZ).
Seminar Algorithmische Zahlentheorie
04.05.2017
Ralph Welshofer und Joachim Siegert
1
2
3
// Miller-Rabin Test
n:= 3825123056546413051;
R:=ResidueClassRing(n);
4
5
6
7
8
// Vorbereitungen für Miller-Rabin
f:=Factorization(n-1);
t:=f[1][2]; // besorgt die 2er Potenz, die in n-1=2^t*m enthalten ist
m:=(n-1) div (2^t); // besorgt den übrigen ungeraden Faktor m
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// teste höchstens 10 mal
for k:=1 to 10 do
a:=Random(R);
// teste, ob a Einheit
if (not (GCD(a,n) eq 1)) then
print a,"nicht teilerfremd zu",n,"also n sicher nicht prim";
else
// Teste, ob MR1 erfüllt
x:=a^m;
if (x eq 1) then
print a,"^m=1, also n hoechstens mit Wkeit",(1/4)^k,"nicht prim";
// Falls MR1 nicht erfüllt, teste, ob MR2 erfüllt
else
treffer:=false;
s:=0;
while ((not treffer) and (s lt t)) do
if (x eq -1) then
treffer:=true;
print a,"^(m*2^",s,")=-1, also n hoechstens mit Wkeit",
(1/4)^k,"nicht prim";
break;
else
s:=s+1;
x:=x^2;
end if;
end while;
if (s eq t) then
print a,"erfuellt die MR-Bedingung nicht,
also n sicher keine Primzahl";
break;
end if;
end if;
end if;
end for;
Ergänzend zu den Kommentaren im Code: In Zeile 18 wird am als eigene Variable x angelegt,
n−1
damit wir dann schrittweise quadrieren können bis a 2 (das geschieht jeweils in Zeile 33).
Solution([1,1,1],[2,1,1],[3,11,17]);
Lösung eines Kongruenzgleichungssystems:
Seminar Algorithmische Zahlentheorie
04.05.2017
1·x≡2
mod 3
1·x≡1
mod 11
1·x≡1
mod 17
Ralph Welshofer und Joachim Siegert
Herunterladen