Bブロックが動作していない

Bブロックが動作していない.α=9223372036854775807のとき,β=10の10進数表記の数が,23になっている.かなりおかしい.ちなみにε=1.γ=23という設定だ.→数が大き過ぎて表示できないのではないだろうか?だとしたら,少なくとも「*****」のような表示にならないくてはならない.この値が入っているのはnotationだが,DispNotationでは直接この領域に書き込みを行っている.DispInvertFunc→ DispNotationが呼び出されていない.⇒InvertFuncが負値 ERROR_POWERRESIDUEFUNC_OVERFLOW を返している.

起動時にはウィンドウは一つだけ開くようになっていたはずだが… ボックスとパネルが開いている.⇒勘違いだったかもしれない.⇒タスクバーのアイコンから開くと2つ出る.⇒一旦ピン留めを外して再設定したら動作するようになった.原因は不明.

αが巨大数でもgcm(α, β)は計算できるはずだが,更新されていない.この値はgcm3だ.⇒DispInvertFuncで表示しているためだ.βの因数リストfactor_BもDispNotationで出しているので同じだ.⇒計算できるところはできるだけ表示するという対応の仕方も考えられるが,Bブロック全体が無効ということでよいのでは…

▲αに9223372036854775807を入力したあと,デクリメントして少し小さい数にしたらどこかでハングしてしまった.⇒一応計算完了して出てきた.Bブロックは更新できない.αを8桁まで落として数字が出るようになった.ただし,U, aU,Ξは不明のままだ.⇒出力パネルにはオーバーフローが発生していることを表示するべきだ.

喜内道具箱のマニュアルを書いている

喜内道具箱のマニュアルを書いているところだが,おかしな数字が出てきた.φ(γ)と#の最大公約数(φ(γ), #)の値がおかしい.φ(γ)=16で#=4なのに0になっている.かなりまずい.この値はgcm2に入っている.⇒更新ボタンで画面を更新したら4という値が入った.この値はResidueFuncProで計算し,その場で格納されている.この計算はPhi_γを参照しているので,Phi_γがまだ確定していなかったのではないか?⇒比較的最近,ValueChangedProでResidueFuncProとValueChangedの順序を入れ替えたのが敗因だ.⇒ResidueFuncProの前にValueChangedを実行するようにした.

大体仕上がったので,出荷の準備に入ろう

大体仕上がったので,出荷の準備に入ろう.以前一度VAIOにリリース版をインストールして試したことがあるが,今回は,サブノートに載せて動作確認することにしよう.EXEだけでは動かなかったような気がするので,実行するのに最低必要なファイルを確定しておく必がある.

BlackHawkにコピーして実行させようとしたが,EXEだけではまったく反応しない.binの下のnet5.0-windowsに入っているEXEを起動して以下のパネルが出た.

image

ともかく,.NET 5.0をインストールしておこう.これで一応実行できる環境にはなった.EXE+DLLで実行できるかどうか試してみたが,やはり無理なようだ.net5.0-windowsフォルダの中身がそっくり必要なようだ.配布版はパッケージにしてZIPで配布するしかない.配布パッケージ名はPowerGridということにしておこう.これは通常は「電力網」という意味で使われる用語だが,このツールの目玉はなんと言っても「べき剰余マトリックス」なので,適切な名前ではないかと思う.

どうもやはり,BlackHawkは足絡みになってしまうので,落としておくことにしよう.落としては見たものの日本語入力の具合がよくない.画面の左端に変換候補がちらちら現れて使い勝手がよくないだけでなく,反応が遅くていらついてしまう.平常通り,機内モードオン・VPNオンに戻して状態は戻ったが,変換候補が左に出るというのは変わらない.ただし,普通の速度でキーが打てるのでこの程度ならそれほど支障はない.どうも機内モードではファイル共有できないようなので,ファイルの受け渡しはUSBでやることにしよう.

起動時の初期画面でウィンドウが2つ開くというのはやはりノーマルではないので,パネルの方はアイコン化した状態で開くことにした.タスクバー上でホバリングすると「久留島喜内の置き土産」というアイコンが出てくるので,これをクリックするとパネルを開くことができる.タスクバーにピン留めしていなくても,タスクバー上に歯車アイコンが出ているときには,右クリックでアプリを開くことができる.

公開するとすれば,簡単な取説は必要だ.以前のCollatz Tree Generator のマニュアルにならって同系統のものを作ることにする.まず.最終版のCollatz Tree Generator の保管場所を確保しなくてはならない.コラッツではマニュアルは別フォルダで管理している.フォルダがここにあるということは,開発も開発機を使っていたものと思われるので,それも踏襲することにしよう.

マニュアルには図版が大量に入るので,やはり別建てで管理した方がよさそうだ.コラッツマニュアルにはPDF版とHTML版がある.PDF版の方が詳細なので多分こちらの方が新しいバージョンなのではないかと思う.多分最初はOpenOfficeのテキスト文書(*.ODT)として編集し,それをPDFとHTMLにエクスポートしたのではないかと思う.OpenOfficeにはHTML文書ドキュメントの編集機能はあるが,テキスト文書からHTMLにエクスポートする機能は見当たらない(PDFにはエクスポートできる).マスタードキュメントというファイル形式もあるようだが… 名前を付けて保存のところでHTMLが選択できる.従って,通常のODTファイルとして編集するというのでよいと思う.

今回のマニュアルは久留島喜内の仕事の継承という意味合いから日本語ドキュメントとして編集することにする.です/ます調(敬体)にするか,だ/である調(常体)にするかが問題だ.論文調ということであれば,だ/である調ということになるのだが… 導入部などではです/ます調,本文ではだ/である調ということでよいのではないか?いや,最初からである調でいくことにしよう.

開発機にはOpenOfficeはインストールされていない.ドキュメントのバックアップは外付けHDなので,多分VAIOで開発したのだろう.こうなると,やはり無線HDDが欲しくなる.と言っても,いまの環境ではいろいろ手間の掛かる部分もある.機内モードをオフにしなくてはならないとか… VPNもオフにする必要がある.⇒ファイル共有はできた.しばらくはこの態勢でやることにしよう.

これ以上付け加えるものはもうほとんどない

縦数列の周期は捉え難く,それをカラー表示することはかなり難しいので,その代用としてマトリックスのRの値を色コードに変換して直接表示してみることにしよう.⇒できた!

image

ごちゃごちゃし過ぎているが,こんなものだろう.R=0とR=1は特別扱いで黒と白で塗り分けている.これを小ブロックの境界を示す線で区切ることができれば,メッセージ性も多少は出てくるのだが…,ここから何かを読み取るのは難しい.色がどぎついので,透過色を使いたかったのだが,DataGridViewでは背景色を透過にすることはできないようだ.色のアルファ値を指定することまではできたが,描画されない.やむを得ず,色の明度を上げることでそれを代替することにした.

image

まぁ,こんなものではないだろうか?これならば,上よりはだいぶましと言えると思う.しかし,これでは何が何を意味するのかがまったくわからない.何か方法はあるだろうか?

ColoringStripeで算術演算オーバーフローが発生した.⇒コーディングにミスがあった.

こんなのはどうだろう?満開の桜というイメージで悪くないと思うのだが… ただし,意味不明という意味では同じだ…

image

この辺りが無難なところではないだろうか?

image

これだと,ある程度までパターンの形状が見えてくるので,周期性を考えるときの手掛かりにはなる.一応これで完成したということにしておこう.あと,やっておくとすれば,異種文字数と桁数が一致しない場合,識別できるようにしておくことぐらいだ.異種文字数=固定桁=桁数なので,固定桁がゼロでないことと異種文字数と桁数が一致しないことは同値だ.固定桁数が分かれば設定は難しくない.BuildPowerGridでは異種文字数はGetCharNumV,GetCharNumHで直接拾っている.BuildMatrixでは桁数の計算は一切行っていない.いや,ColoringCycleの中ではLambdaFunctionを呼び出している.色分けするのには周期が必要になるからだ.⇒横周期を出す時点で色で表示するようにした.

image

これで十分だと思う.異種文字数の縦と横の総和は表示されている範囲では一致しないので,表示していない.これを一致させるにはマトリックス全体の文字数をカウントしなくてはならない.さて,付け加えるものはもうほとんどなくなってきた.あと,何かあるだろうか?

さて,次は縦数列周期のカラー表示だ

さて,次は縦数列周期のカラー表示だ.方針としては,マトリックスを小ブロックに分割し,それぞれの矩形を塗り分けることで代用するというつもりだが,そのためには,ブロックの分割数,つまりサイズを決定しなくてはならない.⇒横数列周期カラー表示にブロック表示を上書きしてみた.イメージとしては,これに近いものになる.

縦数列周期カラー

このマトリックスはγ=200でα=100.横周期Λは不定だが,α=108のとき最大値20を取る.φ(γ)の値は80だが,小ブロックの周期はもっと小さい.明らかにブロックと認識される矩形サイズは10x10だ.この10という数字がどこから来るものかを知りたい.明らかに言えることは,この区切りは横に0が並んだ行であることだけは間違いない.従って,ゼロ行の発生機序が分かればおそらく小ブロックのサイズを確定できると思われる.これは多分それほど難しくないとは思われるが,試行錯誤なしで式から直接導出できるかどうかが問題だ.しかし,よく見ると,どうもこのパターンはかならずしも理論通りになっていないようにも見える.縦数列のブロックが個々に異なるのはよいのだが,横周期は少なくとも1つ置きには一致してほしい.⇒横周期のカラー表示がまだ収束していない可能性がある.もう一度確認する必要がある.

γ=200のマトリックスでα=94,ε=79 のとき,周期#は10で周期列は{94*,36*, 184, 96, 24, 56, 64, 16, 104, 176, 144, 136}のようになっている.つまり,先頭項は184だ.後半部はおおむね正しく表示されているように見えるが,横インデックスが64より前の部分ではカラー表示が崩れているように見える.どうも,まだ仕上がっていない気配だ.⇒まだいろいろあると思われるので,まず,ともかくマトリックスに異種文字数を出しておくことにしよう.これは,マトリックスに表示される値なので,BuildPowerGridで計算するというのでもよいのではないか?⇒この計算は確かTestMtrixでやっていたはずだ.

TestMatrixでやっているのは,基本的に異種文字数カウントだけだ.BuildPowerGridは独立に呼び出される可能性があるので,別物としておいた方がよい.TestMatrixではs1(), s2()という2つの配列に異種文字数カウントを入れて返している.とりあえず,BuildPowerGridの中からこの関数を呼び出してみよう.

TestMatrixを実行して,System.IndexOutOfRangeExceptionが発生した.work(MT(i, j)) = work(MT(i, j)) + 1でエラーが起きている.workのサイズはγだ.maxにはγ=200が入っている.⇒BuildMatrixにはモードがある.通常はノーマルモードで表示される範囲のマトリックスのためのテーブルを生成し,フルサイズモードの場合のみγ全体をカバーするテーブルを生成している.しかし,異種文字数をカウントするだけならフルサイズのテーブルがなくても間に合うはずなのだが…

つまり,一サイクル分を計算すれば十分なはずだ.ということは,TestMatrixの論理は大幅な書き換えが必要ということではないだろうか?横数列に関してはLambda関数で代用することはできる.縦数列の場合はそれに相当するものがない.GetResidueStripeという関数はある.この関数は文字列を返すようになっているが,改造して配列を返すようにすればよい.グリッドに表示されている範囲だけを計算し,その関数の中で異種文字数をカウントすればよいと思う.つまり,縦数列異種文字数カウント専用ルーチンということでよいのではないだろうか?横数列用も作ることにしよう.一応できたようだ.

image

ただし,BuildPowerGridでは,表示されている範囲の異種文字数しかカウントしていないので,横数列と縦数列で異種文字数の分布が一致するか否かの検定を行うことはできない.とりあえずは,これで十分だ.さて,もう一度マトリックスの不備の問題に立ち返ることにしよう.

どうも,行ヘッダに出す数宇を間違えてしまったようだ.ここにはやはりインデックスが出ていた方がよい.表面には出ていないが,通し番号は行ヘッダ部に表示されている.

横数列の異種文字数カウントには固定部文字数が入っている.このため,桁数ないしΛと一致しない.調整した方がよいのだろうか?調整した値を表示するとすれば,これは剰余数列の周期そのものになり,Λとも一致する.だとすれば,単純にΛ数ないし桁数を直接表示してしまった方が早い.⇒ここでは保留としておく.

α=94で周期の乱れが発生するのは,数列中に1が現れないためと見られる.このため.数列の末項が見つからず,おかしな形に繋がってしまっているものと思われる.⇒初項が検出された場合には必ずモードを切り替える用に修正した.⇒これで正しい表示になったものと思われる.プリントして小ブロックに区切ってみよう.

マトリックスγ200-α94

大体正しい図になったように思われるのだが,厄介な問題が一つある.周期は完全一致していると言ってよいように思われるが,位相に微妙なずれが発生する.これは,行によって固定桁が異なるためだ.従って,位相のずれは避けられないと思われるのだが,それが縦数列にどう影響するのかがまだよく分かっていない.⇒いや,均等にずれるのだから,その影響は無視できるのではないか?仕上がりは,下の図版から横数列のカラー表示を抜いたようなものになると考えられるのだが…

マトリックスγ200-α94-2

イメージとしては,概要,下図のようなものを想定しているのだが…

マトリックスγ200-α94W

この図版はγ=200を64x64で出力したものだが,縦数列の周期が10なので,200÷10=20のパターンが出現することになると考えられる.いまのところ縦数列に関して分かっていることは回文になる数列が存在するということくらいしかない.上のような色付けならある程度機械的に処理できると考えられるので,このくらいで手を打ちたいというのが本音のところだ.⇒同じ番号を同色で塗りつぶすという手も考えられる.この場合,横一列に0行と1行が並ぶので縦数列の特異性が多少なりとも見えてくるのではないだろうか?

これは試してみる価値のある実験であるとは思われる.固定部を切り捨てて,強制的に位相をそろえたらどういうことになるのだろう?それもまたおもしろい実験になりそうな気はするのだが…小ブロックのタイルを敷き詰めるというのは意味のある操作であるとは思われるが,背後になんらかのパターンがないと,ほとんど意味が通じない.意味もなくただ,ダンダラに塗り分けたようにしか見えない.

Lambda関数で周期桁数と固定桁数を返す

Lambda関数で直接周期桁数と固定桁数を返せるようにしたいのだが,頓挫している.どうすればよいか?やはり,1点づつ検査するしかないのではないだろうか?桁数は判明しているのだから,それを使ってやりくりすればなんとかなるような気がする.修正を試みているところだが,反例が出た.offset=0 <> drop=2 α=6 γ=18 Λ=0.この事例では数列は{6*, 0*}で2#0だ.⇒これは通ったが,別の反例が出てきた.offset=2 <> drop=0 α=7 γ=18 Λ=3.この事例では数列は{7, 13, 1}で0#3,また,反例が出た.offset=0 <> drop=2 α=12 γ=18 Λ=0.このサンプルは{12*, 0*}で2#0だ.まだダメだ.offset=0 <> drop=1 α=15 γ=18 Λ=1.このサンプルは{15*, 9}で1#1だ.⇒どうやらできたようだ!これができると,今度はΛとオフセットを使って剰余周期列を生成できる.⇒既存のGetResidueCycleは廃止し,別途MakeResidueCycleとして作り直すことにする.

いや,オフセットと周期が分かれば,具体的に数列を与えなくても色分けはできるはずだ.次のような手順になる.

  1. mat.RowTopからmat.maxrows分以下を行う
  2. 先頭列が固定部(オフセット)の範囲内ならば,テーブルの行を走査して初項を見つける.初項が見つかった位置から塗りつぶしを開始する.
  3. 先頭列が固定部(オフセット)の範囲外のときは,すでに区間に入っているものとして,塗りつぶしを開始する.
  4. 塗りつぶし中にゼロ項を検出したときは,そこで打ち切り
  5. 塗りつぶし中に1項を見つけときにはそこで塗りつぶしを中断し,ステップ5に戻る.

一応動き始めたが,まばらなところがある.

image

1の入っている周期列は大体表示されているようだが,それ以外は全滅だ.初項が見つかっていないのではないだろうか?⇒Lambda関数が悪い.α=1,γ=1で0を返している.⇒ようやくできたようだ!予想外のかなり興味深い図柄になった.

image

図で見ると垂直方向にも周期性がある(かの)ようにも見える.もう少し拡大した図を出してみよう.

image

縦数列の周期性がはっきり見える.γ=18を3分割して3種のパターンが繰り返されている.このパターンを反転させるとどう見えるか?というのも興味深いところだ.上の図にはまだ誤りがある.6, 12, 24, 30などで頭の固定部が塗りつぶされている.それを修正すると,上記パターンの反転は完全に同型になるはずだ.試みに反転パターンも出してみた.

image

パターンは完全に同型だが,左右反転したものになっている.個別の行は固有の反復周期を持っているが,全体としてみると,それらの公倍数となる反復周期が観察される.いまの場合の全体周期は12だ.この12という数はおそらくφ(γ)の約数列から出てくるものであろう.

さて,どこまでできているのか見てみよう.⇒ダメだ.かなり崩れている.γ=100で試してみたところ,大体は合っているが,間違っているところが出てくる.設定はα=15,ε=115となっているので,Rα=15とRε=35が画面中央付近に配置されるようなマトリックスになっているが,どうも,取っ掛かりのところで失敗しているようだ.後ろの方を見ると正しい周期に乗っている.

たとえば,α=6の剰余数列は,{6*,36,16,96,76,56,}で1#5となっているので,頭項が36,末項が56でなくてはならないが,6で始まって76で終わっている.その次からは頭項36で周期に復帰している.そもそも6は固定部に含まれるので除外されなくてはならないのだが… 結局,offsetを持つ剰余数列をうまく処理できていないと見ることができる.⇒できたようだ.⇒と思ったのも束の間,α=100,ε=115, γ=200で真っ白になってしまった.どうも,αが64を超えると誤動作が始まるようだ.65ではまだある程度まではカラー表示されているが,70ではまったく表示されなくなる.⇒大体動作するようになった.

εを操作して,枠外にはみ出すように調整しても,マトリックスがその位置を含むように開かれない.1~64の部分が表示されたままだ.α-100, γ=200, ε=79で,Rαは100,Rεは79だが,Rε=79は圏外だ.つまり,マトリックスを生成する論理ではマトリックスの水平シフトがまったく実施されていない.⇒ある程度安定した動作になってきているので,一度バックアップを取っておこう.

mat.ColumnTopはBuildMatrixで決めている.多分この論理が間違っているのだろう.Rε > maxcolumsの場合,ColumnTop = Rε – maxcolums \ 2という値が入っているが,ColumnTop + maxcolums >= maxの場合にはColumnTop = maxcolums + 1に修正されている.⇒この補正を止めたら動作するようになった.この補正は何のために入っているのか?max=γであり,このテーブルのサイズを意味している.γがMAXSQUARESIZEを超えている場合には物理的にテーブルを構成できないので縮小する必要があるためのパラメータだ.

maxcolumsはマトリックスの横幅であり,ColumnTop + maxcolumsというのは,マトリックスの右端を意味する.これはおそらく,マトリックスの右端がMAXSQUARESIZEを超えないための措置と思われるが,誤った論理になっている.書き直しておこう.これで横数列の周期カラー表示は大体まとまったのではないかと思う.

image

あと,これに縦数列の周期カラー表示を追加すればほぼ完成になるのだが,こちらの方は横数列ほど単純ではない.横数列の周期カラー表示を見ても分かるように,縦数列にも周期性が認められることは確かだが,縦数列の難しいところは,①回文というパターンがある,②一つの周期の中で同じ文字が複数回出現する,などなど.この周期性を確定するのはかなり難しい.しかし,縦数列の長周期はγに固定されているので,周期性があるとすれば,γの約数でなくてはならないから,ある程度までは絞り込むことができる.もちろん,γが素数なら周期は存在しない.

横数列で0の並びになる場合がある.このような行が存在する場合には,その行を区切りにした周期が発生する可能性がある.たとえば,γ=18の場合,6^2≡6^3≡0 mod 18dだから,周期6の数列ができる{1, 8, 9. 10, 17, 0}や{1, 10, 9, 10, 1, 0}など.

マトリックスの0行の表示がおかしい.γ=18のとき,{1, 2, 3, 4, 5, 0}の繰り返しになっている.γ-1=17の剰余になっていなくてはおかしい… 除数がΘ=φ(γ)になっている.いや,この表示は正しい.⇒やはり,異種文字数の表示は必要なのではないか?

このマトリックスにはまだ不備がある.列ヘッダに入っている番号が1からの通番になったまま変化しない.これでは問題がある.マトリックスの左端には固定部が固まっていて,これらは循環に関与しないため,Rεの値だけでは位置決めができない.たとえば,α=3, ε=121の場合,Rα=3,Rε=1の位置,つまりM(3, 121)には3という値が入っているが,Rは9である.同様のことは行についても言える.(ただし,行では実害はない)たとえば,α=123としても,行ヘッダの番号は変化しない.⇒αとεが生値でヘッダに現れるようにする必要がある.

大きい数を扱おうとするとセル幅が大きくなってしまうが仕方ないだろう.つまり,Rα,Rεをマトリックス中央に配置するのではなく,αとεの生値が中央に来るようにすべきだ.⇒いや,元々そのように作り込まれている.何か(操作的に)勘違いしていたのではないか?いや,確かに上記のような動作になる場合がある.何か調整が入っているのだろう.ColumnTopとRowTopはBuildMatrixで決めているので,そちらを見る必要がある.⇒修正した.ようやく,思ったような図になった.

縦数列で一番肝心なポイントは,γの区間がいくつに分割されるか?という点だ.横数列の場合には,この値はφ(γ)に一致する.γが素数ならγ-1だが,一般にはΛの倍数である.場合によっては,この値をΛと呼んでもよいのかもしれない.あるいは,もっと相応しい名前があるかもしれないが,いずれ,何か名前を付ける必要性が出てくるような気がする.

縦数列の場合はもっとはっきりしている.γの範囲を等分するゼロが並んだ行が発生するからだ.この分割数はγの約数であるから,γが素数の場合には1となる.いや,もしかして,これもφ(γ)なのではないだろうか?そう考えてよいような気がする.つまり,縦数列は(γ-1)/φ(γ)個の縞に分割されると考えてよい.ただし,この縞は横数列のように同じパターンの繰り返しではなく,個別に異なるものとなっている.つまり,マトリックス全体はたかだか,(γ-1)/φ(γ)個の小ブロック=タイルで埋め尽くされていると考えてよい.この小ブロックのサイズはφ(γ)xφ(γ)である.縦数列の周期をカラー表示するとしたら,この小ブロックを塗り分けることになるのではないだろうか?

剰余数列の周期をカラー表示する

まず,横数列の周期をカラー表示するところから始めよう.

パネルのタイトルが空欄になっている.「久留島喜内の置き土産」となっているはずなのだが… どこかで消してしまったようだ.

ボタンを押されたときに計算するとしてみたが,チェックがオンになっている状態でBuild Matrixが押された場合,カラー表示されないというのは不都合だ.やはり,初期描画するタイミングで色別表示するしかない.というか,マトリックスを描画しているのはForm2の関数であり,BuildMatrixではテーブルを構成しているだけなのだから,BuildPowerGridで対処すればよいのではないか?⇒チェックボックスをチェックしただけでは表示は変わらず,描画を更新するためには,BuildMatrixを押す必要があるというのでもよい.

どうもラジオボタンの使い方が難しい.すべてをオフにするためにはもう一つボタンを追加しなくてはならない.ラジオボタンの場合にはすでにオンのボタンがあると,そのボタンの(オフ)イベントが先に発生してしまう.⇒やや変則的だが,下記のようにしてみた.

image

★LambdaFunctionでγをgcm(α, γ)で割り込むという処理が組み込まれているが,この除算回数と固定部の桁数は完全に一致する.⇒これは必ずしも言えない.LambdaFunctionではΛ値を確定できるが,いまのところ固定部桁数を決定できる論理にはなっていない.

LambdaFunctionではGetResidueCycleでべき剰余数列の周期を取り出しているが,戻り値のcycは固定桁+周期のはずなのに数値が合わない場合がある.reduced+Λがcycと一致しない.たとえば,α=4, γ=16のとき,reduced=2,Λ=0, でcyc=1となっている.α=6 Γ=16 では,γ=1 reduced=4 Λ=0 cyc=1 となる.ただし,画面では 4 # 0 のように正しく表示されている.⇒GetResidueCycleの仕様をチェックする必要がある.この関数はLambdaFunction専用となっている.周期を出力しているところでは何を使っているのだろう?

周期を出力しているResidueFuncProではPowerResidueFuncで数列とその長さを取り出している.この関数では固定部と周期を分けた数値を返している.剰余数列はPRCycleという配列形式で返されて,それをDispResidueCycleで表示している.GetResidueCycleでも配列で剰余数列を返している.Λはこの配列内で1を検出することで決定している.GetResidueCycleの返す値には固定部は入っていない模様だ.cycは1を返しているが,cycle配列の内容は{0}だ.⇒GetResidueCycleはループカウンタのjを返しているが,jは0発進なので最小でも1になる.最初の値はα mod γ なので割り切れる場合は0になる.サイクルの長さに換算すれば,これは0とみなくてはならない.いずれにしても,cycには固定部は含まれないので数字の一致を求めることはできない.

逆に言うと,Λとcycはつねに一致しているのではないか?⇒そう言える.従って,Λは計算しなくても求められる.計算値は検算としては有効だが… むしろ,固定桁数とreducedが一致しない方が問題だ.α=22 Γ=12 γ=3 reduced=2 Λ=1 cyc=1の場合,2回GCMによって割り込んでいるが,FIXEDは1桁しかない.つまり,reduced値は決定的ではない.しかし,gcm(22, 12)=2でreduced=2というのはおかしい.⇒いや,数字は間違っていない.gcmで割り込んでいるのはγ値で,αには手を付けていないからだ.γ=12は2^2×3なので2で2回割られている.

おそらく,αの約数となるγの因数の個数が固定桁になるのだろう.⇒GCMが変化したときだけreducedをカウントアップするようにした.これでα=12 Γ=36 γ=1 reduced=2 Λ=0 cyc=1のときの固定桁2 # 0 と完全一致した.この計算は多分間違っていないと思われるが,GetResidueCycleの戻り値とΛが完全一致するように調整しておきたい.Λが値を持つ条件は数列に1を含むことだったと思うので,それだけをチェックしてやればよいのではないか?

GetResidueCycleはLambdaFunction+剰余数列の生成になっているので,各行ごとにGetResidueCycleを実行して周期列を取り出し,その先頭文字を見つけてそこから周期分着色するという方法で色分けしてみた.一応動いた.こんな感じになる.

image

もう一つ,これをダンダラに塗り分けてみた.

image

多少やり過ぎの感はあるが,わかり易くてよいのではないだろうか?一応動いてはいるのだが,まだどこか不備があるようだ.γ=12では失敗している.α2, 3, 4, 6, 8, 9 , 10 など,軒並み落としている.

image

GetResidueCycleでR=1が検出されない場合は0を返しているためだ.これは間違いだ.どういう場合,Λが0と判定すればよいのか?⇒Rが0になっているかどうかを見ればよい.

image

大体できたようだ.γが素数の場合にはこんな感じになる.

image

この図ではγ=17でマトリックスサイズはその倍近い32なので,中央付近で折返しになる.長さ16の周期列が最長で,これが原始根と呼ばれるものだ.つまり,γ=17の原始根は{3, 5, 6, 7, 10, 11, 12, 14}だ.素数499のマトリックスはこんな感じになった.

image

頭の1が塗りつぶされていないのは,1が周期の末項になっているためだ.設定ではεが115なのでその辺りが中央に来るように配置されている.ε=460で描画してみよう.どうもあんまり芳しい図にはならない.

image

γ=499では,ほとんどの周期は83, 166, 249, 498 などの長いものになる.これはφ(γ)が {1, 2, 3, 6, 83, 166, 249, 498} のような約数を持っているためだ.周期がマトリックスの横幅より大きいときにはすでに周期に入っていると見て,終わりを探るという動作の方が実情に合っているのではないか?この場合は末項を見つけて折り返すようになる.周期とオフセットの両方が分かれば,計算だけで出せるようになるのだが… そのためには,LambDaFunctionのオフセット仮説の証明が必要だ.これが確立すれば,LambDaFunctionだけで計算が完結する.⇒Matrix Test で検査してみよう.

▲マトリックスをビルド/テストしたときには,Λのリストを出力する.同様に原始根のリストも出力すべきだろう.これらはγだけで決定されるデータなので,ビルドマトリックスで出力するのが適当だ.

GetResidueCycleで配列サイズオーバーが発生した.γ=1でα=6.⇒修正ミスがあった.⇒対処した.

GetResidueCycleを少し改造して固定桁を計算できるようにした.この値は呼び出し元に参照渡しで返せるようにした.LambdaFunctionでも固定桁をoffsetとして参照渡しで返せるようにした.比較してみると,GetResidueCycleは使い物にならない.修正の余地はあるかもしれないが,一旦ここは廃棄するしかないような気がする.LambdaFunctionは確実に動作しているように思われるので,試してみよう.

▲α=2,γ=18でLambDaFunctionの返すoffsetとdropが一致しない.offset=1, drop=0.drio=0が正しい.GCMで割り込むという手法は正しいと思われるが,そのカウントが直ちに固定桁数に転化する訳ではない.その辺りをもう少し整理する必要がある.

更新モードとテストモードを切り替える

初期画面の表示でMakeRecursionUnit から一行出力されているが,不要なのではないか?⇒更新出力で表示されているので,明らかに不要だ.modflagを新設しValueChangedProの入口で立てるようにした.

Residue Test では「原始根を検出」という表示が出る.Seed Test でも一二行の表示が出るが,前回項目の直後に出力されるため,混同のおそれがある.画面更新の後に改行を入れるようにした方がよい.PrimeTestでは更新出力は出ない.この方がよいと思う.そのテストの結果のみを表示するようにした方がよい.InvertTest も同様の方式だが,MakeRecursionUnitの行が出るだけだ.Matrix Test では更新情報を出しているが,これも抑制した方がよい.つまり,更新モードとテストモードを明示的に切り替えるべきだ.⇒対処した.

固定部と#,gcd(φ(γ),#)の更新が遅れてバタつきが気になる.テキストボックスのクリアは不要なのではないか?⇒ValueChangedの冒頭でClearParameterを実行している.その理由は更新損ねて古いデータが残るような事態を避けるためだが,そろそろ外してもよいのではないだろうか?⇒対処した.快適な表示になった.

★原始根を持つことと離散対数が決まること,Λ値が確定することは同値だろうか?たとえば,α=39,γ=27 の場合,cycle={12*, 9*, 0*}でΛ=不定になるが,R=12や9の離散対数(べき指数)は決定できる.尽数列は現れないから,原始根は持たない.

★ある数αの循環単位Uがβ進数で生成するΞがレピュニット数になる条件はgcd(α, β)=1である.つまり,αとβが互いに素であれば,αの循環単位Uはレピュニット数Ξを生成する.この命題の真偽は?

Prime Test で Test Completeの表示の後に,MakeRecursionUnitの表示が出る.Test Complete はPrimeTestClickで出している.その後,PrimeTest_Clickに戻ったところでvalue_βを書き換えているので,ValueChangedが起動されている.順序が逆転している.PrimeTest_Clickで完了メッセージを出すようにした.

Matrix Test でテストの終わりにステータス情報が2回出る.α=2, γ=31とα=39, γ=31だ.後の方は通常のルーチンだが,最初のは余分な感じがする.どこで出しているのだろう?⇒MatrixTestではテスト終了時にγとαを書き戻している.passflagは落ちているので更新イベントが実行される.現行ではγしか書き換えていないはずだから,αの書き換えは不要なのではないか?⇒これで一度だけになった.⇒いや,αもテスト中に書き換えている.passflagをリセットする位置を一つ下げるということも考えられるが,だとしたら,むしろテスト中はpassflagをオンのままにして,完了時に明示的に更新するようにした方がよい.つまり,完了メッセージを出してからリセットという手順がよいと思う.

これはつまり,OutputStatusの冒頭でUpdateParameterを実行するということを意味する.しかし,これだけではUpdateParameterが起動されない.OutputStatusはValueChangedProから呼び出されているので,イベントを捨てているのだから,テスト完了時点で明示的にOutputStatusを実行する必要がある.⇒OutputStatusではなく,UpdateParameterの起動だ.また,OutputStatusはUpdateStatusにリネームした.大体予定通りの動作になったと思う.

タスクバーのアイコンの状態がおかしい.タスクバーにピン留めすると,古いアイコンが出てきてしまう.⇒アプリケーションとパッケージでそれぞれアイコンを指定できるようになっている.パッケージでも歯車アイコンを使うようにしたが,戻ってしまう.元のリピートアイコンのファイルをフォルダから削除しても効果がない.最終的にリブートしてまともな動作になった.原因は不明だ.

テストの内容については見直しは必要だが,大まかな枠組みだけは整理できた.マトリックスに異種文字数を出すところから着手しよう.⇒いや,異種文字数を出すのではなく,「周期」を図形的に可視化すればよいのではないか?塗りつぶしかないし枠で囲むような形式で周期単位を明示することはそれほど難しくない.行末に数字を見せるより,ずっと直感的なのではないだろうか?異種文字数を仮に出すとしたら,その数字を本体数字と誤読する可能性もある.

(色別にすればよいのかもしれないが)そうなると,マトリックス画面でもコマンドを実行できるようにする必要が出てくる.ポップアップメニューで選択できるようにするというのは一案だが…場合によっては,パネルにボタンを設置することも可能だ.Build Matrixのボックスにチェックボックスを2つ追加してみた.

image

現行では,マトリックスの生成では単純にマトリックスを構成しているだけで,周期などの計算は一切行っていない.マトリックス構築時にこの計算をやってもよいが,チェックが入った時点で初めて計算するというのでもよいのではないか?この計算は行ないし列ごとに行わなくてはならないので,できれば表示されている範囲の計算で間に合わせることにしたいのだが,可能だろうか?横数列の場合はほぼそれで問題ないのではないかと思う.横数列では同じ数がでてくればそれは周期に当たるからだ.周期が見つからなかったとしても,それは長い周期の一部なのだから,特に問題はない.縦数列の周期というのはいまのところ,まだ具体的には実装されたことがない.縦数列の場合には回文というのが出てくるが,これに関しては一応の解析は行っている.

マトリックスは64x64以上のものは作れないが,テーブル自体は原則γ^2のテーブルを生成している.ただし,MAXSQUARESIZE=32767を超えることはできない.従って,γがこれ以上大きい場合にはマトリックスを開くことはできないと考えられる.とりあえずは,これでよいことにしておこう.ベースになるテーブルが存在していれば,マトリックスが小さい場合でも対応は可能だろう.おそらく,Test Matrix ではそれに近いことをやっているはずだ.

出荷直前というモードには入っているが…

出荷直前というモードに入っているが,まだ遠い.

関数名にギリシャ文字を含むというのはあまり美しくない.配列名と読み間違えることもある.⇒Λ()という関数はLambda()に変更した.ΛFunctionはLambdaFunction に変更する.

α=2,γ=244のとき,MatrixTestで配列サイズオーバーが出た.⇒sumh()で起きている.配列サイズをmaxcolumsで指定していた.⇒maxに改めた.また,配列を使い回ししていないときは,Array.Clearは不要と思われる.

TestMatrixでDumpMatrixを実行するようにしたが,時間が掛かり過ぎる.∑だけを表示するようにしてみたが,同じだ.DumpMatrix自体を取り止めるしかない.⇒BuildMartixの中でもDumpMatrixを実行していた.しかし,それを止めると何もダンプされなくなってしまう.⇒止めてあった「縦軸と横軸の異種文字数の分布を比較」を復活させた.今回は,暫定的にここまでとしておく.

異種文字数に関連して,2023/05/15に「文字数xGCMは k-1 に一致することを確認する」という項目がある.これはγが素数の場合に限られているようだが,チェックする必要がある.異種文字数が一致するというのも素数に限られているようだ.多分,この証明は容易に得られると思う.γが素数の場合「(異種)文字数xGCMは k-1 に一致する」のは当然だろう.γ=Pであるとすれば,異種文字数=周期数列=p-1でGCMはつねに1となると考えられるからだ.異種文字数=γ-1となるための条件はγが原始根を持つことであり,非素数でもそのような場合はあり得る.

γが素数の場合は横数列と縦数列で異種文字数の分布が完全に一致する.つまり,異種文字数のリストが順序を無視して一致する.γが非素数で原始根を持つ場合はどうか?⇒Test Matrix を使って調査する.

TestMatrixでは結局異種文字数のカウントしかしていなことになるが,このテストが意義のあるものになるよう結果を整理する必要がある.

updateで出力されるパラメータを見ておこう.「αとγが互いに素でΛ数が立たない場合」という表示が出ている.γが1の場合は除外してもよいだろう.DispNotationが計4回出てくる.DispNotationの呼び出しは,①ValueChangedPro,②DispInvertFunc,③valueBetaChangedで出てくる.①は不要と思われるので止めておこう.⇒DispNotationでダブって表示していた.⇒updateでは画面上のデータをすべてダンプするという形式でよいのではないかと思う.このとき,計算値ではなく,画面上のデータを拾い出して出力するだけでよいのではないか?その方が整理されて分かり易いのではないか,データは網羅的である必要もある.

B面に数字和と数字根を出すことも考えられる.しかし,この2つだけでは一行が埋まらない.もう一つくらいあるとよいのだが… βの素因数は出してある.φ(β)が出ていないのは片手落ちの感じもするが,βはかなり小さい数字なので意味があるかどうか?Λという数は,現在Lamda(α, γ)として取り出しているが,Λβ=Lamda(α, β)というのもあるのではないか?ただし,βの場合はβが基数とも見られるので,Λβ=(β, α)となる可能性もある.⇒最初にすべての出力をverboseで止めておこう.⇒何も出なくなった.ValueChangedProからは,ResidueFuncProをsilent=Trueで呼び出すようにした.

「互いに素でないのに1の項」というメッセージが出た.α=34 γ=18 初項=16 (α, γ)=2 one=1 zero=14 overflow=False.ε=115,β=10.α=37, 39でも出ている.αを変化させただけでは発現しない.このメッセージはDispResidueCycleが出している.どうもこれは,誤動作ではないかという気もするが… ⇒計算がまったく合っていない.検定中のダンプと検定終了後の画面では内容がまったく違う.⇒おそらくValueChangedProを呼び出したあとで障害が発生しているのだろう.アウトプットは画面の内容を転写しているだけなので不一致が生じる可能性がある.テスト中に画面を書き換えていない場合は参照できない.

αの因数が出力されていない.⇒いや,出ている.順序が違うだけだ.

これはかなり由々しき問題だ.⇒再現した.αを39固定とし,γを小さい数から31まで増加させて発生した.表示ではγ=31となっているが,エラーメッセージではγ=30となっている.このエラーはεないしγの値変更イベントから実行されている.上ではγを増加させてとしているが,逆のようだ.31→30の書き換えだろう.⇒ダメだ.再現しなくなってしまった.かなり厄介なことになった.どうもこれはタイミングの問題ではないかと思う.つまり,連続したイベントが重複して処理されているため整合しなくなっているのではないだろうか?

上記の再現テストをやっていて,配列サイズオーバーが起きた.

image

RSという配列で起きている.RSのlengthは34,i=34だ.max2=47でiは範囲内だ.RSは呼び出し元で生成されているが,max2も引数で渡されているので,範囲内に入っているはずなのだが… 呼び出し元のResidueFuncProではmax1=47でPRCycle(47+1)で生成している.PRCycleはシステムに常駐する配列でこの配列をReDimしているのはResidueFuncProだけだ.ResidueFuncProでは引数のnumでαを更新している.これはかなり問題がありそうだ.⇒確かにResidueFuncProがネストして実行されている.K_TextChangedではpassflagを見ているが,立ててはいない.しかし,passflag1本でコントロールするのは難しいと思われる.むしろ,内部に静的変数としてフラグを持たせた方がよいのではないか?⇒収まったようだ.これ以外の数値ボックスの動作もチェックしておこう.⇒総点検し整備した.

MakeRecursionUnitで「γが素数で原始根にならない場合」というのが発生している.γ=43でα=39.固定桁と#,およびgcm(γ, #)に値が入っていない.この現象はβ値を連続的に変えているときに起きた.β=10から増加方向に変化させるとこのエラーが続く.マトリックスが間違っていないとすれば,この動作は正しいということになるのだが… いや,まったく正しい.「r^λ≡1 mod γとなるような最小の整数をrの位数Λと呼ぶ.Λ=γ-1のとき,rをγの原始根と呼ぶ.」当然,γが素数でも原始根にならないαはいくらでも存在する.βを変更しても,αとγの関係は変わらないので連続して,このメッセージが出てきたというだけだ.このメッセージは止めてよい.一応,Λがγ-1でないことだけはチェックしておくことにしよう.

γ=43の場合は,{3 5 12 18 19 20 26 28 29 30 33 34}の原始根がある.⇒Matrix Testでは原始根のリストを出力すべきだろう.ないし,BuildMatrixでマトリックスを生成するタイミングで情報を出力してもよい.⇒一番手っ取り早いのは,異種文字数をマトリックスに表示することではないだろうか?異種文字数がγ-1であるような行は原始根であると言える.⇒マトリックスの末尾桁/行に異種文字数を出しておこう.

▲γ=43, α=1, 2, 4, 8などでは逆数の循環桁数はゼロとなり,U, αU,Ξは空欄になっているのに,レピュニットがTRUEになっている.

通常はコントロールパネルは閉じたまま

#=0の場合を例外として,Λ値をつねに確定値として表示できるようになったので,すでに「Get Λ」というボタンは不要である.というか,これを押すとむしろ,誤動作することになる.現行のGet ΛはΛが不定の場合,γ値を小さくなる方向で操作して有効なΛ取得するということをやっているが,不要というより,有害である.

コントロールパネルは通常は閉じたままという使い方をすることが多いと思われるので,updateボタンを道具箱に移すというのが適当なのではないだろうか?再描画という意味で使われる時計回りの回転アイコンを使えばレイアウトを崩さずに場所を確保することもできるだろう.このツールのアイコンが再描画アイコンと向きが違うだけのものになっているというところが痛いところだが… 循環を示すもっと気の利いたアイコンはないものだろうか?⇒車輪アイコンというのはパターンがいろいろあっておもしろそうだ.歯車のような形状のものもある.

自転車の車輪というのもあるが,スポークと剰余数列には何か結びつきがあるだろうか?歯車アイコンはどうか?2つの歯車が噛み合っている図式などもある.歯車から2つの整数の公約数を求める運動などを連想することは可能だ.数というのが,ある種の歯車装置になっているという直感はかなり正しいような気がするので,これを採用することにしよう.歯車アイコン10というのを以下からダウンロードした.

https://icooon-mono.com/14476-%E6%AD%AF%E8%BB%8A%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B310/

ただし,これだけではアイコンとして使えない.PNGをアイコンに転換するツールが必要だ.ドラッグ&ドロップするだけでアイコンを生成してくれるToYconというのがあったので,インストールしてみた.

https://www.snapfiles.com/downloads/toycon/dltoycon.html

確かに一発でアイコンができた.

image

思ったほどのインパクトはないが,意味は通じるのでこれでよいことにする.以下がおそらく最終的なレイアウトになるだろう.

image

image

一般ユーザはおそらくマトリックスを生成するとき以外はこのパネルを操作しないものと思われる.このパネルは閉じていても問題なく操作できるので,特に不自由はないというより,その方が軽く使えてよいと思う.そうなると,マトリックス生成ボタンも主画面に移すということが考えられるのだが,その辺りはどうか?⇒マトリックスはそう頻繁に開くものではないので,現行でよいのではないだろうか?

これまでブランクになることが多かったΛの値がつねに決まっているというのは気持ちいいものだ.アウトプットにはまだ古い記号遣いが残っている.これらも完全に合わせなくてはならない.出力内容については今回は保留としておきたいが,Matrix Testのアウトプット量がやや少ない感じがする.もう少し何か出してもよいのではないか?

ψγという表示は間違っている.かつてγと呼ばれた変数が現在ψと呼ばれているものなので,ψγではまったく意味が通らない.⇒対処した.

どうも,もう一度変数名を再考する必要がありそうだ.まず,べき指数のψは止めて,εと呼ぶことにしよう.現在独立変数はα,β,γ,ψの4種であり,その意味ではα,β,γ,ε は覚えやすいし,意味もはっきりしている.Rはその意味では従属変数であり(ユーザ入力は可能だが,多少変則的な性格がある),独立変数をギリシャ小文字とし,従属変数は大文字で統一するのがよいと思う.R,Λ,Uはすべて従属変数だ.

ψαとψγはどちらもマトリックスのインデックスに関わる値なので,一種の位相のようなものとしてべき指数と共通のψという文字を割り当てたが,①いずれも従属変数であり,②位相という概念を導入するのはまだ時期尚早,③実態は剰余であり,Rα/Rεないし,αR/εRのような表記の方が適切,かつ直感的と結論した.⇒また,記号の一括変換をやらなくてはならない.こんどのは少し厄介だ.⇒いや,簡単に終わった.

アウトプットで使われている文字をチェックしておこう.⇒どうも現状ではどのテストもほとんど何も(独自)出力していないように見える.MatrixTestの出力が少ないのはDumpMatrixを止めているためだろう.

▲PrimeTestで「φ=keta」のような表示が出ているが,これはΛがφ(α)を割り切ると考えていた頃の残留物ではないか?

▲テストの開始と終了を明示的にアウトプットする.

アウトプットとストリームへの書き出しが未整備⇒OutputStreamというルーチンを新設し,①Debug.WriteLine, ②出力パネルへの書き込み,③パネルのスクロールを一括操作できるようにした.

φ(α)とφ(γ)の約数列が出なくなってしまった.φ_αTextとφ_γTextだ.⇒これらの文字列はouttextで保持していたため,verboseで止めてしまっていた.⇒解消した.

α=244, γ=2でΛ検出不能になる.αがγで割り切れてしまうためだ.これはγを(α, γ)で割り込んでいったときに1となることで判明する.このような場合には検出不能を表示しない.

α=244,Γ=2のとき,Λ=2となるが,ΛFunction=0で一致しない.検算のため,GetResidueCycleの結果と比較しているが,cycが1を返しているため,Λが2となっている.⇒cycには固定部の長さも含まれる.⇒論理ミスがあった.修正して正しく動作するようになった.

▲DumpMatrixで配列サイズオーバーが発生した.

▲保存ファイル名とホルダーの指定の動作が芳しくない.