首页 > 其他 > 详细

Miller_Rabin codevs 1702 素数判定2

时间:2016-05-21 20:24:25      阅读:208      评论:0      收藏:0      [点我收藏+]
#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

原文:http://www.cnblogs.com/yanlifneg/p/5515458.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!