问题
Maybe it is a stupid question, but i was wondering if you could provide the shortest source to find prime numbers with Python. I was also wondering how to find prime numbers by using map() or filter() functions. Thank you (:
EDIT: When i say fastest/shortest I mean the way with the less characters/words. Do not consider a competition, anyway: i was wondering if it was possible a one line source, without removing indentation always used with for cycles. EDIT 2:The problem was not thought for huge numbers. I think we can stay under a million( range(2,1000000) EDIT 3: Shortest, but still elegant. As i said in the first EDIT, you don't need to reduce variables' names to single letters. I just need a one line, elegant source. Thank you!
回答1:
The Sieve of Eratosthenes in two lines.
primes = set(range(2,1000000))
for n in [2]+range(3,1000000/2,2): primes -= set(range(2*n,1000000,n))
Edit: I've realized that the above is not a true Sieve of Eratosthenes because it filters on the set of odd numbers rather than the set of primes, making it unnecessarily slow. I've fixed that in the following version, and also included a number of common optimizations as pointed out in the comments.
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 [])
The first version is still shorter and does generate the proper result, even if it takes longer.
回答2:
Since one can just cut and paste the first million primes from the net:
map(int,open('primes.txt'))
This is a somewhat similar to the question I asked yesterday where wim provided a fairly short answer:
is this primes generator pythonic
回答3:
Similar to the above, but not as cheeky as Robert King's answer:
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)
回答4:
This uses more characters, but it's readable:
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)
EDIT
A new way, similar to the above, but with less missed attempts at 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)
来源:https://stackoverflow.com/questions/9301781/fastest-in-term-of-space-way-to-find-prime-numbers-with-python