【发布时间】:2011-04-12 06:55:54
【问题描述】:
我需要让 Python 应用程序在 10^300 和 10^301 之间生成一个随机素数,我这样做了,但它非常慢。有什么解决办法吗?
import random , math
check_prime = 0
print "Please wait ..."
def is_prime(n):
import math
n = abs(n)
i = 2
while i <= math.sqrt(n):
if n % i == 0:
return False
i += 1
return True
while check_prime == 0 :
randomnumber = random.randrange(math.pow(10,300),math.pow(10,301)-1)
if is_prime(randomnumber):
print randomnumber
break
【问题讨论】:
-
预先计算 10^300 和 10^301 之间的所有素数,将此列表添加到您的代码中并从该列表中选择一个素数?
-
你说它“很慢”?
math.sqrt任何大于 10^300 的数字至少是 10^150。如果我的计算机需要 25 毫秒来迭代xrange(1000000)(等于 10^6)并且什么都不做,那么它需要大约 10^130 个年龄来迭代超过 10^150 个数字。因此,除了is_prime实现之外,可能还有其他方法可以检查素数。 -
@Ocaso:在 10^300 和 10^301 之间有 9000000000000000000000000000000(加上另外 270 个零)数字。如果它们中只有十亿分之一是质数,它仍然无法放入 RAM。
-
@lazyr, @eumiro(顺便说一句:我给你们两个都投了赞成票):我知道在那个范围内处理 all 素数是不可能的,但@ShirazITCo 没有t 说他的问题的用例是什么。在某些情况下,最好有一个经过计算的素数列表。