第10講 素数探索

第3話 素数探索ももっとの初歩のプログラム例
06567
                 ・・・
05798
を実現するプログラム例
#! 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という記号で表し、
ルート13と呼びます。
ですから、
ルート13=3.・・・・というわけです。
先ほどのある数以下のある数とは、ルート13です。
この数以下の整数ですから、3まで調べればよいのです。
どうしてルート以下の整数かといいますと、
9の約数を考えて下さい。
1,3,9
しかありません。
ルート9=3ですね。
(1,9)、(3,3)
3は3自身が相棒です。
つまり、相棒の片割れ(小さい方)はあるとしても、
ルートまでなのです。
ルート13=3.・・・・
ですから、約数が整数であるという約束に反しますから、
相棒の片割れ(小さい方)はルート13以下の整数で3までということになるのです。

では、Rubyではどのようにしてルートnを求めるのでしょうか。
ルートn=n**(1/2.0)
です。
(これは、nの1/2乗という意味です。
でも、難しいことは考えずに小学生の皆さんは、
n**(1/2.0)でnのルートが求まるのだと理解して下さい。)
さて、改善しましょう。
改善効果を調べるために2つのバージョン共に時間計測をするようにしましょう。
旧バージョンの場合
旧バージョン
新バージョンの場合
新バージョン
かなり速くなります。

第2話へ 第4話へ
004



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部へ
本サイトトップへ