Miller Rabin素數測試學習筆記

2021-09-06 05:08:52 字數 1621 閱讀 5233

好幾天前看了算導上的miller-rabin素數測試演算法,今天正好總結一下,寫寫筆記。

說miller-rabin測試以前先說兩個比較高效的求a*b% n 和 ab %n 的函式,這裡都是用到二進位制思想,將b拆分成二進位制,然後與a相加(相乘)

//

a * b % n

//例如: b = 1011101那麼a * b mod n = (a * 1000000 mod n + a * 10000 mod n + a * 1000 mod n + a * 100 mod n + a * 1 mod n) mod n

ll mod_mul(ll a, ll b, ll n)

return res;

}

//

a^b % n

//同理

ll mod_exp(ll a, ll b, ll n)

return res;

}

下面開始說miller-rabin測試:

費馬小定理:對於素數p和任意整數a,有ap ≡ a(mod p)(同餘)。反過來,滿足ap ≡ a(mod p),p也幾乎一定是素數。

偽素數:如果n是乙個正整數,如果存在和n互素的正整數a滿足 an-1 ≡ 1(mod n),我們說n是基於a的偽素數。如果乙個數是偽素數,那麼它幾乎肯定是素數。

miller-rabin測試:不斷選取不超過n-1的基b(s次),計算是否每次都有bn-1 ≡ 1(mod n),若每次都成立則n是素數,否則為合數。 

偽**:

function miller-rabin (n : longint) :boolean;

begin

for i := 1

to s do

begin

a := random(n - 2) + 2;

ifmod_exp(a, n-1, n) <> 1

then return false;

end;

return true;

end;

注意,miller-rabin測試是概率型的,不是確定型的,不過由於多次執行後出錯的概率非常小,所以實際應用還是可行的。(一次miller-rabin測試其成功的概率為3/4)

前邊說的偽**實現很簡短,下面還有乙個定理,能提高miller測試的效率:

二次探測定理

如果p是奇素數,則 x2 ≡ 1(mod p)的解為 x = 1 || x = p - 1(mod p);

可以利用二次探測定理在實現miller-rabin上新增一些細節,具體實現如下:

bool miller_rabin(ll n) 

srand((ll)time(0));

for(i = 0; i < s; ++i)

if(x != 1) return

false; //

費馬小定理

}return

true;

}

前邊這個演算法經過測試還是比較靠譜的,可以用作模板。本菜也找過其他模板,可是有的居然把9測成素數,汗 -_-!

Miller Rabin素數測試

公尺勒拉賓素數測試 測試大素數的原基於 如果 n 是素數 且與a 互質 那麼則有 a n 1 1 mod n 這個和費馬小定理 a n a mod n 差不多 1 因此首先可以進行快速冪取模函式 qpow 2 先將y y n 1 的偶數倍先將其右邊為0 的部分去掉 然後進行快速冪求模 3 這裡求出的...

Miller Rabin 素數測試

miller rabin 是乙個基於小費馬定理的隨機演算法。先來介紹一下費小馬定理 費馬小定理 當 p 為質數,則有當 1 leqslant a leqslant p 1 時有 a equiv 1 mod p 可能是素數 然後介紹一下素數二次測試 如果 p 是素數 x 2 equiv 1 mod p...

MillerRabin素數測試法

知道大家比較關心正確,網上教程好難找到資料,我就自己去wiki翻了 if n 2,047,it is enough to test a 2 if n 1,373,653,it is enough to test a 2 and 3 if n 9,080,191,it is enough to tes...