2022-10-14

素数を求める(その5)

  今までに改良してきたプログラムは、素数か
どうか調べたい数字nをそれより小さい数字iで
割ってみて余りがあるかどうかで判定している
が、全てのiで割った後、1個以上割れる数字が
有った時に素数と判断している。
 今回はiで割る時割り切れる数字が1個見つ
かったら、すぐに次のnを調べるようにする。
 こうすれば、素数でないと分かった後の無駄
な計算をする事を省ける。
その方法は、図のようにbreak;を入れるだけ
で済む。
 これにより、2秒かかった計算が0.5秒に
なった。「素数を求める(No.1)」のプログ
ラムからの改善の結果、
N=100,000の時
 素数の数:9,592個
 処理時間:14,119 ms
 処理回数:4,999,850,001回
であったのが、今回の改善「素数を求める(その5)」
のプログラムでは、
N=100,000の時
 素数の数:9,592個
 処理時間:518 ms
 処理回数:  113,970,448回
N=1,000,000の時
 素数の数:78,498個
 処理時間:36,915 ms
 処理回数:  9,395,812,778回
にする事が出来た。

因みに、「素数を求める(No.1)」のプログラム
に、break;を入れた場合は
N=100,000の時
 素数の数:9,592個
 処理時間:1051 ms
 処理回数:227,995,678回
N=1,000,000の時
 素数の数:78,498個
 処理時間:77,986 ms
   処理回数:18,792,164,730回
であった。

尚、「素数を求める(No.1)」のプログラム
に、break;を入れなかった場合には
N=1,000,000の時
 素数の数:78,498個
 処理時間:708,240 ms (約12分)
 処理回数:249,999,000,001回

0 件のコメント:

コメントを投稿

円周率を求める (その7)

 円周率を求めるにあたり、どうしても変数に許 されるメモリー上の制限がある。これにより通常 の変数は15桁迄となっている。  JAVAでは、その制限に対する解決策として、 BigIntegerクラスの整数型の変数が使えるので、 これを使って、より高精度な円周率を求めてみる  これ...