miller_rabin:概率演算法,能處理10^19範圍數
#include#include#include#include#include#includeusing namespace std;
const int s=20;//隨機演算法判定次數,s越大,判錯概率越小
//計算 (a*b)%c. a,b都是long long的數,直接相乘可能溢位的
// a,b,c <2^63
long long mult_mod(long long a,long long b,long long c)
a<<=1;
if(a>=c)a%=c;
b>>=1;
}return ret;
}//計算 x^n %c
long long pow_mod(long long x,long long n,long long mod)//x^n%c
return ret;
}//以a為基,n-1=x*2^t a^(n-1)=1(mod n) 驗證n是不是合數
//一定是合數返回true,不一定返回false
bool check(long long a,long long n,long long x,long long t)
if(ret!=1) return true;
return false;
}// miller_rabin()演算法素數判定
//是素數返回true.(可能是偽素數,但概率極小)
//合數返回false;
bool miller_rabin(long long n)
for(int i=0;ireturn true;
}int main()
return 0;
}
大素數的檢驗
費馬小定理 a p 1 mod p 1 p是素數 a0 首先我們證明這樣乙個結論 如果p是乙個素數的話,那麼對任意乙個小於p的正整數a,a,2a,3a,p 1 a 除以p的餘數正好是乙個1到p 1的 排列。例如,5是素數,3,6,9,12除以5的餘數分別為3,1,4,2,正好就是1到4這四個數。反證...
公尺勒羅蘋素數檢測法
原理是費馬小定理 如果p是素數,則a p 1 p 1,加上二次探測定理 如果p是乙個素數,則x 2 p 1的解為,則x 1或者x n 1。一次檢測中 主要是把乙個數n的n 1分解成d 2 r的形式,其中d為奇數,正向過程是a n p如果是1,就繼續分解 a n 2 p,a為乙個與n互素的數 看是否為...
公尺勒拉賓素數檢測
是一種隨機化素數檢測演算法 基於下面的定理 費馬小定理的逆命題 如果 a equiv 1 bmod p 成立,那麼 p 是乙個素數且 a 不是 p 的倍數 可以確定費馬小定理的逆命題不一定成立。那麼對於乙個數,如果不滿足 a equiv 1 bmod p 那麼一定不是素數,如果滿足,那麼有可能是素數...