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