1 //MILLER_RABINE素数判别法 2 #include<iostream> 3 using namespace std; 4 5 #include<vector> 6 #include<cstdlib> 7 #include<cmath> 8 9 int MODULAR_EXPONENTIATION(int a,int b,int n)//a^b mod n 10 { 11 int c = 0,d = 1; 12 vector<int> vb; 13 while(b) 14 { 15 vb.push_back(b%2); 16 b /= 2; 17 } 18 int k = vb.size()-1; 19 for(int i = k;i >= 0;--i) 20 { 21 c *= 2; 22 d = (d*d)%n; 23 if(vb[i] == 1) 24 { 25 ++c; 26 d = (d*a)%n; 27 } 28 } 29 vb.clear(); 30 return d; 31 } 32 33 bool WITNESS(int a,int n) 34 { 35 int t = 0,u,k = n; 36 --k; 37 while(k%2 == 0) 38 { 39 k /= 2; 40 ++t; 41 } 42 u = k; 43 int *x = new int[t+1]; 44 x[0] = MODULAR_EXPONENTIATION(a,u,n); 45 for(int i = 1;i <= t;++i) 46 { 47 x[i] = x[i-1]*x[i-1]%n; 48 if(x[i] == 1 && x[i-1] != 1 && x[i-1] != n-1) 49 return true; 50 } 51 if(x[t] != 1) return true; 52 return false; 53 } 54 55 bool MILLER_RABIN(int n,int s) 56 { 57 int a; 58 srand(0); 59 for(int j = 1;j <= s;++j) 60 { 61 a = rand(); 62 a %= n; 63 if(a < n-1) ++a; 64 if(WITNESS(a,n)) return false; 65 } 66 return true; 67 } 68 69 int main() 70 { 71 vector<int> vi; 72 vi.push_back(2); 73 for(int i = 3;i <= 32768;i += 2) 74 { 75 if(MILLER_RABIN(i,10)) vi.push_back(i); 76 } 77 78 return 0; 79 }