Python 中使用 Lucas-Lehmer 检验的素数梅森数
Prime Mersenne Numbers using Lucas-Lehmer test in Python
我已经为使用 Lucas-Lehmer 检验验证的素数梅森数赋值编写了以下代码。问题是代码对 15 以内的质数工作正常,如果我超过它,它会保持 运行.
def is_prime(number):
if number <= 1:
return False
for factor in range(2, number):
if number % factor == 0:
return False
return True
mersenne = []
for number in range (3, 20):
if is_prime (number):
mersenne.append (2**number - 1)
primes = []
for i in range (3,20):
if is_prime (i):
primes.append (i)
print (primes)
def lucas_lehmer(number):
M = 2**number - 1
s = 4
for _ in range(number-2):
s = (s*s - 2) % M
return True
lucas = []
for number in mersenne:
if is_prime (number):
if lucas_lehmer (number):
lucas.append (1)
else:
lucas.append (0)
print (lucas)
mercenne_primes = zip (primes, lucas)
print (list (mercenne_primes))
您的代码通常是一团糟。但是您的主要具体问题是 lucas_lehmer()
函数的最后一行不正确:
return True
这是一个测试,它不能总是returnTrue
!最后一行应该是:
return s == 0
这里重写了您的代码以解决上述问题并清理它:
def is_prime(number):
if number <= 1:
return False
if number % 2 == 0:
return number == 2
for factor in range(3, int(number ** 0.5) + 1):
if number % factor == 0:
return False
return True
def lucas_lehmer(prime):
s = 4
m = 2 ** prime - 1
for _ in range(prime - 2):
s = (s * s - 2) % m
return s == 0
mersenne_primes = [number for number in range(3, 1500) if is_prime(number) and lucas_lehmer(number)]
print(*mersenne_primes)
输出格式与原始格式不同,但很容易解决。这很容易比您的代码高 100 倍:
> python3 test.py
3 5 7 13 17 19 31 61 89 107 127 521 607 1279
>
但开始时大约高出 200 倍,速度会明显变慢。
我已经为使用 Lucas-Lehmer 检验验证的素数梅森数赋值编写了以下代码。问题是代码对 15 以内的质数工作正常,如果我超过它,它会保持 运行.
def is_prime(number):
if number <= 1:
return False
for factor in range(2, number):
if number % factor == 0:
return False
return True
mersenne = []
for number in range (3, 20):
if is_prime (number):
mersenne.append (2**number - 1)
primes = []
for i in range (3,20):
if is_prime (i):
primes.append (i)
print (primes)
def lucas_lehmer(number):
M = 2**number - 1
s = 4
for _ in range(number-2):
s = (s*s - 2) % M
return True
lucas = []
for number in mersenne:
if is_prime (number):
if lucas_lehmer (number):
lucas.append (1)
else:
lucas.append (0)
print (lucas)
mercenne_primes = zip (primes, lucas)
print (list (mercenne_primes))
您的代码通常是一团糟。但是您的主要具体问题是 lucas_lehmer()
函数的最后一行不正确:
return True
这是一个测试,它不能总是returnTrue
!最后一行应该是:
return s == 0
这里重写了您的代码以解决上述问题并清理它:
def is_prime(number):
if number <= 1:
return False
if number % 2 == 0:
return number == 2
for factor in range(3, int(number ** 0.5) + 1):
if number % factor == 0:
return False
return True
def lucas_lehmer(prime):
s = 4
m = 2 ** prime - 1
for _ in range(prime - 2):
s = (s * s - 2) % m
return s == 0
mersenne_primes = [number for number in range(3, 1500) if is_prime(number) and lucas_lehmer(number)]
print(*mersenne_primes)
输出格式与原始格式不同,但很容易解决。这很容易比您的代码高 100 倍:
> python3 test.py
3 5 7 13 17 19 31 61 89 107 127 521 607 1279
>
但开始时大约高出 200 倍,速度会明显变慢。