開発環境で検知された脅威は錯誤だった?

最近は就寝前にPCの電源を落とすようにしている.いまテストが走っているのは予備機だけなので他の2台は始業時に電源を入れなくてはならない.おかしなことというのは夜分に起こることが多いので,面倒だがこれを習慣化するしかない.予備機の検証テストは17時間24分経過して,78%,残り時間4時間55分だ.昨日の完全スキャンでは検知ゼロで完了しているが,その後リブートして複数のEXEがまた警告を受ける状態になった.完全スキャンの直後にまたぶり返すというのも妙な話だが,除外リストを完全にクリアしているため,ファイルのハッシュ値が変化すると警告を出すようになっているようだ.

ということは,これまで大騒ぎしてきた危険EXEの検出というのもそういうものだったという可能性が高くなった.リビルドすればハッシュ値は当然変化するので,除外リストに登録していない限り脅威と認知されることになる.通常は開発環境以外ではリビルドということは行わないのだが(そうしないとバックアップの内容が変化してしまう)最近はその辺りもかなりルーズになっていて,バックアップフォルダの中で新たにビルドを実行してしまうようなケースが増えている.これも厳に慎むべきだろう.これを徹底するには,バックアップフォルダをRD ONLYにしておくことも考えられる.

さて,Collatz Tree Generatorも仕上がって一息ついたところだが,最後の関門を突破するためには,まだやることが相当残っている.ともかく,Eldest Sons Treeの生成機能をCollatz Tree Generatorに実装しなくてはならない.Eldest Sons Treeというのは,Collatz Core Treeの別名で「コラッツ数」と呼ばれる(呼んでいる)ノードだけから構成される正則木だ.仮にどこかに類似研究があったとしてもこれができれば,完全に振り切ることができると思う.このグラフでは通常のコラッツ木では必ず行き止まりの葉になるような3の倍数ノードがコラッツ数になって後続ノードを持つようになる.

このような軌道はコラッツ数列には絶対に現れないある種の地下トンネルのようなもので,おそらくこれに気づく人はいないと思う.モヒティはどこまで理解しているのか分からないがこの点を指摘したコメントにいいねを付けているので多分わかったのではないかと思う.なぜコラッツ問題がほとんどランダムなカオス状態に見えてしまうのか?という原因はここにある.このトンネルを通れば起点の1に到達する放射状の道路が完備しているのに,このところで別のニセの経路を提示されどこまでも迷路をさ迷うようなことになってしまっているのだろう.

通常のコラッツ正則木とコラッツ核木を目視で比較すると,①次数が1小さくなり,②(ノード1を度外視して)高さも1減じるようなことになっているように見える.多分これはもっと大きなサンプルでも変わらないはずだ.つまり,コラッツ核木はコラッツ正則木を垂直と水平の両方向で圧縮したものと考えられる.コラッツ木構造の整合性はすでに確認されているが,コラッツ核木構造はどういうことになるのだろう?コラッツ木構造は親子関係だけを規定するものになっているが,コラッツ核木では複数の親ノードを1個のノードに集約しているのでより横断的な計算が必要になってくる.計算式はそれほど複雑なものにはならないはずだが,見通しのいいものになるかどうかは未知数だ.

上記のような理由でコラッツ核木のルートは5であるとしてよいと思う.正則コラッツ木生成画面にチェックボックスを設けて,コラッツ正則木とコラッツ核木を切り替え,CollatzTreeStructureとCollatzCoreStructureを呼び分けるようにする.手順を考えてみよう.正則木で最初の最右ノードを取得するところまではまったく同じでよいはずだ.次のループでは最右ノードから左にノードをD個生成しているが,ここがやや異なるものになる.出力されるのは子ノードではなく,孫ノードでなくてはならない.しかし,そうなると一段処理するたびに一段分消えてしまうので,呼び出し方を変える必要があるのではないか?つまり,本人ノードではなく,本人ノードの親を基準として展開しなくてはならないのではないか?実例から見た方が早い.

ノード5の子どもを展開しようとしているとする.最初の3は(MM-1)/3で求められる.次の113というのは,5の子どもではなく,85の子どもだから,まず,85を求めなくてはならない.つまり,親1の子どもを展開し,その最右子ノードが113になる.ただし,1には5と85の間に21という3の倍数ノードもある.このノードは後続ノードを持たないので,単純に無視されなくてはならない.結構複雑なややこしい話になりそうだ.完全正則木になるのかどうかも怪しくなってきた.ともかく,5の子どもの中には直接血縁のない「傍系親族」が入ってくることは間違いない.従って,計算には本人ノードの親が指定されていなくてはならない.

その親が複数の子どもを持っている場合にはどういう動作になるのか?たとえば,3を展開する場合を考えよう.3の親は5で,3の子どもには幾人かの養子が含まれることになる.これらの養子は兄弟の子どもだから,甥姪に当たる.3は実際3の倍数だから子どもはいない.最初の子である17は実際には3の兄弟である13の子どもだ.少なくとも言えることは,3は親5のすべての孫の面倒を見る必要があるということだろう.しかし,5の直系の孫だけ見ていればよいのだろうか?3の場合は5の直系という見方でよいと思われるが,113の場合は少し異なる.

113の親は5ではなく85だ.従って,113の場合には親の85の直系の孫が受け持ち範囲になる.呼び出し時の引数には親番号が入っているが,これは必ずしも実親ではない.子ども番号から親番号を割り出すことはできるだろうか?多分それはできるだろう.コア木のノードはすべて長子ということになっているから,コラッツ写像から取得できるはずだ.イメージは大体つかめて来た…

大体動作するようになった.かなりおもしろい.これまでの正則コラッツ木では3の倍数ノードは弾かれていたが,コアコラッツ木では1を含む任意の奇数ノードをルートとする正則木を描くことができる.ただし,ルート1の核コラッツ木は,昨日公開した図のようにはならない.

image

一見この図はよく描画できているように見えるが,よく見ると重複がある.3の部分木が重複して表示されている.3は5の子どもであるのに,上の図では1の子どもの位置に描画されてしまっているためだ.3をルートとする図を見てみよう.これは問題ないようだ.

image

昨日の図では3の子どもの35と17の順位が逆転しているが,手操作で作っているので,どこかで逆順になってしまったのだろう.兄弟ノードは左が大きくなるはずなので,上の図が正しい.ルート5を見てみよう.

image

これがもっとも標準的な正則核コラッツ木で,3の部分木は3をルートとする木とまったく同相になっている.奇数Nから1を減じて4で割った値が奇数にならないような数をコラッツ数と呼んでいるが,核コラッツ木上のノードはすべてコラッツ数であると定義される.たとえば,13は非コラッツ数だが,13をルートとした場合,どんな図式が出力されるのか見てみよう.これは上の図で3の代わりに13が入った図になっている.

image

3と13の関係は正則コラッツ木では兄弟で,3は13より年長だ.13は非コラッツ数ではあるが,これはこれでよいのではないだろうか?従って,やや変則的な図式になっているのは1のケースに限定されると見てよいだろう.本来コアコラッツ木では基準ノードの下に来るのは兄弟ノードの子ども,つまり甥姪であるはずなのだが,1の場合,兄弟はいないのだから,長子の5だけが子どもの位置に入るはずのところだが,本人の兄弟というのは本人をNとしたとき,4N+1という関係であるため,5や21, 85まどまでが兄弟として扱われるようになった結果である.

4N+1が兄弟関係を示すとすると,5は1の子どもであると同時に兄弟でもあるということになる.実際には1には親がいないので兄弟がいるはずはないのだが…一番正しいのは1をルートとする核コラッツ木は存在しない,ないし描画しないというのが正しいような気がするが,1だけ特殊扱いして,1を仮に出力してから次の処理に移るというような例外的な扱いを取ることは不可能ではない.どちらかというと,その方が納得し易いような気もするのでそのように改めてみよう.

image

これでよいのではないだろうか?完全正則木と呼ぶためには5の上の1が邪魔になるのだが,1と5の特殊な関係を印象付けるためにもこの方がベターなのではないかと思う.

コメントを残す

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

CAPTCHA