Fastest-in term of space- way to find prime numbers with python

后端 未结 4 1500
温柔的废话
温柔的废话 2020-11-30 13:21

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

相关标签:
4条回答
  • 2020-11-30 13:56

    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.

    0 讨论(0)
  • 2020-11-30 14:13

    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

    0 讨论(0)
  • 2020-11-30 14:13

    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)
    
    0 讨论(0)
  • 2020-11-30 14:18

    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)
    
    0 讨论(0)
提交回复
热议问题