Решето Ератосфена

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Решето́ Ератосфе́на в математиці — простий стародавній алгоритм знаходження всіх простих чисел менших деякого цілого числа , що був створений давньогрецьким математиком Ератосфеном.

Метод[ред. | ред. код]

Sieve of Eratosthenes animation.gif

Якщо потрібно знайти всі прості числа менші за певне число N, виписуються всі числа від 2 до N.

  1. Перше просте число — два. Викреслимо всі числа більші двох, які діляться на два (4, 6, 8 …).
  2. Наступне число, яке залишилося незакресленим (три), є простим. Викреслюємо всі числа більші трьох та кратні трьом (6, 9 …).
  3. Наступне незакреслене число (п'ять) є простим. Викреслимо всі числа більші п'яти та кратні п'яти (10, 15, 20, 25 …).
  4. Повторюємо операцію поки не буде досягнуто число N:
    • Наступне незакреслене число є простим. Викреслимо всі числа більші нього та кратні йому.

Числа, які залишилися незакресленими після цієї процедури — прості[1].

Оцінка складності[ред. | ред. код]

Алгоритм потребує біт пам'яті та математичних операцій.

Приклад для [ред. | ред. код]

Запишемо натуральні числа від 2 до 20 в рядок:

  2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20

Перше число в рядку 2 — просте. Викреслимо всі числа кратні 2 (кожне друге, починаючи з ):

  2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20 

Наступне незакреслене число 3 — просте. Викреслимо всі числа кратні 3 (кожне третє, починаючи з ):

  2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20 

Наступне незакреслене число 5 — просте. Викреслимо всі числа кратні 5 (кожне п'яте, починаючи з ). І т. д.

Необхідно викреслити кратні для всіх простих чисел , для яких . В результаті всі складені числа будуть викреслені, а залишаться всі прості числа. Для вже після викреслювання кратних числу 3 всі складені числа виявляються викресленими.

Реалізація алгоритму решета Ератосфена[ред. | ред. код]

Псевдокод[ред. | ред. код]

Решето Ератосфена може бути виражене в псевдокоді наступним чином[2][3]:

Алгоритм Решето Ератосфена є
  вхід : ціле число n > 1.
  вихід : всі прості числа від 2 до n.

  нехай Aмасив булевих значень, індексованих цілим числом s від 2 до n,
  ініціалізуємо весь масив значеннями true.
  
  для i = 2, 3, 4, ..., що не перевищує n робити
    якщо А [i] є true
      для j = i 2, i 2 + i, i 2 +2 i, i 2 +3 i, ..., що не перевищує n робити
                A[j] := false

  повернути всі i де A[i] є true.

Цей алгоритм видає всі прості числа, що не перевищують n . Він включає загальну оптимізацію, яка полягає в тому, щоб почати перераховувати числа кратні кожному простому i з i2. Часова складність цього алгоритму становить O(n log log n)[3], при стандартному припущенні, що оновлення масиву відбувається за час O(1).

Python[ред. | ред. код]

Реалізація мовою Python:

import math
N=1000000  # діапазон в якому шукаємо прості числа
prime=[True] * N
prime[0], prime[1] = False, False # 0 та 1 не є простими
for i in range(2,int(math.ceil(math.sqrt(N)))):  # від 2 до квадратного кореня з N 
    if prime[i]:  # якщо просте видаляємо всі числа кратні до нього
        j= i * i   # для j=2 будуть такі значення 4,6,8,10,12... для j=3 — 9,12,15,18,21...
        while j < N:
            prime[j] = False
            j += i

Див. також[ред. | ред. код]

Джерела[ред. | ред. код]

  1. Weisstein, Eric W. Sieve of Eratosthenes(англ.) на сайті Wolfram MathWorld.
  2. Sedgewick, Robert (1992). Algorithms in C++. Addison-Wesley. ISBN 978-0-201-51059-1. , p. 16.
  3. а б Jonathan Sorenson, An Introduction to Prime Number Sieves, Computer Sciences Technical Report #909, Department of Computer Sciences University of Wisconsin-Madison, January 2, 1990 (the use of optimization of starting from squares, and thus using only the numbers whose square is below the upper limit, is shown).