← Назад к математике

Решето Эратосфена на отрезке

Поиск всех простых чисел на отрезке [l, r]

🐍 Python
t, d = map(int, input().split())
l, r = max(t - d, 1), t + d
n = int(r ** 0.5) + 2

F = [True] * (n + 1)
F[0] = F[1] = False

for i in range(2, n):
    if F[i]:
        for j in range(i * i, n, i):
            F[j] = False

P = [i for i, f in enumerate(F) if f]

n = r - l + 1
F = [True] * n

for p in P:
    if p * p > r:
        break
    s = max(p * p, ((l + p - 1) // p) * p)
    for j in range(s, r + 1, p):
        F[j - l] = False

res = []
for i in range(n):
    if F[i] and (i + l) >= 2:
        res.append(i + l)

print(*res)
⚙️ C++
#include <bits/stdc++.h>
using namespace std;

int main() {
    int t, d;
    cin >> t >> d;
    int l = max(t - d, 1), r = t + d;
    
    int n = sqrt(r) + 2;
    vector<bool> F(n + 1, true);
    F[0] = F[1] = false;
    
    for (int i = 2; i < n; i++) {
        if (F[i]) {
            for (int j = i * i; j < n; j += i) {
                F[j] = false;
            }
        }
    }
    
    vector<int> primes;
    for (int i = 2; i < n; i++) {
        if (F[i]) primes.push_back(i);
    }
    
    int len = r - l + 1;
    vector<bool> isPrime(len, true);
    
    for (int p : primes) {
        if (p * p > r) break;
        int start = max(p * p, ((l + p - 1) / p) * p);
        for (int j = start; j <= r; j += p) {
            isPrime[j - l] = false;
        }
    }
    
    for (int i = 0; i < len; i++) {
        if (isPrime[i] && (i + l) >= 2) {
            cout << i + l << " ";
        }
    }
    
    return 0;
}

Решето Эратосфена на отрезке

Если нужно найти простые числа на отрезке [l, r], где r может быть большим (например, 10¹²), а разность (r-l) относительно невелика, используется алгоритм решета на отрезке.

Алгоритм

  1. Находим все простые числа до √r обычным решетом Эратосфена
  2. Создаём массив для отметки чисел на отрезке [l, r]
  3. Для каждого простого p вычёркиваем его кратные на отрезке
  4. Оставшиеся непомеченные числа — простые

Сложность

Временная сложность: O(√r + (r-l) log log r)

Пространственная сложность: O(r-l)

Формат ввода и вывода

Ввод: t d — центр отрезка и радиус (отрезок [t-d, t+d])

Вывод: простые числа на отрезке

Пример:

10 5

Отрезок [5, 15]

Вывод: 5 7 11 13

Попробовать онлайн

Результат появится здесь...