📜  时间复杂度为0(n)的Eratosthenes筛

📅  最后修改于: 2021-04-30 02:42:24             🧑  作者: Mango

Eratosthenes算法的经典Sieve需要O(N log(log N))时间才能找到所有小于N的素数。在本文中,我们讨论了一种在O(N)时间工作的改进的Sieve。

例子 :

Given a number N, print all prime 
numbers smaller than N

Input :  int N = 15
Output : 2 3 5 7 11 13

Input : int N = 20
Output : 2 3 5 7 11 13 17 19

Eratosthenes算法的处理过的筛网的工作方式如下:

For every number i where i varies from 2 to N-1:
    Check if the number is prime. If the number
    is prime, store it in prime array.

For every prime numbers j less than or equal to the smallest  
prime factor p of i:
    Mark all numbers j*p as non_prime.
    Mark smallest prime factor of j*p as j

以下是上述想法的实现。

C++
// C++ program to generate all prime numbers
// less than N in O(N)
#include
using namespace std;
const long long MAX_SIZE = 1000001;
  
// isPrime[] : isPrime[i] is true if number is prime 
// prime[] : stores all prime number less than N
// SPF[] that store smallest prime factor of number
// [for Exp : smallest prime factor of '8' and '16'
// is '2' so we put SPF[8] = 2 , SPF[16] = 2 ]
vectorisprime(MAX_SIZE , true);
vectorprime;
vectorSPF(MAX_SIZE);
  
// function generate all prime number less then N in O(n)
void manipulated_seive(int N)
{
    // 0 and 1 are not prime
    isprime[0] = isprime[1] = false ;
  
    // Fill rest of the entries
    for (long long int i=2; i


Java
// Java program to generate all prime numbers
// less than N in O(N)
  
  
import java.util.Vector;
  
class Test
{
    static final int MAX_SIZE = 1000001;
    // isPrime[] : isPrime[i] is true if number is prime 
    // prime[] : stores all prime number less than N
    // SPF[] that store smallest prime factor of number
    // [for Exp : smallest prime factor of '8' and '16'
    // is '2' so we put SPF[8] = 2 , SPF[16] = 2 ]
    static Vectorisprime = new Vector<>(MAX_SIZE);
    static Vectorprime = new Vector<>();
    static VectorSPF = new Vector<>(MAX_SIZE);
       
    // method generate all prime number less then N in O(n)
    static void manipulated_seive(int N)
    {
        // 0 and 1 are not prime
        isprime.set(0, false);
        isprime.set(1, false);
          
        // Fill rest of the entries
        for (int i=2; i


Python3
# Python3 program to generate all 
# prime numbers less than N in O(N) 
  
MAX_SIZE = 1000001
  
# isPrime[] : isPrime[i] is true if
#             number is prime 
# prime[] : stores all prime number 
#           less than N 
# SPF[] that store smallest prime 
# factor of number [for ex : smallest 
# prime factor of '8' and '16' 
# is '2' so we put SPF[8] = 2 , 
# SPF[16] = 2 ] 
isprime = [True] * MAX_SIZE 
prime = [] 
SPF = [None] * (MAX_SIZE) 
  
# function generate all prime number 
# less then N in O(n) 
def manipulated_seive(N): 
  
    # 0 and 1 are not prime 
    isprime[0] = isprime[1] = False
  
    # Fill rest of the entries 
    for i in range(2, N): 
      
        # If isPrime[i] == True then i is 
        # prime number 
        if isprime[i] == True: 
          
            # put i into prime[] vector 
            prime.append(i) 
  
            # A prime number is its own smallest 
            # prime factor 
            SPF[i] = i 
          
        # Remove all multiples of i*prime[j] 
        # which are not prime by making is
        # Prime[i * prime[j]] = false and put
        # smallest prime factor of i*Prime[j]
        # as prime[j] [ for exp :let i = 5 , j = 0 ,
        # prime[j] = 2 [ i*prime[j] = 10 ] 
        # so smallest prime factor of '10' is '2' 
        # that is prime[j] ] this loop run only one 
        # time for number which are not prime 
        j = 0
        while (j < len(prime) and
               i * prime[j] < N and
                   prime[j] <= SPF[i]):
          
            isprime[i * prime[j]] = False
  
            # put smallest prime factor of i*prime[j] 
            SPF[i * prime[j]] = prime[j]
              
            j += 1
          
# Driver Code
if __name__ == "__main__": 
  
    N = 13 # Must be less than MAX_SIZE 
  
    manipulated_seive(N) 
  
    # print all prime number less then N 
    i = 0
    while i < len(prime) and prime[i] <= N:
        print(prime[i], end = " ") 
        i += 1
          
# This code is contributed by Rituraj Jain


PHP


输出 :

2 3 5 7 11

插图:

isPrime[0] = isPrime[1] = 0

After i = 2 iteration :
isPrime[]   [F, F, T, T, F, T, T, T] 
SPF[]       [0, 0, 2, 0, 2, 0, 0, 0]
     index   0  1  2  3  4  5  6  7

After i = 3 iteration :
isPrime[]  [F, F, T, T, F, T, F, T, T, F ]
SPF[]      [0, 0, 2, 3, 2, 0, 2, 0, 0, 3 ]
  index     0  1  2  3  4  5  6  7  8  9

After i = 4 iteration :
isPrime[]  [F, F, T, T, F, T, F, T, F, F]
SPF[]      [0, 0, 2, 3, 2, 0, 2, 0, 2, 3]
  index     0  1  2  3  4  5  6  7  8  9