1/********************************************* 
  2 •改编自国际大学生程序设计竞赛题解(一) 
  3 •源码为pascal 
  4 •增加creatPrime函数 
  5   6   7   8   9 •********************************************/  
 10  11  12 •#include <iostream>  
 13 •#include <ctime>  
 14 •usingnamespace std;  
 15  16  17 •constint N = 100;  
 18int prime[N];  
 19  20//最原始的素数判定方法  
 21bool isPrime1(int x)  
 22 •{     
 23if (x == 1)  
 24 •        returnfalse;  
 25bool result = true;  
 26for (int i = 2; i < x; i++)  
 27 •    {  
 28if (x % i == 0)  
 29 •        {  
 30 •            result = false;  
 31break;  
 32 •        }  
 33 •    }  
 34return result;  
 35 •}  
 36  37//改进的素数判定方法,从2到sqrt(x),每次检测的因数加1  
 38bool isPrime2(int x)  
 39 •{    
 40if (x == 1)  
 41 •        returnfalse;  
 42bool result = true;  
 43for (int i = 2; i * i <= x; i++)  
 44 •    {  
 45if ( x % i == 0)  
 46 •        {  
 47 •            result = false;  
 48break;  
 49 •        }  
 50 •    }  
 51return result;  
 52 •}  
 53  54//2的倍数都直接除掉,从3到sqrt(x)检测,每次检测的因数加2  
 55bool isPrime3(int x)  
 56 •{     
 57  58if ( ((x - 2) % 2 == 0) || (x == 1))  
 59 •        returnfalse;  
 60bool result = true;  
 61for (int i = 3; i * i <= x; i = i + 2)  
 62 •    {  
 63if ( x % i == 0)  
 64 •        {  
 65 •            result = false;  
 66break;  
 67 •        }  
 68 •    }  
 69return result;  
 70 •}  
 71  72/* 
 73 •先构造一个事先做好的素数表 
 74 •如primer[50] = {2,3,5,7} 
 75 */  
 76  77//构造素数表的函数  
 78void creatPrime(int A[], int N)  
 79 •{  
 80int maybeprime = 5;  
 81int gap = 4;  
 82int iCount = 2;  
 83 •    A[0] = 2;  
 84 •    A[1] = 3;  
 85  86while (iCount < N)  
 87 •    {     
 88bool isprime = true;  
 89 •        gap = 6 - gap;  
 90for (int i = 0; A[i] * A[i] <= maybeprime;i++)  
 91 •        {  
 92if (maybeprime % A[i] == 0)  
 93 •            {  
 94 •                isprime = false;  
 95break;  
 96 •            }  
 97 •        }  
 98if (isprime)  
 99 •            A[iCount++] = maybeprime;  
100 •        maybeprime += gap;  
101 •    }  
102 •}  
103 104bool isPrime4(int x)  
105 •{     
106if (x == 1)  
107 •        returnfalse;  
108 •    creatPrime(prime, N);  
109bool result = false;  
110for (int i = 0; prime[i] * prime[i] <= x; i++)  
111 •    {  
112if ( x % prime[i] == 0)  
113 •        {  
114 •            result = true;  
115break;  
116 •        }  
117 •    }  
118return result;  
119 •}  
120 121// 求a的b除以n的约数     
122//采用二进制提高效率类似于求a的b次方,减少循环次数     
123int modExp(int a, int b, int n)     
124 •{     
125int iresult = 1;     
126int itemp = a % n;     
127 128while (b > 0)     
129 •    {     
130if (b % 2 == 1)     
131 •        {     
132 •            iresult = (iresult * itemp) % n;     
133 •        }     
134 •        itemp = (itemp * itemp) % n;     
135 •        b /= 2;     
136 •    }     
137return iresult;     
138 •}     
139 140 141//Miller-Rabin概率测试法  
142/********************************************* 
143 •令大奇数n = (2^l) * m + 1, m是正奇数, 
144 •若b ^ m = 1(mod n) 或 b^(2^j * m) = -1 (mod n) , 
145 •0 <= j <= l-1,则通过测试,视为质数 
146 •**********************************************/  
147bool MillerRabinTest(int n)  
148 •{     
149 150int m = n - 1;  
151int l = 0;  
152while ( m % 2 == 0)  
153 •    {  
154 •        l++;  
155 •        m /= 2;  
156 •    }  
157 •    srand(time(NULL));  
158int b = rand() % (n-1) + 1;  
159if (modExp(b,m,n) == 1)  
160 •        returntrue;  
161int k = m;  
162for (int i = 0; i < l; i++)  
163 •    {  
164if (modExp(b,k, n) == n-1)  
165 •            returntrue;  
166 •        k = k * k;  
167 •    }  
168 •    returnfalse;  
169 170 •}  
171 172 173int main()  
174 •{     
175 •    cout << isPrime1(12) << endl;  
176 •    cout << isPrime2(15) << endl;  
177 •    cout << isPrime3(71) << endl;  
178 •    cout << isPrime4(5987) << endl;  
179 180 •    creatPrime(prime, N);  
181for (int i = 0; i < N; i++)  
182 •        cout << prime[i] << ' ';  
183 •    cout << endl;  
184 •    cout << MillerRabinTest(132397) << endl;  
185return 0;  
186 •}  

 

posted on 2012-08-02 16:42  我爱春香  阅读(89)  评论(0)    收藏  举报