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 算法进行素数测试 //速度快,而且 ...
随机推荐
- SpringBoot2.X 项目使用外置绝对路径的配置文件
spring-boot-absolute-config 前言 该工程是为解决应用部署应用时指定配置文件存放位置的问题. SpringBoot项目默认加载以下位置的配置文件: ? 1 2 3 4 cla ...
- 2018-11-8-WPF-获取下载内容长度
title author date CreateTime categories WPF 获取下载内容长度 lindexi 2018-11-08 20:18:15 +0800 2018-11-08 20 ...
- Less 语法快速入门
Less 语法快速入门 Less 是一门 CSS 预处理语言其可以运行在 Node 或浏览器端. 它将传统的 css 样式结构单一的排版顺序进行了优化,让我们可以通过层级嵌套的方式将 css 类名与H ...
- I/O 端口和 I/O 内存
每个外设都是通过读写它的寄存器来控制. 大部分时间一个设备有几个寄存器, 并且在连 续地址存取它们, 或者在内存地址空间或者在 I/O 地址空间. 在硬件级别上, 内存区和 I/O 区域没有概念上的区 ...
- Java零散记录
接口不能被实例化,所以其成员变量必须为不可修改的,就是常量.
- 2019-6-23-win10-uwp-应用放到桌面
title author date CreateTime categories win10 uwp 应用放到桌面 lindexi 2019-06-23 11:11:30 +0800 2019-06-2 ...
- $Poj1821\ Fence\ $单调队列优化$DP$
Poj Acwing Description 有N块木板等待被M个工匠粉刷,每块木板至多被刷一次.第i个工匠要么不粉刷,要么粉刷包含木块Si的,长度不超过Li的连续的一段木板,每粉刷一块可以得到P ...
- Markdown破解及汉化
首先,附上用到的资源链接: 链接:https://pan.baidu.com/s/1ULvvCPcCv_P3KyD9ajXUjQ 提取码:5fkb 第一步 直接解压就可以,解压后运行该程序,会出现下图 ...
- centos下MySQL登录1045问题解决
由于需要在centos下部署整个应用,自然少不了对数据库的操作.但很多人可能会遇到一些问题,比如创建用户成功,但是却无法登录. 无法登陆一般就两个原因.第一,远程访问端口没开,第二个原因就是密码错误了 ...
- 「Luogu P3183」[HAOI2016]食物链 解题报告
身为一个蒟蒻,由于刷不过[NOI2001]食物链 于是出门左转写了道另一道假的食物链 戳这里 这里的食物链个条数其实就是有向图的路径数(应该是这么说吧,我弱) 思路: 拓扑(Topulogy)(一本正 ...