カラツバ法

カラツバ法(カラツバほう)とは、主に多倍長乗算乗算アルゴリズム(英語版)において、乗算の回数を4分の3にするアルゴリズムである。 加減算の回数は増加するが、乗算コストはそれより遥かに大きいため、結果として演算コストそのものもほぼ4分の3となる。 発見者のAnatolii Alexeevitch Karatsuba(Карацуба Анатолий Алексеевич)の名前を取ってKaratsuba法(Karatsuba-algorithm)、あるいは単にKaratsubaとも呼ばれる。

従来の乗算は O ( n 2 ) {\displaystyle O(n^{2})} だったが、Karatsuba法の再帰的適用により、 O ( n log 2 3 ) {\displaystyle O(n^{\log _{2}3})} log 2 3 {\displaystyle \log _{2}3} ≒1.585)まで計算コストが抑えられる。

アルゴリズム

単純な例として、被乗数 X {\displaystyle X} と乗数 Y {\displaystyle Y} の積 Z {\displaystyle Z} を求める( Z = X × Y {\displaystyle Z=X\times Y} )。 まず、被乗数 X {\displaystyle X} と乗数 Y {\displaystyle Y} をそれぞれ上位・下位の2つに分割する。 分割の基数を b {\displaystyle b} (例えば3桁ずつに分割するなら b := 1000 {\displaystyle b:=1000} )とすると、

X := x 1 b + x 0 {\displaystyle X:=x_{1}\cdot b+x_{0}}
Y := y 1 b + y 0 {\displaystyle Y:=y_{1}\cdot b+y_{0}}
Z := z 2 b 2 + z 1 b + z 0 {\displaystyle Z:=z_{2}\cdot b^{2}+z_{1}\cdot b+z_{0}}

この乗算をKaratsuba以前の方法(Long multiplication)で行うと、乗算を4回行うことになる。

z 2 := x 1 × y 1 {\displaystyle z_{2}:=x_{1}\times y_{1}}
z 0 := x 0 × y 0 {\displaystyle z_{0}:=x_{0}\times y_{0}}
z 1 := x 1 × y 0 + x 0 × y 1 {\displaystyle z_{1}:=x_{1}\times y_{0}+x_{0}\times y_{1}}

Karatsubaの方法では、乗算を3回で済ませられる。

z 1 := z 2 + z 0 ( x 1 x 0 ) × ( y 1 y 0 ) {\displaystyle z_{1}:=z_{2}+z_{0}-(x_{1}-x_{0})\times (y_{1}-y_{0})}

計算例

X = 32 , 463 {\displaystyle X=32,463} ( x 1 := 32 , x 0 := 463 ) {\displaystyle (x_{1}:=32,x_{0}:=463)} Y = 38 , 030 {\displaystyle Y=38,030} ( y 1 := 38 , y 0 := 30 ) {\displaystyle (y_{1}:=38,y_{0}:=30)} b = 1000 {\displaystyle b=1000} とすると、

z 2 := x 1 y 1 = 1216 {\displaystyle z_{2}:=x_{1}y_{1}=1216}
z 0 := x 0 y 0 = 13890 {\displaystyle z_{0}:=x_{0}y_{0}=13890}
z 1 := z 2 + z 0 ( x 1 x 0 ) ( y 1 y 0 ) = 1216 + 13890 ( 431 ) ( 8 ) = 18554 {\displaystyle z_{1}:=z_{2}+z_{0}-(x_{1}-x_{0})(y_{1}-y_{0})=1216+13890-(-431)(8)=18554}
Z = 1216 b 2 + 18554 b + 13890 = 1 , 216 , 000 , 000 + 18 , 554 , 000 + 13 , 890 = 1 , 234 , 567 , 890 {\displaystyle Z=1216b^{2}+18554b+13890=1,216,000,000+18,554,000+13,890=1,234,567,890}

関連項目