難易度:★☆☆(かんたん)
※当校のExcel VBAコースを補足する内容となっています。
コラッツ予想って何?
ドイツのコラッツという数学者が提唱した、
「どんな自然数(正の整数)も、偶数なら2で割り、奇数なら3倍して1を足す。この操作を繰り返せば、やがて必ず1になる」
という予想です。「3n+1問題」とも呼ばれます。
小学生でも理解できる文章なのに、世界の数学者たちがこれが正しいのか間違っているのか解決できず、ずっと悩んでいるのです。
どんな自然数も?本当に?ちょっとやってみよう。
たとえば「3」なら…「3→10→5→16→8→4→2→1」
「6」なら…「6→3→10→5→16→8→4→2→1」
「13」なら…「13→40→20→10→5→16→8→4→2→1」
確かにどれも1になったよ。
「27」を計算してみましょう。
えっと…
「27→82→ 41→ 124→ 62→ 31→ 94→ 47→ 142→ 71→ 214→107→322→161→484→242→121→364→182→91→274→137→412→…
自分で計算するのは疲れるよー合ってるのかも分からないし…
そこで便利なのがプログラム。
計算してくれるプログラムを作って、コラッツ予想を体感してみましょう。
ちなみに「27」は111回計算すると、ちゃんと「1」になりますよ。
コラッツ予想
セル「B1」に入力した自然数が偶数なら2で割り、奇数なら3倍して1を足して、その結果をセル「B4」に出力します。
セル「B4」の値に対して、偶数なら2で割り、奇数なら3倍して1を足すという計算を繰り返し、1つ下のセルに出力していきます。
その操作を繰り返していき、結果が「1」になれば終了します。
Sub Collatz予想()
Dim i As LongLong
Dim Cnt, E_Row As Long
With ActiveSheet
If .Range("A3") <> "" Then
E_Row = .Cells(Rows.Count, 1).End(xlUp).Row
.Range(.Cells(3, 1), .Cells(E_Row, 2)).Clear
.Range("B:B").NumberFormatLocal = "#,##0"
End If
.Range("A3") = "回数"
.Range("B3") = "値"
i = .Range("B1")
Cnt = 1
Do While (i > 1)
.Cells(Cnt + 3, 1) = Cnt
.Cells(Cnt + 3, 2) = i
If i Mod 2 = 0 Then
i = i / 2
Else
i = i * 3 + 1
End If
Cnt = Cnt + 1
Loop
.Cells(Cnt + 3, 1) = Cnt
.Cells(Cnt + 3, 2) = i
End With
End Sub
いくつかの数字を入力して実行してみたけど、どの数も1になるね。
プログラムを使うと一瞬で計算してくれるからすごい!
でも本当に全ての自然数で成り立つのかな…?
本当にすべての自然数が1になることを証明するか、
反例となる数字を見つけて間違っていると証明できれば
1億円以上の賞金が出るよ!
え?本当に?見つけてみようかな!
実はコンピュータの計算で21桁までは成り立つことが分かってるけど、VBAではそこまでの巨大な数はエラーになってしまいます。他の方法で発見したらぜひ教えてくださいね!