🦔

【数学】コラッツ予想を解きたい!15

2022/11/06に公開

前回のまとめ

前回は、ループ集合 L について、四則から構成される Q という見方もできることを見ました。

Thm:ループ集合の二面性

ループするものからなる集合 L \in \mathbb{J} と巡回列空間における有理数集合 Q \in \mathbb{J} について、

L = Q

目標

j_t(L) = L

を目標としていました。

どっから手を付けていくか。
ちなみに、

L \subset j_t(L)

は簡単です。
任意の t_o, t_e の並びの t^n について、

t^n(x) = x

となる x \in \mathbb{J} が存在するからです。

この事実を利用して、例えば、関数 j_t集合の大きさを変えないようなものだと言えれば、

L \subset j_t(L) \Rightarrow L = j_t(L)

となる、みたいなイメージです。
なお、集合の大きさというと通常は、集合の濃度(可算、不可算)みたいなざっくりとした話になりますが、今回はそれよりも強い概念として扱っていきます。

サイズ維持

任意の A \subset \mathbb{J} について、

j_t(A) \subset A \Rightarrow j_t(A)=A \\ j_t(A) \supset A \Rightarrow j_t(A)=A

みたいな感じが成り立てば、サイズが維持されているみたいなイメージでやってみます。

このとき、j_t についてどんなことが成り立ちそうでしょうか。

仮説1:巡回列生成関数は、全域でサイズ維持

任意の A \subset \mathbb{J} について、

j_t(A) \subset A \Rightarrow j_t(A)=A \\ j_t(A) \supset A \Rightarrow j_t(A)=A

仮説2:巡回列生成関数は、ループ集合でサイズ維持

任意の A \subset L について、

j_t(A) \subset A \Rightarrow j_t(A)=A \\ j_t(A) \supset A \Rightarrow j_t(A)=A

仮説1が一番強いです。
ただ、仮説2が成り立つかどうかすら分かりません。

そもそも、

仮説:ループする要素を起点とする巡回列はループするか

巡回列空間上で

t(x) = \left\{ \begin{align*} x/2 \quad & (x \in E) \\ \frac{3x-1}{2} \quad & (x \in O) \end{align*} \right.

と定義する。
このとき、j_t(L) = L か?

この目標にしている仮説すら成り立つかどうかはわかりません。。。

ほとんどの L の要素については成り立つことは分かるんですけどね。

L \subset j_t(L)

から、もし a \in Lj_t(a) \notin L となる要素があったら、j_t の全単射性より、

j_t^{-n}(a) \in L

とすべて L の要素になる、また全単射性より、これらはすべて相異なる。
よってもし1つのループしないものがあったら、それに対応する無限個のループするものがあることが分かる。
またこの無限個のループは他のループしない要素 b があったとすると、

j_t^{-n}(b) \in L

とは別の要素になります。これも全単射性より分かります。
なので目標の仮説はおおよそ成り立ちそうという感じはしています。

ただ、仮説1や仮説2は成り立つのでしょうか?

仮説2の検証

もし仮説2が正しいとすると、任意の a \in L について、

A = \{\ a,\ j_t(a),\ j_t^2(a),\ j_t^3(a),\ j_t^4(a),\ ... \ \}

と定義すると、

j_t(A) \subset A

が成り立ちます。
よって、仮説2より、(仮説2より導かれる仮説3より、A \subset L なので)

j_t(A) = A

となる。これは、任意の a \in L について、\exists n \in \mathbb{N},\ a = j_t^n(a) が成立することを意味する。

これが実際に成り立つか見てみましょう。
a=1 のときをまずは見てみます。

a = 1 = 1,\ 0,\ 0,\ 0,\ 0,\ ... の巡回列は、

\begin{align*} t(1) &= \frac{3 \cdot 1 - 1}{2} = 1 \\ \end{align*}

より、1,\ 1,\ 1,\ 1,\ ...

j_t(a) = -1 = 1,\ 1,\ 1,\ 1,\ ... の巡回列は、

\begin{align*} t(-1) &= \frac{3 \cdot (-1) - 1}{2} = -2 \\ t(-2) &= \frac{-2}{2} = -1 \end{align*}

より、1,\ 0,\ 1,\ 0,\ 1,\ 0,\ ...

j_t^2(a) = -1/3 = 1,\ 0,\ 1,\ 0,\ 1,\ 0,\ ... の巡回列は、

\begin{align*} t(-1/3) &= \frac{3 \cdot (-1/3) - 1}{2} = -1 \\ t(-1) &= \frac{3 \cdot (-1) - 1}{2} = -2 \\ t(-2) &= \frac{-2}{2} = -1 \end{align*}

より、1,\ 1,\ 0,\ 1,\ 0,\ 1,\ 0,\ ...

j_t^3(a) = 1/3 = 1,\ 1,\ 0,\ 1,\ 0,\ 1,\ 0,\ ... の巡回列は、

\begin{align*} t(1/3) &= \frac{3 \cdot (1/3) - 1}{2} = 0 \\ t(0) &= \frac{-2}{2} = 0 \end{align*}

より、1,\ 0,\ 0,\ 0,\ 0,\ ...

よって、a = 1 のとき、j_t^4(a) = a となる。
他にも成り立つかどうか見てみましょう。

ソースコード
python
m_ori = -5
n_ori = 1

# 最大のt^nの検索項数
N = 200

print("a =", m_ori, "/", n_ori)

m = m_ori
n = n_ori

J=[[m, n]]
chi_J=[]
start_loop_num= [0]

def func_t(j0, j1):
    if(j0 % 2):
        chi_J.append(1)
        return (3*j0-j1) // 2
    chi_J.append(0)
    return j0 //2

def check_eq(a, s):
    for j in J:
        if(j[0] == a[0] and j[1] == a[1]):
            s[0] = J.index(a)
            return True
    J.append(a)
    return False

for c in range(10):
    for i in range(N+1):
        m = func_t(m, n)
        if(check_eq([m, n], start_loop_num)):
            break
        if(i == N):
            print("error: does not loop")

    m = 0
    for i in range(start_loop_num[0], len(chi_J)):
        m -= chi_J[i] * 2**(i-start_loop_num[0])
    n = 2**(len(chi_J)-start_loop_num[0])-1

    i=start_loop_num[0]
    while(i > 0):
        if(chi_J[i-1] == 1):
            m = 2*m+n
        else:
            m = 2*m
        i -= 1

    print(m, "/",  n)
    print("junkairetu for x/2 and (3x-1)/2 : ")
    print(start_loop_num[0], chi_J)

    J=[]
    J.append([m, n])
    chi_J=[]
    start_loop_num[0] = 0

a = -5 = 1,\ 1,\ 0,\ 1,\ 1,\ 1,\ 1,\ ... の巡回列は、

\begin{align*} t(-5) &= \frac{3 \cdot (-5) - 1}{2} = -8 \\ t(-8) &= \frac{-8}{2} = -4 \\ t(-4) &= \frac{-8}{2} = -2 \\ t(-2) &= \frac{-8}{2} = -1 \\ t(-1) &= \frac{3 \cdot (-1) - 1}{2} = -2 \end{align*}

より、1,\ 0,\ 0,\ 0,\ 1,\ 0,\ 1,\ 0,\ ...

j_t(a) = -13/3 = 1,\ 0,\ 0,\ 0,\ 1,\ 0,\ 1,\ 0,\ ... の巡回列は、

\begin{align*} t(-13/3) &= \frac{3 \cdot (-13/3) - 1}{2} = -7 \\ t(-7) &= \frac{3 \cdot (-7) - 1}{2} = -11 \\ t(-11) &= \frac{3 \cdot (-11) - 1}{2} = -17 \\ t(-17) &= \frac{3 \cdot (-17) - 1}{2} = -26 \\ t(-26) &= \frac{-26}{2} = -13 \\ t(-13) &= \frac{3 \cdot (-13) - 1}{2} = -20 \\ t(-20) &= \frac{-20}{2} = -10 \\ t(-10) &= \frac{-10}{2} = -5 \\ t(-5) &= \frac{3 \cdot (-5) - 1}{2} = -8 \\ t(-8) &= \frac{-8}{2} = -4 \\ t(-4) &= \frac{-8}{2} = -2 \\ t(-2) &= \frac{-8}{2} = -1 \\ t(-1) &= \frac{3 \cdot (-1) - 1}{2} = -2 \end{align*}

より、1,\ 1,\ 1,\ 1,\ 0,\ 1,\ 0,\ 0,\ 1,\ 0,\ 0,\ 0,\ 1,\ 0,\ 1,\ 0,\ ...

a = -3187/3 = 1,\ 1,\ 1,\ 1,\ 0,\ 1,\ 0,\ 0,\ 1,\ 0,\ 0,\ 0,\ 1,\ 0,\ 1,\ 0,\ ... の巡回列は、、、

と続いていきますが、あんまりどこかでループする感じはしないです。

となると、仮説2はおそらく間違っていそうですね。
目標にしている仮説すら、間違っている可能性もあるような気がしてきました。。。

ということで、以下のようなコードを書いて、調査してみました。
下のコードだと、-0/407-399/407 について調査して、そのすべてがループしていることを確認できています。

他にもいろいろな数値でやってみましたが、すべての有理数の巡回列はループしてくれるみたいですね。

ソースコード
python
m_ori = 1
n_ori = 407

N=1000

print("a =", m_ori, "/", n_ori)

m = m_ori
n = n_ori

J=[[m, n]]
chi_J=[]
start_loop_num= [0]

def func_t(j0, j1):
    if(j0 % 2):
        chi_J.append(1)
        return (3*j0-j1) // 2
    chi_J.append(0)
    return j0 //2

def check_eq(a, s):
    for j in J:
        if(j[0] == a[0] and j[1] == a[1]):
            s[0] = J.index(a)
            return True
    J.append(a)
    return False

for c in range(400):
    m = -c
    J=[]
    J.append([m, n])
    chi_J=[]
    start_loop_num[0] = 0

    for i in range(N+1):
        m = func_t(m, n)
        if(check_eq([m, n], start_loop_num)):
            print(start_loop_num[0] + 1, "-", len(J), end=", ")
            break
        if(i == N):
            print()
            print("************")
            print("error: does not loop")
            print("************")

なので、j_t(L) = L という仮説は正しいという方針で、これを示すのを目標にする構築をしたいですね。

今後の方針

今後の方針の1つの候補として、今までの方針を踏襲してやっていくとすると、

L \subset j_t(L)

とプラスアルファ何かを追加して、

j_t(L) = L

を示したいところです。

今まで見たように、

任意の A \subset L について、

j_t(A) \supset A \Rightarrow j_t(A)=A

というのは成り立たなさそうですが、この検証を無駄にせず発展させることを考えてみましょう。

↓これを発展してやってみたら次のようになりました。。。

同じ発想でやってみた場合

任意の A \subset L について、

j_t(A) \supset A \Rightarrow j_t(A)=A

が成り立たないのに。 j_t(L)=L は成り立つということから、j_t に対してどのような見方をすればいいかが少しだけ分かってきたと思います。

つまり、j_t^n という発想はあまりよろしくない、ということです。

なぜ良くないのか?
おそらく、j_tj_t: \mathbb{J} \rightarrow \mathbb{J} という巡回列空間から巡回列空間への写像ですが、意味合い的には異なる巡回列空間を繋げるようなものだからでしょう。

j_t は、奇数を 1、偶数を 0 として扱っていますが、当然、奇数を 0 として偶数を 1 としても問題ないわけです。j_t^n とすると、ここら辺の対称性を無視したようなやり方になってしまっています。

そこで、次のように発想を変えてみるというのは思いつきます。

j_t(O) = O \\ j_t(E) = E

なのですが、これを直接考えるのではなく、

\mathrm{next}(j_t(O)) = \mathbb{J} \\ \mathrm{next}(j_t(E)) = \mathbb{J} \\

なことに着目して、\mathrm{next} \circ j_t による巡回列生成関数

j_{\mathrm{next} \circ j_t}

を考えてみるという発想です。
ただこれも、\mathrm{next} を追加しただけなので、ループしないでしょう。(検証してみましたが、やはりダメそうでした)

ちなみに、前回のお話から、

t = j_t^{-1} \circ \mathrm{next} \circ j_t

なので、\mathrm{next} \circ j_t = j_t \circ t とも書けます。

そして、よく考えたら、逆方向も考えられますね。

つまり、

t(O) = \mathbb{J} \\ t(E) = \mathbb{J}

なので、

\mathrm{next}_o^{-1}(t(O)) = O \\ \mathrm{next}_e^{-1}(t(E)) = E \\

とでき、これを j_s とみなすと、

\begin{align*} s &= j_s^{-1} \circ \mathrm{next} \circ j_s \\ &= t^{-1} \circ \mathrm{next} \circ \mathrm{next} \circ \mathrm{next}^{-1} \circ t \\ &= t^{-1} \circ \mathrm{next} \circ t \end{align*}

となる。
この発想はあるかもしれません。

計算してみると、

x \in O,\ t(x) \in O のとき、

s(x) = (2 \cdot \frac{(3x-1)/2-1}{2}+1)/3=\frac{a-1}{2}+\frac{1}{3}

x \in O,\ t(x) \in E のとき、

s(x) = 2 \cdot \frac{(3x-1)/2}{2}= \frac{3x-1}{2}

x \in E,\ t(x) \in O のとき、

s(x) = (2 \cdot \frac{x/2-1}{2}+1)/3= \frac{(3x-1)/2}{2}=\frac{x}{6}

x \in E,\ t(x) \in E のとき、

s(x) = 2 \cdot \frac{x/2}{2}= \frac{x}{2}

となる。
これがループすることは大小関係を見れば簡単に分かりますね。唯一大きくなる x \in O,\ t(x) \in E についても、s(x) \in E となるので、s^2 まで考えれば小さくなるからです。
これを使って考えていくとすると、次のようなものは考えられます。

仮説3:

任意の A \subset L について、

j_s(A) \subset A \Rightarrow j_s(A)=A \\ j_s(A) \supset A \Rightarrow j_s(A)=A

という仮説が成り立つということは、任意の a \in L について、a=j_s^n(a) となる n が存在するということになります。

j_s = \mathrm{next}^{-1} \circ t

だったので、これは t ではなく \mathrm{next}^{-1} \circ t について考えているという意味合いになります。

→ただ、これもやってみるとループしないっぽいですね。。。

ちょっと無理そうです。。。
そもそも考えるべきことは、別のことかもしれません。
コラッツ予想では「3」という数字が出てきますが、今までは「3」であることを使わずにやってきました。こっからは「3」であることを何かしらの方法で利用するようなことを考えるべきなのかもしれません。

まずは少し検証してみましょう。

検証

今までちゃんとやっていませんでしたが、

t(x) = \left\{ \begin{align*} x/2 \quad & (x \in E) \\ \frac{5x-1}{2} \quad & (x \in O) \end{align*} \right.

にすると、どうなるのでしょうか?

x = -7

から始まる巡回列はどうやらループしないようですね。
その他、いろいろループしないものがありそうです。

ソースコード
python
m_ori = -7
n_ori = 1

N=10000

print("a =", m_ori, "/", n_ori)

m = m_ori
n = n_ori

J=[[m, n]]
chi_J=[]
start_loop_num= [0]

def func_t(j0, j1):
    if(j0 % 2):
        chi_J.append(1)
        return (5*j0-j1) // 2
    chi_J.append(0)
    return j0 //2

def check_eq(a, s):
    for j in J:
        if(j[0] == a[0] and j[1] == a[1]):
            s[0] = J.index(a)
            return True
    J.append(a)
    return False

for i in range(N+1):
    m = func_t(m, n)
    if(check_eq([m, n], start_loop_num)):
        print(start_loop_num[0] + 1, "-", len(J), end=", ")
        break
    if(i == N):
        print()
        print("************")
        print("error:", J[0], "does not loop")
        print("************")
        print("last_m", N, ":", m)

おそらく、コラッツ予想が収束するのは、

\frac{3}{2} \cdot \frac{1}{2} < 1

という条件を満たしているからでしょう。
このことを何かしらの方法で抽象化して、使っていきたいですが、「3」以外に条件を満たすものがないんですよね。。。

例えば

t(x) = \left\{ \begin{align*} x/2 \quad & (x \in E) \\ \frac{x/3-1}{2} \quad & (x \in O) \end{align*} \right.

とすると、分母が変わってきてしまうので、普通にループしないものがあるという話です。

あと、一応、

t(x) = \left\{ \begin{align*} 3x/2 \quad & (x \in E) \\ \frac{x-1}{2} \quad & (x \in O) \end{align*} \right.

と、3倍をつける位置を逆にするという発想はありますが、意味に乏しそうです。(一応やってみると、予想通りちゃんとループはしてそうです)

あと、考えてみたいのは、

t(x) = \left\{ \begin{align*} x/3 \quad & (x \equiv 0 \mod 3) \\ \frac{5x-1}{3} \quad & (x \equiv 2 \mod 3) \\ \frac{x-1}{3} \quad & (x \equiv 1 \mod 3) \end{align*} \right.

という風に条件分岐を増やすという展開です。

これもやってみると、ループしそうです。

ソースコード
python
m_ori = 1
n_ori = 1

N=1000

print("a =", m_ori, "/", n_ori)

m = m_ori
n = n_ori

J=[[m, n]]
chi_J=[]
start_loop_num= [0]

def func_t(j0, j1):
    if(j0 % 3 == 2):
        chi_J.append(2)
        return (j0-j1) // 3
    if(j0 % 3 == 1):
        chi_J.append(1)
        return (7*j0-j1) // 3
    chi_J.append(0)
    return j0 //3

def check_eq(a, s):
    for j in J:
        if(j[0] == a[0] and j[1] == a[1]):
            s[0] = J.index(a)
            return True
    J.append(a)
    return False

for c in range(400):
    m = -c
    J=[]
    J.append([m, n])
    chi_J=[]
    start_loop_num[0] = 0

    for i in range(N+1):
        m = func_t(m, n)
        if(check_eq([m, n], start_loop_num)):
            print(start_loop_num[0] + 1, "-", len(J), end=", ")
            break
        if(i == N):
            print()
            print("************")
            print("error: does not loop")
            print("************")

同様に試してみると

t(x) = \left\{ \begin{align*} x/3 \quad & (x \equiv 0 \mod 3) \\ \frac{x-1}{3} \quad & (x \equiv 2 \mod 3) \\ \frac{7x-1}{3} \quad & (x \equiv 1 \mod 3) \end{align*} \right.

もループしそうですが、

t(x) = \left\{ \begin{align*} x/3 \quad & (x \equiv 0 \mod 3) \\ \frac{5x-1}{3} \quad & (x \equiv 2 \mod 3) \\ \frac{7x-1}{3} \quad & (x \equiv 1 \mod 3) \end{align*} \right.

はループしなさそうでした。
これは、

\begin{align*} \frac{5}{3} \cdot \frac{1}{3} \cdot \frac{1}{3} &< 1 \\ \frac{1}{3} \cdot \frac{7}{3} \cdot \frac{1}{3} &< 1 \\ \frac{5}{3} \cdot \frac{7}{3} \cdot \frac{1}{3} &> 1 \end{align*}

となっているからでしょう。
この発想が正しいかを確認するために、

t(x) = \left\{ \begin{align*} x/3 \quad & (x \equiv 0 \mod 3) \\ \frac{5x-1}{3} \quad & (x \equiv 2 \mod 3) \\ \frac{5x-2}{3} \quad & (x \equiv 1 \mod 3) \end{align*} \right.

も考えてみましたが、これも問題なく収束するようです。

なので、次回からは、このような条件を満たすということを使っていくことを考えていくつもりです。今回はこのあたりで。ではでは。

Discussion