筛素数方法(二)—— 费马小定理及MR素数判断

注明:本文中的xy表示x的y次方

一、费马小定理

1.1 内容
若p为素数,a为正整数,且gcd(a,p)=1,则ap−1≡1(mod p)。
1.2 证明
因为p为素数,所以gcd(i,p)=1(1<=i<=p-1,i为整数),可推出 ①gcd((p-i)!,p)=1,又因为gcd(a,p)=1,所以gcd(i∗a,p)=1,则 ②没有一个i*a是p的倍数。 
设a=b*p+r,则gcd(i*r,p)=1,没有一个i*r是p的倍数。
假设有两个i*r同余于模p,则c*r≡d*r(mod p)(c<d),那么(d-c)*r≡0(mod p),即p|(d−c)∗r。由于1<=d−c<=p−1,这与没有一个i*r是p的倍数矛盾。所以i*r中没有任何两个同余与模p得证,即 ③i*a中没有任何两个同余与模p。 
证明了①②③,我们就可以证明费马小定理了: 
由于②③,我们可以得知i*a%p之后一定是1,2,3,…,p-1的一个排列,也就是: 
a∗2a∗3a∗…∗(p−1)a≡1∗2∗3∗…∗(p−1)(mod p),即: 
(p−1)!∗a p−1≡(p−1)!(mod p) 
因为①,所以可以同除以(p-1)!,得 ap−1≡1(mod p),费马小定理得证。


二、MR素数判断(优点:速度快  缺点:准确性低)

2.1 方法
Miller-Rabin素数测试(简称MR素数测试)利用费马小定理快速判断一个数是否是素数,但是由于这种方法只是较高概率不出现错误,并不是完全正确的,所以在时间充裕的情况下可不必使用这个方法。
2.2 实现
因为当n是素数,且gcd(a,n)=1时,a n−1≡1(mod n),所以我们可以随机几个a,增加算法的准确性,然后判断a n−1≡1(mod n)成不成立。由于n不是素数时a n−1≡1(mod n)几乎不成立,所以如果多个a测试过后,a n−1≡1(mod n)均成立,就认为n是素数了。但是还有这么一种合数,对于任意p为素数,gcd(a,p)=1,则a p−1≡1(mod p)都成立。这种数叫做卡迈克尔数。当然,这种数是很少的,在1~100000000范围内的整数中,只有255个卡迈克尔数。当碰到卡迈克尔数时,MR素数判断就毫无用武之地了。所以,在时间充裕的情况下,最好还是使用 线性筛



注:如果您通过此文学会了费马小定理及MR素数判断,请您点个赞再离开。当然,也欢迎在讨论区指出此文的不足处,作者会及时对此文加以修正
版权声明:转载请注明地址

猜你喜欢

转载自blog.csdn.net/chenxiaoran666/article/details/79765760
今日推荐