学了下米勒拉宾素数测试,然而没题目。。
莫名其妙就能判断一个数是否是素数,很玄学。。证明也不会。。
蒯了网上一个神犇:http://www.cnblogs.com/JVxie/p/4975876.html
米勒拉宾算法的基本概念如下:
首先判断这个数n的奇偶性
若为偶数仅有2是质数
奇数则进入测试
测试方法:
首先确定几个基底a,范围在[2,n-1]
因为n是奇数,所以n-1必定为偶数
则n-1可以表示为(2^s)*d
s、d分别求出来
设t为a^d模n的数,有如下几个约定:
1.若t=-1或1时则该数n可能为质数
2.若此时t=n-1,则该数可能为质数
3.d*2>n-1时n必为合数
4.若上述皆不满足则让d*2,返回2
多组测试之后就能判断是否为质数,而且错误率相当低!!
不过想证明米勒拉宾的正确性还是很困难的
需要费马小定理等七七八八的数论
具体的可以百度
我就不给于证明了~
模板也是蒯的:
1 //It is made by wfj_2048~ 2 #include <algorithm> 3 #include <iostream> 4 #include <complex> 5 #include <cstring> 6 #include <cstdlib> 7 #include <cstdio> 8 #include <vector> 9 #include <cmath> 10 #include <queue> 11 #include <stack> 12 #include <map> 13 #include <set> 14 #include <ctime> 15 #define il inline 16 #define RG register 17 #define ll long long 18 #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) 19 20 using namespace std; 21 22 il ll gi(){ 23 RG ll x=0,q=1; RG char ch=getchar(); while ((ch<'0' || ch>'9') && ch!='-') ch=getchar(); 24 if (ch=='-') q=-1,ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; 25 } 26 27 il ll qpow(RG ll a,RG ll b,RG ll p){ 28 RG ll ans=1; 29 while (b){ 30 if (b&1) ans=ans*a%p; 31 a=a*a%p,b>>=1; 32 } 33 return ans; 34 } 35 36 il ll miller_rabbin(RG ll n,RG ll a){ 37 RG ll d=n-1,s=0; 38 while (!(d&1) && d) d>>=1,s++; 39 RG ll t=qpow(a,d,n); 40 if (t==1 || t==-1) return 1; 41 while (s--){ 42 if (t==n-1) return 1; 43 t=t*t; if (t>=n) t%=n; 44 } 45 return 0; 46 } 47 48 il ll isprime(RG ll n){ 49 if (n==1) return 0; 50 if (!(n&1)) return n==2; 51 for (RG ll i=0;i<5;++i){ 52 RG ll a=rand()%(n-2)+2; 53 if (!(n%a)) return 0; 54 if (!miller_rabbin(n,a)) return 0; 55 } 56 return 1; 57 } 58 59 il void work(RG ll n){ 60 if (isprime(n)) printf("%lld ",n); 61 return; 62 } 63 64 int main(){ 65 File("miller_rabbin"); 66 srand(time(NULL)); 67 for (RG ll i=1;i<=10000000;++i) work(i); 68 return 0; 69 }