中華風剰余定理

Latest Author anta /Date 2015-06-20 00:57:54 / Views 6375
2 (Favした一覧ページはユーザーページから)

m1,,mnm_1, \dots, m_nを、iji \neq jに対してgcd(mi,mj)=1\gcd(m_i, m_j) = 1となる整数mi>1m_i > 1とし、m=i=1nmim = \prod_{i=1}^n m_iとする。 この定理はZ/m1Z××Z/mnZZ/mZ\mathbb{Z}/ m_1 \mathbb{Z} \times \cdots \times \mathbb{Z}/ m_n \mathbb{Z} \cong \mathbb{Z}/ m \mathbb{Z}であると述べている。

つまり、i,aai(modmi)\forall i, a \equiv a_i \pmod {m_i}という連立線形合同方程式が与えられたとき、0a<m0 \le a < mとなる解が一意に存在する。

中華風剰余定理, 中国剰余定理, 中国人剰余定理, Chinese Remainder Teorem, CRT などと呼ばれる。

Z\mathbb{Z}以外の環に対しても一般化できる。体上の多項式の場合が特に重要である。 体FFに対してmi=xuiF[x]m_i = x - u_i \in F[x]とすると、fmod(xui)=f(ui)f \bmod (x-u_i) = f(u_i)であるので、これは多項式補間ということになる。

アルゴリズム

上記のaia_iからaaを復元するアルゴリズムを考える。 アルゴリズム版は定理と区別して"Chinese Remainder Algorithm (CRA)"や"Effective CRT"などとも呼ばれる。 ただし、その場合下記のLagrange CRAのみを指すことも多い。

前述のようにこの定理のアルゴリズムは多項式補間の一般化であるので、この記事では、アルゴリズムを多項式補間の場合の名前で呼ぶことにする。この呼び方は一般的ではない。

Lagrange CRA

定理の標準的な証明に使われる構成法である。Lagrange interpolation (ラグランジュ補間)の一般化となる。

iji \neq jに対し、si=(mmi)1modmis_i = (\frac{m}{m_i})^{-1} \bmod m_i, bi=simmib_i = s_i \frac{m}{m_i}とする。このとき、bi0(modm)jb_i \equiv 0 \pmod m_jであり、bi1(modm)ib_i \equiv 1 \pmod m_iとなる。 ここでa=i=1naibimodma = \sum_{i=1}^n a_i b_i \bmod mとすると条件を満たすことがわかる。

そのままの実装では、F[x]F[x]上でmim_iが次数1の場合(多項式補間の場合)、Θ(n2)\Theta(n^2)回のFF上の掛け算・足し算とΘ(n)\Theta(n)回のFF上の逆元を求める時間計算量となる。Z\mathbb{Z}上の場合も同じような時間計算量となる。

高速な乗算と逆元を求めるアルゴリズムを用い適切な分割統治アプローチを用いると、F[x]F[x]上やZ\mathbb{Z}mim_iが定数サイズの場合O(M(n)logn)O(M(n) \log n)の時間計算量でも実装できる。これを"Fast CRA"と呼ぶことがある。

Newton CRA

nnが2の場合はこのアルゴリズムのほうが単純である。nnが小さい場合は特にこのアルゴリズムが高速になりうる。

n=2n = 2と仮定する。tm11(modm2)t \equiv m_1^{-1} \pmod {m_2}, h(a2a1)t(modm2)h \equiv (a_2 - a_1) t \pmod {m_2}としたとき、a=a1+m1ha = a_1 + m_1 hとすると、aaは条件を満たす。

n>2n > 2の場合、入力を分割して再帰的に適用する。 F[x]F[x]上やZ\mathbb{Z}mim_iが定数サイズの場合、左から1つずつ追加していくように分割すればΘ(n2)\Theta(n^2)時間となる。 この場合、多倍長演算を全て実装しなくても、片方の引数が定数サイズの演算のみで実装できるため、実装が比較的簡単になる。 また、これはオンラインアルゴリズムと言える。

高速な乗算と逆元を求めるアルゴリズムを用いる場合は、入力を半分ずつに分割していくようにすればO(M(n)log2n)O(M(n) \log^2 n)時間で実装できる。

両方のアルゴリズムにいえることだが、mim_iが固定されている場合は、それのみによって決まる変数を事前計算しておくことで高速化できる。 特に逆元を求める操作は高価であるので、出来る限り事前計算しておくべきである。Newton CRAでは逆元を事前計算しておけば計算量をO(M(n)logn)O(M(n) \log n)に落とせる。

参考文献