学習2020.11.28

Pythonを触る:数学の未解決問題「コラッツの問題」

Pythonを触る:数学の未解決問題「コラッツの問題」

コラッツの問題を題材に、Pythonで計算するプログラムを書いた学習記録です。

SPONSORED

最近はテレビでYouTubeを流していることが多いのですが、あるとき数学の面白い話をする動画が流れ、思わずチャンネル登録をしました。そこで紹介されていたのが「コラッツ予想」です。

この記事では、コラッツ予想の計算をPythonで試したときのコードと結果を紹介します。数学やPythonを学び始めた人が、簡単な条件分岐と繰り返し処理を試す題材として読める内容です。

1. コラッツ予想とは

「ある正の整数について、

  • 偶数ならば、2で割る。
  • 奇数ならば、3をかけて、1を足す。

を繰り返すと最終的に1になる。」

という操作を繰り返すと、どの正の整数から始めても最終的に1へ到達する、という予想です。この記事を更新した時点でも一般には未解決問題として扱われています。

2. Pythonで計算する

動画内では、ある正の整数が1になるまでを手計算で確かめていました。自分で繰り返すのは大変なので、Pythonでプログラムを書いてみました。当時作ったコードをそのまま載せます。

Python
#collatz コラッツの問題
while True:
    print('start')
    i = 0
    val = input('enter a number:')
    n = int(val)

    while n > 1:
        i += 1
        r = n % 2
        if r == 0:
            n = n / 2
        elif r == 1:
            n = n * 3 + 1
        else:
            print('error!')
            break
        print(i, ':', n)
    print('end\\n')

これを実行すると…

Text
tanakaeru $ python collatz.py
start
enter a natural number:25
1 : 76
2 : 38.0
3 : 19.0
4 : 58.0
5 : 29.0
6 : 88.0
7 : 44.0
8 : 22.0
9 : 11.0
10 : 34.0
11 : 17.0
12 : 52.0
13 : 26.0
14 : 13.0
15 : 40.0
16 : 20.0
17 : 10.0
18 : 5.0
19 : 16.0
20 : 8.0
21 : 4.0
22 : 2.0
23 : 1.0
end

3. 実行結果から分かったこと

このように計算できました。25から始めると23回、1,000では111回、10,000では29回で1に到達しました。開始値が大きいほど計算回数も増えるとは限らないところが面白い結果です。

なお、このコードでは偶数を / で割っているため、Python 3では途中から38.0のような浮動小数点数で表示されます。整数のまま扱うなら、整数除算の//を使う方法があります。

4. まとめ

数学にはあまり興味がなかったのですが、実際にプログラムで試すと面白く感じました。次はコードを改良し、開始値と計算回数の傾向をグラフで見てみたいと思います。