포스트

에라토스테네스의 체 (Eratosthenes' Sieve)

소수를 구하는 알고리즘 중 하나인 에라토스테네스의 체 알고리즘에 대해 설명합니다.

에라토스테네스의 체 (Eratosthenes' Sieve)

에라토스테네스의 원리

  1. 구하고자 하는 수의 범위만큼 1차원 배열을 생성합니다.
  2. 2부터 시작하고 선택된 숫자의 배수에 해당하는 수를 배열에서 탐색하여 제거합니다.
  3. 2부터 시작하여 남아있는 수를 출력합니다.

코드

  • M, N 범위의 소수 구하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int main() {
    int M, N;
    cin >> M >> N;
    vector<int> A(N+1);
    
    for (int i = 2; i <= N; i++) {
        A[i] = i;
    }

    for (int i = 2; i <= sqrt(N); i++) { // 2부터 N의 제곱근까지 반복
        if (A[i] == 0) continue;

        for (int j = i+i; j <= N; j += i) { // i의 배수를 제거
            A[j] = 0;
        }
    }

    for (int i = M; i <= N; i++) {
        if (A[i] != 0) {
            cout << A[i] << '\n';
        }
    }
}

N의 제곱근까지만 반복하는 이유

  • N의 제곱근이 n이라고 할 때 N=a*b를 만족하는 a와 b중 적어도 하나는 n 이하이게 됩니다. 즉, N보다 작은 가운데 소수가 아닌 수는 항상 n보다 작은 약수를 가지게 됩니다. 따라서 에라토스테네스의 체로 n이하의 수의 배수를 모두 제거하면 남은 수는 소수가 됩니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.