デバッグなし一発修正で決めるはずだったが

この修正は本来デバッグなしで一発修正で決めるはずだったのだが,結局デバッグになってしまった.あちこちかなり微妙なところがあり,形式論理的なコード操作でカバーできなかった.

開始ノードを2に設定してコラッツ数列取得を実行して,IsCollatzNumberで停止する.この関数はNが偶数でないことを仮定している.⇒B面では原則として2倍数・3倍数を含むすべての整数を扱うとしているので,ここで停止するのは不規則動作だ.IsCollatzNumberは仮想木上のノード(長子ノード)をコラッツ数と認定する関数なので,偶数(コラッツ数ではない)は当然偽を返すべきだ.

この関数を呼び出しているGetCollatzNumberはNのコラッツ数つまり長兄ノードを求める関数で,IsCollatzNumberが偽の間はループするようになっているため,この論理では無限ループしてしまう.Nが偶数であるとき,Nの長兄ノードとして何を返せばよいのだろう?標準的なコラッツ木は偶数を含まないので,そもそもNはコラッツ木上に存在していないのではないか?偶数Mが2で割り切れなくなるまで2で除算することで得られる奇数NはMの親なのか?兄弟なのか?

3倍数は一般コラッツ木のノードだが,仮想コラッツ木上に存在する場合もあり,そうでない場合もある.3倍数は完全コラッツ木上には存在しない.3倍数は一般木のノードなので当然親ノードと兄弟ノードを持っている.2倍数は一般コラッツ木のノードではないが,完全木の終端ノードとして表示される場合がある.親ノードは任意の奇数ノードと考えられる.兄弟ノードはこの親ノードPを共有する偶数ノードと考えられる.Pの子ノードである奇数NとPを親とする偶数Mの関係は,言ってみれば異母兄弟のようなものではないだろうか?この意味では異母兄弟の奇数ノードの中の長兄ノードが偶数Mのコラッツ数であると言えないこともない.新版では2のコラッツ数列として以下を出力する.

2
1 [*1]

これは2=1×2^1という計算を表している.1の長子は5である.2と5の間には直接の接続関係は存在しない.もう少し大きい偶数を見てみよう.たとえば,12のコラッツ数列は下記のように表示される.

12
3 [*2]
5 [1]
1 [1]

これで見ると,12の親が3であることは明らかだ.しかし,アドレスコードは以下のように表記されている.

1. 1*2

標準的なアドレスコードは「.」で区切られた正数の並びであるから,上記のアドレスコードは

1.X

のように読まれるべきだろう.Xは詳細付番で1*2という区画を示しているが,完全木上の地番として考えれば,1.1というポイントを示していると考えるのが妥当だ.旧版では2倍数はコラッツ数列取得の対象から除外されているので,偶数が仮想木上でどのような位置を占めているのか(占めるべきか)は分明ではない.仮想木上では一般木上の実親子関係を拡張した「義理の親子関係(養親子関係)」によって木が構成される.つまり,長兄の甥姪ノードはすべて長兄の下に配置される.

話をできるだけシンプルにまとめるとしたら,完全木検定からすべての偶数を排除するというのがむしろ一番わかり易いかもしれない.そうしたからと言って,この論証の正当性はいささかも損なわれることはない.2倍数を含むすべての自然数を表現する汎用アドレスという考え方は魅力的ではあるが,いたずらに問題を難解なものにしているのではないか?アドレッシングという観点から問題をもう一度整理してみよう.

一般コラッツ木は,コラッツ写像(N→N/2,N→3N+1)によって自然に構成されるグラフ(コラッツグラフ)の簡約グラフであり,すべての偶数ノードとそれに隣接する枝を短絡・縮約して得られる奇数ノードのみからなる木である.一般コラッツ木上のノード位置(アドレス)は1からノードNに至る経路上の枝番号の並びによって標識される.一般コラッツ木にはすべての奇数がノードとして含まれる.

仮想コラッツ木は,一般コラッツグラフをさらに簡約したグラフで,同じ親ノードに接続する兄弟ノードはすべて1個の長子ノードに縮約されている.仮想コラッツ木の特徴は(完全)正則木を構成可能であるという点にある.ただし,この正則木にはやや変則的なところがあり,1の直下ノードは5しか存在しないため,厳密には「完全正則木」ではない.仮想コラッツ木はコラッツ数と呼ばれる奇数のみが含まれる.

完全コラッツ木は,一般コラッツ木から3倍数ノードを除去したものであり,完全正則木を構成することができる.汎用コラッツアドレスはこの完全コラッツ木を拡張して3倍数と2倍数を含むようにした「拡張コラッツ木」で定義されるアドレスコードシステムであると言える.完全コラッツ木には3倍数を除くすべての奇数ノードが含まれる.拡張コラッツ木には2倍数・3倍数を含むすべての自然数が含まれる.汎用コラッツアドレスで用いられる枝番号には,2倍数のみをカウントする系統,3倍数のみをカウントする系統とそれらを除外した正準系統の別がある.

新版(完全木)と旧版(完全木)を合体させるという作業を行っているところだが,そのいずれでもないもう一つのバージョンが存在する.タイトルはCollatz Complete Tree Experiment V2.2.0 2033/02/23というバージョンだ.この版はすでに完全木に統一された版になっているが,B面のオプションはOdd numbersではなく,Complete treeとなっていて,この版ではB面でも奇数・偶数の別なく処理することができる.Odd numbersの方が新しいはずだが,むしろデグレードしているような気がする.もう一度開始プロジェクトを調べ直した方がよい.

この版はCollatzComplete 2022-02-24-1というものだ.この後のCollatzComplete 2022-02-25になると,Complete treeというオプションが消えて,Odd numbersに変わっている.⇒この版を取り分けて,CollatzCompleTeとした.もう一度,ここから出直すことにする.この版で12のコラッツ数列を出力すると,一般木では

12
3 [*2]
5 [1]
1 [1]

のように出力され,完全木では

12
3 [*2]
5 [-1]
1 [1]

のようになる.このサンプルには2倍数と3倍数が出てくるので試すのに都合がよい.この版では仮想木のコラッツ数列は取れないが,旧版で3をテストすると,

3      3
5 (1)    5 [1]
1 (1)    1 [1]

のようになる.従って,12から始まる仮想経路は

12
3(*2)
5 (1)
1 (1)

となればよいのではないだろうか?

一般木,仮想木,完全木の構成の違いを見るために,印刷しようと思ったのだが,印刷機能が未サポートの状態になっている.横書きサポートに入った時点で止めてしまっている.サンプルファイルは作ってあるが,印刷できない.古いバージョンで印刷は可能と思われるが,横書きがサポートされていない.PageLayoutという関数を復活させれば多分動作可能と思われるが,横書き対応の修正が必要になるので,動くようになるまではかなりの時間を要する.⇒とりあえず,ないよりはましと思われるので,縦書きでプリントしておこう.

image

確かに,現物が目の前にあるとかなりわかり易くなり,何が問題なのかも把握できる.何をやろうとしているのか?

  1. 3種のコラッツ木があり,それぞれが固有のアドレス方式を持っている
  2. 3種のコラッツ木にはそれぞれ収容するノードの範囲がある
  3. 一般木にはすべての奇数ノードが入っている つまり,一般木ではすべての奇数ノードに「実アドレス」を与えることができる
  4. 仮想木には「長子ノード」だけが入っている 「非長子ノード」のアドレスは未定義と考えられる
  5. 完全木には3倍数ノードは入っていないが,別枠のアドレスコード(詳細付番)で位置を特定できる
  6. アドレシングの基準は仮想木であると考えられるが,仮想木に載っていないかなりの数の「非コラッツ数(非長子ノード)」がある
  7. 偶数ノードは上位奇数ノードに詳細付番を付加して位置を特定する

やはり,偶数ノードは一度システムから省いて考えた方がよいのではないだろうか?偶数ノードを除外すると,特殊ノードというのは長子ノードと3倍数だけになる.仮想木というのは一般木の縮約グラフであり,アドレスの基点がつねに長子ノードにあるという点からすれば,基準コラッツ木と呼んでも差し支えないと思われるが,むしろ,一般コラッツ木から拡張コラッツ木に展開するというのが本筋なのではないだろうか?「コラッツ定理」を証明するためには,「完全正則木」を構成することが必要不可欠と考えられるが,拡張コラッツ木を「拡張正則木」として再構成することも考えられる.

これとは逆に,仮想木を拡張するということも考えられる.仮想木はルート1を除去して5をルートとする木としてみれば,容易に完全正則木を構成可能であり,長子ノードがアドレスの基点になっていることが確かであるとすれば,これはむしろコラッツ木の基準座標系のようなものになっているのではないか?上記項目4で「非長子ノードのアドレスは未定義」としているが,仮想木上に現れない非コラッツ数に付番を与えて位置を特定することは可能なのではないか?

今後は仮想木から1を除去したグラフを「長子木」と呼ぶことにしてみよう.長子木はすべて一般木の長子ノードのみから構成される木であり,ルートは5であるとする.このグラフには本来1の直下にあった部分木は省かれている.たとえば,21, 85, 341, 1365,…などはすべて5の兄弟ノードだが,長子木上には現れない.これらのノードを5+3のような感じで5と同位にあることを示すことはできるだろう.長子木上のノードをNとすると,その兄弟ノードN+kをF(N, k)とすれば,F(N,k)は以下のような漸化式で表すことができる.

F(N, i+1) = 4 * F(N, i) + 1

長子木は完全正則であり,長子木上のノードNは複数の兄弟ノードを持っているが,これらのノードはすべて義兄弟ノードであり,実兄弟ではない.つまり,長子木ノード上のノードの実兄弟ノード(一般木上の兄弟ノード)はすべて長子木上では非表示になっている.上記の式によってこれらの実兄弟ノードにアクセスすることが可能であるから,長子木はすべての奇数に一意のアドレスを与えることができるだろう.これが本当の拡張コラッツ木なのではないだろうか?もちろん,このグラフがすべての偶数を含むように拡張することは難しくない.

長子ノードと親ノードの算術的関係は明確に定義されているので,長子木上で定義された汎用アドレスコードからそのノード番号を割り出すことは難しくない.また,任意のノード番号が与えられたときに,その番号から長子木上のアドレスコードを生成することも可能であると考えられる.もし,この考察が正しいとすれば,現在取り組んでいる完全コラッツ木という概念は破棄されることになるのではないか?つまり,一般コラッツ木と拡張長子木が並立するという構成になり,三本桜は二本ザクラに縮退することになる.長子木が一般木を縮約したものであるとすれば,一般木はむしろ長子木の拡張ないし展開とみなすこともできる.

上記ではNのk番目の実兄弟をN+kと標識するとしているが,むしろ,N:kのような感じで表記した方がよいかもしれない.この場合はもろにNのk番目の弟という意味になり,トポロジー的にも整合性がよいかもしれない.たとえば,

1. 2. 3:4

は,5→3→35→1507→(((1507*4+1)*4+1)*4+1)*4+1 を表すことになる.このような形式で表示されるNの兄弟ノードがすべてNの親のDNAを継承していることは(多分)容易に示せるはずだ.完全コラッツ木というのも悪いアイディアではないが,どこかで座礁する可能性は高い.それよりも長子木を直接拡張する方向のほうが正しいと思う.再定義された長子木にはコラッツ変換のゴールである1が含まれないというところが「奇妙」なところだが,逆にそれがこの問題の「鍵」なのではないかと思う.「コラッツ完全木検定」はすでにかなり作り込んであるが,まるごと廃棄ということになりそうだ.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA