<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4</id>
	<title>에라토스테네스의 체 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4"/>
	<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4&amp;action=history"/>
	<updated>2026-07-18T11:59:25Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://www.gaonwiki.com/w/index.php?title=%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4&amp;diff=108014&amp;oldid=prev</id>
		<title>Gaon12: 시작</title>
		<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4&amp;diff=108014&amp;oldid=prev"/>
		<updated>2026-01-17T11:40:57Z</updated>

		<summary type="html">&lt;p&gt;시작&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 개요 ==&lt;br /&gt;
&amp;#039;&amp;#039;Sieve of Eratosthenes&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;에라토스테네스의 체&amp;#039;&amp;#039;&amp;#039;(Sieve of Eratosthenes)는 고대 그리스의 수학자 [[에라토스테네스]]가 고안한 [[소수]] 판별 [[알고리즘]]이다. 기원전 240년경에 만들어진 이 알고리즘은 현대에도 여전히 효율적인 소수 탐색 방법으로 사용되고 있다.&amp;lt;ref&amp;gt;특히 특정 범위 내의 모든 소수를 구할 때 매우 효율적이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;체&amp;#039;라는 이름이 붙은 이유는 숫자들을 체로 거르듯이 합성수를 걸러내고 소수만 남기는 방식이기 때문이다. 마치 밀가루를 체로 거르듯이 말이다.&lt;br /&gt;
&lt;br /&gt;
== 역사 ==&lt;br /&gt;
=== 에라토스테네스 ===&lt;br /&gt;
이 알고리즘을 만든 [[에라토스테네스]](BC 276~BC 194)는 고대 그리스의 천재 수학자이자 지리학자였다. 그는 [[알렉산드리아 도서관]]의 관장을 역임했으며, 지구의 둘레를 최초로 계산한 것으로도 유명하다.&amp;lt;ref&amp;gt;그의 계산값은 실제 지구 둘레와 오차가 2% 미만이었다고 전해진다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
에라토스테네스는 수학, 천문학, 지리학, 시학 등 다방면에서 활약했지만, 각 분야에서 1인자는 아니었다고 한다. 그래서 당시 사람들이 그에게 &amp;#039;베타(β)&amp;#039;라는 별명을 붙였다고. ~~2인자의 설움~~ 하지만 이 체 알고리즘만큼은 2000년이 넘도록 현역으로 쓰이고 있으니, 그야말로 &amp;#039;&amp;#039;&amp;#039;레전드&amp;#039;&amp;#039;&amp;#039;다.&lt;br /&gt;
&lt;br /&gt;
== 알고리즘 원리 ==&lt;br /&gt;
=== 기본 아이디어 ===&lt;br /&gt;
에라토스테네스의 체의 핵심 아이디어는 매우 단순하다:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;소수의 배수는 모두 합성수다.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
이 간단한 사실을 이용해서 2부터 시작하여 각 소수의 배수들을 지워나가면, 최종적으로 소수만 남게 된다는 것이다.&lt;br /&gt;
&lt;br /&gt;
=== 상세 알고리즘 ===&lt;br /&gt;
1. &amp;#039;&amp;#039;&amp;#039;2부터 N까지의 모든 자연수를 나열한다.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
:* 1은 소수가 아니므로 처음부터 제외한다.&amp;lt;ref&amp;gt;1은 역사적으로 소수로 분류되기도 했지만, 현대 수학에서는 소수의 정의에서 제외한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;#039;&amp;#039;&amp;#039;2를 소수로 선택하고, 2의 배수를 모두 지운다.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
:* 4, 6, 8, 10, 12, ... 를 전부 지운다.&lt;br /&gt;
:* 2는 남겨둔다. 자기 자신은 지우지 않는다.&lt;br /&gt;
&lt;br /&gt;
3. &amp;#039;&amp;#039;&amp;#039;남은 수 중 가장 작은 수(3)를 소수로 선택하고, 그 배수를 모두 지운다.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
:* 6, 9, 12, 15, 18, ... 을 전부 지운다.&lt;br /&gt;
:* 이때 6, 12 등은 이미 지워진 상태다. 중복 작업이지만 상관없다.&lt;br /&gt;
&lt;br /&gt;
4. &amp;#039;&amp;#039;&amp;#039;이 과정을 반복한다.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
:* 다음은 5의 배수(10, 15, 20, 25, ...)를 지운다.&lt;br /&gt;
:* 그 다음은 7의 배수를 지운다.&lt;br /&gt;
:* &amp;lt;math&amp;gt;\sqrt{N}&amp;lt;/math&amp;gt;까지만 반복하면 된다.&amp;lt;ref&amp;gt;N보다 작은 합성수는 반드시 &amp;lt;math&amp;gt;\sqrt{N}&amp;lt;/math&amp;gt; 이하의 소인수를 가진다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;#039;&amp;#039;&amp;#039;남은 수들이 모두 소수다.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== 구체적 예시 ==&lt;br /&gt;
=== 30까지의 소수 구하기 ===&lt;br /&gt;
2부터 30까지의 소수를 찾는 과정을 &amp;#039;&amp;#039;&amp;#039;단계별&amp;#039;&amp;#039;&amp;#039;로 살펴보자.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[초기 상태]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2  3  4  5  6  7  8  9  10&lt;br /&gt;
11 12 13 14 15 16 17 18 19 20&lt;br /&gt;
21 22 23 24 25 26 27 28 29 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[1단계: 2의 배수 제거]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
2는 소수로 확정. 4, 6, 8, 10, 12, ... 를 제거&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2  3  X  5  X  7  X  9  X&lt;br /&gt;
11 X  13 X  15 X  17 X  19 X&lt;br /&gt;
21 X  23 X  25 X  27 X  29 X&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[2단계: 3의 배수 제거]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
3은 소수로 확정. 6, 9, 12, 15, 18, ... 을 제거&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2  3  X  5  X  7  X  X  X&lt;br /&gt;
11 X  13 X  X  X  17 X  19 X&lt;br /&gt;
X  X  23 X  25 X  X  X  29 X&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[3단계: 5의 배수 제거]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
5는 소수로 확정. 10, 15, 20, 25, 30을 제거&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2  3  X  5  X  7  X  X  X&lt;br /&gt;
11 X  13 X  X  X  17 X  19 X&lt;br /&gt;
X  X  23 X  X  X  X  X  29 X&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[종료: &amp;lt;math&amp;gt;\sqrt{30}\approx 5.48&amp;lt;/math&amp;gt; 이므로 5까지만 확인하면 됨]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
7은 &amp;lt;math&amp;gt;7^2=49&amp;lt;/math&amp;gt; 이고 &amp;lt;math&amp;gt;49&amp;gt;30&amp;lt;/math&amp;gt;이므로 확인할 필요 없음.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;최종 결과: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29&amp;#039;&amp;#039;&amp;#039; (총 10개)&lt;br /&gt;
&lt;br /&gt;
== 시간 복잡도 ==&lt;br /&gt;
=== 성능 분석 ===&lt;br /&gt;
에라토스테네스의 체의 [[시간 복잡도]]는 &amp;#039;&amp;#039;&amp;#039;&amp;lt;math&amp;gt;O(N\log\log N)&amp;lt;/math&amp;gt;&amp;#039;&amp;#039;&amp;#039;이다.&amp;lt;ref&amp;gt;정확히는 &amp;lt;math&amp;gt;O(N\log\log N)&amp;lt;/math&amp;gt;이지만, 실용적으로는 거의 &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;에 가깝다고 알려져 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이게 얼마나 빠른가 하면:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;단순 소수 판별법&amp;#039;&amp;#039;&amp;#039;: 각 수마다 &amp;lt;math&amp;gt;\sqrt{N}&amp;lt;/math&amp;gt;까지 나눠보기 → &amp;lt;math&amp;gt;O(N^{1.5})&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;에라토스테네스의 체&amp;#039;&amp;#039;&amp;#039;: 배수 지우기 → &amp;lt;math&amp;gt;O(N\log\log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
예를 들어 &amp;lt;math&amp;gt;N=1{,}000{,}000&amp;lt;/math&amp;gt;일 때:&lt;br /&gt;
* 단순 방법: 약 &amp;lt;math&amp;gt;1{,}000{,}000^{1.5}\approx 10^{12}&amp;lt;/math&amp;gt; 번의 연산&lt;br /&gt;
* 에라토스테네스: 약 &amp;lt;math&amp;gt;N\log\log N&amp;lt;/math&amp;gt; 수준의 연산(상수 및 구현에 따라 달라짐)&lt;br /&gt;
&lt;br /&gt;
=== 최적화 기법 ===&lt;br /&gt;
==== 짝수 건너뛰기 ====&lt;br /&gt;
2를 제외한 모든 짝수는 합성수이므로, 홀수만 확인하면 된다.&lt;br /&gt;
* 메모리 사용량 감소&lt;br /&gt;
* 연산 횟수도 감소&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;math&amp;gt;\sqrt{N}&amp;lt;/math&amp;gt;까지만 체크 ====&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; 이하의 합성수는 반드시 &amp;lt;math&amp;gt;\sqrt{N}&amp;lt;/math&amp;gt; 이하의 소인수를 가진다. 따라서 &amp;lt;math&amp;gt;\sqrt{N}&amp;lt;/math&amp;gt;까지만 확인하면 충분하다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;증명:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
합성수 &amp;lt;math&amp;gt;M=a\times b&amp;lt;/math&amp;gt;라고 하자. (&amp;lt;math&amp;gt;a\le b&amp;lt;/math&amp;gt;)&lt;br /&gt;
만약 &amp;lt;math&amp;gt;a&amp;gt;\sqrt{M}&amp;lt;/math&amp;gt;이라면, &amp;lt;math&amp;gt;b&amp;gt;\sqrt{M}&amp;lt;/math&amp;gt;도 성립한다.&lt;br /&gt;
그러면 &amp;lt;math&amp;gt;a\times b&amp;gt;\sqrt{M}\times\sqrt{M}=M&amp;lt;/math&amp;gt;이 되어 모순.&lt;br /&gt;
따라서 &amp;lt;math&amp;gt;a\le\sqrt{M}&amp;lt;/math&amp;gt;이거나 &amp;lt;math&amp;gt;b\le\sqrt{M}&amp;lt;/math&amp;gt;이다.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;math&amp;gt;i^2&amp;lt;/math&amp;gt;부터 시작하기 ====&lt;br /&gt;
소수 &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;의 배수를 지울 때, &amp;lt;math&amp;gt;2p,3p,4p,\dots&amp;lt;/math&amp;gt;부터 지우지 말고 &amp;#039;&amp;#039;&amp;#039;&amp;lt;math&amp;gt;p^2&amp;lt;/math&amp;gt;&amp;#039;&amp;#039;&amp;#039;부터 지우면 된다.&lt;br /&gt;
* 왜냐하면 &amp;lt;math&amp;gt;2p,3p,\dots,(p-1)p&amp;lt;/math&amp;gt;는 이미 이전 단계에서 지워졌기 때문이다.&lt;br /&gt;
* 예: 7의 배수를 지울 때 &amp;lt;math&amp;gt;14(=2\times 7),21(=3\times 7)&amp;lt;/math&amp;gt; 등은 이미 2나 3의 배수로 지워진다.&lt;br /&gt;
&lt;br /&gt;
== 공간 복잡도 ==&lt;br /&gt;
에라토스테네스의 체는 &amp;#039;&amp;#039;&amp;#039;&amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&amp;#039;&amp;#039;&amp;#039;의 공간이 필요하다. &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;부터 &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;까지 각 정수에 대해 &amp;quot;소수인가?&amp;quot;를 저장해야 하기 때문이다.&lt;br /&gt;
&lt;br /&gt;
=== 비트 최적화 ===&lt;br /&gt;
Boolean 배열 대신 비트 배열을 사용하면 메모리를 &amp;lt;math&amp;gt;\frac{1}{8}&amp;lt;/math&amp;gt;로 줄일 수 있다.&amp;lt;ref&amp;gt;1바이트는 8비트이므로, 비트 단위로 저장하면 같은 정보를 더 적은 메모리로 표현할 수 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
예: 1억까지의 소수를 구할 때(개념적 예시)&lt;br /&gt;
* Boolean 배열: 약 100MB 수준&lt;br /&gt;
* 비트 배열: 약 12.5MB 수준&lt;br /&gt;
* 홀수만 저장: 약 6.25MB 수준&lt;br /&gt;
&lt;br /&gt;
== 구현 예시 ==&lt;br /&gt;
=== Python ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
에라토스테네스의 체 (Python 3.x)&lt;br /&gt;
&lt;br /&gt;
- 입력: 표준 입력으로 정수 N (N &amp;gt;= 0)&lt;br /&gt;
- 출력: 2 이상 N 이하의 모든 소수를 공백으로 구분하여 한 줄에 출력&lt;br /&gt;
        (소수가 없으면 빈 줄)&lt;br /&gt;
&lt;br /&gt;
이 코드는 &amp;quot;생략 없이&amp;quot; 실행 가능한 완전한 예시를 제공한다.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
from __future__ import annotations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sieve_of_eratosthenes(n: int) -&amp;gt; list[int]:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    에라토스테네스의 체로 n 이하의 모든 소수를 구한다.&lt;br /&gt;
&lt;br /&gt;
    Args:&lt;br /&gt;
        n (int): 상한 값&lt;br /&gt;
&lt;br /&gt;
    Returns:&lt;br /&gt;
        list[int]: 2 이상 n 이하의 소수 목록&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # n이 2보다 작으면 소수가 없다.&lt;br /&gt;
    if n &amp;lt; 2:&lt;br /&gt;
        return []&lt;br /&gt;
&lt;br /&gt;
    # is_prime[i] == True  -&amp;gt; i는 소수 후보&lt;br /&gt;
    # is_prime[i] == False -&amp;gt; i는 합성수(또는 0/1)&lt;br /&gt;
    is_prime = [True] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    # 0과 1은 소수가 아니므로 False로 표시한다.&lt;br /&gt;
    is_prime[0] = False&lt;br /&gt;
    is_prime[1] = False&lt;br /&gt;
&lt;br /&gt;
    # 2부터 √n까지 확인한다.&lt;br /&gt;
    # i가 소수라면 i의 배수들을 합성수로 지운다.&lt;br /&gt;
    limit = int(n ** 0.5)&lt;br /&gt;
    for i in range(2, limit + 1):&lt;br /&gt;
        if is_prime[i]:&lt;br /&gt;
            # i*i 미만의 배수(2i, 3i, ..., (i-1)i)는&lt;br /&gt;
            # 더 작은 소수 단계에서 이미 지워졌으므로 i*i부터 시작한다.&lt;br /&gt;
            start = i * i&lt;br /&gt;
            step = i&lt;br /&gt;
            for j in range(start, n + 1, step):&lt;br /&gt;
                is_prime[j] = False&lt;br /&gt;
&lt;br /&gt;
    # True로 남아 있는 인덱스만 소수이므로 리스트로 추출한다.&lt;br /&gt;
    primes: list[int] = []&lt;br /&gt;
    for i in range(2, n + 1):&lt;br /&gt;
        if is_prime[i]:&lt;br /&gt;
            primes.append(i)&lt;br /&gt;
&lt;br /&gt;
    return primes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main() -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    프로그램 진입점.&lt;br /&gt;
&lt;br /&gt;
    표준 입력에서 N을 읽고,&lt;br /&gt;
    n 이하의 소수를 공백으로 구분해 출력한다.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    import sys&lt;br /&gt;
&lt;br /&gt;
    data = sys.stdin.read().strip()&lt;br /&gt;
    if not data:&lt;br /&gt;
        # 입력이 비어 있으면 아무 것도 출력하지 않는다.&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    n = int(data)&lt;br /&gt;
    primes = sieve_of_eratosthenes(n)&lt;br /&gt;
&lt;br /&gt;
    # 소수 목록을 한 줄로 출력한다.&lt;br /&gt;
    # 소수가 없으면 빈 줄이 출력된다.&lt;br /&gt;
    sys.stdout.write(&amp;quot; &amp;quot;.join(map(str, primes)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C++ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
에라토스테네스의 체 (C++)&lt;br /&gt;
&lt;br /&gt;
- 입력: 표준 입력으로 정수 N (N &amp;gt;= 0)&lt;br /&gt;
- 출력: 2 이상 N 이하의 모든 소수를 공백으로 구분하여 한 줄에 출력&lt;br /&gt;
        (소수가 없으면 빈 줄)&lt;br /&gt;
&lt;br /&gt;
이 코드는 &amp;quot;생략 없이&amp;quot; 컴파일/실행 가능한 완전한 예시를 제공한다.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static std::vector&amp;lt;int&amp;gt; sieve_of_eratosthenes(int n) {&lt;br /&gt;
    // n이 2보다 작으면 소수가 없다.&lt;br /&gt;
    if (n &amp;lt; 2) {&lt;br /&gt;
        return {};&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // is_prime[i] == true  -&amp;gt; i는 소수 후보&lt;br /&gt;
    // is_prime[i] == false -&amp;gt; i는 합성수(또는 0/1)&lt;br /&gt;
    std::vector&amp;lt;bool&amp;gt; is_prime(static_cast&amp;lt;std::size_t&amp;gt;(n + 1), true);&lt;br /&gt;
&lt;br /&gt;
    // 0과 1은 소수가 아니다.&lt;br /&gt;
    is_prime[0] = false;&lt;br /&gt;
    is_prime[1] = false;&lt;br /&gt;
&lt;br /&gt;
    // 2부터 √n까지 확인한다.&lt;br /&gt;
    int limit = static_cast&amp;lt;int&amp;gt;(std::sqrt(static_cast&amp;lt;double&amp;gt;(n)));&lt;br /&gt;
    for (int i = 2; i &amp;lt;= limit; i++) {&lt;br /&gt;
        if (is_prime[i]) {&lt;br /&gt;
            // i*i 미만의 배수는 이미 더 작은 소수 단계에서 지워졌으므로 i*i부터 시작한다.&lt;br /&gt;
            long long start = 1LL * i * i;&lt;br /&gt;
            for (long long j = start; j &amp;lt;= n; j += i) {&lt;br /&gt;
                is_prime[static_cast&amp;lt;std::size_t&amp;gt;(j)] = false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // 소수만 추출한다.&lt;br /&gt;
    std::vector&amp;lt;int&amp;gt; primes;&lt;br /&gt;
    primes.reserve(n / 10); // 대략적인 예약(정확하지 않아도 무방)&lt;br /&gt;
&lt;br /&gt;
    for (int i = 2; i &amp;lt;= n; i++) {&lt;br /&gt;
        if (is_prime[i]) {&lt;br /&gt;
            primes.push_back(i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return primes;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    std::ios::sync_with_stdio(false);&lt;br /&gt;
    std::cin.tie(nullptr);&lt;br /&gt;
&lt;br /&gt;
    int n;&lt;br /&gt;
    if (!(std::cin &amp;gt;&amp;gt; n)) {&lt;br /&gt;
        // 입력이 없으면 종료한다.&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    std::vector&amp;lt;int&amp;gt; primes = sieve_of_eratosthenes(n);&lt;br /&gt;
&lt;br /&gt;
    // 공백으로 구분해 한 줄 출력한다.&lt;br /&gt;
    for (std::size_t i = 0; i &amp;lt; primes.size(); i++) {&lt;br /&gt;
        if (i &amp;gt; 0) {&lt;br /&gt;
            std::cout &amp;lt;&amp;lt; &amp;#039; &amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; primes[i];&lt;br /&gt;
    }&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;#039;\n&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaScript ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
에라토스테네스의 체 (JavaScript / Node.js)&lt;br /&gt;
&lt;br /&gt;
- 입력: 표준 입력으로 정수 N (N &amp;gt;= 0)&lt;br /&gt;
- 출력: 2 이상 N 이하의 모든 소수를 공백으로 구분하여 한 줄에 출력&lt;br /&gt;
        (소수가 없으면 빈 줄)&lt;br /&gt;
&lt;br /&gt;
이 코드는 &amp;quot;생략 없이&amp;quot; 실행 가능한 완전한 예시를 제공한다.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 에라토스테네스의 체로 n 이하의 모든 소수를 구한다.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {number} n - 상한 값&lt;br /&gt;
 * @returns {number[]} - 2 이상 n 이하의 소수 목록&lt;br /&gt;
 */&lt;br /&gt;
function sieveOfEratosthenes(n) {&lt;br /&gt;
  // n이 2보다 작으면 소수가 없다.&lt;br /&gt;
  if (n &amp;lt; 2) {&lt;br /&gt;
    return [];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // isPrime[i] === true  -&amp;gt; i는 소수 후보&lt;br /&gt;
  // isPrime[i] === false -&amp;gt; i는 합성수(또는 0/1)&lt;br /&gt;
  const isPrime = new Array(n + 1).fill(true);&lt;br /&gt;
&lt;br /&gt;
  // 0과 1은 소수가 아니다.&lt;br /&gt;
  isPrime[0] = false;&lt;br /&gt;
  isPrime[1] = false;&lt;br /&gt;
&lt;br /&gt;
  // 2부터 √n까지 확인한다.&lt;br /&gt;
  const limit = Math.floor(Math.sqrt(n));&lt;br /&gt;
  for (let i = 2; i &amp;lt;= limit; i++) {&lt;br /&gt;
    if (isPrime[i]) {&lt;br /&gt;
      // i*i 미만의 배수는 이미 더 작은 소수 단계에서 지워졌으므로 i*i부터 시작한다.&lt;br /&gt;
      for (let j = i * i; j &amp;lt;= n; j += i) {&lt;br /&gt;
        isPrime[j] = false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // 소수만 추출한다.&lt;br /&gt;
  const primes = [];&lt;br /&gt;
  for (let i = 2; i &amp;lt;= n; i++) {&lt;br /&gt;
    if (isPrime[i]) {&lt;br /&gt;
      primes.push(i);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return primes;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 프로그램 진입점.&lt;br /&gt;
 * 표준 입력에서 N을 읽고, 소수 목록을 공백으로 구분해 출력한다.&lt;br /&gt;
 */&lt;br /&gt;
function main() {&lt;br /&gt;
  const fs = require(&amp;quot;fs&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  const input = fs.readFileSync(0, &amp;quot;utf8&amp;quot;).trim();&lt;br /&gt;
  if (input.length === 0) {&lt;br /&gt;
    // 입력이 비어 있으면 아무 것도 출력하지 않는다.&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const n = Number(input);&lt;br /&gt;
  const primes = sieveOfEratosthenes(n);&lt;br /&gt;
&lt;br /&gt;
  process.stdout.write(primes.join(&amp;quot; &amp;quot;) + &amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 응용 ==&lt;br /&gt;
=== 소인수분해 ===&lt;br /&gt;
에라토스테네스의 체를 변형하면 &amp;#039;&amp;#039;&amp;#039;모든 수의 소인수분해&amp;#039;&amp;#039;&amp;#039;를 빠르게 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
각 수에 대해 &amp;quot;가장 작은 소인수&amp;quot;를 저장해두면, &amp;lt;math&amp;gt;O(\log N)&amp;lt;/math&amp;gt; 시간에 소인수분해가 가능하다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Smallest Prime Factor(SPF)를 저장하는 체 + 빠른 소인수분해 (Python 3.x)&lt;br /&gt;
&lt;br /&gt;
- sieve_with_spf(n): 2..n 범위에 대해 각 수의 최소 소인수(spf)를 계산한다.&lt;br /&gt;
- factorize(x, spf): spf를 이용해 x를 소인수분해하여 소인수 목록(중복 포함)을 반환한다.&lt;br /&gt;
&lt;br /&gt;
이 코드는 &amp;quot;생략 없이&amp;quot; 실행 가능한 완전한 예시를 제공한다.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
from __future__ import annotations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sieve_with_spf(n: int) -&amp;gt; list[int]:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    0..n 범위에서 각 정수의 최소 소인수(SPF: Smallest Prime Factor)를 저장한다.&lt;br /&gt;
&lt;br /&gt;
    spf[x]는 x의 최소 소인수이며,&lt;br /&gt;
    소수 p에 대해서는 spf[p] == p가 된다.&lt;br /&gt;
&lt;br /&gt;
    Args:&lt;br /&gt;
        n (int): 상한 값&lt;br /&gt;
&lt;br /&gt;
    Returns:&lt;br /&gt;
        list[int]: spf 배열 (길이 n+1)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # spf[i]를 i로 초기화한다.&lt;br /&gt;
    # 이후 합성수에 대해서만 더 작은 소인수로 갱신한다.&lt;br /&gt;
    spf = list(range(n + 1))&lt;br /&gt;
&lt;br /&gt;
    if n &amp;gt;= 0:&lt;br /&gt;
        spf[0] = 0&lt;br /&gt;
    if n &amp;gt;= 1:&lt;br /&gt;
        spf[1] = 1&lt;br /&gt;
&lt;br /&gt;
    limit = int(n ** 0.5)&lt;br /&gt;
    for i in range(2, limit + 1):&lt;br /&gt;
        # spf[i] == i 이면 i는 소수이다.&lt;br /&gt;
        if spf[i] == i:&lt;br /&gt;
            # i*i부터 시작하는 이유:&lt;br /&gt;
            # i의 더 작은 배수들은 이미 더 작은 소수 단계에서 처리되었기 때문이다.&lt;br /&gt;
            start = i * i&lt;br /&gt;
            for j in range(start, n + 1, i):&lt;br /&gt;
                # 아직 최소 소인수가 갱신되지 않은 경우에만 i로 설정한다.&lt;br /&gt;
                if spf[j] == j:&lt;br /&gt;
                    spf[j] = i&lt;br /&gt;
&lt;br /&gt;
    return spf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def factorize(x: int, spf: list[int]) -&amp;gt; list[int]:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    spf를 사용하여 x를 소인수분해한다.&lt;br /&gt;
    각 단계에서 x를 spf[x]로 나누므로 시간은 대략 O(log x) 수준이다.&lt;br /&gt;
&lt;br /&gt;
    Args:&lt;br /&gt;
        x (int): 소인수분해할 정수 (x &amp;gt;= 1)&lt;br /&gt;
        spf (list[int]): sieve_with_spf로 만든 최소 소인수 배열&lt;br /&gt;
&lt;br /&gt;
    Returns:&lt;br /&gt;
        list[int]: 소인수 목록(중복 포함)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    factors: list[int] = []&lt;br /&gt;
    while x &amp;gt; 1:&lt;br /&gt;
        p = spf[x]&lt;br /&gt;
        factors.append(p)&lt;br /&gt;
        x //= p&lt;br /&gt;
    return factors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main() -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    예시 실행:&lt;br /&gt;
    - 100까지 spf를 만든 뒤 60을 소인수분해한다.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    spf = sieve_with_spf(100)&lt;br /&gt;
    print(factorize(60, spf))  # [2, 2, 3, 5]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 오일러 파이 함수 ===&lt;br /&gt;
[[오일러 파이 함수]] &amp;lt;math&amp;gt;\varphi(n)&amp;lt;/math&amp;gt; (n 이하의 n과 서로소인 수의 개수)도 체를 이용해 빠르게 계산할 수 있다.&lt;br /&gt;
&lt;br /&gt;
=== 뫼비우스 함수 ===&lt;br /&gt;
[[뫼비우스 함수]] &amp;lt;math&amp;gt;\mu(n)&amp;lt;/math&amp;gt;도 마찬가지로 체로 전처리가 가능하다.&lt;br /&gt;
&lt;br /&gt;
== 변형 알고리즘 ==&lt;br /&gt;
=== 선형 체 (Linear Sieve) ===&lt;br /&gt;
에라토스테네스의 체의 단점은 &amp;#039;&amp;#039;&amp;#039;같은 수를 여러 번 지운다&amp;#039;&amp;#039;&amp;#039;는 것이다.&lt;br /&gt;
* 예: 12는 2의 배수로 한 번, 3의 배수로 또 한 번 지워진다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;선형 체&amp;#039;&amp;#039;&amp;#039;는 각 수를 &amp;#039;&amp;#039;&amp;#039;정확히 한 번만&amp;#039;&amp;#039;&amp;#039; 지워서 &amp;#039;&amp;#039;&amp;#039;&amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&amp;#039;&amp;#039;&amp;#039;의 시간 복잡도를 달성한다.&amp;lt;ref&amp;gt;이론적으로는 더 빠르지만, 실제 구현에서는 에라토스테네스의 체가 캐시 효율성 때문에 더 빠를 수 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 분할 체 (Segmented Sieve) ===&lt;br /&gt;
매우 큰 범위의 소수를 구할 때는 메모리 문제가 발생한다. 이때 &amp;#039;&amp;#039;&amp;#039;구간을 나눠서&amp;#039;&amp;#039;&amp;#039; 처리하는 방법이 분할 체다.&lt;br /&gt;
&lt;br /&gt;
예: 10억~10억 1000만 사이의 소수를 구하려면?&lt;br /&gt;
1. &amp;lt;math&amp;gt;\sqrt{10^9}\approx 31623&amp;lt;/math&amp;gt;까지의 소수를 먼저 구한다.&lt;br /&gt;
2. 이 소수들로 10억~10억 1000만 구간을 체로 거른다.&lt;br /&gt;
3. 메모리는 1000만개만 필요하다. (10억개가 필요하지 않다)&lt;br /&gt;
&lt;br /&gt;
== 장단점 ==&lt;br /&gt;
=== 장점 ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;매우 빠르다&amp;#039;&amp;#039;&amp;#039;: &amp;lt;math&amp;gt;O(N\log\log N)&amp;lt;/math&amp;gt;은 거의 선형 시간&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;구현이 간단하다&amp;#039;&amp;#039;&amp;#039;: 초보자도 쉽게 이해 가능&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;직관적이다&amp;#039;&amp;#039;&amp;#039;: &amp;quot;배수를 지운다&amp;quot;는 개념이 명확함&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;다목적&amp;#039;&amp;#039;&amp;#039;: 소수 판별, 소인수분해, 오일러 함수 등 다양하게 응용 가능&lt;br /&gt;
&lt;br /&gt;
=== 단점 ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;메모리를 많이 쓴다&amp;#039;&amp;#039;&amp;#039;: &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt; 공간 필요&lt;br /&gt;
  * &amp;lt;math&amp;gt;N=10^9&amp;lt;/math&amp;gt; 같은 큰 값에서는 메모리 부담이 커질 수 있다.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;한 번에 한 범위만&amp;#039;&amp;#039;&amp;#039;: 예를 들어 10억~20억번째 소수를 직접 구하려면 더 작은 범위를 포함해 넓게 처리해야 할 수 있다.&lt;br /&gt;
  * 분할 체로 완화 가능&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;매우 큰 소수&amp;#039;&amp;#039;&amp;#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;이 너무 크면 메모리 부족&lt;br /&gt;
  * [[밀러-라빈 소수판별법]] 같은 확률적 방법 사용&lt;br /&gt;
&lt;br /&gt;
== 실생활 활용 ==&lt;br /&gt;
=== 암호학 ===&lt;br /&gt;
[[RSA 암호]]에서 큰 소수를 찾을 때 사용된다. 물론 수백 자리 소수는 에라토스테네스로 직접 찾기 어렵고 확률적 방법을 쓰지만, 작은 소수를 미리 걸러낼 때 활용된다.&lt;br /&gt;
&lt;br /&gt;
=== 프로그래밍 대회 ===&lt;br /&gt;
[[알고리즘 문제 해결 전략]]에서 빈출되는 기법이다. [[백준 온라인 저지]], [[코드포스]], [[프로젝트 오일러]] 등에서 자주 출제된다.&lt;br /&gt;
&lt;br /&gt;
특히 [[프로젝트 오일러]]의 많은 문제들이 에라토스테네스의 체를 요구한다.&lt;br /&gt;
&lt;br /&gt;
=== 수학 연구 ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;골드바흐 추측&amp;#039;&amp;#039;&amp;#039; 검증&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;쌍둥이 소수&amp;#039;&amp;#039;&amp;#039; 탐색&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;소수 분포&amp;#039;&amp;#039;&amp;#039; 연구&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;리만 가설&amp;#039;&amp;#039;&amp;#039; 실험&lt;br /&gt;
&lt;br /&gt;
== 흥미로운 사실 ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2000년 이상 현역&amp;#039;&amp;#039;&amp;#039;: 기원전 240년에 만들어진 알고리즘이 현대에도 쓰인다.&amp;lt;ref&amp;gt;알고리즘 자체는 고전이지만, 구현과 최적화는 현대 하드웨어에 맞추어 계속 발전해 왔다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;최초의 체계적 알고리즘?&amp;#039;&amp;#039;&amp;#039;: 수학사에서 가장 오래된 알고리즘 중 하나로 언급된다.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;이름의 유래&amp;#039;&amp;#039;&amp;#039;: 실제로 고대 그리스에서는 구멍 뚫린 파피루스에 숫자를 써서 합성수에 해당하는 구멍을 막는 방식으로 사용했다는 이야기가 전해진다.&amp;lt;ref&amp;gt;정확한 사료가 충분히 남아 있지 않아 전승 수준의 설명으로 다루어지는 경우가 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;math&amp;gt;10^{23}&amp;lt;/math&amp;gt;까지 계산됨&amp;#039;&amp;#039;&amp;#039;: 현대 컴퓨팅으로 매우 큰 범위의 소수 관련 계산이 수행된 바가 있으나, 사용된 알고리즘은 문제에 따라 다양하다.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;메르센 소수는 예외&amp;#039;&amp;#039;&amp;#039;: &amp;lt;math&amp;gt;2^{82{,}589{,}933}-1&amp;lt;/math&amp;gt; 같은 메르센 소수는 범위 체로 직접 탐색하기 어렵다. 이런 경우에는 [[뤼카-레머 판별법]] 같은 특수한 판별법을 쓴다.&lt;br /&gt;
&lt;br /&gt;
== 교육적 가치 ==&lt;br /&gt;
에라토스테네스의 체는 &amp;#039;&amp;#039;&amp;#039;알고리즘 교육&amp;#039;&amp;#039;&amp;#039;에 매우 좋은 예시다:&lt;br /&gt;
&lt;br /&gt;
1. &amp;#039;&amp;#039;&amp;#039;최적화 사고&amp;#039;&amp;#039;&amp;#039;: 단순한 방법 → 개선된 방법으로의 진화&lt;br /&gt;
2. &amp;#039;&amp;#039;&amp;#039;시간-공간 트레이드오프&amp;#039;&amp;#039;&amp;#039;: 메모리를 써서 시간을 아낀다&lt;br /&gt;
3. &amp;#039;&amp;#039;&amp;#039;수학과 프로그래밍의 융합&amp;#039;&amp;#039;&amp;#039;: 수학적 성질을 코드로 구현&lt;br /&gt;
4. &amp;#039;&amp;#039;&amp;#039;점진적 개선&amp;#039;&amp;#039;&amp;#039;: 짝수 건너뛰기, &amp;lt;math&amp;gt;i^2&amp;lt;/math&amp;gt;부터 시작 등 단계적 최적화&lt;br /&gt;
&lt;br /&gt;
많은 [[알고리즘]] 교과서에서 초반에 에라토스테네스의 체를 다루는 이유로 자주 언급된다.&lt;br /&gt;
&lt;br /&gt;
== 비교: 다른 소수 판별 방법들 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 방법 !! 시간 복잡도 !! 공간 복잡도 !! 특징&lt;br /&gt;
|-&lt;br /&gt;
| 시행 나눗셈 || &amp;lt;math&amp;gt;O(\sqrt{N})&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || 단일 수 판별에 적합&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;에라토스테네스의 체&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;&amp;lt;math&amp;gt;O(N\log\log N)&amp;lt;/math&amp;gt;&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;&amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;범위 내 모든 소수&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 선형 체 || &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt; || 이론상 최적, 구현 복잡&lt;br /&gt;
|-&lt;br /&gt;
| [[밀러-라빈]] || &amp;lt;math&amp;gt;O(k\log^3 N)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || 확률적, 매우 큰 수&lt;br /&gt;
|-&lt;br /&gt;
| [[AKS 소수판별법]] || &amp;lt;math&amp;gt;O(\log^6 N)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(\log N)&amp;lt;/math&amp;gt; || 결정적, 이론적 의의&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 관련 문제 ==&lt;br /&gt;
=== 백준 온라인 저지 ===&lt;br /&gt;
* [https://www.acmicpc.net/problem/1929 1929번: 소수 구하기] - 기본 문제&lt;br /&gt;
* [https://www.acmicpc.net/problem/1016 1016번: 제곱 ㄴㄴ 수] - 응용 문제&lt;br /&gt;
* [https://www.acmicpc.net/problem/6588 6588번: 골드바흐의 추측] - 에라토스테네스 + 골드바흐&lt;br /&gt;
&lt;br /&gt;
=== 프로젝트 오일러 ===&lt;br /&gt;
* Problem 10: 200만 이하 모든 소수의 합&lt;br /&gt;
* Problem 50: 가장 긴 소수 연속합&lt;br /&gt;
&lt;br /&gt;
== 여담 ==&lt;br /&gt;
* 에라토스테네스는 이 알고리즘 외에도 &amp;#039;&amp;#039;&amp;#039;지구 둘레 측정&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;윤년 계산&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;지리학 좌표계&amp;#039;&amp;#039;&amp;#039; 등을 개발한 것으로 알려져 있다.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;체&amp;#039;&amp;#039;&amp;#039;를 뜻하는 영어 &amp;quot;Sieve&amp;quot;는 밀가루를 거르는 체를 말한다. 실제로 밀가루 체와 작동 원리가 비슷하다.&lt;br /&gt;
* 이 알고리즘은 &amp;#039;&amp;#039;&amp;#039;병렬화&amp;#039;&amp;#039;&amp;#039;가 비교적 쉽다. 각 구간을 독립적으로 처리할 수 있어서 멀티코어 환경에서 효율적으로 구현될 수 있다.&lt;br /&gt;
* [[디리클레 정리]]를 이용하면 특정 등차수열 내의 소수만 골라내는 이론적 논의로도 확장할 수 있다.&lt;br /&gt;
&lt;br /&gt;
== 관련 문서 ==&lt;br /&gt;
* [[소수(수론)]]&lt;br /&gt;
* [[에라토스테네스]]&lt;br /&gt;
* [[밀러-라빈 소수판별법]]&lt;br /&gt;
* [[알고리즘]]&lt;br /&gt;
* [[정수론]]&lt;br /&gt;
* [[골드바흐의 추측]]&lt;br /&gt;
* [[쌍둥이 소수]]&lt;br /&gt;
* [[메르센 소수]]&lt;br /&gt;
* [[오일러 파이 함수]]&lt;br /&gt;
* [[뫼비우스 함수]]&lt;br /&gt;
&lt;br /&gt;
== 외부 링크 ==&lt;br /&gt;
* [https://www.acmicpc.net/problem/1929 백준: 소수 구하기]&lt;br /&gt;
* [https://oeis.org/A000040 OEIS: Prime numbers]&lt;br /&gt;
&lt;br /&gt;
== 각주 ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[분류:알고리즘]]&lt;br /&gt;
[[분류:수학]]&lt;br /&gt;
[[분류:정수론]]&lt;br /&gt;
[[분류:소수]]&lt;br /&gt;
[[분류:고대 그리스 수학]]&lt;br /&gt;
[[분류:프로그래밍]]&lt;/div&gt;</summary>
		<author><name>Gaon12</name></author>
	</entry>
</feed>