Sieve of Eratosthenes in 0(n) time complexity
The classical Sieve of Eratosthenes algorithm takes O(N log (log N)) time to find all prime numbers less than N. In this article, a modified Sieve is discussed that works in O(N) time.
Example :
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
Manipulated Sieve of Eratosthenes algorithm works as follows:
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 i*p as non_prime.
Mark smallest prime factor of i*p as j
Below is the implementation of the above idea.
C++
#include<bits/stdc++.h>
using namespace std;
const long long MAX_SIZE = 1000001;
vector< long long >isprime(MAX_SIZE , true );
vector< long long >prime;
vector< long long >SPF(MAX_SIZE);
void manipulated_seive( int N)
{
isprime[0] = isprime[1] = false ;
for ( long long int i=2; i<N ; i++)
{
if (isprime[i])
{
prime.push_back(i);
SPF[i] = i;
}
for ( long long int j=0;
j < ( int )prime.size() &&
i*prime[j] < N && prime[j] <= SPF[i];
j++)
{
isprime[i*prime[j]]= false ;
SPF[i*prime[j]] = prime[j] ;
}
}
}
int main()
{
int N = 13 ;
manipulated_seive(N);
for ( int i=0; i<prime.size() && prime[i] <= N ; i++)
cout << prime[i] << " " ;
return 0;
}
|
Java
import java.util.Vector;
class Test
{
static final int MAX_SIZE = 1000001 ;
static Vector<Boolean>isprime = new Vector<>(MAX_SIZE);
static Vector<Integer>prime = new Vector<>();
static Vector<Integer>SPF = new Vector<>(MAX_SIZE);
static void manipulated_seive( int N)
{
isprime.set( 0 , false );
isprime.set( 1 , false );
for ( int i= 2 ; i<N ; i++)
{
if (isprime.get(i))
{
prime.add(i);
SPF.set(i,i);
}
for ( int j= 0 ;
j < prime.size() &&
i*prime.get(j) < N && prime.get(j) <= SPF.get(i);
j++)
{
isprime.set(i*prime.get(j), false );
SPF.set(i*prime.get(j),prime.get(j)) ;
}
}
}
public static void main(String args[])
{
int N = 13 ;
for ( int i = 0 ; i < MAX_SIZE; i++){
isprime.add( true );
SPF.add( 2 );
}
manipulated_seive(N);
for ( int i= 0 ; i<prime.size() && prime.get(i) <= N ; i++)
System.out.print(prime.get(i) + " " );
}
}
|
Python3
MAX_SIZE = 1000001
isprime = [ True ] * MAX_SIZE
prime = []
SPF = [ None ] * (MAX_SIZE)
def manipulated_seive(N):
isprime[ 0 ] = isprime[ 1 ] = False
for i in range ( 2 , N):
if isprime[i] = = True :
prime.append(i)
SPF[i] = i
j = 0
while (j < len (prime) and
i * prime[j] < N and
prime[j] < = SPF[i]):
isprime[i * prime[j]] = False
SPF[i * prime[j]] = prime[j]
j + = 1
if __name__ = = "__main__" :
N = 13
manipulated_seive(N)
i = 0
while i < len (prime) and prime[i] < = N:
print (prime[i], end = " " )
i + = 1
|
C#
using System;
using System.Collections.Generic;
class Test {
static int MAX_SIZE = 1000001;
static List< bool > isprime = new List< bool >(MAX_SIZE);
static List< int > prime = new List< int >();
static List< int > SPF = new List< int >(MAX_SIZE);
static void manipulated_seive( int N)
{
isprime[0] = false ;
isprime[1] = false ;
for ( int i = 2; i < N; i++)
{
if (isprime[i])
{
prime.Add(i);
SPF[i] = i;
}
for ( int j = 0;
j < prime.Count && i * prime[j] < N
&& prime[j] <= SPF[i];
j++) {
isprime[i * prime[j]] = false ;
SPF[i * prime[j]] = prime[j];
}
}
}
public static void Main( string [] args)
{
int N = 13;
for ( int i = 0; i < MAX_SIZE; i++) {
isprime.Add( true );
SPF.Add(2);
}
manipulated_seive(N);
for ( int i = 0; i < prime.Count && prime[i] <= N;
i++)
Console.Write(prime[i] + " " );
}
}
|
PHP
<?php
$MAX_SIZE = 10001;
$isprime = array_fill (0, $MAX_SIZE , true);
$prime = array ();
$SPF = array_fill (0, $MAX_SIZE , 0);
function manipulated_seive( $N )
{
global $isprime , $MAX_SIZE ,
$SPF , $prime ;
$isprime [0] = $isprime [1] = false;
for ( $i = 2; $i < $N ; $i ++)
{
if ( $isprime [ $i ])
{
array_push ( $prime , $i );
$SPF [ $i ] = $i ;
}
$j = 0;
while ( $j < count ( $prime ) &&
$i * $prime [ $j ] < $N &&
$prime [ $j ] <= $SPF [ $i ])
{
$isprime [ $i * $prime [ $j ]] = false;
$SPF [ $i * $prime [ $j ]] = $prime [ $j ];
$j += 1;
}
}
}
$N = 13;
manipulated_seive( $N );
$i = 0;
while ( $i < count ( $prime ) &&
$prime [ $i ] <= $N )
{
print ( $prime [ $i ] . " " );
$i += 1;
}
?>
|
Javascript
<script>
const MAX_SIZE = 1000001;
var isPrime = Array.from({ length: MAX_SIZE }, (_, i) => true );
var prime = [];
var SPF = Array.from({ length: MAX_SIZE });
function manipulated_sieve(N) {
isPrime[0] = isPrime[1] = true ;
for (let i = 2; i < N; i++)
{
if (isPrime[i])
{
prime.push(i);
SPF[i] = i;
}
for (
let j = 0;
j < prime.length && i * prime[j] < N && prime[j] <= SPF[i];
j++
) {
isPrime[i * prime[j]] = false ;
SPF[i * prime[j]] = prime[j];
}
}
}
var N = 13;
manipulated_sieve(N);
for (let i = 0; i < prime.length && prime[i] <= N; i++) {
document.write(prime[i] + " " );
}
</script>
|
Output :
2 3 5 7 11
Auxiliary Space: O(1)
Illustration:
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
Last Updated :
14 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...