大数质因解:浅谈Miller-Rabin和Pollard-Rho算法
所以,一个简单的策略如下:
- 在区间[2,N-1]中随即选取n个数,x1,x2, … … , xn
- 判断是否存在gcd(|xi-xj| ,N) >1, 若存在,gcd(|xi-xj| ,N) 是N的一个因子 (c 或 d)
int find_factorplus(int N) {
a = ;
for( int i= ; i <= ; i++ ) {
b = f(a);
p = GCD( abs( b - a ) , N);
if( p > ) return p;//Found factor: p
a = b;
}
return ;//Failed. :-(
}
似乎很玄学,但是实际效果确实很棒。但不好的是,伪随机数有着玄学般的循环节。
int find_factorplus(int N) {
a = ;
b = a;
do {
a = f(a);//a runs once
b = f(f(b));//b runs twice as fast
p = GCD( abs( b - a ) , N);
if( p > ) return p;//Found factor: p
} while( b != a );
return ;//Failed. :-(
}
这样,我们就可以把退出条件温和化,只要发现有环,那就只有退出了。而不是暴力地把i从1 for 到 1,000,000。
如果算法失败了,我们只需要找到一个新的伪随机函数f(x)或是一个新的a就好了。不过请放心,大多数时候你并不会失败。
最后说一下,代码中a的初值是2,在实际生活中,你并不需要那么讲究,rand()一个也是不错的选择。
“最后”的POLLARD RHO:当与Miller-Rabin发生反应
我们可以发现pollard rho直到现在都还没有与Miller-Rabin有任何联系,但马上就不是了。
对于pollard rho,它可以在Θ(sqrt(p))的时间复杂度内找到N的一个小因子p,这一点我们曾论证过。可见,如果N的因子很多、因子值很小的整数N来说,效率是很优异的。
但是,如果反过来呢?如果说N是大整数,恰好因子很少、因子值很大?
例如,N=2*p,p为质数。你立马发现,N有一个因子2,然后你试图去解决p。然后,这个很优秀的算法成了根号算法。而且直到最后,你都很难判断这个p是否真的不可约。
但是,一旦拥有Miller-Rabin,一切便都已解决。
我们现在可以分析一下复杂度。N的质因子中,超过sqrt(N)的有且仅有一个。这样,即使运气极差,也能有相当的保障。
!!最后总结一下!!
斯堪福说,总结是好习惯。
对于Miller Rabin,我们需要一个快速幂,一个快速乘。先用2,3,5,7,11,13粗筛一遍,再将p的2抽尽,然后随机地选取一些数进行二次探测与费马小定理检验。
对于Pollard Rho,我们需要一个伪随机函数f,一个常数a,一个gcd,一个abs。使用floyd判圈算法。找到一个因子后递归解决,中间判断是否是质数。如果是,做记录。
当我们在做大数质因子分解时,质因子记录完毕后,我们常常会发现这是无序的。这就需要进行一下排序,然后离散化处理出每个质因子出现的次数。这样就解决了。就真的解决了。
大数质因解:浅谈Miller-Rabin和Pollard-Rho算法的更多相关文章
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1044 Solved: 322[Submit][ ...
- Pollard Rho算法浅谈
Pollard Rho介绍 Pollard Rho算法是Pollard[1]在1975年[2]发明的一种将大整数因数分解的算法 其中Pollard来源于发明者Pollard的姓,Rho则来自内部伪随机 ...
- 浅谈DFS,BFS,IDFS,A*等算法
搜索是编程的基础,是必须掌握的技能.--王主任 搜索分为盲目搜索和启发搜索 下面列举OI常用的盲目搜索: 1.dijkstra 2.SPFA 3.bfs 4.dfs 5.双向bfs 6.迭代加深搜索( ...
- 计蒜客 18487.Divisions-大数的所有因子个数-Miller_Rabin+Pollard_rho-超快的(大数质因解+因子个数求解公式) (German Collegiate Programming Contest 2015 ACM-ICPC Asia Training League 暑假第一阶段第三场 F)
这一场两个和大数有关的题目,都用到了米勒拉宾算法,有点东西,备忘一下. 题目传送门 F. Divisions 传送门 这个题是求一个数的所有因子个数,但是数据比较大,1e18,所以是大数的题目,正常的 ...
- MMORPG战斗系统随笔(二)、浅谈场寻路Flow Field PathFinding算法
转载请标明出处http://www.cnblogs.com/zblade/ 今天给大家带来一篇游戏中寻路算法的博客.去年,我加入一款RTS的游戏项目,负责开发其中的战斗系统,战斗系统的相关知识,属于游 ...
- 浅谈双流水线调度问题以及Jhonson算法
引入:何为流水线问题 有\(n\)个任务,对于每个任务有\(m\)道工序,每个任务的\(m\)道工序必须在不同的m台机器上依次完成才算把这个任务完成,在前\(i-1\)道工序完成后才能去完成第\(i\ ...
- 【转】浅谈对主成分分析(PCA)算法的理解
以前对PCA算法有过一段时间的研究,但没整理成文章,最近项目又打算用到PCA算法,故趁热打铁整理下PCA算法的知识.本文观点旨在抛砖引玉,不是权威,更不能尽信,只是本人的一点体会. 主成分分析(PCA ...
- 关于素数:求不超过n的素数,素数的判定(Miller Rabin 测试)
关于素数的基本介绍请参考百度百科here和维基百科here的介绍 首先介绍几条关于素数的基本定理: 定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子 定理2:如果n不是 ...
随机推荐
- MongoDB在已有账号的实例下还原数据库报错的分析(error applying oplog)
一. 背景 今天在MongoDB 4.0.4版本下,在还原恢复数据库时报错. 主要错误为: Failed: restore error: error applying oplog: applyOps: ...
- AngularJS学习之旅—AngularJS 控制器(六)
1.AngularJS 控制器 AngularJS 应用程序被控制器控制. ng-controller 指令定义了应用程序控制器. 控制器是 JavaScript 对象,由标准的 JavaScript ...
- 安卓(Android)开发基础知识
.aar文件 .aar是一种压缩文件,和.jar类似,不过它可以包含资源文件,例如图片.drawable.xml资源 .jar文件 在软件领域,JAR文件(Java归档,英语:Java ARchive ...
- git执行cherry-pick时修改提交信息
git执行cherry-pick时修改提交信息 在本地分支执行cherry-pick命令时有时需要修改commit message信息,可以加参数-e实现: git cherry-pick -e co ...
- Linix基本命令
基本命令关机:shutdown -h halt init 0 poweroff重启:shutdown -r reboot init 6pwd:查看工作目录ls:查看指定目录的内容-l:列表显示-a:显 ...
- 【PAT】B1018 锤子剪刀布
抄的柳婼小姐姐的,感觉三个数求最大那里用的真棒 #include <stdio.h> int main() { int N; scanf("%d", &N); ...
- 雨后清风教你如何在Windows 7中对硬盘进行分区
磁盘分区是将硬盘驱动器分成多个逻辑单元.人们通常不会选择对硬盘进行分区,但它有很多好处.主要是,通过对磁盘进行分区,您可以将操作系统与数据分开,从而减少数据损坏的可能性. 磁盘分区方法 打开“计算机管 ...
- LV 指定或修改逻辑卷的major, minor号[RHEL6]
在创建逻辑卷时,可以指定逻辑卷的major和minor设备号. [-M|--persistent {y|n}] //Set to y to make the minor number specifie ...
- spark-2.4.0-hadoop2.7-简单操作
1. 说明 本文基于:spark-2.4.0-hadoop2.7-高可用(HA)安装部署 2. 启动Spark Shell 在任意一台有spark的机器上执行 # --master spark://m ...
- 专治编译器编辑器vscode中文乱码输出 win10 配置系统默认utf-8编码
VS Code输出会出现乱码,很多人都遇到过.这是因为VS Code内部用的是utf-8编码,cmd/Powershell是gbk编码.直接编译,会把“你好”输出成“浣犲ソ”.如果把cmd的活动代码页 ...