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日