大素數測試

2021-05-24 01:56:21 字數 1217 閱讀 8233

關鍵字 (keywords):大素數 高效 快速 測試 檢測 驗證

先列出幾篇已經寫過的大素數測試的文章

基本都是用miller_rabin的測試方法

但似乎都沒有實現完整的**,另外對於miller_rabin的方法還有可以改進的地方

miller_rabin的演算法:

我們的問題是給定乙個數n,想判斷它到底是不是素數?

首先,根據公式:n - 1 = m * 2q,求出m和q(要求q,只要看n-1的二進位制右邊有多少個0就是q了)

若太大直接用2除,除到餘數不為0為止,這樣就可以得到m和q

再根據另外乙個公式:(x為1,2,...,n-1中的乙個數a的m次方,即am)判斷x2%n是不是等於1,

1. 如果等於1,並且判斷x!=1和x!=n-1,就返回合數

2. 如果不等於1,x=x2,判斷x2%n,再到一步驟

如果總共q次迴圈以後,沒有得出是合數,則判斷x是不是等於1

如果不等於1,則還是合數

如果等於1,則是素數(滿足fermat小定理)

為改進的miller_rabin的演算法:時間複雜度:o((log(n))3)

1. 若am(mod n)=1,則a2m,a4m,…,am*2^q(mod n)均=1

(後者是前者平方)

2. 如果對於某個非負整數i有am*2^i

(mod n)=n-1,則對於所有

3, 滿足i<j≤q的j,均有am*2^j

(mod n)=1

(實際上,當j>q時也成立)。

(∵(n-1)2=n2-2n+1≡1(mod n))

若n為素數,在首次遇到xm*2^i

(mod n)=1(1≤i≤q)之前,

必有am*2^i

(mod n)=n-1。(由定理:

若p為素數且0,則當x2

≡1(mod p)時必有x=1或x=p-1。)

改進以後的miller_rabin的演算法:

主程式**:

本篇部落格於2010/01/17前更新,謝謝^_^

檢驗大素數 公尺勒隨機測試

miller rabin 概率演算法,能處理10 19範圍數 include include include include include includeusing namespace std const int s 20 隨機演算法判定次數,s越大,判錯概率越小 計算 a b c.a,b都是lo...

大素數測試和大數素因子分解

小黃書第 章p82頁根據合數的拉賓 公尺勒測試可得到素數的必要條件。參考資料。以poj1811 prime test 為例。include include include includeusing namespace std typedef long long ll const int s 20 l...

數論 素數測試

檢查乙個正整數是否是素數稱作素數測試。基本素數判別法 正整數n是素數,當且僅當它不能被任何乙個小於根號n的素數整除 埃拉託斯尼斯篩法 先把n個自然數按次序排列起來。1不是 質數,也不是 合數,要划去。第二個數2是 質數留下來,而把2後面所有能被2 整除的數都劃去。2後面第乙個沒劃去的數是3,把3留下...