第16講 素数探索
第2話 素数を探し出すためには?
では、素数を探索するプログラムを考えてみましょう。
素数であるかどうか、
決めるのはどうしたらよいでしょうか。
例えば、241は素数でしょうか。
1から241まで順に割っていって、
1と241のみでしか割り切れなければ素数です。
この方法だと、241が素数であることを確定するために、
241回も割り算をしなければなりません。
確かに、コンピュータの性能は驚くほどの能力を持っていますから、
241回は一瞬で行ってしまいます。
ですが、408135977等だと流石のコンピュータも苦戦します。
ですから、なるべく計算回数が少なくなるように工夫する必要があります。
1と自分自身は割りきれるに決まっていますから、
1と自分自身はまず除外します。
さらに、2以外の偶数は、すべて素数ではありませんから、
2以外の偶数で割る必要はありません。
ですから、例えば73なら
2,3,5,7,・・・,71
とうことになります。
実は、これでもかなり無駄があります。
18の1と自分自身を除く約数を考えてみて下さい。
2,3,6,9
です。
2で割ったときの商が9です。
さらに、3で割ったときの商が6です。
約数で割った商も約数です。
このことを考慮入れれば、
73の場合は、
2,3,5,7
で割り切れなければ素数であることが確定します。
最後が7である理由は、7の次の9の場合2乗すると、
9×9=81で73を越えています。
73が素数であることを確定するには、
ルート73以下の整数まで割っていけば良いのです。
では、この方針で素数生成プログラムを考えます。
はじめは、100以下の素数を生成させましょう。
表示は、10個ごとに表示させるようにして下さい。
条件は、関数f()で1から100までの整数iを発生させて、
発生させた整数が素数であるかを関数sh(i)で判定させ、
素数の解答がある場合に関数f()において表示させるものとします。
尚、iのルートを求めるにはmath.hをインクルードしておき、
sqrt((double)i)とします。
(double)iとなっているは、sqrtはdouble型でしか入力できないからです。
また、sqrtで出てくる値もdouble型であることに注意しましょう。
皆さん考えてみて下さい。
もちろん、これは最速ではありませんので
話の進行と共にどんどん改良していきます。
第1話へ 第3話へ
eclipse c++ 入門講義第1部へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ