最快的空间 - 用python查找素数

时间:2012-02-15 21:33:43

标签: python primes

也许这是一个愚蠢的问题,但我想知道你是否可以提供最短的来源用Python找到素数。 我还想知道如何使用map()或filter()函数找到素数。 谢谢(:

编辑:当我说最快/最短时,我的意思是用较少的字符/单词。无论如何,不​​要考虑比赛:我想知道是否有可能是单线源,而不会删除总是与周期一起使用的缩进。 编辑2:没有想到大问题的问题。我想我们可以保持在一百万以下(范围(2,1000000) 编辑3:最短,但仍然优雅。正如我在第一次编辑中所说,您不需要将变量的名称减少为单个字母。我只需要一条线,优雅的来源。 谢谢!

4 个答案:

答案 0 :(得分:11)

两行Sieve of Eratosthenes

primes = set(range(2,1000000))
for n in [2]+range(3,1000000/2,2): primes -= set(range(2*n,1000000,n))

编辑:我已经意识到上面不是真正的Eratosthenes筛子,因为它过滤了一组奇数而不是素数集,使得它不必要地慢。我已在以下版本中修复了此问题,并且还包含了一些常见的优化,如评论中所指出的那样。

primes = set([2] + range(3, 1000000, 2))
for n in range(3, int(1000000**0.5)+1, 2): primes -= set(range(n*n,1000000,2*n) if n in primes else [])

第一个版本仍然更短,并且确实产生了正确的结果,即使它需要更长的时间。

答案 1 :(得分:1)

因为人们可以从网上剪切并粘贴第一百万个素数:

map(int,open('primes.txt'))

这有点类似于我昨天问的问题,其中wim提供了一个相当简短的答案:

is this primes generator pythonic

答案 2 :(得分:0)

与上述相似,但不像罗伯特·金的回答那么厚颜无耻:

from itertools import ifilter, imap
def primes(max=3000):
    r = set(); [r.add(n) for n in ifilter(lambda c: all(imap(c.__mod__, r)), xrange(2, max+1))]; return sorted(r)

答案 3 :(得分:0)

这会使用更多字符,但它是可读的:

def primes_to(n):
    cands = set(xrange(2, n))
    for i in xrange(2, int(n ** 0.5) + 1):
        for ix in xrange(i ** 2, n, i):
            cands.discard(ix)
    return list(cands) 

修改

一种新的方式,类似于上述方法,但在discard错过尝试次数较少:

def primes_to(n):
    cands = set(xrange(3, n, 2))
    for i in xrange(3, int(n ** 0.5) + 1, 2):
        for ix in xrange(i ** 2, n, i * 2):
            cands.discard(ix)
    return [2] + list(cands)