日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

miller_rabin_素性测试

發(fā)布時間:2025/6/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 miller_rabin_素性测试 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

摘自: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次。

/*對應(yīng)hoj 1356 Prime Judge*/ #include <cstdio> #define MT 5 using namespace std; typedef long long ll; int prime[] = {2, 3, 7, 61, 24251}; inline ll mulmod(ll a, ll b, ll k) {//*標出了核心語句 // a %= k; // b %= k; if (b < 0) {///將b變?yōu)檎? a = -a; b = -b; } ll re = 0, temp = a; ///re為最終結(jié)果,temp保持循環(huán).re需要temp的時候,就加一下,否則temp繼續(xù)累乘 while (b) { if (b & 1) re += temp;///二進制思想,需要即加* // re %= k; b >>= 1;///下一位等待檢測** temp <<= 1;///temp一直累乘*** // temp %= k; } return re%k;*/ /*實際上呢,用以上的函數(shù)在hoj 1356是會TLE的(mod太多次了...)~應(yīng)該用下面的方法...*/ return (a*b)%k;//-_-b } //此時不需要再模,于是只剩下核心語句~快速冪和快速積都是二進制思想,核心是一樣的 inline ll powermod(ll a, ll b, ll k) { ll re = 1, temp = a; while (b) { if (b & 1) re = mulmod(re, temp, k);//只是把"加"入答案變?yōu)?#34;乘"入答案 temp = mulmod(temp, temp, k); b >>= 1; } return re; } int TwiceDetect(ll a, ll b, ll k) { int t = 0; ll x, y; while ((b & 1) == 0) { b >>= 1; t++; } /// b = d * 2^t; b = d; y = x = powermod(a, b, k);/// x = y = a^d % n ///二次探測定理是反向遞歸的,當(dāng)然也可以用如下的正向迭代法去測試 while (t--) { y = mulmod(x, x, k); if (y == 1 && x != 1 && x != k - 1)///注意y!=1的時候是不做判斷的,即對應(yīng) return 0;///遞歸時在某一環(huán)節(jié)x==p-1的情況,對此x開方則無意義,但是迭代的話不能break,只能ignore并繼續(xù). x = y;///繼續(xù)向高次迭代,那么至少最后一次應(yīng)該是等于1的(Fermat小定理) } return y; } bool Miller_Rabin(ll n) { int i; ll tmp; for (i = 0; i < MT; i++) { tmp = prime[i]; if (n == prime[i]) return true; if (TwiceDetect(tmp, n - 1, n) != 1) break; } return (i == MT); } int main() { ll n; while (scanf("%lld", &n) == 1) { if ((n > 1) && Miller_Rabin(n)) { printf("YES\n"); } else { printf("NO\n"); } } return 0; } View Code

對于大數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 性爱视频免费 | 2020国产在线 | 探花精品 | 七七久久 | 国产精品乱码久久久久 | 色窝网 | 97超碰人人草 | 亚洲视频综合 | 污污污污污污www网站免费 | 91国产丝袜在线播放 | 亚洲福利一区二区 | 一级大片免费观看 | 在线激情小视频 | 婷婷去俺也去 | 第一页国产 | 美女屁股眼视频网站 | 经典杯子蛋糕日剧在线观看免费 | 999精彩视频 | 美女被娇喘流出白 | a√天堂网 | 青青草视频免费 | 伊人久久一区二区 | 久久99精品久久只有精品 | 日本黄色大片免费 | 中文字幕日韩欧美一区二区 | 精品久久久久久无码中文野结衣 | 亚洲伦理网 | 黄色激情av | 日本老妇高潮乱hd | 成人视品 | 国产亚洲精品熟女国产成人 | 熟妇毛片 | 看av免费毛片手机播放 | 国产做爰免费视频观看 | 国产a久久麻豆入口 | 91成人午夜 | 天降女子| 波多野结衣中文在线 | 日本一区二区三区免费在线观看 | 中文字幕码精品视频网站 | 久操av | 一级视频在线观看 | 污视频网站免费在线观看 | 久草热线 | 日韩中文字幕不卡 | 国产大片aaa | 国产精品女教师 | 日本美女动态 | 日日射天天干 | 中文字幕成人网 | 草草影院最新地址 | 日韩三级欧美 | 激情久久一区 | 蜜桃成人网 | 久久一卡二卡 | 午夜久久久久久久久久 | 动漫精品一区二区三区 | 国产一区二区三区在线 | 日日躁夜夜躁狠狠久久av | 久久精品久久久精品美女 | 在线观看视频亚洲 | 毛片基地在线观看 | 高清av网站| a在线天堂| 亚洲高清影院 | 无码人妻丰满熟妇奶水区码 | 日本国产中文字幕 | 91视频99| 色五婷婷 | 鲁大师私人影院在线观看 | 亚洲午夜精品一区二区三区 | 日韩狠狠| 人人看人人艹 | 日韩精品电影一区二区三区 | 亚洲在线免费看 | 日本国产精品视频 | 欧美精品久久久久久久久久 | 免费h漫禁漫天天堂 | 久久911| 欧美一二三区在线观看 | 国产精品一品二区三区的使用体验 | 日韩丝袜一区 | 日本少妇做爰全过程毛片 | 国产综合内射日韩久 | 中文字幕免费看 | 国产综合精品在线 | 原创真实夫妻啪啪av | 欧美日韩在线观看一区二区 | 婷婷影视 | 窝窝视频在线 | 草草影院第一页 | 日韩精品一区二区三区 | 国产精品免费看片 | 另类男人与善交video | 插我舔内射18免费视频 | 日韩精品视频一区二区三区 | 中国色视频| 午夜视频导航 | 4388成人网 |