定义:如果m是一个正整数,且2^m-1是一个素数,则m必是素数.反之,如果m是一个正整数,素数且Mm=2^m-1成为第m个梅森数;如果p是一个素数,并且Mp=2^p-1也是素数,那么Mp=2^p-1也是素数,那么Mp就称为梅森素数.
Lucas-Lehmer判定方法.
设p是素数,第p个梅森数为Mp=2^p-1,r1=4;
对于k>=2,利用rk=((r(k-1))^2-1)%Mp,0<=rk<Mp
可以得到rk的序列,则有Mp是素数,当且仅当rp-1%Mp==0;
#include<iostream>
#define ll long long
using namespace std;
ll mul( ll a,ll b,ll mod )
{
ll ret=0;
while( b>0 )
{
if( b&1 )
ret=(ret+a)%mod;
b>>=1;
a=(a<<1)%mod;
}
return ret;
}
int main()
{
int T;
scanf( "%d",&T );
ll r[64],mod,temp;
int N;
r[1]=4;
while( T-- )
{
scanf( "%d",&N );
mod=1;
mod=mod<<N;
mod-=1;
//printf("%lld\n",mod);
for( int i=2;i<=N-1;i++ )
{
temp=mul(r[i-1],r[i-1],mod);
r[i]=(temp-2)%mod;
}
if( N==2||r[N-1]==0 )
printf( "yes\n" );
else
printf( "no\n" );
}
return 0;
}