マトリックスの列ヘッダをクリックして列選択できるようになった

BuildMatrixで例外が発生した.N=2684380,K=6,e=4.⇒マトリックスのパラメータ設定に関わるエラーだ.「DataGridView コントロールの SelectionMode が ColumnHeaderSelect に設定されているとき、列の SortMode を Automatic に設定することはできません。」⇒BuildPowerGridでグリッドを初期化している.冒頭で.SelectionMode = DataGridViewSelectionMode.RowHeaderSelectを実行して解決.

Kを減少方向に変化させて,ゼロ除算例外が発生した.DispModPowの中で起きているようだ.K=1のとき,K-1=0になる.⇒対処した.

e=2でKを変化させると,eRの値は,K=1で不定,K=2と3ではeR=0になる.この動作は正しいか?⇒どうも,話が合わないような気がする.⇒2023-06-04のログで,MakeStripePatternで剰余演算によりゼロ除算が発生したという報告がある.このときは,①除数がゼロになる場合は除算を実行しない.②べきが0になった場合にはK-1を代入する,という2つの対策を実施している.MakeStripePatternでは,i=1→Kで{x=i^pow mod K}の数列を生成している.べきpowはべきがKより大きい場合にはpow=beki mod K-1 で剰余を取っている.

たとえば,K=4のとき,e=3, 6, 9ではeRは0になるが,マトリックスの指標としてみる場合には0という数字は現れないので,eR=0→eR=K-1のように換算する必要がある.nR=0にも同様の問題はあるが,行の場合は行ヘッダが表示されないので,剰余が1列目に表示されているが,それが0になっているので,特に手当しなくても問題ないようには見える.⇒縦軸は番号Nとみなすべきだから,やはりゼロは適当ではないと思う.eRの場合と同様0→Kのように読み替えるべきだ.⇒これでやっと辻褄があう.行番号Nと列番号eには0が現れないようになった.行番号のKというのが0の並びになる行だ.eRもnRも完全に断続なしでシーケンシャルに1→K/K-1の数字が並ぶようになった.

なぜだろう?以前は行ヘッダ部でホバリングすると行番号が表示されていたのだが,出なくなった.⇒間違えて .Rows(i).HeaderCell.Value = i.ToStringを書き換えていたようだ.それだけでなく,ウィンドウをオープンにしたままでBuildMatrixを実行すると,やはり出なくなってしまう.⇒ToolTipTextに設定したら表示できるようになった.これしかないだろう.⇒いや,もしかしたら不要かもしれない.テーブルが選択されていない場合は,単にホバリングしだけでは出ないのかもしれない.⇒やはりそのようだ.単なる操作上の問題だった.

BuildMatrixのサイズボックスを数値ボックスに変える.⇒対処した.

マトリックスの列ヘッダをクリックして列選択できるようにしたい.⇒ColumnHeaderMouseClickとRowHeaderMouseClickを使えばいけるのではないか?⇒できた.楽勝だ!

BuildMatrixではTestMatrixを実行しないようにしたので,マトリックスに関する手当もほとんど完了だ.あとは,Kが大きいときに表示するマトリックスの構築だけだ.これはそれほど難しくない.マトリックスの左上点を決めてやれば,あとはこれまで通りの手順で生成できる.マトリックスの左上点はeRとnRでよいと思う.もしかすると,多少違和感があるかもしれないが,ともかくやってみよう.

シアン色に塗りつぶししている,φ,ψ,φ(K)の枠線が赤くなっているのはなぜだろう?⇒枠線がFixed3Dになっているためと思われる.FixedSingleに変えておいた.一部のパーツはFixed3Dになっている.

「マトリックスの左上点をeRとnRとする」というのは一案だが,(eR, nR)がマトリックスの中に入っている場合は,(1, 1)からの描画でもよいのではないか?その方が分かり易いし,使い勝手もよいような気がする.(eR, nR)が外れする場合には,左上に持ってくるのではなく,マトリックスの中央にくるような配置の方がよいのではないか?まず,この方向で修正を入れてみよう.

マトリックスのサイズ上限を128としているが,描画までに相当な時間が掛かっている.もっと小さくてもよいのではないか?大体,eRが60くらいでフルスクリーンになってしまう.128の半分の64としてみよう.⇒これで,描画までに7秒くらいだ.こんなものではないだろうか?マトリックスには数字がぎっちり詰まっているだけだから,あまり大きくしてもほとんど意味がない.行選択ないし,列選択するためには,ヘッダ部が見えている必要もある.いや,ヘッダ部はスクロールしても常時見えるようにはなっている…

アプリ終了時にパラメータを保存し起動時にロードする.⇒対処済み

InvertTestでは「■MakeRecursionUnit Abort for Digit Overflow」というエラーメッセージしか出力されない.⇒確かにInvertTestでは何も出力していないようだ.⇒InvertTestは単純にInvertFuncを実行し,DispInvertFuncで結果を出力しているだけなので,InvertFuncがエラーを返した場合にはやることが何もない状態になる.⇒古いコードを参考にとりあえず,DispInvertとDispRecurringDecimalを復活させてみた.⇒どこかでハングしてしまっている模様だ.ketaが負の場合は実行しないようにしてとりあえず動いた.⇒DispInvertで出力する循環節の最大長を1000まで縮減するようにして,ぼぼ満足できる動作になった.

N=123467890ではPrimeTestもエラーメッセージだけになってしまう.InvertTestも同様だ.これはやむを得ないと見るしかないかもしれない.Int64 MAXの上限の手前でSeedTestするとほぼハング状態になる.まだ何か抜けきれていないところがあるようだ.Factoringだ.N={9223372036854775701}.そろそろターゲットをFactoringに向ける必要がでてきたようだ.⇒NのFactoringをやっているDispParametorを後回しにしてみたが,効果なしだ.φ(n)の素因数分解ですでに手間取っている.⇒しかし,これは何とか抜けてきた.ψ数の計算量を見てみよう.⇒Psi()を呼んでいるところがない.なぜだろう?使っているのはDumpMatrixだけだ.それでは,ψはどこで出しているのだろう?

Psi()ではなく,PsiFunctionが使われている.Factoringにも,FactoringSubとFactoringSub2という2つのバージョンがある.DispModePowをDispParameterに入れて,FactoringSubを外に追い出すことにしよう.DispParameterは2箇所で使われている.9223372036854775701 = 3^4 x 11^2 x 41064384945901だ.おかしい.41064384945901はまだ分解できる.

41064384945901 = 293 x 40151484457 だ.40151484457もまだ分解できる.40151484457 = 4934119 x 28589579.どうも,これでもまだ終わりでない可能性はある.FactoringSub2はもしかすると,すでに捨ててしまっているかもしれない… いや,まだ残してあった.⇒数字のコピーで間違えていた.41064384945901ではなくて,941064384945901だった.その次の数字も間違っている.40151484457ではなくて140151484457だ.

いずれにせよ,現行のFactoringSubの動作は正しい.また,FactoringSub2はそれに比較すると話にならないくらい遅い.実際のところ使い物にならない.しかし,肝心のψ数は空欄のままだ.一つψ数を求めるボタンを作ってみよう.

コメントを残す

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

CAPTCHA