【数学】コラッツ予想を解きたい!15
前回のまとめ
前回は、ループ集合
Thm:ループ集合の二面性
ループするものからなる集合
目標
を目標としていました。
どっから手を付けていくか。
ちなみに、
は簡単です。
任意の
となる
この事実を利用して、例えば、関数
となる、みたいなイメージです。
なお、集合の大きさというと通常は、集合の濃度(可算、不可算)みたいなざっくりとした話になりますが、今回はそれよりも強い概念として扱っていきます。
サイズ維持
任意の
みたいな感じが成り立てば、サイズが維持されているみたいなイメージでやってみます。
このとき、
仮説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
この目標にしている仮説すら成り立つかどうかはわかりません。。。
ほとんどの
から、もし
とすべて
よってもし1つのループしないものがあったら、それに対応する無限個のループするものがあることが分かる。
またこの無限個のループは他のループしない要素
とは別の要素になります。これも全単射性より分かります。
なので目標の仮説はおおよそ成り立ちそうという感じはしています。
ただ、仮説1や仮説2は成り立つのでしょうか?
仮説2の検証
もし仮説2が正しいとすると、任意の
と定義すると、
が成り立ちます。
よって、仮説2より、(仮説2より導かれる仮説3より、
となる。これは、任意の
これが実際に成り立つか見てみましょう。
より、
より、
より、
より、
よって、
他にも成り立つかどうか見てみましょう。
ソースコード
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
より、
より、
と続いていきますが、あんまりどこかでループする感じはしないです。
となると、仮説2はおそらく間違っていそうですね。
目標にしている仮説すら、間違っている可能性もあるような気がしてきました。。。
ということで、以下のようなコードを書いて、調査してみました。
下のコードだと、
他にもいろいろな数値でやってみましたが、すべての有理数の巡回列はループしてくれるみたいですね。
ソースコード
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("************")
なので、
今後の方針
今後の方針の1つの候補として、今までの方針を踏襲してやっていくとすると、
とプラスアルファ何かを追加して、
を示したいところです。
今まで見たように、
任意の
について、 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
が成り立たないのに。
つまり、
なぜ良くないのか?
おそらく、
そこで、次のように発想を変えてみるというのは思いつきます。
なのですが、これを直接考えるのではなく、
なことに着目して、
を考えてみるという発想です。
ただこれも、
ちなみに、前回のお話から、
なので、
そして、よく考えたら、逆方向も考えられますね。
つまり、
なので、
とでき、これを
となる。
この発想はあるかもしれません。
計算してみると、
となる。
これがループすることは大小関係を見れば簡単に分かりますね。唯一大きくなる
これを使って考えていくとすると、次のようなものは考えられます。
仮説3:
任意の
について、 A \subset L j_s(A) \subset A \Rightarrow j_s(A)=A \\ j_s(A) \supset A \Rightarrow j_s(A)=A
という仮説が成り立つということは、任意の
だったので、これは
→ただ、これもやってみるとループしないっぽいですね。。。
ちょっと無理そうです。。。
そもそも考えるべきことは、別のことかもしれません。
コラッツ予想では「3」という数字が出てきますが、今までは「3」であることを使わずにやってきました。こっからは「3」であることを何かしらの方法で利用するようなことを考えるべきなのかもしれません。
まずは少し検証してみましょう。
検証
今までちゃんとやっていませんでしたが、
にすると、どうなるのでしょうか?
から始まる巡回列はどうやらループしないようですね。
その他、いろいろループしないものがありそうです。
ソースコード
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)
おそらく、コラッツ予想が収束するのは、
という条件を満たしているからでしょう。
このことを何かしらの方法で抽象化して、使っていきたいですが、「3」以外に条件を満たすものがないんですよね。。。
例えば
とすると、分母が変わってきてしまうので、普通にループしないものがあるという話です。
あと、一応、
と、3倍をつける位置を逆にするという発想はありますが、意味に乏しそうです。(一応やってみると、予想通りちゃんとループはしてそうです)
あと、考えてみたいのは、
という風に条件分岐を増やすという展開です。
これもやってみると、ループしそうです。
ソースコード
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("************")
同様に試してみると
もループしそうですが、
はループしなさそうでした。
これは、
となっているからでしょう。
この発想が正しいかを確認するために、
も考えてみましたが、これも問題なく収束するようです。
なので、次回からは、このような条件を満たすということを使っていくことを考えていくつもりです。今回はこのあたりで。ではでは。
Discussion