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为素数, ...
随机推荐
- BZOJ5369 [Pkusc2018]最大前缀和
题意 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C是一个非常有自知之 ...
- VS2013下的64位与32位程序配置
VS2013下的64位与32位程序配置 在Windows 7 64bit和Visual Studio 2013下生成64位程序. 新建一个Visual Studio Win32 Console项目 ...
- gradle java 简单项目使用
预备环境 gradle 配置好变量,方便生成项目 1. 环境配置 gradle wrapper 生成项目结构 ├── build.gradle ├── gradle │ └── wrapper │ ├ ...
- 通过openresty && tengine && nginx 动态添加资源到 html 页面
1. 目标 不用修改后端代码,但是还需要进行js .css 等资源文件的加载 主要的场景是进行统计分析 2.技术实现 通过服务器扩展进行动态添加 iis 可以添加模块,nginx 可以使用 sub_ ...
- bzoj 1670 [Usaco2006 Oct]Building the Moat护城河的挖掘——凸包
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1670 用叉积判断.注意两端的平行于 y 轴的. #include<cstdio> ...
- JavaFX 之自定义窗口标题栏(二)
一.问题场景 PC客户端登录界面仿QQ,上边显示图片,下边显示输入框和登录按钮.而JavaFX默认的窗口,不满足需求. 二.解决思路 隐藏窗口默认的标题栏,使用创建label对象,使用css将按钮图片 ...
- 4.Python爬虫小案例
1.网络爬虫定义:按照一定的规则,自动的抓取网站信息的程序或者脚本. 2.流程:request打开url得到html文档==浏览器打开源码分析元素节点==通过BeautifulSoup得到想要的数据= ...
- 1、Docker学习笔记
Docker是一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.它是一个开发的平台,用来为开发者和系统管理员构建.发布和运行分布式应 ...
- MVC自定义错误页面
MVC异常处理主要有三种方案:1.基于HandleErrorAttribute重写OnException方法:2.基于Global.apsx添加Application_Error方法:3.直接在Web ...
- (转)Inno Setup入门(十六)——Inno Setup类参考(2)
本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250967 这里将接着在前面的基础上介绍如何在自定义页面上添加按钮 ...