【发布时间】:2011-01-01 00:57:27
【问题描述】:
问题是找到第 1000 个素数。我为此编写了以下python代码。问题是,我得到了第 10 和第 20 素数的正确答案,但之后每增加 10 就会使我偏离目标。我无法捕捉到这里的错误:(
count=1 #to keep count of prime numbers
primes=() #tuple to hold primes
candidate=3 #variable to test for primes
while count<20:
for x in range(2,candidate):
if candidate%x==0:
candidate=candidate+2
else : pass
primes=primes+(candidate,)
candidate=candidate+2
count=count+1
print primes
print "20th prime is ", primes[-1]
如果您想知道,count 被初始化为 1,因为我没有测试 2 作为素数(我从 3 开始)并且candidate 被递增 2,因为只有奇数可以是素数数字。我知道还有其他方法可以解决这个问题,例如素数定理,但我想知道这种方法有什么问题。另外,如果您有任何优化想法,请提出建议。
谢谢
【问题讨论】:
-
元组是不可变的,您每次都在制作元组的副本,而不是将其初始化为列表 (primes=[]) 和用户 primes.append() - 这不应该太虽然对速度有很大影响...
-
嗯...好问题。可能不是最快的实现。我一直想构建一个高效的素数生成器,只要它有足够的内存来计算它需要的东西,它就可以继续运行。著名的 Sieve 将不起作用 - 您不想在开始之前选择您查看的数字的上限。但是,每个检查的新数字的 O(n) 复杂度也是垃圾。理想情况下,您希望到目前为止计算出一个列表和一组素数,然后对它们进行模测试。我还没有完全写出来……我知道 Haskell 语言有一个素数生成器。
-
@SilentGhost 为什么? @Kimvais我知道,我每次都在创建一个新元组,但是使用列表也不能解决我的问题@Ipthnc这正是我的想法,但即使我无法写下来,也许我会多花点时间tm。为此我的问题仍然没有解决
-
这听起来有点像欧拉计划问题。
-
一般性说明:将 n 除以直到 n 的平方根的所有数字就足以确定 n 是否为素数(您正在测试 n)