10日目 コラッツ予想をシミュレーションしよう【30日間1日1本マクロ生活】

30日間1日1本マクロ生活、10日目です。

ついに10日目。我ながら頑張ってます。3分の1に到達しました。

引き続き、褒めてくれてもいいんですよ。内容が面白くなくても、続いていることに価値があります。はい。

まあ、頑張って30日間続けますよ。

コラッツ予想

マクロを書く準備は、0日目に記事を書きました。

今日のネタは、コラッツ予想という数学の問題です。

コラッツ予想とは、全ての自然数 n に対して

  • n が偶数のときは2で割る
  • n が奇数のときは3倍して1を足す

そうしてできた数に、同じルールを繰り返していくと最後は必ず1になる、というものです。

数学の世界でも未解決

コラッツ予想は、数学の世界でも未解決の問題です。

この予想が「正しい」とも「間違っている」とも結論が出ていないんです。

世の中には、とんでもなく頭のいい人たちがいるんです。

数学の世界で、信じられないような発想を当たり前のようにしてしまう大天才がたくさんいるんです。

とてもとても同じ人類とは思えない。そういう人々をわたしは数学奇人と呼んでます。

そんな頭の良い人たちが寄ってたかって取り組んでも、この単純な問題が解決できないんです。

数学って本当に奥が深いですよね。

コラッツ予想をシミュレーション

Cells(1,1)に数値を入力し、マクロを実行すると、上のコラッツ予想の操作を繰り返し、1になったところで終了させます。

さっそくコードを


Sub コラッツ予想()
    y = 1
    Do Until Cells(y, 1) = 1
        n = Cells(y, 1)
        If n Mod 2 = 0 Then
            Cells(y + 1, 1) = n / 2
        Else
            Cells(y + 1, 1) = 3 * n + 1
        End If
        
        y = y + 1
    Loop
End Sub

では、解説します。

Do Until

昨日までは「Do While」をよく使っていましたが、今日は「Do Until」を使ってみました。

Whileは後ろに続く条件が「正しい」ときにループが続きます。

Untilは後ろに続く条件が「間違っている」ときにループが続きます。

今回の例では「Do Until Cells(y,1)=1」ですから、Cells(y,1)が1になった時点でループが終わります。

この問題に最適な使い方ですね。

Mod

「n Mod 2」は「nを2で割った余り」と読みます。

2で割ったあまりが0ならば、偶数ですよね。そうでなければ奇数です。

実行結果

マクロを記述するウィンドウの「Sub」と「End Sub」の間にカーソルを置いて、画面上方の再生ボタン的なアイコン(右向きの三角形)をクリックするか、[F5]キーを押します。

このように、ルール通りの操作が繰り返されています。

最初の数字が425の例ですが、58回の操作で1になりました。

現在ではコンピュータの計算で 5 \times 2^{60} までは、すべて1にたどり着くことが確認されています。

5 \times 2^{60} はとんでもなく大きな数ですが、それだけ調べても「だから全部1にたどり着く」という結論にはなりません。

もしかしたら、その次の数でできなくなるかもしれませんからね。

Excelは便利

悔しいですが、Excelは便利です。

Microsoftにお金を払うのは癪でしょうがないんですが、Excelばかりは仕方がない。

マクロを書くようになると、Excelからは離れられないですね。

30日間、頑張ります。