pthon实现查找梅森素数

(梅森素数)如果一个素数可以写成 2 p − 1 2^p-1 2p1形式,其中p是一个正整数, 那么该数就称作梅森素数

这个比较有意思
函数功能是查找n范围内的梅森素数
先打出素数表
然后对每个素数这样判断
我们已知假设n是梅森素数,则 n = 2 p − 1 n=2^p-1 n=2p1
很显然 n + 1 = 2 p n+1=2^p n+1=2p
既然n+1是2的p次幂,那用位运算符就很好判断了
2的p次幂,在二进制中,只有最高位为1,其余全都为0

下面解释关键的位运算操作
x-1会把一个数的最低位的1变成0
x&x-1的操作会得到一个新的数,这个数相对于x来说,只是把x的最低位变为为0
按照以上性质 我们可以很快地验证它是否是梅森素数
之所以写成 n+1-1主要是方便阅读

def f35(n):
    primes = [i for i in range(2, n + 1) if 0 not in [i % j for j in range(2, int(math.sqrt(i)) + 1)]]
    # print(primes)
    ans = []
    print("{:>3}    {:>4}".format('P', 'n'))
    for n in primes:
        if ((n + 1) & (n + 1 - 1) == 0):	#关键
            ans.append(n)
            p=len(bin(n)[2:])-1
            print("{:>3}    {:>4}".format(p,n))
    print(ans)

n的范围为10000时的运行结果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值