B面ではコラッツ木3モードを統合的に扱う

A面はすでに修正完了しているので,後はB面に対応するだけだ.B面には4つの処理が入っている.①コラッツ数列生成,②アドレス→整数変換,③幹線木生成,④検証テストだ.それぞれを3モードに対応させるとすると,処理は3×4=12個必要になる.しかし,B面で扱っているコラッツ木はすべて直列のチェーンだけなので,一種に統一することは不可能ではないかもしれない.特殊扱いが必要なノードは偶数と3倍数に限られるが,それらは基本的にチェーンの終端にしか現れないので,汎用的なユニバーサルコードシステムで扱うことができる.

④の検証テストは①と②を組み合わせたものだが,「検証テスト」の趣旨から考えると,偶数まで含むユニバーサルコードシステムでカバーすれば十分であるようにも思われる.幹線木というのは,②で生成されるチェーンに枝葉を追加するだけのものなので,従属的な扱いでよい.しかし,①のコラッツ数列取得のダンプ出力はモードによってかなり違う.たとえば,対象ノード番号に15を指定した場合,最新版(最終版)では以下が出力される.

image

15という整数は,15→ 23→ 35→ 53→ 5→ 1のようなコラッツ数列を生成するが,23[-1]という表記は,15が3倍数であることを示している. 旧版では同じ15から出発してもかなり異なる結果が出力される.下図で左が一般木,右が仮想木モードの出力だ.

image  image

右図の仮想木モード出力の右側の列は,左図の一般木モード出力と完全に同じものが出力されている.つまり,旧版では(仮想木モードのときには)一般木と仮想木の両方の結果が出力されている.一般木上のコラッツ数列と,仮想木上のコラッツ数列にはかなりの相違がある.

一般木:15→ 23→ 35→ 53→ 5→ 1
仮想木:15→ 23→ 35→ 3→ 5→ 1

仮想木では数列上に3倍数が現れるというのがもっとも大きな相違点だ.最新版の完全木出力と旧版の一般木出力は15の枝番が負値になっている点を除けばほぼ一致している.ただし,一般木と仮想木の枝番が終端ノードを除けばつねに一致するとは限らない.完全木の(正の)枝番は3倍数を除外した兄弟ノードの順位になっているからだ.旧版の仮想木モード出力を拡張して,①一般木,②仮想木,③完全木の3種のパターンを併記することが考えられる.これ以外の対処法というのも考えられないので,結論的には,(1)B面ではモードを区別しない,(2)コラッツ数列生成では3種のパターンを併記する,(3)それ以外ではユニバーサルアドレスコードを適用する,とするのが妥当ではないだろうか?

これでよいとすれば,修正はコラッツ数列生成の出力に完全木の列を追加するだけで済む.これなら間違いの発生する余地もないだろう.早速実装に移ることにしよう.修正に掛かる前に,既存画面から「Auto-copy branch ordinal numbers」というオプションを外してしまうことにする.このオプションはコラッツ数列生成時に二次的に生成される分岐枝リストをコピーしてアドレス→整数変換のときに再利用するためのスイッチだが,これまで運用した限りではつねにオンにしたままで一度もオフにしたことはないので,「要らない」ということでよいと思う.その方が仕様が単純になってわかり易い.

旧版では,コラッツ数列生成はGetCoreSequenceとGetTheSequenceに分かれている.GetTheSequenceは一般木のみを扱っているので実質的にGetCoreSequenceに含まれているはずだ.GetCoreSequenceと最新版のGetTheSequenceを組み合わせればよいはずだが… ⇒一応修正は入ったが,仕上がりにはほど遠い.3のコラッツ数列を求めただけで無限ループしてしまう.細部をもう少し詰める必要がある.

コメントを残す

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

CAPTCHA