中国人剰余定理を利用した剰余系による数値計算法の例

多桁の数を直接計算するにはハードウェア規模がO N2で増大し非現実的なサイズになってしまう。 もし、多桁の数をくつかの小さな数のセットに分解して演算*1ができると、ハードウェアで 数値演算回路を構成する場合にハードウェアの規模を小さくする事が出来る場合がある。 多桁の乗算にはFFT法などがあるが、 ここでは、中国人剰余定理 (Chinese remainder theorem) を利用した剰余系による数値計算を紹介する。
例として2つの 9 bit の正の整数 A, B の自乗和を剰余系を使用し
X = A2 + B2
を求めてみる。

まず、2つの 9 bit の自乗和は、高々 19 bit であるから

219 = 524,288 ≦ d1 d2dt


となる互いに素な任意の整数のセットを選ぶ。
例として {5, 7, 9, 11, 13, 16} を選ぶと、各要素の積 n は

219 = 524,288 < n = 5 * 7 * 9 * 11 * 13 * 16 = 720,720

であるから上の条件を満たすのでこれを使用することにする。
与えられる2つの数をA、Bとし、A=357、B=412 の時を例にとって 説明する。
A、Bをそれぞれ {5, 7, 9, 11, 13, 16} で割った余りを求めると、
A 5 = 2 (mod  5),
A 7 = 0 (mod  7),
A 9 = 6 (mod  9),
A11 = 5 (mod 11),
A13 = 6 (mod 13),
A16 = 5 (mod 16)
B 5 =  2 (mod  5),
B 7 =  6 (mod  7),
B 9 =  7 (mod  9),
B11 =  5 (mod 11),
B13 =  9 (mod 13),
B16 = 12 (mod 16)
となる。それぞれの自乗の剰余を求め
SA 5 =  4 (mod  5),
SA 7 =  0 (mod  7),
SA 9 =  0 (mod  9),
SA11 =  3 (mod 11),
SA13 = 10 (mod 13),
SA16 =  9 (mod 16)
SB 5 = 4 (mod  5),
SB 7 = 1 (mod  7),
SB 9 = 2 (mod  9),
SB11 = 3 (mod 11),
SB13 = 3 (mod 13),
SB16 = 0 (mod 16)
それぞれの和の剰余を求めると
S 5 = 3 (mod  5),
S 7 = 1 (mod  7),
S 9 = 4 (mod  9),
S11 = 6 (mod 11),
S13 = 0 (mod 13),
S16 = 9 (mod 16)
となり、剰余系において答えが求められた。
この剰余系のまま他の計算を進めることも出来るが、この剰余系の数を普通の数に戻すには、
(n / dj ) xj 1 (mod dj )
なる xj 、つまり n / d の dj における乗法的逆元を 拡張ユークリッドの互除法 (extended Euclid's algorithm)により求め、
n 5 = 576576 (mod m /  5),
n 7 = 205920 (mod m /  7),
n 9 = 320320 (mod m /  9),
n11 = 196560 (mod m / 11),
n13 = 277200 (mod m / 13),
n16 = 585585 (mod m / 16)
各剰余類と逆元の積和として、得ることが出来る。
X = ( (S 5 n 5 ) (mod n)
    + (S 7 n 7 ) (mod n)
    + (S 9 n 9 ) (mod n)
    + (S11 n11 ) (mod n)
    + (S13 n13 ) (mod n)
    + (S16 n16 ) (mod n) ) (mod n)

= 297193 (mod n)

*Note1 FFTによる方法も中国人剰余定理による方法も考え方の本質的には同じである。 つまり、ある大きな数を直交するn次元の小さな数に細分できれば、n個の小さな数の計算で済むということである。 単位ベクトルを ejωnt にとればフーリエ変換であるし、互いに素な数にとれば中国人剰余定理である。

Get the test program source written in C (mod_calc-1.6.tar.gz)
MD5 (mod_calc-1.6.tar.gz) = 1bac199de2f3dcb0ef55d9b29dbe56f9
SEE ALSO
Karatsuba 法による乗算

www.finetune.co.jp [Mail] © 2000 Takayuki HOSODA.
Powered by
 Finetune