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

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

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. go vendor 安装失败的原因分析

    安装之前的配置 export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin 1 2 安装 通常,我们查到的安装方法一般是下面这种 go get -u gi ...

  2. poweroff命令详解

    2019-02-17  基础命令学习目录首页   原文链接:https://www.cnblogs.com/Baron-Lu/p/6951297.html 在本篇中,我们会向你解释 shutdown. ...

  3. node child_process模块

    NodeJs是一个单进程的语言,不能像Java那样可以创建多线程来并发执行.当然在大部分情况下,NodeJs是不需要并发执行的,因为它是事件驱动性永不阻塞.但单进程也有个问题就是不能充分利用CPU的多 ...

  4. iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (以后谁不会了,直接将连接给他)

    iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (一有冲突要手把手教一遍,太麻烦了,现在总结下,以后谁不会了,连接直接发他). 关于xxx.xcodeproj 文件冲突的话,是比较 ...

  5. springmvc 映射重复

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springfr ...

  6. 关于地图首页会卡 button background惹的祸

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:sat=&q ...

  7. 团队作业2 <嗨,你的快递!>需求分析与原型设计

    哦,不,是你的快速(*_*) 第一部分 需求分析 1.1 用户调研 1.1.1调研对象:由于我们的系统是校园快递代取业务,面向的是大学生活,所以本次调研范围都是在校大学生(除了师大学生,也包括了外校的 ...

  8. 404 Note Found团队-项目UML设计

    目录 团队信息 分工选择 课上分工 课下分工 ToDolist alpha版本要做的事情 燃尽图 UML 用例图 状态图 活动图 类图 部署图 实例图 对象图 时序图 包图 通信图 贡献分评定 课上贡 ...

  9. Java join & yield

    Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程. yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会.因此,使用yie ...

  10. css border 制作三角形

    border 边框 上三角 是只有上面的border 有颜色,其余的边框都是tranparents,下三角只有下面的border 有颜色,其余的边框都是tranparents,左三角只有左面的bord ...