728x90
728x90
소인수 분해(Prime/Integer Factorization)
개념
- 특정 자연수를 1보다 큰 자연수인 소인수(소수인 인수)들만의 곱으로 표현하는 것
- 합성수를 소수의 곱으로 나타내는 방법
- 소인수 분해를 일의적으로 결정하는 공식은 아직 발견되지 않았다.
- 현대 암호학에서 소인수 분해는 암호 처리를 하는데 중요하게 사용된다.
- 모든 합성수는 소인수 분해된 형태를 가지고 있다.
- 산술의 기본 정리(Fundamental Theorem of Arithmetic)로 증명된다.
알고리즘
기본 알고리즘
- 소인수는 1이라는 값이 아닌 2부터 시작하는 것이 핵심이며, 2로 나누지 못할 경우 2에서 하나씩 증가시켜주면서 나누어지는지 체크하면 된다.
void factorize(int n) {
int factor = 2; // 시작 값
while (factor <= n) {
if (n % factor == 0) {
cout << factor << '\n';
n /= factor;
}
else {
factor++;
}
}
}
사용 예
#include <iostream>
using namespace std;
void factorize(int n) {
int factor = 2; // 시작 값
while (factor <= n) {
if (n % factor == 0) {
cout << factor << '\n';
n /= factor;
}
else {
factor++;
}
}
}
int main() {
factorize(72);
}
2
2
2
3
3
고전적 알고리즘
고전적인 소인수 분해 알고리즘은 대부분 페르마 소정리(Fermat's Little Theorem)를 확장한 것을 이용한다.
그 중, 자주 사용되는 알고리즘은 아래와 같다.
- 윌리엄의 p+1 알고리즘
- 폴라드의 p-1 알고리즘
- 폴라드 로 알고리즘
- 페르마의 알고리즘
참고 사이트
728x90
728x90
'Computer Science > 알고리즘' 카테고리의 다른 글
[Algorithm] 스캐닝 메소드(Scanning Method) (0) | 2022.10.26 |
---|---|
[Algorithm] 부분합(Partial Sum) ; 누적합(Prefix Sum) (0) | 2022.10.26 |
[Algorithm] 형상수(Figulate Number) (0) | 2022.10.26 |
[Algorithm] 에라토스테네스의 체(Sieve of Erathosthenes) (0) | 2022.10.25 |
[Algorithm] 피보나치 수열(Fibonacci Sequence) (1) | 2022.10.06 |
[Algorithm] 삽입 정렬(Insertion Sort) (1) | 2022.10.06 |
[Algorithm] 버블 정렬(Bubble Sort) (0) | 2022.10.06 |
[Algorithm] 선택 정렬(Selection Sort) (0) | 2022.10.06 |