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

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

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. RAID系列技术详解

    1.RAID 0 RAID 0是把n个物理磁盘虚拟成一个逻辑磁盘,即形成RAID 0的各个物理磁盘会组成一个逻辑上连续,物理上也连续的虚拟磁盘.一级磁盘控制器(指使用这个虚拟磁盘的控制器,如果某台主机 ...

  2. 比较语义分割的几种结构:FCN,UNET,SegNet,PSPNet和Deeplab

    简介 语义分割:给图像的每个像素点标注类别.通常认为这个类别与邻近像素类别有关,同时也和这个像素点归属的整体类别有关.利用图像分类的网络结构,可以利用不同层次的特征向量来满足判定需求.现有算法的主要区 ...

  3. python实现简单线性回归

    之前推导了一元线性回归和多元线性回归,今天就用python来实现一下一元线性回归 先看下之前推导的结果   ,  第一种是用循环迭代的计算方法.这里的x,y是numpy中的array类型 def su ...

  4. M1阶段的开发过程的一些反思

    今天八组队伍都做了项目的展示,和他们相比,我们的团队项目是显得最单薄的了,这里面的原因很多,固然我们团队整体的实力 比较弱,但是我们在M1项目开发过程中的种种错误表现也是导致我们项目失利的重要原因.下 ...

  5. BugPhobia贡献篇章:团队贡献分值与转会确定

    0x01 :无言 0x02 :团队贡献分说明 (1202)冯志睿 54 (1156)李入云 43 (1188)李云涛 56 (1184)马腾跃 26 (1197)钱林琛 60 (1100)王鹿鸣 63 ...

  6. unix网络编程——TCP套接字编程

    TCP客户端和服务端所需的基本套接字.服务器先启动,之后的某个时刻客户端启动并试图连接到服务器.之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响应.该过程一直持续下去,直到客户端关闭,给服 ...

  7. sleep与信号唤醒的问题 & 内核对信号的处理方式 & udelay

    http://www.cnblogs.com/charlesblc/p/6277848.html 注意,sleep是会被信号唤醒的.   sleep函数:#include <unistd.h&g ...

  8. Ubuntu下面 PHPSTORM2017.2破解方法

    Ubuntu下面 PHPSTORM2017.2破解方法 下载破解文件 在 http://idea.lanyus.com/上面新下载一个破解文件. 破解步骤 将JetbrainsCrack-2.6.3_ ...

  9. excel文件怎么使用php进行处理

    1.可以通过phpmyadmin导入csv文件 2.也可以直接使用php 处理已经将excel另存为.csv后缀的文件, 通过php专门处理csv文件的函数 如 fgetcsv() <?php ...

  10. java实现hash一致性算法

    import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.StringUtils; import jav ...