梅森素数

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值