エラトステネスの篩とその実行結果のファイル出力と実行時間の短縮 五十嵐真人 2008/02/01 15:37:51 └十進BASICにはテキストファイルの内容を視認... 荒田浩二 2008/02/02 17:09:05 └規格上,BASICでは変数や配列の初期値が0で... 白石 和夫 2008/02/02 17:25:58 (修正1回)
エラトステネスの篩とその実行結果のファイル出力と実行時間の短縮 五十嵐真人 2008/02/01 15:37:51 ツリーへ
エラトステネスの篩とその実行結果のファイル出力と実行時間の短縮 |
返事を書く ノートメニュー |
五十嵐真人 <cwkcuxgbof> 2008/02/01 15:37:51 | |
エラトステネスの篩と
その実行結果のファイル出力と実行時間の短縮 2008/01/06 報告書作成 五十嵐真人 (いがらしまなと、日本大学工学部電気電子工学科2年) 宜しくお願いします。Email:u184014@cc.ce.nihon-u.ac.jp 1、はじめに エラトステネスの篩のプログラムを実行し、その実行結果をファイルに出力した場合と、画面に出力した場合では、前者の場合の方が実行時間が短いことが解った。そこで今回は十進BASICのプログラムを用いて、それらの実行結果の出力方法の違いによりどれ程、実行時間に差が生じ、実行時間が短縮されるかについて検証したいと思う。 2、プログラム これらは、エラトステネスの篩を使い、1から100万の素数を求めるものである。 (1)実行結果をファイルに出力するプログラム(十進BASIC、十進モード、27行) @“C:\prime1000000.TXT”(HDDに出力) REM *** エラトステネスのふるい let t0=time LET F$ = "C:\prime1000000.TXT" OPEN #1 : NAME F$ ERASE #1 LET N=1000000 DIM A(N) FOR I=1 TO N LET A(I)=0 NEXT I LET A(1)=1 LET D=2 100 FOR I=D*D TO N STEP D LET A(I)=1 NEXT I 200 LET D=D+1 IF A(D)=1 THEN 200 IF D>SQR(N) THEN 300 GOTO 100 300 FOR I=1 TO N IF A(I)=1 THEN 400 LET K=K+1 PRINT #1:I; 400 NEXT I CLOSE #1 print time-t0;"sec" END A“F:\prime1000000.TXT”(フラッシュメモリに出力) (1)のプログラムの3行目を“LET F$ = "C:\prime1000000.TXT"”から“LET F$ = "F:\prime1000000.TXT"”に書き換える。 (2)実行結果を画面に出力するプログラム(十進BASIC、十進モード、27行) (1)のプログラムの23行目“PRINT #1:I;”を“PRINT I;”に書き換えます。 3、実行結果 上記のプログラムを実行したときの実行時間はそれぞれ (1)実行結果をファイルに出力するプログラム @“C:\prime1000000.TXT”(HDDに出力): 10.13 sec A“F:\prime1000000.TXT”(フラッシュメモリに出力):7.97 sec (2)実行結果を画面に出力するプログラム: 687.94 sec 4、考察 実行結果をHDDのファイルに出力する場合と、画面に出力する場合では、実行時間は前者より後者の方が約69倍長いことが判った。 また、フラッシュメモリを使えばもっと実行時間を短くすることが出来ることが判った。 今回の検証結果から、実行結果のファイル出力は実行時間の短縮に大いに役立つと言えよう。 |
└十進BASICにはテキストファイルの内容を視認... 荒田浩二 2008/02/02 17:09:05 ツリーへ
Re: エラトステネスの篩とその実行結果のファイル出力と実行時間の短縮 |
返事を書く ノートメニュー |
荒田浩二 <knrztrhoel> 2008/02/02 17:09:05 | |
十進BASICにはテキストファイルの内容を視認したり書き換えたりできるTextWindowという独自の拡張機能があります。
これを利用するとPRINT文よりはるかに早く出力できます。 また、裏技的ですが通常のPRINT文で画面に出力する場合にもテキスト出力画面を閉じると、画面への印字処理の負担がなくなるためか実行時間が短くなります。 あと、プログラムの後半を手を加えました。ごめんなさい。 REM *** エラトステネスのふるい LET t0=TIME OPEN #1 : TextWindow1 ERASE #1 LET N=1000000 DIM A(N) !BASICでは変数や配列の初期値は0なので次の3行は不要 !FOR I=1 TO N ! LET A(I)=0 !NEXT I LET A(1)=1 LET D=2 DO FOR I=D*D TO N STEP D LET A(I)=1 NEXT I DO LET D=D+1 LOOP WHILE A(D)=1 LOOP UNTIL D>SQR(N) FOR I=1 TO N IF A(I)<>1 THEN LET K=K+1 PRINT #1:I; END IF NEXT I CLOSE #1 print time-t0;"sec" END |
└規格上,BASICでは変数や配列の初期値が0で... 白石 和夫 2008/02/02 17:25:58 (修正1回) ツリーへ
Re: 十進BASICにはテキストファイルの内容を視認... |
返事を書く ノートメニュー |
白石 和夫 <ynwythjfwu> 2008/02/02 17:25:58 ** この記事は1回修正されてます | |
規格上,BASICでは変数や配列の初期値が0であるとは決まっていないのでご注意ください。それぞれのBASICが定める方法で,一貫したやり方で初期化されることになっています。
|