【发布时间】:2016-01-12 19:05:51
【问题描述】:
我正在尝试编写一个函数,该函数可以使用Sieve of Eratosthenes 找到某个非常大的数之下的所有素数。我写了函数:
def primes(limit):
#efficient method for finding large primes
l=set()
i=1
while i<limit+1:
l.add(i)
i+=2
s=int(math.sqrt(limit))
#recur until sqrt is small
if s<=1000:
ps=smallprimes(s)
else:
ps=primes(s)
for p in ps:
l-=set(multiples(p,limit+1)[1:])
return [2]+(list(l)[1:])
其中 smallprimes 仅通过检查因子的数量来计算低于限制的素数,而 multiples 计算低于限制的数字的所有倍数。
将非常大的限制传递给primes,我创建了大集合以“删除”limits 平方根以下所有素数的倍数。
有没有比使用集合更有效的方法从序列中“删除”数字?我想知道因为我真的只需要减去两个数组,我不需要防止重复等。
【问题讨论】:
-
旁注:Python 不适合高效的算术运算。我建议使用一些外部库或其他语言。
-
在我看来不像埃拉托烯的筛子,也看看这个帖子,这可能是你要找的how-to-implement-an-efficient-infinite-generator-of-prime-numbers-in-python
-
这是一个erastothenes的筛子,我计算平方根,然后减去所有低于限制的素数的所有倍数的集合。不过,我会看看那个链接。
-
你是否计算平方根不是我在你的算法中看到的问题,是你使用递归,你不需要它来实现这个筛子,无论如何你需要的是我给你的链接中的erat3算法,经过一些修改,它会给你所有的素数,直到N并使用最少的内存,与素数的数量成正比,直到N的平方根
-
@LukeTaylor 是的,numpy 很好。底层算法是用 C 语言编写的,所以你很高兴。
标签: python python-2.7 memory primes