Algorithm - 에라토스테네스의 체
에라토스테네스의 체는 2부터 원하는 숫자까지의 소수를 판별하는 방법이다. 소수를 판별하는 방법은 다음과 같다.
- 이전 소수에 의해 지워지지 않았다면, 이 숫자는 소수이다.
- 체로 인해 소수로 걸러졌다면, 구간에서 이 소수의 배수를 모두 지워준다. 구간의 끝까지 이를 반복한다.
이해를 돕기 위해 예시를 들어 설명한다면, 예를 들어 31까지 소수를 구별한다고 하자.
| 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 | 30 | 31 |
2부터 시작한다.
2는 이전 소수에 의해 지워지지 않았으므로 소수이며, 이 구간에서 2의 배수를 모두 지워준다.
| 2 | 3 | 5 | ||
|---|---|---|---|---|
| 7 | 9 | 11 | ||
| 13 | 15 | |||
| 17 | 19 | 21 | ||
| 23 | 25 | |||
| 27 | 29 | 31 |
다음으로 3은 이전 소수에 의해 지워지지 않았으므로 소수이며, 이 구간에서 3의 배수를 모두 지워준다.
| 2 | 3 | 5 | ||
|---|---|---|---|---|
| 7 | 11 | |||
| 13 | ||||
| 17 | 19 | |||
| 23 | 25 | |||
| 29 | 31 |
다음은 5이다.
5는 이전 소수에 의해 지워지지 않았으므로 소수이며, 이 구간에서 5의 배수를 모두 지워준다.
이런식으로 31까지 반복하면 이 구간에서 소수를 모두 거를 수 있다.
| 2 | 3 | 5 | ||
|---|---|---|---|---|
| 7 | 11 | |||
| 13 | ||||
| 17 | 19 | |||
| 23 | ||||
| 29 | 31 |
추가로 5 이후 부터는 31의 제곱근보다 크기 때문에 이미 소수가 아닌 수들은 지워져있으므로 본 예시에서는 5까지만 과정을 반복하면 된다.
이를 적용한 파이썬의 소스코드이다.
from math import sqrt
def sieve_of_eratosthenes(x):
arr = [True] * x
for i in range(2, int(sqrt(x))+1):
if arr[i]:
for j in range(i+i, x, i):
arr[j] = False
댓글남기기