我是否制作了新的寻找算法,并且有更快的算法吗? (Python)的

时间:2017-07-14 10:35:23

标签: 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.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是列表whit和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的所有单元格都将是素数

1 个答案:

答案 0 :(得分:1)

看起来你正在使用带有6轮的Wheel Factorization,交替前进2和4,利用所有素数&gt; = 5的形式为6n±1的事实。这比简单的试验分割更快,但不如Eratosthenes的Sieve快。您仍然按照列表中的素数进行一些试验。 Sieve根本不使用除法,它只使用运行速度更快的加法。