ColoringStripeでレンジオーバーエラー

α=8, ε=2023, γ=54でマトリックスを表示しようとしてColoringStripeでエラーになった.

image

.Rows(topn).Cells(leftn).Style.BackColor = colでセルの背景色を設定しているところだ.topn=6, leftn=2006が入っている.maxrowsは34,maxcolumns=34だから,明らかにレンジを逸脱している.mat.ColumnTopの2006という数がそのまま適用されている.どこかで修正ミスを冒しているのではないか?おかしい.この論理は元々は .Rows(i).Cells(j).Style.BackColor = colのようになっていたはずだ.⇒確かにこれでエラーは発生しなくなったが,カラーリングがおかしい.

image

かなりややこしい.難しい論理になっている.一応動作するようになった.多分これで間違いないと思う.

ここまでで一旦閉じることにする

さて,いよいよ最後の課題に掛かることにしよう.縦数列のセグメントを半分に折ってそれぞれを着色するという課題だ.これを行えば,異なる数列で和が一致してしまう場合を分離することができる.また,副次効果として回文の見える化にも寄与するはずだ.かなり面倒な仕掛けだが,やってできないというほどのものではない.また,やるだけの価値はあるものと思われる.現行のstripeカラーはそのまま温存したいので,このカラーリングは追加ということになるが,問題は管理パネル上の余白が乏しくなっていることだ.

このカラーリングをとりあえずsegmentカラーリングと呼んでおく.ボタンを止めて,リスト化するという方法も考えられる.というか,それしかないのではないか?ボタンの方が素早く切り替えらえられるという利点はあるが,この機能は必要に応じて使われるような種類のものなので,許されるのではないだろうか?リストは以下のような構成になる.

  1. Color off
  2. Color on
  3. Color cycle
  4. Color stripe
  5. Color segment

最後のColor segmentというのが,これから実装しようとしているセグメントカラーリングだ.γの周期性に関わるパラメータX, Y, Zはこれまでchi, upsilon, zetaとしてきたが,間違い易い/書きづらいので,X, Y, Z に統一することにする.Xの値はLambdaFunctionが返す周期#の最大値である.⇒カラリングの切り替えをラジオボタンからコンボボックスに変更した.それほど違和感は感じない.

セグメントを細分割する際の手掛かりとして,異種文字数1の行というのを考えてみたが,どうもうまく割り切れるようには見えないので,当初予定通り単純に2分割するという方向で進めることにする.手順は下記のようなものになる.

  1. Yが奇数の場合は,最下行の0行を除外すると偶数になるので,2頭分して個別に色分けする
  2. Yが偶数の場合は,最下行を含めてそのまま2分割して色分けするか,ないし最下行と中央の行を除外して残りを色分け表示する

γ=18の場合,Y=6で偶数だが,ほとんど同色で塗りつぶされている.なぜか?{1,4,9,16,7}=37,{1,8,9,10,17}=45,{1,16,9,4,13}=43,{1,14,9,16,11}=51でそれぞれ値は異なるのにほぼ同じ色に見えてしまう.⇒色々調整してみたがなかなかうまくゆかない.異種文字数がまったく異なるのに同じ色になってしまうというのは納得ゆかない.むしろ,異種文字数を基準にした方がよいのではないか?

異種文字数は列に属する値でセグメントと1対1対応していないが,異種文字数の4倍を加算することで分離できるようになった.母数を大きくしないでオーバーフローしたときは360の剰余を取るようにしてかなり解像度は高くなったのではないかと思われる.

いろいろ検討してみたが,セグメントカラーリングは取りやめることにする.ある程度色で識別できるようになったので,しばらくはこのまま運用してみることにする.あとはマニュアルを書くだけだ.

異種文字数に関しては整合するようになった

α=15, ε=4,γ=12のときの異種文字数がおかしい.上から見てくると,α=7で{7, 1, 7, 1,}が1となり,その次の{8, 4, 8, 4, }が3,{9, 9, 9, 9, }が2,{10, 4, 4, 4, }が1と軒並みおかしい.12行目では{0, 0, 0, 0, }で2となっている.異種文字数のカウントはBuildMatrix,それを読んでBuildPowerGridでマトリックスに表示しているはずだが,どちらが間違っているのだろう?

配列の内容はcharNVが{0, 12, 4, 9, 4, 0},charNHが{0, 1, 3, 2, 1, 2, 2, 0}となっているので,配列の中身がそのまま表示されている.つまり,配列の内容が間違っている.ただし,charNV(1)=12はマトリックスでは9と表示されているので,食い違いがある.charNHとcharNVの値はGetCharNumHとGetCharNumVで取り出している.⇒原因はわかった.縦数列では横数列のように周期で区切ることができないという点が見落とされている.つまり,セグメントというのは単なる区切りであり,周期ではないということがよく理解されていない.言い換えると縦数列の検定では検定区間をγより短くはできない.別の言葉で言えば,縦周期Yが区間と誤認されている.

いまの場合はγ=12でY=6だが,縦周期Yで繰り返されるという仮定で動作している.これは誤りだ.

BuildMatrixとBuildPowerGridで区間γに対応するよう修正した.これで概ね異種文字数の表示は正しくなったように思われるが,まだ二三不審な点がある.γ=12のマトリックスで最下行の異種文字数のうち最左の9というのはおかしい.0~11までの数字が現れるのだから,12でなくてはならない.また,12行目と24行目の最初の数字は0になっているにも関わらず,異種文字数は2となっている.

charNV(1)=12となっているのに,表示が9となっているのはなぜか?かなり微妙な問題だ.charNV配列の長さはX+Zで事例ではX=2, Z=1となっている.BuildPowerGridではこの標準配列を使ってテーブル上の任意の矩形領域を表示しようとしているため,列番号から標準配列のインデックスへの変換を行っているが,この論理の中に列番号がゼロになった場合はXに読み替えるという処理が入っている.この辺りで誤動作しているものと思われる.

マトリックス先頭列+jの値がXより小さい場合は変換しないで直接適用するように書き換えておこう.⇒解決したようだ.事例ではγ=12となっているので,αが12の倍数であれば剰余は0でなくてはならないから,12行目,24行目の最左ノードが0であるというのは正しい.従って,異種文字数が2となっている方が間違っているように思われる.⇒上記と同様な仕組みになっている.行がγの倍数のときはYで置き換えるようになっている.Yでなくて,γでなくてはならない.

修正して動作するようになった.これで異種文字数に関しては整合するようになったのではないかと思う.upsilonつまりYを参照しているところはすべて点検しておく必要がある.⇒一応OKのようだ.

まだいろいろあるが,かなり整って来た

57428571880/142857143を計算しようとして,どこかでハングしてしまった.GetDivisorsで手間取っている.yakusu=288でO(288^2)だが…ラムダ関数が反復呼び出されているためだ.⇒DispModPowではi=1 to γ でラムダ関数を実行しているが,γ={142857143}なので,途方もない時間が掛かっている.ここでやっているのは,X, Y, Z値の計算だ.現在i={1683067}なのでまだまだ停止しそうもない.γが大きいときにはここはパスした方がよい.

MAXPOWERINDEX=65535 べき乗指数の上限を限界としておこう.⇒上限まではループを回すようにした.上限で打ち切られた場合には値は不正確なものになる可能性はあるが,出ないよりはましなのではないだろうか?⇒MAXPOWERINDEXでは大き過ぎる.MAXSQUARESIZE=32767まで落としてみた.上の事例ではXとZには値が入り,Yは空欄となった.⇒Yには0を出すようにした.⇒いや,Y=0というのはおかしい.不定という方がましだ.

MatrixにsumR, charNV, charNHという配列を設置して事前に異種文字数とセグメント和を格納しておくようにした.sumRは横周期X・セグメント数,charNVは横周期X,charNHは縦周期Yという大きさになっている.Xは横周期,Yは縦周期なのでこれ以上小さくはできないが,横周期の場合には固定部というのがあるので,もう少し広げておく必要がある.この値はzetaに入っている.

マトリックスに異種文字数が表示されない.⇒「異種文字数をカウント」をBuildMatrixに移しただけで,表示の方は手当てしていない.これから整備する必要がある.⇒従来論理を復活させたら,「色相の値が不正」というエラーになった.maxcol=153で, sumR=408, col={255, 255, 255, 255}になっている. maxcolは=γ * (γ +1) / 2で計算しているが,sumR<maxcolでなくてはならないはずだ. γ ^ 2 としておこう.いや,それでもまだ足りない.max=289に対しval=408だ.γ=17だから,24個以上加算されたことになる.

わかった.同じ位置にダブって書き込まれているのだろう.セグメント和を計算しているのはGetCharNumVだが,ここでは1~maxcolumsまでのすべての行が対象となっている.

α=8,γ1=1のとき,BuildMatrixでゼロ除算エラーが起きた.Y(upsilon)が不定になっている.⇒DispModPowでΩがゼロのときは,upsilon=γとした.γ値はゼロにはならないので安全だ.

ゼロ行の異種文字列がゼロとなっているが,これでよいのか?0は1桁の周期列とみなすということにしたはずなのだから,異種文字数1でなくてはならないのではないか?仮にゼロ行に関しては異種文字数0でよいとしても,γ=2のとき,縦数列で0と1が混在しているのにゼロになっているのは明らかに誤りだ.もし,0もカウントするとすれば,ここでは2になっていなくてはならない.

γ=3のとき,1列目は{1, 2, 0}で3となっている.2列目は{1, 1, 0}で0,以下同じで異種文字列の行は{3, 0, 3, 0, }のようになっている.γ=4のとき,3行目は{3, 1, 3, 1}で1,{1, 1, 1,,}でも1だ.γ=5では,{1, 1, 1, 1,}の列が0になっている.

まだいろいろあるが,かなり整って来たことは確かだ.ゼロ行の異種文字数がゼロという問題を片付けておこう.「異種文字数のカウントからあらかじめ固定部を除く」という提案があるのだが,これはどうか?横数列と縦数列で異種文字数の合計が一致するという予測がある.特に,番外の固定部の異種文字数合計は一致しなくてはならない.⇒ゼロ行の異種文字数は0でもよいような気はする.これはある種のセパレータになっているので,0が表示されていた方が区切りが見つけ易いのではないか?0は固定部にはカウントされないという規則はすでに確立している.異種文字からも除外するというのはそれほど変則ではないのではないか?むしろ,縦数列で{1, 1, 1, }が0となっている方が問題だ.ただし,縦数列ではどうも0をカウントに入れているようにも思われる.γ=17で異種文字数17という列があるのだから間違いない.

縦数列の異種文字数カウントでループが回っていない.yoko = X+Z = 16+0になっている.つまり,周期の境界線が外されている.⇒というか,Xの剰余がゼロになってしまう.Xの剰余ゼロのときはXを使うように調整した.これで縦数列で{1, 0, 1, 0,}の場合は異種文字数2ということになった.0をカウントしないとすれば,1になるが,話がややこしくなるので,シンプルに0もカウントするということに決定しよう.⇒横数列で0がカウントに入らないのも上と同じ理由だ.つまり,Yの剰余がゼロになっている.⇒調整を入れた.これで完全に整った.

「異種文字数のカウントからあらかじめ固定部を除く」という件に関しては取り敢えず保留とする.まだ,縦・横の異種文字数の関係が完全に解明されていないので,もう少し詳しいことがわかってからでも遅くはないだろう.これで縦数列のカラーリングはひとまず落着したことになるのだが,もう一つだけ懸案がある.数列の内容は異なるのに合計が一致してしまうという問題だ.たとえば,γ=7の場合,縦数列は{1, 1, 1, 1,}を除いて2色で塗り分けられているが,実際には4パターンあり,合計が一致しているために2種に縮退している.

{1+2+3+4+5+6}={1+1+6+1+6+6}=21,{1+4+2+2+4+1}={1+2+4+4+2+1}=14.これを弁別するためにセグメントを半分に分割して着色するというアイディアがある.こうすると,①パターンの異なることが明白になる,②回文になっていることも色で推定できるようになる,という利点がある.もし,これを実装するとしたら,全セグメントカラーと半セグメントカラーのオプションを選択できるようにする必要があるだろう.ここまでできれば,とりあえず当初予定したレベルには達したと言えるのではないだろうか?かなり込み入った話にはなってくるが,やってみるだけの価値はあると思う.

この検定で興味深いところは,Yが偶数のとき,中央の境界線では異種文字数1になるのではないかと予測されているからである.異種文字数1という行の典型は0行と1行だが,それ以外の数字でも起きる場合があり,これは特異なパターンとして注目されてよい現象と思われるので,それを際立たせるという意味からも意義があるように思われる.ただし,Yが小さい場合には細分化されて細切れ様になってしまうため図柄的に分かり辛いもになってしまうというところもあるのだが…

▲どうもまだ異種文字数カウントにバグが残っているようだ.α=15, ε=4,γ=12のとき,α=7の横数列{7, 1, 7, 1,}が1,{8, 4, 8, 4,}が3,{9, 9, ..}が2など数字がまったく合っていない.固定部を持たない0行が2になっているところもある.

異種文字数のカウントにやや問題がある

▲異種文字数のカウントにやや問題がある.異種文字数はBuildPowerGridの中でカウントしているが,この方法だと計算を誤る可能性がある.生成されるマトリックスは必ずしもγ全体に及ぶとは限らないのでカウントされない部分が出てくる可能性がある.異種文字数の計算は少なくともBuildMatrixの中で実施して,BuildPowerGridではその結果だけを使うというようにしないとまずいと思う.また,固定部桁数は別途計算できるので,異種文字数のカウントからあらかじめ固定部を除くようにした方がよい.ただし,マトリックスのカラー表示は現物のマトリックスを対象としているので,その点注意する必要がある.

GetCharNumVとGetCharNumHはテーブルを使わずに直接計算している.ただし,内部で使っている作業用配列は最大MaxOutput=32767だ.これをMAXARRAYSIZEまで拡張しておけばよいのではないか?TestMatrixの中にも異種文字数をカウントしているところはある.ここでは配列上限はMAXSQUARESIZE=32767だ.BuildPowerGridではGetCharNumVとGetCharNumHを呼び出しているので,現状で問題ないのではないか?一応この問題はこれで落着ということにしておこう.

▲R値はテーブルから取り出しているが,セグメントがテーブルの境界をまたいでいる場合には計算できない.⇒セグメント値の計算もGetCharNumVのように直接実行するということは考えられる.GetCharNumVではすべてのR値を現物計算しているので,そこでセグメント単位に加算すればよいはずだ.GetCharNumVでは1~γまでのR値を計算しているので,その中でR=0となる位置を区切りとして集計すればよいのではないか?計算結果を配列に格納しておいて呼び出し側に渡してやれば,なんとかなるのではないか?それほど面倒な話ではないはずだ.セグメントを2つに分割するという話も出てきているが,それはこの工作が終わってから考えることにしよう.

セグメント数をどこで計算していたか見ておこう.この値は現在Y(upsilon)として表示されているものだ.Yはλの固有値でDispModPowで計算している.また,この値はBuildMatrixで転記されてマトリックスのupsionに格納されているから,いつでも使うことができる.とりあえず,matrixにSumR()という配列を置くことにしよう.⇒一応動き始めてはいるが,方式的な欠陥がある.

BuildPowerGridでは最初にGetCharNumVを実行した後,ColoringMatrixを実行しているが,これではsumRを取り出すことはできない.sumRは列毎に異なる値を取るので,格納するとすれば二次元配列が必要になる.一次元で間に合わせようとするのなら,GetCharNumVと並行してカラリングしなくてはならない.GetCharNumVは共通処理,ColoringMatrixは個別処理なので分離しておきたい.とすれば,二次元配列を使うしかない.

横数列は完全周期を持っているので,それほど大きな配列にはならないだろう.幅はXで高さがγ¥Yだ.⇒逆にGetCharNumVの過剰動作が起きている.GetCharNumVはBuildPowerGridから呼び出されているため構築されたマトリックスの範囲のデータを揃えようとしているが,Xがそれよりも小さい場合は過剰動作となる.むしろ,この処理はBuildMatrixに移して標準動作とした方が効率はよいのだが… 現行のまま進めるとすれば,すでに書き込まれた部分はパスするように作らなくてはならない.かなり厄介な話だ.

処理をBuildMatrixに移し,必要な最小サイズの配列を生成するようにする.配列はMatrixに格納しておけばよい.BuildPowerGridではこれをスープストックとして伸ばして使えばよい.⇒しかし,これでもまだ厄介な点は残る.横数列は巡回するとは言え,冒頭の固定部は無視できない.最低でも固定部+周期列の長さは必要だ.剰余を格納しているMTは実際に生成されるマトリックスに合わせている.

縦数列のカラリングには問題がある

とりあえず,数値から色コードへの変換はできるようになった.縦数列のカラリングは列単位に実施する.⇒おおよその実装は終わったが,いくつか問題がある.

  1. 縦数列ではセグメント単位に着色している.セグメント内のR値の和を求め,それを色コード化しているが,内容は異なるのに和が同じになってしまう場合がある
  2. R値はテーブルから取り出しているが,セグメントがテーブルの境界をまたいでいる場合には計算できない

縦数列はγを周期として循環しているので,γ^2のテーブルがあればセグメント値を計算することはできる.多少ややこしいが,それをやるしかないのではないか?あるいは,テーブルを生成するときセグメント境界まで膨張させたテーブルを作るか?

項1に関してはセグメントを2分割することが考えられる.2分割して計算すると,回文になっている部分は上下で同じ値になるが,和が同じになる数列を分離できる可能性がある.多分この方が少しわかり易くなるのではないかと思う.

セグメント数Yはγの奇偶によって奇偶が変わる

▲γ=20で奇妙なパターンが現れた.α=7.ε=4で真ん中のセグメントだけ縦縞が出ている.

メールボックスが壊れて中身が空っぽ

メールボックスをずっと放置していたが,久々にアクセスしてアーカイブしようとしたところ,メモリ不足で処理できないというエラーになった.フィルタを調べてみると中身が空っぽになっている.それどころかメールボックスのフォルダ自体が161MBしかない.つまり,ほとんど空っぽになっている.バックアップを見ると26GBくらいあるので完全に空になってしまったと言ってよい.なぜこんなことになってしまったのか?ほとんど見当がつかない.

ネットアクセスに関してはいろいろと問題が起きているので,どこかの時点でハッキングされている可能性は高い.最近はメールボックスのバックアップをほとんど取っていなかったので,直近のバックアップは2022-03-20というのしかない.それでも空よりはましなので差し替えておくことにしよう.⇒なんとか完了した.未分類メールが大量発生しているが,あとで始末することにしよう.

いよいよ,縦数列のカラーリングに入ることにしよう.まず,一般的に数値を色コードに変換するルーチンを作る仕事がある.これが結構難しい.整数をRGG6桁の16進数にエキスパンドないし圧縮すればよいのだが,適当に散らばらせるためにはビット操作するしかないように思われる.多分,圧縮の場合は(事実上)考えなくてもよいのではないかと思われるので,エキスパンドの方法について考えてみることにしよう.

数値から直接RGBに変換するというのは難しい.むしろ,HSVを使った方がよさそうだ.Hは色相,Sは彩度,Vは明度だ.Hは0≦H≦360,S,Vは0≦S,V≦100だが,数値をHに変換し,SとVは固定でもよい.これなら簡単に実装できる.HSVからRGBへの変換は以下の式で行える.⇒以下のサイトからコードを拝借した.

https://dobon.net/vb/dotnet/graphics/hsv.html

image

ちょっと派手目な色になってしまうが,仕方ないだろう.あとは縦縞を描くだけだ.こちらも少し面倒くさいがなんとかなるだろう.

べき剰余数列に現れる0の扱い方に誤り

べき剰余数列に現れる0の扱い方が間違っていた.一度0が発生するその後は0が続くことになるので,当初は0という一字だけの最短の周期列とみなすという立場を取っていたのだが,どこで切り替わったのかよく覚えていないが,いつの間にか0は周期列に入れない,つまり,周期列を持たない固定部だけの数列ということになってしまった.しかし,一文字だけ連続するというのは0に限った話ではなく,マトリックスの一行目は必ず{1,1,1,1,…}となるし,1や0以外の数字が並ぶ{9,9,9,9,…}とか,{10,10,10,10,…}などというのも頻繁に出てくる.

異種文字数をカウントしてその行ないし列の異種文字数と周期が一致しないような場合を濃色で表示することにしているが,この場合,0を周期列にカウントしないと横数列の異種文字数例外と縦数列の異種文字列例外が整合しなくなってくる.縦数列では縦に集計した異種文字数はそれ自体が横数列としての周期を持っているが,その例外となるのは固定部を持った列のみであるはずなのに,うまく数字が合わなくなる.従って,{0}はそれ自体周期列であるとする以外にないと思われるが,修正はかなり広範に影響する可能性があるので,慎重に行う必要がある.どこから着手すればよいか?

固定部のoffsetを計算している箇所は多分2箇所と思われる.ラムダ関数とPowerResidueFuncだ.どちらもこのツールの要と呼ぶべき重要関数だが,まず簡単そうなラムダ関数の方から見ることにしよう.⇒この関数ではγ=1のときoffset=1としているが,これでよいのだろうか?

γ=1でマトリックスを開こうとして例外が発生した.

image

ゼロ除算が起きている.α mod Xで起きている.マトリックス先頭行の指数のインデックスを表示しようとするところだ.γが1ということはすべての値が割り切れるはずだから,すべての行が{0,0,0,0,…}のようになるはずであり,固定桁=0,周期1となるのが正しいように思われる.この場合,X=1でなくてはならないのではないだろうか?この値XはBuildmatrixで計算しているので,そちらを修正する必要があるが,暫定的に1を強制しておこう.⇒こんな図になった.

image

周期ゼロなのだから,横インデクスがすべてゼロというのは正しい.Zも1になっているが,これでよいのだろうか?Zは縞周期と呼ばれる横縞の幅でγ/0行数だが,いまの場合は0行数=γだから,Z=1でよいと思われる.いや,間違えた.それはYのことだ.Y=1はよいが,X=0は間違っている.BuildMatrixではX値を計算していない.表示されている値を数値化しているだけだ.この値を計算しているのはDispModPowだ.この関数はLambdaFunctionの返す値を見ているだけなので,やはり,LambdaFunctionから修正する必要がある.

ValueChangedで例外が起きた.

image

DispParametorでエラーが起きている模様だ.DispModPowの中でΩがゼロになっている.今回の仕様変更によってすべての行はなんらかの周期列を持つことになったのでこの方式ではΩ数をカウントできなくなったが,ともかく例外が発生しないようにしておこう.

α=1,γ-2では問題なくマトリックスを開けた.X=1,Y=2,Z=1となっている.このzは0でなくてはならないものと思われる.なぜなら,縦数列の異種文字数はすべて2で,周期1の単純な周期列になっているからだ.⇒LambdaFunctionを修正してR=0が検出されたとき,offset=i-1を返す用に修正した.

DispResidueCycleで固定桁数不一致が発生する.λ<>周期 不一致も起きている.⇒この不一致はPowerResidueFuncとLambdaFunctionの間で起きているので,PowerResidueFunc側にも対応修正を入れる必要がある.LambdaFunctionではoffset=1, λ=0となっているのに対し,PowerResidueFuncはdrop=1, period=0を返している.

▲DispInvertFuncで停止した.α=7, β=10, ε=4,γ=2.理由はR2 <> 0.R2はnU mod β-1. PowerResidueFuncは逆数モード(Bブロック)でも使われているので,上の修正が影響している可能性はある.nU=40,β-1=9.⇒Bブロックについては後で確認することにする.

一応修正は一通り入ったはずだが,点検に入る前に異種文字数例外の濃色表示をモードに関わりなく出せるようにしておこう.⇒大体できた.とてもわかり易くなった.

image

X, Y, Zがマトリックスの形状を決定していることがよく分かる.Xは横周期,Yは縦周期,Zがオフセットだ.上の図ではX=2, Y=2, Z=2となっているが,横周期は2,ゼロ行の周期は2,左下の変則的な部位を示す濃色部は2桁になっている.これらの例外部位を除くと,異種文字数にも完全な周期性が確認できる.横数列の場合,最右列を見ると,{1,3,2,2,2,3.2,1}のようになっているが,固定部を例外として除くと,{1,1,2,1,2,1,2,1}であり,これは{1,1}{2,1}{2,1}{2,1}のように読み替えることもできる.縦数列の最下行を見ると{5,2,5,2,…}で完全な反復になっている.まだ完全に解析できた訳ではないが,縦横数列の規則性がはっきり見えてきたのではないか?

どうも,このZという数は1, 2, 3などのごく小さい数しか現れてこないような気がする.本当にそうだろうか?だとすれば,この数はもっと注目されてよいような気がする.γが2^kの場合はZ=k-1になる.おそらくこれが最大値ではないかと思われる.どうもこの値はγに含まれる素因数2の個数-1であるような気がする.たとえば,γ=448=2^6×7なのでZ=5で間違いない.2以外の素因数は関係していないようだ.

ここまで来れば,縦数列をセグメントで色別表示することもできるだろう.現行のstripeカラー表示は存続させて,新たに処理を追加することにする.⇒数値をカラーコード化するのはかなり難しい.既存のstripeカラー表示では同様のことをやっているのだが,かなりインチキな代物で「数値のカラーコード化」とはかけ離れたものだ.

縦数列の解析は難しいが…

縦数列の解析は難しいが,以下のようなカラーリングが考えられる.

  1. 0行と0行の中間にある縦数列をセグメントとする
  2. 各セグメントのR値の和を求め,その値をカラーコード化してそのセグメントを塗りつぶす
  3. 横方向の周期性は確立しているから,一般にこのカラーは(セグメント幅の)縦縞のパターンになる.
  4. 縦方向に繰り返しがある場合には縦縞は複数段に続くことで反復していることが可視化される
  5. 回文はこの方式では同一カラーに塗りつぶされるが,接続していることは把握可能だ
  6. 一つのセグメントが回文化している場合にはこの方式では弁別できない

不十分なものではあるが,ある程度まで縦数列のパターンを可視化することは可能なのではないだろうか?

▲道具箱右下の(φ, @)の表示はあいまいだ.φの引数を明示すべき.なし,Bブロックにφ(α)とその約数リストを移動すれば,AブロックとBブロックの関係が見易くなるのではないか?Aブロックではα^ε%γ,Bブロックではβ^e%αの関係が見えてくる.⇒移動してみた.

image

やや唐突感はあるが,αとβの関係がγとαのような関係になっていることが見えるのではないだろうか?

▲γ=32のマトリックス:stripeカラーでほとんど同色になってしまう.現行方式ではある程度同色になるのは避けられないが(むしろそれによってパターンが見えてくる)一様に同じというのはおかしい.

「縦数列でも固定部を含むところは横数列のように濃色表示したい」という提案があるが,意味があるだろうか?縦数列では縦方向の固定桁というのは存在しないから,異種文字数と周期が不一致という状況はそもそも存在しない.しかし,異種文字数を見ると,冒頭の部分には明らかに変異があることが見て取れる.

異種文字数

上図で見ると,異種文字数に変異が出るのは0行で0が始まる位置までということが言えそうだ.固定部があっても0にならない場合というのはあり得ると考えられるが,offsetの最大値とすれば間違いはない.ここまでをイレギュラーな領域としてよいのではないかと思う.その後の異種文字数はX値の周期で巡回している.

BuildPowerGridで異種文字数をカウントしている.X値(横周期),Y値(縦周期)を計算するところでZ値として固定桁数の最大値を求めておけばよいのではないか?まず,これをやっておこう.

▲どうも,やはり,0は周期に入れなくてはならないようだ.0を固定部に組み込むと数字が合わなくなる.単数で連続するものは0の他にもいくらでもあるので,0だけ特別扱いにする理由がない.この修正は慎重にやらないと失敗する.明日の仕事に回した方がよいのではないか?

Tak Maki 氏のヒントから全面書き直し

Tak Maki 氏のヒント(べき等という概念の導入)から全面書き直しということになった.要点を拾ってみよう.

  1. 縦数列に「セグメント」という概念を導入する.セグメントは広い意味での縦数列であり,長さは固定でゼロ行で区切られる横縞の幅となる
  2. セグメントは,①複数のセグメントを接続して尽数列になる場合,②2つのセグメントが対向して回文になる場合,③セグメントが反復して繰り返しになる場合の3パターンがある
  3. stripe カラー表示モードでは,同一セグメントを同一カラーで塗りつぶす.ないし,項目2の3パターンごとに色を変える
  4. マトリックスのカラー表示モードを1つ増やして現行のstripeカラー表示は,color カラー表示モードとする
  5. セグメント長Ωはγの約数.γが素数ならΩ=γ.ゼロ行はΩを周期として現れる.セグメント長は広い意味での縦数列の周期であると言える
  6. γが更新されたときに実行されるUpdateGammaを新設する.この関数ではzeroの発生を監視してγに対するΩ値を決定する.
  7. これまでΛ値は,αとγによって決定される横数列の周期,ないし,α^γ≡1 mod γとなるようなγの最小値としてきたが,これを改めて,そのようなγの最小値の中で最大のものと再定義することにする.これによって,Λはαの値によらず,γによって一意に決定されるような数となる.このΛ値の計算は項目6のUpdateGamma関数の中で実施する
  8. この修正はマトリックス生成関数にも及ぶ
  9. UpdateGamma関数では,ツールボックスに ①γの素因数リスト,②Λ値,③Ω値を表示する.
  10. Rα,RεをリネームしてXα,Xεとする.Xαは2つの項からなり,(a, b) ないし a-b のように表記する.a は縦数列内のセグメント番号でbはセグメント内のインデックスであるとする.

γの素因数リストはValueChagedProで出すようにした.Xα,Xεもここで出すようにしておこう.Xα,XεはDispModPowで出しているので,γの素因数リストもここで出すのが適当かもしれない.Λの計算はどこでやればよいだろう?この計算はResidueFuncPro→ PowerResidueFuncで行うのが順当だが,いまのところPowerResidueFuncのロジックはいじりたくないので,別途新設する.効率的ではないが,ValueChagedProの中でLambdaFunctionを1~γまで呼び出すことで取得するようにした.一応問題なく動いているように思われる.

これで見ると,従来のλは廃止してもよいように思われる.あとは,XαとXεだけだ.いや,まだある.Ρが出力されていない.⇒λを廃止し,Λをλにリネーム,Ρはωにリネームした.まず,Χαを出してみよう.Xεはこれまで通り,ε mod φ(γ)なので修正するところはない.Χαを出すためにはまず,ωが必要だ.これはどうやって計算すればよいだろう?ゼロ行=周期数列なしだから,λ=0を見ればよいのではないだろうか?⇒できたようだ.セグメント長が正確に計算されている.

実装に移る前にもう少し調べる必要がある.縦数列の周期は思ったより複雑だ.γ=15のとき,ω=15となり,ε=1, 3, 5, .. で一つ置きに尽数列になるが,それ以外では異種文字数は4と6が交互に発生している.このうち,4となるのはε=4, 8, 12, 16などでここでは[1,1,6,1,10,6,1]の回文が発生している.また,異種文字数=6の場合,{1,4,9,1,10,6,4}の回文になっている.明らかになんらかの規則性は認められるのだが…

γ=16ではω=2だが,異種文字数(以下Δとする)は先頭のオフセット部を除いて,2,9,3,9, の繰り返し(λ=4)になっていて,Δ=2の場合は,{0,1}の反復,Δ=9では{1,0,3,0,5,0,7,0,9,0,11,0,13,0,15,0},Δ=3では{1,0,9,0,9,0,1,0}のような回文の反復になる.γ=7の場合は,Δ=7,  4, 3, 4, 7, 2,のようなλ=6の周期になっているが,Δ=7で{1,2,3,4,5,6,7}の尽数列,Δ=4では{1,4,2,2,4,1}という0で区切られた回文の繰り返し,Δ=3では{1,1,6,1,6,6}の繰り返しになっている.Δ=2では0で区切られた{1}の反復になっている.

ωという区切りは明瞭で意味があると思われるが,0行に挟まれた部分をセグメントと呼ぶのはよいとしても,それをアドレッシングの単位にするのはやや無理があるような気がする.むしろ,従来通り,Xα=α mod γとしておいた方が扱い易いような気がする.

λとωのラベルを入れ替えた.つまり,縦周期(ゼロ行間隔)がλ,横周期が(最長横周期)ωとなる.縦軸インデックスでは縦周期は無視され.つねにγ-1の剰余となるが,横周期はφ(γ)ではなく,より短いωのインデックスになるべきである.⇒もう一度変えてみよう.横周期をX,縦周期をYとする.ギリシャ文字で言うと,chiとupsilonだ.その上で,RαをYα,RεをXεとした.これなら読み間違えることはないだろう.

▲縦数列でも固定部を含むところは横数列のように濃色表示したい.このためには,どの桁に固定部が入っているかを見なくてはならない.結構手間が掛かりそうだ.固定桁の最大数が除外される部分ということになる.⇒現行では異種文字数の着色はcycle カラー表示の場合に限定されているが,オプションと無関係に表示すべきだろう.