中国剰余定理
定義
- X は D1 で割ると M1 余る
- X は D2 で割ると M2 余る
- D1 と D2 は互いに素
この時、条件を満たす X は必ず存在し、かつ X を D1D2 で割った時の余りは一意に決まる。
証明はQiita記事参照。
由来
むかしむかし、あるところにおじいさんがおったそうな。
おじいさんは山へ柴刈りに行くにあたり、薪の在庫を調べたそうな。
3個ずつに分けたところ、2個余ったそうな。
5個ずつに分けたところ、3個余ったそうな。
7個ずつに分けたところ、2個余ったそうな。
はて、薪はいったいいくつあるじゃろうか。
中国の『孫子算経』に伝わる。(設定は後付け)
オリジナル問題の解法
- 3で割った余りに70をかける。140。
- 5で割った余りに21をかける。63。
- 7で割った余りに15をかける。30。
- これらを全て足し合わせる。233。
- 105で割った余りが答え。23。
70,21,15がどこから出てきたか。これはそれぞれ、以下のようになっている。
- 5と7の公倍数のうち、3で割って1余る数
- 3と7の公倍数のうち、5で割って1余る数
- 3と5の公倍数のうち、7で割って1余る数
たとえば5を中心に見ると、140,63,30のうち、63は問題の条件に合うよう5で割ると3余る数を選んでいて、他の140と30は5の倍数である。 よってそれを足し合わせた数は当然、5で割ると3余る。 3,7に対しても同じことが言える。
こうした数をあらかじめ見つけておけば、他の数で割った場合の答えも求められる。
一般化問題
以下のように問題を拡張する。
- ある数 X は Di で割ると Mi 余る(X≡MimodDi)という条件が N 個ある
- 任意の i,j に対して Di,Dj は互いに素とは限らない
- 全ての条件を満たす最小の正整数 X を求めよ
- 存在しない場合はその旨を報告せよ
解法
ひとまず条件を絞って、全ての Di が互いに素とする。
中国剰余定理より「X≡M1modD1」と「X≡M2modD2」から「X≡M1,2modD1D2」という解が得られる。(具体的な導出方法は下記「2条件の場合の解法」参照。とりあえず得られるということは保証される)
さらにこれを「X≡M3modD3」とあわせることで「X≡M1,2,3modD1D2D3」という解が得られる。
2条件の場合の解法を連鎖的に適用していくことで、多条件の場合の解も得られる。
2条件の場合の解法
拡張ユークリッドの互除法より、D1p+D2q=1 を満たす整数解 (p,q) は必ず存在し、計算で求められる。(D1,D2 は互いに素)
すると以下が言える。
- D1p+D2q≡D2q≡1modD1
- D1p+D2q≡D1p≡1modD2
X=M2D1p+M1D2q とすると、以下のようになり、条件を満たす X を構成できる。
- X≡M1D2q≡M1modD1
- X≡M2D1p≡M2modD2
互いに素とは限らない場合
この場合、矛盾のため X が構成できないケースが出てくる。単純な例で言うと、
- X≡1mod4
- X≡2mod6
4で割った余りが1なら奇数のはずなのに、6で割った余りが2だと偶数となり、矛盾する。
解が存在する必要十分条件は、D1,D2 の最大公約数を d として、「M1≡M2modd」が成立することである。
上の例では、4と6の最大公約数が2だが 1≢2mod2 のため、矛盾する。
以降、その条件は満たすとして、具体的な X の構成方法を示す。
拡張ユークリッドの互除法にて D1p+D2q=d となる (p,q) を見つける。また、s=M2−M1d なる s を定義する。
すると、s(D1p+D2q)=sD1p+sD2q=M2−M1 となる。
移項すると、M1+sD1p=M2−sD2q となる。これを X と置くことで、
- X≡M1+sD1p≡M1modD1
- X≡M2−sD2q≡M2modD2
となり、条件を満たす。
多条件の場合の初期値
初期値として D0=1,M0=0 としておくと、最初の2項を特別扱いせずとも、1項目から順にマージしていける。