package
0.0.0-20241221191246-b80a13d7bbe0
Repository: https://github.com/yvv4git/go-algorithms.git
Documentation: pkg.go.dev
# README
Решето Эратосфена / Sieve of Eratosthenes
Решето Эратосфена — это алгоритм для нахождения всех простых чисел до заданного целого числа n
. Этот метод назван в честь древнегреческого математика Эратосфена Киренского, который первым предложил его.
Основная идея
Алгоритм работает следующим образом:
- Создается массив
nums
размеромn+1
, где каждый элемент изначально равенfalse
(означает, что число не отмечено как составное). - Начиная с первого простого числа (2), алгоритм проходит по всем числам до
n
. - Для каждого простого числа
i
(которое не было отмечено как составное), алгоритм отмечает все его кратные как составные. - Процесс повторяется до тех пор, пока не будут проверены все числа до
n
.
Пример работы
Рассмотрим пример для n = 30
:
- Создаем массив
nums
размером 31 (от 0 до 30). - Начинаем с числа 2. Отмечаем все его кратные (4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30).
- Переходим к следующему числу, которое не было отмечено, это 3. Отмечаем все его кратные (6, 9, 12, 15, 18, 21, 24, 27, 30).
- Продолжаем этот процесс для чисел 5, 7, 11, 13, 17, 19, 23, 29.
- В результате, все числа, которые остались неотмеченными, являются простыми.
Временная сложность
- O(n log log n): Процесс отметки составных чисел для каждого простого числа
i
требуетn/i
операций. Суммарное количество операций для всех простых чисел доn
составляетn/2 + n/3 + n/5 + ...
, что асимптотически равноn log log n
.
Пространственная сложность
- O(n): Используется массив
nums
размеромn+1
для отметки составных чисел.
Пример кода на Go
package main
import (
"fmt"
)
// Функция sieveOfEratosthenes реализует алгоритм "Решето Эратосфена"
// для нахождения всех простых чисел до заданного целого числа n.
func sieveOfEratosthenes(n int) []bool {
// Создаем массив nums размером n+1, где каждый элемент изначально равен false.
// false означает, что число не отмечено как составное.
nums := make([]bool, n+1)
// Начинаем с первого простого числа (2) и проходим по всем числам до n.
for i := 2; i <= n; i++ {
// Если число i не отмечено как составное, то оно простое.
if !nums[i] {
// Отмечаем все кратные числа i как составные.
// Начинаем с i*i, так как все предыдущие кратные уже были отмечены.
for j := i * i; j <= n; j += i {
nums[j] = true
}
}
}
// Возвращаем массив nums, где false означает простое число.
return nums
}
func main() {
// Задаем значение n, до которого будем искать простые числа.
n := 30
// Вызываем функцию sieveOfEratosthenes для нахождения простых чисел до n.
nums := sieveOfEratosthenes(n)
// Выводим все простые числа до n.
fmt.Printf("Простые числа до %d:\n", n)
for i := 2; i <= n; i++ {
// Если число i не отмечено как составное, то оно простое.
if !nums[i] {
fmt.Printf("%d ", i)
}
}
}