Loading AI tools
Algorithm for generating prime numbers From Wikipedia, the free encyclopedia
In mathematics, the sieve of Sundaram is a variant of the sieve of Eratosthenes, a simple deterministic algorithm for finding all the prime numbers up to a specified integer. It was discovered by Indian student S. P. Sundaram in 1934.[1][2]
The sieve starts with a list of the integers from 1 to n. From this list, all numbers of the form i + j + 2ij are removed, where i and j are positive integers such that 1 ≤ i ≤ j and i + j + 2ij ≤ n. The remaining numbers are doubled and incremented by one, giving a list of the odd prime numbers (that is, all primes except 2) below 2n + 2.
The sieve of Sundaram sieves out the composite numbers just as the sieve of Eratosthenes does, but even numbers are not considered; the work of "crossing out" the multiples of 2 is done by the final double-and-increment step. Whenever Eratosthenes' method would cross out k different multiples of a prime 2i + 1, Sundaram's method crosses out i + j(2i + 1) for 1 ≤ j ≤ ⌊k/2⌋.
If we start with integers from 1 to n, the final list contains only odd integers from 3 to 2n + 1. From this final list, some odd integers have been excluded; we must show these are precisely the composite odd integers less than 2n + 2.
Let q be an odd integer of the form 2k + 1. Then, q is excluded if and only if k is of the form i + j + 2ij, that is q = 2(i + j + 2ij) + 1. Then q = (2i + 1)(2j + 1).
So, an odd integer is excluded from the final list if and only if it has a factorization of the form (2i + 1)(2j + 1) — which is to say, if it has a non-trivial odd factor. Therefore the list must be composed of exactly the set of odd prime numbers less than or equal to 2n + 2.
def sieve_of_Sundaram(n):
"""The sieve of Sundaram is a simple deterministic algorithm for finding all the prime numbers up to a specified integer."""
k = (n - 2) // 2
integers_list = [True] * (k + 1)
for i in range(1, k + 1):
j = i
while i + j + 2 * i * j <= k:
integers_list[i + j + 2 * i * j] = False
j += 1
if n > 2:
print(2, end=' ')
for i in range(1, k + 1):
if integers_list[i]:
print(2 * i + 1, end=' ')
The above obscure-but-commonly-implemented Python version of the Sieve of Sundaram hides the true complexity of the algorithm due to the following reasons:
The following Python code in the same style resolves the above three issues, as well converting the code to a prime-counting function that also displays the total number of composite-culling operations:
from math import isqrt
def sieve_of_Sundaram(n):
"""The sieve of Sundaram is a simple deterministic algorithm for finding all the prime numbers up to a specified integer."""
if n < 3:
if n < 2:
return 0
else:
return 1
k = (n - 3) // 2 + 1
integers_list = [True for i in range(k)]
ops = 0
for i in range((isqrt(n) - 3) // 2 + 1):
# if integers_list[i]: # adding this condition turns it into a SoE!
p = 2 * i + 3
s = (p * p - 3) // 2 # compute cull start
for j in range(s, k, p):
integers_list[j] = False
ops += 1
print("Total operations: ", ops, ";", sep='')
count = 1
for i in range(k):
if integers_list[i]:
count += 1
print("Found ", count, " primes to ", n, ".", sep='')
The commented-out line is all that is necessary to convert the Sieve of Sundaram to the Odds-Only Sieve of Eratosthenes; this clarifies that the only difference between these two algorithms is that the Sieve of Sundaram culls composite numbers using all odd numbers as the base values, whereas the Odds-Only Sieve of Eratosthenes uses only the odd primes as base values, with both ranges of base values bounded to the square root of the range.
When run for various ranges, it is immediately clear that while, of course, the resulting count of primes for a given range is identical between the two algorithms, the number of culling operations is much higher for the Sieve of Sundaram and also grows much more quickly with increasing range.
From the above implementation, it is clear that the amount of work done is given by
where n is the range to be sieved and the interval [a, b] is the odd numbers between 3 and √n. (The interval [a, b] actually starts at the square of the odd base values, but this difference is negligible for large ranges.)
As the integral of the reciprocal of x is exactly log(x), and as the lower value for a is relatively very small (close to 1, whose logarithm is 0), this is about
Ignoring the constant factor of 1/8, the asymptotic complexity is clearly O(n log(n)).
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.