給定乙個數 \(n\),判斷是否是質數。
\(n\leq 10^\)。
miller–rabin 素數測試板子題。推薦部落格。
質數有兩個性質。一是眾所周知的費馬小定理:若 \(p\) 是質數,且 \(x\) 不是 \(p\) 的倍數,則
\[x^\equiv 1\pmod p
\]還有乙個二次探測定理。如果 \(p\) 是質數且 \(x^2\equiv 1\pmod p\),那麼 \(x\equiv1\pmod p\) 或 \(x\equiv p-1\pmod p\)。
證明直接把 \(1\) 移項平方差即可。
所以對於乙個要測試的數 \(p\),我們取乙個數 \(a\),先判斷 \(a^\bmod p\) 是否等於 \(1\)。如果不是那麼顯然 \(p\) 是合數。
接下來重複此操作:
如果 \(p-1\) 是奇數則直接退出迴圈。
計算 \(a^}\bmod p\),根據二次探測定理,如果答案不是 \(1\) 或 \(n\) 則 \(p\) 是合數。
如果答案是 \(1\) 則取 \(p'=\frac\) 繼續探測。
隨機選 \(a\) 的話,miller–rabin 有 \(\frac\) 的概率出錯。所以如果測試 \(k\) 次,測試錯誤的概率就降至 \(\frac\)。
在資料範圍不同時 \(a\) 的選取可以參考 wiki。
#include using namespace std;
typedef long double ld;
typedef long long ll;
const int prm[10]=;
ll n;
ll fmul(ll x,ll y,ll mod)
ll fpow(ll x,ll k,ll mod)
bool mr(ll n)
return 1;
}int main()
LOJ 143 質數判定 題解
csdn同步 原題鏈結 簡要題意 給定 t 個數 n 判素數。t leq 10 5 n leq 10 可能你判乙個都有困難是不是 cdots cdots 若 x 2 equiv 1 pmod p x p 則 x 1 或 x p 1 簡單證明 x 2 equiv 1 pmod p x 1 x 1 eq...
數學知識 質數(質數的判定 分解質因數 篩質數)
在大於1的整數中,如果只包含1和她本身這兩個約數,那麼這個整數被稱為質數。給定n個正整數ai,判定每個數是否是質數。輸入格式 第一行包含整數n。接下來n行,每行包含乙個正整數ai。輸出格式 共n行,其中第 i 行輸出第 i 個正整數ai是否為質數,是則輸出 yes 否則輸出 no 資料範圍 1 n ...
Miller Rabin隨機法判定大質數
在測試一些非常大的數時,如果用根號n的方法判斷也會耗掉大量時間,實際上我們有更快的方法 miller rabin隨機法 我們知道,費馬小定理 假如p是質數,且 a,p 1 那麼a p 1 1 mod p 即假如p是質數,且a,p互質,那麼a的 p 1 次方除以p的餘數恆等於1。在大多數情況下費馬小定...