Miller_Rabin codevs 1702 素数判定2
Posted 一入OI深似海
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Miller_Rabin codevs 1702 素数判定2相关的知识,希望对你有一定的参考价值。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<ctime> #define ll long long #define T 10 using namespace std; ll slow_mul(ll a,ll b,ll c)//防止爆掉 { ll ans=0; a=a%c;b=b%c; while(b) { if(b&1) { b--;ans+=a; ans=ans%c; } a=a<<1;a=a%c; b=b>>1; } return ans; } ll Mi(ll a,ll m,ll n)//快速幂 a^m%n { if(m==0)return 1; ll x=Mi(a,m/2,n)%n; x=slow_mul(x,x,n); if(m%2==1)x=slow_mul(x,a,n); return x; } bool Miller_Rabin(ll n) { if(n<2)return 0; if(n==2)return 1; if(n%2==0)return 0; ll m=n-1,j=0; while(m%2==0)//计算m j 使得n-1=m*2^j且j尽量大 { j++; m >>=1; } srand(unsigned(time(0))); for(int i=1;i<=T;i++)//T次测试 { ll a=rand()%(n-1)+1; ll x=Mi(a,m,n);//计算a^m%n ll y; for(int k=1;k<=j;k++) { y=slow_mul(x,x,n); if(y==1&&x!=1&&x!=n-1)return 0;//一定不是素数 x=y; } if(x!=1)return 0;//不符合费马小定理 } return 1; } int main() { ll n; cin>>n; if(Miller_Rabin(n))printf("Yes\n"); else printf("No\n"); }
以上是关于Miller_Rabin codevs 1702 素数判定2的主要内容,如果未能解决你的问题,请参考以下文章