第13講 素数探索
第7話 3以外の3の倍数も探索対象から外すと?
前話解答例
Dim cn As Long
Dim s(10000000) As Long
Private Sub CommandButton1_Click()
  
  Call CommandButton2_Click
  Dim i As Long, a As Long, cns As Long
  Dim hj As Single, ow As Single
  hj = Timer
  s(0) = 2
  cn = 1
  Cells(6, 1) = 2
  For i = 3 To 10000000 Step 2
     If i Mod 3 = 0 Then
      i = i + 2
      If i > 10000000 Then Exit For
    End If
    If sh(i) = 1 Then
      a = cn Mod 200
      cns = Int(cn / 200)
      Cells(6 + cns, 1 + a) = i
      s(cn) = i
      cn = cn + 1
    End If
  Next
  ow = Timer
  Cells(4, 1) = "素数生成にかかった時間は"
  Cells(4, 5) = ow - hj
  Cells(4, 6) = "秒です。"
  Cells(5, 1) = "生成された素数は"
  Cells(5, 4) = cn
  Cells(5, 5) = "個です。"

End Sub
Function sh(a As Long)

  If a = 1 Then
    sh = 0
    Exit Function
  End If
  If a = 2 Then
    sh = 1
    Exit Function
  End If
  If a Mod 2 = 0 Then
    sh = 0
    Exit Function
  End If
  Dim q As Long, i As Long
  q = Int(Sqr(a))
  For i = 0 To cn
    If s(i) > q Then
      sh = 1
      Exit Function
    End If
    If a Mod s(i) = 0 Then
      sh = 0
      Exit Function
    End If
  Next
  sh = 1
  
End Function

Private Sub CommandButton2_Click()

  Range("4:50000").Select
  Selection.ClearContents
  Cells(1, 1).Select
  
End Sub


実行例

参考ダウンロード添付ファイル

すべて探索する場合
007

2以外の偶数を検索対象から外した場合
05

今回のコードでは思ったような成果は出ませんでした。
ですが、ちょっと工夫すると

0.5秒程度の圧縮に成功しました。
工夫のヒント書きましょう。
5,7,
,11,13,15,17,19,21,23,25,27,29,31,33,・・・
色のついている数字が検索対象から、外すものです。
上の数字の列を3つに分類してみましょう。
5,11,17,23,29,・・・
7,13,19,25,31,・・・
9,15,21,27,33,・・・
分類基準は明らかですね。
始まりの数字5,7,9で分類したわけですが、
3つのグループは、3で割ったときの余りが、
それぞれ2,1,0になるものです。
第3グループ自体は、すべて3以外の3の倍数ですから、
奇数ではありませんから、
このグループ全体をそもそも検索対象から外すべきですね。
では、皆さん考えてみて下さい。



第6話へ 第8話へ
004

eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ