例として
を部分和で近似することを考える.
とする. そのままプログラム化すると
def e1(N) { E = 0; for ( I = 0; I <= N; I++ ) E += 1/factorial(I); return E; }factorial(N) は 11/5 の演習問題で書いた関数である. 実は この関数はとても無駄が多い(何故か?) ので改良してみよう.
def e2(N) { F = 1; E = 1; /* E = 1/0! */ for ( I = 1; I <= N; I++ ) { F *= I; /* F = I! */ E += 1/F; /* E = 1+1/1!+...+1/I! */ } return E; }
実はこれでもまだ効率が無駄が多い. これは, 有理数計算特有の事情である.
の計算には整数 GCD の計算が必要になるが,
の分母は
明らかに
を割るので GCD 計算は無駄になる. よって,
とおいて,
の漸化式を求めよう.
より
. よって, 次の
プログラムが書ける.
def e3(N) { A = 1; /* A(0) = 1 */ for ( I = 1; I <= N; I++ ) A = I*A+1; return A/factorial(N); }
[...] cputime(1);を実行すると, 計算時間が表示されるようになる.
A/B の整数部分を返す.
有理数 Q の分子を返す.
有理数 Q の分母を返す.