Miller-Rabin(米勒羅賓)素性測(cè)試

算法思想

對(duì)于大于2的素?cái)?shù)n,將n-1拆分為

其中s和d是正整數(shù)且d是奇數(shù)。對(duì)所有整數(shù)a(0<a<n),下面兩個(gè)式子一定有一個(gè)成立:![](http://latex.codecogs.com/svg.latex?a^d\equiv 1 \pmod{n}) ![](http://latex.codecogs.com/svg.latex?a{2r*d}\equiv -1 \pmod{n} (for \ some \ r \ that \ 0\leq r \leq s-1))
對(duì)于待測(cè)數(shù)n,當(dāng)找到的a不符合上述條件,那么稱a為一個(gè)"witness for the compositeness of n",且n一定是一個(gè)合數(shù)。否則稱a為一個(gè)"strong liar",且n是一個(gè)基于a的"strong probable prime"。

準(zhǔn)確性

所有的奇合數(shù)都有很多的a滿足"witness"的條件,不過(guò)目前為止還沒(méi)有確定的算法能夠直接根據(jù)n生成這樣的數(shù)a,于是我們可以多次隨機(jī)抽取1~n-1中的整數(shù)并做測(cè)試。
當(dāng)我們k次隨機(jī)選取a測(cè)試時(shí),一個(gè)合數(shù)被該算法判定為素?cái)?shù)的概率是4^(-k)。

一種實(shí)現(xiàn)

#include <iostream>
#include <cstdlib>
using namespace std;
typedef long long ll;

ll mod_pow(ll x, ll y, ll m) {
    ll base = x, res = 1;
    while (y) {
        if (y&1) (res*=base)%=m;
        (base*=base)%=m;
        y>>=1;
    }
    return res;
}

bool MillerRabin(ll n, int k) {
    if (n==2||n==3||n==5||n==7||n==11||n==13) return true;
    if (n==1||n%2==0||n%3==0||n%5==0||n%7==0||n%11==0||n%13==0) return false;
    ll d=n-1;
    int r=0;
    while (d%2==0) {
        d>>=1;
        ++r;
    }
    for (int i=0;i<k;++i) {
        ll a=rand()%(n-2)+2;
        ll x=mod_pow(a,d,n);
        bool flag = false;
        if (x==1||x==n-1) continue;
        for (int j=0;j<r-1;++j) {
            x=mod_pow(x,2,n);
            if (x==1) return false;
            if (x==n-1) {
                flag=true;
                break;
            }
        }
        if (flag) continue;
        return false;
    }
    return true;
}

int main() {
    ll n;
    while (cin>>n) {
        if (MillerRabin(n,5))
            cout<<"n is a prime number\n";
        else cout<<"n is not a prime number\n";
    }
    return 0;
}

其中ll mod_pow(ll x, ll y, ll m)實(shí)現(xiàn)的是模m意義下的快速冪運(yùn)算。

擴(kuò)展閱讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自Matrix大牛一個(gè)數(shù)是素?cái)?shù)(也叫質(zhì)數(shù)),當(dāng)且僅當(dāng)它的約數(shù)只有兩個(gè)——1和它本身。規(guī)定這兩個(gè)約數(shù)不能相同,因...
    Gitfan閱讀 2,168評(píng)論 0 1
  • 回溯算法 回溯法:也稱為試探法,它并不考慮問(wèn)題規(guī)模的大小,而是從問(wèn)題的最明顯的最小規(guī)模開(kāi)始逐步求解出可能的答案,并...
    fredal閱讀 14,015評(píng)論 0 89
  • 最近迷上了英文原版的書(shū)籍,哈利波特,冰與火之歌,暮光之城,福爾摩斯等所有通俗小說(shuō)都想入手一套。看了京東當(dāng)當(dāng)亞馬遜之...
    向清1314閱讀 331評(píng)論 0 4
  • 別院深深,夏木陰陰,擇石為桌,悠然待客。 關(guān)于夏天,關(guān)于蟬鳴,關(guān)于那些老院子,我總固執(zhí)地認(rèn)為:她美得失真,美得局氣...
    木頭加加閱讀 542評(píng)論 1 1
  • 今天的晨讀文章是如何成為一個(gè)社交高手,讓我突然就聯(lián)想到前段時(shí)間看過(guò)的一本書(shū)《蔡康永的說(shuō)話之道》,這本書(shū)是以一個(gè)個(gè)小...
    小V姑娘閱讀 227評(píng)論 0 0

友情鏈接更多精彩內(nèi)容