梅森素数
由于梅森学识渊博,才华横溢,为人热情以及最早系统而深入地研究2p-1 型的数(其中p为素数),为了纪念他,数学界就把这种数称为“梅森数”;并以Mp 记之(其中M为梅森姓名的首字母),即Mp=2p-1 。如果梅森数为素数,则称之为“梅森素数”。 比如p=2,3,5,7时,Mp都是素数,但211-1 不是素数 。现在请你求出前N个梅森素数。
lucas-lehmer判定法,判断梅森素数
M=2^n-1;
r[k]≡r[k-1]^2-2(mod M)
如果可以构造一个r序列使得r[p-1]%M=0,M即为第p个梅森素数
r1=4,第一个梅森素数要特判
#include<stdio.h>
#include<math.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
ll mul(ll a,ll b,ll mod)//二分乘法,直接乘会爆
{
ll res=0;
while(b)
{
if(b&1)
res=(res+a)%mod;
a=(a<<1)%mod;
b>>=1;
}
return res;
}
int main()
{
ll t,p;
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&p);
ll mod=(1ll<<p)-1;
ll r=4;
for(int i=2;i<=p-1;i++)
{
ll tmp=mul(r,r,mod);
r=(tmp-2)%mod;
}
if(p==2)puts("yes");//2是特例,要特判
else if(r)puts("no");
else puts("yes");
}
return 0;
}