筛素数方法(二)—— MR素数判断

前言

\(Miller-Rabin\)素数测试是一个很好的筛素数方法,它的优点在于速度快准确性较高,但依然有可能出错。


大致思路

\(MR\)素数测试利用费马小定理快速判断一个数是否是素数,但是由于这种方法只是较高概率不出现错误,并不是完全正确的,所以在时间充裕的情况下可不必使用这个方法。


具体实现

因为当\(n\)是素数,且\(gcd(a,n)=1\)时,\(a^{n?1}\equiv1(mod\ n)\)。

所以我们可以多随机几个\(a\)(用于增加算法的准确性),然后判断\(a^{n?1}\equiv1(mod\ n)\)成不成立。

由于\(n\)不是素数时\(a^{n?1}\equiv1(mod\ n)\)几乎不成立,所以如果多个\(a\)测试过后,\(a^{n?1}\equiv1(mod\ n)\)均成立,就可以认为\(n\)是素数了。

但是还有这么一种合数,对于任意\(p\)为素数,\(gcd(a,p)=1\),\(a^{p?1}\equiv1(mod\ p)\)都成立。

这种数叫做卡迈克尔数又称MR测试杀手)。

当然,这种数是很少的,在\(1\sim100000000\)范围内的整数中,只有\(255\)个卡迈克尔数。当碰到卡迈克尔数时,\(MR\)素数判断就毫无用武之地了(一个较好的方法是拿来特判)。

所以,在时间充裕的情况下,最好还是使用线性筛

原文地址:https://www.cnblogs.com/chenxiaoran666/p/Miller_Rabin.html

时间: 2024-08-25 02:24:25

筛素数方法(二)—— MR素数判断的相关文章

代码实现:判断101-200之间有多少个素数(质数),并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

package com.heima.Coding; /* 判断101-200之间有多少个素数(质数),并输出所有素数. 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数.*/ public class Test { public static void main(String[] args) { int count = 0; for (int i = 100; i < 200; i++) { for (int j = 2; j <=

Java杂谈三之判断素数以及穷举素数

首先确认下什么是素数,又称质数 百度的定义解答: 质数(prime number)又称素数,有无限个.一个大于1的自然数,如果除了1和它本身 外,不能被其他自然数整除(除0以外)的数称之为素数(质数) 明确了素数的定义后,下面用java来判断素数以及穷举2-999以内的素数,还是一样,主 要看的是对一个数进行判断或者对一组数进行判断的思想,至于怎样判断的,百度的定义已经给了很好的解答思路. JavaPrimeNubmer:类名 enumPrimeNumber():穷举2-999以内的所有素数 m

普通方法求素数与筛法求素数比较

20150806 package day06; /* * 普通方法求素数与筛法求素数比较 */ import java.util.*; public class TestSushu { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.print("查找范围2-"); int n = scan.nextInt(); long s1=System.curre

普通方法求素数与筛法求素数比較

20150806 package day06; /* * 普通方法求素数与筛法求素数比較 */ import java.util.*; public class TestSushu { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.print("查找范围2-"); int n = scan.nextInt(); long s1=System.curre

素数相关?(有关素数的题持续更新中)x

素数(大体举几个栗子): 素数相关知识: 素数概念: 最大公约数只有1和它本身的数叫做质数(素数) 素数小性质: 1.大于一的整数必有素因数. 2.设p是素数,n是任意一个整数 能够推出p|n,(p,n)=1; 3.设p是素数,a,b为整数,若p|ab,则ab中至少有一个能被p整除 4.素数有无穷多个证明: (素数与整数之间的关系:1整除2互素) 假定正整数中只有有限个素数 设p1,p2……pk为从小到大排列起来的数 且N=p1*p2*……pk 设M=N+1 如果M为素数,那么M要大于p1,p2

Java 实现1~100之间有多少个素数并输出所有素数

/* 2.判断1-100之间有多少个素数并输出所有素数. (将判断一个数是否是素数的功能提取成方法,在循环中直接调用即可) */ public class primeNumber{ public static void main(String[]args) { int count = 0; //产生1~100之间用for循环 for(int i=1;i<=100;i++) { if(isPrime(i)){ System.out.println(i); count++; } } System.o

关于素数的快速查找——素数筛选法

利用素数筛选法进行素数的快速查找.原理很简单,素数一定是奇数,素数的倍数一定不是素数.思路如下: 预定义N表示10000,即表示查找10000以内的素数,首先定义数组prime[]对N以内的数进行标记,奇数存为1,偶数存为0,最终实现结果为素数的prime值为1,因此将prime[2]赋值为1(2是素数).之后利用for循环,对N以内的奇数进行遍历(注意for循环的条件控制),for里用if判断是否为素数(奇数),若是,执行内部嵌套的for循环判断该奇数是否为素数,若是则标记为1,若不是则pri

Python练习题4(列表去重):[5,3,4,&#39;ok&#39;,4,3,&#39;abc&#39;,8,52,&#39;ok&#39;]去除列表中重复内容 方法一:使用set 方法二:不使用set,自己写方法

方法一:利用集合去重 1 list1 = [5,3,4,'ok',4,3,'abc',8,52,'ok'] 2 list1=list(set(list1)) 3 print(list1) 方法二:此方法略微冗余,先判断元素是否重复,再将重复元素提取并保存到新列表中,再for 新建的列表元素,删除原列表 1 def list_dup(ls): 2 list2 = [] 3 length = len(ls) #获取列表元素个数 4 for i in range(0,length-1): 5 for

EditText监听方法,实时的判断输入多少字符

最近在写一个小项目,其中有一点用到了显示EditText中输入了多少个字符,像微博中显示剩余多少字符的功能.在EditText提供了一个方法addTextChangedListener实现对输入文本的监控.下边是我自己写的一个Demo. 代码实现: 布局文件main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.