Pollard's Rho 快速质因数分解 复习小记
2018-01-05 17:19
190 查看
Description
为什么又是复习小记?因为又忘了个精光QAQPollard’s Rho
分治思想
我们实现过程find(n)表示对n进行质因数分解。如果能找到任意一个d|n,d≠1,d≠n,那么就可以转化成两个子问题find(d)与find(n/d)。当然如果n本身就是质数那么肯定是找不到的,所以先用miller rabin质数测试判定一次
随机算法的改进
如果每次随机x并判定(x,n)是否等于1,效率太低基于生日悖论的概率原理
从1到n中选k个数,其中至少一对数之差为n的因数的概率随着k增大而迅速增大。这启示我们判定(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); }
相关文章推荐
- 【快速因数分解】Pollard's Rho 算法
- splay复习小记
- 数据结构复习 快速排序个人总结
- 算法复习--快速排序
- C++编程知识快速复习(上)(精华高效全面版)
- C++编程知识快速复习(内存使用篇)(精华高效全面版)
- Mysql语句快速复习教程(全)
- 快速排序复习
- pollard_rho 学习总结 Miller_Rabbin 复习总结
- 快速复习正则表达式
- ACM基础算法复习(STL + DFS + BFS + 并查集 + 快速幂 + 欧几里得算法)
- C++复习之堆排序&快速排序
- 【POJ1811】【miller_rabin + pollard rho + 快速乘】Prime Test
- 20、Mysql语句快速复习
- 大数素性测试+大数质因数分解(miller-rabin,Pollard_rho算法)
- C++复习 01 快速入门
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 快速的复习下RAID{简单概念版}
- Java基础快速复习
- 快速通过CCNA考试三点复习秘笈