数论 梅森素数
作者:互联网
梅森素数
定义:
- if m是一个正整数 and 2^m-1是一个素数 then m是素数
- if m是一个正整数 and m是一个素数 then M(m)=2^m-1被称为第m个梅森数
- if p是一个素数 and M(p)是一个素数 then M(p)被称为梅森素数
Lucas-Lehmer判定法:判定一个梅森数是否是梅森素数
设p是素数,第p个梅森数为M(p)为2^p-1,r1 = 4,对于k >= 2
r(k) = (r(k+1)^2-2)modM(p), 0 <= r(k) <= M(p)
可以得到r(k)序列,则有M(p)是素数,当且仅当r(p-1) = 0(mod M(p))
代码如下
#include<iostream>
#include<vector>
using namespace std;
/*
利用Lucas-Lehmer方法判断梅森素数
*/
long long multi(long long a, long long b, long long sum)//a*b%sum
{
long long ret = 0;
while (b > 0)
{
if (b & 1)
{
ret = (ret + a) % sum;
}
b >>= 1;
a = (a << 1) % sum;
}
return ret;
}
int main()
{
long long rk[99];
rk[1] = 4;
long long sum = 1;
long long temp;
int p;
int n;
cin >> n;
while (n--)
{
sum = 1;
cin >> p;
sum <<= p;
sum -= 1;
cout << sum << endl;
if (p == 2)//对于p==2特殊判断
{
cout << "yes" << endl;
continue;
}
for (int i = 2; i < p; i++)
{
temp = multi(rk[i - 1], rk[i - 1],sum);
rk[i] = (temp - 2) % sum;
}
if (rk[p - 1] == 0)
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
}
system("pause");
return 0;
}
标签:梅森,数论,sum,long,梅森数,素数,ret 来源: https://blog.csdn.net/qq_43702629/article/details/102764478