에라토스테네스의 체

빠른 설명

에라토스테네스의 체는 부터 까지의 소수를 빠르게 구하는 알고리즘이다. 소수를 발견하면 그 소수의 배수를 합성수로 지워 나간다.

언제 쓰는가

  • 이하의 모든 소수가 필요할 때
  • 여러 수에 대해 소수 여부를 반복해서 물을 때
  • 약수, 배수, 소인수 관련 전처리가 필요할 때

시간복잡도

  • 일반 구현:
  • 메모리:

참고자료

C++ 코드

#include <algorithm>
#include <deque>
#include <functional>
#include <iostream>
#include <queue>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
 
vector<bool> sieve(int n) {
    vector<bool> is_prime(n + 1, true);
    if (n >= 0) is_prime[0] = false;
    if (n >= 1) is_prime[1] = false;
 
    for (int i = 2; 1LL * i * i <= n; i++) {
        if (!is_prime[i]) continue;
        for (int j = i * i; j <= n; j += i) {
            is_prime[j] = false;
        }
    }
    return is_prime;
}
 
int main() {
    auto is_prime = sieve(30);
    for (int i = 2; i <= 30; i++) {
        if (is_prime[i]) cout << i << ' ';
    }
}

Python 코드

def sieve(n):
    is_prime = [True] * (n + 1)
    if n >= 0:
        is_prime[0] = False
    if n >= 1:
        is_prime[1] = False
 
    i = 2
    while i * i <= n:
        if is_prime[i]:
            for j in range(i * i, n + 1, i):
                is_prime[j] = False
        i += 1
    return is_prime
 
is_prime = sieve(30)
print([i for i in range(2, 31) if is_prime[i]])