|
|
●解説 ソフトウェア実験室で既に紹介している冪乗演算の速度比較では、整数冪数の場合は、演算子^よりも直接の乗算*の方が高速であることを示している。しかし、冪数が比較的小さい時の話で、大きくなると、^の方が速くなる。これは、^は冪数に依らず、ほぼ同じ速度で演算できるからである。しかし、^演算は、整数演算ではなく、精度が保てないので、*演算は場合によっては必要となる。 ここでは、整数冪数の冪乗演算を直接*を用いながら高速化する方法を紹介する。 ●原理 指数法則を上手く利用する。つまり、 但し、蚤i = N ところで、一般に整数Nは、二進法で表せば、 A25 = A1・A8・A16 などである。この例で、 A8 = A4・A4 A4 = A2・A2 などであるから、4は2から、8は4からそれぞれ、一回の乗算で得られる。この方法では、6回の乗算で演算できることになる。真っ向法では、24回必要。一般に、この方法では、平均乗算回数は、 二進桁数 - 1 と ビットが 1 の数の合計となる。ビットが 1 の数は平均二進桁数の半分とすれば、 M = log2N - 1 + (log2N) / 2 となる。 N = 32768 とすれば、回数は、29回となる。真っ向法では、32767回なので、およそ、1000倍速くなる。二進で全ビットがオンの場合(2M - 1)が最遅となる。 ●方法 冪数Nの2iのビットを、i=0 から検査し、まず、A2iを以前の値を自乗して求めておき、ビットが1なら、経過値Bに乗じておく。B = B * A2iである。これを繰り返す。 ●実例 実数の冪乗算 DP Dim P As Integer DD = 1 'D0 ●事例 1.000110000 の計算を、Pow関数、*、*高速法の演算時間を測定した。
|