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

本文介绍了一种高效的质因数分解算法——Pollard's Rho 算法,并通过分治思想将其应用于较大整数的质因数分解。通过随机选择参数 c 和利用生日悖论提高找到质因数的概率,该算法能够有效地解决大整数的质因数分解问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

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

Pollard’s Rho

分治思想

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

随机算法的改进

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

基于生日悖论的概率原理

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

步骤

  1. 定义函数f(x)=x2+cc随机给出
  2. 注意到因为是模n意义下,所以x的取值会成环,类似ρ
    • x每次走一步,y每到2j的时间点走一次(最玄学的部分)
    • 每次判定(abs(xy),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);
      }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值