我们可以将您的素数代码用作查找梅森尼素数的部分。第一步,清理你的代码:
def prime_test_list(n, known_primes):
if n < 2:
return False
if n % 2 == 0:
return n == 2 # 2 is the only even prime
k = 0
while known_primes[k] ** 2 <= n:
if n % known_primes[k] == 0:
return False
k += 1
return True
def prime_print_list(a):
known_primes = [2]
for n in range(3, a, 2):
if prime_test_list(n, known_primes):
known_primes.append(n)
return known_primes
print(prime_print_list(100))
输出
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
prime_print_list(n) 函数返回所有小于n 的素数。现在我们需要添加一个函数并扩展prime_print_list()。我使用的是 Python 3,但它应该可以在 Python 2 中使用。
我们需要添加的函数是Lucas-Lehmer primality test,在我们使用现有的prime_test_list() 函数检查指数的素数后调用它。
我们将扩展prime_print_list() 成为mersenne_prime_print_list((),让它做它所做的事情,然后执行上述测试并在单独的列表中跟踪阳性结果:
def lucas_lehmer_test(p, m):
s = 4
for _ in range(p - 2):
s = ((s * s) - 2) % m
return s == 0
def prime_test_list(n, known_primes):
if n < 2:
return False
if n % 2 == 0:
return n == 2 # 2 is the only even prime
k = 0
while known_primes[k] ** 2 <= n:
if n % known_primes[k] == 0:
return False
k += 1
return True
def mersenne_prime_print_list(a):
known_primes = [2]
known_mersenne_primes = [3]
for n in range(3, a, 2):
if prime_test_list(n, known_primes):
known_primes.append(n)
m = 2 ** n - 1
if lucas_lehmer_test(n, m):
known_mersenne_primes.append(m)
return known_mersenne_primes
print(mersenne_prime_print_list(100))
输出
[3、7、31、127、8191、131071、524287、2147483647、2305843009213693951、618970019642690137449562111]
mersenne_prime_print_list(n) 函数返回所有素数指数小于n 的梅森素数。
在大约 50 个已知的梅森素数中,上面的代码不会让你超过 20 个左右 (mersenne_prime_print_list(5000)),否则它会变得太低效。
就列表推导而言,它们不是必需的,但可以随意重写代码以使用它们。