개념
이상의 자연수를 소수들의 곱으로 나타내는 과정입니다. 예를 들어 입니다. 어떤 소수가 몇 번 곱해져 있는지 알면 약수의 개수를 세거나 여러 수의 공통 인수를 찾을 수 있습니다.
작은 인수부터 나누기
부터 차례대로 나누어떨어지는지 확인합니다. 나누어떨어지면 그 인수를 기록하고 몫에 대해 같은 인수로 다시 나눕니다. 같은 소수가 여러 번 곱해져 있을 수 있기 때문입니다.
| 나누기 전 값 | 검사하는 인수 | 처리 | 남은 값 |
|---|---|---|---|
| 나누어떨어지므로 를 기록 | |||
| 한 번 더 나누어 를 기록 | |||
| 나누어떨어지지 않아 다음 인수로 이동 | |||
| 나누어떨어지므로 을 기록 |
앞에서 작은 소인수를 모두 나누었으므로, 뒤에서 새로 발견하는 인수는 소수입니다. 예를 들어 로 나누어떨어지는 수라면 먼저 검사한 로도 나누어떨어졌을 것이므로, 를 모두 제거한 뒤에는 가 인수로 나올 수 없습니다.
제곱근까지만 확인하는 이유
현재 남은 값을 이라고 하겠습니다. 이고 소수가 아니라면 처럼 보다 큰 두 자연수의 곱으로 나눌 수 있습니다. 이때 두 수가 모두 보다 크면 곱이 보다 커집니다. 따라서 두 인수 중 적어도 하나는 이하입니다.
예를 들어 을 보다 큰 두 자연수로 나눈 인수 쌍은 , , , 입니다. 각 쌍의 작은 쪽이 모두 이하이므로 까지 확인하면 인수를 찾을 수 있습니다. 같은 이유로 검사할 수를 라고 하면 인 동안 확인하면 됩니다. 등호는 처럼 같은 인수 두 개의 곱도 확인하기 위해 필요합니다.
나누기를 할 때마다 이 줄어드므로 검사 범위도 함께 줄어듭니다. 을 , , 으로 나누면 가 되고, 이므로 더 검사할 필요가 없습니다.
마지막에 남은 값
검사가 끝났을 때 이면 그 값은 소수이므로 마지막 소인수로 기록합니다. 만약 합성수였다면 제곱근 이하의 소인수가 있어야 하는데, 그 범위의 인수는 앞에서 이미 모두 제거했기 때문입니다. 위 과정에서는 마지막으로 를 기록해 를 얻습니다. 남은 값이 이면 모든 소인수를 이미 기록한 상태입니다.
입력이 처음부터 소수인 경우에는 나누기가 한 번도 일어나지 않습니다. 이때는 원래 수의 제곱근까지 검사한 뒤 그 수 자체를 소인수로 기록합니다.
복잡도
분해할 자연수를 이라고 합니다. 찾은 인수를 바로 출력하면 추가 공간은 이고, 결과를 모아 저장하면 입니다.
| 연산 | 시간복잡도 | 공간복잡도 |
|---|---|---|
| 소인수분해 | 즉시 출력 시 추가 |
예제
문제
양의 정수를 소인수분해하여 소인수를 작은 순서대로 출력하여라.
입력
첫째 줄에 양의 정수 이 주어진다. 이다.
출력
소인수를 공백으로 구분하여 출력한다. 같은 소인수가 여러 번 사용되면 모두 출력한다.