カラツバ法 (カラツバほう)とは、主に多倍長乗算 の乗算アルゴリズム(英語版 ) において、乗算 の回数を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}
関連項目