Faktorisering af hele tal — Lenstra’s 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 Lenstra’s 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:

 

Fermat’s 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:

  1. Vælg K>1. Beregn k=LCM(1,2,…..,K)=2a1*3a2*5a3*…*qas
  2. Vælg 1<a<n. Beregn D=(a,n).
    1. Hvis 1<D<n så har vi en faktor og er færdige.
    2. Hvis D=n så er vi uheldige og går til 2 og vælger et andet a.
    3. Hvis D=1 fortsættes.
  3. Beregn D=(ak-1,n)
    1. Hvis 1<D<n så har vi en faktor og er færdige.
    2. Hvis D=n så er vi uheldige og går til 2 og vælger et andet a.
    3. Hvis D=1 så går vi til 1 og vælger et større K.

 

Bem:

 

Eksempel 3

n=246082373 (ej et primtal)

  1. Vælg K=9, k=LCM(1,2,..,K)=2520.
  2. Vælg a=2. (a,n)=1.
  3. 2k-1=130940740 mod n

D=(2k-1,n)=(130940740,n)=2521. Dvs. 2521 er en faktor i n. færdig.

 

Afsluttende opsummering

Lenstra’s algoritme bygger på samme grundide som Pollard’s.

 

Lenstra’s algoritme

 

Lenstra’s 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)

    1. Hvis D>1 har vi en faktor. færdig
    2. Hvis D=1 fortsættes.
  1. Vi vælger en elliptisk kurve ved:
  2. 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)

  3. Beregn D=(4b3+27c2,n)
    1. Hvis D=n så hop til 2a og vælg nyt b.
    2. Hvis 1<D<n så har vi en faktor. Færdig
    3. Hvis D=1 fortsæt
  4. Vælg et K>1. Lad k=LCM(1,2,..,K)
  5. Beregn k·P=(ak/dk2,bk/dk3). Beregn D=(dk,n)
    1. Hvis D=n hopper vi til 3) og vælger et mindre k.
    2. Hvis 1<D<n så har vi en faktor. Færdig.
    3. Hvis D=1 kan vi hoppe til 2) og vælge nyt b eller til 3) og vælge et nyt k.

 

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 Lenstra’s algoritme.

 

Afsluttende diskussion

Hasse’s 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 Lenstra’s 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

Lenstra’s 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 pp : Z -> Z/pZ og pn : Z -> Z/nZ

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;