也许这是一个愚蠢的问题,但我想知道你是否可以提供最短的来源用Python找到素数。 我还想知道如何使用map()或filter()函数找到素数。 谢谢(:
编辑:当我说最快/最短时,我的意思是用较少的字符/单词。无论如何,不要考虑比赛:我想知道是否有可能是单线源,而不会删除总是与周期一起使用的缩进。 编辑2:没有想到大问题的问题。我想我们可以保持在一百万以下(范围(2,1000000) 编辑3:最短,但仍然优雅。正如我在第一次编辑中所说,您不需要将变量的名称减少为单个字母。我只需要一条线,优雅的来源。 谢谢!
答案 0 :(得分:11)
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提供了一个相当简短的答案:
答案 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)