宇宙

(3)配列のサイズ

・さて,計算の前準備ができました。これから本格的に手順を考えます。
(A)の級数についてまず考えます。これができれば,他の(B)及び(C)もまったく同様に計算できます。
・説明を具体的にするために,10,000進法で,1,000桁計算するものとします。
配列変数は, 例えば,S[1],S[2]・・・を考え,計算の結果等はこの配列変数に収めるものとします。 S[1]が一番上位の桁とし,S[2],S[3]と増えるにつれ,下位の桁を収めるものとします。計算する項数は, 表1より555項までです。

・10000進法は適当にきめたわけではありません。理由があります。使用する変数は、長整数型で,表せる数値範囲は, 0〜 4,294,967,295 です。これは9.6桁に相当します。 計算の途中では、加減乗除算が出てきますが、その中でも乗算はオーバーフローが発生する可能性があります。(C)の分母 239での乗算を考えると


239×239×10000 = 571,210,000 < 4,294,967,295

ですが、100000進法では、


239×239×100000 = 5,712,100,000 > 4,294,967,295

となって桁があふれてしまいます。
・次に,必要な配列の長さを決めます。上で説明したとおり10000進法を使用するわけですから, 配列要素1つには4桁の数値が収まります。従って,


となります。この式で1ではなく2を加算している理由は,整数部分つまり3を収める部分が必要だからです。 小数点以下の桁数ばかりに留意すると,この3を忘れがちですね。


(4)計算の手順





上のように変形すると,式の本質が見えてきます。なんのことはない, 項比が1/8^2の等比数列の各項を2n-1で除算したのものということです。これから,考えると,

a(n)を計算し,その結果を保管する。これは次のa(n+1)の計算に使用する。
a(n)を2n-1で除算し,この結果を最終結果に加算する。

と言う方針で計算できそうです。すると,少なくとも表2に示す3つの配列変数が必要になります。

表2-2 配列変数

変数名 意味
A[i] 196/82及び,その1/82倍を保管する
D[i] A[i]を2n-1で除算した結果を保管する
P[i] 各項の合計値を保管する。最終的には,A’とB’の結果も加算する。
注意:A[i],D[i]は第n項の値のみを一時保管するだけです。
これらに対し,P[i]は第1項から第n項までの総ての和を保管します。


さて,計算の手順を最初の3項に対して書いてみます。

n = 1
196/8^2を計算して結果を配列A[i]へ退避する。
A[i](i:1から最大配列要素まで) <-

その内容をP[i]へ格納する。
P[i]( i:1から最大配列要素まで <- A[i]

n = 2

A[i]に対して,8^2で割りその結果をA[i]へ退避する。

A[i] <- A[i]/8^2

[i]の内容を3で割りその結果をD[i]へ退避する。

A[i]/3 -> D[i]

P[i]の内容からD[i]を減算し,その結果をP[i]へ格納する。

P[i] - D[i] -> P[i]

n = 3

A[i]に対して,82で割りその結果を再び配列A[i]へ退避する。

A[i]<-A[i]/8^2

A[i]内容を5で割りその結果をD[i]へ退避する。

D[i] <- A[i]/5

P[i]の内容からD[i]を加算し,その結果をP[i]へ格納する。

P[i] <- P[i] - D[i]


となります。表2の変数の説明をもう一度確認してください。これで,A,D,Pの用途が明確になったかと思います。後はこれをn=555まで繰り返せばよい分けです。

A’及びB’についても形式がまったく同様であることから,同じ考え方で計算できることはあきらかでしょう。
で,最後に,P[i]を出力すれば終わりです。コードの例を次頁に示します。








目次へ戻る

宇宙