Content deleted Content added
No edit summary |
fix link in references |
||
(106 intermediate revisions by 83 users not shown) | |||
Line 1:
{{Short description|Mathematical algorithm}}
'''Pollard's rho algorithm for logarithms''' is an algorithm
The goal is to compute <math>\gamma</math> such that <math>\alpha ^ \gamma = \beta
To find the needed <math>a</math>, <math>b</math>, <math>A</math>, and <math>B</math> the algorithm uses [[Floyd's cycle-finding algorithm]] to find a cycle in the sequence <math>x_i = \alpha^{a_i} \beta^{b_i}</math>, where the [[function (mathematics)|function]] <math>f: x_i \mapsto x_{i+1}</math> is assumed to be random-looking and thus is likely to enter into a loop
==Algorithm==
Let <math>G</math> be a [[cyclic group]] of
:<math>
f(x) =
x^2 & x\in
\end{
</math>
and define maps <math>g:G\times\mathbb{Z}\to\mathbb{Z}</math> and <math>h:G\times\mathbb{Z}\to\mathbb{Z}</math> by
:<math>\begin{align}
g(x,
\end{
\\
2k \pmod {n} & x\in S_1\\
\end{cases}
\end{align}</math>
''b'': an element of ''G''
▲h(x,n) = \left\{\begin{matrix}
▲n+1 \ (\bmod \ p) & x\in G_0\\
Initialise ''i'' ← 0, ''a''<sub>0</sub> ← 0, ''b''<sub>0</sub> ← 0, ''x''<sub>0</sub> ← 1 ∈ ''G''
▲n & x\in G_2
'''loop'''
▲:'''Inputs''' ''a'' a generator of ''G'', ''b'' an element of ''G''
''x<sub>i</sub>'' ← ''f''(''x''<sub>''i''−1</sub>),
▲:'''Output''' An integer ''x'' such that ''a<sup>x</sup> = b'', or failure
''x''<sub>2''i''−1</sub> ← ''f''(''x''<sub>2''i''−2</sub>),
▲:#::''i'' ← 1
''b''<sub>2''i''</sub> ← ''h''(''x''<sub>2''i''−1</sub>, ''b''<sub>2''i''−1</sub>)
:## If r = 0 return failure▼
'''return''' ''r''<sup><span class="nowrap" style="padding-left:0.1em">−1</span></sup>(''a''<sub>2''i''</sub> − ''a<sub>i</sub>'') mod ''n''
==Example==
Consider, for example, the group generated by 2 modulo <math>N=1019</math> (the order of the group is <math>n=1018</math>, 2 generates the group of units modulo 1019). The algorithm is implemented by the following [[C++]] program:▼
<syntaxhighlight lang="cpp">
▲Consider, for example, the group generated by 2 modulo <math>N=1019</math> (the order of the group is <math>n=1018</math>, 2
▲ #include <stdio.h>
▲ const int alpha = 2; /* generator */
▲ const int beta = 5; /* 2^{10} = 1024 = 5 (N) */
switch (x % 3) {
▲ void new_xab( int& x, int& a, int& b ) {
▲ case 1: x = x*alpha % N; a = (a+1) % n; break;
}
▲ case 2: x = x*beta % N; b = (b+1) % n; break;
▲ }
▲ }
int X = x, A = a, B = b;
▲ int main() {
for (int
new_xab(X, A, B);
▲ for( int i = 1; i < n; ++i ) {
}
▲ if( x == X ) break;
return
}
</syntaxhighlight>
▲ }
The results are as follows (edited):
Line 99 ⟶ 109:
51 1010 681 378 1010 301 416
That is <math>2^{681} 5^{378} = 1010 = 2^{301} 5^{416} \pmod{1019}</math> and so <math>(416-378)\gamma = 681-301 \pmod{1018}</math>, for which <math>\gamma_1=10</math> is a solution as expected. As <math>n=1018</math> is not [[prime number|prime]], there is another solution <math>\gamma_2=519</math>, for which <math>2^{519} = 1014 = -5\pmod{1019}</math> holds.
==Complexity==
The running time is approximately <math>\mathcal{O}(\sqrt{n})</math>. If used together with the [[Pohlig–Hellman algorithm]], the running time of the combined algorithm is <math>\mathcal{O}(\sqrt{p})</math>, where <math>p</math> is the largest prime [[divisor|factor]] of <math>n</math>.
==References==
{{Reflist}}
*{{cite journal |first=J. M. |last=Pollard
*{{cite book |first1=Alfred J. |last1=Menezes
{{Number-theoretic algorithms}}
[[Category:Logarithms]]
[[Category:Number theoretic algorithms]]
|