Miller-Rabin算法用于检测一个数n是否是素数。其时间复杂度上界为O(klog2(n)),其中k为检测的轮数。增大k可以提高Miller-Rabin算法的准确度。

  要检测一个数是否为素数,简单的算法有两种,第一种是对2~√n之间的数,检查其是否是n的因子,其时间复杂度为O(√n)。第二种就是打表法,利用欧拉筛可以在O(N)的时空复杂度内获取1~N之间的所有素数并存储。无论是哪种情况,对于超大的n,都要消耗可怕的时间来进行判断,譬如取n为1e18,这样两种算法在现代计算机上都是无法结束的(后者会直接内存不足)。

  数论中的费马小定理中指出,对于任意素数p,以及对于模p的剩余类环{1,2,...,p-1}中的任意数x,都满足x^p=x(mod p)。因此我们可以用这个小小的技巧来排除大量的合数。譬如对于素数5,我们发现2^5(mod 5)=2,而对于6,有2^6(mod 6)=4。

  但是费马小定理中p是素数是x^p=x(mod p)的充分条件,而非必要条件,比如4^6=4(mod 6),但我们不能说6是素数。因此我们需要从模p的剩余类环中选取更多的数进行测试,以增强结果的可信度,只要存在一个数x不满足x^p=x(mod p),那么p就绝不可能是素数。但是还是存在一类极端的合数p,使得对于任意1,..,p-1中的x都满足x^p=x(mod p),这类合数称为Carmichael数,一个例子就是561。由于这类数的存在,使得我们用费马小定理完全无法正确断定一个数为素数还是合数。

  而Miller-Rabin算法的出世使得相当一类的满足费马小定理的合数无法通过素数测试。Miller-Rabin算法基于一个事实,若x^2=1(mod p),那么若p是素数,则(x-1)(x+1)=0(mod p),除非p为2,否则(x-1)与(x+1)在模p的性质下是不相等的,无论p是否为2,都可以保证有(x-1)=0(mod p)或者(x+1)=0(mod p)(因为模p剩余类环是整环),即x=1或x=p-1。因此我们可以在p通过数x的费马测试后,即x^p=p(mod p),也可以写作x^(p-1)=1(mod p),若p-1是偶数,那么可以继续通过x^((p-1)/2)是否等于1或(p-1)来进行测试。如果测试通过还可以继续判断是否满足x^2k=1(mod p),从而继续进行判断。只要一环判断不通过,那么就保证p是合数。

  看一下我们方才提过的Carmichael数561,进行Miller-Rabin测试:

  2^560=1(mod 561)  满足

  2^280=1(mod 561)  满足

  2^140=67(mod 561)   不满足
  下面给出我个人使用的MR算法的模板:

mr(p)
if(p == || p == || p == || p == )
return true
return mr0(, p) && mr0(, p) && mr0(, p) && mr0(, p) mr0(x, p)
if (x^(p-)) % p !=
return false
k = p -
while k % ==
k = k /
t = x^k
if(t != && t != p - )
return false
if(t == p - )
return true
return true

由于mr0中的幂运算可以利用快速幂乘法的技术来实现,因此一次幂运算的时间复杂度为O(log2n),而while循环最多执行log2(p)次,每次循环执行一次幂乘运算,故总的时间复杂度为O((log2p)^2)。

Miller-Rabin算法的更多相关文章

  1. Miller Rabin算法详解

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

  2. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  3. Miller Rabin 算法简介

    0.1 一些闲话 最近一次更新是在2019年11月12日.之前的文章有很多问题:当我把我的代码交到LOJ上,发现只有60多分.我调了一个晚上,尝试用{2, 3, 5, 7, 11, 13, 17, 1 ...

  4. Miller Rabin算法学习笔记

    定义: Miller Rabin算法是一个随机化素数测试算法,作用是判断一个数是否是素数,且只要你脸不黑以及常数不要巨大一般来讲都比\(O(\sqrt n)\)的朴素做法更快. 定理: Miller ...

  5. 【数论基础】素数判定和Miller Rabin算法

    判断正整数p是否是素数 方法一 朴素的判定   

  6. (Miller Rabin算法)判断一个数是否为素数

    1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先级高于乘除和取模,加减的优先级最低. 见到x^y/z这 ...

  7. Miller Rabin素数检测与Pollard Rho算法

    一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...

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

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

  9. poj 1811 Pallor Rho +Miller Rabin

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

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

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

随机推荐

  1. groovy && java 混编 gradle 配置

    参考配置: apply plugin: "application" apply plugin: "java" apply plugin: "groov ...

  2. JavaWeb框架之Struts2 ---- 系列学习

    JavaWeb框架_Struts2_(七)----->文件的上传和下载 JavaWeb框架_Struts2_(六)----->Struts2的输入校验 JavaWeb框架_Struts2_ ...

  3. hash一致性算法

    一致性hash算法是,1097麻省理工提出的分布式hashDHT实现算法,极倔internet的热点问题 平衡性 hash结果尽可能的分布到所有的缓存中去,缓冲空间利用率最高 单调性 保持已有的缓存能 ...

  4. (转)Inno Setup入门(十二)——Pascal脚本(1)

    本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250917 事件函数(1) Inno Setup支持以下函数和过程 ...

  5. h264 aac 封装 flv

    Part 1flvtag组成 FLV 文件结构由 FLVheader和FLVBody组成.(注意flv文件是大端格式的)FLV头组成(以c为例子,一字节对齐):FLVBody是由若干个Tag组成的:  ...

  6. nginx限制请求之二:(ngx_http_limit_req_module)模块

    相关文章: <高可用服务设计之二:Rate limiting 限流与降级> <nginx限制请求之一:(ngx_http_limit_conn_module)模块> <n ...

  7. Zabbix 添加 WEB 监控

    添加 WEB Monitorings Web Monitoring是用来监控web程序的,可以监控到web程序的下载速度.返回码及响应时间,还支持把一组连续的web动作作为一个整体来监控. 下面我们以 ...

  8. 在centOS5.9安装asterisk

    最近一直在研究asterisk这个服务器,Asterisk 是一个开放源代码的软件VoIP PBX系统,它是一个运行在Linux环境下的纯软件实施方案.Asterisk是一种功能非常齐全的应用程序,提 ...

  9. lamp环境应用实践

    LAMP之apache2.4.33 apache工作模式 apache 常用工作模式有2种,区别在于 worker模式 1. 线程模式 2. 占用资源少 3. 稳定性略差 4. 并发大 prefork ...

  10. jaxp使用笔记

    XML文件的解析技术有DOM和SAX方式,在Android中还有pull解析方式,这里不再讨论 DOM解析的方式和js中的DOM操作是一致的,DOM解析一次将文档加载入内存建立树型模型,但是如果XML ...