ψ関数のテーブルをハッシュ化した

Psi関数を書き換えて,配列サイズが整数範囲を超える場合には固定サイズ配列ハッシングするように修正した.これでかなり大きな数字まで(時間が掛かるのはやむを得ないとしても)処理できるようになった.ここで,Psi関数の仕様上の疑問が湧いてきた.現行インプリメントはψ関数の定義を満たしているのか?アルゴリズムは必ずしも定義に沿ったものにはなっていないように見えるが,これで正しいのか?この値は「b^x≡1 mod n」を満たす最小のxということになっているが,この式が成立するための条件がある.その辺りは押さえられているか?

9桁くらいまではそこそこ動作するが,それ以上になると数を入力しただけでほぼハング状態になってしまう.PSIで手間取っている.num=1234567890 b=10 arraysize=536608768だ.PSIはそれほど時間を消費しないと考えられていたので,プログレスバーも設置していない.しかし,Inverseはとっくに完了しているだが…Invertの方が重い処理のはずだったのではないか?10桁まではそこそこ動作する.11桁になると,PSIでなめくじになってしまう.num=12345678801 b=10 arraysize=536608768.Factoringでφ関数を使っているが,大丈夫だろうか?φは疑似素数でもb^φ≡b mod φ になる.

ともかくPSIが遅過ぎる.なんとかならないものだろうか?そもそも,現行ではPSI数は表示用にしか使われていない.どういうことだろう?一方,PHIは,①FactoringSub,②DispParametor,③SeedTestClick などあちこちで使われている.InvertFuncではいずれも使われていない.結局PSIはただの飾りということになる.PsiとInvertの論理はほとんど同じなので計算量にそれほど大きな差が出るのはおかしい.⇒InvertFuncはvalueが大きい場合には打ち切るようになっている.ψはつねに計算しているため,大きく見えていた.⇒同じ条件で打ち切るようにした場合には,ψの方がInvertより収束は早い.valueに11桁の数値を設定して,InvertFuncで例外が起きた.

image

配列RTでオーバーフローが発生している.これを避けるためには,PSIでやっているようにハッシュ化するしかない.⇒対処した.10進14桁までは進めるようになった.15桁になると流石に重い.⇒プログレスバーを出すようにしたら,10桁でもヒーヒー言っている.それほど影響あるだろうか?⇒確かに多大な影響がある.プログレスバーの代わりになるものはないだろうか?⇒ラベルの長さを変えてプログレスバー代用とするというアイディがネット上にあった.もう少し簡単なものが欲しい.タイマーで文字色を変えるというのもある.

中断ボタンを点滅させるというのが一番適切だが,画像を使っているので背景色の変更はできない.タスクバー上のボタンやタイトルを点滅させることはできるようだ.これがよいかもしれない.FlashWindowExという関数がある.⇒確かに,サンプルコードで点滅できた.ただし,VSのボタンが点滅している.また,停止したときに色が残ってしまっている.⇒GetMainWindowHandleの引数が”devenv”になっていた.”kinai”に変えて正しく動作するようになった.停止したときも元の色に戻っている.これがいい!プログレスバーは光線が横切るようなアニメになっていて,カッコいいのだが,廃止しよう.

https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/723flashwindow/flashwindow.html

なぜだろう?SeedTestでは長いシーケンスに入っているのに点滅しない.Invertでは一度だけ点滅している.カーソルの切り替えは動作している.⇒原因はわかった.DoEventsが入らないと動作しない.15桁くらいまでは動作するようになった.ただし,InvertではB=1はテストしないようにした.B=1では固定列が長くなり過ぎる.

もう少し,仕様変更したい.inverseという値は現在一番興味があるところなので,この値を検定ボタンを押さずに更新したい.リターンキーで受け付けるというのがよいのではないかと思う.従って,テキストボックスの値を変更しただけでは更新されないというのでよいのではないか?値が確定するまでは待たなくてはならないが,Invertを押すと大きい数字の場合には無闇に時間を空費してしまう.

コメントを残す

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

CAPTCHA