メモ

yukicoderでゆるふわgolf

Garnerのアルゴリズム

この記事ではGarnerのアルゴリズムの「気持ち」を説明します。
アルゴリズムの説明のみであり、実装については一切説明していません。
合同式の取扱にある程度慣れていることを前提とします(「適当な条件の下ではmodをとっても加減乗除ができる」と知っているくらい)
本質ポイントがたくさんあるのでちょっと説明が難しい。

以下変数は全て非負であるとする。
非負整数kと正整数mに対して、x=kmodmを満たす最小の非負整数xをk%mと略記する。(要はC言語などの普通の剰余演算)


・Garnerのアルゴリズムとは
x%mi=λi というn個の合同式と正整数Mが与えられる。
miたちは互いに素(pairwise coprime)である。
このとき、この連立合同式の非負整数解xであって、最小のものについて、x%Mを求めることができる。
(方程式のindexは1-basedとする)

・ちょっと意味がわからん
例題
x%3=2x%5=3x%7=2
を満たす最小の非負整数xについてx%11を求めよ


・気持ちの整理
本質ポイント1:前から貪欲に計算できる
例題を考えよう。
2つ目の条件までについてx%15=8であれば良いことがわかっているとして、これを満たし、かつx%7=2となるようなものを探すにはどうすればよいか。
この問題に答えるのは簡単でx=8+15kという形であってx%7=2になるものを探せば良い。これは1変数の合同式なので容易に(O(log m_i)で)解ける。
このことから、前から順番に方程式を解決していくことで、x=k1+k2m1+k3m1m2+modm1m2という形で、kiを前から順に決めていくことが出来ることがわかる。
本質ポイント2:この方法で最小解が求まる
つまり上の例で言えば、合同式としての解はk=1mod7と求まるわけだが、最小解はk=1のときに達成されるということ。
中国剰余定理を用いて証明できる。

・Garner法の気持ち
i-1番目までの方程式から定まるあるai,biによって記述される方程式ai+biki=λimodmiを解くことでkiたちは求めることができるということはわかった。
本質ポイント3:これはmodmiの世界の話だから、ai,bimodmiで求まればよい。
実際、bi=j=1i1mjai=j=1i1kjbjであることからこれは容易に計算できる。
kiたちさえ計算できてしまえば、最小解はx=an+1なので、これのMでの剰余を計算すればよい。