【发布时间】:2017-07-14 10:35:22
【问题描述】:
最近我读了一些关于素数的书,并决定制作自己的程序来寻找它们(不是为了学校或任何东西,只是为了爱好)。这是代码:
import time
a=[2,3]
e=[0,1,1,1,0,1]
b=0
c=0
d=[]
length=int(input("primes til n?"))
tijd=time.time()
while 1:
d=[]
b=(e.index(0,a[-1])+1)
a.append(b)
if len(e)<length:
e.extend(e*(b-1))
e[(b-1)]=1
if ((b**2)-1)>len(e):
break
d.append((b**2)-1)
c=b
while (((e.index(0,c)+1)*b))<len(e):
d.append(((e.index(0,c)+1)*b)-1)
c=(e.index(0,c+1))
for getal in d:
e[getal]=1
e.append(0)
while(e.index(0,b))<(len(e)-1):
b=((e.index(0,(b+1)))+1)
a.append(b)
print(len(a))
print(time.time()-tijd)
我知道代码的可读性不高,而且我知道可以进行改进。(但我没有那么多 python 经验)
我想知道是否有人知道其他 python 素数查找算法来比较它的速度。我也想知道这种寻找素数的方法是否已经存在,因为我无法在网上找到类似的东西。(这只是为了爱好,不是学校顺便说一句)
代码说明:
变量 a 是所有已建立素数的列表 变量 e 是一个 1 和 0 的列表,其中 [0,1,1,1,0,1] 代表:1 和 5 可能是素数,而 2,3,4 和 6 不是(是的,我知道 2 和 3 是素数,但它们已经在素数列表中)
所以程序做的第一件事就是直到你想要素数的数字。(虽然它没有给出素数直到那个数字,而是素数的第一个更高的乘积。
然后在 while 循环中,它说 b= 下一个素数是列表中第一个零的索引,包含 1 和 0,从 1 开始计数,因为第一个零不算数。
然后如果包含 1 和 0 的列表的长度小于请求的长度,则将列表与最近的素数相乘(所以如果列表是 [0,1,1,1,0,1] 并且最近的素数是 5(第一个零从他第一个开始计数,它将列表乘以 5,所以它是 [0,1,1,1,0,1,0,1,1,1,0,1,0 ,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1]
如果最近的素数平方大于列表大小,则停止
然后它的作用是取最近的素数(5)并将其与列表 [0,1,1,1,0,1,0,1,1,1 中所有为零的数字的索引相乘,0,1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1] 所以它会做 1*5,5*5 并用索引 5 和 25 替换列表中的单元格 1 所以新列表将是 [0,1,1,1,1,1,0,1,1 ,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1]
当程序完成程序的第一部分时,列表中所有为 0 的单元格将是素数
【问题讨论】:
-
stackoverflow.com/questions/567222/… 讨论python中的素数生成器
-
回答你是否发明了一种比以前更快的新素数查找算法:可能不是。
-
如果您想查看您的代码,请在 codereview 上发布
-
您正在重新发明埃拉托色尼筛法吗? en.wikipedia.org/wiki/Sieve_of_Eratosthenes
标签: python algorithm primes sieve