Sieve of Eratosthenes - Finding Primes Python

前端 未结 17 2327
旧巷少年郎
旧巷少年郎 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 05:03

    I prefer NumPy because of speed.

    import numpy as np
    
    # Find all prime numbers using Sieve of Eratosthenes
    def get_primes1(n):
        m = int(np.sqrt(n))
        is_prime = np.ones(n, dtype=bool)
        is_prime[:2] = False  # 0 and 1 are not primes
    
        for i in range(2, m):
            if is_prime[i] == False:
                continue
            is_prime[i*i::i] = False
    
        return np.nonzero(is_prime)[0]
    
    # Find all prime numbers using brute-force.
    def isprime(n):
        ''' Check if integer n is a prime '''
        n = abs(int(n))  # n is a positive integer
        if n < 2:  # 0 and 1 are not primes
            return False
        if n == 2:  # 2 is the only even prime number
            return True
        if not n & 1:  # all other even numbers are not primes
            return False
        # Range starts with 3 and only needs to go up the square root
        # of n for all odd numbers
        for x in range(3, int(n**0.5)+1, 2):
            if n % x == 0:
                return False
        return True
    
    # To apply a function to a numpy array, one have to vectorize the function
    def get_primes2(n):
        vectorized_isprime = np.vectorize(isprime)
        a = np.arange(n)
        return a[vectorized_isprime(a)]
    

    Check the output:

    n = 100
    print(get_primes1(n))
    print(get_primes2(n))    
        [ 2  3  5  7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97]
        [ 2  3  5  7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97]
    

    Compare the speed of Sieve of Eratosthenes and brute-force on Jupyter Notebook. Sieve of Eratosthenes in 539 times faster than brute-force for million elements.

    %timeit get_primes1(1000000)
    %timeit get_primes2(1000000)
    4.79 ms ± 90.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    2.58 s ± 31.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

提交回复
热议问题