【模板】(旧)Miller Rabin 素数判定

Miller Rabin 素数判定

只是贴模板,不给自己做解释。

 

Pow 取模(a^b % mod)

int ModPow (LL a,LL p,LL mod) {
    LL ans=1;
    while(p){
        if (p&1) ans=(LL)(ans*a)%mod;
        a=(LL)(a*a)%mod;
        p>>=1;
    }
  return ans;     
}

 

Mul 取模(a*b % mod)

LL ModMul (LL a,LL b,LL mod) {
    LL ans=1;
    while(b) {
        if (b&1) ans=(LL)(ans+a)%mod;
        a=(LL)(a+a)%mod;
        b>>=1;
    }
    return ans;
}

(但据说有的时候Mul不仅没加速,反而减速了)

 

Miller Rabin 素数判断 (核心)

bool IsPrime (LL nm) {
    if (nm==2||nm==3||nm==5||nm==7||nm==11||nm==13) return true;
    if (nm==1||!(nm%2)||!(nm%3)||!(nm%5)||!(nm%7)||!(nm%11)) return false;
    LL a,u=nm-1,k=0,pre;
    while(u&1==0) {
        k++;
        u>>=1;    
    }
    for(int t=1;t<=TURN;t++) {
        a=rand()%(nm-2)+2;
        if (nm%a==0) continue;
        a=ModPow(a,u,nm);
        pre=a;
        for(int i=0;i<k;i++) {
            a=(LL)(a*a)%nm;
            if (a==1&&pre!=1&&pre!=-1) return false;
            pre=a;    
        }
        if (a!=1) return false;    
    }
  return true;    
}

 

 

模板借鉴博客:http://www.cnblogs.com/vongang/archive/2012/03/15/2398626.html

比较官方的讲解:http://blog.chinaunix.net/uid-26856484-id-3182166.html

另贴一道模板题:POJ 3641

posted @ 2017-06-16 17:06  Ztraveler  阅读(218)  评论(0编辑  收藏  举报