Sieve of Eratosthenes
Sieve of Eratosthenes is a simple and ancient algorithm used to find the prime numbers up to any given limit. It is one of the most efficient ways to find small prime numbers.
For a given upper limit the algorithm works by iteratively marking the multiples of primes as composite, starting from 2. Once all multiples of 2 have been marked composite, the muliples of next prime, ie 3 are marked composite. This process continues until where is a prime number.
Implementation
Sieve working
In the following algorithm, the number 0 represents a composite number.
- To find out all primes under , generate a list of all integers from 2 to n. (Note: 1 is not prime)
- Start with a smallest prime number, ie .
- Mark all the multiples of which are less than as composite. To do this, mark the value of the numbers (multiples of ) in the generated list as 0. Do not mark itself as composite.
- Assign the value of to the next prime. The next prime is the next non-zero number in the list which is greater than p.
- Repeat the process until .
We are done!
Now all non-zero numbers in the list represent primes, while the numbers which are 0 in the list represent composite numbers.
Example 1
Generate all the primes less than 11
First thing to note is that do not mark prime themselves as composite.
- Create a list of integers from 2 to 10.
list = [2, 3, 4, 5, 6, 7, 8, 9, 10]
- Start with .
- Since , continue.
- Mark all multiples of 2 as composite by setting their value as 0 in the list.
list = [2, 3, 0, 5, 0, 7, 0, 9, 0]
- Assign the value of to the next prime, ie 3.
- Since , continue.
- Mark all multiples of 3 as composite by setting their value as 0 in the list.
list = [2, 3, 0, 5, 0, 7, 0, 0, 0]
- Assign the value of to 5.
- Since , stop.
We are done!
The list is
[2, 3, 0, 5, 0, 7, 0, 0, 0]
. Since all the numbers which are 0 are composite, all the non-zero numbers are prime. Hence the prime numbers less 11 are 2, 3, 5, 7.
Example 2
Generate all the primes less than any integer
Since could be any large number, manually computing the answer would take years. Let's write a code for this.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24import math n = 200 # n is any arbitrary integer List = [] for x in xrange(2, n): # add numbers from 2 to n - 1 to List List.append(x) # note the above statement is equivalent to List = range(2, n) p = 2 # p is a prime while not int(math.sqrt(p)) + 1 > n: # continue to mark out primes until square root of p is less than n for x in xrange(p * 2, n, p): # remove all the multiples of p List[x - 2] = 0 p += 1 while p - 2 < len(List) and List[p - 2] == 0: # assign p to the next prime. Next prime is the next non zero number in the list p += 1 for x in List: # search for non zero or prime numbers in the list and print them if x != 0: print x
Here is an optimized java version -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37final int lim = 200; // exclusive int n[] = new int[lim - 2]; //exclude 1 for(int i = 2; i <= lim - 1; i++) //initialize the array with integers from 2 to lim { if((i & 1) == 0) //evens are not primes f & 1 return 0 if f % 2 == 0 { n[i - 2] = 0; } else { n[i - 2] = i; } } n[0] = 2; int p = 3; //start with a prime. Since 2 is already eliminated, start with 3 while(p * p < lim) { for(int i = p * p; i < lim; i += p + p) //remvove multiples of prime. Start at p * p { n[i - 2] = 0; } while(n[(p += 2) - 2] == 0) //find next non zero number. This is guaranteed to be a prime. ; } for(int i = 0; i < lim - 2; i++) //print non zero numbers { if(n[i] != 0) { System.out.println(n[i]); } }
Proof: To see why Sieve of Eratosthenes generates all the primes
To first understand why the sieve works, let's look into the definitions of prime decomposition and composite numbers.
Theorem 1
Every integer which is greater than 1 can be expressed as product of primes.
Theorem 2
If any integer is composite, then has a prime divisor less than or equal to .
Since for any number in the list, we are looking all prime numbers up to , we are indeed separating all composite numbers. Hence Sieve of Eratosthenes generates all primes numbers less than the upper limit.