Subsections
進桁の数
の値は
であるが、これは多項式
|
(3.28) |
において、を代入したときの値に他ならない。このようにして数を多項式に対応付けると、数の加減乗除は多項式の加減乗除と考えることができる。例えば加算には
が対応する。これもを代入すれば
となることからすぐに分かる。例えばの加算を多項式で行うと、
となり、である。しかしここで得られたはをそのまま多項式に置き換えたとは異なっている。これは多項式の演算には繰り上げが存在しないためである。数の演算の道具として多項式を使う限り、必要な値はだけであるから、上の例()の場合は
のように の係数を「繰り上げ」れば良い。
次に乗算を考えてみる。例えば
のような簡単な例で多項式の乗算を行ってみると、
のようになる。このことから考えて、2つの多項式
|
(3.29) |
の積が
|
(3.30) |
のように表されているとき、は
|
(3.31) |
で与えられることが分かる。このような形の和を畳み込み(convolution)と呼ぶ。多倍長数の乗算とは要するにこの畳み込みの計算である。筆算ではこの畳み込みをそのまま計算し、Karatsuba乗算では
という関係を使って乗算回数を減らしているのである。
畳み込みは次のようにしても得られる。多項式
の間にという関係があり、の係数からの係数を決定したいとすると、未知数が3個であるから、乗算3回を含む連立方程式
|
(3.32) |
を解けばよいことになる。具体的に
とすれば
となって
が求まり、Karatsuba乗算のアルゴリズムが導かれる。
この方法は容易に拡張できる。例えば
として
を考え、
として乗算5回を含む連立方程式を立てた場合、必要な時間は
となり、Karatsuba乗算よりも速いことが分かる。
この方法を一般に拡張して多倍長数を分割した場合、上と同様の議論から必要な時間は
となる。を大きくすれば次数をかなり下げることができるが、その場合には解を求める式が煩雑になるので、機械的に解を求めるアルゴリズムが必要となる。
問題は
という点を通る多項式
を決定することである。これを多項式補間(Polynomial Interpolation)という。ここでは特にという制限を加えて補間を行いやすくする。
準備としてまず降冪(Falling Power)
を
、特に
と定義する。次に差分演算子(Difference Operator) を
と定義する。そうすると、ならば
となり、
なので、に対して
|
(3.36) |
が成り立つ。さて、は第2種Stirling数を用いて
|
(3.37) |
と表されるので、を
|
(3.38) |
と書き換えたとき、は全て負でない。ここで
であるから、は
|
(3.39) |
と簡単に求まる。よって、(3.11)において
を全て展開すればを決定することができる。
今まで述べてきたことを使って乗算を行うアルゴリズムをToom-Cook法(Toom-Cook Method)という。例として、
と
の16進乗算を行ってみる。
とおくと、
となる。の補間は次のような表を考えると分かりやすい。まず0段目にの値を並べる。
次に、0段目の隣り合う要素の差を1段目に並べる。
次に、1段目の隣り合う要素の差を2で割ったのものを2段目に並べる。
段目の隣り合う要素の差をで割ったのものを段目に並べる、という操作を繰り返すと、次の表が得られる。
このとき、段目の左端の値が
の係数となる。つまり、
である。ここで
と書き直すと、の係数は次のように計算できることが分かる。
ここで求まった係数の繰上げを行うと、
となるから、
である。実際に値を代入すると、
となるから、うまくいっている。
Kenichi Kondo
平成16年3月18日