素數判定Miller_Rabin 演算法詳解
阿新 • • 發佈:2019-01-03
嗯,就是這樣,至於那個定理我真的不是很清楚為何為這樣,有一篇講解文你們有興趣的話看看吧。#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <map> using namespace std; const int times = 20; int number = 0; map<long long, int>m; long long Random( long long n ) //生成[ 0 , n ]的隨機數 { return ((double)rand( ) / RAND_MAX*n + 0.5); } long long q_mul( long long a, long long b, long long mod ) //快速計算 (a*b) % mod { long long ans = 0; while(b) { if(b & 1) { b--; ans =(ans+ a)%mod; } b /= 2; a = (a + a) % mod; } return ans; } long long q_pow( long long a, long long b, long long mod ) //快速計算 (a^b) % mod { long long ans = 1; while(b) { if(b & 1) { ans = q_mul( ans, a, mod ); } b /= 2; a = q_mul( a, a, mod ); } return ans; } bool witness( long long a, long long n )//miller_rabin演算法的精華 {//用檢驗運算元a來檢驗n是不是素數 long long tem = n - 1; int j = 0; while(tem % 2 == 0) { tem /= 2; j++; } //將n-1拆分為a^r * s long long x = q_pow( a, tem, n ); //得到a^r mod n if(x == 1 || x == n - 1) return true; //餘數為1則為素數 while(j--) //否則試驗條件2看是否有滿足的 j { x = q_mul( x, x, n ); if(x == n - 1) return true; } return false; } bool miller_rabin( long long n ) //檢驗n是否是素數 { if(n == 2) return true; if(n < 2 || n % 2 == 0) return false; //如果是2則是素數,如果<2或者是>2的偶數則不是素數 for(int i = 1; i <= times; i++) //做times次隨機檢驗 { long long a = Random( n - 2 ) + 1; //得到隨機檢驗運算元 a if(!witness( a, n )) //用a檢驗n是否是素數 return false; } return true; } int main( ) { long long tar; while(cin >> tar) { if(miller_rabin( tar )) //檢驗tar是不是素數 cout << "Yes, Prime!" << endl; else cout << "No, not prime.." << endl; } return 0; }