简体   繁体   English

在 Python 中使用 Lucas-Lehmer 检验的 Prime Mersenne 数

[英]Prime Mersenne Numbers using Lucas-Lehmer test in Python

I have written following code for the assignment on Prime Mersenen number verified using Lucas-Lehmer Test.我已经为使用 Lucas-Lehmer 测试验证的 Prime Mersenen 数的分配编写了以下代码。 The problem is that the code work fines for prime numbers upto 15 and if I went above it, it keeps running.问题是代码对最多 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))

Your code is a generally a mess.您的代码通常是一团糟。 But your major, specific problem is that the last line of your lucas_lehmer() function is incorrect:但是您的主要具体问题是lucas_lehmer() function 的最后一行不正确:

return True

It's a test , it can't always return True : The final line should be:这是一个测试,它不能总是返回True :最后一行应该是:

return s == 0

Here's a rewrite of your code to fix the above issue and also clean it up:这是您的代码的重写以解决上述问题并清理它:

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)

The output isn't in the same format as your original but that's an easy fix. output 的格式与您的原始格式不同,但这很容易解决。 This readily goes 100 times higher than your code:这很容易比您的代码高 100 倍:

> python3 test.py
3 5 7 13 17 19 31 61 89 107 127 521 607 1279
>

But starting around 200 times higher, it'll get noticeably slower.但是从高出大约 200 倍开始,它会明显变慢。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM