Faktorisering af hele tal Lenstras algoritme.
Indledning.
Aritmetikkens fundamentalteorem fortæller os, at de hele tal har entydig faktorisering, men den siger ikke noget om, hvordan vi skal udføre denne faktorisering. Formålet med dette foredrag er at belyse Lenstras algoritme til faktorisering af hele tal, herunder specielt dens anvendelse af gruppestrukturen på en elliptisk kurve.
De naturlige spørgsmål for mig har været:
Fermats lille sætning.
Antag nu at n>1 et helt tal. Et naturligt spørgsmål, inden det store arbejde med at faktorisere, må være: Er n et primtal?
Fermat lille sætning: Hvis p et primtal og (x,p)=1, så er x(p-1)=1 mod p
Eksempel 1. n=246082373 => 2(n-1)=180137693 mod n => n ej et primtal.
Eksempel 2. n=2699900771 => 2(n-1)=1087755572 mod n => n ej et primtal.
Til de eksempler, som jeg vil komme med, er ovenstående metode tilstrækkelig.
Pollards algoritme.
Antag nu, at n ikke er et primtal. Jeg vil da skitsere en metode til at finde en faktor i n.
Pollards Ide:
Da n ej et primtal har n en primfaktor p.
Da er ak=1 mod p. Dette kan give os en faktor.
p|ak-1 => (ak -1,n)>=p. Hvis (ak-1,n)<n så har vi en faktor.
Pollards algoritme:
Bem:
Eksempel 3
n=246082373 (ej et primtal)
D=(2k-1,n)=(130940740,n)=2521. Dvs. 2521 er en faktor i n. færdig.
Afsluttende opsummering
Lenstras algoritme bygger på samme grundide som Pollards.
Lenstras algoritme
Lenstras ide
Da n ej et primtal har n en primfaktor p.
Da er k·Pp=0. Dette kan give os en faktor.
Det vi gør er at beregne k·P=(ak/dk2,bk/dk3) (Lemma 2)
Dvs k·P=(ak·dk,bk,dk3) kan p-reduceres til k·Pp=0 så må dk=0 mod p. Dvs (dk,n)>=p. Hvis (dk,n)<n så har vi en faktor.
Lenstras Algoritme
Antag n>2 ej et primtal. Vi ønsker at finde en faktor.
1) Beregn D=(6,n)
Vælg tal x, y, b mellem 1 og n.
Lad c=y2-x3-b*x
Bem: E: y2=x3+bx+c, P=(x,y) ligger på E(Q)
Bemærkninger
Eksempel 4
n=2699900771 ej et primtal
Vi udfører algoritmen
(n,6)=1
Vi vælger en elliptisk kurve og et punkt på den:
P = (2,1)
b = 1, c = 12 23 1·2 = -9
dvs. vores elliptiske kurve er E: y2 = x3 + x - 9
(4b3+27c2,n) = 1
Vælger K=15, k = LCM(1,2,..,15) = 360360
Vi skal nu beregne k·P. Dette gøres vha binær opskrivning af k (for at mindske antal beregninger)
k = 360360
= 23 + 25 + 27 + 28 + 29 + 210 + 211 + 212 +213 + 214 + 216 + 218
Ved hjælp af sædvanlige additionsformler har jeg beregnet 2i·P mod n for i mellem 1 og 18(se bilag) og derefter har jeg beregnet følgende punkter mod n vha. sædvanlige additionsformler: (23+25)·P, (23+25+27)·P, ,k·P.
K·P=(860532099,1417592321) mod n
Men hov dette har jo ikke givet nogen faktor. Nej det skyldes, at n ikke har en primdivisor p, sådan at #Ep(Z/pZ)|k for den valgte elliptiske kurve E og det valgte tal k. Hvad gør vi så nu? Der er to muligheder: enten kan vi vælge et større k, eller også kan vi vælge en anden elliptisk kurve.
Vi prøver at vælge en anden elliptisk kurve. Vi går til step 2) og vælger et nyt b. For b=2,3,..42 kan vi beregne k·P mod n. Så der får vi heller ingen faktor
Sæt nu b = 43.
Vi kan beregne 2i·P mod n for alle i mellem 1 og 18. Jeg kan regne frem til
(23 + 25 + .. + 216)·P = (2357880258,1300821445) mod n
Nu vil jeg forsøge at beregne k·P mod n
k·P = (23 + 25 + .. + 216)·P + 218·P
Additionsformlerne giver, at jeg skal finde en invers til 336343265-2357880258 i Z/nZ. Dette er ikke muligt, hvorfor ikke? Jo fordi (336343265-2357880258,n) = 26947. Dvs vi har fundet en faktor i n.
@
Vi bemærker at pointen i forhold til Pollards algoritme er, at Lenstras algoritme giver flere valgmuligheder: Hvis vi ikke får en faktor i første omgang behøver vi ikke øge k (hvilket ville betyde større forbrug af computerkraft). Derimod kan vi vælge en ny elliptisk kurve.
Opsummering af Lenstras algoritme.
Afsluttende diskussion
Hasses Sætning: Antag E en elliptisk kurve over Q og Ep elliptisk.
Da er |#Ep(Z/pZ) (p+1)|<2·SQRT(p)
Svar på disse spørgsmål kan evt. føre til at man kan vælge sine kurver intelligent i stedet for tilfældigt. Det vil give en optimering af Lenstras algoritme.
Litteraturliste
Den bog jeg hovedsageligt har brugt er
Joseph H. Silverman, John Tate: Rational points on elliptic curves,Springer, 1992.
Selvfølgelig har jeg også kigget i
Anthony W. Knapp, Elliptic curves, Princeton University Press, 1993
Lenstras originale artikel findes i
Annals of Mathematics, 1987, nr. 126, s.649-673
Derudover har jeg skimmet følgende to tekster
Math. Of Computation, 1993 nr. 61, s. 445ff (R. D. Silverman And S. S. Wagstaff, Jr.: A practical analysis of the elliptic curve factoring algorithm.)
A.O.L Atkin, F. Morain, Finding suitable curves for the elliptic curve method of factorization, 1992.
Appendix
Lemma 1: Antag a,b,n hele tal. Antag b=a mod n.
Da gælder (b,n)=(a,n)
Bevis: Jeg bruger def. 3.1.2 i Alg 1 bog. Lad c=(a,n) og d=(b,n)
d|n og da b=a mod n er a=b+q*n for et helt tal q. Så d|a. Dvs d|c. Tilsvarende c|d Da c,d>0 må c=d. qed.
Lemma 2: Antag E: y2=x3+bx+c en elliptisk kurve over Q. P ligger på E(Q)\{0}.
Da er P på formen P=(ak/dk2,bk/dk3) hvor (ak,dk)=1=(bk,dk)
Bevis: Antag P=(m/M,n/N) (uforkortelige brøker, M,N>0).
qed.
Lemma 3: Antag p et primtal så p|n
Lad S={s i Z| (s,n)=1}
Da gælder
1) S er multiplikativ. Dvs vi har lokalisering S-1Z en delring af Q.
2) Følgende diagram af ringhomomorfier kommuterer:
Bevis:
1) s,t i S => (s,n)=1=(t,n) => (s·t,n) = 1 => s·t i S
Endvidere er 1 i S.
2) Det indses at være nok at vise, at der er tale om veldefinerede afbildninger, og at de er ringhomomorfier.
Vi har de to projektioner
For s i S er (s,n)=1 dvs pp(s) og pn(s) er invertible i Z/pZ henholdsvis Z/nZ,
Ifølge prop 8.4(Alg II) findes ringhomomorfier S-1Z -> Z/pZ og S-1Z -> Z/nZ som ovenfor skitseret.
Vi har projektion pp : Z -> Z/pZ og da nZ ligger i kernen for denne afb så følger af den fundamentale ringhomomorfisætning at afb. Z/nZ -> Z/pZ som ovenfor er en veldefineret ringhomomorfi.
qed.
Addition modulo n
Setup: E: y2=x3+b·x+c en elliptisk kurve over Q.
Q1=(x1,y1) og Q2=(x2,y2) ligger på den elliptiske kurve.
Hvis x1=x2 mod n og y1=-y2 mod n er Q1=-Q2 mod n og Q1+Q2=0 mod n.
Ellers:
Hvis Q1=Q2 beregnes l=(3x12+2·b·x1+c)/2y1 mod n
Bem: Dette giver mening ó D:=(y1,n)=1
Hvis 1<D<n har vi en faktor.
Hvis D=n er vi uheldige og beregningen kan ikke lade sig gøre mod n.
Hvis Q1 og Q2 forskellige beregnes l=(y2-y1)/(x2-x1) mod n.
Bem: Dette giver mening ó D:=(x2-x1,n)=1
Hvis 1<D<n har vi en faktor.
Hvis D=n er vi uheldige og beregningen kan ikke lade sig gøre mod n.
Så er
x3=l2 - x1 x2 mod n
y3=-l·x3-(y1-lx1) mod n
Q3=(x3,y3) mod n , færdig.
Bilag til eksempel 4
n=2699900771
k = 360360
= 23 + 25 + 27 + 28 + 29 + 210 + 211 + 212 +213 + 214 + 216 + 218
P=(2,1)
b=1
E : y2 = x3 + x 9
Herefter følger punkterne mod n
21P 674975231 2362412938
22P 1829156875 756880883
23P 1405826909 752079457
24P 1623498895 1986788186
25P 1382333483 2211764966
26P 1726878857 1907246394
27P 1541203440 1149809620
28P 2069987796 1299697929
29P 740551282 1815456786
210P 165063480 1392593857
211P 25276715 129880250
212P 2049982611 1374446675
213P 882417997 2618721850
214P 885122155 400915515
215P 2334561671 2622265852
216P 1904471183 856043424
217P 2139640562 2042013567
218P 1411328980 2224186645
23P 1405826909 752079457
(23 + 25)P 1922782989 859541328
(.. + 27)P 2204849298 695329116
(.. + 28)P 1730116303 1462619697
(.. + 29)P 1149443832 885908106
(.. + 210)P 705410552 1148138018
(.. + 211)P 292592555 139248920
(.. + 212)P 1705603363 1219926924
(.. + 213)P 1570683207 1073552762
(.. + 214)P 1255139834 1391785173
(.. + 216)P 626026554 1529987586
(.. + 218)P 860532099 1417592321
b=43
E : y2 = x3 + 43·x 93
Herefter følger punkterne mod n
21P 674975945 1687417349
22P 1935568486 998190584
23P 1820219002 876621191
24P 1626068413 2264448679
25P 1021309937 1467280374
26P 2380080395 312022427
27P 2542557635 670914208
28P 860756604 1019978361
29P 655704292 1402722699
210P 2343241826 1661311876
211P 2138750499 1430859278
212P 26081599 499166945
213P 1804741417 1973953680
214P 2168969222 313575519
215P 2130707230 217043797
216P 904172551 1584759503
217P 1874326830 1800802643
218P 336343265 223462557
23 1820219002 876621191
(23+25)P 1241063773 21569020
(.. +27)P 2376668195 1670412598
(.. +28)P 914946137 582212382
(.. +29)P 797475569 1756571365
(.. +210)P 2208132890 2591113840
(.. +211)P 2364660358 2143324835
(.. +212)P 2192180482 1638041108
(.. +213)P 1065288789 1806230821
(.. +214)P 684801980 490190805
(.. +216)P 2357880258 1300821445
gcd(336343265-2357880258,n)=26947
Kildekode til min implementering af Lenstra i Maple
> # Lenstras algoritme;
> # n:=48112959837082048697*54673257461630679457;
> # n:=1715761513;
> n := 26947*100193;
>
>
> # Initialisering;
> slut:=false:faktor:=false:d:=0:uheldig:=false:primtal:=false:forfra:=false:
> ny_b:=false:ny_k:=false:ny_pkt:=false:
> #Slut på initialisering;
>
> # Vi tjekker at n er et primtal;
> temp:=2&^(n-1) mod n:
> if (temp<>1) then primtal:=true:
> else slut:=true;fejltype:=1;fi:
> # Slut på tjek
>
> # Her starter algoritmen;
> # Algoritmen indeholder visse valg, som kan indtastes her;
> K_min:=15;K_max:=1000; step:=10;
> b_min:=1;b_max:=1000;
> x:=2;
> y:=1;
> # Initialisering
> K:=K_min:b:=b_min:
> # Step 1a;
> temp:=gcd(6,n):
> if (temp>1 and temp <n) then faktor:=true:d:=temp:
> elif temp=n then slut:=true;fi:
> # Slut på step 1a;
> #Step 1b;
> #Skulle her tjekke at n ikke et perfekt tal;
> #Slut på step 1b;
> #Her starter den store løkke;
> while (slut=false and faktor=false and primtal=true) do
> slut:=false:forfra:=false:faktor:=false:d:=0:
> #Step 2+3;
> # Vi kører for b mellem b_min og b_max og øger derefter K indtil K>=K_max;
> if (slut=false and forfra=false) then
> if ny_b=true then b:=b+1;ny_b:=false:fi:
> if b=b_max then b:=b_min;K:=K+step;lprint(K);fi:
> if K>=K_max then slut:=true;fi:
> c:=y^2-x^3-b*x mod n;
> P:=(x,y);
> fi:
> #Slut på step 2+3;
>
> #Start på step 4;
> if (slut=false and forfra=false) then
> temp:=gcd(4*b^3+27*c^2 mod n,n);
> if temp=n then ny_b:=true;forfra:=true;
> elif temp>1 then faktor:=true;d:=temp;fi;
> fi;
> #Slut på step 4;
>
> #Step 5
> if (slut=false and forfra=false) then
> k:=1:
> for i from 2 to K do
> k:=lcm(i,k);
> od;
> fi:
> #Slut på step 5;
>
> #Step 6
> if (slut=false and forfra=false) then
>
> # vi finder binær opskrivning af k;
> temp:=k:i:=0:
> while (temp<>0) do
> t1:=temp mod 2^(i+1);
> if t1=0 then a[i]:=0;
> else a[i]:=1;
> # lprint(i);
> fi;
> temp:=temp - a[i]*2^i;
> i:=i+1;
> od:
> s:=i-1:
> #slut på binær opskrivning af k;
>
> # nu beregner vi 2^iP;
> Q:=P:a[0]:=P;
> for i from 1 to s while (slut=false and forfra=false and faktor=false) do
>
> # Start på additionsalgoritme mod n;
> # Man kan være uheldig, få en faktor eller få P+Q (=P_Q); # Bem. følgende variable skal være definer
> # et: n, b, c, P, Q; # Derudover benyttes følgende variable: uheldig, faktor, d, x1, y1, x2, y2, P_Q, x3, y3
> # , g, lambda;
>
> uheldig:= false:d:=0:
> if P=nul then
> if Q=nul then P_Q:=nul;
> else P_Q:=Q;fi;
> elif Q=nul then P_Q:=P;
>
> else
>
> x1:=P[1]:
> y1:=P[2]:
> x2:=Q[1]:
> y2:=Q[2]:
>
> # Vi beregner lambda i tilf. P=Q;
> if (P=Q) then
> g:=gcd(y1,n):
> if (g=n) then uheldig:=true;fi:
> if (g>1 and g<n) then d:=g;faktor:=true;fi:
> if g=1 then lambda:=(3*x1^2+b)/(2*y1) mod n:fi:
> fi:
> # Slut på beregning af lambda i tilf. P=Q;
>
> # Vi beregner lambda i talfælde P<>Q og P<>-Q;
> if (x1<>x2 ) then
> g := gcd(x2-x1,n):
> if (g=n) then uheldig:=true;fi;
> if (g>1 and g<n) then d:=g;faktor:=true;fi;
> if (g=1) then lambda:=(y2-y1)/(x2-x1) mod n;fi;
> fi:
> # Slut på beregning i tilf. P<>Q og P<>-Q;
>
>
> # Vi bruger add. formler;
> if (y1=-y2) then P_Q:=nul;
> elif (uheldig=false) then
> x3:=lambda^2-x1-x2 mod n:
> y3:=-lambda*x3-(y1-lambda*x1) mod n:
> P_Q:=(x3,y3):
> fi:
> # Slut på brug af add. formler;
>
> fi:
> # Slut på additionsalgoritme mod n;
>
> if uheldig=true then forfra=true;ny_b:=true;
> else
> pkt[i]:=P_Q;
> # lprint(i, pkt[i]);
> P:=P_Q;Q:=P;
> fi;
>
> od;
> #Slut på beregning af 2^iP;
>
> #start på beregning af kP;
>
> kP:=nul;
> for i from 0 to s while (slut=false and forfra=false and faktor=false) do
> if a[i]=1 then
> P:=kP:Q:=pkt[i]:
> # Så adderer vi kP og pkt[i];
>
> # Start på additionsalgoritme mod n;
> # Man kan være uheldig, få en faktor eller få P+Q (=P_Q); Bem. følgende variable skal være defineret
> # et: n, b, c, P, Q; # Derudover benyttes følgende variable: uheldig, faktor, d, x1, y1, x2, y2, P_Q, x3, y3
> # g, lambda;
>
> uheldig:= false:d:=0:
> if P=nul then
> if Q=nul then P_Q:=nul;
> else P_Q:=Q;fi;
> elif Q=nul then P_Q:=P;
>
> else
>
> x1:=P[1]:
> y1:=P[2]:
> x2:=Q[1]:
> y2:=Q[2]:
>
> # Vi beregner lambda i tilf. P=Q;
> if (P=Q) then
> g:=gcd(y1,n):
> if (g=n) then uheldig:=true;fi:
> if (g>1 and g<n) then d:=g;faktor:=true;fi:
> if g=1 then lambda:=(3*x1^2+b)/(2*y1) mod n:fi:
> fi:
> # Slut på beregning af lambda i tilf. P=Q;
>
> # Vi beregner lambda i talfælde P<>Q og P<>-Q;
> if (x1<>x2 ) then
> g := gcd(x2-x1,n):
> if (g=n) then uheldig:=true;fi;
> if (g>1 and g<n) then d:=g;faktor:=true;fi;
> if (g=1) then lambda:=(y2-y1)/(x2-x1) mod n;fi;
> fi:
> # Slut på beregning i tilf. P<>Q og P<>-Q;
>
> # Vi bruger add. formler;
> if (y1=-y2) then P_Q:=nul;
> elif (uheldig=false) then
> x3:=lambda^2-x1-x2 mod n:
> y3:=-lambda*x3-(y1-lambda*x1) mod n:
> P_Q:=(x3,y3):
> fi:
> # Slut på brug af add. formler;
>
> fi:
> # Slut på additionsalgoritme mod n;
> if uheldig=true then forfra:=true;ny_b:=true:
> else
> kP:=P_Q;
> # lprint(i, kP);
> fi:
>
> fi;
> #Slut på add af kP og pkt[i];
>
> od;
> #slut på beregning af kP;
>
> fi:
> #Slut på Step 6;
>
> if (slut=false and faktor=false) then ny_b:=true;fi:
> od:
> # Slut på den store løkke;
>
> faktor;
> d;
> b_:=b;
> K_:=K;