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 板子
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每次走一步,