【数字】コラッツ予想を解きたい!16
前回のまとめ
前回はいろいろ検証しましたが、最終的には「3」というものが満たすべき条件というのを考えるべきというところで終わりました。
追加する条件
「3」が満たす条件を抽象化したいところですがどのようにするべきでしょうか。
普通に考えると、
であることに加え、
「3」は分母に変更を加えないので、小さくなっていけば、収束することができるという2点でしょう。
ただ、2つも条件があるというのもなんか気持ち悪いし、スッキリ書くことはできないか・・・と思うと、1つありそうなことに気付きます。
とすると
ただ、このままだと、
なので、修正が必要です。
と定義すればこれは
同様に、
とすれば、
と書けるのではないでしょうか。
ただし、
つまり、OEの並び
となる。
解くための方針
コラッツ予想を解くためにどういう風な議論で解くのか。
発想としてはいろいろあると思いますが、僕のイメージは次のような方法です。
ループ集合
について、 L を何度作用させても収束しない要素があったとすると、その要素に作用させた t の比率は1:1に収束することを示す。 t_o, t_e
そのとき、上で考えた条件から、その要素の収束が言える。
なぜこのような方法が良さそうかというと、
ちなみにこのような議論が成り立つような
3倍ではなく5倍のやつや、
2てはなく3で割るタイプの関数とか。
とりあえず、こんな風に有理数範囲の演算なら、収束しない要素について、OE比率は1:1になりそうです。
四則演算を使わないで考えてみる
大まかな方針は見つかったとして、それじゃあこっからどうしていくか?
まずは、
OEの並び
が比率が1:1に収束するならば、任意の * について、ある a \in L が存在して、 n, m t_*^n(a) = t_*^m(a) となる。
という性質が、和や積を使ったものではないということに着目します。
コラッツ予想というものを、和、積を使わずに表現したときどうなるかを見てみて、視点を得ようと思います。
今考えている関数はすべて、第
つまり、関数を
┏━━0
┏━━0
┃ ┗━━1
start
┃ ┏━━1
┗━━1
┗━━0
こんな感じで倍々で増えていくような表現を用いて表せる。
上の例だと、
ということを表しているみたいな感じで表現できる。
このような形で、例えば
┏━━0(a)
start
┗━━1(a)
┏━━0(a)
0(a)
┗━━1(a)
┏━━1(b)
1(a)
┗━━0(b)
┏━━0(c)
0(b)
┗━━1(c)
┏━━0(a)
1(b)
┗━━1(a)
┏━━1(b)
0(c)
┗━━0(b)
┏━━0(c)
1(c)
┗━━1(c)
このような形で表現することができるようです。
これの意味としては、
┏━━0(a)
┏━━0(a)
┃ ┗━━1(a)
┏━━0(a)
┃ ┃ ┏━━1(b)
┃ ┗━━1(a)
┃ ┗━━0(b)
start
┃ ┏━━0(a)
┃ ┏━━1(b)
┃ ┃ ┗━━1(a)
┗━━1(a)
┃ ┏━━0(c)
┗━━0(b)
┗━━1(c)
という感じです。
は
start--> 1(a)--> 1(b)--> 0(a)--> 0(a)--> ...
より、
となる。
他には、
は
start--> 1(a)--> 0(b)--> 0(c)--> 0(b)--> 0(c)-->...
より、
となる。
他には、
は
start--> 1(a)--> 0(b)--> 0(c)--> 0(b)--> 1(c)--> 0(c)--> ...
より、
となる。
このような発想を用いれば、和や積を使わずに表現すること自体は可能です。
ただこれをどう扱っていくのかは難しいところです。
また、このような考察から、1つ非常に基礎的な関数を考えることもできます。
┏━━0
start
┗━━1
┏━━0
0
┗━━1
┏━━1
1
┗━━0
によって構築される関数です:
┏━━0
┏━━0
┃ ┗━━1
┏━━0
┃ ┃ ┏━━1
┃ ┗━━1
┃ ┗━━0
start
┃ ┏━━1
┃ ┏━━1
┃ ┃ ┗━━0
┗━━1
┃ ┏━━0
┗━━0
┗━━1
この関数を
を考えて、これの
例えば、
という感じになっていく。
ループはしなさそうてすが、考えたいところは、OE比率が1:1になってくれているかどうかというところである。
で、実際にやってみると、比率は1:1になってくれないようです。
ソースコード
N = 100
a = [1] * N
output = []
def u():
node_id = 0
for i in range(len(a)):
if(node_id == 0):
node_id = a[i]
else:
if(a[i] == 0):
a[i] = 1
else:
a[i] = 0
node_id = a[i]
return
def next():
output.append(a[0])
print(a.pop(0), end="")
for i in range(N):
u()
next()
となると、奇数と偶数で分けたらどうだろうと考えてみたくなります。
つまり奇数のときはこの
実際にやってみると、比率は1:1になりそうではあったのですが、連続して同じ数字が並ぶことが多すぎる感じでした。
これはどのように捉えるべきでしょうか。
OE比率は確かに1:1ではありそうですが、これでよいのでしょうか。
イメージとしては、OE比率が1:1であるとは、言い換えると、「ランダム」であるということです。
ランダムに0と1を選択していって、それをずっと続けていけば比率は1:1になって欲しい。
なればこそ、
このような「ランダム」かどうかという見方をした場合、上の例は満たさないということになります。
このことはどういうことを示唆しているのでしょうか。
コラッツ予想を四則演算を用いずに表現することはできますが、より本質的なのは四則演算を用いた表現である可能性が高いということです。
ランダムな列
今の僕のたちの方針としては比率1:1かどうかを判定したいのですが、そもそも比率1:1(ランダム)である要素の例を実は何も知らないという状況です。
ランダムになるっぽいな~、といっているだけで、じゃあ具体的にランダムな要素ってなんですかと言われたら、答えられない状況になります。
そこで1つ考えたいのは、「簡単なランダム列の例」があるかというところなわけです。
前の項ではうまく見つけられませんでしたが、実はもう1つ候補はありました:
これは第08回で少しみたものですが、よくよくみるとランダム性を獲得しているのではないでしょうか。
第08回抜粋
(3/2)^n はループするか
問:分割
を、 E \subset \mathbb{R} E = \sum_{i \in \mathbb{Z}}\ (2i-1,\ 2i \rbrack とし、
上でツリー \mathbb{R} を次のように定義する: T=\mathrm{Tree}(t) t(x) := \frac{3}{2} x このとき、
を起点とした巡回列 1 \chi_E(1),\ \chi_E(3/2),\ \chi_E(9/4),\ \chi_E(27/8),\ ... はループするか?
これは意外と難問ですか。
いや、そもそも...
コンピューターの力を借りて計算してみます。すると...
というような巡回列になります。
あまり規則性は感じられません。これはおそらくループしないでしょう。
これは、ランダムな列になっているような気もします。
ただ、、、これ、今みると正しくないかもしれません。何度も1.5倍しているので、誤差が蓄積してたり、数値が大きくなりすぎたりする危険もあります。。。
プログラムで回すなら、すべて整数で完結させるべきでしょうし、倍率もなるべく小さくした方がよさそうです。
このようなガウス記号を用いた1.01倍する関数の場合どうなるでしょうか。
ソースコード
a = 1000
count_E = [0]
count_O = [0]
count_EE = [0]
count_OE = [0]
count_EO = [0]
count_OO = [0]
def multiple_3over2(x):
return 101*x // 100
def judge_OE(x):
u = x % 2
if(u == 0):
count_E[0] += 1
print("0", end="")
return
count_O[0] +=1
print("1", end="")
return
def judge_OE_2(x, y):
if(x == 0):
if(y == 0):
count_EE[0] += 1
return
count_EO[0] += 1
return
if(y == 0):
count_OE[0] += 1
return
count_OO[0] += 1
return
old_a = 0
for i in range(1000):
a = multiple_3over2(a)
judge_OE(a)
if(i>0):
judge_OE_2(old_a, a%2)
old_a = a%2
print("")
print(a)
print("E, O:", count_E, count_O)
print("EE, OE, EO, OO:", count_EE, count_OE, count_EO, count_OO)
第1000項までやってみると以下のようになります。
それぞれ、0,1の個数は、
E, O: [498] [502]
00, 10, 01, 11の個数は、
EE, OE, EO, OO: [250] [247] [247] [255]
となって、いい感じに見えます。
今持っている方針は正しそうに思えてきました。とはいえ、この簡単な例ですら、実際に証明しようとしてもパッとはできないようです。。。
なんとなくイメージ的に、OE率が1:1だけを示そうとするのは難しくて、1:1:1:1とかもすべて同時に示すような方法が本質的なんじゃないかと思います。
つまり、解くためにはどうしたらよいか?
現状は、O,Eという分け方とOO,OE,EO,EEという分け方は別個にしか考えられませんが、同時に考える方法を模索するべきでしょうか。
とりあえ今回はこの辺りで。
合っているかどうかは別にして、今回は大まかな方針は得られたということで、終わりにしたいと思います。ではでは。
Discussion