Pollards rho-algoritme

Uit testwiki
Naar navigatie springen Naar zoeken springen

Pollards rho-algoritme is een algoritme dat door John Pollard in 1978 beschreven werd om de discrete logaritme zoals dat is gedefinieerd in een cyclische groep te berekenen. Het grote voordeel ten opzichte van het Baby-steps giant-steps-algoritme is dat voor deze methode geen opslagruimte nodig is.

Inleiding

Laat G een groep zijn, met orde p, en G cyclisch. Laat g G voortbrenger zijn van G en h G. De discrete logaritme luidt nu als volgt: Bepaal de oplossing van gn=h.

Pollards rho-algoritme definieert eerst een pseudowillekeurige reeks (opeenvolging) van elementen van een groep en kijkt dan naar een cyclus (kringloop) die in deze reeks voorkomt.

Deze groep wordt verdeeld in drie deelverzamelingen S1, S2, S3 van ongeveer gelijke grootte, door middel van een eenvoudig te testen eigenschap.

Vervolgens wordt er een functie gedefinieerd die de groep afbeeldt op zichzelf waardoor de elementen op een andere manier worden gerangschikt. Verder wordt f(x) zo gekozen dat elk opeenvolgend element een functie is van alleen het voorgaande element. Eigenlijk worden twee reeksen elementen gemaakt waarbij de tweede reeks twee keer zo snel de groepselementen doorloopt als de eerste reeks. We zoeken nu totdat we twee dezelfde elementen hebben gevonden. Als we een element vinden dat voor de tweede keer voorkomt, is elk daaropvolgend element een herhaling van elementen eerder in de reeks.

De verjaardagenparadox zegt nu dat we zo’n cyclus zullen vinden nadat we slechts O(√p) elementen van de reeks hebben berekend. (In het algemeen geldt dat als er volkomen willekeurig elementen worden geselecteerd uit een verzameling, met grootte n dan hoeft men maar O(√p) elementen van deze verzameling te selecteren om een kans van ½ te hebben om hetzelfde element twee keer te trekken.)

Algoritme

Zij G een groep van orde p, g een voortbrenger en hG. Bepaal de discrete logaritme n, waarvoor gn=h.

G wordt verdeeld in drie deelverzamelingen S1,S2 en S3 (geen subgroepen) van ongeveer gelijke omvang.

Vervolgens worden de elementen als volgt gerangschikt:

x0=1

en

xi+1={hxixiS1xi2als xiS2gxixiS3

Bovendien worden de gehele getallen (ai) en (bi) zo gedefinieerd, dat

a0=b0=0

en

ai+1={aixiS12aimodpals xiS2ai+1modpxiS3
bi+1={bi+1modpxiS12bimodpals xiS2bixiS3

Dan geldt: xi=gai+bin, want ai is het aantal factoren g, en bi het aantal factoren h=gn.

Voor zekere indices i en j zal blijken dat:

xi=gai+bin=xj=gaj+bjn.

Volgens het algoritme van Floyd voor het opsporen van cyclussen is het voldoende te zoeken naar indices i en j=2i.

Dan volgt:

ai+binaj+bjn(modp),

waaruit het gevraagde getal n berekend kan worden

Voorbeeld

Het element 5 is een voortbrenger van de subgroep G van 1000003* met orde 1.000.002. Met het algoritme wordt de discrete logaritme n bepaald, waarvoor 5n=262682(mod1000003).

Verdeel G in drie deelverzamelingen:

Si={xG|xi(mod3)},i=1,2,3

Dan is

x0=1

en

xi+1={5nxixi1(mod3)xi2als xi2(mod3)5xixi0(mod3)

Zo ontstaat de rij (alles modulo 1000003):

x1=5nx0=5n=2626822(mod3)
x2=x12=52n=2626822=6261210(mod3)
x3=5x2=52n+1=5×626121=1305960(mod3)
x4=5x3=52n+2=5×130596=6529800(mod3)
x5=5x4=52n+3=5×652980=2648910(mod3)
x6=5x5=52n+4=5×264891=3244522(mod3)
x7=x62=54n+8=3244522=7845000(mod3)
x1785=5249847n+759123=555013
x3570=5388795n+632781=555013

Het blijkt dat x1785=x3570, dus

249847n+759123388795n+632781(mod1000002)

of

138948n126342(mod1000002)

Omdat 138948 en 1000002 niet relatief priem zijn (ggd(138948,1000002) = 6), heeft 138948 geen inverse en kan de congruentievergelijking niet direct opgelost worden. Een vergelijkbare vergelijking is:

138948/6n126342/6(mod1000002/6)

dus:

23158n21057(mod166667),

zodat:

n=21057×231581(mod166667)

De inverse van 23158 (mod 166667) kan berekend worden met het uitgebreide algoritme van Euclides:

ggd(23158,166667)=1
1=4133×16666729745×23158,

dus

129745×23158136922×23158(mod166667)

Modulo 166667 is de inverse van 23158 dus 136922, zodat

n=21057×136922(mod166667)

Er zijn nu 6 mogelijkheden voor n:

n=21057×(136922+k×166667)(mod166667),k=0,1,2,3,4,5,

resulterend in:

n=21057×136922160788(mod166667) of
n=21057×303589660789(mod166667) of
n=21057×470256160788(mod166667) of
n=21057×636923660789(mod166667) of
n=21057×803590160788(mod166667) of
n=21057×970257660789(mod166667)

Nu is

5160789=686596(mod1000003)

en

5660789=262682(mod1000003)

Dus n=660789 is het gezochte getal.

Zie ook

Referenties