【问题标题】:Prime Mersenne Numbers using Lucas-Lehmer test in Python在 Python 中使用 Lucas-Lehmer 测试的 Prime Mersenne 数
【发布时间】:2020-04-15 18:20:05
【问题描述】:

我为使用 Lucas-Lehmer 检验验证的 Prime Mersenen 数的赋值编写了以下代码。问题是代码对最多 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))

【问题讨论】:

    标签: python python-3.x primes


    【解决方案1】:

    您的代码通常是一团糟。但是您的主要问题是您的 lucas_lehmer() 函数的最后一行不正确:

    return True
    

    这是一个测试,它不能总是返回True!最后一行应该是:

    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 倍开始,它会明显变慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多