Sieve of Eratosthenes - Finding Primes Python

前端 未结 17 2296
旧巷少年郎
旧巷少年郎 2020-11-22 04:40

Just to clarify, this is not a homework problem :)

I wanted to find primes for a math application I am building & came across Sieve of Eratosthenes approach.

相关标签:
17条回答
  • 2020-11-22 04:55

    Much faster:

    import time
    def get_primes(n):
      m = n+1
      #numbers = [True for i in range(m)]
      numbers = [True] * m #EDIT: faster
      for i in range(2, int(n**0.5 + 1)):
        if numbers[i]:
          for j in range(i*i, m, i):
            numbers[j] = False
      primes = []
      for i in range(2, m):
        if numbers[i]:
          primes.append(i)
      return primes
    
    start = time.time()
    primes = get_primes(10000)
    print(time.time() - start)
    print(get_primes(100))
    
    0 讨论(0)
  • 2020-11-22 04:55

    not sure if my code is efficeient, anyone care to comment?

    from math import isqrt
    
    def isPrime(n):
        if n >= 2: # cheating the 2, is 2 even prime?
            for i in range(3, int(n / 2 + 1),2): # dont waste time with even numbers
                if n % i == 0:
                    return False
        return True
    
    def primesTo(n): 
        x = [2] if n >= 2 else [] # cheat the only even prime
        if n >= 2:
            for i in range(3, n + 1,2): # dont waste time with even numbers
                if isPrime(i):
                    x.append(i)  
        return x
    
    def primes2(n): # trying to do this using set methods and the "Sieve of Eratosthenes"
        base = {2} # again cheating the 2
        base.update(set(range(3, n + 1, 2))) # build the base of odd numbers
        for i in range(3, isqrt(n) + 1, 2): # apply the sieve
            base.difference_update(set(range(2 * i, n + 1 , i)))
        return list(base)
    
    print(primesTo(10000)) # 2 different methods for comparison
    print(primes2(10000))
    
    0 讨论(0)
  • 2020-11-22 04:56

    I figured it must be possible to simply use the empty list as the terminating condition for the loop and came up with this:

    limit = 100
    ints = list(range(2, limit))   # Will end up empty
    
    while len(ints) > 0:
        prime = ints[0]
        print prime
        ints.remove(prime)
        i = 2
        multiple = prime * i
        while multiple <= limit:
            if multiple in ints:
                ints.remove(multiple)
            i += 1
            multiple = prime * i
    
    0 讨论(0)
  • 2020-11-22 05:00

    My implementation:

    import math
    n = 100
    marked = {}
    for i in range(2, int(math.sqrt(n))):
        if not marked.get(i):
            for x in range(i * i, n, i):
                marked[x] = True
    
    for i in range(2, n):
        if not marked.get(i):
            print i
    
    0 讨论(0)
  • 2020-11-22 05:00

    i think this is shortest code for finding primes with eratosthenes method

    def prime(r):
        n = range(2,r)
        while len(n)>0:
            yield n[0]
            n = [x for x in n if x not in range(n[0],r,n[0])]
    
    
    print(list(prime(r)))
    
    0 讨论(0)
  • 2020-11-22 05:02
    def eratosthenes(n):
        multiples = []
        for i in range(2, n+1):
            if i not in multiples:
                print (i)
                for j in range(i*i, n+1, i):
                    multiples.append(j)
    
    eratosthenes(100)
    
    0 讨论(0)
提交回复
热议问题