博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Miller-Rabin与二次探测
阅读量:7180 次
发布时间:2019-06-29

本文共 1421 字,大约阅读时间需要 4 分钟。

素数在数论中经常被用到。也是数论的基础之一。

人们一直在讨论的问题是,怎样快速找到素数?或者判断一个数是素数?

1.根号n枚举

原始暴力方法。

2.埃氏筛

每个合数会被筛质因子次数次。复杂度O(NloglogN)

3.线性筛素数

每个合数只会被它的最小质因子筛一次。

线性筛还可以筛各种函数

具体见:

4.Miller_Rabin

利用:二次探测,费马小定理。

二测探测:

若P是质数,那么若x^2=1 mod P,则,x=1或者P-1

证明:即x^2-1 = 0 mod P,P|(x-1)*(x+1)

由于P是质数,所以一定是在(x-1)或者(x+1)里面存在P的质因子。

所以,有P|(x-1)或者P|(x+1),所以,x=1,或者,x=-1=P-1

如果有x^2=1 mod P,但是不满足x=1或者x=P-1,那么这个P一定不是素数。

 

费马小定理:

对于质数P,任意整数a(a!=P) 都有,a^(P-1)=1 mod P

这个也可以作为质数的判定条件。存在一个a不满足P一定也不是质数,。

 

把这两个结合起来,就可以进行Miller_Robin算法了。

 

具体地:

1.传入一个数n,lp=n-1

再传入一个随机数a,但是一般是质数,如2,3,5,7,61,等等

2.把lp中的所有质因子2都提出来,提出来之后的数设为d,s记录2的次数。

3.令$t=a^d mod n$,如果t==1或者t==n-1那么返回true

因为,再把s都乘回去的时候,一定会得到$a^{n-1}=1 mod n$

其实s为0,也可以直接返回false,因为n一定就是一个偶数了。

4.然后不断把s往回乘,其实是平方,因为d在指数的位置。

记录平方之前的数las,之后,如果t==1而las!=1并且las!=n-1那么就返回false

(根据二次探测)

5.s乘完后,如果n是质数,那么t=1,(根据费马小定理)。否则返回false

6.是true的话,返回1多试几次。

7.输出结果。

 据说试1次,误判概率为1/4,那么试4次误判的概率就是1/(4^4)很小了。

 

模板:

luoguP3383(用Miller_Rabin过线性筛)

 

#include
using namespace std;typedef long long ll;const int N=100000+5;int a[3]={
2,7,61};ll qm(ll x,ll y,ll mod){ ll ret=1; while(y){ if(y&1) (ret*=x)%=mod; (x*=x)%=mod; y>>=1; } return ret;}bool che(ll a,ll x){ int s=0; ll t; ll lp=x-1; while(!(lp&1)){ s++; lp>>=1; } t=qm(a,lp,x); if(t==1||t==x-1) return true; if(s==0) return false; ll las=t; for(int i=0;i

 

转载于:https://www.cnblogs.com/Miracevin/p/9697260.html

你可能感兴趣的文章
C Python类型互换
查看>>
Chapter 2 Open Book——9
查看>>
如何在Nginx下配置PHP程序环境
查看>>
iOS:城市级联列表的使用
查看>>
elk安装(这个是初级的可以把这个套件安上)
查看>>
thinkphp验证码(总结之后,效率非常好)
查看>>
网络流量分析——NPMD关注IT运维、识别宕机和运行不佳进行性能优化。智能化分析是关键-主动发现业务运行异常。科来做APT相关的安全分析...
查看>>
.NET接入UnionPay银联支付(一)手机wap支付
查看>>
Java多线程-工具篇-BlockingQueue
查看>>
js中动态创建json,动态为json添加属性、属性值的实例
查看>>
使用Qemu运行Ubuntu文件系统(1)
查看>>
红黑树
查看>>
2018年10月小结(流水账) -- 1024程序员节快乐
查看>>
SpringBoot(八)配置logback日志
查看>>
单点登录 之 OAuth
查看>>
『流畅的Python』第15章:上下文管理器和else块
查看>>
windows环境下面批量新建文件夹
查看>>
MS CRM 2011 如何获得当前用户使用的界面语言
查看>>
敏捷个人俱乐部(北京)线下活动 开始报名了!
查看>>
IPMSG飞鸽传书——编译源代码的方法
查看>>