![見出し画像](https://assets.st-note.com/production/uploads/images/114823172/rectangle_large_type_2_e7d42f7edf3a88c0a570cc66bbb5dab7.png?width=1200)
C言語:素数生成2
前回の投稿からはや1ヶ月。忙しさにかまけてサボっていたプログラミングを再開した。 今回は、前回の試し割法をさらに改良し、高速化した。といっても、素数生成自体の改良は一つだけで、どちらかというと後述の処理速度の測定プログラムが今回のメインだ。
実は前回作った素数判定法、よくよく考えてみるとp²<nとなるpまでしか素数判定をする必要がなかったりする。
例えばn=53 とした時、7×7=49 11×11=121 となる。したがって、11以上の数×mとなるmは11未満の数に限られる。なので結局、7以下の素数で試し割りすればよいこととなる。
さて、ここで早速実行…と行きたいところだけれど、前回よりもどれくらい高速化できているのかが分からなければ、イマイチ達成感が得られない。
そこで今回は、実行時間の計測をできるように、さらにプログラムを改造した。
![](https://assets.st-note.com/img/1693388602083-1HZSsAnx8u.png?width=1200)
時間計測というのがまた曲者で、C言語さんは普通に時間を測らせてはくれない。なぜなら、秒数による計測を直接行うことができないからだ。
そのため、クロック数という値(内部処理の周波数)を秒数の代わりに使って、プログラム開始時から終了時までの経過時間を計測することとなる。
その値をCLOCK_PER_SEC(1秒あたりのクロック数)で割ると、秒単位の経過時間が取得できる。(時間くらい普通に測らせてくれよ…)
その実行結果がこちら。
![](https://assets.st-note.com/img/1694511427410-98sNJnwvlj.png?width=1200)
今回設定したn=600000の試行回数において、本プログラムの処理には0.53秒がかかっていたことが分かる。スクショを撮るのを忘れていたので画像は無いけれど、改良前のプログラムだと同じ試行回数で21.73秒もかかった。計算すると、前回より約41倍も高速化されたこととなる(もちろん試行回数が変われば倍率も変動するし、バックグラウンド処理などによって処理が重くなったりもするので、あくまで参考値)。
こんな感じで作ってみたけれど、素数生成にも少し飽きてきてしまった。そこで次は、「三角比の値を計算するプログラム」を作成してみようと思う。
基本的方針としては、テイラー展開をそのまんまコード化する感じで行こうと思っている。
スキマ時間を使ってプログラミングand文章作成をしているので、次回の投稿もご期待頂きたい。
この記事が気に入ったらサポートをしてみませんか?