Definition

An algorithm to find prime numbers up to a number \(n\)

Algorithm description

Using a boolean vector of size \(n\) iteratively mark all the multiples of nonvisited positions as not primes

Implementation

Time complexity: \(O(tn)\), \(t\) is the number of primes between \(1\) and \(t\)

vector<bool> sieve;

void eratothenes_sieve(int n) {
  // initialize the list
  sieve.resize(n + 1, false);

  // multiples of 2 are not primes
  for (int i = 4; i <= n; i += 2) {
    sieve[j] = true;
  }

  // multiples of odd numbers
  for (int i = 3; i * i <= n; i += 2) {
    if (!sieve[i]) {
      for (int j = i * i; j <= n; j += 2 * i) {
        sieve[j] = true;
      }
    }
  }
}

void is_prime(int n) {
  assert(n < sieve.size());
  return sieve[n];
}