Featured image of post Как найти простые числа до 1000 с помощью решета Эратосфена

Как найти простые числа до 1000 с помощью решета Эратосфена

Что такое решето Эратосфена

Решето Эратосфена — это алгоритм для нахождения всех простых чисел до заданного целого числа. Алгоритм прост и может быть реализован с помощью следующих шагов:

  1. Создайте логический (bool) массив из N элементов и инициализируйте все элементы как true.
  2. Установите 0-й и 1-й элементы массива как false (так как 0 и 1 не являются простыми числами).
  3. Если 2-й элемент массива равен true, выведите 2 как простое число.
  4. Установите все элементы, кратные 2, начиная с $2^2$, в false ※
  5. Если 3-й элемент массива равен true, выведите 3 как простое число.
  6. Установите все элементы, кратные 3, начиная с $3^2$, в false.
  7. Повторите тот же процесс для 4-го, 5-го, …, N-го элементов.

※ Причина, по которой мы устанавливаем в false элементы, начиная с квадрата числа, заключается в том, что числа, меньшие квадрата, уже были обработаны (перечисление завершено).

Реализация на Rust

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
fn main() {
    let n = 1000;
    let mut is_prime = vec![true; n+1];
    is_prime[0] = false;
    is_prime[1] = false;
    for i in 2..=n {
        if is_prime[i] {
            println!("{}", i);
            let mut j = i * i;
            while j <= n {
                is_prime[j] = false;
                j += i;
            }
        }
    }
}

Немного более быстрая версия

Мы реализуем немного более быструю версию, учитывая следующие моменты:

  • Вместо инициализации массива значением true, инициализируем его значением false (так быстрее).
  • Поскольку кратные 2 не являются простыми числами, мы опускаем процесс установки кратных 2 в false.
  • Нет необходимости выполнять цикл до n; если найти простые числа до квадратного корня из n, можно найти все простые числа до n.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
fn main() {
    let n = 1000;
    let mut is_prime = vec![false; n+1];
    is_prime[2] = true;
    for i in (3..=n).step_by(2) {
        is_prime[i] = true;
    }
    for i in 3..=((n as f64).sqrt() as usize) {
        if is_prime[i] {
            let mut j = i * i;
            while j <= n {
                is_prime[j] = false;
                j += i * 2;
            }
        }
    }
    for i in (2..=n).filter(|&x| is_prime[x]) {
        println!("{}", i);
    }
}

Источники

comments powered by Disqus
Создано при помощи Hugo
Тема Stack, дизайн Jimmy