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 算法进行素数测试 //速度快,而且 ...
随机推荐
- H3C 查看设备路由表
- H3C 路由表查找规则(3)
- P1020 从大到小排序
题目描述 给你n个整数,请你按照从大到小的顺序输出它们. 输入格式 输入的第一行包含一个整数 \(n(1 \le n \le 10^3)\) ,用于表示元素的个数. 输入的第二行包含 \(n\) 个整 ...
- 2019-5-21-NuGet-符号服务器
title author date CreateTime categories NuGet 符号服务器 lindexi 2019-05-21 11:34:40 +0800 2019-05-08 21: ...
- linux flags 参数
记住 kmalloc 原型是: #include <linux/slab.h> void *kmalloc(size_t size, int flags); 给 kmalloc 的第一个参 ...
- Arcgis api for javascript学习笔记(3.2版本) - 匀速行驶轨迹动画效果
一.前言 有这样一个需求:已知某条线上的n个点的经纬度数组 ,实现物体运行轨迹. 如果这些点中两个距离很近,那么我们可以用一个定时器在地图上每次重新画一个点,这样肉眼看到这个点上的运动效果,如下图代码 ...
- Java 学习笔记(6)——继承
之前说过了Java中面向对象的第一个特征--封装,这篇来讲它的第二个特征--继承.一般在程序设计中,继承是为了减少重复代码. 继承的基本介绍 public class Child extends Pa ...
- 通过Servlet生成验证码图片(转)
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- Python之time模块和datatime模块
import time time.sleep(5) #休眠 time.time() #返回系统时间戳 utc时间秒数 time.ctime() #返回字符串时间格式,也可以传入参数转换为字符串时间ti ...
- 第二阶段:2.商业需求分析及BRD:6.商业需求文档2
BRD的三个诉求:1.项目很重要,支持.2.有价值,获得重视,纳入战略规划中.3.需要资源,横向的协调资源. 方法:知道决策层是哪些组成,同时找到合适的决策层. BRD决策分类:1.找资本类(CF ...