對於miller-rabin 的判斷是把1個奇數寫成d×2^n,其中d為奇數, 進行費馬測試 a^d mod p,為1,不為1,再進行二次探測,根據a^n a^(2n) a^(4n)…a^(p-1) mod p看是否為-1,如果為-1,則可能為素數,否則肯定是合數。能否反過來判斷?
對於乙個奇數n,a^((n-1)/2) mod n,看是否為為-1,如果為-1,可能是素數,否則肯定不是素數,如果為1,則判斷(n-1)/2是否為奇數,如果為奇數,可能是素數,不為1,肯定不是素數,演算法如下(n為奇數):
1 i=(n-1)/2
2 m= a^i mod n
3 if m =-1 n可能是素數 exit
if m=1 且 i為奇數 n可能是素數 exit
if m<> -1 or m<>1 n肯定不是素數 exit
4 i=i//2 重複 1
對於miller_rabin測試方法, 9可以通過測試,用上述測試方法,9不會通過測試,但在10000內以2為底共有5個合數通過測試:2047 3277 4033 4681 8321(詳見附錄)。
不過這個的演算法與miller-rabin哪個速度更快更好,我沒有測試過,僅作為對素數測試的一種參考吧,不知道是否正確,望各位批評指正。
Miller Rabin素數測試演算法模板對比
昨天在usaco做了一道判斷素數的題,就想著學習一下miller rabin素數測試演算法,在網上找到兩種模版,第一種十分簡潔,執行速度也很快,但是會判錯極少的幾個非素數 第二種比較麻煩,執行速度很慢,所以我便想找到第一種模版不能判斷的非素數特判一下,結果用了一天,電腦只找到10 8以下的,10 9...
對組合數取模
看這個之前建議先看一下n!對於組合數我們可以將其表示成階乘的形式 c n,k 那我們不妨把這三個階乘全部表示成上個專題的形式。這樣的話,如果對於 e1 e2 e3 就可以被 p整除,e1 e2 e3 就無法被 p整除。在無法被整除的情況下 c n,k a1 a2a3 11 int mod comb ...
flask多對多的正向 反向引用
flask多對多關係的查詢 新增 刪除 角色模型 class role db.model tablename role r id db.column db.integer,autoincrement true primary key true r name db.column db.string 1...