Pollard-rho方法
该方法由Pollard于1975年在论文A monte carlo method for factorization中提出,
论文可以见http://www.cs.cmu.edu/~avrim/451f11/lectures/lect1122_Pollard.pdf
这个算法来源于一个事实:
随机选取c*sqrt(p)个整数,就有很大概率在这些数中找到两个数模p同余。
算法(pollard-rho)
1) 随机选取a、x(1)
2)计算x(i+1) = (x(i)) ^ 2 + a mod n
3)计算gcd (n, x(2i) - x(i)),如果不等于1或者n,则继续第2步,否则返回该值。
(defun pollard-rho (n)
(let ((a (random n))
(x (random n))
(y 0))
(setf y (mod (+ (expt x 2) a) n))
(loop for i from 1 do
(if (and (/= 1 (gcd (- y x) n)) (/= n (gcd (- y x) n)))
(return))
(setf x (mod (+ (expt x 2) a) n))
(setf y (mod (+ (expt (mod (+ (expt y 2) a) n) 2) a) n)))
(gcd (- y x) n)))