梅森素数判定模板

对于一个素数a,2^a-1叫做梅森数。 如果2^a-1为素数则叫做梅森素数。

我们知道,如果a为合数,则2^a-1一定不是素数。

2^a-1为素数,则a必为素数。

如果a为素数,则2^a-1可为素数,也可为合数。

 

unsigned long long multi_pow(unsigned long long x,unsigned long long x1,unsigned long long mod)
{
    unsigned long long sum=0;
    while(x1)
    {
        if(x1&1) sum = (sum+x)%mod;
        x1 >>= 1;
        x = (x<<1)%mod;
    }
    return sum;
}

bool check_primemason(int n) //测试2^n-1 是不是素数
{
    unsigned long long r=4;
    unsigned long long mod=(unsigned long long)(1LL<<n)-1;
    for(int i=2;i<n;i++)
    {
        r=multi_pow(r,r,mod);
        r = (r-2+mod)%mod;
    }
    if(n==1) return 0;
    if(n==2) return 1;
    if(r==0) return 1;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值