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 such that, where belongs to acyclic group generated by. The algorithm computesintegers,,, and such that. If the underlyinggroup is cyclic oforder, by substituting as and noting that two powers are equalif and only if the exponents are equivalent modulo the order of the base, in this case modulo, we get that is one of the solutions of the equation. Solutions to this equation are easily obtained using theextended Euclidean algorithm.
To find the needed,,, and the algorithm usesFloyd's cycle-finding algorithm to find a cycle in the sequence, where thefunction is assumed to be random-looking and thus is likely to enter into a loop of approximate length after steps. One way to define such a function is to use the following rules:Partition into threedisjoint subsets,, and of approximately equal size using ahash function. If is in then double both and; if then increment, if then increment.
Let be acyclic group of order, and given, and a partition, let be the map
and define maps and by
input:a: a generator ofGb: an element ofGoutput: An integerx such thatax =b, or failureInitialisei ← 0,a0 ← 0,b0 ← 0,x0 ← 1 ∈Gloopi ←i + 1xi ←f(xi−1),ai ←g(xi−1,ai−1),bi ←h(xi−1,bi−1)x2i−1 ←f(x2i−2),a2i−1 ←g(x2i−2,a2i−2),b2i−1 ←h(x2i−2,b2i−2)x2i ←f(x2i−1),a2i ←g(x2i−1,a2i−1),b2i ←h(x2i−1,b2i−1)whilexi ≠x2ir ←bi −b2iif r = 0return failurereturnr−1(a2i −ai) modnConsider, for example, the group generated by 2 modulo (the order of the group is, 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 is and so, for which is a solution as expected. As is notprime, there is another solution, for which holds.
The running time is approximately. If used together with thePohlig–Hellman algorithm, the running time of the combined algorithm is, where is the largest primefactor of.