更新日:2003/2/5
2/1付けで自作ものコーナーで公開したフォームを少し手直しした。
実行時間を測定できるようにした点と実行中は、マウスカーソルが砂時計の形状になるようにした点である。
その他、新しい測定の開始時にa(n)等がクリアされない点も改善した。
これは、単純に測定開始時のNow()から次のように時間、分、秒を取得した。
hw1 = Hour(Now()) : mw1 = Minute(Now()) : sw1 = Second(Now())
終了時も同様に取得し、差を求めている。
この方法では、秒単位でしか求まらないが、今回の目的では十分である。
こちらは、次の1行を開始時に追加した。
Cursor.Current = Cursors.WaitCursor
これで、砂時計状態になる。
解除は、Cursor.Current = Cursors.Default
となる。
実行ボタンを押した後にフォームがリフレッシュされないため、a(n)等のテキストボックスの内容をクリアしても画面上は、変化が起きない。
変化させるためには、フォームをリフレッシュする必要がある。
TextBox7.Text = "実行中"
TextBox4.Text = ""
TextBox5.Text = ""
ActiveForm.Refresh()
上の最初の3行がテキストボックスをクリア等するための命令で、最後の1行がフォームをリフレッシュしこれらの結果をフォームに反映するためのものである。
いくつかのnとkの組み合わせで実行時間を測定し、エクセルで整理してみた。
時間は、a(n)を求めるまでの秒数である。
時間 | k | ||||||||
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1000 | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | |
2000 | 7 | 4 | 4 | 3 | 4 | 3 | 3 | 3 | |
3000 | 14 | 9 | 7 | 6 | 6 | 6 | 5 | 5 | |
4000 | 26 | 15 | 12 | 11 | 10 | 9 | 8 | 8 | |
5000 | 42 | 25 | 19 | 16 | 14 | 13 | 12 | 11 | |
10000 | 121 | 87 | 69 | 60 | 52 | 47 | 43 | ||
20000 | 513 | 395 | 325 | 278 | 220 | 201 |
まとめて計算するという方法の効果は、かなり顕著である。
ただし、kがある程度大きくなるとその効果は、鈍ってくる。
ちなみに上記は、a等をIntegerで宣言している場合であるので、kは、9(10の9乗)までが限界であるが、Longで宣言して、k=14(10の14乗)で計算させても、時間はほとんど短縮されない。、
項数nと実行時間sとの関係を示すグラフ。(k=8の場合)
上図では、s=0.7x^2-2.7x+5.8が近似曲線であって、この範囲では、nの2乗に比例して実行時間がかかることになる。(xは、n/1000)
これによるとn=30000では、約560秒となる。これに対して、実測値は、628秒と少し、大きくなった。
項数nと桁数ketaとの関係を示すグラフ
桁数=0.209×項数の関係である。従って、項数が3万では、桁数が6270桁となる。
実際にテストした結果は、6270桁と数式通りとなった。
k=8でn=70000で計算させてみた。
所要時間は、3034秒、桁数は、14629桁となった。
ちなみに6.2の予測式からは、3246秒、14630桁となってほぼ、予測の範囲内となっている。
自作ものに掲載してあるプログラムでは、この範囲を超えるnを入力するとエラーメッセージがポップアップする。
しかし、数値配列は、1万項で宣言してあるので、k=8では、桁数が8万までは、計算可能である。
この際のnは、約38万となって、この程度までは、計算可能となる。この場合の計算に要する時間は、予測式では、24時間を超えることになる。