Miller-Rabin素数测试算法
\(Miller-Rabin\)素数测试
用途
判断整数\(n\)是否是质数,在\(n\)较小的情况下,可以使用试除法,时间复杂度为\(O(\sqrt n)\)。但当\(n\)的值较大的时候,朴素的试除法已经不能在规定时间内解决问题。此时,我们可以用\(Miller-Rabin\)素数测试算法,时间复杂度可以降低至\(O(\log_2n)\)。
引理
费马小定理
若\(a,p \in \mathbb{Z}\),\(p\)为质数,则
\]
在此不给出证明。
二次探测定理
描述
若\(a,p \in \mathbb{Z}\),\(a^{2} \equiv 1(mod\;p)\),\(p\)为质数,则\(a \equiv 1(mod\;p)\)或\(a \equiv p-1(mod\;p)\)。
证明
&\because a^{2} \equiv 1(mod\;p)\\
&\therefore p \mid (a^{2}-1)\\
&\therefore p \mid (a+1)(a-1)\\
&\because p为质数\\
&\therefore p \mid (a+1) 或(a-1)\\
&\therefore a+1 \equiv 0(mod\;p)或a-1 \equiv 0(mod\;p)\\
&\therefore a \equiv 1 (mod\;p)或a \equiv p-1 (mod\;p)\\
\end{aligned}
\]
过程
根据费马小定理,我们可以得到一个真命题:若\(p\)为质数,则\(a^{p-1} \equiv 1(mod\;p)\)。我们考虑这一命题的逆命题:若\(a^{p-1} \equiv 1\),则\(p\)为质数。我们会惊讶地发现,这一逆命题在大多数情况下竟然成立。也就是说,我们得到了一种有效地判断质数的方法,即取一个底数\(a\),判断它与所需判断的数\(p\)是否满足这一等式。尽管有时可能出错,但这一算法的效率相比起朴素算法来说有了很大的提升。
接下来我们要做的就是提高这一算法的正确性。首先想到的自然是取多个\(a\)值,在常见的题目中,取\([2,29]\)大概就能通过测试,当然也可以随机生成,注意\(a\)的值应该小于\(p\)。第二个优化是基于二次探测定理的。设\(p=2^nm+1\),则可先算出\(a^m\),然后再平方\(n\)次,求得\(a^{p-1}\)。在这一过程中,若某次平方后所得的结果为\(1\)但上次平方后的结果不等于\(p-1\)或\(1\),就出现了矛盾,从而就不满足\(p\)为质数这一前提。最后再次判断是否满足等式即可。
注意乘法可能越界,应拆成类似快速幂的算法。
代码
const int prime[10]={2,3,5,7,11,13,17,19,23,29};
long long multi(long long a,long long b,long long p)
{
long long t=0;
while(b)
{
if(b&1)
t=(t+a)%p;
a=(a<<1)%p;
b>>=1;
}
return t;
}
long long power(long long a,long long b,long long p)
{
long long t=1;
while(b)
{
if(b&1)
t=multi(t,a,p);
a=multi(a,a,p);
b>>=1;
}
return t;
}
bool Miller_Rabin(long long x)
{
if(x==2)
return true;
if(!(x&1)||x<2)
return false;
long long t=x-1,exponent=0;
while(!(t&1))
{
t>>=1;
++exponent;
}
for(int i=0;i<10&&prime[i]<x;++i)
{
long long m=power(prime[i],t,x);
for(int j=0;j<exponent;++j)
{
long long n=multi(m,m,x);
if(n==1&&m!=1&&m!=x-1)
return false;
m=n;
}
if(m!=1)
return false;
}
return true;
}
Miller-Rabin素数测试算法的更多相关文章
- POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- HDU1164_Eddy's research I【Miller Rabin素数测试】【Pollar Rho整数分解】
Eddy's research I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- POJ2429_GCD & LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...
- Miller-Rabin素数测试算法(POJ1811Prime Test)
题目链接:http://poj.org/problem?id=1811 题目解析:2<=n<2^54,如果n是素数直接输出,否则求N的最小质因数. 求大整数最小质因数的算法没看懂,不打算看 ...
- POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- 素数测试算法(基于Miller-Rabin的MC算法) // Fermat素数测试法
在以往判断一个数n是不是素数时,我们都是采用i从2到sqrt(n)能否整除n.如果能整除,则n是合数;否则是素数.但是该算法的时间复杂度为O(sqrt(n)),当n较大时,时间性能很差,特别是在网络安 ...
- Miller Rabin素数检测
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #inclu ...
- Miller-Rabbin随机性素数测试算法
//**************************************************************** // Miller_Rabin 算法进行素数测试 //速度快,而且 ...
随机推荐
- CF241B Friends
CF241B Friends 和Tree and Xor思路一样CF1055F Tree and XOR 直接找到第k大val,可以直接建出trie,然后按位贪心 考虑比val大的数的和 还是用b[i ...
- Apply,Call,bind对比
apply.call call和apply都是为了改变上下文背景存在的,即改变函数内部指向 javascript一大特点是函数存在定义时的上下文,运行时的上下文和上下文可改变的概念 apply.cal ...
- JavaScript中的forEach
语法:array.forEach(callbackfn[, thisArg]) 参数说明: array1 必需. 一个数组对象. callbackfn 必需. 一个接受最多三个参数的函数. 对 ...
- Linux 内核USB 接口配置
USB 接口是自己被捆绑到配置的. 一个 USB 设备可有多个配置并且可能在它们之间转换 以便改变设备的状态. 例如, 一些允许固件被下载到它们的设备包含多个配置来实现这个. 一个配置只能在一个时间点 ...
- CAS5.3 单点登录/登出/springboot/springmvc
环境: jdk:1.8 cas server:5.3.14 + tomcat 8.5 cas client:3.5.1 客户端1:springmvc 传统web项目(使用web.xml) 客户端2:s ...
- Python15_包的安装和管理
pip的安装及简单使用:https://www.cnblogs.com/csucat/p/4897695.html 使用pip手动安装第三方库:https://blog.csdn.net/github ...
- IIS 6和IIS 7 中设置文件上传大小限制设置方法,两者是不一样的
在IIS 6.0中设置文件上传大小的方法,只要设置httpRuntime就可以了 <system.web> <httpRuntime executionTimeout="3 ...
- VRChat之blender教程
推荐先看:VRChat模型制作及上传总篇(包含总流程和所需插件):https://www.cnblogs.com/raitorei/p/12015876.html 0.设置中文,安装cat插件 注意 ...
- 网络OSI七层架构与TCP四层架构的应用与区别
1.OSI七层网络模型介绍 OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型 ,是一个逻辑上的定义,一个规范,它把网络从逻辑上分为了 ...
- 【题解】[HAOI2018]染色(NTT+容斥/二项式反演)
[题解][HAOI2018]染色(NTT+容斥/二项式反演) 可以直接写出式子: \[ f(x)={m \choose x}n!{(\dfrac 1 {(Sx)!})}^x(m-x)^{n-Sx}\d ...