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