對miller rabin反向取數的測試

2021-06-20 09:16:48 字數 625 閱讀 4246

對於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...