コラッツ予想|【コード付き】Pythonでプログラミング作成してみた!!
【対象年次:中学一年~】
みなさんこんにちは!
中高生にも分かる数学のお時間です。
今回は数学上の未解決問題である「コラッツ予想」に関するお話をしたいと思います。
まず、コラッツ予想とはどんなものであるかご覧ください。
というものです。
これだけ言われてもわかりにくいと思うので、例題を考えてみましょう。
まず、17は奇数なので次の自然数は
となります。
この生成された自然数である26は偶数なので次の自然数は、
となりますね。
これを繰り返していくと、
という感じになります。
おおー!最終的には1になりましたね!
ちなみに矢印の個数が操作の回数なので17は9回の操作で1になるんですね。
(計算は自分でやってみてくださいね)
さて、これを見てもらうとわかるのですが
ある自然数が奇数だったときの次の自然数は増加しており、
ある自然数が偶数だったときの次の自然数は減少していますよね。
どういうことかというと、
のように左の自然数(計算前の自然数)が奇数なら、右の自然数(計算後の自然数)は左の自然数より大きく、
のように左の自然数が偶数なら、右の自然数は左の自然数より小さくなることが分かります。
これは奇数のときの操作、偶数のときの操作を見れば一目瞭然です。
という計算を行うので、自然数は大体倍され、
という計算を行うので、自然数は倍されるわけです。
このことから確率論的にはこの「コラッツ予想」は正しいと予測できます。
その理由を説明しましょう。
まず、自然数に対して何回か操作を繰り返したとします。
このとき
という事実を利用すると、奇数である際に行われる操作倍と偶数である際に行われる操作倍が大体同じ回数行われるはずなので、その回数をとすると、操作後にはは
という大きさになっているはずですね。
ここで操作の回数を増やしていくとはどんどん大きくなっていき、
それに従ってはどんどん減少していくことが分かります。
(これは、がの増加に従って減少するからです!)
よって何回も操作を行えば、 = はどんどん小さくなっていくので、
最後には1になるだろうと期待できるのです。
ですが、これはあくまでも確率的にそうなるだろうと予想できるだけであって、
実際にこの予想の正しさとは全く無関係であることには注意しなくてはいけません。
最初に選ぶ自然数によっては、操作後の数が奇数になることが多く倍される回数の方が優位になり、最終的にはどんどん大きくなって1にならない可能性も残されているのです。
また、操作を行っているうちにループが起こって1になることは永遠にないかもしれません。
このようにこの「コラッツ予想」は確率的なアプローチ以外で解決しなくてはならないのです!
というわけで、その第一歩として「Python」を使って、このコラッツ予想を研究するためのプログラムを作成しました。
以下の画像は以下の自然数に対して何回の操作で1になったかを示したものです。
各括弧の中に記載された情報は
[,]となっています。
先ほど例として示したは、確かに[,]となっているのが分かりますね。
さて、この表を見ていて気付くこととしては、
ということだと思います。
例としてはいくつもありますが、
[,],[,]や3つ並んだ[,],[,],[,]、
さらには交互に5つ連続で並んだ[,],[,],[,],[,],[,]などもあります。
これらの数の並びは偶然というにはあまりに出来すぎていると思います。
きっとこの裏には何か興味深い真実が隠されているのでしょう…!
また、以下の自然数に対して
横軸に,縦軸にをとったグラフを描くと以下のようになります。
比較的の値がの間に落ち着いている中、たまに突出しての値が大きな場合が現れていますね。
また、以下の自然数に対しても同様のグラフを描くと、
のようになります。
さっきより突出したの値は多くなっていますが、の大きさ自体はそこまで跳ね上がっているようには見えませんね。
そしてさらに飛んで以下の自然数に対しても同様のグラフを描きました。
激しく振動して塗りつぶされた青い領域はゆがんだ長方形のように見えます。
の振れ幅がそれほど大きくなっているようには見えず、上限があるようにも見えます。
を大きくしていくと、いつかの平均は頭打ちになるのでしょうか?
ううむ、興味深い…。
というわけでプログラミングを使うと膨大な量の計算ができるので、手計算では分からないようなことに気づくことができました!
今回の結果から予想できることを今度は数式を用いて証明していけたらいいなと考えております!
では最後に「Python」に使用したコードを貼っておきます。
私的利用の範囲でしたら、お使いいただいて構いませんのでよろしくお願いいたします!
import math import matplotlib.pyplot as plt import sys sys.setrecursionlimit(2000) def collatz(n): if n == 1: return True elif n % 2 == 1: return (3*n+1)/2 elif n % 2 == 0: return n/2 def c_process(n,RANGE=1000): lst = [] for i in range(1,RANGE+1): if n == 1: lst.append(i-1) return lst break elif n % 2 == 1: lst.append(1) elif n % 2 == 0: lst.append(2) n = collatz(n) def c_count(n,RANGE=1000): for i in range(1,RANGE+1): if n == 1: return i-1 break n = collatz(n) def c_staired(n): lst = [] for k in range(2,n+1): lst.append([c_count(k),k]) return lst def p_staired(n): lst = [] for k in range(2,n+1): lst.append(c_count(k)) return lst def c_plot(n): k = [ k for k in range(2,n+1) ] m = [] for c in p_staired(n): if c == None: m.append(0) else: m.append(c) plt.plot(k,m) plt.grid(color='grey') plt.show() print(m)
「中高生にも分かる数学」では数学が苦手な人にも非常に分かりやすい記事を心がけています。
他にもいくつか記事があるので、ご覧いただけると嬉しいです!
では、また他の記事でお会いしましょう!