我用python做了一个主要的发现程序,有人可以确认它只输出素数

时间:2015-10-17 05:30:46

标签: python primes

我试图创建一个程序,创建一个列表,列出所有素数到一些数字,但我不完全确定它适用于任何输入。我还想知道,假设它确实有效,它与其他主要发现算法相比有多高效。

n=1
k=input()
primes=[2]
def f(n):
   b, a = 1, 1
   for i in primes:
      a=((2*n+1)%i)
      b=b*a
   return b
while k > n:
   if f(n) >= 1:
      primes.append((2*n)+1)
      n=n+1
   else:
      n=n+1
      k=k+1
print primes

1 个答案:

答案 0 :(得分:0)

是的,它有效,而且非常低效。在函数f中,您要测试到目前为止找到的任何素数是否除2*n+1。代码中存在两个效率低下的问题。首先,即使2*n+1被3整除,也就是说,你计算所有其他已知素数的除法余数。其次,将所有剩余部分加在一起是浪费的,因为你想知道的是剩余部分之一是否为0。 f的正文可以替换为

return any((2*n+1)%p == 0 for p in primes)

这将在前0个余数处退出,并避免不必要的乘法运算。

即使有这种改进,与其他算法相比,这也不是一种有效的算法。即使是古老的Eratosthenes筛也可能会跑得更快,因为它避免了任何耗时的划分。说得客气一点,初探是一个问题,这个问题多年来一直是大量研究的主题,而且许多高效数学都是针对它的。没有大量的先前研究,没有人能够提出竞争算法。我用谷歌搜索"寻找算法"并获得了大约900万次点击。

尽管如此,这个算法可能足以达到您的目的。