4以上の偶数は、2つの素数の和で書けるという命題が正しいことを、小さい偶数から調べて行き、反例があったら止まるプログラム

4以上の偶数は、2つの素数の和で書ける、という命題を初めて私が見たのは、もう35年以上前であり、中学生のときでした。『ゲーデル、エッシャー、バッハ』という本を読んでいて出会いました。その本は、ゲーデルの不完全性定理の紹介を目的とした本でしたが、整数にかんする命題で、現時点で真とも偽とも言えない命題の例として使われていました。これは、ゴールドバッハ予想といい、それから35年くらいが経過する現在でも、未解決問題であるようです。

例を挙げますね。4は2たす2であり、6は3たす3であり、8は3たす5であり、10は3たす7でもいいですし、5たす5でもいいわけです。このように、あらゆる4以上の偶数は、2つの素数の和で書けるのではないかという予想です。

そして、中学生であった私はそのころ、家にあった古いパソコンで、BASICというものを知っており、この命題を、小さい偶数の順に、正しいかどうか調べ、反例があったら止まるプログラムを書きました。

ずっとのちのことです。四半世紀以上の年月が過ぎ、2017年、私が41歳のとき、私は勤めていた学校で、情報科の実習助手をさせられていました。このとき、プログラミングの授業があったのです。高校2年生の皆さんが、プログラミングに取り組んでいます。私も書いてみました。このとき、中学のときに書いた上記のプログラムのことを思い出し、書いてみました。書けました。中学のときの自分に追いついた気がしたものです。生徒さんのなかで、このプログラムを書ける生徒さんはおらず、かろうじて「与えられた数未満の素数をすべて出力する」というプログラムを書いた生徒さんは、京都大学へ現役合格なさったと聞いています。

それからまた時間が経過します。私は何回かの休職と配置換えを経て、2020年から長い休職となりました。2021年、就労移行支援事業所と言われる障害者福祉で、エクセルを学びました。それで、VBAという言語を学び、みたびこのプログラムを書きました。以下にコードをさらしますね。

Sub ゴールドバッハ予想()
Dim a As Long
    Dim b As Long
    Dim aa, bb As String
    Dim i As Long
    Dim j As Long
    Dim p As Long
    Dim q As Long
    Dim n As Long
    Dim m As Long
    Dim s As Long
    Dim i2 As Long
    Dim n2 As Long
    Do
        aa = InputBox(“いくつから始めますか。4以上の整数を入力してください。”)
        a = Int(Val(aa))
    Loop Until a Mod 2 = 0 And a >= 4
    Do
        bb = InputBox(“いくつまで調べますか。入力された数以下の整数まで調べます。”)
        b = Int(Val(bb))
    Loop Until b >= a
    Range(“A1”).Select
    Do While a <= b
        Do While i <= a
            For i = 2 To a
                n = 0
                For j = 1 To i
                    If i Mod j = 0 Then
                        n = n + 1
                    End If
                Next
                If n <= 2 Then
‘                   ここは非常に想像通りのものが出た。ここまでは間違っていない
‘                   ActiveCell = i
‘                   ActiveCell.Offset(1).Activate
                    p = i
                End If
‘            Next
‘            ActiveCell = p
‘            ActiveCell.Offset(1).Activate
                q = a – p
                If q <= 1 Then
                    MsgBox “反例が見つかりました!” & a & “です!”
                    Exit Do
                End If
                n2 = 0
                For i2 = 1 To q
                    If q Mod i2 = 0 Then
                        n2 = n2 + 1
                    End If
                Next
                If n2 <= 2 Then
                    ActiveCell = a & “=” & p & “+” & q
                    ActiveCell.Offset(1).Activate
                    Exit Do
                End If
            Next
        Loop
        If q <= 1 Then
            Exit Do
        End If
        a = a + 2
    Loop
End Sub

それから、このプログラムを走らせたところをご覧に入れます。一部分です。

小さい素数の順で調べていますので、こうなるわけです。これだけ見ますと、いかにも成立しそうな予想ですね?

整数を扱う数学の分野は、私の専門分野ではありませんが(私の大学院での専門は位相幾何学でした)、このようなプログラムを書いていたこともあるというお話でした。よろしければ皆さんも書いてみてくださいね。それではまた!

目次