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时的运行结果
在这里插入图片描述

在Python中,判断一个数字是否为梅森素数(Mersenne Prime)需要通过一定的算法。梅森素数是指形如\(2^p - 1\)的质数,其中\(p\)也是质数。这里是一个简单的步骤: 1. 定义一个函数,输入是要检查的数\(n\)。 2. 如果\(n = 2\),它是最小的梅森素数,直接返回True。 3. 使用循环,从3开始递增到\(\sqrt{n}\),因为如果\(n\)不是梅森素数,那么它的非平凡因子必然小于等于它的平方根。 4. 对于每个\(i\),计算\(2^i \mod n\),如果结果不为1且不为\(n-1\),说明\(n\)不是梅森素数,返回False。 5. 如果循环结束都没有找到因子,说明\(n\)可能是梅森素数,但仍需确认其\(p\)值是否也质数,这通常需要更复杂的算法(比如埃拉托斯特尼筛法),不过对于大数通常会使用专门的库如`sympy`来进行。 ```python import math def is_mersenne_prime(n): if n < 2: return False elif n == 2: return True elif n % 2 == 0 or not is_prime(math.log2(n) + 1): # 判断指数是否为质数 return False else: sqrt_n = int(math.sqrt(n)) + 1 for i in range(3, sqrt_n, 2): # 只考虑奇数因子 if pow(2, i, n) != n - 1: # 检查能否整除模n return False return True # 辅助函数判断一个数是否为质数 def is_prime(num): if num < 2: return False for i in range(2, int(num**0.5) + 1): if num % i == 0: return False return True # 示例使用 print(is_mersenne_prime(7)) # 输出:True,因为7是梅森素数,2^3 - 1 = 7 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值