티스토리 뷰
1) 중국인의 나머지 정리
중국인의 나머지 정리는 PS를 하면서 간혹 등장한다. 답이 큰 경우 일반적으로 M으로 나눈 나머지를 출력하라고 한다. 하지만 이 M이 고정되어 있지 않고, 입력으로 k가지가 주어진다고 할 경우 k 개 경우에 대해서 매번 다 계산하면 오래걸린다. 이럴 때 필요한 것이 바로 중국인의 나머지 정리다.
정리)
서로소인 k개의 자연수 n1,n2,…,nk와 임의의 정수 a1,a2,…,ak가 있을 때, 임의의 i(1≤i≤k)에 대해 x≡ai(modni) 로 표현되는 변수 x의 연립 합동 방정식에 대해, 이 방정식이 성립하는 해 x=a가 항상 존재하며, n1n2…nk 모듈로 안에서 유일하다. 즉, 이 방정식의 해는 x≡a(modn1n2…nk)로 표현 가능하다.
증명과 계산 방법)
N=n1n2…nk 라고 하자. N/ni는 ni와 서로소이기 때문에, rini+si(N/ni)=1인 정수 ri,si가 항상 존재한다. (확장 유클리드) 여기에서, ei=si(N/ni)라고 하면 아래와 같은 등식이 성립한다.
ei≡1(modni)
ei≡0(modnj)(i≠j)
여기에서 a=k∑i=1aiei라고 하면, 임의의 i에 대해 a≡ai(modni)가 성립한다. 즉, a는 우리가 구하고자 하는 해 중 하나이다.
이제 a의 N 모듈로 안에서 유일성을 증명하기 위해, 두 해 x,y가 존재한다고 가정하자. 그러면 x≡ai,y≡ai(modni) 이므로 x−y는 모든 ni의 배수이고, 따라서 N의 배수이다. 즉, x≡y(modN)이므로 해가 유일하다는 것이 증명된다.
2) 일반적인 상황에서 연립 합동 방정식의 해 구하기
변수 x에 대한 연립 합동 방정식이 두 개 있다고 하자.
x≡a1modm1x≡a2modm2
이 방정식의 해 x가 존재한다면, 다음과 같다. x=k1m1+a1=k2m2+a2. 이 식은 다음과 같이 정리할 수 있다.
k1m1−k2m2=a2−a1
m1과 m2의 최대공약수를 g라고 하자. 만약 두 수가 서로소라면 g=1이다. 위 식을 만족하는 정수 k1과 k2가 존재하기 위한 필요충분조건은 a2−a1가 g의 배수여야 한다. (확장 유클리드 알고리즘)
k1과 k2의 정수해는 여러 쌍이 있을 수 있다. 그중 k1의 임의의 해를 k0라 하자. 확장 유클리드 알고리즘을 통해 k0를 구할 수 있다.
k1의 일반해는 다음과 같이 표현할 수 있다.
k1=k0+lm2g
즉, k1의 정수해는 modm2g에서 유일하다. 이를 x=k1m1+a1에 대입하면 다음과 같다.
x=k0m1+lm1m2g+a1
즉, x의 해가 modm1m2g에서 유일하며, 그 해는 다음과 같다.
x≡k0m1+a1modm1m2g
3) 확장 유클리드 알고리즘
확장 유클리드 알고리즘은 모듈로 안에서 곱셈에 대한 역원을 구할 때나, 앞에서 설명한 중국인의 나머지 정리에서 해를 구할 때 사용된다.
이에 대해 간략하게 설명하면 임의의 정수 a,b에 대하여 gcd(a,b)=ax+by을 만족하는 x,y가 항상 존재한다는 것이다. 이 때, x와 y를 구할 수 있다.
곱셈의 역원)
M 모듈로 안에서 n의 곱셈에 대한 역원이란, ns≡1(modM)을 만족하는 s를 의미하며, n과 M이 서로소일 때 존재한다. 확장 유클리드 알고리즘에서의 식에 n,M,s를 대입하면 gcd(n,M)=xM+ns 를 만족하는 x,s가 존재하며, gcd(n,M)=1일 때 s는 M 모듈로 안에서 n의 곱셈에 대한 역원이 된다.
구하는 방법)
1 | int ee( int a, int b, int &s, int &t) { if (!b){ s = 1, t = 0; return a; } int q = a/b, r = a%b, sp, tp; int g = ee(b,r,sp,tp); s = tp; t = sp-tp*q; return g; } |
'공부' 카테고리의 다른 글
Suffix Array와 LCP (14) | 2014.08.14 |
---|---|
Manacher's Algorithm (0) | 2014.08.13 |
고속 푸리에 변환 (Fast Fourier Theorem, FFT) (9) | 2014.07.25 |
포함-배제의 원리 (0) | 2014.07.20 |
Nim game (18) | 2013.07.29 |
- Total
- Today
- Yesterday
- Algorithm
- majority
- IOI2013
- BOI
- Segment tree
- USACO
- Dijkstra
- Boyer
- ioi
- vote
- Splay Tree
- Parametric Search
- IOI2011
- IOI2014
- idea
- Knuth Optimization
- Dynamic Pramming
- Tree
- BOI 2001
- z-trening
- BOI 2009
- IOI2012
- Greedy Method
- TRIE
- Divide & Conquer
- moore
- Boyer-Moore Majority Vote Algorithm
- optimization
- HackerRank
- dynamic programming
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |