梅森素数

来源:互联网 发布:vmware网络nat 编辑:程序博客网 时间:2024/04/27 20:13

梅森素数是指形如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;}