(梅森素数)如果一个素数可以写成 2 p − 1 2^p-1 2p−1形式,其中p是一个正整数, 那么该数就称作梅森素数
这个比较有意思
函数功能是查找n范围内的梅森素数
先打出素数表
然后对每个素数这样判断
我们已知假设n是梅森素数,则
n
=
2
p
−
1
n=2^p-1
n=2p−1
很显然
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时的运行结果