例として
を部分和で近似することを考える.
とする. そのままプログラム化すると
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 の分母を返す.