Решето Сундарама

Решето Сундара́ма — детерминированный алгоритм нахождения всех простых чисел до некоторого целого числа . Разработан индийским студентом Сундарамом в 1934 году.

Пошаговая демонстрация работы алгоритма для

Алгоритм предусматривает исключение из ряда натуральных чисел от 1 до всех чисел вида:

,

где индексы пробегают все натуральные значения, для которых , а именно значения и Затем каждое из оставшихся чисел умножается на 2 и увеличивается на 1. Полученная в результате последовательность представляет собой все простые числа в отрезке .

Обоснование

Алгоритм работает с нечётными натуральными числами большими единицы, представленными в виде , где является натуральным числом.

Если число является составным, то по определению оно может быть представлено в виде произведения двух нечётных чисел, больших единицы, то есть:

, где и  — натуральные числа. Раскрывая скобки, получаем, что
, или
, из чего следует, что
.

Таким образом, если из ряда натуральных чисел исключить все числа вида (), то для каждого из оставшихся чисел число обязано быть простым. И, наоборот, если число является простым, то число невозможно представить в виде и, таким образом, не будет исключено в процессе работы алгоритма.

#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    bool a[n + 1];
    
    for(int i = 1; i <= n; i++) {
        a[i] = true;
    }

    for(int i = 1; 2 * i * (i + 1) < n; i++) {
    	int j_max = (n - 1) / (2 * i + 1);
    	
        for(int j = i; j <= j_max; j++) {
            a[2 * i * j + i + j] = false;
        }
    }
    
    for(int i = 1; i <= n; i++) {
        if(a[i]) {
            printf("%d ", 2 * i + 1);
        }
    }
    return 0;
}

Пример реализации на python3.8

n = int(input())

sc = set(range(1, n + 1))

for i in range(1, int((((2 * n + 1)**0.5) - 1) / 2) + 1):
    for j in range(i, (n - 1) // (2 * i + 1) + 1):
        sc.remove(i + j + 2 * i * j)

sc = sorted(i * 2 + 1 for i in sc)

print(sc)

См. также

Ссылки

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.