米勒拉宾素数测试

学了下米勒拉宾素数测试,然而没题目。。

莫名其妙就能判断一个数是否是素数,很玄学。。证明也不会。。

 

蒯了网上一个神犇: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",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 }

 

posted @ 2017-03-16 09:25  wfj_2048  阅读(390)  评论(0编辑  收藏  举报