梅森素数

来源:互联网 发布:歼20服役知乎 编辑:程序博客网 时间:2024/04/27 19:28

定理:如果m是一个正整数,且2^m-1是一个素数,则m比是一个素数。

定义:如果m是一个正整数,且是素数而且M_p=2^m-1称作第m个梅森数,若M_p=2^m-1是一个素数,那么就称它是一个梅森素数。

判定方法:lucas-lehmer判定法

        设p是一个素数,第p个个梅森数M_p,r[1]=4,对于k>=2,利用

                         r[k]=r[k-1]^1-2(mod M_p)    0=<r[k]<M_p

     可以得到r的序列,则有M_p是素数,当且仅当r[p-1]=0(mod M_p)。




lucas-lehmer判定法模版:

bool lucas(long long x,long long n)      //x=(1<<n)-1{    long long tmp;    for(int i=2;i<n;i++)    {        tmp=data[i-1]*data[i-1];        data[i]=(tmp-2)%x;    }    if(n==2)        return true;    else if(data[n-1]==0) return true;    else return false;}



例题:nefu 120 梅森素数

   给定一个正整数n,求出第n个梅森数是否是梅森素数。


代码:

#include <iostream>#include <cstdio>using namespace std;long long data[64];long long multi(long long m,long long p)     //因为给出的数的平方可能会溢出{                                           //所以选择将乘法取余转化成加法取余    if(m<0) m=-m;    long long n=m;    long long t=0;    while(n)    {        if(n&1) t=(t+m)%p;        n>>=1;        m=(m<<1)%p;    }    return t;}bool lucas(long long x,long long n){    long long tmp;    for(int i=2;i<n;i++)    {        tmp=multi(data[i-1],x);        data[i]=(tmp-2)%x;    }    if(n==2)        return true;    else if(data[n-1]==0) return true;    else return false;}int main(){    int n;    cin>>n;    while(n--)    {        data[1]=4;        long long x,m=1;        cin>>x;        m=(m<<x)-1;        //cout<<x<<" "<<m<<endl;        if(lucas(m,x)) printf("yes\n");        else printf("no\n");    }    return 0;}




0 0
原创粉丝点击