이 블로그의 모든 예제코드는 깃허브에서도 볼 수 있습니다. https://github.com/AeroCodeX/
소수(Prime-Number)의 정의 |
1과 자기 자신만을 약수로 갖는 수.
소수가 아닌 수를 합성수(composite)라고 한다.
그림에서 보듯이 소수는 1과 자신을 제외한 m x n 형태로 표현할 수 없다.
아래는 인덱스가 1,000,000 이하의 소수 테이블이다.
출처 : OEIS_A000040
소수 판별 알고리즘 개요 |
정확히는 소수 판별(Prime Testing)이 아닌 소수 생성(Prime Generation)알고리즘이다.
N이 소수인지 알고 싶다면 N까지 소수 테이블을 만들고나서 확인해야 한다.
수학적 의미의 판별(Testing)은 완벽한 결과를 보장할 수 없거나 확률론을 기반으로 하기 때문이다.
아래는 현대에서 주로 쓰이는 소수 생성 알고리즘이다.
|
전역탐색을 통해 소수 테이블을 생성한다. |
|
향상된 전역탐색을 통해 소수 테이블을 생성한다. |
|
에라토스테네스의 체를 통해 소수 테이블을 생성한다. |
|
향상된 에라토스테네스의 체를 통해 소수 테이블을 생성한다. |
|
엣킨의 체를 통해 소수 테이블을 생성한다. |
| 주어진 소수 테이블에서 n의 배수를 지운다. |
| 소수 테이블의 상한선. |
RunningTime Statistics (3회 평균값, ms)
up to |
1,000,000 |
10,000,000 |
100,000,000 | 1,000,000,000 | Time-complexity |
|
110,307 |
X |
X | X | n squre |
|
12,426 |
874,370 |
X | X | |
|
27 |
505 |
4,916 | 48,127 | |
|
20 |
270 |
2,765 | 28,909 | |
|
22 |
254 |
2,499 | 28,384 |
1. 전역탐색 |
<핵심>
1. V보다 작은 모든 수로 나누어 떨어지지 않으면 V는 소수이다.
2. 향상된 전역 탐색 |
<핵심>
Composite로 나눠보는 건 의미가 없다는 것을 알아야 한다.
1. V보다 작은 모든 소수로 나누어 떨어지지 않으면 V는 소수이다. (캐싱된 소수를 활용한다.)
2. 중간에 찾은 소수는 버리지 않고 별도의 공간에 캐싱한다. (소수를 다시 찾는데 시간이 걸리기 때문이다.)
3. 에라토스테네스의 체(SoA - Sieve of Eratosthenes) |
<핵심>
1. V가 소수이면 V의 배수는 Composite이다.
4. 향상된 에라토스테네스의 체(Improved-SoE) |
<핵심>
1. V가 소수이면 V의 배수는 Composite이다.
2. sqrt(n) 까지만 조사하면 된다.
3. 소수려면 6i±1 형태여야 한다.
6i → 2와 3의 배수
6i+1 → 소수일 가능성 있음.
6i+2 → 2의 배수
6i+3 → 3의 배수
6i+4 → 2의 배수
6i+5 → 소수일 가능성 있음.
5. 엣킨의 체(SoA - Sieve of Atkin) |
'# Foundation > 기초수학' 카테고리의 다른 글
파도반 수열 알고리즘 (0) | 2018.11.04 |
---|---|
피보나치 수열 알고리즘 (0) | 2018.11.03 |
최대 공약수와 최소 공배수의 관계 (0) | 2018.10.24 |
최소 공배수 알고리즘 (0) | 2018.10.23 |
최대 공약수 알고리즘 (0) | 2018.10.22 |