6

コラッツ予想に関する予想について

969
1

はじめに

どうもこんにちは.皆さんは,過去に投稿した記事 コラッツ予想に関する予想の提案 という記事をご覧になられたことがあるでしょうか.この記事では,

c(n)={n2if 2|n3n+1otherwise

としてc(f(n))(n)の漸近的な挙動について,二つの予想をしていました.

c(n)(n)7288c(n)(n)3830704
が予想されている.ただし等号については,上の式はn=63,下の式はn=8510で起こる.

つまり,nに対してCollatz変換をn回,あるいはn回繰り返すことを考えると,Collatz変換で大きくなる速度よりも小さくなる速度のほうが大きい,ということになります.それに対して,次のこともわかっています.

自然数nに対する関数
c(lnn)(n)
は,有界ではない.

つまり,仮にc(f(n))(n)が有界になるとすれば,そのようなfは代数関数オーダーであろうということになります.逆に有界でないときの条件はどのようになるのでしょうか.仮に有界だとして,その上限はどのような挙動をするのでしょうか.これについて考えていきたいと思います.

数値計算

というわけで数値計算を行っていきます.実際に関数を考えたときに有界であるときの上限を与えるのは困難(というか,与えることができてしまったらその時点でCollatz予想が解決してしまいます)なので,証明することはできないと思います.まず,次のような定義をします.

実数kに対して
an=c(n1/k)(n)
で定まる数列anを考える.この数列の上限と上限を与えるような整数nがただ一つであるとき,その数nとその上限をu1(k),u2(k)で表し,組(u1(k),u2(k))u(k)で表す.

つまり現状の予想では,

u(1)=(63,7288),u(2)=(8510,3830704).

ということになります.直感的にはkが大きくなるとu(k)の各要素は大きくなっていくので,どこかでuの何らかの要素が定義できない(発散する)という気がしますし,逆に増大し続けるけれど値がちゃんと定まるという感じもします.前者については厳密に論証することは不可能ではなさそうですが,これもやはり難しそうな気はします.ここまで定式化しておけば数値計算していけそうです.k<0のとき,0<n1/k<1なので,0回合成(恒等写像)になってしまって面白くないので,k>0のときを考えます.数値計算によって,次の結果を得ました.(0.1ごとに区切っているだけ)

ku1(k)u2(k)
0.511
0.632
0.738
0.8314616
0.9413238
1637288
1.1943644
1.22319232
1.33539232
1.470337624
1.570355667
1.61249167002
1.72631250504
1.842551212064
1.956733830704
285103830704
2.14512726404378
2.260975150343370
2.32702714386828320
2.43603614868756126
2.560811116432051930
2.6104243184503790916
2.7480975922559788912
2.82643183169297616428
2.91963839913445132519231
339276798306296925203752

u1(k)についての計算はk=3のときはa100000000までの計算で,k<3についてはa50000000までの計算です.利用したソースコードとしては前回のをほとんどそのまま利用していて,次のようになっています.(つまりこの表はプログラムから得られた結果の一部分でしかないです)

      import math
def c(n, steps):
    num = n
    for _ in range(steps):
        if n == 1:
            break
        if n % 2 == 0:
            n //= 2
        else:
            n = 3 * n + 1
        num = n
    return num
def main(st, ste, ed, ede, ex):
    try:
        max = 0
        for i in range(st * pow(10,ste), ed * pow(10,ede)+1):
            ulam = c(i, math.floor(pow(i, 1/(ex))))
            if ulam > max:
                max = ulam
                print([i,max])
        print("end")
    

基本的な部分は前回書いた記事と同じで,合成回数の部分だけいじった感じですね.

予想&考察など

先に挙げた数値計算による予想から,次の予想を立てました.

k0.9であるとき,ある定数A,Bがあって
kB+Alnlnui(k)(i=1,2)
となるであろう.

参考にしたグラフが こちら です.uiに対する,Bの値をAi,Biのように書くことにして,その値の近似値としては,
A11.38042B11.07106A21.42515B21.95844
くらいになりそうです.これだけ見てもへぇ~という感じですが,何かこれがいい感じの定数に収束したりするんでしょうか.

個人的にはkをより大きくした時により精密な評価を与えたい(考えている区間が小さすぎるので一次近似くらいしかできない)ので,k>4の時の挙動も知りたいのですが,計算量に大きく寄与するu1が二重指数関数程度で増大するので少し厳しそうです...効率的なアルゴリズムがあればいいのですが...

例えば,当初期待していた性質として,k<lであるならばui(k)ui(l)という性質がありました.これが正しいなら大きくなったところでui(l)を計算するために必要な計算量をui(k)の分削減できるので多少なりとも楽になるのですが,残念ながらそうもいきませんでした.見てみるといくつか値が逆転しているところがありますね.大小関係が逆転するという現象が,有限回しか発生しないような例外的な現象なのか,それとも何度も起こるありふれた現象なのかもよくわかりません.このことについて予想するためにはより大規模な計算を行う必要があると思います.

ただし,kの幅のみ小さくしたとしても,一度床関数を合成しているのでkの違いが小さすぎると差が出なくなるのでkの値を大きくする方向にも計算をしていく必要があると思います.これをするには計算量の壁が大きすぎるので,個人的にはプログラム自体の改良が必要だと思っていて競技プログラミングをやっているような人に協力を仰ぎたい,というのも個人的にはあります.

もう一つ個人的に気になるのが,現在計算した近傍で二重指数関数程度で増大しているように見えますが,これが一体どうしてなのだろうかというのがあります.これに関しては個人的によくわからなかったので,直感的な説明が与えられるといいですね.

投稿日:2024916
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

級数

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中