题意:给你一个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;
}