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

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

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与二次探测的更多相关文章

  1. Miller Rabbin 算法—费马定理+二次探测+随机数 (讲解+例题:FZU1649 Prime number or not)

    0.引入 那年,机房里来了个新教练, 口胡鼻祖lhy 第一节课,带我们体验了暴力的神奇, 第二节课,带我们体验了随机数的玄妙, -- 那节课,便是我第一次接触到Miller Rabbin算法, 直到现 ...

  2. 【数论】Prime Time UVA - 10200 大素数 Miller Robin 模板

    题意:验证1~10000 的数 n^n+n+41 中素数的个数.每个询问给出a,b  求区间[a,b]中质数出现的比例,保留两位 题解:质数会爆到1e8 所以用miller robin , 另外一个优 ...

  3. java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区

    java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测).链地址法.再哈希.建立公共溢出区 标签: hashmaphashmap冲突解决冲突的方法冲突 2016-0 ...

  4. Hash二次探测

    Hash的二次探测,当hash的长度为n:插入val,当Hash[val]不为0时,选择新地址newval = val +(-) 1*1,val+(-)2*2,val+(-)(n-1)*(n-1); ...

  5. PAT 甲级 1078 Hashing (25 分)(简单,平方二次探测)

    1078 Hashing (25 分)   The task of this problem is simple: insert a sequence of distinct positive int ...

  6. Miller Robin大素数判定

    Miller Robin算法 当要判断的数过大,以至于根n的算法不可行时,可以采用这种方法来判定素数. 用于判断大于2的奇数(2和偶数需要手动判断),是概率意义上的判定,因此需要做多次来减少出错概率. ...

  7. PAT-1145(Hashing - Average Search Time)哈希表+二次探测解决冲突

    Hashing - Average Search Time PAT-1145 需要注意本题的table的容量设置 二次探测,只考虑正增量 这里计算平均查找长度的方法和书本中的不同 #include&l ...

  8. Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区

    最近时间有点紧,暂时先放参考链接了,待有时间在总结一下: 查了好多,这几篇博客写的真心好,互有优缺点,大家一个一个看就会明白了: 参考 1. 先看这个明白拉链法(链地址法),这个带源码,很好看懂,只不 ...

  9. Miller Rabin算法详解

    何为Miller Rabin算法 首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:) Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重 ...

随机推荐

  1. Linux 磁盘与文件系统(EXT2)简介

    Linux 中,一切(或几乎一切)都是文件. 一.Linux 磁盘分区与文件系统 1.1 磁盘分区 磁盘的分区主要分为主分区和扩展分区 1)主分区:总共最多只能有四个主分区: 2)扩展分区:只能有一个 ...

  2. 第十二次ScrumMeeting博客

    第十二次ScrumMeeting博客 本次会议于11月30日(四)22时整在3公寓725房间召开,持续35分钟. 与会人员:刘畅.辛德泰.张安澜.赵奕.方科栋. 1. 每个人的工作(有Issue的内容 ...

  3. Set up classpath in Eclipse

    On Eclipse main window Right click on .java file-> Run As -> Run Configurations... On Run Conf ...

  4. Invalid bound statement (not found): com.example.managerdemo.mapper.SingleTableMapper.selectAllValuesByConditionsNoPage

    报Invalid bound statement (not found): com.example.managerdemo.mapper.SingleTableMapper.selectAllValu ...

  5. 1、数据库与excel表格的数据导入导出

    1.居民用户界面中,excel数据导入导出: 2.其他5张表数据显示到本角色主页的container容器中.

  6. eclipse异常关闭,而Tomcat然在运行解决方法

    1.eclipse异常关闭,而Tomcat然在运行,再启动tomcat会出现端口冲突 解决方法:打开任务管理器,找到javaw.exe,点击关闭,就可以了

  7. beat冲刺(7/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(7/7) 后敬甲(组长) 过去两天完成了哪些任务 ppt制作 视频拍摄 接下来的计划 准备答辩 还剩下哪些 ...

  8. struts2 jsp提交对象数据要这么干

    不要每个属性都 setter getter .. 这样页面很难看... 直接 把对象变成一个成员变量会比较好. Java code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  9. 简单 dp

    1.摆花问题 题目描述小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过a ...

  10. Python fullstack系列【1】:初识Python

    Python简介 Python的前世今生: Python诞生于1989年的圣诞节期间,其作者是吉多·范罗苏姆(Guido van Rossum).当时Guido(江湖人称龟叔)在阿姆斯特丹度假时着手开 ...