【问题标题】:Have i made a new prime finding algorithm, and are there faster ones? (Python) [closed]我是否制定了新的素数查找算法,是否有更快的算法? (Python)[关闭]
【发布时间】: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 的单元格将是素数

【问题讨论】:

标签: python algorithm primes sieve


【解决方案1】:

看起来您正在使用带有 6 轮的 Wheel Factorization,交替推进 2 和 4,利用了所有 >= 5 的素数都是 6n±1 的形式。这比简单的试除法要快,但不如埃拉托色尼筛法快。您仍在按列表中的素数进行一些尝试除法。 Sieve 根本不使用除法,它只是使用加法,运行速度要快得多。

【讨论】:

  • 是的,我正在使用轮式分解,但我没有除任何东西,例如,我将一个素数与列表中未标记为非素数的每个数字相乘。它更像是一个列表,首先我将每个数字乘以 2 并将其标记为非素数,然后取下一个未标记为非素数的数字(3)并将其与未标记为非素数的每个数字相乘(3 *1, 3*3, 3*5, 3*7) 并将结果标记为非素数,然后将其标记为 5、7 等。这比仅将素数与它后面的每个数字相乘要快,因为这样你计算 3 乘以 30 不是素数。
  • 没关系,我这里有一个版本的erastothenes 筛子
  • @tjjensma 实际上不,如果你像第一条评论中描述的那样将它们相乘,它不是the sieve of Eratosthenes,而是“欧拉筛”(在同一个维基百科页面上讨论)。它似乎应该比 Eratosthenes 更快,但事实并非如此。埃拉托色尼(Eratosthenes)的冗余划线代价很小,与欧拉以复杂的代价避免冗余划线相比,它的简单 - 因此快速 - 操作总体上是一个很好的代价,并且较慢,操作。
  • 实施得很好,Eratosthenes 没有多余的划线:使用您目前找到的数字来确定下一个素数,并从 p^2 开始为每个新 p 划线。冗余出现在 2p 和 p^2 之间,因此可以避免。例如,49 以下的所有 7 的倍数都已被 2、3 和 5 划掉。
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 2013-03-08
  • 2013-05-31
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 2018-06-18
相关资源
最近更新 更多