-
Notifications
You must be signed in to change notification settings - Fork 1
Pollard's Rho algorithm
Pollard's Rho algorithm for factoring a composite integer n
works as follows. Use a starting number x_0
(I'm using x_0 == 0
) and a polynomial f(x)
(I'm using f(x) = x^2 + 1
), repeatedly apply the polynomial to the number (eg x_2 = f(f(x_0))
), so after i applications you have x_i
, and do this arithmetic mod n
. For each index k
such that you have values for x_k
and x_2k
, test if gcd(n, |x_2k - x_k|)
is greater than 1 and less than n. If so, it will be a factor for n. This is because the graph described by repeatedly applying f(x) mod n
looks like a straight path that culminates in a loop, because there are a finite set of numbers less than n and sooner or later you'll see a repeat in the sequence. But actually, since the arithmetic is being done mod n
, it is also being done mod p
for any prime p
that divides n
. So even though you are looping with respect to arithmetic mod p
, the actual values in the loop may differ because the actual arithmetic is mod n
. So two values for the same "node" in a loop may differ, but if so, the difference may be divisible by p. So, given two possible values x_k
and x_2k
, it is sufficient to test gcd(n, |x_2k - x_k|)
to see if anything nontrivial comes up; if so, it is a factor of n.