质数测试

费马小定理:对于质数p和任意整数a,有a^p ≡ a(mod p)(同余)。反之,若满足a^p ≡ a(mod p),p也有很大概率为质数。 将两边同时约去一个a,则有a^(p-1) ≡ 1(mod p)

也即是说:假设我们要测试n是否为质数。我们可以随机选取一个数a,然后计算a^(n-1) mod n,如果结果不为1,我们可以100%断定n不是质数。

否则我们再随机选取一个新的数a进行测试。如此反复多次,如果每次结果都是1,我们就假定n是质数。

该测试被称为Fermat测试。需要注意的是:Fermat测试不一定是准确的,有可能出现把合数误判为质数的情况。

Miller和Rabin在Fermat测试上,建立了Miller-Rabin质数测试算法。

与Fermat测试相比,增加了一个二次探测定理

如果p是奇素数,则 x^2 ≡ 1(mod p)的解为 x ≡ 1 或 x ≡ p - 1(mod p)

如果a^(n-1) ≡ 1 (mod n)成立,Miller-Rabin算法不是立即找另一个a进行测试,而是看n-1是不是偶数。如果n-1是偶数,另u=(n-1)/2,并检查是否满足二次探测定理即a^u ≡ 1 或 a^u ≡ n - 1(mod n)。

举个Matrix67 Blog上 的例子,假设n=341,我们选取的a=2。则第一次测试时,2^340 mod 341=1。由于340是偶数,因此我们检查2^170,得到2^170 mod 341=1,满足二次探测定理。同时由于170还是偶数,因此我们进一步检查2^85 mod 341=32。此时不满足二次探测定理,因此可以判定341不为质数。

将这两条定理合起来,也就是最常见的Miller-Rabin测试。

但一次MR测试仍然有一定的错误率。为了使我们的结果尽可能的正确,我们需要进行多次MR测试,这样可以把错误率降低。

时间: 2024-10-24 19:54:39

质数测试的相关文章

Miller-Rabin质数测试

这种质数算法是基于费马小定理的一个扩展. 费马小定理:对于质数p和任意整数a,有a^p ≡ a(mod p)(同余).反之,若满足a^p ≡ a(mod p),p也有很大概率为质数. 将两边同时约去一个a,则有a^(p-1) ≡ 1(mod p) 也即是说:假设我们要测试n是否为质数.我们可以随机选取一个数a,然后计算a^(n-1) mod n,如果结果不为1,我们可以100%断定n不是质数. 否则我们再随机选取一个新的数a进行测试.如此反复多次,如果每次结果都是1,我们就假定n是质数. 该测试

hihocoder 1287 : 数论一·Miller-Rabin质数测试 大质数判定

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近突然对密码学产生了兴趣,其中有个叫RSA的公钥密码算法.RSA算法的计算过程中,需要找一些很大的质数. 小Ho:要如何来找出足够大的质数呢? 小Hi:我倒是有一个想法,我们可以先随机一个特别大的初始奇数,然后检查它是不是质数,如果不是就找比它大2的数,一直重复,直到找到一个质数为止. 小Ho:这样好像可行,那我就这么办吧. 过了一会儿,小Ho拿来了一张写满数字的纸条. 小Ho:我用程序随机生成了一些初

Miller-Rabin素数测试

算法实现原理:若p为素数,a^(p-1)≡1(mod p)  费马小定理 正确性:一次为75%,第T次为1-1/(4^T). 流程: 1.输入待判定的数N 2.循环 T>=10遍 1*. RAND一个数A<N,A=rand()%(n-2)+2,把它扔到快速幂中计算a^(N-1)%N 2*. 若答案等于1,通过测试,再试几组数据:否则,失败,退出测试 流程中涉及快速幂取模和 大数相乘取模------> 速度慢,若两数相乘大于十八位,仿照快速幂取模. (没有什么鬼二次探测定理,多算几次就好了

Miller_Rabin素数测试

1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 8 long long mul(long long a,long long n,long long mo){ 9 long long ans=0; 10 while (n){ 11 if (n&

Miller-Rabin 素性测试 与 Pollard Rho 大整数分解

\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要把询问范围加到 \(10^{18}\) ,再多组询问呢? Miller 和 Rabin 建立了Miller-Rabin 质数测试算法. \(\\\) Fermat 测试 首先我们知道费马小定理: \[ a^{p-1}\equiv 1\pmod p \] 当且仅当 \(p\) 为素数时成立. 逆命题是

Java数组六

1.了解如何利用二维数组和循环语句绘制五子棋盘 答:  定义一个二维数组来充当棋盘,定义棋盘大小,初始化棋盘数组,利用for循环使每一个元素赋为"+",然后输出每个数组元素,每打印完一行后在进行换行. import java.io.*; public class QiPan { //定义一个二维数组来充当棋盘 private String[][] board; //定义棋盘的大小 private static int BOARD_SIZE = 15; public void initB

数组问题随笔

1.棋盘 import java.io.*;public class qipan { //定义一个二维数组来充当棋盘 private String[][] board; //定义棋盘的大小 private static int BOARD_SIZE = 15; public void initBoard() { //初始化棋盘数组 board = new String[BOARD_SIZE][BOARD_SIZE]; //把每个元素赋为"╋",用于在控制台画出棋盘 for (int i

Java作业6

1,利用二维数组和循环语句制作一个五子棋盘 2.编写一个程序将整数转化为汉字 3大数 四.大数 4. 前面几讲介绍过JDK所提供的BigInteger能完成大数计算,如果不用它,直接使用数组表达大数,你能实现相同的功能吗? 要求: (1)用你的大数类实现加和减两个功能 (2)阅读BigInteger类源码,弄清楚它是使用什么算法实现加减乘除四种运算的? (3)通过互联网查找大数运算的相关资料,给你的大数类添加乘.除.求阶乘等其它功能. (1)BigInteger历史介绍在java中,存在很多种类

Java中的大树处理

在javaAPI中有两个大数类:java.math.BigInteger类和java.math.BigDecimal类. java.math.BigInteger类:不可变的任意精度的整数.所有操作中,都以二进制补码形式表示.BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法.另外,BigInteger 还提供以下运算:模算术.GCD 计算.质数测试.素数生成.位操作以及一些其他操作. 代码实现: import java.ma