Description
为什么又是复习小记?因为又忘了个精光QAQ
Pollard’s Rho
分治思想
我们实现过程
find(n)
表示对
n
进行质因数分解。
如果能找到任意一个
随机算法的改进
如果每次随机
基于生日悖论的概率原理
从
这启示我们判定
(abs(x−y),n)
是否为
1
,这样成功概率会更高
步骤
- 定义函数
f(x)=x2+c , c 随机给出 - 注意到因为是模
n 意义下,所以 x 的取值会成环,类似ρ -
x
每次走一步,
y 每到 2j 的时间点走一次(最玄学的部分) - 每次判定 (abs(x−y),n) 是否为 1
- 若
x=y 则退出,重新随机 c <script type="math/tex" id="MathJax-Element-1025">c</script> 板子
ll pollard_rho(ll n,ll c) { int i=1,k=2; ll x=rand()%n;ll y=x; for(;;) { i++; x=(qmul(x,x,n)+c)%n; ll d=gcd(abs(x-y),n); if(d!=1 && d!=n) return d; if(y==x) return n; if(i==k) y=x,k<<=1; } } void find(ll n) { if(n==1) return; if(miller_rabin(n)) { a[++num]=n; return; } ll d=n; while(d>=n) d=pollard_rho(n,rand()%(n-1)+1); find(d); while(n%d==0) n/=d; find(n); }
-
x
每次走一步,