【发布时间】:2020-04-22 06:39:42
【问题描述】:
我正在尝试编写一个函数,该函数应该接受梅森数并使用 Lucas-Lehmer 素数测试返回它是否是素数。我正在尝试返回 Lucas-Lehmer 序列中生成的最后一个数字,如果它是质数,则应该为 0
我已经编写了以下函数来完成上述操作
def lucas_lehmer_modified(p):
M=2**p-1
for i in range (0,p-1):
if i == 0:
x = 4
else :
x = (prev**2-2)%(M)
prev=x
return x
我的问题是此代码适用于127 等小数,但不适用于2305843009213693951 等大数,甚至适用于524287。我的 Python Jupyter 笔记本挂断了。关于如何获得一个函数的任何建议,该函数将梅森素数作为输入并使用 Lucas Lehmer 测试返回它是否是素数。我需要让它工作至少2^65-1
【问题讨论】:
-
您在哪里运行 Jupyter 笔记本?在本地还是在 Google/Internet 上?
-
无关,但根据wikipedia,LLT 适用于
2**p - 1形式的梅森数其中 p 是奇素数。 65 是奇数但不是素数 (5*13)。 -
您实际上将什么传递给
lucas_lehmer_modified()?你是通过61还是通过2305843009213693951? -
如果我通过
19(524287的 p,它也适用于61(2305843009213693951的 p),它对我来说效果很好。我的感觉是您将 M 传递给函数而不是 p。 -
对于 p=
19937,函数已经需要 18 秒才能运行。任何比这更高的数字都可能导致挂起,所以这对我来说是另一个指标,你传递的是 M 而不是 p。
标签: python largenumber primality-test