第22講 素数探索を題材としたマルチスレッドプログラミングの学習
第2話 素数探索プログラミングのヒント

マルチスレッド対応プログラムによって、CPU使用率が100%になっている状態を最初に見て頂きましょう。

これをご覧になった読者の皆さんは、すぐにもマルチスレッドの方法を知りたいでしょうが、
少々お待ちください。
マルチスレッド対応プログラムの題材の方を先に示さなければならないからです。
今回の題材は、講の表題にあるように素数の探索です。
最初に、素数の探索をシングルスレッドでプログラミングしてから、
それをマルチ化します。

さて、素数と何でしたか。
2,3,5,7,11,13,17,・・・
といった数が素数ですね。
素数とは、1か自分自身でしか割りきれない数を言います。

素数であるかどうかを調べるにはどうしたらよいでしょうか。
例えば、151は素数でしょうか。
これを判定するには、
ルート151(つまり151の正の平方根)以下の素数で151を割っていって、
割り切れるものがあるかを調べれば分かります。
理由は、ルート151より大きい整数では151は割り切れません。
例えば、16の約数を考えると16を除けば1,2,4というようにすべてルート16以下です。
一般的にaの約数はaを除けばルートa以下なのです。
ルート151以下の素数だけで言い理由は、素数以外は必ず素因数分解できて、
素数の積で表せるので、もしルート151以下の整数で割りきれるとすれば、
必ずルート151以下の素数で割りきれます。
ルート151以下のすべての素数で割りきれれば151は素数でなく、
割り切れなければ素数です。

ルート151は、およそ12.3ですから、12以下の素数、すなわち2,3,5,7,11で割って、
割り切れれば素数でなく、割り切れなければ素数です。
151は奇数ですから、明らかに2では割り切れません。
2以外の素数はすべて奇数です。
偶数なら2で割り切れてしまうからです。
また、各位の数字の和は1+5+1=7ですから、3でも割り切れません。
1のくらいの数字は、1ですから5の倍数でもありません。
151÷7=21・・・4で7でも割り切れません。
151÷11=13・・・8で11の倍数でもありません。
結局、12以下のどの素数で割っても割りきれませんから、151は素数です。

したがって、配列a[N](Nは探索する範囲の上限)を用意して、
発見した素数をa[0]=2,a[1]=3,a[2]=5,a[3]=7,・・・などと素数を蓄えていって、
該当の整数を蓄えた素数で割りきれるかどうかを調べればよいことになります。
a[0]=2だけは偶数なので、
これは手動で入れて、
3以上の奇数について、for文で素数であるか判定していけばよいことになります。
const int N=1000000000;
int i;
a[0]=2;
for(i=3;i<N;i+=2){
     ・
     ・
     ・


それから、素数を蓄えていって割る方法以外に
整数の平方根以下の奇数で割っていって、
割り切れるかどうかを調べる方法もあります。

皆さん、2つのプログラミングをしてどちらが速いか、調べてみてください。
一見すると素数を蓄えていって割る方法の方が速そうですが、
実際にはどうでしょうか。

シングルで速い方を採用し、それをマルチスレッド化します。

では皆さん、ビルドして実行すると下のようになるようにプログラミングしてみてください。

尚、データグリッドビューについては第15講 関数の再帰的呼び出し☆
第8話 DataGridViewによる順列作成ソフトの改良その1から第10話 DataGridViewによる順列作成ソフトの改良その3
までを参照してください。参照された場合には、ブラウザの戻るで戻ってください。






第22講第1話へ 第22講第3話へ



VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座