Mp = 2^p-1 且 p是素数,称为梅森数,若Mp是素数则称为梅森素数。
Lucas-Lehmer判定法 判定一个数是否为梅森素数 效率足够高,如果题目特意为梅森素数设计,会卡复杂度,那么套用此方法即可。算法复杂度为O(p^3)。
关于卢卡斯-莱默算法参考http://blog.csdn.net/cFarmerReally/article/details/52153410?locationNum=7&fps=1
思路:R.1 = 4;R.k = (R.k-1 ^ 2 - 2) % Mp;
如果R.p-1 == 0,则是梅森素数,否则不是。
特殊判断,p == 2,即Mp = 3是梅森素数。
为了乘法溢出可以采用换加法来处理。
梅森素数表:因为个数不多所以常常可以打表
相关拓展:完美数,华林问题,蔡天新的课程
可以做模板来使用了:
long long multi(long long a, long long b, long long m){//实现a * b % m的操作,用2 * 3 = 6模拟一下就懂了
long long ans = 0;
while(b > 0){
if(b & 1) ans = (ans+a) % m;
b >>= 1;
a = (a<<1) % m;
}
return an