중국인의 나머지 정리를 이해하기 위해 기초적인 문제를 차근차근 풀어보자.
아래 문제만 풀 수 있다면 한결 가까워질 것이다.
문제
[아이]
할아버지, 나이가 어떻게 되십니까?
[할아버지]
내 나이는 3으로 나누었을 때 1이 남고,
5로 나누었을 때 3이 남고,
7로 나누었을 때 2가 남는단다.
[아이]
;;
풀이과정
할아버지의 말씀 3가지를 수식으로 바꿔보면 다음과 같다.
- $ x \equiv 1\ (mod\ 3) $
- $ x \equiv 3\ (mod\ 5) $
- $x \equiv 2\ (mod\ 7)$
위 세 개를 만족하는 $x$를 구해보자.
우선 첫 번째 수식 $x \equiv 1\ (mod\ 3)$만 놓고 보면 간단하다.
$$x = 3n + 1$$
두 번째 수식 $x \equiv 3\ (mod\ 5)$을 풀기 위해 위 $x$를 대입하고 변환해보자.
$$3n + 1 \equiv 3\ (mod\ 5)$$$$\Rightarrow 3n \equiv 2\ (mod\ 5)$$
덧셈, 뺄셈, 곱셈은 modular연산에서 닫혀있기 때문에 양 변에 -1을 취해도 식은 성립한다. 하지만 $3n$을 풀기 위해 양 변에 나눗셈을 할 수는 없다. 따라서 $n$을 구하기 위해서는 양 변에 $Z_5 = \{0, 1, 2, 3, 4\}$ 에서 3에 대한 곱셈의 역원을 구해야 한다.
그럼 잠시 곱셈의 역원을 구하는 방법에 대해 먼저 알아보자.
곱셈의 역원 구하는 방법
1. 전부 해보는 방법 $O(N)$
int modInverse(int a, int m) {
for(int i = 1; i < m; i++) {
if ((a*i) % m == 1) {
return i;
}
}
}
2. 페르마 소정리 $O(log_2 N)$
- $m$이 소수, $a$가 $m$의 배수가 아니라면 $a^{m-1}\equiv 1\ (mod\ m)$
- $a \times a^{m-2} \equiv 1\ (mod\ m)$
- 이전글 참조
- 제곱의 성질을 이용하면 더 빠르게 가능
int modInverse(int a, int m) {
int result = 1;
for(int i = 0; i < m-2; i++) {
result = (result * a) % m
}
return result;
}
3. 확장 유클리드 $O(log_2 N)$
- $3n \equiv 1\ (mod\ 5)$
- $3n = 5m + 1$
- $3n - 5m = 1$ 를 만족하는 n과 m을 구하는 방법
// return: <gcd(a, b), n, m>
tuple<int, int, int> xGCD(int a, int b) {
if (b == 0) {
return make_tuple(a, 1, 0);
}
int g, x, y;
tie(g, x, y) = xGCD(b, a%b);
return make_tuple(g, y, x-(a/b)*y);
}
위와 같이 여러 가지 방법으로 modular 내에서 곱셈의 역원을 구할 수 있다. 그럼 다시 돌아와서 $3n \equiv 2\ (mod\ 5)$ 를 만족하는 $n$을 구해보자.
$Z_5 = \{0, 1, 2, 3, 4\}$ 에서 3에 대한 곱셈의 역원을 구하면 2가 나온다. 양 변에 2를 곱하면 좌변을 $n$으로 만들 수 있다.
$$n \equiv 4\ (mod\ 5)$$ $$n = 5m + 4$$ $$\Rightarrow x = 15m + 13$$
이제 마지막 세 번째 수식 $x \equiv 2\ (mod\ 7)$ 에 $x$를 대입해보자.
$$15m + 13 \equiv 2\ (mod\ 7)$$ $$15m \equiv 3\ (mod\ 7)$$
$Z_7 = \{0, 1, 2, 3, 4, 5, 6\}$ 에서 15에 대한 곱셈의 역원은 1!!
$$m \equiv 3\ (mod\ 7)$$ $$m = 7k + 3$$ $$\Rightarrow x = 105k + 58$$
이렇게 알맞은 $x$를 구했고, 처음 식에 대입해보면 올바르다는 것을 알 수 있다.
세 번쯤 반복해보니 이 노가다를 수식으로 정리하면 그것이 중국인의 나머지 정리가 된다.
중국인의 나머지 정리
$x \equiv a_i (mod\ m_i)$ 가 주어질 때 $x$를 정리하면 다음과 같다.
$$x \equiv \sum^{n}_{i=1} M_i(M_i^{-1} mod\ m_i)a_{i} (mod\ M)$$
$$M = m_1m_2m_3...m_n 이고, M_i = M/m_i$$
'알고리즘' 카테고리의 다른 글
nim game과 grundy number (1) | 2019.10.18 |
---|---|
포함과 배제, 그리고 뫼비우스 함수 (0) | 2019.10.18 |
투셋(2-sat) (0) | 2019.10.18 |
Manacher's Algorithm (0) | 2019.10.17 |
고속 푸리에 변환(FFT, Fast Fourier Transform) (1) | 2019.10.17 |
댓글