284302880299929701389的Python素性检查

284302880299929701389的Python素性检查,python,algorithm,Python,Algorithm,我见过许多检查素性的Python算法,但我发现它们在检查特定数字时都失败了:284302880299701389 我使用了这个算法: from\uuuuu future\uuuuu导入打印功能 导入系统 从系统导入argv def是_prime(n): 如果n==2: 返回真值 如果n==3: 返回真值 如果n%2==0: 返回错误 如果n%3==0: 返回错误 i=5 w=2 而我,*i这可能是因为这个数字是素数吗?验证需要sqrt时间,以及 In [10]: math.sqrt(28430

我见过许多检查素性的Python算法,但我发现它们在检查特定数字时都失败了:284302880299701389

我使用了这个算法:

from\uuuuu future\uuuuu导入打印功能
导入系统
从系统导入argv
def是_prime(n):
如果n==2:
返回真值
如果n==3:
返回真值
如果n%2==0:
返回错误
如果n%3==0:
返回错误
i=5
w=2

而我,*i这可能是因为这个数字是素数吗?验证需要
sqrt
时间,以及

In [10]: math.sqrt(28430288029929701389)
Out[10]: 5332006004.303606
Python不是一种速度很快的语言;循环53320060400次可能需要很长时间

您尝试的更大的数字可以是复合的,因此可以很快找到一个因子



我推荐一种概率素数测试算法,如或其变体,用于“真实”素数测试。这些算法的速度非常快,多次运行它们可以使错误概率比宇宙线事件更容易地降低。

鉴于
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuz>导入,我猜您使用的是Python 2。什么

如果是的话,您是否研究过该模块?(它似乎还不适用于Python 3)


根据Eli Bendersky的回答,这似乎是最好的。另外,
primefac
在我运行它时几乎立即返回特定数字的结果。

对于这样的大数字,只需使用不同的基数运行miller rabin几次。对于任何组合
n
,少于1/4的碱基是
n
素数的说谎者,这证实了这个数字是素数。你的假设“无止境循环”是错误的。在我的老式Mac电脑上,我得到了“284302880299929701389是prime”,实时时间为18m10.580s,仅使用理论上最大步数533200604的1777335335(!)。正如Rad指出的,这需要很长时间。可悲的是,“什么是最好的算法…”这个问题的答案以一个基本上不正确的陈述(AKS,叹气)开始,然后给出了一个幼稚的算法,它适合于微小的输入,但不是一个好的一般答案。至少后来它确实指出了这一点。有相当多的Python方法可以轻松地处理这个数字,包括gmpy2、sympy和primefac等包。
In [10]: math.sqrt(28430288029929701389)
Out[10]: 5332006004.303606
import primefac
biggie = 28430288029929701389
print(list(primefac.primefac(biggie)))
# [28430288029929701389L]
primefac.isprime(biggie)
# True