其他分享
首页 > 其他分享> > 数论 梅森素数

数论 梅森素数

作者:互联网

梅森素数

定义:

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