Rabin-Miller素性測試演算法
阿新 • • 發佈:2019-01-08
如果要求演算法的錯誤率小於 t 則bool millerRabinPrimeTest(unsigned long p,int cnt){//對於素數p進行檢驗 ,檢驗cnt次 unsigned long k=0; unsigned long q= p-1; unsigned long r=0; if(q!=1&&q%2==1)return false; for (;q%2!=1;k++)q/=2; for (int i=0;i<cnt;i++){ r=rand()%(p-1)+1;//從[1,p-1]隨機選取一個數 if(qe2(r,q,p)==1)continue; else{ for (unsigned long j=0;j<k;j++){ if(qe2(r,pow(2,j)*q,p)==p-1)break; else if(j==k-1)return false; } } } return true; } unsigned long qe2(unsigned long x,unsigned long y,unsigned long n){//使用加法鏈實現的模冪函式 即 x^y mod n unsigned long s,t,u; s=1;t=x;u=y; while(u){ if(u&1)s=(s*t)%n; u>>=1; t=(t*t)%n; }