梅森素数
来源:互联网 发布:歼20服役知乎 编辑:程序博客网 时间:2024/04/27 19:28
定理:如果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;}
0 0
- 素数个数&梅森素数
- 5.4趣味素数之梅森素数
- 梅森素数与孪生素数
- 求解孪生素数--梅森素数
- 梅森素数表
- 梅森素数表
- 梅森素数
- 梅森素数
- 梅森素数(nefu120)
- NEFU 梅森素数
- 梅森素数
- 梅森素数
- 梅森素数
- 梅森素数汇总
- 梅森素数
- 蓝桥杯:梅森素数
- 梅森素数的证明
- 梅森素数计算程序
- 【PIC32学习笔记】关于如何控制PortA外围模块
- Nginx上ThinkPHP的PATHINFO模式支持
- 10gocm->session5->数据库管理实验
- 手游单人副本防外挂思考
- FloodLight开发者文档二(译文)
- 梅森素数
- MongoDB -- 介绍
- Weblogic 地址栏免去输入端口号的方法 http://lacalhost直接访问
- OpenCv人脸检测
- JQUERY总结
- (未完成)历届国赛题目分析(2005)
- 获取sd卡中的图片URL并显示,同时使用ImageView把选择的图片展现出来
- Ubuntu14.04 安装 Oracle 11g XE
- GPS从STM32移植S3C2440记录