728x90
에라토스테네스의 체
- 다수의 자연수에 대하여 소수 여부를 판별
1. 2부터 N까지의 모든 자연수를 나열한다.
2. 남은 수 중에서 아직 처리하지 않은 가장 작은 수 i를 찾는다.
3. 남은 수 중에서 i의 배수를 모두 제거한다.(i는 제거하지 않는다.)
4. 더 이상 반복할 수 없을 때까지 2번과 3번의 과정을 반복한다.
- 이후 남아있는 수들은 모두 소수가 된다.
python 구현 코드
import math
n = 1000
array = [True for _ in range(n + 1)]
# 소수일 경우 True, 소수가 아닐 경우 False로 표현
for i in range(2, int(math.sqrt(n)) + 1):
if array[i] == True:
j = 2
while i * j <= n: # i의 배수 모두 제거
array[i * j] = False
j += 1
# 남은 소수 모두 출력
for i in range(2, n + 1):
if array[i]:
print(i, end=' ')
- 시간복잡도
$${O(Nlg(lgN))}$$
- 다수의 소수를 찾아야 하는 문제에서 효과적으로 사용가능
- 그러나 각 자연수에 대한 소수 여부를 판별해야 하므로 메모리가 많이 필요하다.
❓ 제곱근까지 확인하는 이유
$${n = a * b, n = m * m}$$
$${a * b = m * m}$$
일때, 나올 수 있는 경우의 수는 아래 세 가지만 존재한다.
a. a = m and b = m
b. a < b and b > m
c. a > b and b < m
이렇게 되면 반드시 min(a,b) <= m
이 성립하므로 m(=sqrt(n)) 까지만 수행해도 된다.
Reference
728x90
'📊 Algorithm > Paradigm' 카테고리의 다른 글
[Python/수학] 최대공약수(GCD), 최소공배수(LCM) (0) | 2022.06.23 |
---|---|
[알고리즘 대비 - 이코테] 8. 최단 경로 (0) | 2022.05.25 |
[알고리즘 대비 - 이코테] 7. 다이나믹 프로그래밍 (0) | 2022.03.30 |
[알고리즘 대비 - 이코테] 6. 이진 탐색 (0) | 2022.02.10 |
[알고리즘 대비 - 이코테] 5. 정렬 (0) | 2022.01.29 |