与数论的厮守02:整数的因子分解—Pollard_Rho
学Pollard_Rho之前,你需要学会:Miller Rabin。
这是一个很高效的玄学算法,用来对大整数进行因数分解。
我们来分解n。若n是一个素数,那么就不需要分解了。所以我们还得能够判断一个数是否为素数才行。而n是个大整数,显然普通的试除法和筛法都是不够它跑的。所以我们就得考虑用Miller Rabin来判断。
但n不是素数呢?这就得用Pollard_Rho了。首先我们来看一个有趣的东西:生日悖论。
生日悖论:说简单点,就是在N个数里面选k个,当k接近√N时,选出两个相同数的几率约为50%。比如,不考虑闰年时,一个班若有23个人,则有两人生日相同的概率约为50%;但人数达到60时,概率约为基本上就是100%了,这严重违背了我们的生活经验,所以被列为了悖论。
模仿着生日悖论,若在1~N里面选k个数X1,X2...XK,若k足够大,则很大几率有gcd(Xi-Xj,N)>1,也就是二者不互质,此时gcd(Xi-Xj,N)就是N的一个因数了。但是这样做复杂度又退回了O(k2),处理不好还能退化为O(n2)。所以Pollard_Rho是有改进的。首先是空间。改进的Pollard_Rho只需要存相邻的两个数:Xi,Xi+1。同时为了得到这些数,Pollard_Rho还设计了一个函数:f(Xi)=(Xi2+c) mod n。这个c可以rand出来。然后再计算d=gcd(|Xi-Xi+1|,N),若d>1,则递归分解d和n/d。
但是mod n的值∈[0,n-1]之间,只有n个数,所以当递归够深时就会出现循环,这不利于我们的算法。就是这个样子(图是盗的):
这里就有一个优化。像刚才的图一样,我们可以把循环节看成是一个环,我们只需要找出环就可以停下了。不然就一直跑到递归的数为素数为止。怎么找环呢?我们会想一下小学的追及问题。假设跑道上有两个人,一个高个子和一个矮个子。矮个子的速度为1,高个子的速度为2。如果跑道是无限长的直线,那高个子就会永远跑在矮个子前面。但如果有环,那么高个子就肯定追得到矮个子。Pollard_Rho就可以用这个办法来找环。
(这个图也是盗的)
与数论的厮守02:整数的因子分解—Pollard_Rho的更多相关文章
- 数学:随机素数测试(Miller_Rabin算法)和求整数素因子(Pollard_rho算法)
POJ1811 给一个大数,判断是否是素数,如果不是素数,打印出它的最小质因数 随机素数测试(Miller_Rabin算法) 求整数素因子(Pollard_rho算法) 科技题 #include< ...
- 与数论的厮守01:素数的测试——Miller Rabin
看一个数是否为质数,我们通常会用那个O(√N)的算法来做,那个算法叫试除法.然而当这个数非常大的时候,这个高增长率的时间复杂度就不够这个数跑了. 为了解决这个问题,我们先来看看费马小定理:若n为素数, ...
- 与数论的厮守05:gcd(a,b)=gcd(b,a mod b)的证明
\[设c=gcd(a,b),那么a可以表示为mc,b可以表示为nc的形式.然后令a=kb+r,那么我们就\\ 只需要证明gcd(b,r)=c即可.{\because}r=a-kb=mc-knc,{\t ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- Openssl编程--源码分析
Openssl编程 赵春平 著 Email: forxy@126.com 第一章 基础知识 8 1.1 对称算法 8 1.2 摘要算法 9 1.3 公钥算法 9 1.4 回调函数 11 第二章 ope ...
- “不给力啊,老湿!”:RSA加密与破解
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 加密和解密是自古就有技术了.经常看到侦探电影的桥段,勇敢又机智的主角,拿着一长串毫 ...
- 最新证明面临质疑:P/NP问题为什么这么难?
转自:http://tech.sina.com.cn/d/2017-08-16/doc-ifyixias1432604.shtml 编译 | 张林峰(普林斯顿大学应用数学专业博士研究生) 责编 | 陈 ...
- 巴塞尔问题(Basel problem)的多种解法
巴塞尔问题(Basel problem)的多种解法——怎么计算\frac{1}{1^2}+\frac{1}{2^2}+\frac{1}{3^2}+\cdots112+122+132+⋯ ? (PS:本 ...
- 《openssl编程》:第一章基础知识
第一章 基础知识 1.1 对称算法 对称算法使用一个密钥.给定一个明文和一个密钥,加密产生密文,其长度和明文大致相同.解密时,使用读密钥与加密密钥相同. 对称算法主要有四种加密模式: (1) 电子密码 ...
随机推荐
- React+Webpack+Webstorm开发环境搭建
需要安装的软件 node.js npm包管理 Webstorm 由于6.3.0版本之后会自带npm的包管理所以不需要单独的安装npm nodejs(包含npm)安装在默认路径C:\Program Fi ...
- SpringBoot 全配置(推荐收藏)
# =================================================================== # COMMON SPRING BOOT PROPERTIE ...
- 【转载】C++中替代sprintf的std::ostringstream输出流详解
一.简单介绍 ostringstream是C++的一个字符集操作模板类,定义在sstream.h头文件中.ostringstream类通常用于执行C风格的串流的输出操作,格式化字符串,避免申请大量的缓 ...
- 基于VS Code创建Spring Boot项目开发REST API(一)
公司从.NET转向Java不仅仅是简单的代码变成Java,趁此机会对原有的架构和代码重构,融入新的概念和技术.目前通过前后端分离,将后端更多的微服务化.从.NET转向Java我们更多的是用Java开发 ...
- ASP.NET MVC+HighCharts开发统计图表
HighCharts是开源的Web图表js组件,与D3.js一样,经常用于数据可视化.HighCharts图表类型丰富,功能非常强大,是很好的数据可视化解决方案,其官方网站为:http://www.h ...
- 11.2vue(3)
2018-11-2 19:00:33 明天周末,又可以愉快整理博客啦! 越努力,越幸运!永远不要高估自己!!! 接着学vue 感觉好强大! 用这个组件的好处就是,不需要手动刷新,文件只要把保存就自动刷 ...
- 28、gulp
一.gulp的作用? 1.gulp-sass : 编译sass 2.gulp-rename : 重命名 3.gulp-cssnano : 压缩css 4.gulp-concat : 合并文件 5.gu ...
- Git查看两个版本之间修改了哪些文件
gdiff 63e3b647d55fcc643e793e650c893be8601719b1 548cdaf01dbc2f08d1ca0b697a24afe512b75a2f --stat git l ...
- itoa()函数
itoa()函数 itoa():char *itoa( int value, char *string,int radix); 原型说明: value:欲转换的数据.string:目标字符串的地址.r ...
- Android开发入门经典【申明:来源于网络】
Android开发入门经典[申明:来源于网络] 地址:http://wenku.baidu.com/view/6e7634050740be1e650e9a7b.html?re=view