梅森素数

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

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

判定方法:lucas-lehmer判定法

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

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

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

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;
}

梅森素数,布布扣,bubuko.com

时间: 2024-10-06 11:55:21

梅森素数的相关文章

NEFU120 梅森素数【Lucas-Lehmer判定】

题目链接: http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=120 题目大意: 给一个数p,若Mp = 2^p - 1是梅森素数,则输出"yes",否则输出"no". 思路: 这道题p小于62.Mp就小于2^62-1.如果直接进行素数判别会比较慢,用筛法的话数据量 又会很大.所以这里用了Lucas-Lehmer判定法则. Lucas-Lehmer判定法则具体步骤: 如果要判定的整数位Mp =

梅森素数判定模板

对于一个素数a,2^a-1叫做梅森数. 如果2^a-1为素数则叫做梅森素数. 我们知道,如果a为合数,则2^a-1一定不是素数. 2^a-1为素数,则a必为素数. 如果a为素数,则2^a-1可为素数,也可为合数. unsigned long long multi_pow(unsigned long long x,unsigned long long x1,unsigned long long mod) { unsigned long long sum=0; while(x1) { if(x1&1

NEFU 120 梅森素数(梅森数素数判定--Lucas-Lehmer测试判定)

梅森素数 Problem : 120 Time Limit : 1000ms Memory Limit : 65536K description 由于梅森学识渊博,才华横溢,为人热情以及最早系统而深入地研究2p-1 型的数(其中p为素数),为了纪念他,数学界就把这种数称为"梅森数":并以Mp 记之(其中M为梅森姓名的首字母),即Mp=2p-1 .如果梅森数为素数,则称之为"梅森素数". 比如p=2,3,5,7时,Mp都是素数,但211-1 不是素数 .现在请你求出前

Sicily-1009 梅森素数

一.梅森素数 素数有无穷多个,却只有极少量的素数能表示成2p-1(p为素数)的形式.在不大于257的素数中,当p=2.3.5.7.13.17.19.31.67.127.257时,2p-1是素数,其它都是合数.前面的7个数(即2.3.5.7.13.17.19)已被前人所证实,而后面的4个数(即31.67.127.257)则是梅森自己的推断.2300多年来,人类仅发现48个梅森素数. 指数为11, 23, 29, 37, 41, 43, 47, 53, 59的时候是合数. 二.过程 给出2-64里面

codeforces 225E E. Unsolvable(梅森素数+数学)

题目链接: codeforces 225E 题目大意: 给出一个等式,z=[x2]+y+x?y,求另这个等式无解的z,从小到大排序,访问第i个. 题目分析: 首先为了简便计算先要通过分奇偶去掉向下取整符号,原式转换为如下形式: {z=k+y+2ky ,x=2kz=k+y+(2k+1)?y ,x=2k+1(1)(2) 对于(1)式我们采取如下推到过程进行推导: z=k+y+2ky,k>=0?2z+1=2k+2y+4ky+1?2z+1=(2k+1)?(2y+1)(3) 对于(2)式我们采取如下的推导

uva 1323 - Vivian&#39;s Problem(梅森素数)

题目链接:uva 1323 - Vivian's Problem 题目大意:给定N个数,然后为每个数添加一个幂ei,最后N项垒乘的结果为M,要是得M的所有因子的和可以写成2x,求x的最大值,如果没有条件满足,输出NO 解题思路:若一个数可以写成若干个不同的梅森素数的乘积,那么这个数的所以因子和可以写成2x. 232?1的范围内只有8个梅森素数,所以可以用状压处理. 梅森素数即为2^i-1形式的素数 /********************** * 梅森素数,(2^k) - 1 * * 一个数若

数论&#183;梅森素数与完全数

梅森数:$M_p=2^p-1$, $p$为素数. 性质:若$M_p$为素数,则$p$为素数. 完全数:若一个数$N$等与其所有非自身的约数之和,那么这个数就是完全数. 性质:若$M_p$为素数,那么$M_p2^{p-1}=\frac{M_p(M_p+1)}{2}$为完全数. 性质:一个数的约数之和为$2$的幂次当且仅当它能被分解为不同梅森素数的乘积.

Codeforces 225E 梅森素数

注:梅森素数,数组表示的是2^n-1的n,指数. #include <stdio.h> #include <math.h> const int maxn = 40; const int MOD = 1e9+7; typedef long long ll; int a[45] = {2,3,5,7,13,17,19,31,61,89,107,127,521,607,1279,2203,2281,3217,4253,4423,9689,9941,11213, 19937,21701,2

素数 专题

素数性质总结: 小于x的素数个数(随着x逐渐增大),与x/lnx近似: 素数测试方法,诶拉托色尼筛法:如果n是一个合数,那么n一定有一个不超过sqrt(n)的素因子:6N±1法:对于任何一个自然数,都可以表示为如下形式之一:6N,6N+1,6N+2,6N+3,6N+4,6N+5(N=0,1,2,3...)显然,当N>=1时,只有形如6N+1,6N+5的自然数有可能是素数(代码后面贴上) n!的素因子分解中的素数p的幂为 n/p+n/p2+n/p3+...... 梅森素数:如果m是一个正整数,且2