Miller-Rabin算法
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算法的更多相关文章
- Miller Rabin算法详解
何为Miller Rabin算法 首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:) Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重 ...
- Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1044 Solved: 322[Submit][ ...
- Miller Rabin 算法简介
0.1 一些闲话 最近一次更新是在2019年11月12日.之前的文章有很多问题:当我把我的代码交到LOJ上,发现只有60多分.我调了一个晚上,尝试用{2, 3, 5, 7, 11, 13, 17, 1 ...
- Miller Rabin算法学习笔记
定义: Miller Rabin算法是一个随机化素数测试算法,作用是判断一个数是否是素数,且只要你脸不黑以及常数不要巨大一般来讲都比\(O(\sqrt n)\)的朴素做法更快. 定理: Miller ...
- 【数论基础】素数判定和Miller Rabin算法
判断正整数p是否是素数 方法一 朴素的判定
- (Miller Rabin算法)判断一个数是否为素数
1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先级高于乘除和取模,加减的优先级最低. 见到x^y/z这 ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- POJ1811- Prime Test(Miller–Rabin+Pollard's rho)
题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...
- poj 1811 Pallor Rho +Miller Rabin
/* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...
- 与数论的厮守01:素数的测试——Miller Rabin
看一个数是否为质数,我们通常会用那个O(√N)的算法来做,那个算法叫试除法.然而当这个数非常大的时候,这个高增长率的时间复杂度就不够这个数跑了. 为了解决这个问题,我们先来看看费马小定理:若n为素数, ...
随机推荐
- python模块--hashlib
用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法 import hashlib m = hashlib.m ...
- luvit 被忽视的lua 高性能框架(仿nodejs)
备注: luvit 开放模式和nodejs 一样,但是因为生态以及小众语言的问题,使用的人比较少,但是从目前 来看更新速度还是比较快的,但是从现有lua 开发框架来说一般倾向于使 ...
- Arrays--codility
lesson 2: Arrays exercise: Problem: Given array A consisting of N integers, return the reversed arra ...
- qt ui程序使用Linux的文件操作open、close (转)
原文地址:qt ui程序使用Linux的文件操作open.close 作者:kjpioo 提出这个问题是因为在qt的QWidget类型的对象中,close()函数会和QWidget::close()冲 ...
- (四)、Fiddler打断点
一.打断点是Fiddler一个比较好用的功能,它可以做一些手工操作很难做的事情. 那为什么要打断点? 看下图,Fiddler打开后,Client(客户端)发送的请求会先经过Fiddler,然后Fidd ...
- awk&sed 小实例
1.打印文件奇数行sed -n 'p;n'sed 'n;d' sed -n '$!N;P'sed -n '1~2p'awk 'i=!i'awk 'NR%2'2.打印文件偶数行sed -n 'n;p's ...
- rails里面添加妹子ui
妹子ui看起来很不错,以为在rails里面添加自定义的css和js和平时一样,结果可想而知,不过弄完以后发现还是比较简单的,这里记录一下 妹子ui需要加载的css和js如下 http://cdn.am ...
- error: src refspec master does not match any.
执行下面的命令,git push 时候出错: git push origin master 出现如下错误: error: src refspec master does not match any. ...
- [模板]LCA的倍增求法解析
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 05:Sysbench压测-innodb_deadlock_detect参数对性能的影响
目录 sysbench压测-innodb_deadlock_detect参数对性能的影响 一.OLTP测试前准备 二.进行OLTP测试 三.测试结果解读: 四.关于测试后的结论: 五.关于测试后的性能 ...