我试图创建一个程序,创建一个列表,列出所有素数到一些数字,但我不完全确定它适用于任何输入。我还想知道,假设它确实有效,它与其他主要发现算法相比有多高效。
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
答案 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万次点击。
尽管如此,这个算法可能足以达到您的目的。