奇数Nのアドレスを取得→最大次数と木の高さを取得→Nの部分木を出力

コラッツ木生成プログラムに奇数Nのアドレスを取得する拡張を行ったが,さほど大きくない設定でも整数レンジオーバーが発生してしまうので,このプログラムの中で使っているすべての整数をIntegerからUlongに切り替えてみた.Integerは最大2,147,483,647だが,Ulongは18,446,744,073,709,551,615まで表現できる.ここまで出せればとりあえず,当面の目的には十分だ.trillionの上はquadrillionと呼ぶそうだが,quadrillionは千兆に相当するので,1京8千兆という巨大数字だ.

①コラッツ木生成と②アドレス計算を連携して表題のような操作ができるようにしてみたい.②の画面に最大次数と木の高さを表示し,これらの値を①の画面に転記して連続的に操作できるようにすればよいだろう.①コラッツ木生成では,Cancelボタンで打ち切れるようにしたい.どうすればよいか?Cancelイベントでなにかフラグを立ててやればよいのではないか?

アドレス計算で表示された最大次数と木の高さを①の画面に転記するというのは,少しやり過ぎではないか?この値は1をルートとする木の次数と高さであり,Nの部分木のそれではない.この意味では②の画面の入力奇数番号を①の開始番号に転記するというのもやり過ぎだろう.つまり,この2つの機能はあくまで独立に操作するものとしておいた方がよい.⇒道具立てはそろったので,テストしてみよう.

その前に,途中でキャンセルできるようになったので,中断したところまでに出力したノード数をカウントして表示できるようにしておこう.いや,すでにTotal Valid Numberという値が表示されている.これがその数に該当するのではないか?いや,おかしい.デザイン画面では表示されているのに,実行時には表示されない.なぜだろう?visibleが偽になっていた.⇒つねに最後まで実行するようになっていたので,設定値とつねに一致するため表示を省いていたのだろう.

まず,27までの経路が正しいことを確認してみよう.50までの奇数をすべて含むコラッツ木の葉になっているノードをすべて検査して,いずれも正しく動作していることを確認した.このために61,91などをルートとする部分木を出力して参照した.このプログラムはすでにほぼ完成していると言ってよいと思われるが,外部に持ち出して運用するためには,ゼルコバの木ファイル形式ではない,もっと一般的なファイルフォーマットで出力する必要がある.グラフファイルフォーマットにはいくつかの世界標準があるが,CSVファイルに落とすのが一番簡単でかつ扱い易いように思われるので,この仕様で実装することにする.この場合,今度は逆にCSVからZELに変換というのが必要になる.

▲以下の式である程度以上大きい数を文字列から数値に変化しようとすると,1多い数が返される.つまり,奇数が偶数に化けてしまう.

dim N as Ulong = Val(OddNumber.text)

Ulong.parse(OddNumber.text)で正しい値が取り出せるようになった.ただし,その後の計算がまだおかしい.

コメントを残す

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

CAPTCHA