solche, die mit elliptischen Kurven verbunden sind. Bis vor Kurzem kannte man noch keinen sicheren Primzahltest mit garantiert polynomialem Laufzeitverhalten.
Anfang August 2002 verbreitete sich in der Primzahltest-Gemeinde die Nachricht wie ein Lauffeuer, dass einige bis dahin unbekannte Inder einen deterministischen Primzahltest mit polynomialer Laufzeit entdeckt h¨atten, siehe [1]. Die Anerkennung und Beweisgl¨attung durch f¨uhrende Experten folgte im Laufe einer Woche, so dass damit eines der großen Probleme der Komplexit¨atstheorie eine L¨osung gefunden hat. Der Beweis erschien, nach einem entspre-chenden ausf¨uhrlichen Gutachterprozess, zwei Jahre sp¨ater in den renommierten ”Annalen der Mathematik“, siehe [2].
Die Entdecker dieses Beweises sind ManindraAgrawal, Professor am Indian Institute of Tech-nology in Kanpur seit 1996 sowie Neeraj Kayal und Nitin Saxena, zwei Studenten und Mit-glieder der indischen Mannschaft bei der Internationalen Mathematik-Olympiade 1997.
Besonders erstaunlich ist die Tatsache, dass – etwa im Gegensatz zum Beweis des
”großen Fermat“ – der Beweis nur relativ einfache algebraische Argumente verwendet und gut auch von Mathematikern mit
”durchschnittlichen“ Kenntnissen der Zahlentheorie nachvollzogen werden kann. Meine Ausf¨uhrungen folgen dem Aufsatz [4] von Folkman Bornemann in den DMV-Mitteilungen.
Im Folgenden sei neine Zahl, deren Primzahleigenschaft zu untersuchen ist, undm= log2(n) deren Bitl¨ange.
Der AKS-Test nutzt Rechnungen in endlichen K¨orpern GF(pk) mit k > 1 und geht von folgender Charakterisierung von Primzahlen aus:
Satz 22 Sei n∈N, a∈Z∗n. Dann gilt die Gleichung
(x+a)n=xn+a (mod n) (AKS-1)
genau dann, wennn eine Primzahl ist.
Dieser Satz verallgemeinert den kleinen Satz von Fermat (x= 0).
Beweis: Es gilt nk
≡ 0 (modn), wenn n eine Primzahl und 0 < k < n ist. Beweis der Umkehrung in einer ¨Ubungsaufgabe.
Die linke Seite von (AKS-1) enth¨alt in expandierter Form etwan= 2m Terme, ist also bereits als Datenstruktur exponentiell. Wir f¨uhren deshalb eine weitere Reduktion (mod f(x)) mit einem (monischen) Polynom f(x) ∈ Zn[x] vom Grad deg(f(x)) = d aus, rechnen also in R=Zn[x]/(f(x)).
F¨ur primesnund irreduziblesf(x) ist das gerade der endliche K¨orperGF(nd).
Rechnen in endlichen K¨orpern
K =Zp[x]/(f(x)) ist ein endlicher K¨orper⇔ f(x) ist irreduzibel inZp[x].
Rechnen in solchen endlichen K¨orpern:f =xd−r(x), deg(r)< d,beschreibt eine algebraische Ersetzungsregel xd→r(x). Dann ist
K −→Zdp mit
d−1
X
i=0
aixi7→(ad−1, . . . , a0)
einZp-Vektorraumisomorphismus und jedes Element aus K kann als d-Vektor mit Eintr¨agen ausZp dargestellt werden. K enth¨alt also genau q = pd Elemente. Addition erfolgt kompo-nentenweise, Multiplikation wie bei klassischen Polynomen mit nachfolgender Anwendung der Ersetzungsregel f¨ur Potenzen xk, k≥d.
Beispiel: p = 2, f = x3 +x+ 1. Der K¨orper ist K = Z2(α), wobei α ein algebraisches Element mit dem charakteristischen Polynom α3+α+ 1 = 0 ist, welches der algebraischen Ersetzungsrelationα3 7→α+ 1 ¨uberZ2 entspricht.
Die q = 23 = 8 Elemente dieses K¨orpers lassen sich als a2α2 +a1α+a0 mit ai ∈Z2 oder aber als Bitvektoren (a2, a1, a0) darstellen. Außerdem ist K∗ zyklisch, denn α erzeugt diese Gruppe:
0 = (000) 1 = (001) =α0 α= (010) =α1 α+ 1 = (011) =α3 α2 = (100) =α2 α2+ 1 = (101) =α6 α2+α= (110) =α4 α2+α+ 1 = (111) =α5
Es gilt alsoαq−1 =α7 = 1 und damitxq =x f¨ur alle x∈K.
Satz 23 (Struktursatz ¨uber endliche K¨orper) SeiK ein endlicher K¨orper. Dann gilt
1. Die Charakteristik char(K) =p ist eine Primzahl und K damit eine endliche Erweite-rung des K¨orpers Zp.
2. Es existiert eine Zahl d >0, so dass K genau q =pd Elemente hat.
3. Die Gruppe K∗ ist zyklisch. Ein erzeugendes Element dieser Gruppe bezeichnet man auch als primitive Wurzel von K.
Ein Element a ∈ K∗ ist genau dann eine primitive Wurzel, wenn aq−d1 6= 1 f¨ur alle Primteiler d|(q−1) gilt.
4. Ausaq−1 = 1 folgt, dass die Elemente vonK genau die Nullstellen des Polynoms xq−x sind. Dieses Polynom kann ¨uberK also in Linearfaktoren xq−x=Q
a∈K(x−a)zerlegt werden.
F¨ur jedes Paar(p, d) gibt es damit bis auf Isomorphie genau einen K¨orper mitpd Elementen.
Diesen bezeichnet man als Galois-K¨orper GF(pd).
Besonders einfach wird die Rechnung f¨urf(x) =xr−1 . Es gilt
nist prim ⇒ (x+a)n≡xn+a(mod (xr−1, n)).
Gefragt sind Werte (r, a), f¨ur welche die Umkehrung dieser Aussage richtig ist.
Satz 24 (Der Satz von [AKS], 14.08.2002)
F¨ur n∈Nsei r und ein Teiler q|r−1 so gew¨ahlt, dass
gcd(n, r) = 1 und n(r−1)/q 6≡1 (modr) (AKS-2) gilt.
Sei weiter S eine gen¨ugend große Menge von Restklassen aus Zn mit gcd(n, a−a′) = 1 f¨ur allea, a′ ∈S. Gen¨ugend groß bedeutet dabei (s=|S|)
q+s−1 s
≥n2⌊√r⌋. Gilt dann
(x+a)n≡xn+a (mod (xr−1, n)) f¨ur alle a∈S, so istn eine Primzahlpotenz.
Der Beweis dieses Satzes erfolgt weiter unten. Wir diskutieren zun¨achst seine Konsequenzen.
Sei dazu wieder m= log2(n) die Bitl¨ange der zu untersuchenden Zahl und damit n= 2m. Nehmen wir an, wir finden
einr mit einem großen Teiler q|r−1, so dass
(AKS-2) undq ≥2smits= 2√r·m gilt. (AKS-3) Dann ist S={1, . . . , s}eine Menge wie im Satz von [AKS] gefordert, denn es gilt
q+s−1 s
≥q s
s
≥22√r·m=n2√r. Damit ergibt sich der folgende AKS-Primtest-Algorithmus
1. Wenn nechte Primzahlpotenz ⇒ return false 2. W¨ahle ein geeignetes r und setze s= 2√
r·m.
3. F¨ura∈ {1, . . . , s} pr¨ufe
(a) Ist gcd(a, n)>1 ? ⇒ return false
(b) Ist (x+a)n6≡xn+a (mod (xr−1, n)) ? ⇒ return false 4. return true
Kosten
Schritt 1 kann mit Newton-Iteration in polynomialer Laufzeit erledigt werden: n = ak be-deutet a = n1/k. F¨ur fixiertes k kann n1/k n¨aherungsweise ausgerechnet und f¨ur die beiden n¨achstgelegenen ganzen Zahlenadie Beziehungn=akgepr¨uft werden. Die Zahl der in Frage kommenden Exponenten ist durchk <log2(n) =m h¨ochstens linear in m.
Die gr¨oßten Kosten verursacht Schritt 3 b. Bin¨ares Potenzieren f¨uhrt die Berechnung der linken Seite aufO(m) Multiplikationen inR=Zn[x]/(xr−1) zur¨uck. Eine solche Multiplika-tion ist bei schneller FFT-Arithmetik f¨ur das Rechnen mit Polynomen bis auf logarithmische Faktoren vergleichbar dem Rechnen mit Zn-Vektoren der L¨ange r, alsoO(r s me 2).
Die Gesamtkosten des AKS-Primtest-Algorithmus f¨ur fixiertesr betragen bei obiger Wahl von s also geradeO(re 3/2m4).
Wir k¨onnen den AKS-Primtest-Algorithmus auch mit Zahlen r ausf¨uhren, f¨ur welche (AKS-2) nicht gesichert ist. Auch in diesem Fall ist beim Ausstieg nach (3a) und (3b) die Zahl n garantiert zusammengesetzt, denn sie verh¨alt sich nicht wie eine Primzahl. Eine solche Zahl r bezeichnen wir deshalb als AKS-Zeugen.
Allein wenn die Tests (3a) und (3b) passiert werden, kann – wie bei den anderen probabili-stischen Primtestverfahren – keine garantierte Antwort gegeben werden.
Probieren wir auf diese Weise k verschiedene Werte 1 ≤ r ≤ k durch, so betragen die Ge-samtkosten O(k re 3/2m4).
Satz 25 Unter den ersten k∼O(m6) Zahlen r findet sich eine, die (AKS-3) erf¨ullt.
Beweis: Dazu wird ein Ergebnis der analytischen Zahlentheorie1 ¨uber die Dichte von Prim-zahlen r mit großem Faktor von r−1 verwendet. Diese sind f¨ur große x genauso so h¨aufig wie Primzahlen. Genauer, f¨ur
P(x) =n
r≤x : ∃q (q, r prim)∧(q|r−1)∧(q > x2/3)o gilt
|P(x)|&π(x)∼ x log(x). Wegen
2s= 4√
r m∼x1/2 ≪x2/3 < q
1Dies ist die einzige wirklich nicht triviale Stelle im AKS-Beweis.
ist die Bedingungq >2s f¨ur gen¨ugend große x erf¨ullt. F¨ur (AKS-2) m¨ussen wir noch solche r ausschließen, f¨ur dienk−1 mitk= r−q1 durchr teilbar ist.
Wegen q > x2/3 ist r−q1 < x1/3. Wir fordern st¨arker, dass nk−1 f¨ur kein k < x1/3 durch r teilbar ist.
nk−1 hat bei festem k h¨ochstens O(k·m) Primteiler (k·m ist die Bitl¨ange von nk). Die Vereinigung der Mengen der Primteiler von nk−1 mitk= 1, . . . , x1/3 enth¨alt also h¨ochstens
O
x1/3
X
k=1
k m
=O
x2/3m
Elemente. Vermeiden wir diese Zahlen bei der Wahl vonr, so istnk−1 mitk= r−q1 garantiert nicht durchr teilbar (obwohl wir den Teilerq nicht explizit kennen).
Es reicht also, x so groß zu w¨ahlen, dass x2/3m . x
m, also x & m6 gilt, um ein r mit der geforderten zus¨atzlichen Teilbarkeitseigenschaft zu finden.
Diesesr m¨usste im Falle einer zusammengesetzten Zahlnein AKS-Zeuge sein. Wenn wir den AKS-Primtest-Algorithmus also f¨ur alle r ≤ k ausf¨uhren und bis k ∼ O(m6) keinen AKS-Zeugen gefunden haben, so ist n garantiert prim. Die Laufzeit dieses Algorithmus betr¨agt O(me 6 m63/2
m4) =O(me 19), ist also polynomial in der Bitl¨ange m= log2(n).
Kreisteilungspolynome und endliche K¨orper
Im Beweis des Satzes von [AKS] spielen endliche K¨orpererweiterungen K/Zp eine wichtige Rolle. Nach dem Struktursatz giltK =GF(q) f¨ur einq=pk und allea∈K sind Nullstellen des Polynomsxq−x.Kl¨asst sich also alsK=Zp[x]/(f(x)) darstellen, wobei das definierende Polynom f(x) ein irreduzibler Teiler von xq−1−1 ist.
Wir betrachten zun¨achst die Faktorzerlegung von xr−1 in Z[x]. Giltd|r, so gilt auch xd− 1|xr −1. Die Faktorzerlegung von xd−1 ist folglich in der Faktorzerlegung von xr −1 enthalten.
F¨urr = 15 etwa gilt
x15−1 = Φ1(x)Φ3(x)Φ5(x)Φ15(x) x5−1 = Φ1(x)Φ5(x)
x3−1 = Φ1(x)Φ3(x) x−1 = Φ1(x) mit
Φ1(x) =x−1 Φ3(x) =x2+x+ 1
Φ5(x) =x4+x3+x2+x+ 1 Φ15(x) = x15−1
Φ1(x)Φ3(x)Φ5(x) =x8−x7+x5−x4+x3−x+ 1
Analog l¨asst sich zu jedemr >0 ein Polynom Φr(x) ∈Z[x] vom Grad φ(r) konstruieren, so dass
(xr−1) =Y
c|r
Φc(x) (KTP-1)
gilt. Das Polynom Φr(x) bezeichnet man als r-tes Kreisteilungspolynom. Es ist irreduzibel uber¨ Z, womit (KTP-1) bereits die Faktorzerlegung von xr−1 in irreduzible Faktoren ¨uber
Zangibt. Istζ ∈Ceine primitiver-te Einheitswurzel, so ergibt sich dieses Polynom als Φr(x) = Y
c∈Z∗r
(x−ζc).
In MuPADk¨onnen diese Polynome mit polylib::cyclotomickonstruiert werden.
Alle Faktorzerlegungen in Z[x] induzieren Faktorzerlegungen inZp[x]. Allerdings bleiben Po-lynome, die irreduzibel ¨uber Zsind, dabei nicht unbedingt irreduzibel:
Φ15(x) =x8−x7+x5−x4+x3−x+ 1≡(x4+x+ 1)(x4+x3+ 1) (mod 2) Φ7(x) = (x6+. . .+ 1)≡(x3+x2+ 1)(x3+x+ 1) (mod 2).
Genauer gilt
Satz 26 Ist p eine zu r teilerfremde Primzahl, so l¨asst sichΦr(x) (mod p) zerlegen als Φr(x)≡h1(x)·. . .·hs(x) (modp)
mit irreduziblen Polynomen hi(x), die alle denselben Graddeg hi =d=ord(p∈Z∗r) haben.
Ist a ein erzeugendes Element des Zerf¨allungsk¨orpers K von Φr(x) uber¨ Zp, so ergeben sich diese Polynome als
hi(x) =
dY−1
k=0
(x−acipk) f¨ur geeignete ci ∈ Z∗r, so dass die Mengen
cipk, k = 0, . . . , d−1 f¨ur i = 1, . . . , s eine Partition der Menge der primen Restklassen Z∗r ergeben.
Beispiel: K = GF(26 = 64). Das charakteristische Polynom eines erzeugenden Elements α∈K ist ein ¨uberZ2 irreduzibler Faktor von
Φ63(x) = 1−x3+x9−x12+x18−x24+x27−x33+x36,
also eines der sechs Polynomef1, . . . , f6, die MuPADbeim Faktorisieren berechnet:
f:=poly(polylib::cyclotomic(63,x), Dom::IntegerMod(2));
expr(factor(f));
x+x6+ 1
x5+x6+ 1
x+x2+x5+x6+ 1 x+x3+x4+x6+ 1
x+x4+x5+x6+ 1
x2+x3+x5+x6+ 1
Die 36 primen Restklassen (mod 63) lassen sich mit ci ∈ {1,5,11,13,15,23} in die sechs
aufteilen. Nach obiger Formel ergibt sich dann etwa
h1 = (x−a) (x−a2) (x−a4) (x−a8) (x−a16) (x−a32)
Istadie Nullstelle des ersten Polynoms, so erf¨ullt es die Ersetzungsregela6→a+1. Expandiert man dieses Polynom und f¨uhrt die entsprechenden Ersetzungen (mod 2) aus, so ergibt sich h1 = x6 +x+ 1 und h5 = x6 +x5 +x4+x2 + 1. Beide Polynome haben also in der Tat Koeffizienten, die bereits in Z2 liegen.
Hier die Rechenvorschriften, um dies mit Mathematicanachzupr¨ufen. Mehrfaches Anwenden des Regelwerks (mit //., der Infixform vonReplaceRepeated) auf das expandierte Polynom und nachfolgender Reduktion (mod 2) f¨uhrt zur Normalform von h1. Die Koeffizienten des Ergebnispo-lynoms enthalten kein amehr.
u1 = {1,2,4,8,16,32}; Einfacher kann das inReduce
angeschrie-ben werden, da hier Regeln automatisch als algebraische angewendet und Polyno-me automatisch in ihre distributive Nor-malform ¨uberf¨uhrt werden.
setmod 2;
InMuPAD(und ¨ahnlich inAxiom) kann direkt im Ring der UPder univariaten Po-lynome inxuber der algebraischen Erwei-¨ terung Z = Z2[a]/(a6 +a+ 1) gerechnet werden.
Z:=Dom::AlgebraicExtension(
Dom::IntegerMod(2),a6+a+ 1);
UP:=Dom::UnivariatePolynomial(x,Z);
UP( mult(x−ai$i in u1));
x6+x+ 1
Beweis: Der Beweis des Satzes verwendet die Frobeniusabbildung F :K → K, welche durch F(a) = ap definiert ist. Es handelt sich dabei um einen Ringhomomorphismus, denn es gilt nicht nur (trivialerweise)F(a1·a2) =F(a1)·F(a2), sondern auchF(a1+a2) =F(a1)+F(a2).
In der Tat ist f¨ura1, a2 ∈kstets (a1+a2)p=ap1+ap2, weil pk
≡0 (mod p) f¨ur 1≤k≤p−1 gilt.
Die Elemente a ∈ K, f¨ur welche F(a) = a, also ap = a gilt, sind genau die Nullstellen des Polynoms xp−x, also die Elemente des Teilk¨orpers Zp ⊂K. Ein Polynom h(x) ∈K[x] hat also Koeffizienten in Zp genau dann, wenn die Koeffizenten unter F invariant sind. Das gilt aber offensichtlich f¨ur diehi.
Andererseits gilt: Hatf(x)∈Zp[x] eine Nullstelle b∈K, so ist auchF(b) =bp eine Nullstelle von f. Damit muss ein Faktorh∈Zp[x] mit der Nullstelleac auch alleac pk als Nullstelle und damit eines der hi als Faktor enthalten.
Der Beweis des Satzes von [AKS]
Sei p ein Primfaktor von n mit p(r−1)/q 6≡ 1 (modr). Wegen p(r−1) ≡ 1 (modr) ist d = ord(p ∈Z∗r) ein Vielfaches von q, denn anderenfalls w¨aren dund q teilerfremd und somit d auch ein Teiler von (r−1)/q.
Nach Voraussetzung gilt (x+a)n=xn+ainR=Zp[x]/(xr−1) f¨ur alle a∈S.
Die Substitution x7→xt zeigt, dass dann auch
(xt+a)n=xn t+a inZp[x]/(xr t−1)
und wegen (xr−1)|(xr t−1) auch in R gilt. Mit Induktion nach iergibt sich (x+a)t=xt+a inR f¨ur alle t∈ {ni, i≥0}.
In Zp[x] gilt generellf(xp) =f(x)p: F¨urf(x) =P
aixi folgt Xaixip
=X
apixi p=X aixi p wegen ap=ainZp. Damit gilt analog
(x+a)t=xt+a inR f¨ur alle t∈ {nipj, i, j ≥0}. Betrachten wir nun die nipj mit 0 ≤ i, j ≤ ⌊√
r⌋ und nehmen an, dass verschiedene Paare (i, j) aus diesem Bereich auch verschiedene Zahlen liefern. Es gibt wenigstens r+ 1 solche Paare und f¨ur jedes von ihnen gilt nipj < ni+j ≤n2⌊√r⌋.
Nach dem Schubfachprinzip gibt es also t=ni1pj1 6=u =ni2pj2 mit|t−u|< n2⌊√r⌋,t≡ u (mod r) und folglichxt=xu inR. Damit gilt auch (x+a)t= (x+a)u inR f¨ur alle a∈S.
R ist kein K¨orper, daxr−1∈Zp[x] nicht irreduzibel ist. Aus dem Satz ¨uber die Faktorzer-legung der Kreisteilungspolynome ¨uberZp wissen wir
xr−1 = (x−1)·h1(x)·. . .·hs(x) (modp),
wobei hi(x) ∈ Zp[x] irreduzible Faktoren sind, die alle denselben Grad d = ord(p ∈ Z∗r) haben, unds= r−d1 gilt. dist dasselbe wie oben, so dassd≥q ≥2 gilt.
Ist h(x) einer dieser irreduziblen Faktoren, so k¨onnen wir den Ring R durch den K¨orper K =R/(h(x)) = Zp[x]/(h(x)) ersetzen. Auch in K gilt (x+a)t = (x+a)u f¨ur alle a ∈ S.
Schließlich gilt aus Gradgr¨unden (x+a)6= 0 inK f¨ur jedesa.
Betrachten wir nun die GruppeG ⊂ K∗, die von {x+a : a ∈ S} erzeugt wird. Dann gilt gt=gu f¨ur alle g∈G.
Ghat wenigstens q+ss−1
≥n2⌊√r⌋>|t−u|Elemente, denn die ProdukteQ
a∈S(x+a)ea mit P
a∈Sea < q sind paarweise verschieden – sie sind verschieden inZp[x] und haben alle einen Grad < q ≤d= deg(h(x)) und die Zahl der Terme in sVariablen vom Grad < q ist gerade gleich q+ss−1
.
Folglich hat das Polynom Y|t−u|−1∈K[Y] mehr als|t−u|Nullstellen in K. Dieser Wider-spruch zeigt: die Annahme, dass alle nipj mit 0 < i, j < ⌊√
r⌋ paarweise verschieden sind, war falsch.
Also gibt es Paare (i1, j1)6= (i2, j2) mit ni1pj1 =ni2pj2, womit auch n=pk mitk= j2−j1
i2−i1 gilt.
5 Faktorisierungs-Algorithmen
Faktorisierungsverfahren arbeiten meist so, dass sie zuerst einen Primtest anwenden, dann von einer als zusammengesetzt erkannten Zahlmeinen echten Faktornbestimmen und schließlich rekursivn undm/n faktorisieren.
FactorA:=proc(m:DOM_INT,splitFactorFunction) local n;
begin
if isprime(m) then return(m) end_if;
n:=splitFactorFunction(m);
FactorA(n,splitFactorFunction), FactorA(m/n,splitFactorFunction) end_proc;
5.1 Faktorisierung durch Probedivision
Unser erstes Primtestverfahren, primeTestByTrialDivision(m), fand zusammen mit der Erkenntnis, dassm zusammengesetzt ist, auch einen Faktor dieser Zahl. Eine entsprechende Faktorabspaltung, die f¨ur zusammengesetzte Zahlen einen echten Faktor und f¨ur Primzahlen die Zahl selbst zur¨uckgibt, h¨atte dann folgende Gestalt
splitTrialFactor:=proc(m:DOM_INT) local z;
begin
if (m<3) then return(m) end_if;
z:=2;
while z*z<=m do
if m mod z = 0 then return(z) end_if;
z:=z+1;
end_while;
m;
end_proc;
Das Laufzeitverhalten h¨angt von der Gr¨oße des entdeckten Faktors ab, d. h. vom kleinsten Primfaktor r der Zahl m, und ist von der Gr¨oßenordnung O(r·l(m)2), also im Fall zweier etwa gleich großer Faktoren schlimmstenfalls O(√m·l(m)2).
Die zugeh¨orige Faktorisierungsfunktion ist dann
trialFactor:=proc(m:DOM_INT) begin [FactorA(m,splitTrialFactor)] end;
wobei es nat¨urlich g¨unstiger ist, die Suche nach weiteren Faktoren an der Stelle fortzusetzen, wo der letzte Faktor gefunden wurde und nicht die Faktorisierung mit den beiden Faktoren n undm/n neu zu starten. Schließlich istnnach Konstruktion sowieso prim undm/n durch keinen Primfaktor< n teilbar.
Dieses Verfahren ist jedoch nur f¨ur Zahlen geeignet, die aus kleinen und m¨oglicherweise einem einzelnen großen Primfaktor bestehen. Zahlen, deren Faktorzerlegung mehrere zehnstellige Primteiler enth¨alt, lassen sich selbst auf modernen Computern nicht auf diese Weise zerlegen.