Pollard Rho算法

原理

Pollard Rho算法是一个非常玄学的算法(我个人还不是很懂其原理),作用是分解出一个数的非平凡因子(除1和它本身),通常作用于对大数的质因数分解.期望复杂度为O(n1/4).总体来说运行效果还是相当不错的.

算法核心:y=x,x=x*x+c.其中x,y初值是随机生成的,c也是随机生成的常数,假设算法求的是n的因子,最后要判断的是g=gcd(abs(y-x),n),如果g大于1,则找到了一个因子g,否则y和x继续按公式更新,重复操作.

不过y和x都是再模n的条件下生成的,因此这么生成下去是会产生环的,因此需要判环,也就是判y是否等于x.

整个代码可以用倍增优化,需要设z用来存储每次x更新后的abs(y-x)的积,然后有大佬指出每跑完127次之后有大概率能找到一个因子.

具体细节可以参考一下以下两篇文章,这里不多叙述(不是很懂).

1 2

代码

 1 LL p_rho(LL n) 
 2 {
 3     while(1) //一定找到一个因子
 4     {
 5         LL x=rand()%n,y=x,c=rand()%n,z=1;
 6         int i=1,j=1;
 7         while(i++)
 8         {
 9             x=(q_muti(x,x,n)+c)%n; //q_muti为快速乘 
10             z=q_muti(z,abs(y-x),n);
11             if(x==y||!z) break;
12             if(!(i%127)||i==j)
13             {
14                 LL g=gcd(z,n);
15                 if(g>1) return g;
16                 if(i==j) y=x,j<<=1;
17             }
18         }
19     }
20 }

这里再给出完整的质因数分解模板,需要同时用到Miller-Rabin素数测试和Pollard Rho算法

  1 #include <bits/stdc++.h>
<
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值