miller_rabin_素性测试
?
摘自:http://blog.csdn.net/pi9nc/article/details/27209455
看了好久沒看懂,最后在這篇博客中看明白了。
費馬定理的應(yīng)用,加上二次探測定理。
?
Fermat素數(shù)測試
1819年有人發(fā)現(xiàn)了Fermat小定理逆命題的第一個反例:雖然2的340次方除以341余1,但341=11*31。后來,人們又發(fā)現(xiàn)了561, 645, 1105等數(shù)都表明a=2時Fermat小定理的逆命題不成立。人們把所有能整除2^(n-1)-1的合數(shù)n叫做偽素數(shù)(pseudoprime)。
不滿足的n一定不是素數(shù);如果滿足的話則多半是素數(shù)。這樣,一個比試除法效率更高的素性判斷方法出現(xiàn)了:制作一張偽素數(shù)表,記錄某個范圍內(nèi)的所有偽素數(shù),那么所有滿足且不在偽素數(shù)表中的n就是素數(shù)。之所以這種方法更快,是因為我們可以使用二分法快速計算的值(快速冪)。
然而不借助偽素數(shù)表的時候,算法出錯的概率太高,需要改進.
我們剛才只考慮了a=2的情況。一個合數(shù)可能在a=2時通過了測試,但a=3時的計算結(jié)果卻排除了素數(shù)的可能。于是,人們擴展了偽素數(shù)的定義,稱滿足a^(n-1) mod n = 1的合數(shù)n叫做以a為底的偽素數(shù)(pseudoprime to base a)。
隨機選擇若干個小于待測數(shù)的正整數(shù)作為底數(shù)a進行若干次測試,只要有一次沒有通過測試就立即把這個數(shù)扔回合數(shù)的世界。這就是Fermat素性測試。
費馬小定理畢竟只是素數(shù)判定的一個必要條件.滿足費馬小定理條件的整數(shù)n未必全是素數(shù).有些合數(shù)也滿足費馬小定理的條件***.這些合數(shù)被稱作Carmichael數(shù),前3個Carmichael數(shù)是561,1105,1729. Carmichael數(shù)是非常少的.在1~100000000范圍內(nèi)的整數(shù)中,只有255個Carmichael數(shù).
***費馬小定理的前提是a和n互質(zhì)。當(dāng)n本身就是素數(shù)的時候如果a<n那么a和n始終互素;但n不是素數(shù)時a和n不互素的話不能用費馬小定理。也就是說,Carmichael數(shù)需要排除a和n不互素的情況.
利用下面的二次探測定理可以對上面的素數(shù)判定算法作進一步改進,以避免將Carmichael數(shù)當(dāng)作素數(shù).
Miller_Rabin素數(shù)測試算法
二次探測定理優(yōu)化
?
?Miller和Rabin兩個人的工作讓Fermat素性測試邁出了革命性的一步,建立了Miller-Rabin素性測試算法。新的測試基于下面的定理:
如果p是素數(shù),x是小于p的正整數(shù),且,那么要么x=1,要么x=p-1。
這是顯然的,因為相當(dāng)于p能整除,也即p能整除(x+1)(x-1)。
由于p是素數(shù),那么只可能是x-1能被p整除(此時x=1) 或 x+1能被p整除(此時x=p-1)。
我們下面來演示一下上面的定理如何應(yīng)用在Fermat素性測試上。前面說過341可以通過以2為底的Fermat測試,因為2^340 mod 341=1。如果341真是素數(shù)的話,那么2^170mod?341只可能是1或340;當(dāng)算得2^170 mod 341確實等于1時,我們可以繼續(xù)查看2^85除以341的結(jié)果。我們發(fā)現(xiàn),2^85 mod 341=32,這一結(jié)果摘掉了341頭上的素數(shù)皇冠
這就是Miller-Rabin素性測試的方法。不斷地提取指數(shù)n-1中的因子2,把n-1表示成(其中d是一個奇數(shù))。那么我們需要計算的東西就變成了除以n的余數(shù)。于是,要么等于1,要么等于n-1。如果等于1,定理繼續(xù)適用于,這樣不斷開方開下去,直到對于某個i滿足或者最后指數(shù)中的2用完了得到的。這樣,Fermat小定理加強為如下形式:
盡可能提取因子2,把n-1表示成,如果n是一個素數(shù),那么或者,或者存在某個i使得?( 0<=i<r ) (注意i可以等于0,這就把的情況統(tǒng)一到后面去了)
?
Miller-Rabin素性測試同樣是不確定算法,我們把可以通過以a為底的Miller-Rabin測試的合數(shù)稱作以a為底的強偽素數(shù)(strong pseudoprime)。第一個以2為底的強偽素數(shù)為2047。第一個以2和3為底的強偽素數(shù)則大到1 373 653。
Miller-Rabin算法的代碼也非常簡單:計算d和r的值(可以用位運算加速,即快速積,快速冪),然后二分計算的值,最后把它平方r次。
對于大數(shù)的素性判斷,目前Miller-Rabin算法應(yīng)用最廣泛。一般底數(shù)仍然是隨機選取,但當(dāng)待測數(shù)不太大時,選擇測試底數(shù)就有一些技巧了。比如,如果被測數(shù)小于4 759 123 141,那么只需要測試三個底數(shù)2, 7和61就足夠了。當(dāng)然,你測試的越多,正確的范圍肯定也越大。如果你每次都用前7個素數(shù)(2, 3, 5, 7, 11, 13和17)進行測試,所有不超過341 550 071 728 320的數(shù)都是正確的。如果選用2, 3, 7, 61和24251作為底數(shù),那么10^16內(nèi)唯一的強偽素數(shù)為46 856 248 255 981。這樣的一些結(jié)論使得Miller-Rabin算法在OI中非常實用。通常認為,Miller-Rabin素性測試的正確率可以令人接受,隨機選取k個底數(shù)進行測試算法的失誤率大概為4^(-k)。
轉(zhuǎn)載于:https://www.cnblogs.com/jasonlixuetao/p/5459623.html
總結(jié)
以上是生活随笔為你收集整理的miller_rabin_素性测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HoloLens开发手记 - 手势输入
- 下一篇: centos7系统/etc/resolv