さて,問題はPsiFunctionだ

さて,問題はPsiFunctionだ.現在PsiFunctionには2つバージョンがある.Kinai.vbにあるものとModule1.vbにあるものだ.前者がオリジナルで後者はマトリックスに入ってから修正したものが,これらをどちらかに統一しなくてはならない.後者の方が新しいので当然こちらを取ることになるが,微妙なところで差異がある.どうやって調整すればよいか?問題の焦点は除数にBを使うか,Kを使うかにあるのではないかと思われるが,現行では,BはB進表記にのみ適用され,それ以外ではKを使うということにはなっている.循環小数ではB進表記を使わざるを得ないが,べき乗剰余では進数に関わりなく計算ができなくてはならない.

循環小数をカバーしているのは,結局,InvertFuncであると考えられるから,まず,これを通常処理から切り離す必要がある.ResidueFuncもバージョンが別れている.⇒ダブっている関数をすべて(PsiFunctionとResidueFuncを除き)整理した.引数も整理してBとKを見分けやすい用に書き換えた.これで準備は整った.ResidueFuncを比較してみよう.⇒論理的な有意差はないように思われる.Module1.vbの版では①scount(初項出現カウント)を取っていない,②「非ゼロ列で初項なし」という検査を行っていない,③出口でPsiFunctionを実行してψと周期を比較している,という点が異なる.

①に関しては旧版でもscountは事実上カウントされていないので,意味がない.また,観察された限りではドロップ項はかならず初項から連続して落ちているので,初項のみに注目しても意味がないと思われる.現行ではどちらの版も戻り値でドロップ項数を返し,参照で周期を返すようになっているので,一応これらの値が一致していることを確認しておこう.⇒問題なさそうだ.これで旧版のResidueFuncは廃止できる.

Residue Cycle Test の後,BuildMatrixを実行して例外が発生した.⇒再現しない.⇒再現した.上から順番にテストしてくると発生する.Kは13で変化していない.DumpMatrixで例外が起きているようだ.「Index was outside the bounds of the array.」というエラーが起きている.gcd1配列が空のままだ.S1配列も長さゼロだ.BuildMatrixではT()という2次元テーブルを生成しているが,テーブルを作るだけで付属的は配列などは整備していない.それをやっているのは,TestMatrixだ.DumpMatrixに先行してTestMatrixが実行されていなくてはならない.どこかでverboseがオンになっているのだろう.DumpMatrixはTestMatrixと一体化される必要がある.実際,TestMatrixの中でも実行されているので,それ以外の場所での使用は禁止した方がよい.

PsiFunctionを比較してみよう.主な相違点は以下の通りだ.①新版では約数のダンプは省略されている,②旧版ではnと除数が互いに素の場合のみを対象としている.③旧版ではnと除数が互いに素でない場合にはResidueFuncを呼び出して周期を求めようとしている.ψ値はnと除数が互いに素でない場合には決定できないので,これらの差異はトリビアルなものである.時間効率的には,旧版の方がロスがない.ただし,ResidueFuncでも周期は決定できないので,その意味ではどっちもどっちというところだ.PsiFunctionからResidueFuncを呼び出すとスタックオーバーフローしてしまう可能性があるので,避けるべきだろう.

結局,結論的には剰余数列の周期はResidueFuncでしか決定できないということになる.いや,それも少し言い過ぎかもしれない.少なくともTestMatrixでは異種文字数まではカウントできる.異種文字数=ドロップ項+周期だ.TestMatrixでは内部でResidueFuncを呼び出して比較している.いや,新版と旧版のPsiFunctionには大きな違いがある.PsiFunctionでは基数のべき乗を生成しそれを除数で除した剰余を求めているが,基数と除数の関係がまったく反対になっている.もし,新版の論理が正しいとすれば,従来論理の呼び出し時の引数を変えなくてはならない.従来論理が正しいとすれば,その逆が必要になる.つまり,ものの見方がまったく逆向きになっている.

どちらが正しいというより,その差異がどこから発するものかを突き止めなくてはならない.基数と除数が入れ替わっているだけではなく,引数で渡しているφ値も異なる.新版の場合は,φ(K)が使われているのに対し,旧版ではφ(n)になっている.⇒どうもこのφ値の扱い方に問題があったようだ.関数内部でKのφ値を取るようにしたら,新版で問題なく動作するようになった.引数の入れ替えも不要ということになる.これでよいのだろうか?結局,どちらかが逆向きの読み方をしていたということになるのだが…というか,φとψの関係が繋がっていなかっただけということかもしれない.⇒ともかく,動作しているので,この方向で落着させることにしよう.⇒いや,まだ落着していないような気もする.2023/05/18のログでは「n・kが素は,①(n, k)=1,②drop=0, ③ψ=periodと同値ということになる」としているが,現時点ではdrop=0でも,ψが立たない場合がある.

コメントを残す

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

CAPTCHA