前言

\(MillerRabin\)素数测试是一种很实用的素数判定方法。

它只针对单个数字进行判定,因而可以对较大的乃至于\(long\ long\)范围内的数进行判定,而且速度也很快,是个十分优秀的算法。

前置定理

  • 费马小定理:\(a^{p-1}\equiv1(mod\ p)\)(详见此博客:费马小定理
  • 二次探测定理:若\(p\)为奇素数且\(x^2\equiv1(mod\ p)\),则\(x\equiv1(mod\ p)\)或\(x\equiv p-1(mod\ p)\)。

大致思路

假设我们要验证\(x\)是否为素数,则我们应先找一个质数\(p\)来对其进行测试(\(p\)可以选取多个依次进行测试,只要有一个不满足就可以确定其不是质数)。

首先,我们先判断如果\(x=p\),则\(x\)必为质数(因为\(p\)为质数)。如果\(x\)是\(p\)的倍数,则\(x\)必为合数。

然后,由于费马小定理,我们先测试\(p^{x-1}\%x\)是否等于\(1\),如果不是,则它必然不是质数(这一步也叫作费马测试)。

否则,我们根据二次探测定理,先用一个\(k\)记录下\(x-1\),然后只要\(k\)为偶数就持续操作:

  • 先将\(k\)除以\(2\),然后用一个\(t\)记录下\(p^k\%x\)的值。
  • 如果\(t\)不等于\(1\)且不等于\(p-1\),则根据二次探测定理,\(x\)非质数。
  • 如果\(t=p-1\),则无法继续套用二次探测定理,因此直接返回\(true\)。

如果一直操作到\(k\)为奇数仍然无法确定\(x\)非质数,就返回\(true\)。

这一过程应该还是比较容易理解的。

代码

class MillerRabin\\MR测试
{
private:
#define Pcnt 10
Con int P[Pcnt]={2,3,5,7,11,13,19,61,2333,24251};//用于测试的质数
I int Qpow(RI x,RI y,CI X) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}//快速幂
I bool Check(CI x,CI p)//测试
{
if(!(x%P[i])||Qpow(p%x,x-1,x)^1) return false;//判断x是否为p的倍数,然后费马测试
RI k=x-1,t;W(!(k&1))//持续操作直至k为奇数
{
if((t=Qpow(p%x,k>>=1,x))^1&&t^(x-1)) return false;//如果p^k不是1也不是-1,说明x不是质数
if(!(t^(x-1))) return true;//如果p^k已为-1,无法用二次探测定理,因此返回true
}return true;
}
public:
I bool IsPrime(CI x)//判断一个数是否为质数
{
if(x<2) return false;
for(RI i=0;i^Pcnt;++i) {if(!(x^P[i])) return true;if(!Check(x,P[i])) return false;}//枚举质数进行测试
return true;
}
}MR;

初学MillerRabin素数测试的更多相关文章

  1. Miller-Rabin素数测试算法(POJ1811Prime Test)

    题目链接:http://poj.org/problem?id=1811 题目解析:2<=n<2^54,如果n是素数直接输出,否则求N的最小质因数. 求大整数最小质因数的算法没看懂,不打算看 ...

  2. Miller-Rabin素数测试

    Miller-Rabin素数测试 给出一个小于1e18的数,问它是否为质数?不超过50组询问.hihocoder 我是真的菜,为了不误导他人,本篇仅供个人使用. 首先,一个1e18的数,朴素\(O(\ ...

  3. POJ Pseudoprime numbers( Miller-Rabin素数测试 )

    链接:传送门 题意:题目给出费马小定理:Fermat's theorem states that for any prime number p and for any integer a > 1 ...

  4. Miller-Rabin​素数测试算法

    \(Miller-Rabin\)​素数测试 用途 判断整数\(n\)是否是质数,在\(n\)较小的情况下,可以使用试除法,时间复杂度为\(O(\sqrt n)\).但当\(n\)的值较大的时候,朴素的 ...

  5. RSA,Miller-Rabin素数测试的源流及其证明

    一.RSA与公钥加密系统的起源与影响. 为了更好地突出公钥加密系统相对私钥加密系统的优势,让我们从这两个问题开始: 这个世界上如果没有公钥加密系统会怎么样呢?全用私钥加密系统会出现什么问题呢? 首先, ...

  6. Miller-Rabin素数测试算法

    用来干嘛的 ​   要判断一个数 \(n\) 是否为素数,最朴素直接的办法是以\(O(\sqrt n)\) 时间复杂度地从2到 \(\sqrt n\) 循环即可得到最准确的结果.但是如果在 \(n\) ...

  7. Miller-Rabin素数测试学习小计

    1.Miller-Rabin是干啥的?它是用来检测一个数字(一般是很大的数字)是不是素数: 2.Miller-Rabin算法基于的两个定理: (1)费尔马小定理:如果p是一个素数,且0<a< ...

  8. [模板] Miller-Rabin 素数测试

    细节挺多的.. #include<iostream> #include<cstdlib> #include<cstdio> #include<ctime> ...

  9. luogu【模板】线性筛素数 (Miller-Rabin素数测试模板)

    这个感觉还是挺好理解的,就是复杂度证明看不懂~ Code: #include <cstdio> #include <algorithm> #include <cstrin ...

随机推荐

  1. 如何添加网页QQ在线组件

    免费开通QQ推广服务 复制代码到你想要展示的位置 粘贴,完成.

  2. Bloom filter和Counting bloom filter

    Bloom filter原理: https://en.wikipedia.org/wiki/Bloom_filter 推导过程结合博客: https://blog.csdn.net/jiaomeng/ ...

  3. GCD - Extreme(欧拉函数变形)

    题目链接:https://vjudge.net/problem/UVA-11426 题目大意: 给出整数n∈[2,4000000],求解∑gcd(i,j),其中(i,j)满足1≤i<j≤n. 的 ...

  4. cloudemanager安装时出现8475 MainThread agent ERROR Heartbeating to 192.168.30.1:7182 failed问题解决方法(图文详解)

    不多说,直接上干货!   问题详情 解决这个问题简单的,是因为有进程占用了.比如 # ps aux | grep super root ? Ss : : /opt/cm-/lib64/cmf/agen ...

  5. Linux定时任务与开机自启动脚本(cron与crontab)

    开机自启动脚本 网上常见的脚本开机自启方法是: 假设要自启的脚本位于 /home/user/test.sh 给脚本可执行的权限 sudo chmod +x /home/user/test.sh 将脚本 ...

  6. Nagios 利用NSClient++的check_nrpe方式使用自定义脚本监控windows

    分类 NsClient++来监控windows主机有三种方式:check_nt.check_nrpe.nsca.check_nt自带很多功能,但是扩展性差,check_nrpe可以通过执行自己定义的脚 ...

  7. SQL脚本整理系列一 分隔函数

    原来效果: fName Scroe 王某某 ,, 李某某 , 王某某 李某某 李某某 ,, 王某某 执行后效果: name score 李某某 李某某 李某某 王某某 王某某 王某某 王某某 王某某 ...

  8. 初学Hadoop之WordCount词频统计

    1.WordCount源码 将源码文件WordCount.java放到Hadoop2.6.0文件夹中. import java.io.IOException; import java.util.Str ...

  9. C#语言-02.数据类型

    a. 数据类型 i. 值类型:是一种由类型的实际值表示的数据类型,存储在栈内的存储空间中,由于编译器编译后将源代码中的值类型变量直接对应到唯一的存储空间上,直接访问该存储空间,故值类型的数据具有较快地 ...

  10. Csharp: Detect Mobile Browsers

    /// <summary> /// 檢測手機客戶端 HttpCapabilitiesBase.IsMobileDevice /// .NET 4.5 /// 塗聚文注 /// </s ...