#include<iostream>
#include<algorithm>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
ll muil(ll a,ll b,ll m) //乘法换加法
{
ll res=0;
while(b>0)
{
if(b&1)
res=(res+a)%m;
b>>=1;
a=(a<<1)%m;
}
return res;
}
ll r[70];
bool is_msprime(int p) //判断第p个数是否为梅森素数
{
ll m=1;
m=(m<<p)-1;
r[1]=4LL;
if(p==2)
return true;
for(int i=2;i<p;i++)
r[i]=(muil(r[i-1],r[i-1],m)-2)%m;
if(r[p-1]==0)
return 1;
return 0;
}
int main()
{
int casei;
scanf("%d",&casei);
while(casei--)
{
int p;
scanf("%d",&p);
if(is_msprime(p))
printf("yes\n");
else
printf("no\n");
}
return 0;
}
nefu 120 梅森素数 (Lucas-Lehmer判别法+乘法换加法法)
最新推荐文章于 2022-08-01 19:40:08 发布