费马小定理与素数判定
2013-08-12 15:57
309 查看
费马小定理是初等数论四大定理(威尔逊定理,欧拉定理(数论中的欧拉定理,即欧拉函数),中国剩余定理和费马小定理)之一,在初等数论中有着非常广泛和重要的应用。实际上,它是欧拉定理的一个特殊情况。
其内容为: 假如p是质数,且GCD(a,p)=1,那么 a^(p-1) ≡1(mod p)(假如p是质数,且a,p互质,那么 a的(p-1)次方除以p的余数恒等于1)
证明:大数取余的公式 (a*b)%mod =(a%mod * b%mod) %mod, 设P为素数 那么 (a*k) %p =(a%p*k) % P [1<=k<=p-1] ;a%p=c是个定值,由于p是个素数,所以(a%p*k) % P的值互不相同,如果存在 (c*i) %p == (c*j) %p (i<j) 那么 c*i +p*t == c*j , 说明 c = a%p 可以被 p 整除 ,显然不成立; (a*k) %p的值在[1,p-1]中取,既然互不相同,所以 (a*k) %p的值覆盖了 [1,p-1] 中的所有数,则 (a*1) %p * (a*2) %p * (a*3) %p * ... * (a*(p-1)) %p = 1*2*3*...*(p-1) =(a^(p-1))%p *1*2*3*...*(p-1) ==> (a^(p-1))%p=1 证毕。
用费马小定理的逆命题可以来判定素数,但是其逆命题不一定成立,所以有一定的概率,需要多次测试来减小出错的概率。每次测试随机取一个正整数a,要保证 GCD(a,p)=1; 用快速幂来计算a^(p-1) 看是否为 1,如果为1则通过这次测试。 但是这样也可能出错,因为存在称做Carmichael数的合数,使得对这些合数进行多次测试都能通过,但是它们不是素数。前3个Carmichael数是561,1105,1729。Carmichael数是非常少的。在1~100000000范围内的整数中,只有255个Carmichael数。利用二次探测定理可以对上面的素数判定算法作进一步改进,以避免将Carmichael数当作素数。
二次探测定理 如果p是一个素数,且0<x<p,则方程x^2≡1(mod p)的解必为 x=1或p-1。
素数判定代码
还有更高效的方法来判定素数。
其内容为: 假如p是质数,且GCD(a,p)=1,那么 a^(p-1) ≡1(mod p)(假如p是质数,且a,p互质,那么 a的(p-1)次方除以p的余数恒等于1)
证明:大数取余的公式 (a*b)%mod =(a%mod * b%mod) %mod, 设P为素数 那么 (a*k) %p =(a%p*k) % P [1<=k<=p-1] ;a%p=c是个定值,由于p是个素数,所以(a%p*k) % P的值互不相同,如果存在 (c*i) %p == (c*j) %p (i<j) 那么 c*i +p*t == c*j , 说明 c = a%p 可以被 p 整除 ,显然不成立; (a*k) %p的值在[1,p-1]中取,既然互不相同,所以 (a*k) %p的值覆盖了 [1,p-1] 中的所有数,则 (a*1) %p * (a*2) %p * (a*3) %p * ... * (a*(p-1)) %p = 1*2*3*...*(p-1) =(a^(p-1))%p *1*2*3*...*(p-1) ==> (a^(p-1))%p=1 证毕。
用费马小定理的逆命题可以来判定素数,但是其逆命题不一定成立,所以有一定的概率,需要多次测试来减小出错的概率。每次测试随机取一个正整数a,要保证 GCD(a,p)=1; 用快速幂来计算a^(p-1) 看是否为 1,如果为1则通过这次测试。 但是这样也可能出错,因为存在称做Carmichael数的合数,使得对这些合数进行多次测试都能通过,但是它们不是素数。前3个Carmichael数是561,1105,1729。Carmichael数是非常少的。在1~100000000范围内的整数中,只有255个Carmichael数。利用二次探测定理可以对上面的素数判定算法作进一步改进,以避免将Carmichael数当作素数。
二次探测定理 如果p是一个素数,且0<x<p,则方程x^2≡1(mod p)的解必为 x=1或p-1。
long long gcd(long long a,long long b) { if (b==0) return a; return gcd(b,a%b); } long long Qpower(long long a,long long b,long long mod) { if (b==1) return a%mod; if (b&1) return ((a%mod)*Qpower(a,b-1,mod))%mod; long long t=Qpower(a,b>>1,mod); long long tt=(t*t)%mod; if (tt==1) // 二次探测 { if (t!=1 && t!=mod-1) iff=false; } return tt; } bool ifp(long long p) { int T=30; iff=true; while (T--) { long long a=rand()%10000*rand()+1; //不能取0 while (gcd(a,p)!=1){ if (a<p || a%p!=0) return false;a=rand()%1000*rand()+1;} if (Qpower(a,p-1,p)!=1|| !iff) return false; } return true; }
素数判定代码
还有更高效的方法来判定素数。
相关文章推荐
- 【转】费马小定理 素数判定 蒙哥马利算法
- 费马小定理 素数判定 蒙哥马利算法
- 素数判定(米勒测试定理-费马小定理+快速乘)
- 费马小定理——从素数判定到RSA公钥加密体制
- 素数判定(费马小定理)
- 素数判定(这题对我来说竟然一次没有搞定)
- 素数判定
- java hdu2012素数判定
- 2012 素数判定
- 素数判定
- 例 5.9 输入一个大于3的整数n,判定它是否为素数(prime,又称质数)。
- 2012素数判定
- Pseudoprime numbers poj3641(快速幂+素数判定)
- 素数判定
- HDU2012 素数判定
- 【杭电oj2012】素数判定
- 素数判定
- HDU 素数判定
- HDU 2012 素数判定(素数)
- 快速判定素数