• Keine Ergebnisse gefunden

Der AKS-Primzahltest – ein Primtestverfahren in Polynomialzeit

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∈Zn. 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

d1

X

i=0

aixi7→(ad1, . . . , 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 aiZ2 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αq17 = 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. Ausaq1 = 1 folgt, dass die Elemente vonK genau die Nullstellen des Polynoms xq−x sind. Dieses Polynom kann ¨uberK also in Linearfaktoren xq−x=Q

aK(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(r1)/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

≥n2r. 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

≥22r·m=n2r. 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= rq1 durchr teilbar ist.

Wegen q > x2/3 ist rq1 < 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= rq1 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 xq1−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

cZr

(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(pZr) haben.

Ist a ein erzeugendes Element des Zerf¨allungsk¨orpers K von Φr(x) uber¨ Zp, so ergeben sich diese Polynome als

hi(x) =

dY1

k=0

(x−acipk) f¨ur geeignete ciZr, so dass die Mengen

cipk, k = 0, . . . , d−1 f¨ur i = 1, . . . , s eine Partition der Menge der primen Restklassen Zr 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(r1)/q 6≡ 1 (modr). Wegen p(r1) ≡ 1 (modr) ist d = ord(p ∈Zr) 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 ≤n2r.

Nach dem Schubfachprinzip gibt es also t=ni1pj1 6=u =ni2pj2 mit|t−u|< n2r,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 ∈ Zr) haben, unds= rd1 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+ss1

≥n2r>|t−u|Elemente, denn die ProdukteQ

aS(x+a)ea mit P

aSea < 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+ss1

.

Folglich hat das Polynom Y|tu|−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.