【问题标题】:Lucas-Lehmer primality test with python使用 python 的 Lucas-Lehmer 素数测试
【发布时间】:2018-12-15 00:23:34
【问题描述】:

我编写了下面的代码,以使 Lucas-Lehmer 级数达到 p,因为 p 是梅森数的指数。检查后我发现它不适用于某些素数 p,例如 11、23、29 等。任何帮助都将非常有价值!

代码如下:

def ll_series (p):
    ll_list=[4]
    print 4
    for i in range(1, p+1):
        ll_list.append((ll_list[i-1]**2 - 2) % (2**p-1))
        print(ll_list[i])
    return ll_list

【问题讨论】:

  • “它不起作用”是什么意思?你能展示一个示例输入、你的函数给出的输出以及你期望的输出吗?
  • 另外,你已经标记了这个 python 3,但是你使用了 python 2 print 语法。它是哪一个? (我现在已经用通用 python 标记替换了 python 3 标记,无论如何这更合适。如果您愿意,可以添加适当的版本标记。)此外,您的函数没有正确缩进。请仔细检查您发布的代码,以确保其他人能够在不做太多假设的情况下重现该问题。
  • 感谢您的 cmets!

标签: python primality-test


【解决方案1】:

Lucas-Lehmer 检验测试梅森数是否为素数。 11 不是梅森数,因此测试失败。 默森号是 - M_n = 2^n-1

http://mathworld.wolfram.com/MersenneNumber.html

p.s 如果你只计算一次M=(2^p-1),实现会更高效

【讨论】:

  • 感谢您的 cmets!
【解决方案2】:

试试这个:

lucas_lehmer = [4]

def mersenne(n):
    return (2 ** n) - 1

def ll(n):
    global lucas_lehmer
    if len(lucas_lehmer) < n:
        for num in range(n-1):
            lucas_lehmer.append(lucas_lehmer[-1] ** 2 - 2)
    return lucas_lehmer[n-1]

def check_prime(n):
    m = mersenne(n)
    if ll(n - 1) % m == 0:
        return m
    else:
        return -1

注意事项:

  • 需要调用check_prime函数
  • check_prime 函数的输入必须是较小的素数
  • 并非所有素数都会在梅森序列中产生素数结果。
  • 如果2^n - 1 不是素数,它将返回-1

我还对代码进行了一些清理,使其更易于阅读。

【讨论】:

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