何为Miller Rabin算法

首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:)

Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重要的地位。通过比较各种素数测试算法和对Miller-Rabin算法进行的仔细研究,证明在计算机中构建密码安全体系时, Miller-Rabin算法是完成素数测试的最佳选择。通过对Miller-Rabin 算 法底层运算的优化,可以取得较以往实现更好的性能。[1]  随着信息技术的发展、网络的普及和电子商务的开展, 信息安全逐步显示出了其重要性。信息的泄密、伪造、篡改 等问题会给信息的合法拥有者带来重大的损失。在计算机中构建密码安全体系可以提供4种最基本的保护信息安全的服 务:保密性、数据完整性、鉴别、抗抵赖性,从而可以很大 程度上保护用户的数据安全。在密码安全体系中,公开密钥 算法在密钥交换、密钥管理、身份认证等问题的处理上极其有效,因此在整个体系中占有重要的地位。目前的公开密钥 算法大部分基于大整数分解、有限域上的离散对数问题和椭 圆曲线上的离散对数问题,这些数学难题的构建大部分都需 要生成一种超大的素数,尤其在经典的RSA算法中,生成的素数的质量对系统的安全性有很大的影响。目前大素数的生 成,尤其是随机大素数的生成主要是使用素数测试算法,本 文主要针对目前主流的Miller-Rabin 算法进行全面系统的分析 和研究,并对其实现进行了优化

说白了Miller Rabin算法在信息学奥赛中的应用就一句话:

判断一个数是否是素数

定理

Miller Rabin算法的依据是费马小定理:

$$a^{p-1}\equiv 1 \pmod P$$

证明:

性质1:$p-1$个整数$a,2a,3a,...(p-1)a$中没有一个是$p$的倍数

性质2:$a,2a,3a,...(p-1)a$中没有任何两个同余与模$p$的

所以$a,2a,3a,...(p-1)a$对模$p$的同余既不为零,也没有两个同余相同

因此,这$p-1$个数模$p$的同余一定是$a,2a,3a,...(p-1)a$的某一种排列

即$a*2a*3a*...*(p-1)a \equiv {1*2*3*...*(p-1)} \pmod p$

化简为

$a^{p-1}*(p-1)! \equiv {p-1}! \pmod p$

根据威尔逊定理可知$(p-1)!$与$p$互质,所以同时约去$(p-1)!$

即得到$a^{p-1}\equiv 1 \pmod P$

那么是不是当一个数$p$满足任意$a$使得$a^{p-1}\equiv 1 \pmod P$成立的时候它就是素数呢?

在费马小定理被证明后的很长一段时间里,人们都觉得这是很显然的,

但是终于有一天,人们给出了反例 ,推翻了这个结论

这是否意味着利用费马小定理的思想去判断素数的思想就是错误的呢?

答案是肯定的。

但是如果我们可以人为的把出错率降到非常小呢?

比如,对于一个数,我们有$99.99999$%的几率做出正确判断,那这种算法不也很优越么?

于是Miller Rabin算法诞生了!

首先介绍一下二次探测定理

若$p$为素数,$a^{2}\equiv 1 \pmod P$,那么$a\equiv \pm 1 \pmod P$

证明

$a^{2}\equiv 1 \pmod P$

$a^{2}-1\equiv 0 \pmod P$

$(a+1)*(a-1)\equiv 0 \pmod P$

那么

$(a+1)\equiv 0 \pmod P$

或者

$(a-1)\equiv 0 \pmod P$

(此处可根据唯一分解定理证明)

$a\equiv \pm 1 \pmod P$

这个定理和素数判定有什么用呢?

首先,根据Miller Rabin算法的过程

假设需要判断的数是$p$

我们把$p-1$分解为$2^k*t$的形式

当$p$是素数,有$a ^ {2^k * t} \equiv 1 \pmod p$

然后随机选择一个数$a$,计算出$a^t \pmod p$

让其不断的自乘,同时结合二次探测定理进行判断

如果我们自乘后的数$\pmod p = 1$,但是之前的数$\pmod p \not = \pm 1$

那么这个数就是合数(违背了二次探测定理)

这样乘$k$次,最后得到的数就是$a^{p-1}$

那么如果最后计算出的数不为$1$,这个数也是合数(费马小定理)

正确性

老祖宗告诉我们,若$p$通过一次测试,则$p$不是素数的概率为$25$%

那么经过$t$轮测试,$p$不是素数的概率为$\dfrac {1}{4^{t}}$

我习惯用$2,3,5,7,11,13,17,19$这几个数进行判断

在信息学范围内出错率为$0$%(不带高精)

code

注意在进行素数判断的时候需要用到快速幂。。

这个应该比较简单,就不细讲了

#include<cstdio>
#define LL long long
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, M, Test[] = {, , , , , , };
int pow(int a, int p, int mod) {
int base = ;
for(; p; p >>= , a = (1ll * a * a) % mod)
if(p & ) base = (1ll * base * a) % mod;
return base % mod;
}
bool Query(int P) {
if(P == ) return ;
int t = P - , k = ;
while(!(t & )) k++, t >>= ;
for(int i = ; i < ; i++) {
if(P == Test[i]) return ;
LL a = pow(Test[i], t, P), nxt = a;
for(int j = ; j <= k; j++) {
nxt = (a * a) % P;
if(nxt == && a != && a != P - ) return ;
a = nxt;
}
if(a != ) return ;
}
return ;
}
main() {
N = read(); M = read();
while(M--) puts(Query(read()) ? "Yes" : "No");
}

Miller Rabin算法详解的更多相关文章

  1. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  2. kmp算法详解

    转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...

  3. 机器学习经典算法详解及Python实现--基于SMO的SVM分类器

    原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector  ...

  4. [转] KMP算法详解

    转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的K ...

  5. 【转】AC算法详解

    原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...

  6. KMP算法详解(转自中学生OI写的。。ORZ!)

    KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句 ...

  7. EM算法详解

    EM算法详解 1 极大似然估计 假设有如图1的X所示的抽取的n个学生某门课程的成绩,又知学生的成绩符合高斯分布f(x|μ,σ2),求学生的成绩最符合哪种高斯分布,即μ和σ2最优值是什么? 图1 学生成 ...

  8. Tarjan算法详解

    Tarjan算法详解 今天偶然发现了这个算法,看了好久,终于明白了一些表层的知识....在这里和大家分享一下... Tarjan算法是一个求解极大强联通子图的算法,相信这些东西大家都在网络上百度过了, ...

  9. 安全体系(二)——RSA算法详解

    本文主要讲述RSA算法使用的基本数学知识.秘钥的计算过程以及加密和解密的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 1.概述 ...

随机推荐

  1. JVM之垃圾回收

    1.哪些内存需要回收?判断对象已死的方法(存活判定算法) 1.引用计数算法:难以解决对象之间相互循环引用的问题,不使用. 2.可达性分析算法:通过一系列“GC Root”对象作为起始点向下搜索,所走过 ...

  2. 亿级SQL Server运维的最佳实践PPT分享

    这次分享是我在微软的一次分享,关于SQL Server运维最佳实践的部分,由于受众来自不同背景,因此我让分享在一个更加抽象的角度进行,PPT分享如下: 点击这里进行下载

  3. 10倍速!一招儿解决因googleapis被墙导致的许多国外网站访问速度慢的问题

    1x.com 是我非常喜欢的一家国外的摄影网站.但,打开它的首页要1分多钟!点击小图看大图的二级页面根本打不开.看着写着“Nude content”的小图却点不开大图的心情你们造吗?!很多国外网站访问 ...

  4. Java Web每天学之Servlet的原理解析

    Java Web每天学之Servlet的工作原理解析,上海尚学堂Java技术文章Java Web系列之二上一篇文章Java Web每天学之Servlet的工作原理解析是之一,欢迎点击阅读. Servl ...

  5. [Swift]LeetCode526. 优美的排列 | Beautiful Arrangement

    Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is const ...

  6. [Swift]LeetCode685. 冗余连接 II | Redundant Connection II

    In this problem, a rooted tree is a directed graph such that, there is exactly one node (the root) f ...

  7. 面向切面编程 ( Aspect Oriented Programming with Spring )

    Aspect Oriented Programming with Spring 1. 简介 AOP是与OOP不同的一种程序结构.在OOP编程中,模块的单位是class(类):然而,在AOP编程中模块的 ...

  8. asp.net core系列 40 Web 应用MVC 介绍与详细示例

    一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...

  9. Python爬虫入门教程 8-100 蜂鸟网图片爬取之三

    蜂鸟网图片--啰嗦两句 前几天的教程内容量都比较大,今天写一个相对简单的,爬取的还是蜂鸟,依旧采用aiohttp 希望你喜欢 爬取页面https://tu.fengniao.com/15/ 本篇教程还 ...

  10. 通过Python、BeautifulSoup爬取Gitee热门开源项目

    一.安装 1.通过requests 对响应内容进行处理,requests.get()方法会返回一个Response对象 pip install requests 2.beautifulSoup对网页解 ...