페르마 소인수분해법(Fermat's factorization method)은 홀수 자연수를 제곱의 차를 이용하여 소인수분해하는 알고리즘이다. 피에르 드 페르마가 고안한 방법이다.
이 알고리즘은 제곱합동식을 이끌어내는 가장 기초적인 방법으로, 이를 응용 및 개량하여 연분수 소인수분해법, 이차 체, 수체 체 등 빠른 소인수분해법이 20세기 말에 개발되었다.
아이디어
모든 홀수 자연수는 두 자연수의 제곱의 차로 나타낼 수 있다.
홀수를 자연수의 곱으로 나타내면 두 수는 반드시 홀수여야만 한다. 그러므로 는 필연적으로 자연수가 된다. 만약 주어진 자연수가 합성수이면, 인 순서쌍 가 존재한다.
따라서 함수 을 지정해서 , 즉 함숫값이 제곱수가 되는 조건을 찾는다면 꼴로 만들 수 있게 된다.
기본 접근
먼저 기준값을 찾는다. 만약 이 자연수로 딱 떨어진다면 소인수분해는 그 자리서 끝난다. 하지만 상당한 경우 주어진 수는 제곱수가 아니며 이 경우 아래 방법을 따른다.
의 값들을 차례대로 계산해서 제곱수를 발견할 때까지 반복한다.
이를테면 을 소인수분해하려고 한다면, 이므로 에 대해서 을 계산한다.
위 함숫값들 중 제곱수가 되는 식은 이다. 따라서 임을 알 수 있다.
만약 나누어진 두 수 중 하나라도 여전히 합성수이면 소인수분해를 계속하지만, 둘 다 소수임이 판명나면 소인수분해는 끝난다. 위의 예시에서는 337, 479 모두 소수이다. 만약 직접 나누기를 시도했다면 337 이하의 소수들에 대해 노가다를 행했겠지만, 페르마 소인수분해법으로는 좀 더 수월한 방법으로 풀린다.
직접 나누기 방법은 어떤 합성수의 1보다 큰 가장 작은 약수를 우선순위로 찾는다. 반면 페르마 소인수분해법은 주어진 수의 제곱근()에 가장 가까운 약수를 중심으로 찾으므로 시작점이 전혀 다르다.
참고로 이 알고리즘은 어떤 수가 크기가 비슷한 약수끼리 곱해져 있을 때 아주 쉽게 해를 찾을 수 있다. 가령 의 경우, 두 소인수의 차가 작아서 제곱의 차 모양을 한 방에 찾을 수 있다.
물론 과 같이 소인수의 크기가 극과 극으로 벌어져 있으면 직접 나누기보다도 속도가 느려진다. 그러므로 어떤 수를 소인수분해하려 할 때, 먼저 일정 기준 이하의 작은 소수들로 나누어지는지를 확인하고, 그 다음 이 방법을 적용하는 것이 좋다.
다른 접근
사실 여기서 을 지정해서 함숫값이 제곱수가 되는 경우를 찾아갈 수도 있다. 그렇게 해서 인 를 찾는다면 을 마찬가지로 유도할 수 있다.
하지만 만약 어떤 합성수의 약수가 해당 수의 제곱근에 가까울 경우 위의 기본 접근 방식이 더 빠르다. 이유는 의 목표는 제곱수를 찾는 것인데, 일반적으로 임의의 자연수는 크기가가 작을 때 제곱수가 출몰할 확률이 크기 때문이다.
만약 위에서 든 예시를 이 변형된 함수로 제곱수 조건을 추적한다면, 에 이르러서 해가 나온다. 이처럼 페르마 소인수분해법에서는 대개 큰 쪽인 를 독립 변수로 잡는다.
경우의 수 추리기
그런데 위와 같이 제곱수 찾기를 시행할 때, 모든 에 대해 일일이 의 값을 조사할 필요는 없다. 이차잉여를 이용하면 제곱수가 불가능한 경우들을 미리 쳐낼 수 있다.
가령 4로 나눈 나머지를 생각할 때, 주어진 홀수 합성수의 경우 나머지가 1 또는 3 두 경우를 생각할 수 있다. 그리고 어떤 자연수의 제곱을 4로 나눈 나머지는 0 또는 1이다. 이를 토대로 아래와 같이 조건을 세울 수 있다.
바로 위 문단에서 살핀 예시에서는 161423을 4로 나눈 나머지가 3이므로, (짝수)²-(홀수)² 형태만 알아보면 되므로 실제로 조사할 경우의 수는 절반으로 줄어든다.
이러한 경우의 수 추리기는 소수 또는 소수의 거듭제곱이 기준인 이차잉여를 이용하여 제한 조건을 여러 개 찾을 수 있다. 특히 거듭제곱의 차수가 올라가면 경우의 수를 더 줄일 수 있지만, 제한 조건의 식은 그만큼 복잡해진다.
먼저 이차잉여의 집합인 을 구한다. 그 다음 인 나머지을 집합의 각 원소에 더한 새 집합인 을 구한다. 그러면 이고, 이것이 을 만족할 의 조건이다.
2의 거듭제곱
2의 거듭제곱 중 제곱수(즉 4의 거듭제곱)를 법으로 하는 이차잉여는 아래 규칙을 따른다.
- (2개)
- (4개)
- (12개)
- 0이 아닌 이차잉여는 형태로 써진다.
- 이면 이 성립한다.
- 일 때, 이면 이다.
법 64를 예로 들어보자. 모든 나머지 연산은 환 내에서 이루어진다.
- 의 가능한 값은 이다.
- 의 경우 위 집합의 각 원소에서 각각 15씩을 더하면 된다:
- 그러므로 의 후보는 바로 위 두 집합의 교집합이다.
- 따라서 과 같이 쓸 수 있다. 그리고 이를 다시 정리하면 이 된다. 좀 더 간단히 쓰면 이다.
이 조건을 이끌어 냄으로써 경우의 수를 4분의 1로 추릴 수 있다. 실제로 이면 라는 사실은 변하지 않는다. 추가로 이면 즉 이며, 이는 와 동치이다.
의 경우 경우의 수가 좀 더 많이 추려진다. 앞서 임을 이끌어냈을 때, 각 원소에서 15를 빼면 이 나온다. 법 64에 대한 제곱근을 구하면 (32개 중 4개 꼴)이 나와서, 경우의 수는 8분의 1로 줄어든다.
참고로 이면 위의 의 홀짝이 서로 반대가 되며, 경우의 수도 반대로 각각 8분의 1, 4분의 1로 줄어든다.
3의 거듭제곱
3의 거듭제곱 중 제곱수(즉 9의 거듭제곱)를 법으로 하는 이차잉여는 아래 규칙을 따른다.
- (4개)
- (31개)
- (274개)
- 0이 아닌 이차잉여는 형태로 써진다.
- 이면 이 성립한다.
- 일 때, 이면 이다.
여기서는 을 기준으로 접근한다. 2의 거듭제곱 문단과 같은 방법을 쓴다.
- 의 가능한 값은 이다.
- 의 경우 위 집합의 각 원소에서 각각 71씩을 더하면 된다:
- 마찬가지로 교집합을 셈해서 의 후보를 구한다.
- 따라서 과 같이 쓸 수 있다. 그리고 이를 다시 정리하면 가 된다. 좀 더 간단히 쓰면 이다.
위 예시와 같이 이면 이라는 일정한 결론을 얻을 수 있다. 이는 법의 3의 차수를 올려서 조건을 살펴도 마찬가지다.
반면 의 경우 경우의 수가 꽤 많이 줄어든다. 의 각 원소에서 71을 빼면 을 도출한다. 이를 다시 쓰면 이며, 제곱근을 구하면 이 나온다. 즉 경우의 수는 81개 중 8개 꼴로 추려진다.
참고로 이면 위의 의 3의 배수 여부는 서로 반대가 되며, 경우의 수도 반대로 각각 81분의 8, 3분의 1로 줄어든다.
5와 20, 100
소수가 커지면 조건식도 복잡해지며, 차수를 올림으로써 경우의 수를 줄이는 이점은 적어진다. 그래서 큰 소수의 이차잉여는 1차 내에서 조건식을 간단히 하는 편이 낫다. 물론 5의 경우 십진법의 특수성을 활용하여 법 20 또는 법 100을 편리하게 활용할 수 있다.
- (3개)
- (6개)
- (18개)
이라는 사실에 착안해서 앞선 문단과 같은 방법으로 제한 조건을 찾는다. 그러면 이 되어 이 된다.
이처럼 20으로 나눈 나머지를 활용하면 , 즉 일의 자리를 도출할 수 있다. 그런데 만약 이면, 경우의 수는 더 줄어든다.
이를테면 이면 이므로 이 나온다. 첫째 경우, 이다.[1] 그러므로 임을 알 수 있다. 둘째 경우, 이며 여기서는 이 된다.
이렇게 놓고 보면 가 되어 경우의 수는 50개 중 7개 꼴로 줄어든다. 한편 같은 방법으로 접근하면 이며, 라는 사실을 알 수 있다.
그 밖의 소수
법 7, 11, 13에 대한 이차잉여는 아래와 같다.
- (4개)
- (6개)
- (7개)
홀수 소수를 법으로 하는 이차잉여로 경우의 수를 줄인다면 의 가짓수는 개가 된다.
즉 제한 조건을 하나를 추가할 때마다 경우의 수는 대략 절반씩 줄어든다는 사실을 알 수 있다.
적용 예
앞서 아이디어 문단에서 든 예시에서 수 크기를 올려보자. 을 제곱의 차를 이용하여 소인수분해를 한다. 이 예시는 위에서 소개한 이차잉여를 이용한 경우의 수 추리기가 진가를 발휘한다.
먼저 독립변수의 시작점은 부터 셈한다.
- . 이차잉여의 교집합을 구하면 . 따라서 이고, 법 64에 대한 제곱근을 구하면 임을 알 수 있다. (①)
- . 마찬가지로 이차잉여의 교집합을 구한다. 그러므로 임을 알 수 있으며, 이를 풀면 이다. (②)
- . 위에서 소개한 법 100 관련 문단을 이용하면 임을 알 수 있고, 이는 곧 임을 뜻한다. (③)
여기서 7, 11, 13으로 나눈 나머지 등으로 조건을 더 세울 수 있지만, 여기서는 위 세 조건으로 경우의 수를 걸러본다.
- 앞서 구한 와 조건 ③을 먼저 조합하면 의 후보는 다음과 같다.
- 그 다음 조건 ①을 불러와서 32로 나눈 나머지가 9, 15, 17 또는 23인 값들만을 추린다.
- 그리고 조건 ②를 이용하여 81로 나눈 나머지가 38 또는 43이거나, 27로 나눈 나머지가 7 또는 20인 경우만을 고른다.[2]
이렇게 목록을 추리다 보면 남는 후보 중 가장 작은 수는 이다. 그런데 이 경우 인데 마침 이 값은 840의 제곱이다! 의 후보를 이차잉여로 거르고 나서 함숫값을 대입했더니 한 방에 해를 찾은 케이스다. 물론 자연수의 크기가 커지면 함숫값 대입을 여러 번 하는 경우도 많아진다.
이와 같이 해를 찾고 나면 임을 알 수 있다. 719와 2399는 둘 다 소수이므로, 소인수분해는 여기서 종료한다.
소수 판정
이 소인수분해법을 변형하면 소수판정법으로 구성할 수 있다. 직접 나누기로 소인수분해 및 소수 판정이 모두 가능한 것과 같은 맥락이다.
어떤 홀수 자연수가 임의의 상수 에 대해 인 자연수 의 해가 존재하지 않으면 인 약수 도 존재하지 않는다.
홀수 자연수의 경우 1 다음으로 가장 작은 약수는 3 이상이다. 그러므로 인 자연수 해가 존재하지 않으면 주어진 자연수는 홀수임을 알 수 있다. 이므로 의 허용 범위는 이다.
하지만 이렇게만 접근하면 효율은 떨어진다. 이 커질수록 허용 범위도 자연수 크기에 비례하여 넓어지기 때문. 가령 이 소수인지 알아보려면 범위에 대해 조사를 해야 한다. 그런데 주어진 홀수가 3, 5, 7, 11, 13의 배수가 아니라는 사실은 직접 나누기 내지는 배수판정법 등으로 쉽게 알 수 있을 것이다. 이에 착안해서 "가능한 가장 작은 약수는 그 다음 소수인 17"로 조건을 내린다면, 가 되므로 허용 범위를 과 같이 사전에 좁힐 수 있다. 그리고 직접 나누는 소수의 범위를 넓히면 의 범위는 더 좁아진다.
다시 말해 3 이상의 적절한 상수 를 잡아서, 구간에서는 직접 나누기로, 구간에서는 제곱의 차로 약수의 존재성을 조사하면 된다. 그리고 두 구간에서 모두 약수를 찾을 수 없게 되면, 주어진 자연수는 소수임이 판명난다.
소수 판정 예시
위의 예시()에서 로 잡고 이 상수 이하의 소수로는 나누어떨어지지 않음을 알고 있다고 간주하자. 그러면 47 다음 소수는 53이므로
범위에서 약수가 전무함을 보이면 된다.
이므로, (ⓐ) 내에서 후보들을 소거해 나간다.
다음 단계는 이차잉여를 이용한 제한 조건 찾기이다. 앞서 '적용 예' 문단과 같은 방법으로 경우의 수를 추린다.
- 이므로 이다. 정리하면
- 이면 이라는 정보만을 알 수 있다.
- 위의 두 조건을 연립하면 임을 알 수 있다. (①)
- 이다. 즉 일의 자리는 3 또는 7. (②)
- 이므로 위와 같은 방법으로 을 도출한다. (③)
- 이므로 이다. (④)
이제 위 조건들을 토대로 ⓐ에서 구한 x의 후보를 소거해간다.
- 조건 ①을 만족하는 값들을 남기면
- 조건 ②를 만족하는 값들은
- 다음으로 조건 ③, ④를 이어서 적용하면 남는 후보는 이다.
- 남는 후보들을 에 대입하여 제곱수 여부를 알아본다. 하지만 확인해보면 어떤 함숫값도 제곱수가 아님을 알 수 있다.
이로써 을 만족하는 자연수 는 존재하지 않음을 알 수 있다. 그리고 맨 처음에 둔 전제인 '3 이상 47 이하의 약수는 없다'는 조건까지 포함하면, 250013은 소수임을 알 수 있다.
같이 보기
각주
- ↑ 어떤 자연수의 제곱이 20의 배수이면 그 수는 자동으로 100의 배수이기 때문
- ↑ 9로 나눈 나머지가 2 또는 7인 경우를 1차로 고르고 본래 조건을 2차로 적용해도 된다