• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Fortranの素数のプログラム)

Fortranで実行時間を短縮する素数のプログラム

このQ&Aのポイント
  • Fortranで5000万までの素数を求めるプログラムの実行時間を短縮する方法を教えてください。
  • 私の作ったプログラムは実行時間が26秒かかってしまいますが、先生によると10秒台が可能だと言われました。
  • 下に私の作ったプログラムを載せていますので、どの部分を改善すればよいか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.1

ちょっといじってみました。 integer table(2:50000000) / 499999999*0 / integer cnt / 49999999 / integer m integer i, j m=int(sqrt(50000000.))+1 do 20 i=2,m if(i .gt. 2 .and. mod(i,2) .eq. 0 ) go to 20 if(i .gt. 3 .and. mod(i,3) .eq. 0 ) go to 20 if(i .gt. 5 .and. mod(i,5) .eq. 0 ) go to 20 if(i .gt. 7 .and. mod(i,5) .eq. 0 ) go to 20 do 10 j=i*2,50000000,i if(table(j) .eq. 0) then  table(j)=1  cnt=cnt-1 endif 10 continue 20 continue m=2を判定すれば偶数はすべてチェック完了でしょ。4や6のループは不要で、これだけで計算量は半減です。ついでに3や5、7位まではやっておきましょう。 then~endif構文を使うと煩雑なのでgotoにしてあります。 と思っていたら、もっとスマートなのが do 20 i=2,m (table(i) .eq. 0) then  do 10 j=i*2,50000000,i  if(table(j) .eq. 0) then   table(j)=1   cnt=cnt-1  endif 10 continue endif 20 continue こちらはどうしてうまくいくか考えてみてね あと、まず変数はdata文や宣言文で初期化しましょう。 FORTRANの言語仕様では宣言だけした変数の値は不定で、処理系に依存します。実際は0クリアされていることが多いですが、こういうのに頼ってはいけません。

miu65
質問者

お礼

4や6のループは不要というのでわかりました。 私はk=i-(i/2)*2を使って、2以外の偶数を省くというやり方でやりました。 そしたら13秒とかなり早くなりました。 ありがとうございました。

関連するQ&A