Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

Pollard's rho algorithm for logarithms

From Wikipedia, the free encyclopedia
Mathematical algorithm

Pollard's rho algorithm for logarithms is an algorithm introduced byJohn Pollard in 1978 to solve thediscrete logarithm problem, analogous toPollard's rho algorithm to solve theinteger factorization problem.

The goal is to computeγ{\displaystyle \gamma } such thatαγ=β{\displaystyle \alpha ^{\gamma }=\beta }, whereβ{\displaystyle \beta } belongs to acyclic groupG{\displaystyle G} generated byα{\displaystyle \alpha }. The algorithm computesintegersa{\displaystyle a},b{\displaystyle b},A{\displaystyle A}, andB{\displaystyle B} such thatαaβb=αAβB{\displaystyle \alpha ^{a}\beta ^{b}=\alpha ^{A}\beta ^{B}}. If the underlyinggroup is cyclic ofordern{\displaystyle n}, by substitutingβ{\displaystyle \beta } asαγ{\displaystyle {\alpha }^{\gamma }} and noting that two powers are equalif and only if the exponents are equivalent modulo the order of the base, in this case modulon{\displaystyle n}, we get thatγ{\displaystyle \gamma } is one of the solutions of the equation(Bb)γ=(aA)(modn){\displaystyle (B-b)\gamma =(a-A){\pmod {n}}}. Solutions to this equation are easily obtained using theextended Euclidean algorithm.

To find the neededa{\displaystyle a},b{\displaystyle b},A{\displaystyle A}, andB{\displaystyle B} the algorithm usesFloyd's cycle-finding algorithm to find a cycle in the sequencexi=αaiβbi{\displaystyle x_{i}=\alpha ^{a_{i}}\beta ^{b_{i}}}, where thefunctionf:xixi+1{\displaystyle f:x_{i}\mapsto x_{i+1}} is assumed to be random-looking and thus is likely to enter into a loop of approximate lengthπn8{\displaystyle {\sqrt {\frac {\pi n}{8}}}} afterπn8{\displaystyle {\sqrt {\frac {\pi n}{8}}}} steps. One way to define such a function is to use the following rules:PartitionG{\displaystyle G} into threedisjoint subsetsS0{\displaystyle S_{0}},S1{\displaystyle S_{1}}, andS2{\displaystyle S_{2}} of approximately equal size using ahash function. Ifxi{\displaystyle x_{i}} is inS0{\displaystyle S_{0}} then double botha{\displaystyle a} andb{\displaystyle b}; ifxiS1{\displaystyle x_{i}\in S_{1}} then incrementa{\displaystyle a}, ifxiS2{\displaystyle x_{i}\in S_{2}} then incrementb{\displaystyle b}.

Algorithm

[edit]

LetG{\displaystyle G} be acyclic group of ordern{\displaystyle n}, and givenα,βG{\displaystyle \alpha ,\beta \in G}, and a partitionG=S0S1S2{\displaystyle G=S_{0}\cup S_{1}\cup S_{2}}, letf:GG{\displaystyle f:G\to G} be the map

f(x)={βxxS0x2xS1αxxS2{\displaystyle f(x)={\begin{cases}\beta x&x\in S_{0}\\x^{2}&x\in S_{1}\\\alpha x&x\in S_{2}\end{cases}}}

and define mapsg:G×ZZ{\displaystyle g:G\times \mathbb {Z} \to \mathbb {Z} } andh:G×ZZ{\displaystyle h:G\times \mathbb {Z} \to \mathbb {Z} } by

g(x,k)={kxS02k(modn)xS1k+1(modn)xS2h(x,k)={k+1(modn)xS02k(modn)xS1kxS2{\displaystyle {\begin{aligned}g(x,k)&={\begin{cases}k&x\in S_{0}\\2k{\pmod {n}}&x\in S_{1}\\k+1{\pmod {n}}&x\in S_{2}\end{cases}}\\h(x,k)&={\begin{cases}k+1{\pmod {n}}&x\in S_{0}\\2k{\pmod {n}}&x\in S_{1}\\k&x\in S_{2}\end{cases}}\end{aligned}}}
input:a: a generator ofGb: an element ofGoutput: An integerx such thatax =b, or failureInitialisei ← 0,a0 ← 0,b0 ← 0,x0 ← 1 ∈Gloopii + 1xif(xi−1),aig(xi−1,ai−1),bih(xi−1,bi−1)x2i−1f(x2i−2),a2i−1g(x2i−2,a2i−2),b2i−1h(x2i−2,b2i−2)x2if(x2i−1),a2ig(x2i−1,a2i−1),b2ih(x2i−1,b2i−1)whilexix2irbib2iif r = 0return failurereturnr−1(a2iai) modn

Example

[edit]

Consider, for example, the group generated by 2 moduloN=1019{\displaystyle N=1019} (the order of the group isn=1018{\displaystyle n=1018}, 2 generates the group of units modulo 1019). The algorithm is implemented by the followingC++ program:

#include<stdio.h>constintn=1018,N=n+1;/* N = 1019 -- prime     */constintalpha=2;/* generator             */constintbeta=5;/* 2^{10} = 1024 = 5 (N) */voidnew_xab(int&x,int&a,int&b){switch(x%3){case0:x=x*x%N;a=a*2%n;b=b*2%n;break;case1:x=x*alpha%N;a=(a+1)%n;break;case2:x=x*beta%N;b=(b+1)%n;break;}}intmain(void){intx=1,a=0,b=0;intX=x,A=a,B=b;for(inti=1;i<n;++i){new_xab(x,a,b);new_xab(X,A,B);new_xab(X,A,B);printf("%3d  %4d %3d %3d  %4d %3d %3d\n",i,x,a,b,X,A,B);if(x==X)break;}return0;}

The results are as follows (edited):

 i     x   a   b     X   A   B------------------------------ 1     2   1   0    10   1   1 2    10   1   1   100   2   2 3    20   2   1  1000   3   3 4   100   2   2   425   8   6 5   200   3   2   436  16  14 6  1000   3   3   284  17  15 7   981   4   3   986  17  17 8   425   8   6   194  17  19..............................48   224 680 376    86 299 41249   101 680 377   860 300 41350   505 680 378   101 300 41551  1010 681 378  1010 301 416

That is26815378=1010=23015416(mod1019){\displaystyle 2^{681}5^{378}=1010=2^{301}5^{416}{\pmod {1019}}} and so(416378)γ=681301(mod1018){\displaystyle (416-378)\gamma =681-301{\pmod {1018}}}, for whichγ1=10{\displaystyle \gamma _{1}=10} is a solution as expected. Asn=1018{\displaystyle n=1018} is notprime, there is another solutionγ2=519{\displaystyle \gamma _{2}=519}, for which2519=1014=5(mod1019){\displaystyle 2^{519}=1014=-5{\pmod {1019}}} holds.

Complexity

[edit]

The running time is approximatelyO(n){\displaystyle {\mathcal {O}}({\sqrt {n}})}. If used together with thePohlig–Hellman algorithm, the running time of the combined algorithm isO(p){\displaystyle {\mathcal {O}}({\sqrt {p}})}, wherep{\displaystyle p} is the largest primefactor ofn{\displaystyle n}.

References

[edit]
Primality tests
Prime-generating
Integer factorization
Multiplication
Euclideandivision
Discrete logarithm
Greatest common divisor
Modular square root
Other algorithms
  • Italics indicate that algorithm is for numbers of special forms
Retrieved from "https://en.wikipedia.org/w/index.php?title=Pollard%27s_rho_algorithm_for_logarithms&oldid=1238211262"
Categories:
Hidden categories:

[8]ページ先頭

©2009-2025 Movatter.jp