1. 程式人生 > >Rabin-Miller素性測試演算法

Rabin-Miller素性測試演算法

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;
	}
如果要求演算法的錯誤率小於 t 則