べき剰余マトリックスのサイズを指定できるようにした

マトリックスのサイズを指定できるようにした.上限は128×128.ただし,テーブル自体はつねにフルサイズで生成する(と言っても物理的な上限はある)テーブルが生成してあれば,部分テーブルとしてのマトリックスはいつでも再構築可能になるので将来的にも拡張し易いと思う.

K=7のとき,3x7を指定して,ゴミが出てしまう.

image

第4列に余分な数字が出ている.値は間違ってはいないが,指定範囲を超えている.これは,前のデータが残っているためではないだろうか?⇒Columns.ClearとRows.Clearで全データを消去するようにした.

K=7のとき,べきが6でstripeが{1,1,1,1,1,1,1}になる.これは間違っている.末尾は0にならなくてはならないはずだ.実際,マトリックスはそうなっているのだが…stripeはTextBox18に書き込まれる.この文字列はMakeStripePatternで生成している.この値はテーブルから取り出したものではなく,その場で生成している.マトリックスはつねに表示されているとは限らないためだ.テーブルは行単位に生成されている.つまり,T(i, 1) = i Mod kで左端のセルを設定し,その値を乗じて横数列を生成している.stripeは数列を上端の1から始めて縦方向に,ModPow(i, pow, K)で値を決定している.

i=k-1のとき,つまりpow=k-1のときはつねにpow Mod (K – 1)はゼロになるので,すべての項でi^0=1となり,1が連続することになる.このテーブルには何か決定的な不備があるのだろうか?かなり由々しき事態になってきた… ⇒解決策が見つかった.べきがゼロになった場合は,元の値に戻って計算すればよい.実際は除数がK-1でゼロになっているので,べき=K-1でよいはずだ.これで縦横計算が完全に接続した.これは結局,フェルマーの小定理で n^p-1≡1 mod p の現象に対応している.ただし,n=pの場合は例外で,p^p-1≡0 mod p になるということだろう.n=pでなくても,nがpの倍数であれば,当然0になる.つまり,これが,nとpが互いに素という条件が必要という理由だ.

どうもまだ,間違っているところがある.1/7=0.142857142857…なので,U=142857でなくてはならないが,428571が出ている.固定部1,循環部6となっているが,固定部0でなくてはならない.
https://www.facebook.com/groups/2354748741306929/posts/6031847776930322/?comment_id=6050062105108889&reply_comment_id=6057553787693054

循環小数の固定部はTextBox12に入っている.これを更新しているのはDispParametor2だが,DispParametor2はこの値をInvertFuncからもらっていると見られるので,結局PowerResidueFuncの動作がおかしいということになる.トレースしてみよう.IT(j)=0ならば,fixed=0となる.また,R = RT(max)ならばfixed=0となる可能性もあるかもしれない.R = RT(max)のとき,invertでなければ,fixed = IT(j) – 1となるので,IT(j)=1ならばfiexe=0となるのだが…

どうもこの不良は相当初期の頃から入り込んでしまっているようだ.上記のコメントは7週間前となっているので,50日前とすると,4月10日前後だ.ということは,やはり,久留島喜内 2023-04-16の時期と思われる.それ以前のバージョンんは数能極形術に入っているので,この版をきっかけに模様替えしたのだろう.

久留島喜内 2023-04-16からInvertFuncを切り出して現行版に組み込み,並行検査できるようにした.データを比較してみよう.QTは{1,4,2,8,5,7,0}となっている.IT, RTはここからは見えない.旧版でもQTはまったく同じ数列が格納されている.InvertFuncが使っているRS()を大域に置いて比較できるようにした.RSは{0,3,2,6,4,5,1,3,0,0,…}という内容になっている.InvertOldでも同様にRT()を見える場所に置いた.内容は{1,3,2,6,4,5,0,0,0}だ.大きな相違点はRT(0)に1が入っているという点だ.

RSは最近追加された出力用配列だ.オリジナルはRTでこちらはハッシュ表になっている.問題はR=1が検出されていないという点だろう.これは,初項が書き込まれていないためと見られる.旧版ではR=1がつねにR(0)に格納jされているため,①が検出されると周期が確定するという作りになっている.新版にはこの機構が欠けている.新版では全検索しなくても既出が存在しないことは判定できるため,書き込みだけで終わってしまっている.対応するとすれば,R=1のときは,R=0と同様,直ちにブレーク動作に移るべきだろう.

動作するようになった.最後に一つ,剰余Rが一致しないという点が残っている.⇒InvertFuncは参照でRを返しているが,PowerResidueFuncは明示的にRを返していないが,RSにはRの数列が入っている.これから取り出しておこう.

nの因数の動作がおかしい.nを変化させてもしばらく変化しないことがある.n=2357の前後で停滞する感じ.nの因数はTextBox8に格納されている.イベントが途中で消失しているのではないだろうか?valuechanged中は入力ボックスをディセーブルにするという機構を復活させて動作するようになった.⇒特にBを更新するのにはかなり時間が掛かる.⇒最後の結果は合っているようなので,ディセーブルは掛けないようにする.途中で同期が取れなくなる場合もあるが,実害はないと思われる.不安ならば,ValueChangedをクリックすればよい.

ValueChangedボタンでInvertFuncが実行されていない.リターンキーなら実行される.⇒modulo2.ClickとUpDown.ValueChangedで同じ処理を実行するようにした.stripeはKが変化したときしか変化していないが,これでよいのだろうか?⇒Kが固定の場合,nが変化するとcycleが変化し,べきが変化するとstripeが変化する.MatrixTestではべきは固定なので,Kが変化したときしか変化しない.べきを変化させるテストもおもしろいとは思うが.トータルの時間が相当大きくなってしまう.

どうもまだ,完全にコントロールできていない.

image

コメントを残す

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

CAPTCHA