与数论的厮守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) 电子密码 ...
随机推荐
- [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors
[Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...
- redis 集群搭建碰到的问题
make PREFIX=/usr/local/redis install把编译好的redis 安装到指定目录下. redis.conf文件从源码目录拷贝到/usr/local/redis(安装目录)下 ...
- 图解JAVA参数传递
今天做项目,发现了一个问题,当String作为参数传递的时候,在函数内部改变值对外部的变量值无影响,如下代码: public static void main(String[] args) { Str ...
- SFTP工具类
1.SFTP搭建方法: 地址: http://www.jb51.net/article/101405.htm https://blog.csdn.net/helloloser/article/deta ...
- 在windows上搭建SSH服务踩过的坑
前两天安装了windows操作系统,想在windows上做内网穿透,所以就想在windows下启用ssh服务,今天就来讲一下我在搭建ssh服务中遇到的坑. 我显示在Mac下搭建了ssh服务,并且测试通 ...
- 提高MySQL数据库的安全性
1. 更改默认端口(默认3306) 可以从一定程度上防止端口扫描工具的扫描 2. 删除掉test数据库 drop database test; 3. 密码改的复杂些 # 1 set password ...
- timer计算两个方法执行时间
>>> from timeit import Timer >>> Timer("temp = x; x = y; y = temp", &quo ...
- linux下GPRS模块使用AT命令实现拨接电话,发中英文短信
开发板 :fl2440 cpu : s3c2440(arm9) 开发模块 :A7(GPRS/GPS) 远程登陆软件:PUTTY **** ...
- Win10上使用VS2015编译Caffe2
Caffe2的官网:https://caffe2.ai/ 1.下载.安装及相关准备 在Caffe2的官网点击"Get Started",即进入安装说明页面.官方还未提供编译好的bi ...
- PHP合并数组及去重
本文介绍的是一维数组的去重 合并数组的方法 array_merge: 数字键,直接往后添加,key重置 字符串键,后面的数组的值会替代前面的值 +: 数字键,后面的数组的值不会替代前面的值 字符串键, ...