Pollard's Rho 快速质因数分解 复习小记

Description

为什么又是复习小记?因为又忘了个精光QAQ

Pollard’s Rho

分治思想

我们实现过程 find(n) 表示对 n 进行质因数分解。
如果能找到任意一个d|n,d1,dn,那么就可以转化成两个子问题 find(d) find(n/d) 。当然如果 n 本身就是质数那么肯定是找不到的,所以先用miller rabin质数测试判定一次

随机算法的改进

如果每次随机x并判定 (x,n) 是否等于 1 ,效率太低

基于生日悖论的概率原理

1 n 中选k个数,其中至少一对数之差为 n 的因数的概率随着k增大而迅速增大。
这启示我们判定 (abs(xy),n) 是否为 1 ,这样成功概率会更高

步骤

  1. 定义函数f(x)=x2+c c 随机给出
  2. 注意到因为是模n意义下,所以 x 的取值会成环,类似ρ

    • x 每次走一步,y每到 2j 的时间点走一次(最玄学的部分)
    • 每次判定 (abs(xy),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);
      }
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值