第10講 素数探索
第3話 素数探索ももっとの初歩のプログラム例
・・・
を実現するプログラム例
#! ruby -Ks
def sh(a)
cn=0
for i in 1..a
if a%i==0 then
cn+=1
end
end
if cn==2 then
return 1
else
return 0
end
end
cn=0
for i in 1..10000
if sh(i)==1 then
if i<10
print " ", i," "
else
if i<100 then
print " ", i," "
else
if i<1000 then
print " ", i," "
else
print i," "
end
end
end
cn+=1
if cn>1 && cn%20==0 then
print "\n"
end
end
end
print "\n"
print "見つかった素数の個数は",cn,"個です。\n"
参考ダウンロード添付ファイル
さて、この原始的なプログラムを少しずつ改良していきましょう。
13が素数であることを判定するのに、
1,2,3,4,5,6,7,8,9,11,12,13で割り、
割り切ることの出来る数が2個だから、
素数であると判定していますが、
実は、2,3で割り切れれば素数と判定できます。
1では割り切れるに決まっていますから、
まず、1が除外されます。
では、4以上はどうして除外してよいのでしょうか。
約数の性質を考えて下さい。
例えば、12の約数は
1,2,3,4,6,12
です。
(1,12)、(2,6)、(3,4)はどうなっていますか。
お互いに割ったときの商になっています。
()内の数は相棒です。
とすれば、片割れだけを探せばよいですね。
13の場合は(1,13)が約数です。
ある数以下の約数が1しかないことが判明できれば、
それは素数です。そのある数とは何でしょうか。
13に場合は、3です。
どうしてでしょうか。
4×4=16
3×3=9
ですよね。
同じ数を2回かけることを2乗といいます。
同じ数を3回かける場合は、3乗ですし、
10回なら10乗です。
4の2乗が16で、
3の2乗が9ですから、
2乗して13になる数は、
3と4の間の数ということになります。
つまり、3.・・・・という小数です。
2乗して13になる数をという記号で表し、
ルート13と呼びます。
ですから、
=3.・・・・というわけです。
先ほどのある数以下のある数とは、です。
この数以下の整数ですから、3まで調べればよいのです。
どうしてルート以下の整数かといいますと、
9の約数を考えて下さい。
1,3,9
しかありません。
=3ですね。
(1,9)、(3,3)
3は3自身が相棒です。
つまり、相棒の片割れ(小さい方)はあるとしても、
ルートまでなのです。
=3.・・・・
ですから、約数が整数であるという約束に反しますから、
相棒の片割れ(小さい方)は以下の整数で3までということになるのです。
では、Rubyではどのようにしてルートnを求めるのでしょうか。
=n**(1/2.0)
です。
(これは、nの1/2乗という意味です。
でも、難しいことは考えずに小学生の皆さんは、
n**(1/2.0)でnのルートが求まるのだと理解して下さい。)
さて、改善しましょう。
改善効果を調べるために2つのバージョン共に時間計測をするようにしましょう。
旧バージョンの場合
新バージョンの場合
かなり速くなります。
第2話へ 第4話へ
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
vba 2013 2010 2007 入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門第1部へ
本サイトトップへ