べき剰余マトリックスのボタンを整理

まず,べき剰余マトリックスを少し整理して一つないし二つのボタンにまとめることにしよう.その後,画面を整えて,必要な情報が閲覧できるような状態にしたのち,移植という段取りで進めることにする.まず,ボタン1,Dump Matrix.これはDumpMatrixにR, G, Kのダンプを追加したものだ.DumpMatrixをこの関数で置き換えてもよい.この関数はCalcPoint(k)だ.CalcPointとDumpMatrixの大きな違いは,後者が生成済みのマトリックスのデータを使っているのにたいし,CalcPointでは自前で計算しているというところだ.前者が生値を使っているのに対し,後者は剰余になった小さい値のみを取り扱っている.マトリックスの立場は,すべての演算を剰余演算として完結するというものであるから,CalcPointのような計算は除去されるべきということになるのだが…

ここでは,この関数は形だけ温存し,処理の内容だけをDumpMatrixに移すことにする.つまり,G, R, Kの計算だ.GというのはGCMのことだ.(n, k-1)の値が出力されている.Rはsumのkによる剰余だ.Kは縦数列の和の剰余,Tはその総和だ.Tは縦と横で同じ値にならなくてはならないはずだが,現状では横では6,縦では5になっている.これは横ではmaxrangeの範囲を計算しているためだろう.縦横のサイズを一致させれば,多分この不一致は解消されるものと思われるが,計算範囲をどこまで取るか?というのが問題だ.kの範囲に限定するか,それともテーブルの実サイズに合わせるか?

行と列のそれぞれの項の和を取るというのは,発端となった京大の試験問題を引き摺っているためだが,それが果たして必要なのか不要なのかも考えなくてはならない.検算のために置くというのであれば,値はともあれ,縦横の合計が一致することを確認するだけでもよいということになるはずだが… ⇒とりあえず,ここは「検算のため」ということで残すことにしよう.GCMは後から必要になってくるので存続させる必要がある.この値はテーブルにも記載されるべきだろう.

CalcPointでは,nとkが互いに素の場合にはトータルの剰余Rがゼロとなることを仮定している.これは正しいか?⇒これは縦数列についての話と思われる.pが素数の場合,n^(p-1)≡0 mod pが成立するから,残余は1となり,Σ1=p-1になる.それ以外では0になる.これは,マトリックスの周期性を示す一つの証拠と認められるので検査する意義はあるように思われる.⇒これはマトリックスの周期性を解析するとき改めて確認することにする.ボタン2に移ろう.Power Sum Sequenceだ.CalcResidueという処理を呼び出している.

CalcPoint2という関数もあるが,いまは使われていない.CalcPoint3というのもあった.中間的な産物と思われるので,廃棄してもよいのではないか?CalcResidue2というのもある.これも廃棄でよさそうだ.CalcResidueではべき乗和を生値で蓄積して最後にk-1の剰余を取っている.この値はマトリックスのΣ値と一致しなくてはならないはずだが,一致しない.マトリックスでは{6. 0. 0. 0. 0. 0. 0}で,CalcResidueのm値は{1, 2, 3, 4, 5, 6, 0}だ.いや,違う.これは全然関係がない.CalcResidueではテキストボックスに入力された値をnとして,{i=1→k-1}i^nを計算している.しかも,これは累和(の剰余)をそのつど出力しているので,マトリックスの表示形式とはまったく違う.

これは言ってみれば,K=19と指定したマトリックスの19列目の一部を表示したものに過ぎない.あまり意味がないと考えられるので,廃止でよい.おそらく,テキストボックスのnを参照しているのはここだけと思われるが,ボックスを削除して確認しておく.⇒これでボタンは3つだけになった.2つ目のボタン Test Matrix は TestMatrix(k) を実行している.TestMatrixはとりあえず,Build Matrix ボタンでつねに実行するようにしておこう.そうすれば,ボタンを一つ減らせる.⇒いや,現状ですでにそうなっている.もう一つの All Prime Test というボタンは 2≦k≦1000の範囲内のすべての素数を検定するというだけのものだ.

All Prime Test がどこまで走るのかを見ておこう.現状kが260を超えると処理を打ち切るようになっている.ただし,遅くなるのはテーブル(九九表)を生成するためであり,処理はそこそこの時間で終わるはずだから,テーブルを生成しないようにすれば問題ないのではないか?いや,実際,TestMatrixにはテーブルは不要であり,これまではそれで動いていたはずだ.2~1000まではあっと言う間に終わる.10000まで試してみよう.⇒さすがに3000を超えると重くなる.⇒この機能を公開するとしたら,打ち切りボタンは必須だろう.しかし,1枚のテーブルくらいは何とかなりそうなので,その中の一行ないし一列を指定して表示するくらいのことはできるのではないか?テーブルもまったく作らないというのではなく,たとえば128x128までは見せるような仕様でもよいかもしれない.まぁ.64x64くらいが適切かもしれないが…

k=64で「奇数値を設定してください」が出た.TestMatrixでは除数が奇数でないとまずいところがあったかもしれない.制限なしでテストできるようにした方がよい.現行では指定したkの2x2のテーブルを作っているが,kxkに戻せばそれほどまでは時間は掛からないようになるだろう.先に一次元配列をゼロ発進に統一するというところを片付てしまおう.作業用に生成された一次元配列ではライブラリ関数などを使ってソートしているので,ゼロ発進にしておく必要がある.TestMatrixでやっていることを見てみよう.すべての一次元配列を対象とするのではなく,ソートが掛かるものに限定する.

Array.Sortが掛かるのは,s1とs2だけだ.s1とs2は約数を格納した配列だ.いや,違う.ここに入っているのは行と列の異種文字数だ.s1(0), s2(0)には0が入っているだけだから,影響ないのではないか?文字数カウントはworkに入っている.

どうも,まだ,縦横の関係が頭に入っていない.マトリックスはk-1xkとしているが,逆ではないか?横数列には短周期というのがあるが,縦数列にはそのようなものはないはずだ.横数列の長周期はp-1ではなかったか?また,縦数列の場合には,周期列に末尾の0を含めなくてはならないから,kになるのではないか?実際マトリックスを見てもそうなっている.つまり,短いのは横軸であり,縦軸がkで横軸がk-1のはずだ.壊しそうなので一度バックアップを取ってから考えた方がよい.

コメントを残す

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

CAPTCHA