この記事ではGarnerのアルゴリズムの「気持ち」を説明します。
アルゴリズムの説明のみであり、実装については一切説明していません。
合同式の取扱にある程度慣れていることを前提とします(「適当な条件の下ではmodをとっても加減乗除ができる」と知っているくらい)
本質ポイントがたくさんあるのでちょっと説明が難しい。
以下変数は全て非負であるとする。
非負整数kと正整数mに対して、を満たす最小の非負整数xをと略記する。(要はC言語などの普通の剰余演算)
・Garnerのアルゴリズムとは
というn個の合同式と正整数が与えられる。
たちは互いに素(pairwise coprime)である。
このとき、この連立合同式の非負整数解xであって、最小のものについて、を求めることができる。
(方程式のindexは1-basedとする)
・ちょっと意味がわからん
例題
を満たす最小の非負整数xについてx%11を求めよ
・気持ちの整理
本質ポイント1:前から貪欲に計算できる
例題を考えよう。
2つ目の条件までについてであれば良いことがわかっているとして、これを満たし、かつとなるようなものを探すにはどうすればよいか。
この問題に答えるのは簡単でという形であってになるものを探せば良い。これは1変数の合同式なので容易に(O(log m_i)で)解ける。
このことから、前から順番に方程式を解決していくことで、という形で、を前から順に決めていくことが出来ることがわかる。
本質ポイント2:この方法で最小解が求まる
つまり上の例で言えば、合同式としての解はと求まるわけだが、最小解はのときに達成されるということ。
中国剰余定理を用いて証明できる。
・Garner法の気持ち
i-1番目までの方程式から定まるあるによって記述される方程式を解くことでたちは求めることができるということはわかった。
本質ポイント3:これはの世界の話だから、がで求まればよい。
実際、、であることからこれは容易に計算できる。
たちさえ計算できてしまえば、最小解はなので、これのMでの剰余を計算すればよい。