Karatsuba法
梅谷 武
作成:2001-02-14 更新:2005-12-31
多倍長整数の高速乗算法であるKaratsuba法についてわかりやすく解説する。
IMS:20010214001; NDC:418; keywords:Karatsuba法, Landauの記号;
Knuth[
S2]によれば、この算法がはじめて公表されたのは、1962年に当時のソ連の
Karatsubaが発表した論文によるそうです。
Knuth自身はこれをディジタル法と名付けています。
2つの多倍長整数が基数
P>0によって次のように表現されているとします。
この積を計算します。
この最後の式からこの計算には4回の積と3回の和と桁上げ処理が必要なことがわかります。ところがここで、
とおくと
が成り立ちます。この場合は3回の積と4回の和と2回の差と桁上げ処理になります。つまり1回の積を1回の和と2回の差に置き換えたことになります。さらに、
とおくと
が成り立ちます。この場合も3回の積と4回の和と2回の差と桁上げ処理になります。
前者は、例えば2進計算機が32bitの演算器を持つときに、基数P=232として倍精度の乗算に適用することができます。後者は、t1の計算の途中で負の値がでてくることはありませんので、多倍長整数計算で値を絶対値表現しているときに有効です。
まず、計算量の評価を行なうために使われる道具を導入しておきましょう。
定義1.1 (Landauの記号)
2つの実関数
g(x), h(x)について、
xがある値
αに近づくときの大小関係を表わすために、
g(x)=O(h(x)), | g(x)=o(h(x)) |
という記号を次のように定義する。
αは
±∞であってもよい。
- 大文字のOは近づき方が同じオーダー(程度)であることを表わす。
g(x)=O(h(x)) | ⇔ | ∃A∈R | : | lim x→α | | < | A |
- 小文字のoは近づき方がずっと小さいことを表わす。
g(x)=o(h(x)) | ⇔ | lim x→α | | g(x) h(x) | = | 0 |
nビット長の多倍長整数の乗算の古典算法による計算時間(これを計算量と呼ぶ)を
TCL(n)とすると、
n→∞のとき
となることがわかっています。
Karatsuba法の計算量
TKO(n)を評価してみましょう。加減算の計算量は
n→∞のとき
O(n)であることから、
となる定数kが存在します。
TKO(1)と
kの大きい方を改めて
kとおき、数列
{2r|r=0,1,…}について、
と定めると
S(2r) | = | (3r+1 | - | 2r+1)k, | r | = | 0,1,… |
が成り立ちます。なぜならば、
r=0のときは明らかで、
r=nで正しいと仮定すると、
となり、
r=n+1でも成り立つからです(数学的帰納法)。このことから
という不等式が得られます。
nを任意に与えたときに、
n以上で最小の
2rが存在します。このとき
となっています。上の不等式を使って、
ここで、
と実数のべき乗の定義から導かれる等式
を使うと、
が導かれます。したがって次の定理が証明されました。
算法
[
S1] 野下 浩平, 高岡 忠雄, 町田 元,
基本的算法, 岩波書店, 1983
[
S2] D. E. Knuth(中川 圭介訳),
準数値算法/算術演算, サイエンス社, 1986