Learn
[알고리즘] 소수를 효율적으로 구하자 : 에라토스테네스의 체
부루기
2024. 7. 1. 17:27
728x90
서론
- 소개: 에라토스테네스의 체는 고대 그리스 수학자 에라토스테네스가 제안한 소수를 찾는 효율적인 알고리즘입니다. 이 포스팅에서는 에라토스테네스의 체 알고리즘의 원리와 구현 방법을 설명합니다.
- 중요성: 소수는 암호학, 수론 등 여러 분야에서 중요한 역할을 합니다. 에라토스테네스의 체는 큰 범위에서 소수를 빠르게 찾을 수 있는 강력한 도구입니다. 뒤에서 백준 문제중 시간초과로 풀리지 않는 문제를 해결할 수 있습니다.
본론
- 간략 설명
- 정말 말 그대로 체를 생각하시면 됩니다. 전체의 숫제를 소수로 보고 어떤 숫자(2, 3, ... 앞에서 부터 시작하는 소수들)의 배수를 제외한다면 소수만 남게 되는 것이 이 개념의 포인트입니다.
2의 배수를 거르고... 3의 배수를 거르고...
- 정말 말 그대로 체를 생각하시면 됩니다. 전체의 숫제를 소수로 보고 어떤 숫자(2, 3, ... 앞에서 부터 시작하는 소수들)의 배수를 제외한다면 소수만 남게 되는 것이 이 개념의 포인트입니다.
- 에라토스테네스의 체란?
- 정의: 에라토스테네스의 체는 주어진 범위 내에서 소수를 찾기 위한 효율적인 알고리즘입니다.
- 원리: 2부터 시작하여 각 숫자의 배수를 제거하는 방식으로 소수를 찾습니다.
- 알고리즘의 작동 원리
- 단계별 설명:
- 2부터 까지의 모든 정수를 나열합니다.
- 각 소수의 배수들을 소수가 아니라고 표시합니다.
- 더 이상 제거할 수 없는 숫자가 남지 않을 때까지 이 과정을 반복합니다.
- 예제:
- 예를 들어, 30까지의 소수를 찾는 과정을 시각화합니다.
- 단계별 설명:
- 에라토스테네스의 체 구현 (파이썬)
- 코드:
import math def sieve_of_eratosthenes(n): is_prime = [True] * (n + 1) is_prime[0] = is_prime[1] = False # 0과 1은 소수가 아님 for i in range(2, int(math.sqrt(n)) + 1): if is_prime[i]: for j in range(i * i, n + 1, i): is_prime[j] = False return [i for i in range(2, n + 1) if is_prime[i]]
- 설명:
- is_prime 배열을 생성하고 초기화합니다.
- 2부터 √n까지 반복하여 각 소수의 배수를 False로 설정합니다.
- 소수 목록을 반환합니다.
- 코드:
- 응용 예제
- 백준 문제 1929: 소수 구하기:
- 주어진 두 수 M과 N 사이의 모든 소수를 찾는 문제를 에라토스테네스의 체로 해결합니다.
- 백준 문제 6588: 골드바흐의 추측:
- 주어진 짝수를 두 소수의 합으로 표현하는 문제를 에라토스테네스의 체로 해결합니다.
- 백준 문제 1929: 소수 구하기:
결론
- 요약: 에라토스테네스의 체는 간단하면서도 매우 효율적인 소수 찾기 알고리즘입니다. 이를 통해 소수를 빠르게 찾고, 다양한 문제를 해결할 수 있습니다.
- 응용 가능성: 소수는 다양한 분야에서 중요한 역할을 합니다. 에라토스테네스의 체를 이해하고 구현하면, 수학적 문제뿐만 아니라 암호학 등의 실용적인 문제도 해결할 수 있습니다.
- 추가 자료: 더 깊이 있는 학습을 위해 관련 자료나 참고 문헌을 소개합니다.
참고 자료
728x90