Pollard’s rho 算法解大数质因子问题

  • 1. Pollard's rho 算法
  • 2. 将Pollard's rho应用在大数质因子分解问题
  • 3. 优化
  • 4例子:27887分解

1. Pollard’s rho 算法

在大数质因子问题中, 一般被分解的数十分大,使用试除法的时间代价不可接受, Pollard’s rho算法有效的缓解了试除法的时间代价.
生日悖论: 在不少于 23 个人中至少有两人生日相同的概率大于 50%(百度百科).
那么要是人数再多一些是不是存在可能在一定人数中一定有人生日相同? 那么将这么理论应用在数学问题中,假如有nnn个数字的集合,我们不断地随机在集合中选取一个,在多次之后能找到一个数字和之前选出的相同而不需要选遍整个集合. 对于大数质因子问题,我们可以随机的的抽取[1,n−1][1, n-1][1,n−1]集合中的数字, 记做lll,随后再随机不停地抽取数字kkk,直到gcd(l−k,n)≠1gcd(l-k, n) \ne 1gcd(l−k,n)​=1.
但是我们需要在内存中保存每一个选取出来的数,要是nnn十分大,我们需要的计算资源会不可接受的大.

这时候可以使用Pollard’s rho算法
{vk=f(vk−1)vk+1=f(f(vk−1))\left\{ \begin{aligned} v_k &= f(v_{k-1})\\ v_{k+1} &= f(f(v_{k-1}))\\ \end{aligned} \right. {vk​vk+1​​=f(vk−1​)=f(f(vk−1​))​我们选取的数并不是完全随机,而是根据上一个选择根据一个伪随机函数生成下一个数字,这样只需要在内存保存两个数.

2. 将Pollard’s rho应用在大数质因子分解问题

现在我们假设需要分解数字mmm,按照试除法的思路,我们应该从111开始用mmm去除, 换成Pollard’s rho算法,应当在[1,m−1][1, m-1][1,m−1]这个集合中选取不同的数.
随后我们选取ρ0\rho_0ρ0​作为初始的数,设定函数ρk=f(ρk−1)\rho_k=f(\rho_{k-1})ρk​=f(ρk−1​)
不停的计算gcd((ρ2−ρ1),m),gcd((ρ3−ρ2),m)...gcd((ρk−ρk−1),m)gcd((\rho_2-\rho_1), m), gcd((\rho_3- \rho_2), m)...gcd((\rho_k - \rho_{k-1}), m)gcd((ρ2​−ρ1​),m),gcd((ρ3​−ρ2​),m)...gcd((ρk​−ρk−1​),m),直到输出不为111

3. 优化

还有一种选择是我们避免每次都计算gcd((ρk−ρk−1),m)gcd((\rho_k - \rho_{k-1}), m)gcd((ρk​−ρk−1​),m),而是将他们乘起来
S=(ρ2−ρ1)∗(ρ4−ρ2)∗(ρ6−ρ3)∗...∗(ρ2∗z−ρz)S =(\rho_2 - \rho_1)*(\rho_4 - \rho_2)*(\rho_6 - \rho_3)*...*(\rho_{2*z} - \rho_z)S=(ρ2​−ρ1​)∗(ρ4​−ρ2​)∗(ρ6​−ρ3​)∗...∗(ρ2∗z​−ρz​)
假如有gcd(S,m)≠1gcd(S, m) \ne 1gcd(S,m)​=1, 输出gcd(S,m)gcd(S, m)gcd(S,m).
这样就不需要每次都计算一次gcd((ρk−ρk−1),m)gcd((\rho_k - \rho_{k-1}), m)gcd((ρk​−ρk−1​),m),我们只需要输入一个适当的zzz就可以.
根据生日悖论,假如集合有nnn个数,我们需要选取nπ/2\sqrt{n\pi/2}nπ/2​个数字一般就会遇到之前出现过的,那对于zzz可以选择z=int(mπ/2)z=int(\sqrt{m\pi/2})z=int(mπ/2​)向上取整.

4例子:27887分解

给定函数ρi+1=ρ12+1\rho_{i+1} = \rho_1^2 +1ρi+1​=ρ12​+1, ρ0=17\rho_0 = 17ρ0​=17

#include <stdio.h>
int main(int argc, char *argv[]){long multi = 1;long rho[421];rho[0] = 17;long temp = 0;int reminder = 27887;int dividend = 27887;int divisor = 1;for(int i = 1; i < 421; i++){temp = rho[i - 1] % 27887;rho[i] = (rho[i -1]*rho[i - 1] + 1);rho[i] = rho[i] % 27887;}for(int i = 1; i < 211; i++){if(rho[i] == rho[i * 2]){continue;}temp = rho[2 * i] - rho[i];if(temp < 0){temp = temp * (-1);}multi = (multi * temp) % 27887;}divisor = multi; //欧几里得辗转相除法while(reminder != 0){ reminder = dividend % divisor;if(reminder == 0){printf("output: %d, %d\n", divisor, 27887 / divisor);continue;}dividend = divisor;divisor = reminder;}return 0;
}
// 输出output: 79, 353

Pollard’s rho 算法解大数质因子问题相关推荐

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

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

  2. Java实现 蓝桥杯 算法提高 Monday-Saturday质因子

    试题 算法提高 Monday-Saturday质因子 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 这个问题是个简单的与数论有关的题目,看起来似乎是"求正整数的所有质因子 ...

  3. 蓝桥杯 ADV-287 算法提高 Monday-Saturday质因子

    算法提高 Monday-Saturday质因子 时间限制:1.0s   内存限制:256.0MB 问题描述 这个问题是个简单的与数论有关的题目,看起来似乎是"求正整数的所有质因子" ...

  4. 试题 算法提高 Monday-Saturday质因子

    这个问题是个简单的与数论有关的题目,看起来似乎是"求正整数的所有质因子",但实际上并不完全是这样. 本题中在这里插入代码片## 标题需要定义以下几个概念: 1. Monday-Sa ...

  5. 蓝桥杯试题 算法提高 Monday-Saturday质因子

    资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 这个问题是个简单的与数论有关的题目,看起来似乎是"求正整数的所有质因子",但实际上并不完全是这样. 本题中需要定义 ...

  6. Magic的Miller Rabin素数测定和Pollard's Rho质因子分解法

    boshi大佬帮助了litble,使愚蠢的litble(可能?)学会了这种神奇的算法. orz boshi. 例题:poj1811 Miller Rabin 又称米勒挝饼, 一种神奇的快速判定一个数是 ...

  7. 【算法竞赛模板】质因子、质数、约数、余数、快速幂(数论大全)

    常用数论的算法模板 一.质因子 二.质数 三.约数 ① 试除法求一个数所有约数 ② 求约数个数 ③ 求约数和 ④ 求最大公约数 <1> gcd辗转相除 <2> 扩展欧几里得 & ...

  8. Java实现算法导论中Pollard的rho启发式方法

    Pollard的rho启发式方法用于启发式求解大整数n分解因子,具体要结合导论中来理解,参考代码如下: package cn.ansj;import java.math.BigInteger; imp ...

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

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

  10. 质因子分解算法c语言prime,分解质因数的算法

    满意答案 fy7306 2013.04.20 采纳率:49%    等级:12 已帮助:11721人 1.素数表,从小到大去试除,一直到当前质数的平方大于试除后剩下的数. 这样优化后的效率会比较高,至 ...

最新文章

  1. 独家 | 一个好的事件跟踪字典是什么样的?
  2. network 学习笔记
  3. pku 3159 Candies 差分约束
  4. objective-c 中字符串与日期相互转换
  5. 电路常识性概念(6)-VCC、VDD和VSS三种标号的区别
  6. Python—实训day1—语法
  7. .NET Core 3.1通用主机原理及使用
  8. arXiv与文献调研神器Connected Papers强强联合
  9. static变量的作用(转)
  10. springboot - 应用实践(3)springboot的核心
  11. Office 2016出现加载DLL失败或者库未注册的问题:0x8002801D或者0x80029C4A
  12. Philippe Clerc先生谈法国竞争情报
  13. Python 快速搭建文件上传服务器
  14. 计算机设计大赛 app一等奖,广商学子在大学生计算机设计大赛中喜获一等奖
  15. 字节的按位逆序 Reverse Bits
  16. android6.0原生壁纸,安卓6.0原生壁纸 androidM6.0自带高清壁纸下载
  17. 【※主题下载の命零电脑桌面主题※】
  18. 简单介绍控制理论(经典、现代)
  19. 用于图片文本识别的Tesseract-OCR的安装说明(windows10)
  20. aarch64 poky linux,aarch64-poky-linux-gcc:error::没有这样的文件或目录

热门文章

  1. ERPLAB脑电数据分析教程
  2. 【工具类】TimeLine功能的使用(一)
  3. MAC电脑如何用苹果电脑微信版实现多开
  4. qt跨平台软件开发_Qt on Mobile:跨平台应用程序开发的最佳实践
  5. java 远程文件操作_java远程文件操作 - osc_88djj30s的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. html 滑动刻度尺,js实现移动端H5页面手指滑动刻度尺功能
  7. python opencv生成背景透明图标
  8. 门店超越星巴克背后,瑞幸成咖啡市场新航标
  9. html5新浪微博代码,JS实现的新浪微博大厅文字内容滚动效果代码
  10. 弗兰克赫兹大物实验数据处理