本文转载自https://www.cnblogs.com/zsq259/p/11602175.html

Miller-Rabin

事先声明,因为菜鸡Hastin知识水平有限就是菜,因此语言可能不是特别规范,仅供理解.

step 0

问一个数\(p\)是否为质数,\(p<=10^{18}\).

一个简单暴力的办法是\(O( \sqrt{n})\)枚举约数.

然而显然会炸.

于是我们就有了Miller-Rabin.

讲了好多废话...

step 1

首先了解一下费马小定理:

若\(p\)为质数,则对于\(a\in[1,p-1]\)有\(a^{p}\equiv a(Mod\) \(p)\)

那么就有\(a^{p-1} \equiv 1( Mod\) \(p)\)

下面我们用数学归纳法来证明一下费马小定理:

显然\(a=1\)时结论成立,

若\(a=n\)时结论成立,

当\(a=n+1\)时,有

\((n+1)^p\)\(=\sum_{i=0}^{p}C_{p}^{i}n^{p-i}\)(二项式定理)

那么除了\(n^{p}\)和\(1\)这两项外,

其它的都有一个系数\(C_{p}^{i},i\in[1,p-1]\),所以都能被\(p\)整除.

而\(n^p\equiv n(Mod\) \(p)\),

所以\((n+1)^{p}\equiv n+1(Mod\) \(p)\),结论成立.

所以回到正题,如果对于一个数\(p\),存在\(a \in [1,p-1]\),\(a^{p-1}\not\equiv1(Mod\) \(p)\),则\(p\)一定不是质数.

然而仍然有一些数能够逃掉这种检测,

于是就有了

step 2

二次探测!

对于一个质数\(p\),若\(a \in[1,p-1]\),且\(a^2\equiv1(Mod\) \(p)\),则\(a=1\)或\(a=p-1\).

证明:

若\(a^2\equiv1(Mod\) \(p)\),则\(a^2-1\equiv 0(Mod\) \(p)\)

即\(p|(a+1)(a-1)\).

因为\(p\)为质数,且\(a\in [1,p-1]\),所以只有当\(a=1\)或\(a=p-1\)时上式才成立.

所以反过来想当\(a\)等于其它数时,\(p\)就不是质数了.

step 3

下面再来讲一下具体的实现.

首先大的思路是费马小定理,在中间用二次探测判定.

对于要判定的数\(p\),

设\(u=p-1\),则根据费马小定理有\(a^u\equiv 1(Mod\) \(p)\),\(a\in [1,p-1]\).

然后把\(u\)写成\(d*2^n\)的形式,也就是\((((d^2)^2)^2)^{2...}\)(n个2)

那么从\(d^2\)开始用二次探测判定,

最后再用费马小定理判定就行了.

而时间复杂度是\(O(log_{ \tiny 2}\) \(p)\).

并且一次的失误率是\(\frac{1}{4}\),

那么\(T\)次测试的失误率就是\(4^{-T}\),时间复杂度为\(O(Tlog_{\tiny 2}p)\),能够接受.

并且如果\(n<2^{64}\),只用选取\(a=2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37\)测试即可.

code:(似乎要开int128)

#include <iostream>
#include <cstdio>
#include <cstring>
#define int __int128
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std;

inline int read(){
    int sum=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
    return f*sum;
}

int p[101]={2,3,5,7,11,13,17,19,23,29,31,37};
int T,n,tot=12;

inline int fpow(int a,int b,int p){
    int ret=1;
    for(;b;a=a*a%p,b>>=1) if(b&1) ret=ret*a%p;
    return ret;
}

inline bool Miller_Rabin(int n){
    if(n<=2){
        if(n==2) return 1;
        return 0;
    }
    int u=n-1;
    while(!(u%2)) u>>=1;
    int d=u;
    for(int i=1;i<tot&&p[i]<n;i++){
        int x=p[i];u=d;x=fpow(x,u,n);
        while(u<n){
            int y=fpow(x,2,n);
            if(y==1&&x!=1&&x!=n-1) return 0;
            x=y;u<<=1;
        }
        if(x!=1) return 0;
    }
    return 1;
}

signed main(){
    T=read();
    while(T--){
        n=read();
        if(Miller_Rabin(n)) puts("Yes");
        else puts("No");
    }
    return 0;
}

[转载] miller rabin的更多相关文章

  1. 关于素数:求不超过n的素数,素数的判定(Miller Rabin 测试)

    关于素数的基本介绍请参考百度百科here和维基百科here的介绍 首先介绍几条关于素数的基本定理: 定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子 定理2:如果n不是 ...

  2. HDU1164_Eddy&#39;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 ...

  3. Miller Rabin 详解 && 小清新数学题题解

    在做这道题之前,我们首先来尝试签到题. 签到题 我们定义一个函数:\(qiandao(x)\) 为小于等于 x 的数中与 x 不互质的数的个数.要求 \(\sum\limits _{i=l}^r qi ...

  4. POJ2429 - GCD & LCM Inverse(Miller–Rabin+Pollard's rho)

    题目大意 给定两个数a,b的GCD和LCM,要求你求出a+b最小的a,b 题解 GCD(a,b)=G GCD(a/G,b/G)=1 LCM(a/G,b/G)=a/G*b/G=a*b/G^2=L/G 这 ...

  5. POJ1811- Prime Test(Miller–Rabin+Pollard's rho)

    题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...

  6. poj 1811 Pallor Rho +Miller Rabin

    /* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...

  7. POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  8. Miller Rabin算法详解

    何为Miller Rabin算法 首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:) Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重 ...

  9. 与数论的厮守01:素数的测试——Miller Rabin

    看一个数是否为质数,我们通常会用那个O(√N)的算法来做,那个算法叫试除法.然而当这个数非常大的时候,这个高增长率的时间复杂度就不够这个数跑了. 为了解决这个问题,我们先来看看费马小定理:若n为素数, ...

随机推荐

  1. uniapp销毁addEventListener事件

    百度了很多vue的方法,结果都不适用,只好自己想办法,也是无关紧要的东西,不影响运行,但是看着心里都烦,有更好的解决方案欢迎指点上报错信息 这是一个监听滚动的方法,离开了那个页面进入详情页发现这个没有 ...

  2. 百度前端技术学院-task1.3源代码

    因为其中有图片,所以就给有图片的位置加了边框和设置了大小,这样哪怕图片不显示也可以知道在哪里. <!DOCTYPE html> <html> <head> < ...

  3. TeamViewer14试用版到期-怎么解决

    Teamviewer14提示试用期已到期怎么办? 问题分析: 出现这种问题,是因为在安装是选择了[公司/商务用途]或者[以上都是]这两个选项中的一个 解决方法: 1.退出TeamViewer远程软件, ...

  4. [shell] while read line 与for循环的区别

    [shell] while read line 与for循环的区别 while read line 与for循环的区别---转载整理 while read line 是一次性将文件信息读入并赋值给变量 ...

  5. SQL Server中VARCHAR(MAX)和NVARCHAR(MAX)使用时要注意的问题(转载)

    在Microsoft SQLServer2005及以上的版本中,对于varchar(n).nvarchar(n)和varbinary(n)有了max的扩展.可以使用如:varchar(max).nva ...

  6. Oracle 加解密教程

    参考Oracle官方文档 在Oracle使用dbms_crypto包进行加解密 首先,授权当前用户使用加解密包 在sql中运行:connect sqlplus as sysdbagrant execu ...

  7. 通过Ldap实现人事系统组织人事和AD的同步

    项目需求:同步人事系统的组织架构-对应AD的OU树同步人事系统的员工-对应AD的用户 创建OU 名字不能重复,需要父级路径(parentOrganizeUnit)以及新ou的名字(name),如果最父 ...

  8. IT之快速提高效率的方法与思考

    前言 文章也没什么很高深的问题,大概花个5分钟能看完.是一些大家都知道的道理,作为提醒与总结. 关于提高方面的内容,一般都有个人的方法,但大致都一致.可分为几个步骤. 框架.工具使用相关 使用框架.工 ...

  9. vue-cli项目中使用vw——相比flexible更原生的移动端解决方案

    安装命令行输入: yarn add postcss-px-to-viewport 或 npm i postcss-px-to-viewport -save -dev 配置package.json中,在 ...

  10. 《JavaScript高级程序设计》笔记:附录A ECMAScript Harmony

    一般性变化 常量 用const关键字声明常量,声明的变量在初始赋值后,就不能进行修改了,如下代码: const MAX_SIZE = 25; MAX_SIZE = 10; //报错 块级作用域及其他作 ...