例 14.7
(互除法の計算量)

桁,

桁 (

) の 2 整数の GCD を互除法で
計算して,
である桁数

を持つ数列が得られたとする. このとき,

桁の数
を

桁の数で割ってあまりを求める操作のコストを

と見積もる
と, 互除法のコストは
と見積もれる.
よって, 互除法の計算量は高々

. 実際に, フィボナッチ数列の
隣あう 2 項がこの計算量を実現する. (つまり最悪) これは, おおざっぱ
にいえば
で,

より,

,

から互除法で
生成される数列は

,

であることから
でる. 詳しくは
http://www.math.kobe-u.ac.jp/noro/main/node33.html 参照.
演習 14.2
glib_
関数を使って GCD の計算時間をプロットしてみる.
横軸に桁数, 縦軸に計算時間をとる. 各桁数に対し, その桁数の
整数を 2 つ生成して, GCD の計算を繰り返す. 必要な機能は次の通り.
- 乱数発生 : lrandom(N)
2 進数で
ビットの整数
(
)
をランダムに発生する.
- 時間計測 : time()[0]
その時点までの計算時間 (CPU 時間) を返す. 次のようなプログラム
により, 必要な部分の計算時間を計測できる.
T0 = time()[0];
/* 1 回ではばらつきが生ずるので繰り返す */
for ( I = 0; I < 10; I++ )
int_gcd(A,B);
T1 = time()[0];
TIme = T1-T0;