Content deleted Content added
mNo edit summary |
fix link in references |
||
(138 intermediate revisions by 99 users not shown) | |||
Line 1:
{{Short description|Mathematical algorithm}}
'''Pollard's rho algorithm for logarithms''' is an algorithm
The
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 order <math>n</math>, and given <math>\alpha, \beta\in G</math>, and a partition <math>G = S_0\cup S_1\cup S_2</math>, let <math>f:G\to G</math> be the map
:<math>
f(x) = \begin{cases}
\beta x & x\in S_0\\
x^2 & x\in S_1\\
\alpha x & x\in S_2
\end{cases}
</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,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{align}</math>
'''input:''' ''a'': a generator of ''G''
''b'': an element of ''G''
'''output:''' An integer ''x'' such that ''a<sup>x</sup>'' = ''b'', or failure
Initialise ''i'' ← 0, ''a''<sub>0</sub> ← 0, ''b''<sub>0</sub> ← 0, ''x''<sub>0</sub> ← 1 ∈ ''G''
'''loop'''
''i'' ← ''i'' + 1
''x<sub>i</sub>'' ← ''f''(''x''<sub>''i''−1</sub>),
''a<sub>i</sub>'' ← ''g''(''x''<sub>''i''−1</sub>, ''a''<sub>''i''−1</sub>),
''b<sub>i</sub>'' ← ''h''(''x''<sub>''i''−1</sub>, ''b''<sub>''i''−1</sub>)
''x''<sub>2''i''−1</sub> ← ''f''(''x''<sub>2''i''−2</sub>),
''a''<sub>2''i''−1</sub> ← ''g''(''x''<sub>2''i''−2</sub>, ''a''<sub>2''i''−2</sub>),
''b''<sub>2''i''−1</sub> ← ''h''(''x''<sub>2''i''−2</sub>, ''b''<sub>2''i''−2</sub>)
''x''<sub>2''i''</sub> ← ''f''(''x''<sub>2''i''−1</sub>),
''a''<sub>2''i''</sub> ← ''g''(''x''<sub>2''i''−1</sub>, ''a''<sub>2''i''−1</sub>),
''b''<sub>2''i''</sub> ← ''h''(''x''<sub>2''i''−1</sub>, ''b''<sub>2''i''−1</sub>)
'''while''' ''x<sub>i</sub>'' ≠ ''x''<sub>2''i''</sub>
''r'' ← ''b<sub>i</sub>'' − ''b''<sub>2''i''</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=
<syntaxhighlight lang="cpp">
▲Consider, for example, the group generated by 2 modulo <math>N=1019</math> (the order of the group is <math>n=509</math>). The algorithm is implemented by the following [[C plus plus|C++]] program:
const int n = 1018, N = n + 1; /* N = 1019 -- prime */
▲ #include <stdio.h>
for (int i = 1; i < n; ++i) {
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); </syntaxhighlight>
The results are as follows (edited):
Line 45 ⟶ 104:
8 425 8 6 194 17 19
..............................
48 224
49 101
50 505
51 1010
That is <math>2^{
==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]]
|