Miller-Robin与二次探测
素数在数论中经常被用到。也是数论的基础之一。
人们一直在讨论的问题是,怎样快速找到素数?或者判断一个数是素数?
1.根号n枚举
原始暴力方法。
2.埃氏筛
每个合数会被筛质因子次数次。复杂度O(NloglogN)
3.线性筛素数
每个合数只会被它的最小质因子筛一次。
线性筛还可以筛各种函数
具体见:SIEVE 线性筛
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<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=+;
int a[]={,,};
ll qm(ll x,ll y,ll mod){
ll ret=;
while(y){
if(y&) (ret*=x)%=mod;
(x*=x)%=mod;
y>>=;
}
return ret;
}
bool che(ll a,ll x){
int s=;
ll t;
ll lp=x-;
while(!(lp&)){
s++;
lp>>=;
}
t=qm(a,lp,x);
if(t==||t==x-) return true;
if(s==) return false;
ll las=t;
for(int i=;i<s;i++){
las=t;
(t*=t)%=x;
if(t==&&(las!=&&las!=x-)) return ;
}
if(t!=) return ;
return ;
}
int n,m;
bool M_R(ll n){
if(n==||n==||n==) return true;
if(n<||n%==||n%==||n%==) return false;
for(int i=;i<;i++){
ll b=a[i];
if(b!=n){
if(!che(b,n)) return false;
}
}
return true;
}
int main(){
scanf("%d%d",&n,&m);
ll x;
for(int i=;i<=m;i++){
scanf("%lld",&x);
if(x==||x==||x==||x==||x==||x==){
puts("Yes");continue;
}
if(x%==||x%==||x%==||x%==||x%==||x%==){
puts("No");continue;
}
if(M_R(x)) puts("Yes");
else puts("No");
}
return ;
} /*
Author: *Miracle*
Date: 2018/9/24 20:50:22
*/
Miller-Robin与二次探测的更多相关文章
- Miller Rabbin 算法—费马定理+二次探测+随机数 (讲解+例题:FZU1649 Prime number or not)
0.引入 那年,机房里来了个新教练, 口胡鼻祖lhy 第一节课,带我们体验了暴力的神奇, 第二节课,带我们体验了随机数的玄妙, -- 那节课,便是我第一次接触到Miller Rabbin算法, 直到现 ...
- 【数论】Prime Time UVA - 10200 大素数 Miller Robin 模板
题意:验证1~10000 的数 n^n+n+41 中素数的个数.每个询问给出a,b 求区间[a,b]中质数出现的比例,保留两位 题解:质数会爆到1e8 所以用miller robin , 另外一个优 ...
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测).链地址法.再哈希.建立公共溢出区 标签: hashmaphashmap冲突解决冲突的方法冲突 2016-0 ...
- Hash二次探测
Hash的二次探测,当hash的长度为n:插入val,当Hash[val]不为0时,选择新地址newval = val +(-) 1*1,val+(-)2*2,val+(-)(n-1)*(n-1); ...
- PAT 甲级 1078 Hashing (25 分)(简单,平方二次探测)
1078 Hashing (25 分) The task of this problem is simple: insert a sequence of distinct positive int ...
- Miller Robin大素数判定
Miller Robin算法 当要判断的数过大,以至于根n的算法不可行时,可以采用这种方法来判定素数. 用于判断大于2的奇数(2和偶数需要手动判断),是概率意义上的判定,因此需要做多次来减少出错概率. ...
- PAT-1145(Hashing - Average Search Time)哈希表+二次探测解决冲突
Hashing - Average Search Time PAT-1145 需要注意本题的table的容量设置 二次探测,只考虑正增量 这里计算平均查找长度的方法和书本中的不同 #include&l ...
- Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
最近时间有点紧,暂时先放参考链接了,待有时间在总结一下: 查了好多,这几篇博客写的真心好,互有优缺点,大家一个一个看就会明白了: 参考 1. 先看这个明白拉链法(链地址法),这个带源码,很好看懂,只不 ...
- Miller Rabin算法详解
何为Miller Rabin算法 首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:) Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重 ...
随机推荐
- Django_rest_framework_版本(待验证)
简介 API版本控制可以用来在不同的客户端使用不同的行为.REST框架提供了大量不同的版本设计. 版本控制是由传入的客户端请求决定的,并且可能基于请求URL,或者基于请求头. 有许多有效的方法达到版本 ...
- vue入门之单文件组件
介绍 在很多 Vue 项目中,我们使用 Vue.component 来定义全局组件,紧接着用 new Vue({ el: '#container '}) 在每个页面内指定一个容器元素. 这种方式在很多 ...
- “Hello World!”团队第五周第七次会议
博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.checkout&push代码 一.会议时间 2017年11月16日 ...
- Android开发--第一个活动
一.创建工程 1 项目名:MyActivity 包名:com.iflytek.myactivity 2 为了便于学习,不勾选Create Activity.然后finish,工程创建完成 END ...
- 30行js让你的rem弹性布局适配所有分辨率(含竖屏适配)(转载)
用rem来实现移动端的弹性布局是个好主意!用法如下: CSS @media only screen and (max-width: 320px), only screen and (max-devic ...
- 修改shell命令的history记录个数
修改history记录的命令如下所示:# vi /etc/profile 找到histsize=1000,将其改为histsize=100(这条可根据实际情况而定). 不重启系统就可让其生效,如下所示 ...
- PAT 甲级 1137 Final Grading
https://pintia.cn/problem-sets/994805342720868352/problems/994805345401028608 For a student taking t ...
- IDEA2018 license
2018-06-01更新 更新了webstorm 3.2之后发现居然又不能用了,现用 http://idea.congm.in 可以激活 新增一个 http://idea.toocruel.net
- windows下python3.6安装pycryto or crypto or pycryptodome与使用
pycrypto,pycrytodome和crypto是一个东西,在很久以前,crypto在python上面的名字是pycrypto它是一个第三方库,但是已经停止更新三年了,所以不建议安装这个库: w ...
- Excel中用REPT函数制作图表
本文从以下七个方面,阐述在Excel中用REPT函数制作图表: 一. 图形效果展示 二. REPT语法解释 三. REPT制作条形图 四. REPT制作漏斗图 五. REPT制作蝴蝶图 六. REPT ...