Primzahltest in Polynomialzeit — Der Algorithmus von Agrawal, Kayal und Saxena Vorlesungsnotizen von Martin Dietzfelbinger, TU Ilmenau 24. Oktober 2002 1 Stand der Dinge Am 6. August 2002 verbreiteten Manindra Agrawal, Neeraj Kayal und Nitin Saxena (vom Dept. of Computer Science and Engineering, Indian Institute of Technology Kanpur, Indien) über das Internet ein Manuskript [3] mit dem Titel PRIMES is in P“, in dem ” für das Primzahlproblem ein Polynomialzeitalgorithmus angegeben wurde. Genauer ist PRIMES“ das Problem, zu einer gegebenen Zahl n zu entscheiden, ” ob n eine Primzahl ist oder nicht. Algorithmentheoretisch definiert man PRIMES = {bin(n) | n ist eine Primzahl}, wobei bin(n) die Binärdarstellung der Zahl n bedeutet. Damit ist PRIMES ⊆ {0, 1}∗ , also eine Sprache. Die Frage ist, ob PRIMES in der Klasse P der in polynomieller Zeit entscheidbaren Sprachen liegt. √ Offensichtlich gibt es einen Algorithmus, der das Primzahlproblem mit ≤ n Divisionen löst. Dies ist aber kein Polynomialzeitalgorithmus, weil als Länge der Eingabe die Bitanzahl |bin(n)| = dlog2 (n + 1)e gilt. Ein Polynomialzeitalgorithmus für dieses Problem ist also einer, der auf Input bin(n) Laufzeit O(p(|bin(n)|) = O(p(log(n))) hat, für ein Polynom p. Bisher war kein solcher Algorithmus bekannt. Die Bedeutung des neuen Ergebnisses liegt darin, dass das Primzahlproblem und Algorithmen für dieses Problem seit Jahrhunderten betrachtet werden1 . Seit es 1 Agrawal, Kayal und Saxena führen ein Zitat von Karl Friedrich Gauß aus den “Disquisitiones Arithmeticae” von 1801 an, das die fundamentale Bedeutung des Primzahlproblems unterstreicht. 1 moderne Algorithmik und das Konzept des Zeitaufwandes gibt (seit den 60er Jahren des 20. Jahrhunderts), hat man sich darauf geeinigt, höchstens die Probleme als effizient lösbar“ anzusehen, die einen Polynomialzeitalgorithmus haben; da” her rührt das große Interesse an der Klasse P. Es gab schon eine ganze Weile (Solovay/Strassen 1977 [13] und Miller-Rabin 1980 [10, 11]) sehr effiziente und einfach zu implementierende randomisierte Algorithmen für das Primzahlproblem. Die Anzahl der arithmetischen Operationen in diesen Tests ist O(log n), wenn man mit einer konstanten, von n unabhängigen Fehlerwahrscheinlichkeit zufrieden ist. Für eine Fehlerwahrscheinlichkeit von n−c , c eine beliebige feste Konstante, bezahlt man mit einer Anzahl von O((log n)2 ) arithmetischen Operationen. Das Problem mit den einfachen randomisierten Tests ist, dass sie (mit kleiner Wahrscheinlichkeit, aber immerhin möglich) eine zusammengesetzte Zahl als prim deklarieren können. Sehr komplexe randomisierte Algorithmen, ebenfalls mit polynomieller Laufzeit (Adleman, Huang 1992 [1]), vermeiden dies, indem sie jede der beiden Antworten ( n prim“ ” oder n zusammengesetzt“) mit einem Zertifikat“ ergänzen, das die Richtigkeit ” ” der Ausgabe belegt. Der bisher schnellste deterministische Primzahltest (Adleman, Pomerance und Rumely 1983 [2]) hat eine Laufzeitschranke von O((log n)c log log log n ) für eine Konstante c. Diese Laufzeitschranke ist superpolynomiell, wenn auch nur ganz schwach. Da der neue Algorithmus im Vergleich zu den bekannten randomisierten Verfahren eine relativ hohe Laufzeit hat2 und diese Algorithmen das Problem für praktische Zwecke ausreichend gut lösen, hält sich die Änderung in der Praxis in Grenzen. In diesem Zusammenhang sollte man anmerken, dass die Sicherheit von Kryptosystemen (wie dem RSA-Schema), die auf der Annahme beruht, dass das Finden der Faktoren von zusammengesetzten Zahlen schwierig ist, von dem neuen Ergebnis nicht betroffen ist. Der neue Algorithmus führt nicht direkt zu neuen Erkenntnissen über die Komplexität des Faktorisierungsproblems. (Für Details zum Faktorisierungsproblem siehe z. B. [8].) Man wusste schon lange, dass die Sprache PRIMES in NP und in co-NP liegt. Es war also nicht zu verwundern, dass es keinen NP-Vollständigkeitsbeweis für PRIMES gab. Auf die P-NP-Frage hat das neue Resultat keine Auswirkungen, da PRIMES nicht NP-vollständig ist (außer wenn doch P = NP ist, natürlich). In diesen Skizzen wird der Algorithmus von Agrawal, Kayal und Saxena motiviert und angegeben und nach Diskussion einiger algebraischer Grundlagen die Korrektheits- und die Laufzeitanalyse durchgeführt. 2 O((log n)12 · poly(log log n)) ist ohne Annahmen beweisbar. In Wirklichkeit erwartet man eine Laufzeit in O((log n)6 ·poly(log log n)); diese folgt aus einer zahlentheoretischen Vermutung, deren Richtigkeit von vielen Forschern angenommen wird. 2 2 Notation, grundlegende Tatsachen In diesem Abschnitt rekapitulieren wir kurz Notation und elementare Tatsachen zu Teilbarkeit, zu endlichen Gruppen und zu modularer Arithmetik. Eine kompakte Darstellung dieser Konzepte findet man z. B. in [12, Kap. 5]. Notation 2.1 (a) Wenn a die Zahl b teilt, schreiben wir a | b, wenn a nicht b teilt, schreiben wir a 6 | b. (b) ggT(a, b) bezeichnet den größten gemeinsamen Teiler von a und b. (c) Wenn a und b teilerfremd sind, d. h. wenn ggT(a, b) = 1 ist, schreiben wir a ⊥ b. Gruppen werden multiplikativ notiert; das neutrale Element in einer Gruppe wird mit 1 bezeichnet. Fakt 2.2 (a) Wenn (G, ·, 1) eine endliche Gruppe ist und z ∈ G, dann gilt: (i) ordG (z) = min{i ≥ 1 | z i = 1} ist ein Teiler von |G| ; (ii) z |G| = 1. (b) Wenn (G, ·, 1) zyklisch ist mit erzeugendem Element a, d. h. wenn G = {1, a, a2 , . . . , a|G|−1 }, dann gilt für i, j ≥ 0: ai = aj ⇔ |G| teilt i − j. (c) Wenn G eine zyklische Gruppe ist, dann ist auch jede Untergruppe von G zyklisch. Fakt 2.3 (a) Zu n ≥ 2 kann man den Ring Zn = Z/nZ bilden, indem man Addition und Multiplikation in Z modulo n ausführt. Der Ring Zn hat (im wesentlichen) die Elemente 0, 1, . . . , n − 1. (b) Wenn p eine Primzahl ist, dann ist Zp ein Körper mit p Elementen. (c) Für die multiplikative Gruppe in Zp schreibt man Z∗p . Sie hat (im wesentlichen) die Elemente 1, 2, . . . , p − 1. Fakt 2.4 (Kleiner Satz von Fermat) Sei p eine Primzahl. (a) Für p 6 | a gilt: ap−1 ≡ 1 (mod p). (b) Für jedes a gilt: ap ≡ a (mod p). Beweis. (a) Weil p 6 | a, ist a ein Element von Z∗p , einer Gruppe mit p − 1 ∗ Elementen. Nach Fakt 2.2(a) ist a|Zp | = ap−1 = 1 in dieser Gruppe; das ist aber gerade die Behauptung. (b) ist für p | a trivial und folgt für p 6 | a aus (a). 3 Definition 2.5 Wenn p eine Primzahl ist und p 6 | a, dann nennen wir ordp (a) = ordZ∗p (a) = min{i ≥ 1 | ai ≡ 1 (mod p)} die Ordnung von a modulo p. Wir benötigen das folgende technische Lemma. Lemma 2.6 Sei p eine Primzahl, p 6 | a. Dann gilt: (a) ordp (a) teilt p − 1. (b) Wenn q eine Primzahl ist, für die q | (p − 1) , aber q 2 6 | (p − 1) gilt, dann gilt für s = (p − 1)/q: q | ordp (a) ⇔ as 6≡ 1 (mod p). Beweis. (a) Da ordp (a) = ordZ∗p (a) und |Z∗p | = p − 1, folgt dies aus Fakt 2.2(b). (b) Als Teiler von p − 1 ist ordp (a) das Produkt einiger Primfaktoren von p − 1. Weil p − 1 = qs, q prim, q 6 | s, und mit Fakt 2.2(b), angewendet auf die zyklische Gruppe {ai mod p | i ≥ 0}, folgt q 6 | ordp (a) ⇔ ordp (a) | s ⇔ as ≡ 1 3 (mod p). Motivation In diesem Abschnitt wird die Grundidee des Algorithmus erklärt. Dazu werden einige Konzepte zu Polynomen naiv benutzt. Die nötigen formalen Definitionen findet man bei Bedarf in Abschnitt 6.2. Lemma 3.1 Es sei n ≥ 2 beliebig, a sei teilerfremd zu n. Dann gilt: n ist Primzahl ⇔ (X + a)n ≡ (X n + a) (mod n). Mit der zweiten Aussage ist gemeint: Wenn man das Polynom (X + a)n ausmultipliziert und die Koeffizienten modulo n nimmt, ergibt sich X n + a. Beweis. Man schreibt: X n (X + a) = ai X n−i . i 0≤i≤n n ⇒“: Wenn n eine Primzahl ist, dann ist für 1 ≤ i ≤ n − 1 in ” n n(n − 1) . . . (n − i + 1) = i i! 4 (1) der Zähler durch n teilbar, der Nenner aber nicht, also gilt n | ni . Daraus folgt, dass modulo nin der Summe in (1) nur der erste und der letzte Term nicht 0 sind. Weiter gilt nn an = an ≡ a (mod n), wegen des kleinen Satzes von Fermat“ ” (Fakt 2.4(a)). ⇐“: Wenn n keine Primzahl ist, dann sei p ein Primfaktor von n und s ≥ 1 so, ” dass ps | n und ps+1 6 | n. Betrachte den Summanden mit Index p in (1): n p n(n − 1) . . . (n − p + 1) p a = a. p p! Der Zähler ist durch ps teilbar, nicht aber durch ps+1 , der Nenner ist durch p teilbar. Weil a und n teilerfremd sind, gilt p 6 | a und damit p 6 | ap . Also ist n(n−1)...(n−p+1) p a nicht durch ps teilbar und damit auch nicht durch n. Das bep! deutet, dass modulo n gesehen der Koeffizient np ap bei X p nicht 0 ist, damit ist (X + a)n 6≡ (X n + a) (mod n). Dieses Lemma führt zu einem naheliegenden Verfahren, um zu testen, ob eine ungerade Zahl n eine Primzahl ist: Wähle ein a < n, das teilerfremd zu n ist (z. B. a = 1). Berechne alle Koeffizienten (mod n) des Polynoms, das aus (X +a)n durch Ausmultiplizieren entsteht. Wenn alle Koeffizienten außer dem bei X n und der Konstanten an gleich Null sind, ist n Primzahl, sonst nicht. Der Nachteil dieses Tests ist, dass beim Ausmultiplizieren n + 1 Terme entstehen und damit die Laufzeit noch √ viel größer ist, als wenn man n versuchsweise durch alle ungeraden Zahlen < n teilen würde ( trial division“). ” Der Grundansatz des neuen Primzahltests ist es, die Äquivalenz (X + a)n ≡ (X n + a) (mod n) (2) nicht absolut“ zu testen, sondern modulo eines (geschickt gewählten) anderen ” Polynoms X r − 1. Man berechnet also (X + a)n mod (n, X r − 1) und (X n + a) mod (n, X r − 1), und vergleicht die Resultate. Die Rechnung modulo n bedeutet wie üblich, dass man Zahlen m durch m mod n ersetzen kann. Die Rechnung modulo X r − 1 bedeutet, dass man X r durch 1, also X s durch X s mod r ersetzen kann. Während des Potenzierungsvorgangs für (X + a)n kann man also in den Polynomen, die als Zwischenergebnisse auftreten, Potenzen X s mit s > r immer wieder entfernen und hat es stets nur mit Polynomen vom Grad < r zu tun. Das hält den Berechnungsaufwand klein, solange r nicht zu groß ist. Wenn n prim ist, muss das Ergebnis für jedes a und jedes r gleich X n mod r + a sein. Für die umgekehrte Richtung möchte man gerne mit einem einzigen r auskommen, das nicht zu groß ist, damit die Grade der auftretenden Polynome nicht zu groß sind. Ein zentraler Punkt bei diesem Ansatz ist also zu definieren, was ein 5 geeignetes r ist, und zu zeigen, dass es nicht zu große geeignete r gibt. Weiter stellt sich heraus, dass es selbst für solche geeigneten r nicht mehr genügt, ein einziges a zu betrachten, sondern dass man die Bedingung (X + a)n ≡ (X n + a) (mod n, X r − 1) für eine ganze Reihe von Zahlen a testen muss, um schließen zu können, dass n . . . nein, nicht prim, aber zumindest Potenz einer Primzahl ist. Der Fall, dass n eine echte Potenz irgendeiner Zahl ist, ist aber ganz leicht zu behandeln. 4 Der Algorithmus Input: ungerade Zahl n > 2 1. if ( n hat die Form ab fuer b > 1 ) then output ZUSAMMENGESETZT; 2. r ← 2; 3. while ( r < n ) { 4. if ( ggT(n, r) 6= 1 ) then output ZUSAMMENGESETZT; 5. if ( r prim ) then q ← groesster Primfaktor von r − 1; √ if ( q ≥ 4 r log n ) and ( n(r−1)/q 6≡ 1 (mod r) ) then 6. 7. 8. 9. break; r←r+1 ; 10. 11. } √ 12. for a = 1 to b2 r log nc do 13. 14. if (X + a)n 6≡ (X n + a) (mod X r − 1, n) then output ZUSAMMENGESETZT; 15. output PRIM; 5 Die Laufzeitanalyse Die Laufzeitanalyse hat zwei Teile. In Abschnitt 5.1 wird der Zeitaufwand für die einzelnen Operationen des Algorithmus analysiert. Der zweite, schwierigere Teil besteht darin zu zeigen, dass die while-Schleife spätestens nach O((log n)6 ) Durchläufen abbricht. Dies wird in Abschnitt 5.2 durchgeführt. 6 5.1 Kosten der Einzeloperationen An manchen Stellen benutzt der Algorithmus etwas komplexere Operationen. Wir beginnen damit zu erklären, wie man sich die Durchführung vorstellen muss, und schätzen den Zeitaufwand ab. Zahldarstellung, Zeitaufwand für arithmetische Operationen. Wir stellen uns die Zahlen in binärer Notation vor. Es ist offensichtlich, dass bei der Durchführung des Algorithmus keine Zahl vorkommt, die größer als n2 ist, also die Bitlänge 2 log n nie überschritten wird. Von der Bitkomplexität her gesehen, benötigt die Ausführung der gewöhnlichen arithmetischen Operationen auf solchen Zahlen polynomielle Zeit, selbst wenn ganz naive Algorithmen benutzt werden: Addition und Subtraktion brauchen Zeit O(log n), Multiplikation und Division Zeit O((log n)2 ). Vor diesem Hintergrund werden wir im folgenden nur die Anzahl der arithmetischen Operationen betrachten, also Laufzeiten in der Einheit arithmetische Operationen auf log n-Bit-Zahlen“ angeben. ” Schnelle Exponentiation. Eine zentrale Operation im Algorithmus ist die Exponentiation. Es sei (H, ·) eine beliebige Halbgruppe. Zu Input a ∈ H und m ≥ 1 sei am zu berechnen. Hierzu benutzt man das Verfahren der schnellen Exponen” tiation“, das durch die folgende Rekursionsformel angegeben wird: für m = 1, a, (as )2 , für m = 2s, s ≥ 1; am = s 2 (a ) · a, für m = 2s + 1, s ≥ 1. Man kann leicht sehen, dass die Anzahl der Halbgruppenmultiplikationen höchstens 2 log2 m ist, also die benötige Gesamtanzahl von Operationen O(log m) ist. Man wendet dieses Verfahren an, um etwa am mod n für Zahlen a, m, n in O(log m) Multiplikationen modulo n zu berechnen, oder auch, um (X+a)n mod (n, X r − 1) in O(log n) Multiplikationen von Polynomen vom Grad < r mit Koeffizienten in {0, 1, . . . , n − 1} zu berechnen. In Zeile 1 soll getestet werden, ob n als echte Potenz ab einer Zahl a geschrieben werden kann. Offenbar kommen hierfür nur Zahlen b mit 2 ≤ b ≤ log2 n in Frage. Für jedes solche b führt man folgende Berechnung durch: Wenn ein a < n gegeben ist, kann man durch schnelle Exponentiation in O(log b) Operationen feststellen, ob ab < n oder ab = n oder ab > n ist. Dieser Umstand macht es möglich, eine binäre Suche in {1, . . . , n} nach einem a durchzuführen, das ab = n erfüllt. Eine solche binäre Suche benötigt O(log n) Exponentiationen, also O((log n)2 ) arithmetische Operationen. Der gesamte Aufwand für Zeile 1 beträgt demnach O((log n)3 ). Wenn n gegeben ist, nennen wir eine Primzahl r < n n-gut“, wenn r 6 | n und ” der größte Primteiler q von r − 1 folgendes erfüllt: √ (i) q ≥ 4 r log n, und (ii) n(r−1)/q 6≡ 1 (mod r). 7 (Welche Bedeutung Bedingung (ii) hat, die in Zeile 8 getestet wird, wird durch Lemma 2.6(b) etwas klarer: n(r−1)/q 6≡ 1 (mod r) bedeutet, dass q ein Teiler von ordr (n) ist, und insbesondere, dass q ≤ ordr (n) ist. Zusammen mit (i) ergibt das eine untere Schranke für ordr (n).) Die Schleife in Zeilen 3–11 testet für r = 2, 3, 4, . . . nacheinander, ob ggT(n, r) 6= 1 (in diesem Fall ist n offensichtlich nicht prim) und dann, ob r eine n-gute Zahl ist. Wie oft diese Schleife durchlaufen wird, hängt von der folgenden Größe ab: ρ(n) := min{r | ggT(n, r) 6= 1 oder r ist n-gut oder r = n}. Im Abschnitt 5.2 werden wir sehen, dass ρ(n) = O((log n)6 ) gilt. Einstweilen können wir die Laufzeit des Algorithmus als Funktion von ρ(n) abschätzen. Die ggT-Berechnung in Zeile 4 wird mit dem Euklidischen Algorithmus durchgeführt. der Aufwand für ein r ist O(log n); der Gesamtaufwand beträgt also O(ρ(n) log n). Für die Entscheidung in Zeile 5, ob r eine Primzahl ist, führt man eine Primzahltabelle mit, z. B. eine Version des Siebs des Eratosthenes, die immer bis zur nächstgrößeren Zweierpotenz 2dlog2 re reicht. Hierfür genügt ein Gesamtaufwand von O(ρ(n) log log(ρ(n))).√Um in Zeile 6 zu ermitteln, ob der größte Primfaktor von r − 1 mindestens√4 r log n ist, kann man mit Hilfe derselben Tabelle alle Primfaktoren q 0 < r von r − 1 ermitteln und dividieren. Gesamtaufwand: O(ρ(n)3/2 ). Zur Berechnung von n(r−1)/q mod r in Zeile 8 benutzt man die schnelle Exponentiation, mit Gesamtaufwand O(ρ(n) log n). Der Gesamtaufwand für alle Schleifendurchläufe ist also O(ρ(n)3/2 + ρ(n) log(n)). √ In Zeilen 12–14 wird für das vorher ermittelte r für jedes a, 1 ≤ a ≤ 2 r log n, das Polynom (X + a)n mod (X r − 1, n) berechnet und mit X n + a ≡ X n mod r + a verglichen. Zur Berechnung der Potenz (X + a)n mod (X r − 1, n) benutzt man die schnelle Exponentiation, wobei nach jeder einzelnen Multiplikation die Reduktion modulo n einfach dadurch erfolgt, dass man einen Koeffizienten ai ≥ n durch ai mod n ersetzt; die Reduktion modulo X r − 1 bedeutet, dass man in jedem Zwischenergebnis X i mit i ≥ r durch X i mod r ersetzt. Als Zwischenergebnisse ergeben sich also immer Polynome vom Grad < r mit Koeffizienten in {0, 1, . . . , n − 1}. Da eine Multiplikation von Polynomen vom Grad < r Aufwand O(r2 ) hat (bei naiver Ausführung), ist der Aufwand zur Berechnung einer solchen Potenz O(ρ(n)2 log n); für alle a zusammen ergibt sich ein Aufwand von p O( ρ(n) log n · ρ(n)2 log n) = O(ρ(n)5/2 (log n)2 ). Mit schnelleren Polynom-Multiplikationsverfahren (basierend auf der schnellen diskreten Fourier-Transformation, siehe z. B. [14, Kap 3.11]) kann diese Zeitschranke auf O(ρ(n)3/2 (log n)3 ) verbessert werden. Wir sehen also, dass der Algorithmus Laufzeit O((log n)k ) für eine Konstante k hat, wenn wir gezeigt haben dass ρ(n) = O((log n)6 ) gilt. Letzteres geschieht im nächsten Abschnitt. 8 5.2 Schranke für gute“ r ” In diesem Abschnitt zeigen wir, dass die while-Schleife im Algorithmus nach spätestens O((log n)6 ) Iterationen abbricht. Als Basis benötigen wir einige Aussagen aus der Zahlentheorie. Den Hintergrund bildet der berühmte Primzahlsatz, der besagt, dass asymptotisch gesehen die Anzahl der Primzahlen, die kleiner als x sind, sich wie x/ln x verhält. Wir definieren, für x ∈ R+ : π(x) = |{p ≤ x | p ist eine Primzahl}|. Satz 5.1 (Primzahlsatz) π(x) = 1. x→∞ x/ln x lim Wir brauchen hier nur eine abgeschwächte Version des Primzahlsatzes (die auch einen deutlich einfacheren Beweis hat). Fakt 5.2 Für alle x ≥ 2 gilt: 3 x 8x ≤ π(x) ≤ . 6 log x log x Beweis. Siehe z. B. [4]. Unter allen Primzahlen r ≤ x interessieren uns die besonders, für die r − 1 einen sehr großen Primteiler hat. Für beliebiges a sei P (a) die größte Primzahl, die a teilt. Das folgende tiefliegende Resultat aus der analytischen Zahlentheorie ist der Dreh- und Angelpunkt der Zeitanalyse unseres Algorithmus. Fakt 5.3 Es gibt ein (kleines) c > 0 und ein (großes) x0 , so dass für alle x ≥ x0 gilt: x |{r | r Primzahl, r ≤ x, P (r − 1) > x2/3 }| ≥ c . log x Beweis. Siehe [7, 5]. In Kombination mit Fakt 5.2 besagt Fakt 5.3, dass asymptotisch gesehen für einen konstanten Bruchteil der Primzahlen r ≤ x gilt, dass P (r − 1) > x2/3 , dass also r − 1 einen Primfaktor q ≥ x2/3 hat. Fakt 5.2 und Fakt 5.3 bilden die Basis für den Beweis der folgenden entscheidenden Aussage, die unmittelbar impliziert, dass die while-Schleife im Algorithmus nach O((log n)6 ) Iterationen abbricht. 3 Hier und im Rest des Textes steht log“ für den Logarithmus zur Basis 2. ” 9 Lemma 5.4 Es gibt Konstante c1 , c2 > 0 und n0 mit folgender Eigenschaft: Für jedes n ≥ n0 gibt es eine Primzahl r mit c1 (log n)6 < r ≤ c2 (log n)6 , die entweder Teiler von n ist oder n-gut ist. Beweis. Es sei c wie in Fakt 5.3 gewählt. Wir rechnen zunächst mit beliebigen Konstanten c2 ≥ c1 ≥ 1 und legen nachher fest, wie groß diese sein müssen. Die Zahl n sei beliebig, aber (auch bezüglich c1 und c2 und x0 aus Fakt 5.3) genügend groß, damit die folgenden Abschätzungen gerechtfertigt sind. Wir nennen eine Zahl r < n n-speziell, wenn r Primzahl ist und P (r − 1) > (c2 (log n)6 )2/3 gilt. Wegen Fakt 5.2 und Fakt 5.3 gilt |{r | r ist n-speziell und c1 (log n)6 < r ≤ c2 (log n)6 }| ≥ |{r ≤ c2 (log n)6 | r ist n-speziell}| − |{r ≤ c1 (log n)6 | r ist Primzahl }| ≥ c· 8c1 (log n)6 c2 (log n)6 − log(c2 (log n)6 ) log(c1 (log n)6 ) c · c2 (log n)6 8c1 (log n)6 − 7 log log n 6 log log n (log n)6 cc2 8c1 = · − . log log n 7 6 ≥ Wenn wir also c1 = 46 wählen und dann c2 so, dass c3 = cc72 − 8c61 eine positive Konstante ist, dann ist die Anzahl der n-speziellen Zahlen r in ((4 log n)6 , c2 (log n)6 ] 6 3 (log n) mindestens clog . log n Setze nun y = c2 (log n)6 und betrachte das Produkt Y Π= (nj − 1). 1≤j≤y 1/3 1/3 1/3 Weil Π < (ny )y = ny gung von Π kleiner als log(n y 2/3 2/3 )=y , ist die Anzahl der Faktoren in der Primfaktorzerle- 2/3 6 2/3 log n = (c2 (log n) ) c3 (log n)6 log n < log log n (für n genügend groß). Daher gibt es in ((4 log n)6 , c2 (log n)6 ] eine n-spezielle Zahl r, die kein Teiler von Π ist. Diese Primzahl r hat die gewünschten Eigenschaften: Wenn r | n, sind wir fertig. Wenn r 6 | n, ist r n-gut, was man wie folgt einsieht: (i) Weil r n-speziell ist, hat r − 1 einen Primfaktor q mit q > (c2 (log n)6 )2/3 > r2/3 ; weil r ≥ (4 log n)6 ist, gilt weiter √ √ q > r2/3 = r · r1/6 ≥ 4 r log n. 10 (ii) Weil r das Produkt Π nicht teilt, gilt für jedes j, 1 ≤ j ≤ y 1/3 , dass r 6 | (nj − 1), d. h. nj 6≡ 1 mod r. Nach (i) ist aber (r − 1)/q < r/r2/3 = r1/3 ≤ y 1/3 ; daher gilt n(r−1)/q 6≡ 1 mod r, wie gewünscht. 6 Algebraische Grundlagen für den Korrektheitsbeweis In diesem Kapitel werden weitere algebraische Konzepte und Tatsachen bereitgestellt, die zum Beweis der Korrektheit des Algorithmus nötig sind. Man findet diese Dinge in allen Lehrbüchern zur Algebra, siehe z. B. [9], aber auch, in kompakter Form, in [12]. Für manche Aussagen, die nicht zu den engsten Grundlagen gehören, werden Beweise angegeben. 6.1 Endliche Körper Fakt 6.1 Es gibt einen endlichen Körper F mit q Elementen genau dann wenn q Potenz einer Primzahl ist. Die multiplikative Gruppe in einem endlichen Körper F wird mit F∗ bezeichnet. Sie hat |F| − 1 Elemente. Die folgende Aussage ist wohlbekannt und hat viele interessante Beweise, siehe z. B. [8, S. 34] oder [12] oder Anhang A. Fakt 6.2 Wenn F ein endlicher Körper ist, dann ist die multiplikative Gruppe F∗ zyklisch — das heißt, es gibt ein primitives Element“ z in F∗ mit F∗ = ” {1, z, z 2 , . . . , z |F|−2 }. 6.2 Polynomringe, Körperkonstruktionen Ausgehend vom Ring Zn betrachtet man den Polynomring Zn [X] = {f (X) | f (X) Polynom mit Koeffizienten in Zn }. Dabei ist ein Polynom ein Ausdruck ak X k + ak−1 X k−1 + · · · + a1 X + a0 11 mit k ≥ 0 und ak , . . . , a0 ∈ Zn . Jeder Koeffizientenfolge entspricht genau ein Polynom. Formal kann man dieses Polynom mit der unendlichen Koeffizientenfolge (a0 , a1 , . . . , ak , 0, 0, . . .) identifizieren. Ein wichtiges Konzept ist der Grad deg(f (X)) eines Polynoms, das folgendermaßen definiert ist. Definition 6.3 Wenn f (X) die Koeffizientenfolge (a0 , a1 , . . .) hat (nur endlich viele von 0 verschiedene Einträge), dann hat f (X) Grad deg(f (X)) = −∞, wenn alle Koeffizienten 0 sind, und Grad deg(f (X)) = max{i | ai 6= 0} sonst. Es ist klar, dass es genau nd Polynome in Zn [X] gibt, die Grad < d haben. Polynome kann man addieren und multiplizieren; die entstehende Struktur Zn [X] ist wieder ein Ring. Wenn p eine Primzahl ist, hat der Ring Zp [X] eine wichtige Eigenschaft: eindeutige Division mit Rest. Fakt 6.4 Sei p eine Primzahl. Wenn f (X), h(X) ∈ Zp [X] Polynome sind mit deg(h(X)) ≥ 0, dann existieren eindeutig bestimmte Polynome q(X) und r(X) in Zp [X] mit (i) f (X) = q(X)h(X) + r(X) und (ii) deg(r(X)) < deg(h(X)). (Man kann q(X) und r(X) auch leicht ausrechnen; diese Tatsache benötigen wir hier aber nicht.) Polynome liefern eine sehr einfache und direkte Möglichkeit, endliche Körper zu konstruieren. Man benötigt dazu irreduzible Polynome“. ” Definition 6.5 Ein Polynom h(X) 6≡ 0 heißt irreduzibel (über Zp [X]), wenn in Zp [X] folgendes gilt: Wenn h(X) = f (X)g(X) für Polynome f (X), g(X), dann ist deg(f (X)) = 0 oder deg(g(X)) = 0. (Man kann h(X) nicht in nichttriviale Faktoren zerlegen.) Man kann aus jedem Polynom f (X) = ak X k + ak−1 X k−1 + · · · + a1 X + a0 mit ak 6= 0 den Leitkoeffizienten“ ak ausklammern und erhält die Darstellung ak · ” fˆ(X), wobei fˆ(X) = X k + âk−1 X k−1 + · · · + â1 X + â0 Leitkoeffizienten 1 hat. Aus der eindeutigen Division mit Rest folgt ein sehr angenehmer Sachverhalt: Wie man Zahlen eindeutig in Primfaktoren zerlegen kann, kann man Polynome eindeutig in irreduzible Faktoren zerlegen. 12 Fakt 6.6 Wenn p Primzahl ist, dann gilt in Zp [X]: Jedes Polynom f (X) mit deg(f (X)) ≥ 0 besitzt eine (bis auf die Reihenfolge) eindeutig bestimmte Darstellung f (X) = a · g1 (X) · · · gr (X), wobei a der Leitkoeffizient von f (X) ist und die gi (X) über Zp [X] irreduzible Polynome mit Leitkoeffizient 1 sind. Eine weitere Konsequenz aus der eindeutigen Division mit Rest ist, dass man mit Hilfe eines irreduziblen Polynoms vom Grad d einen Körper der Kardinalität pd konstruieren kann. Definition 6.7 Sei p prim, also Zp ein Körper, und h(X) = X d + ad−1 X d−1 + · · · + a1 X + a0 ein Polynom über Zp mit Grad d ≥ 2. Die Struktur Zp [X]/(h(X)) (gelesen Zp [X] modulo h(X)“) entsteht aus Zp [X], indem man Polynome f (X) ” und g(X) identifiziert, wenn ihre Differenz f (X)−g(X) über Zp [X] ein Vielfaches von h(X) ist. Die entstehende Struktur besteht im wesentlichen aus den Polynomen in Zp [X] vom Grad < d. (Jedes Polynom mit Grad ≥ d ist äquivalent zu einem mit Grad < d; die Polynome mit Grad < d sind paarweise nicht äquivalent.) Addition erfolgt komponentenweise. Das Produkt f (X)g(X) mod h(X) wird folgendermaßen gebildet: Nach Fakt 6.4 gibt es eindeutig bestimmte Polynome r(X) und q(X) so dass f (X)g(X) = q(X)h(X) + r(X), mit deg(r(X)) < d. Dann ist r(X) das Produkt von g(X)h(X) modulo h(X). Fakt 6.8 Wenn p prim ist und h(X) über Zp [X] irreduzibel ist mit deg(h(X)) = d ≥ 2, dann ist Zp [X]/(h(X)) ein Körper mit Kardinalität pd . Entscheidend beim Beweis dieses Fakts ist natürlich, dass f (X)g(X) nicht ≡ 0, also nicht durch h(X) teilbar ist, wenn h(X) weder f (X) noch g(X) teilt. Das ist eine relativ leichte Konsequenz aus Fakt 6.6 (eindeutige Zerlegbarkeit) und der Voraussetzung, dass h(X) irreduzibel ist. Die folgende Eigenschaft von Polynomen über Primzahlkörpern wird später benötigt. Lemma 6.9 Sei p eine Primzahl. Dann gilt für jedes Polynom f (X) ∈ Zp [X]: (a) f (X)p ≡ f (X p ) (mod p); 13 j j (b) f (X)p ≡ f (X p ) (mod p), für j ≥ 0 beliebig. Beweis. (a) Sei f (X) = ak X k + · · · + a1 X + a0 . Setze X f (X)p mod p = bi X i 0≤i≤pk (Koeffizienten in {0, 1, . . . , p − 1}). Dann gilt nach den bekannten Regeln für die Exponentiation von Summen (Multinomialformel): bi = X ai00 · · · aikk · i0 +···+ik =p i1 +2i2 +···+kik =i p! mod p. i0 ! · · · ik ! Nun ist die Zahl p!/(i0 ! · · · ik !) durch p teilbar, also ≡ 0 (mod p), wenn nicht (genau) eines der is gleich p ist und die anderen alle 0. In diesem Fall ist s = i/p und p!/(i0 ! · · · ik !) = 1. Für i = sp ist also bi = aps mod p = as (wegen Fakt 2.4(b)); wenn p 6 | i, ist bi = 0. Das heißt aber nichts anderes als f (X)p mod p = f (X p ), wie gewünscht. (b) folgt aus (a) durch eine simple Induktion. Ein Polynom, das im folgenden eine große Rolle spielen wird, ist X r −1, für r ≥ 2. Man erinnert sich, dass X r − 1 = (X − 1)(X r−1 + X r−2 + · · · + X + 1). Für spätere Verwendung notieren wir gleich noch die Folgerung X sr − 1 = (X s − 1)(X s(r−1) + X s(r−2) + · · · + X s + 1), (3) d. h. X s − 1 teilt X sr − 1. Dies gilt für Polynome mit Koeffizienten aus Z, also automatisch in Zp [X] für eine beliebige Primzahl p. Ob und wie der zweite Fakr −1 tor XX−1 weiter in Faktoren zerfällt, hängt von r ab und davon, in welchem Zp r −1 man rechnet. Wenn r eine Primzahl ist, kennt man die Zerlegung von XX−1 in irreduzible Faktoren genau: Lemma 6.10 Seien p und r Primzahlen mit p 6= r. Dann gilt Xr − 1 = X r−1 + X r−2 + · · · + X + 1 = h1 (X) · · · hs (X), X −1 wobei h1 (X), . . . , hs (X) in Zp [X] irreduzible Polynome vom Grad ordr (p) sind (also s = (r − 1)/ordr (p)). Beweis. Wegen der eindeutigen Zerlegbarkeit in irreduzible Polynome (Fakt 6.6) genügt es, folgendes zeigen: 14 (∗) Wenn ein irreduzibles Polynom h(X) in Zp [X] ein Teiler von ist deg(h(X)) = ordr (p). X r −1 X−1 ist, dann Sei d = ordr (p) und q(X) = X r−1 + X r−2 + · · · + X + 1. Sei h(X) in Zp [X] ein irreduzibler Faktor von q(X), mit Grad k ≥ 1. Wir zeigen, dass k = d ist. ≤“: Nach Fakt 6.8 ist F = Zp [X]/(h(X)) ein Körper mit Kardinalität pk . Nach ” Fakt 6.2 besitzt F ein erzeugendes Element g(X). Wegen Lemma 6.9 gilt in Zp [X] (und damit erst recht in F): d d g(X)p = g(X p ). (4) Nun ist X r − 1 ein Vielfaches von h(X), also ist in F = Zp [X]/(h(X)) X r = 1. Weil d = ordr (p), gilt pd ≡ 1 (mod r), also pd = mr + 1 für eine Zahl m. Damit d ist X p = X mr+1 = X in F, und (4) liefert d d d −1 g(X)p = g(X p ) = g(X) , also g(X)p = 1 in F. (5) Nach Fakt 2.2(b) heißt dies, dass pd − 1 ein Vielfaches der Ordnung pk − 1 von g(X) in F sein muss, also ist k ≤ d. ≥“: Im Körper F gilt X r = 1. Weil r eine Primzahl ist, hat X Ordnung r in F∗ ; ” Nach Fakt 2.2(a)(i) ist r Teiler von |F∗ | = pk −1. Das heißt aber pk ≡ 1 (mod r), woraus wieder mit Fakt 2.2(b) folgt, dass k ein Vielfaches von d = ordr (p) ist. 7 Der Hauptsatz und der Korrektheitsbeweis Der Kern des Korrektheitsbeweises des Agrawal/Kayal/Saxena-Tests ist im folgenden Satz zusammengefasst, dessen Formulierung und Beweis von D. G. Bernstein [6] gegeben wurde, auf der Basis von [3] natürlich. Wir beweisen zunächst diesen Satz, um schließlich die Korrektheit des Algorithmus zu folgern. Hauptsatz 7.1 Es sei (α) n ≥ 2 eine natürliche Zahl; (β) r < n eine Primzahl mit r 6 | n; √ (γ) q eine Primzahl mit q | (r − 1), und q ≥ 4 r log n, und (δ) n(r−1)/q 6≡ 1 (mod n). √ Weiter gelte für L = b2 r log nc: (ε) ∀a, 1 ≤ a ≤ L : a ⊥ n; 15 (ζ) ∀a, 1 ≤ a ≤ L : (X + a)n ≡ (X n + a) (mod n, X r − 1). Dann ist n = pi für eine Primzahl p und ein i ≥ 1. Beweis. Lemma 7.2 n besitzt einen Primfaktor p mit q | ordr (p). Beweis. Nach (δ) gilt n(r−1)/q 6≡ 1 (mod r). Daraus folgt, dass n einen Primfaktor p haben muss, der p(r−1)/q 6≡ 1 (mod r) erfüllt. (Würden alle Primfaktoren p von n die Kongruenz p(r−1)/q ≡ 1 (mod r) erfüllen, dann würde durch Multiplikation n(r−1)/q ≡ 1 (mod r) folgen.) Wegen (β) haben wir r 6 | n, und aus (γ) folgt q 2 > r − 1, also q 6 | (r − 1)/q. Daher können wir Fakt 2.6(b) anwenden, was q | ordr (p) ergibt. Wir werden viel mit diesem Primteiler p von n und den zugehörigen Strukturen Zp und Zp [X] arbeiten. Wenn p = n ist, ist nichts weiter zu zeigen. Wir können also für das folgende p ≤ 12 n annehmen. Wegen (ε) gilt: ∀a, a0 , 1 ≤ a 6= a0 ≤ L : p 6 | a − a0 . Daraus folgt, dass 1, 2, . . . , L in Zp verschieden sind und dass die linearen Polynome X + a, 1 ≤ a ≤ L, in Zp [X] alle verschieden sind. Wir betrachten Potenzen dieser Terme (und später Produkte dieser Potenzen). Aus Bedingung (ζ) im Hauptsatz erhält man leicht (weil p Teiler von n ist): Lemma 7.3 ∀a, 1 ≤ a ≤ L : (X + a)n ≡ (X n + a) (mod p, X r − 1). Beweis. Wegen (ζ) wissen wir ∀a, 1 ≤ a ≤ L : (X + a)n ≡ (X n + a) (mod n, X r − 1). Das heißt, dass es Polynome f (X) und g(X) mit ganzzahligen Koeffizienten gibt, derart dass über Z[X] (X + a)n − (X n + a) = (X r − 1) · f (X) + ng(X) gilt. Weil p | n, folgt (X + a)n − (X n + a) = (X r − 1) · f (X) + p(n/p)g(X), also (X + a)n ≡ (X n + a) (mod p, X r − 1). Wir können dieses Lemma auf Exponenten der Form ni verallgemeinern: 16 Lemma 7.4 Für 1 ≤ a ≤ L und i ≥ 0 gilt: i i (X + a)n ≡ (X n + a) (mod p, X r − 1). Beweis. Sei ≤ a ≤ L fest. Wir benutzen vollständige Induktion. Für i = 0 ist die Aussage trivial. Sei nun also i ≥ 0 beliebig und gelte die Aussage des Lemmas für i. Nach Lemma 7.3 gilt (X + a)n ≡ (X n + a) (mod p, X r − 1), d. h. es gibt f (X), g(X) ∈ Z[X] mit (X + a)n − (X n + a) = (X r − 1)f (X) + pg(X). i Für X setzen wir X n ein und erhalten i i i i i (X n + a)n − ((X n )n + a) = ((X rn ) − 1)f (X n ) + pg(X n ). i Weil X r − 1 ein Teiler von X rn − 1 ist (vgl. (3)), erhalten wir i i+1 (X n + a)n ≡ (X n (mod p, X r − 1). + a) Andererseits folgt aus der Induktionsvoraussetzung, dass i+1 (X + a)n i i = ((X + a)n )n ≡ (X n + a)n (mod p, X r − 1). Mit der Transitivität von ≡ folgt die Induktionsbehauptung i+1 (X + a)n i+1 ≡ (X n + a) (mod p, X r − 1). Lemma 7.5 Für 1 ≤ a ≤ L und i ≥ 0 gilt: i j i j (X + a)n p ≡ (X n p + a) (mod p, X r − 1). Beweis. Sei ≤ a ≤ L fest. Nach Lemma 7.4 gibt es ein Polynom f (X) ∈ Z[X] mit i i (X + a)n ≡ (X n + a) + (X r − 1)f (X) (mod p). Wir wenden Lemma 6.9(b) an und erhalten i j i j j ni (X+a)n p ≡ ((X n +a)+(X r −1)f (X))p ≡ (X p j j +a)+(X p r −1)f (X p ) (mod p). j Weil X r − 1 ein Teiler von X p r − 1 ist (vgl. (3)), folgt die Behauptung. Wegen Fakt 6.10 gibt es ein über Zp [X] irreduzibles Polynom h(X) vom Grad d = ordr (p), das X r−1 + · · · + X + 1 und damit X r − 1 teilt. Folgendes ist also eine Abschwächung von Lemma 7.5: i j i j Für 1 ≤ a ≤ L und i, j ≥ 0 gilt: (X + a)n p ≡ (X n p + a) 17 (mod p, h(X)). (6) Im folgenden betrachten wir die Struktur F = Zp [X]/(h(X)), die nach Fakt 6.8 ein Körper ist. Gleichung (6) bedeutet dann einfach: i j i j Für 1 ≤ a ≤ L und i, j ≥ 0 gilt in F: (X + a)n p = X n p + a. (7) √ Wir betrachten nun alle Paare (i, j), 0 ≤ i, j ≤ b rc. Das sind > r viele Paare, also muss es nach dem Schubfachprinzip zwei verschiedene Paare (i, j) und (k, l) in diesem Bereich geben, die ni pj ≡ nk pl (mod r) erfüllen. Wir halten diese Paare fest und definieren t = ni pj ; u = nk pl . Nach (7) gilt also in F für 1 ≤ a ≤ L: (X + a)t = X t + a und (X + a)u = X u + a, (8) und nach der Definition von t und u gilt √ 1 ≤ t, u ≤ n r p √ r √ ≤ (n2 /2) r 1 √ < n2 r . 2 (9) Nun betrachten wir die Untergruppe G von F∗ , die von den L verschiedenen Elementen X + a, 1 ≤ a ≤ L, erzeugt wird (Rechnung in F): n Y o G= (X + a)βa βa ≥ 0 für 1 ≤ a ≤ L . 1≤a≤L Unser erstes Ziel ist es, eine untere Schranke für die Kardinalität von G zu beweisen. Lemma 7.6 1 √ |G| > (d/L)L > n2 r . 2 Beweis. (αa )1≤a≤L und (αa0 )1≤a≤L verschieden sind und P Wenn 0 und 1≤a≤L αa < d, dann sind die Polynome Y Y 0 (X + a)αa und (X + a)αa 1≤a≤L P 1≤a≤L αa < d 1≤a≤L über Zp [X] verschieden (verschiedene Nullstellenmengen, wenn man die Vielfachheiten einbezieht), aber auch über Zp [X]/(h(X)) (die Reduktion modulo h(X) bleibt ohne Effekt, da der Grad der Polynome < d = deg(h(X)) ist). Das heißt, dass die Elemente Y X (X + a)αa , αa < d, 1≤a≤L 1≤a≤L 18 in G verschieden sind. Daher ist n X o d − 1 + L d L |G| ≥ (αa )1≤a≤L αa < d = > . L L 1≤a≤L √ Nun ist d = ordr (p) ≥ q (nach Lemma 7.2) und q ≥ 4 r log n (nach (γ)); wegen der Definition von L gilt also d/L ≥ 2 und (d/L)L ≥ 2L = 2b2 √ r log nc 1 √ > n2 r , 2 wie behauptet. Nach Fakt 6.2 ist F∗ eine zyklische Gruppe; nach Fakt 2.2(c) ist dann auch G zyklisch. Es sei Y g(X) = (X + a)γa mod (p, h(X)) 1≤a≤L (gerechnet in F, also modulo (p, h(X))) ein erzeugendes Element von G. (Man beachte, dass die Exponenten γa hierbei keiner Einschränkung unterliegen.) Nun gilt nach (8) für jedes a, 1 ≤ a ≤ L: Y t Y Y t γa (X + a)tγa = (X t + a)γa = g(X t ) (10) g(X) = (X + a) = 1≤a≤L 1≤a≤L 1≤a≤L und analog g(X)u = g(X u ) (11) (jeweils gerechnet in F). Nach Wahl von t und u ist t ≡ u (mod r), also ist X u ≡ X t (mod X r − 1). Weil h(X) über Zp ein Teiler von X r − 1 ist, folgt Xt ≡ Xu (mod p, h(X)). Das heißt gerade, dass in F X u = X t gilt. Wenn wir dies in (10) und (11) einsetzen und beide kombinieren, ergibt sich g(X)t = g(X)u (gerechnet in F, also in der Untergruppe G von F∗ ). Nach (9) und Lemma 7.6 haben wir 1 √ 1 ≤ t, u < n2 r < |G|. 2 Weil g(X) die zyklische Gruppe G erzeugt, gilt nach Fakt 2.2(b), dass t = u ist, also ni pj = nk pl . (12) Annahme: n hat einen Primfaktor p̂, p̂ 6= p. Dann schreiben wir n = p̂λ n̂, mit λ ≥ 1, wobei p̂ 6 | n̂. Dann folgt wegen der eindeutigen Primfaktorzerlegung aus (12) iλ = kλ, also i = k, und durch nochmalige Anwendung von (12) schließlich j = l. Dies widerspricht der Wahl von (i, j), (k, l) als verschiedene Paare. 19 Also ist die Annahme falsch, und p ist der einzige Primteiler von n, d. h. n ist Potenz von p. Dies beendet den Beweis des Hauptssatzes 7.1. Mit Hilfe des Hauptsatzes können wir nun beweisen, dass die Ausgabe des Algorithmus aus Abschnitt 4 korrekt ist. Satz 7.7 Der Algorithmus gibt PRIM“ aus ⇔ n ist eine Primzahl. ” Beweis. ⇐“: Wenn n eine Primzahl ist, dann ist n nicht von der Form ab , ” b > 1, also tritt die Bedingung in Zeile 1 nie ein. Die Tests in Zeile 3 ergeben immer ggT(n, r) = 1. Ganz gleichgültig, ob die Schleife in Zeilen 3–11 endet, weil r eine Primzahl enthält, die die Tests in Zeilen 7 und 8 besteht oder weil r = n wird: wegen Lemma 3.1 kann für kein a mit n 6 | a der Test in Zeile 13 erfüllt sein; für n | a gilt dies auch, weil dann a ≡ 0 (mod n) ist. Also wird Zeile 15 erreicht und PRIM“ ausgegeben. ” ⇒“: Wir zeigen, dass n eine Primzahl ist, wenn der Algorithmus (in Zeile 15) ” PRIM“ ausgibt. ” Fall 1: Die Schleife in Zeilen 3–11 wird bis zum Ende durchlaufen, d. h. nach Verlassen der Schleife steht in der Variablen r die Zahl n. Nun gilt wegen des Tests in Zeile 3 für jedes r < n, dass r ⊥ n, insbesondere r 6 | n, also ist n eine Primzahl. Fall 2: Die Schleife in Zeilen 3–11 wird über das break“-Kommando in Zeile 9 ” verlassen. Der Inhalt von r in diesem Moment sei r. Nun sieht man folgendes: (β) r < n und r ist eine Primzahl (getestet in Zeile 5); √ (γ) der größte Primfaktor q von r erfüllt q ≥ 4 r log n (getestet in Zeile 7); (δ) n(r−1)/q 6≡ 1 (mod r) (getestet in Zeile 8); √ Für alle a, 1 ≤ a ≤ L = b2 r log nc gilt: √ (ε) a ⊥ n (wegen Zeile 7 ist L < 4 r log n ≤ q < r, also wurde für alle diese a in den vorherigen Schleifendurchläufen in Zeile 4 getestet, ob ggT(n, a) 6= 1 ist) und (ζ) (X + a)n − (X n + a) ≡ 0 (mod X r − 1, n) (getestet in der Schleife in Zeilen 12–14). Damit erfüllen n, r und q alle Voraussetzungen des Hauptsatzes 7.1. Nach diesem Satz ist also n = pi für eine Primzahl p. Wegen des Tests in Zeile 1 kann aber n nicht echte Potenz irgendeiner Zahl sein, also ist i = 1 und n ist selbst eine Primzahl. 20 Literatur [1] L. M. Adleman und M.-D. Huang, Primality Testing and Two-Dimensional Abelian Varieties over Finite Fields, Lecture Notes in Mathematics 1512, Springer-Verlag, Berlin, 1992. [2] L. M. Adleman, C. Pomerance und R. S. Rumley, On distinguishing prime numbers from composite numbers, Ann. Math. 117 (1983) 173–206. [3] Manindra Agrawal, Neeraj Kayal und Nitin Saxena, PRIMES is in P, Manuscript, 2002. http://www.cse.iitk.ac.in/users/manindra/primality.ps oder http://www.cse.iitk.ac.in/news/primality.pdf [4] T. M. Apostol, Introduction to Analytic Number Theory, Springer-Verlag, New York, 1997. [5] R. C. Baker und G. Harman, The Brun-Titchmarsh theorem on average, in: B. C. Berndt et al., Eds., Analytic Number Theory: Proceedings of a conference in Honor of Heini Halberstam, Volume 1, Birkhäuser, Boston, 1996, pp. 39–103. [6] Daniel J. Bernstein, An exposition of the Agrawal-Kayal-Saxena primalityproving theorem, Manuscript, 2002. http://cr.yp.to/papers/aks.ps [7] E. Fouvry, Theoreme de Brun-Titchmarsh; application au theoreme de Fermat. Invent. Math. 79 (1985) 383–407. [8] Neil Koblitz, A Course in Number Theory and Cryptography, Second Edition, Springer-Verlag, New York, 1994. [9] R. Lidl und H. Niederreiter, Introduction to finite fields and their applications, Cambridge University Press, 1986. [10] G. L. Miller, Riemann’s hypothesis and tests for primality, J. Comput. Syst. Sci. 13 (1976) 300–317. [11] Probabilistic algorithm for testing primality, J. Number Theory 12 (1980) 128–138. [12] A. Steger, Diskrete Strukturen, Band 1, Kombinatorik – Graphentheorie – Algebra, Springer-Verlag, Berlin, 2001. [13] R. Solovay und V. Strassen, A fast Monte-Carlo test for primality, J. Number Theory 12 (1980) 128–138. [14] I. Wegener, Effiziente Algorithmen für grundlegende Funktionen, B. G. Teubner, Stuttgart, 1996. [15] Websites: http://mathworld.wolfram.com/news/2002-08-07 primetest/ http://mathworld.wolfram.com/PrimalityTest.html 21 A Primitive Elemente In diesem Anhang geben wir einen direkten Beweis für die Aussage an, dass in jedem endlichen Körper die multiplikative Gruppe zyklisch ist (Fakt 6.2, der Satz vom primitiven Element). Folgendes ist wohlbekannt, und ist eine unmittelbare Konsequenz der Division mit Rest für Polynome über endlichen Körpern. Fakt A.1 Wenn F ein beliebiger Körper ist und f (X) ∈ F[X] ein Polynom vom Grad d ≥ 1 ist, dann hat f (X) in F höchstens d Nullstellen, d. h. |{a ∈ F | f (a) = 0}| ≤ d. Definition A.2 ϕ(n) = |{i | 1 ≤ i ≤ n, i ⊥ n}|, für n ≥ 1. ( Eulersche ϕ-Funktion). Fakt A.3 Für jedes n ∈ N gilt: n = P d|n ϕ(d). Erläuterung: Wir erklären diese Aussage mit einem konkreten Beispiel. Wir betrachten die 12 Brüche mit Nenner 12 und Zähler in {1, . . . , 12}: 1 2 3 4 5 6 7 8 9 10 11 12 , , , , , , , , , , , . 12 12 12 12 12 12 12 12 12 12 12 12 Nun kürzen wir diese Brüche, soweit möglich: 1 1 1 1 5 1 7 2 3 5 11 1 , , , , , , , , , , , . 12 6 4 3 12 2 12 3 4 6 12 1 und sortieren sie nach den Nennern: 1 ; 1 1 ; 2 1 2 , ; 3 3 1 3 , ; 4 4 1 5 , ; 6 6 1 5 7 11 , , , . 12 12 12 12 Man sieht sofort, dass als Nenner genau die Teiler 1, 2, 3, 4, 6, 12 von 12 auftreten, und dass es für den Teiler d von 12 genau ϕ(d) viele Brüche mit Nenner d gibt, nämlich genau die mit Zähler i, 1 ≤ i ≤ d, die zu d teilerfremd sind. Also gilt ϕ(1) + ϕ(2) + ϕ(3) + ϕ(4) + ϕ(6) + ϕ(12) = 12. Es ist offensichtlich, dass genau dieselbe Überlegung für jede Zahl n genauso durchgeführt werden kann, und dass man so einen Beweis für Fakt A.3 erhält. Nun wenden wir uns dem Beweis von Fakt 6.2 zu, der wie folgt lautet: Fakt A.4 Wenn F ein endlicher Körper ist, dann ist die multiplikative Gruppe F∗ zyklisch — das heißt, es gibt ein primitives Element“ z in F∗ mit F∗ = ” {1, z, z 2 , . . . , z |F|−2 }. 22 Beweis. Sei q die Kardinalität von F. Dann gilt |F∗ | = q − 1. Teil 1: Es sei d ein beliebiger Teiler von q − 1, und es sei a ∈ F∗ ein beliebiges Element mit ordF (a) = d. Betrachte nun hai = {a0 , a1 , . . . , ad−1 } und Bd = {b ∈ F | ordF (b) = d}. Nach Fakt 2.2(b) sind die d Elemente in hai verschieden, und für jedes i, 0 ≤ i < d, gilt (ai )d = (ad )i = 1. Also sind die d Elemente von hai Nullstellen des Polynoms X d − 1 in F. Nach Fakt A.1 folgt, dass hai genau die Nullstellen dieses Polynoms enthält. Also gilt Bd ⊆ hai. Welche Elemente ai haben aber nun genau Ordnung d (in Bd und in F), erfüllen also ai , (ai )2 , . . . , (ai )d−1 6= 1? Nach Fakt 2.2(b) gilt dies für diejenigen i, für die alle Zahlen i, 2i, 3i, . . . , (d − 1)i nicht durch d teilbar sind. Das gilt genau dann, wenn i und d teilerfremd sind. Also ist Bd = {ai | 1 ≤ i ≤ d, i ⊥ d}. Damit erhalten wir, dass |Bd | = ϕ(d) — gesetzt den Fall, dass Bd 6= ∅. Mit anderen Worten: Für jeden Teiler d von q − 1 ist |Bd | ∈ {0, ϕ(d)}. Teil 2: Nach Fakt 2.2(a)(i) bilden die Mengen Bd , d | q − 1, eine Partitionierung von F∗ . Also gilt: X q − 1 = |F∗ | = |Bd |. (13) d | q−1 Wenn wir Fakt A.3 für n = q − 1 anwenden, erhalten wir X q−1= ϕ(d). d | q−1 (14) Wenn man (13) und (14) mit der Eigenschaft |Bd | ∈ {0, ϕ(d)} (für alle Teiler d von q − 1) kombiniert, sieht man, dass in Wirklichkeit keines der Bd leer sein kann. Insbesondere ist Bq−1 6= ∅, und jedes der ϕ(q − 1) Elemente von Bq−1 ist ein primitives Element von F. 23