Subsections
桁の数 の乗算を行うことを考える。 を基数 の冪 を用いて
|
(2.12) |
のように上半分と下半分に分ければ、を基数とした乗算と考えることができる。このとき単純にを求めると、
のように1が4回必要である。しかし
|
(2.13) |
という関係を使えばは3回で済むことが分かる。ここでさらに
の上位の桁をで埋めて桁数を偶数にするか、あるいは始めからの桁数を2の冪にしておけば、3回のに同じアルゴリズムを再帰的に適用することができる。この乗算アルゴリズムをKaratsuba乗算(Karatsuba Multiplication)という。
このアルゴリズムでに必要な時間をとする。には
が3回とが数回必要であるから、
となり、 よりも少ない時間で乗算が実行できることが分かる。
桁の数と桁の数 の除算を行い、桁の商と桁の余りを求めることを考える。を基数の冪を用いて
|
(2.15) |
のように表せば、を基数とした除算と考えることができる。筆算のアルゴリズムから、を求めるためには除算
を行わなければならないが、これはちょうどの半分の大きさであるから、Karatsuba乗算と同じように桁数を調節することで再帰的に求めることができる。後はこのようにして求めた商と余りをとして、
|
(2.16) |
とおき、となるまで
|
(2.17) |
を繰り返せばが求まる。この繰り返しを2回以下にするには、筆算のときと同様にとなるように、したがって進表示におけるの最上位の桁が以上となるように調節すれば良い。についても同様にして求めることができる。の商と余りを再帰的に求め、
|
(2.18) |
とおき、となるまで
を繰り返せば良い。ここで求まったがそのまま余りとなる。この除算アルゴリズムをKaratsuba除算(Karatsuba Division)という。
このアルゴリズムで に必要な時間を とする。にはが2回と
が2回、等が数回必要であるから、に必要な時間をとして、
となる。具体的にとすれば
となり、
とすれば
となる。第4章で述べるアルゴリズムを使えばとなるので、
となる。
桁の数を開平して桁の平方根と余りを求めることを考える。を基数の冪を用いて
のように表せば、を基数とした開平と考えることができる。筆算のアルゴリズムより、まずの平方根と余りを求めなければならないが、これはちょうどの半分のサイズであるから再帰的に求めることができる。このようにして求めた平方根を、余りをとおく。次にを求めるために、
の商を、余りを、そして
とおく。となるまで
|
(2.23) |
を繰り返せばが求まる。特にの場合には、1回条件分岐をするだけとなる。この開平アルゴリズムをKaratsuba開平(Karatsuba Square Root)という。
このアルゴリズムで桁の数を開平するのに必要な時間をとする。桁の開平には
が1回、 が1回、 が1回、 が1回、等が数回必要である。に必要な時間を、に必要な時間をとすれば、
となる。ここでKaratsuba乗除算を使えば
となる。
例えば という 進表現は、のように3桁ごとに区切れば 進表現としてみることができる。このように基数をからに変換する、あるいはその逆は単に( 進表示における)桁の区切りを変えるだけで良く、隣の桁に対する繰上げや繰り下げが起こることはない。このことを利用したのがここで述べるアルゴリズムである。
桁の進自然数を基数変換し、進表現を得たいとする。まず
となるような最小のを求め、とする。このとき、の進表示は桁以下である。次にの進表示を得るためにを行い、その商を、余りをとする。そうするとは進表示ではの2桁で表されることになるが、先に述べたことからはそのまま進表示における上位桁と下位桁になっている。後はに対して同じアルゴリズムを再帰的に適用すればの進表示が得られる。この基数変換アルゴリズムをKaratsuba基数変換(Karatsuba Radix Conversion)という。実際に必要とされる基数は限られているであろうから、予め等を計算しておくとよい。
このアルゴリズムで進桁の数を 進表現に変換するのに必要な時間をとする。の冪を予め求めておけば単に除算を繰り返すだけであるから、
となる。具体的にKaratsuba乗算を用いて
とすれば、
となる。
Kenichi Kondo
平成16年3月18日