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. chrome安装vue-devtools

    安装方法1: 需正常打开chrome商店,搜索vuejs devtools 安装.chrome://extensions/ 开发者工具-扩展程序下启用: 方法2: github下载插件,npm包安装依 ...

  2. FastAdmin 中使用 Oder by if 强行将某一类放到前面

    FastAdmin 中使用 Oder by if 强行将某一类放到前面 问题来源社区问题 1,查了一些资料2,做了测试. 如下表,我想把 snake 单独放到开始. 可以使用以下查询语句(默认为 AS ...

  3. 从内存的角度观察 堆、栈、全局区(静态区)(static)、文字常量区、程序代码区

    之前写了一篇堆栈的,这里再补充下内存其他的区域 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) — 一般由程 ...

  4. 一段四表联查外加字符拼接的sql,留存备查

    select DISTINCT [P_ID],[P_CODE],[P_CODE_OLD],[P_NAME],[NATIVE_PLACE],[GENDER],[EDUCATION],[EMPLOY_DA ...

  5. php 实现四种排序两种查找

    function bubbleSort($arr){ $len = count($arr); if($len<=1) { return $arr; } for ($i=0;$i<$len; ...

  6. Codeforces 982C(dfs+思维)

    C. Cut 'em all! time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  7. Hadoop Map/Reduce的工作流

    问题描述 我们的数据分析平台是单一的Map/Reduce过程,由于半年来不断地增加需求,导致了问题已经不是那么地简单,特别是在Reduce阶段,一些大对象会常驻内存.因此越来越顶不住压力了,当前内存问 ...

  8. Ubuntu12.10下Python(cx_Oracle)访问Oracle解决方案

    第一步:下载安装cx_Oracle 下载地址:http://sourceforge.net/projects/cx-oracle/files/5.1.2/,下载cx_Oracle的rmp安装文件,注意 ...

  9. Hibernate 一对一、一对多、多对多注解mappedBy属性的总结

    mappedBy: 所填内容必为本类在另一方的字段名. 表示:本类放弃控制关联关系,所有对关联关系的控制,如:建立.解除与另一方的关系,都由对方控制,本类不管.举个例子: Teacher和Studen ...

  10. Dev使用技巧汇总

    C# XtraGrid的行指示器(RowIndicator)行号以及图标设置 参考网址:https://www.cnblogs.com/xuliangxing/p/6775438.html DateE ...