当前位置: 代码迷 >> 综合 >> nefu 120 梅森素数 Lucas-Lehmer判定法
  详细解决方案

nefu 120 梅森素数 Lucas-Lehmer判定法

热度:77   发布时间:2024-01-20 20:15:14.0

定义:如果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" );elseprintf( "no\n" );}return 0;
}