梅森素数(nefu120)

来源:互联网 发布:公司宿舍网络不稳定 编辑:程序博客网 时间:2024/04/27 17:09

题意:给你一个p,判断Mp是否是梅森素数如果是输出也是,如果不是输出no

思路:Miller测试判断素数,先算出2^p-1在判断a^(2^p-1-1) 模 2^p余数是否为1.

这道题乘法平方会溢出,所以必须把乘法变成加法,a的范围一定是 1<= a <= n-1;是n-1!!!注意啊

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<cstdlib>using namespace std;typedef long long int64;const int Maxcnt = 32;int64 random(int64 m){  return (int64)(rand()%m);}int64 MUL(int64 a,int64 b,int64 m){    int64 sum = 0;    while(b > 0)    {        if(b&1)        {            sum = (sum + a) % m;        }        b = b >> 1 ;        a = (a << 1) % m;    }    return sum;}int64 Mul(int64 a,int64 b,int64 m){   int64 sum  = 1;   while(b > 0)   {       if(b%2 == 1)         sum = MUL(sum,a,m);       b = b / 2;       a = MUL(a,a,m);   }   return sum;}int64 qMul(int64 a,int64 n){    if(n == 1)        return a;    int64 ans = qMul(a,n/2);    if(n % 2 == 1)        return ans*ans*a;    else        return ans*ans;}bool Miller(int64 m){    for(int i = 0; i <= Maxcnt; i++)    {        int64 a = random(m-1)+1;        if(Mul(a,m-1,m) != 1)            return false;    }    return true;}int main(){    int n,t;    scanf("%d",&t);    while( t--)    {        scanf("%d",&n);        {            int64 a = ((long long)1 << n) -1 ;            if(Miller(a))                printf("yes\n");            else                printf("no\n");        }    }    return 0;}


原创粉丝点击