Алгоритм сегментированного сита для генерации простых чисел на C++

В C++ алгоритм сегментированного сита используется для эффективного генерирования простых чисел в заданном диапазоне. Этот алгоритм представляет собой оптимизированную версию решета Эратосфена, которое используется для поиска всех простых чисел до заданного предела.

Вот реализация алгоритма сегментированного сита на C++:

#include <iostream>
#include <vector>
#include <cmath>
void segmentedSieve(int n) {
  int limit = sqrt(n) + 1;
  std::vector<bool> prime(limit, true);
  std::vector<int> primes;
  for (int p = 2; p <= limit; ++p) {
    if (prime[p]) {
      primes.push_back(p);
      for (int i = p * p; i <= limit; i += p)
        prime[i] = false;
    }
  }
  int low = limit;
  int high = 2 * limit;
  while (low < n) {
    if (high > n)
      high = n;
    std::vector<bool> mark(high - low + 1, true);
    for (int i = 0; i < primes.size(); ++i) {
      int loLim = floor(low / primes[i]) * primes[i];
      if (loLim < low)
        loLim += primes[i];
      for (int j = loLim; j <= high; j += primes[i])
        mark[j - low] = false;
    }
    for (int i = low; i <= high; ++i) {
      if (mark[i - low])
        std::cout << i << " ";
    }
    low += limit;
    high += limit;
  }
}
int main() {
  int n;
  std::cout << "Enter the upper limit: ";
  std::cin >> n;
  std::cout << "Prime numbers up to " << n << " are:\n";
  segmentedSieve(n);
  return 0;
}

В этой реализации мы делим диапазон на сегменты размером sqrt(n)и находим все простые числа до sqrt(n), используя решето Эратосфена. Затем для каждого сегмента мы перебираем простые числа, найденные на предыдущем шаге, и отмечаем кратные этим простым числам внутри сегмента. Наконец, мы выводим оставшиеся неотмеченные числа, которые являются простыми числами в заданном диапазоне.