「4以上の偶数は必ず2つの素数の和で書けるのか」。この問いは、私は中学のときに読んだホフスタッター『ゲーデル、エッシャー、バッハ』という本で知りました。言いたいことはつぎのようなことです。4は2+2と書けます。2は素数です。6は3+3と書けます。3は素数です。8は3+7と書けます。7は素数です。10は3+7と書いてもいいですし、5+5と書いてもいいです。5も素数です。このようなことです。これがあらゆる偶数で言えるでしょうか。問いそのものの主張することは中学生でもわかりますが、これを「できます」と証明した人もいなければ「この偶数はできません」と示した人もいないそうです。これはゴールドバッハ予想と言われ、未解決問題です。30年以上前に私がその本を読んだころ未解決問題で、2022年3月15日現在でも未解決問題らしいです。
そのころ、私は父からBASICの基礎を習いました。私はプログラミングにハマりました。およそ世の中でプログラミングできそうなことはした覚えがありますが、この予想の反例(成り立たない例)を見つけるプログラムも書きました。それは中学のころです。10代前半ですね。それから私は大学に行き、大学院に行き、発達障害の二次障害である精神障害にやられて数学者の道を閉ざされ、30歳である地方都市の私学の教員になったら徹底的に向いていなくて、11年、教員を勤めたあげく、事務員にさせられました。その教員の最後の年に、情報の実習助手を1年間、務めました。ちょうどいまから5年くらい前、2016年度の3学期、プログラミングの授業があり、私は41歳になっていましたが、そのプログラムをもう一度、書くことができました。よくわかりませんが、PENとかいう言語だった気がします。高校2年生の授業でしたが、そのとき、私のこのプログラムを書くことのできる生徒さんはいませんでした。かろうじてそれよりずっとやさしい「入力された数以下の素数をすべて出力する」というプログラムを書いた生徒さんは、京都大学に現役合格したものです。この話は前回の話と重なっていてすみません。
そして、障害者として就労移行支援事業所に通いながら学んだエクセル。ようやく私はVBAを理解しました。私は空気で理解することは極端に苦手ですが、逆に論理的に説明を受けるとよく理解できるのです。学生時代に勉強ができた(正確には勉強しかできなかった)のも、これが原因です。私は異様に学歴が高いですが、多くの人が普通にできることがほとんどできない「障害者」なのです。その就労移行のテキストは極めて論理的に、空気の読めない人でも理解できるように、まるで障害者向けのように書かれており、私にはそのテキストは向いていました。私が覚えた手数は少ないですが(IfとForとDoくらいではないかと)、だいたいエクセルのマクロで書けることはほとんど書けるようになってしまいました。そして、46歳になり、そのゴールドバッハ予想のプログラムをみたび書くことができました。半日くらいで書けたと思います。この記事のサムネにスクショをはっておりますが(字が細かすぎたら申し訳ございません)、このように、2000は3+1997だったりするのです。小さい素数の順番に調べているので、こうなるわけですが、こう見ていると、いかにも成り立ちそうな予想です。しかし、証明した人はいないのですね。このプログラムで反例が出たら大変です。世界的な大発見になってしまいます(笑)。でも、世の中にはこういうプログラムを昼夜、走らせている研究者はいるでしょうけどね。もっとずっと大きい偶数まで確かめてあるでしょうね。
以下にコードをさらしますね。
Sub ゴールドバッハ予想()
Dim a As Long
Dim b As Long
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
a = InputBox("いくつから始めますか。4以上の整数を入力してください。")
Loop Until a Mod 2 = 0 And a >= 4
Do
b = InputBox("いくつまで調べますか。入力された数以下の整数まで調べます。")
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
Sub すべて消す()
ActiveSheet.Cells.Clear
End Sub