第22講 完全数の探索
第4話 メルセンヌ素数を利用した完全数の5番目までの探索
図3
実現するプログラム例
Private Sub CommandButton1_Click()
  
  Dim i As Integer, cn As Byte, w As Long
  cn = 0
  Cells(4, 5) = "n"
  For i = 2 To 20
    w = 1
    For j = 1 To i
      w = 2 * w
    Next
    w = w - 1
    If sh(w) = 1 Then
      For j = 1 To i - 1
        w = 2 * w
      Next
      cn = cn + 1
      Cells(4 + cn, 1) = cn
      Cells(4 + cn, 2) = "番目"
      Cells(4 + cn, 3) = w
      Cells(4 + cn, 5) = i
      If cn = 5 Then
        Exit Sub
      End If

    End If
  Next

End Sub

Function sh(w As Long)

  Dim i As Long, a As Long
  If w = 1 Then
    sh = 0
    Exit Function
  End If
  If w = 2 Then
    sh = 1
    Exit Function
  End If
  
  a = Sqr(w)
  For i = 3 To a Step 2
    If w Mod i = 0 Then
      sh = 0
      Exit Function
    End If
  Next
  sh = 1
  
End Function

Private Sub CommandButton2_Click()

  Rows("4:2000").Select
  Selection.ClearContents
  Range("A1").Select
  
End Sub
参考ダウンロード添付ファイル


このプログラムでも残念ながら、
5番目までの完全数しか探索できません。
      If cn = 5 Then
        Exit Sub
      End If

を外すと残念ながらオーバーフローします。
つまり、今回の方法を使ったとしても8桁の完全数が限界です。
より、大きな完全数を見いだすためには、
n進数の研究を続けるしかありませんが、
そのときのために次話において、
図2図1
が素数であるかどうかを判定する方法として、
リュカテストがあることを紹介しておきましょう。
n進数の研究を進めて
足し算・引き算に加えて
かけ算、割り算、平方根の計算まですすめて、
メルセンヌ数が素数であるかを判定できるようになっても、
求められる完全数の桁数は20桁もいきません。
20桁クラスのメルセンヌ数になると、
素数判定に大変時間がかかるからです。
しかし、
リュカテストを使うと効率的に素数判定ができるようになり、
770桁の完全数まで探索できるようになります。

第3話へ 第5話へ
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入門へ
本サイトトップへ