我有没有新的素数查找算法,有没有更快的算法?(Python)

我有没有新的素数查找算法,有没有更快的算法?(Python),python,algorithm,primes,sieve,Python,Algorithm,Primes,Sieve,最近我读了一些关于素数的书,并决定自己制作一个寻找素数的程序(不是为了学校或别的什么,只是业余爱好)。代码如下: 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.

最近我读了一些关于素数的书,并决定自己制作一个寻找素数的程序(不是为了学校或别的什么,只是业余爱好)。代码如下:

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)
导入时间
a=[2,3]
e=[0,1,1,1,0,1]
b=0
c=0
d=[]
长度=整数(输入(“素数直到n?”)
tijd=time.time()
而1:
d=[]
b=(e.指数(0,a[-1])+1)
a、 附加(b)
如果len(e)len(e):
打破
d、 追加((b**2)-1)
c=b

而(((e.index(0,c)+1)*b))看起来您使用的是6轮,交替前进2和4,利用所有素数>=5的形式为6n±1的事实。这比简单的试验分割快,但不如埃拉托斯坦筛快。您仍在根据列表中的素数进行一些试除法。筛子根本不使用除法,它只使用加法,运算速度快得多。

关于Python中素数生成器的讨论,请回答您是否发明了一种新的素数查找算法,该算法比以前任何算法都要快:可能没有。另外,如果您想查看代码,把它贴在CodeReview上你是不是在改造埃拉托什尼的筛子?是的,我使用的是轮分解,但我没有除任何东西,例如,我将一个素数与列表中未标记为非素数的每个数字相乘。它更像是一个列表,首先我用每个数字乘以2,并将其标记为非素数,然后取下一个未标记为非素数的数字(3),将其与每个未标记为非素数的数字(3*1,3*3,3*5,3*7)相乘,并将结果标记为非素数,然后将其标记为5,7等等。这比把一个素数乘以它后面的每一个数字要快,因为这样你计算3乘以30不是素数。没关系,我这里有一个erastothenes@tjjensma不,事实上,如果你像你在第一篇评论中描述的那样乘以它们,那不是“欧拉筛”(在同一个维基百科页面上讨论)。看起来它应该比埃拉托斯切尼更快,但事实并非如此。埃拉托斯切尼的冗余穿越代价很小,与欧拉以其复杂且缓慢的操作为代价避免冗余穿越而节省的微不足道的成本相比,它的简单且快速的整体操作是一个不错的代价。很好地实现了,Eratosthenes没有多余的交叉点:使用到目前为止找到的数字来确定下一个素数,并从p^2开始为每个新的p交叉。冗余出现在2p和p^2之间,因此可以避免。例如,所有低于49的7的倍数都已经被2、3和2交叉5.