Ein randomisierter Primzahltest

Werbung
Ein randomisierter Primzahltest
8.1.05
Thomas Preu
Motivation
Verschlüsselungstechniken, zum Beispiel zur sicheren Übermittlung von Finanztransaktionen, sind eine wichtige Aufgabe für die Informatik geworden. Viele dieser Techniken wie etwa RSA oder elGamal wären ohne effiziente algebraische Operationen undenkbar. Dazu braucht man mathematische Objekte, deren schöne Eigenschaften zentral auf großen Primzahlen basieren. Deshalb sind effiziente Primzahltests von großer
Bedeutung.
Der Fermat-Test
Dem Fermat-Test liegt ein bekannter Satz zugrunde:
kleiner Satz von Fermat
Für eine Primzahl p und eine beliebige Zahl a mod p 6= 0 gilt ap−1 mod p = 1
Wenn dieser Zusammenhang für Nichtprimzahlen nicht gelten würde, so könnte man
einfach der Reihe nach verschiedene a durchprobieren, bis man eine Zahl gefunden hat,
für die der Zusammenhang nicht gilt. Da man immer mod p rechnet, reicht es auch,
nur Zahlen a ∈ {1, . . . , p − 1} zu betrachten.
Definition
Für eine zusammengesetzte Zahl n, heißt a Fermat-Zeuge, wenn an−1 mod n 6= 1,
sonst Fermat-Lügner.
Fermat-Zeugen bezeugen gewissermaßen das Zusammengesetztsein von n
Satz
Für ein n ≥ 3 ist ein Fermat-Lügner a stets Element einer Restklasse aus der Einheitengruppe Z∗n
Beweis
1 = an−1 mod n = a · an−2 mod n. damit ist an−2 ein Inverses zu a.
Damit läßt sich ein Primzahlkriterium aufstellen:
Satz
n ≥ 3 : ∀1 ≤ a < n : an−1 mod n = 1 ⇒ n ist prim
Beweis
Es ist bekannt, dass n ist prim ⇔ Z∗n = {1, . . . , n − 1} (hier sind natürlich nicht die
1
Zahlen selbst, sondern deren zugehörige Restklassen gemeint – aufgrund der leichteren
Lesbarkeit gönnt man sich diese Unsauberkeit). Mit dem vorherigen Satz, folgt die
Behauptung.
Da 1, n − 1 triviale Fermat-Lügner für jedes zusammengesetzte n sind (leicht nachzurechnen) und gerade n auch keine Probleme bereiten, lässt sich damit ein randomisierter Primzahltest formulieren.
FERMAT-TEST
Input: Odd Integer n ≥ 3
Method: Let a be randomly choosen from {2, . . . , n − 2}
if an−1 mod n 6= 1 then return 1;
else return 0;
Wenn das Ergebnis dieses Tests 1, so ist n sicher zusammengesetzt, andernfalls kann
man nichts sicher aussagen. Ist umgekehrt n prim, so ist das Ergebnis stets 0 nach
obigen Sätzen.
Natürlich möchte man, dass dieser Test, wenn er schon randomisiert ist, wenigstens
mit hoher Wahrscheinlichkeit das richtige Ergebnis liefern. Es bleibt nur, zusammengesetzte n zu betrachten:
Satz
Ist n ≥ 3 ungerade und zusammengesetzt und es gibt mindestens einen Fermat-Zeugen
a in Z∗n , so ist das Ergebnis des Fermat-Tests 1 mit Wahrscheinlich > 1/2
Beweis
n−1
Es sei die Menge der Fermat-Lügner LF
mod n = 1} eine echte
n = {a|1 ≤ a < n, a
F
∗
Untergruppe von Zn . Dass Ln Teilmenge ist, ist Aussage eines der obigen Sätze.
Zur Untergruppeneigenschaft:
1n−1 = 1, also auch 1 ∈ LF
n
n−1
≡ an−1 bn−1 ≡ 1 · 1 ≡ 1( mod n)
a, b ∈ LF
n : (ab)
Da es nach Vorraussetzung mindestens einen Fermat-Zeugen gibt, sind die FermatLügner eine echte Untergruppe und hat nach dem Satz von Lagrange höchstens die
halbe Mächtigkeit von Z∗n . Damit ergibt sich die Wahrscheinlichkeit:
|LF
n \{1,n−1}|
|{2,...,n−2}|
=
(n−2)/2−2
n−3
< 1/2
Man könnte also den Fermat-Test solange iterieren, bis man sich sicher genug ist, dass
die getestete Zahl prim. Bei jeder Iteration steigt die Sicherheit mit einem Faktor 2,
falls es mindestens einen Fermat-Zeugen in Z∗n gibt.
Gibt es nun immer so einen Fermat-Zeugen? Die ernüchternde Antwort ist: Nein!
Man nennt solche Außreißerzahlen Carmichael-Zahlen. Die kleinste solche Zahl ist 561.
Man kann sogar zeigen, dass es unendlich viele solche Zahlen gibt.
Der Miller-Rabin-Test
Man macht sich nun eine weitere Eigenschaft von Primzahlen zu nutze. Dazu zunächst
folgende Definition:
Definition
Eine Zahl a heißt Wurzel der 1 mod n, falls a2 mod n = 1
Trivialerweise sind 1 und n−1 immer Wurzeln der 1 mod n und es gilt sogar spezieller
(ohne Beweis):
2
Satz
Genau dann ist n prim, wenn genau 1, n − 1 Wurzeln der 1 mod n sind.
Da man ja ohne Einschränkung vorraussetzen kann, dass n ungerade ist, ist n − 1 stets
durch 2 teilbar. Die Idee ist, dass man n − 1 = u · 2k zerlegt und man so k ≥ 1 Tests
auf Wurzeln der 1 mod n ausführen kann.
Da man ja alle Zahlen, außer den Carmichael-Zahlen, ja schon mit einer Wahrscheinlichkeit > 1/2 richtig einordnet, braucht man nur diese betrachten. Man kann auch
tatsächlich zeigen, dass der Wurzeltest dann auch tatsächlich ebenfalls mit Wahrscheinlichkeit > 1/2 Carmichaelzahlen als zusammengesetzt erkennt.
Man kombiniert nun beide Tests; dabei zeigt eine genauere Analyse, dass man nicht
einmal k mal den Wurzeltest ausführen muss, sondern lediglich k − 1 mal und dass der
Fermat-Test dabei schon implizit erfolgt ist:
MILLER-RABIN-TEST
Input: Odd Integer n ≥ 3
Method: Find u odd and k so, that n − 1 = u · 2k
Let a be randomly choosen from {2, . . . , n − 2}
b = au mod n;
if b ∈ {1, n − 1} then return 0;
repeat k − 1 times
b = b2 mod n;
if b = n − 1 then return 0
if b = 1 then return 1
return 1;
Gibt dieser Test nun 1 zurück, so so war n sicher zusammengesetzt. Bei 0 ist n mit
Wahrscheinlichkeit größer als 1/2 eine Primzahl (wesentlich aufwändigere Analysen
zeigen sogar, dass 3/4 eine Schranke ist). Ist umgekehrt n prim, so ergibt der Test
sicher 0.
Wiederum kann man durch Iteration des Tests die Qualität exponentiell erhöhen.
Ausblick
Lange Zeit waren randomisierte Primzahltests die einzigen, die in vernünftiger“ Zeit
”
ein vernünftiges“ Ergebnis produzierten. Vor zwei Jahren wurde allerdings ein de”
terministischer und polynomieller (das heißt schneller) Primzahltest von Agrawall,
Keyal und Saxena vorgestellt. Auch der Test von Miller-Rabin kann zu einem polynomiellen Primzahltest umgestalltet werden – allerdings nur, wenn die erweiterte
Riemann-Hypothese richtig ist, deren Beweis nachwievor auf sich warten läßt. . .
3
Herunterladen