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算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重 ...
随机推荐
- 高可用OpenStack(Queen版)集群-15.Glance&Cinder集成Ceph
参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...
- 下一代的DevOps服务:AIOps
AIOps是一个总称,用于指代使用复杂的基础设施管理软件和云解决方案监控工具来实现自动化数据分析和日常的DevOps操作. 那些10年前甚至是5年前构建的系统监控工具的主要缺陷是它们不是为了满足大数据 ...
- linux 安装配置zookeeper脚本
#!/bin/bash # automatic install zookeeper echo "========= Start to install zookeeper ========== ...
- bg,fg,job命令详解
基础命令学习目录首页 原文链接:http://www.cnblogs.com/chjbbs/p/6307333.html linux提供的fg和bg命令,可以让我们轻松调度正在运行的任务 假如你发现前 ...
- Redux 入门教程(一):基本用法
转自http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_one_basic_usages.html(仅供个人学习使用) 首先明确一点, ...
- object-oriented second work
work request github enter 这次作业做过,不过以前是用数组写的,当我用双向链表写这题时,刚交上去一直出错,后面我又改了改,最后一点一致凑,后面有同学告诉我在构建链表后要判断链表 ...
- spring冲刺阶段之团队工作总结
一.小组成员: 王俊凯(项目经理) 罗林杰(产品负责人) 王逸辉(Master) 罗凯杰 二.任务分配情况 王俊凯:生成题目的代码编写并提出编写意见 罗林杰:负责把按钮和界面内容连接到代码上及主要代码 ...
- Unity3D游戏开发——访问集中式共享模块的设计模式
什么是设计模式 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.设计模式是开发人员在开发过程中面临的一般问题的解决方案,这些解决方案是众多开发人 ...
- iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件上传
官方建议AFN的使用方法 0.导入框架准备工作 •1. 将AFNetworking3.0+框架程序拖拽进项目 •2. 或使用Cocopod 导入AFNetworking3.0+ •3. 引入 ...
- printf in KEIL C51
转自:http://blog.csdn.net/it1988888/article/details/8821713 在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化 ...