Pollard-Rho 算法总结

预备知识

  1. 质因数分解;
  2. 生日悖论。

然后就愉快的开始吧。

Part.I 如何对一个大合数进行质因数分解

设有一个大合数N=p×q,(p≠q)N=p\times q,(p\not= q)N=p×q,(p​=q),那么我们可以用什么方法去把它分成两个数的乘积呢?

显然我们可以只找到ppp或者qqq,另一个用NNN去除一下就好了。

那么如何去找这个数?显然可以用暴力方法去找 (代码过于简单就不给了)。

显然这是要爆炸的。。。

Part.II 随机化???

考虑随机数???

显然这个复杂度瞬间达到了O(O(O(玄学)))。

但是这就是Pollard-Rho算法的可行基础。。。

Part.III 生日悖论???

先看一下这个问题

考虑从[1,1000][1,1000][1,1000]中选出一个数,要求恰好是424242,显然这个概率为11000\frac{1}{1000}10001​。

那么我们要选两个数i,ji,ji,j使得i−j=42i-j=42i−j=42呢?算一下就可以发现这个概率大概是1500\frac{1}{500}5001​。

那么我们要选出kkk个数x1,x2,…,xkx_1,x_2,\ldots,x_kx1​,x2​,…,xk​使得xi−xj=42x_i-x_j=42xi​−xj​=42呢?

写个程序玩一下就会发现:选了100个数的概率居然非常接近111了。

这个被称为生日悖论

Part.IV 如何用生日悖论

多打打表就发现当我们选取k=Nk=\sqrt{N}k=N​个数时,成功的概率已经超过了50%50\%50%。

换句话说,我们已经将找到质因数的概率从1N\frac{1}{N}N1​提到了1N\sqrt{\frac{1}{N}}N1​​。这意味着我们对于一个101010^{10}1010级别的数,我们只需找到k=105k=10^5k=105个数。

但是,另一个不幸的消息是我们需要用k2k^2k2次除法和比较。 这不是又炸了QAQ…

然而我们可以这样来做:对于一个xix_ixi​,再随机构造一个xyx_yxy​,求gcd⁡(∣xi−xy∣,N)\gcd(|x_i-x_y|,N)gcd(∣xi​−xy​∣,N),可以发现,当这个gcd⁡(∣xi−xy∣,N)\gcd(|x_i-x_y|,N)gcd(∣xi​−xy​∣,N)不等于111时,我们就找到了一个质因子。

但直接存下这kkk个数似乎不太可能存进去。

Part.V 总算到了Pollard-Rho算法

Pollard-Rho算法的实现只存下了两个数。

我们一直往下生成两个数,每次只比较和检查这两个数,然后直到找到我们想要的数。

我们使用一个伪随机数算法来生成下一个数,设当前数数xxx,则我们的下一个数就是x2+amodNx^2+a\mod Nx2+amodN。

P.S.关于常数aaa,可以指定,也可以rand()一个。

Part.VI 还有问题???

如果你运气好的话,你总会遇到一些数,他们会让Pollard-Rho算法进入死循环。

如何解决?

有一种方法是开一个数组,然后不断标记。

然而数字很大的时候就要炸。。。

考虑这样一个问题:

你在操场上走,然而操场周围的景物都一样,那么你如何知道你已经走了一圈?

一个有效的方法是再找一个人 不要问我怎么找到的 ,然后让他以你的两倍的速度向前走,当你和那个人相遇时,你就走完了一圈。

这样的话,我们就可以用两个变量x,yx,yx,y,初始值相同,每次进入循环时,令x=f(x),y=f(f(y))x=f(x),y=f(f(y))x=f(x),y=f(f(y)),每次只需检查gcd⁡(∣x−y∣,N)\gcd(|x-y|,N)gcd(∣x−y∣,N)即可。

模版

typedef long long ll;
const int pri[]={2,3,5,7,11,13,17,19,23,29};inline ll QuickMul(ll a,ll b,ll mod) {a%=mod,b%=mod;ll ret=0;while(b) {if(b&1)ret=(ret+a)%mod;a=(a+a)%mod;b>>=1;}return ret;
}
inline ll GCD(ll x,ll y) {return y==0?x:GCD(y,x%y);}
inline ll ABS(ll x) {return x<0?-x:x;}ll PollardRho(ll n) {for(int i=0;i<10;i++)if(n%pri[i]==0)return pri[i];ll x=(1LL*rand()*rand()%(n-2))+2;ll y=x;ll c=(1LL*rand()*rand()%(n-1))+1;ll d=1;while(d==1) {x=(QuickMul(x,x,n)+c+n)%n;y=(QuickMul(y,y,n)+c+n)%n;y=(QuickMul(y,y,n)+c+n)%n;d=GCD(ABS(x-y),n);if(d==n)return n;}return d;
}

【数论】Pollard-Rho 算法总结相关推荐

  1. 大整数分解——Pollard Rho算法

    延续上一篇,这次来讲一讲大整数分解算法的应用. 要解决的问题很简单,对一个整数进行分解质因数. 首先还是效率非常低的暴力算法,相信大家都会,不多提. 和上次一样,当数达到非常大的时候,分解将变得非常困 ...

  2. c语言用rho函数求复数模长,Pollard Rho 算法简介

    $\text{update 2019.8.18}$ 由于本人将大部分精力花在了cnblogs上,而不是洛谷博客,评论区提出的一些问题直到今天才解决. 下面给出的Pollard Rho函数已给出散点图. ...

  3. BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=5330 (Luogu) https://www.luogu.org/prob ...

  4. 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)

    太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...

  5. 数学--数论---P4718 Pollard-Rho算法 大数分解

    P4718 [模板]Pollard-Rho算法 题目描述 MillerRabin算法是一种高效的质数判断方法.虽然是一种不确定的质数判断法,但是在选择多种底数的情况下,正确率是可以接受的.Pollar ...

  6. 因数分解 Pollard rho

    因数分解 Pollard rho 算法思路 随机生成两个数a,ba,ba,b,然后求gcd⁡(n,a−b)\gcd\pod{n,a-b}gcd(n,a−b),如果其值不为111,则这个数就是nnn的一 ...

  7. 【快速因数分解】Pollard's Rho 算法

    算法目的 给一个数n,快速提取n的一个因数. 算法根据:生日悖论 讲生日悖论之前,先看一个东西. 给出[1-1000]的数,从中任意选出一个数为k的概率是110001\over 100010001​. ...

  8. 64位以内Rabin-Miller 强伪素数测试和Pollard rho 因数分解解析

    在求解POJ1811题Prime Test中应用到的两个重要算法是Rabin-Miller强伪素数测试和Pollard r因数分解算法.前者可以在的时间内以很高的成功概率判断一个整数是否是素数.后者可 ...

  9. 整数的素因子分解:Pollard rho method

    参考: 1.CLRS<算法导论> 2.http://www.csh.rit.edu/~pat/math/quickies/rho/#algorithm Pollard rho方法是随机算法 ...

  10. 简述大数分解算法Pollard Rho和Pollard p-1

    大数分解问题其实至今都是一个世界级难题,最常见的分解法是从2一直找到sqr(N),作为一个密码学专业的学生,每次看到别人这么做来进行因子分解,自己都控制不住想要制止他,因为这个算法的效率简直太太太太太 ...

最新文章

  1. 交互学习 Vue.js
  2. mysql selectprovider_使用Mybatis的@SelectProvide会不会导致注入攻击?
  3. AAAIT学院JDK15新特性JAVA15版本
  4. 【转】Linux 静态库与共享库的使用
  5. android多接口请求参数,okhttp3 使用json参数post方式请求接口数据(android)
  6. Python模块开发【Distutils】
  7. c语言怎么算n以内素数,关于求N以内素数的一点小问题(N小于一亿)
  8. matlab练习程序(径向模糊1)
  9. SQOOP抽取各类型数据库脚本示例
  10. kafka consumer 的配置(五)
  11. 苹果电脑安装计算机一级,苹果电脑安装Win10系统的详细步骤
  12. 高中学习计算机技术,关于高中生学习计算机信息技术的思考
  13. ar5b97无线网卡驱动linux 版下载,atheros ar5b97驱动
  14. Execl单元格图片锁定----一定能
  15. Linux下的图片编辑软件和画图软件
  16. 嵌入式开发需要学习什么?
  17. 话说程序员的职业生涯
  18. 一篇搞懂OOA/OOD/OOP的区别
  19. 简介表格让你牢牢记住spring的7种事务传播机制
  20. Servlet电子商城项目(入门级一)

热门文章

  1. 2021校招offer薪资如何?(包含当今互联网各巨厂、大厂、中厂)
  2. window office
  3. 12306网站专家:拟采取办法应对抢票软件
  4. 微信小程序获取用户信息,返回nickName是微信用户,返回了匿名的头像名称原因。
  5. python期货基本面分析_Python量化炒期货入门与实战技巧
  6. oracle清除过期备份,rman delete obsolete删除过期备份集问题
  7. V4L2驱动的移植与应用(三)
  8. Android放大镜实现的两种方式
  9. zabbix3.0 之短信报警配置
  10. 文件服务器mfs,分布式文件系统MFS(moosefs)实现存储共享