梅森素数是指形如2^p-1的正整数,其中指数p是素数,常记为Mp 。若Mp是素数,则称为梅森素数。p=2,3,5,7时,Mp都是素数,但M11=2047=23×89不是素数
梅森数可能是素数也可能是合数,因此如何对梅森数进行判断是一个很关键的问题
根据费马定理 如果n是素数,有 a^(n-1) = 1 ( mod n) 1 <= a <= n-1;
一个数可能通过Miller测试,但他可能不是素数,庆幸的是,这样的数并不多,一个素数可以通过所有以a为基的Miller测试,而对于一个奇合数,通过以a为基的Miller测试的概率小于等于1/4,如果一个奇合数做N次独立的Miller测试,每次都通过的概率小于(1/4)^n,如果n = 100,那(1/4)^100 = 6.22 * 10 ^(-61),这是一个很小的数,测试出错的概率很小。
Miller测试的步骤
1.用随机数选择M个a。
2.判断a^(n-1)次方模n是否为1,若为1则为素数,若不为1,则不是素数。a^(n-1)次方模n可以快速取模完成
const int Maxcnt = 32;
int64 random(int64 m)
{
return (int64)(rand()%m);
}
int64 Mul(int64 a,int64 b,int64 m)
{
int64 sum = 1;
while(b > 0)
{
if(b%2 == 1)
sum = MUL(sum,a,m);
b = b / 2;
a = MUL(a,a,m);
}
return sum;
}
bool Miller(int64 m)
{
for(int i = 0; i <= Maxcnt; i++)
{
int64 a = random(m-1)+1;
if(Mul(a,m-1,m) != 1)
return false;
}
return true;
}