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

 最近は、テレビにYoutubeを流している事が多いのですが、あるときに予備校の先生みたいな人が数学の面白い話をしている動画が流れていて、思わずチャンネル登録をしてしまいました。きっかけとなった動画で紹介されていたのが「コラッツの問題」でした。

「コラッツの問題」とは…

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

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

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

という法則がすべての正の整数について成り立つのではないかという予想がされています。予想ということで、本当に成り立つのかはまだ証明されていないとのこと。詳細はWikipediaに詳しいことがあるので興味があれば調べてみてください。

計算するの面倒なのでプログラムで計算しよう

 動画内で実際にある正の整数について最終的に1になることを検証していましたが、とても大変そうでした…。自分で計算するのは面倒なので、プログラムを書いてしまおうと思いました。言語は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')

これを実行すると…

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

という感じに計算できました。スタートが25でも23回の計算が必要でした。スタートを1,000にすると計算回数は111、10,000だと計算回数は29になりました。1,000で計算回数がぐっと増えて、10,000になると計算回数が逆に減るという面白い結果となりました。

 数学なんて全く興味なかったけど、なんか面白い!ということで次回、プログラムを改良して計算関数の傾向がわかるグラフを出力したいと思います。