B進小数表記に関してはほぼ完全になったのではないか

かなり進んだ.B進小数表記に関してはほぼ完全になったのではないかと思う.というか,チェックしたのは10進法だけなので,B進表記のすべての動作を確認した訳ではないが,主要な論理は通っているはずだ.昨日は障害が発生したところで止まっている.続きをやることにしよう.

1234567891という数字を与えて,InvertFuncで停止する.RT(rindex) <> 0が起きている.⇒初期値としてこの数を設定して起動→どこかでハングしてしまっている.⇒どうも,Enumerable.Repeat(Of BigInteger)(0, arraysize).ToArray()で手間取っているようだ.arraysize=536608768.この数字はMAXARRAYSIZEですでに限界に達していることを示している.IT(arraysize)を生成するのにもかなり掛かっているようだ.RTとITも固定で外に出してしまった方がよいのではないだろうか?使うときには必ず初期化が必要になるので,大したメリットはないかもしれないが…

ウォッチパネルでこれらの配列の中を見ようとするとそれだけでハングしてしまうので,開けることもできない.問題が起きているのは,rindex={454561898}なので,ここだけ見ることはできるだろう.このときのRは{991170666}だ.IT(454561898)には2415という値が入っている.しかし,不審なのはRTにrindexの値が入っているという点だ.rindexを設定している箇所はこの関数の中で7箇所もある.これはかなり間違え易い論理だ.R=454561898でrindex=454561898となっている.このときは,まだRTには書き込まれていない.従って,ここに書き込むまではノーマルな動作だ.⇒すでに書き込まれていたときの空セル検出の論理が間違っている.

RTはハッシュテーブルなので,テーブルの末端まで検索しなくてはならないのにデータカウントまでで打ち切っていた.どうも10進10桁というのは,このツールの限界のように思われる.循環節の長さが十分短ければもっと小さいテーブルでもよいのだが,一般に大きい数では周期も長くなることが多いので,あまり小さくすることはできない.対象数の約数と循環節の周期には相関があるだろうか?もし,それがわかればある程度調整できるのではないか?BとNが互いに素の場合が最長になるのではないかという気がするのだが…

1234567891は素数だった.3は素数だが,循環桁数は1なので,Nが素数であるか否かと循環桁は直接結びつかないが,数字が大きくなると循環桁が伸びる傾向にあるのは確かだ.相当時間が経過しているが,まだ10%程度しかこなしていない.これ以上続けても埒が明かないので,一度中断しておこう.配列の初期化には相当の時間が掛かるので,上書き可能な配列は初期化しないことにする.RTはハッシュテーブルなので初期化する以外ないが,ITとQTは初期化しなくても動作するはずだ.

画面を処理に先行して表示するために,ValueChangedの実行をMyBase.Shownイベントが発生するまで抑制するようにした.これで,画面が開かれたときには,すでに因数分解も完了し,φなどのパラメータも表示された状態になっている.その数が素数であることも明示したい.⇒「P」というラベルのボタン型チェックボックスを新設した.

ビジー状態だと,カーソルが飛んでしまうため,STOPボタンを押すことができない.ESCキーを受け付けるようにしておこう.⇒実装した.Stopは効くようになったが(効きはあまりよくない),停止しない.⇒MyBase.Shownイベントが反復掛かってきているようだ.⇒フラグを見るようにして,一応解決.

なぜか理由はよく分からないが,RTはInvertFuncのローカル変数としておいた方が速い.ITは内部に置くとかなり時間が掛かってしまうのだが… メモリを大量消費した後のガベージコレクションのような作業で手間取っているような感じ.とりあえず,これが最速なのでこれでフィックスということにしておきたい.

N=12でエラー終了になった.stopflagをリセットしていなかったためではないか?⇒対処した.

ESCキーの効きは悪いが,なぜかStopボタンが押せるようになった.ただし,あまり効きのよいものではない.何度も繰り返し押すうちに入るという感じだ.Stopで停止した後もまだ,しばらく制御が戻ってこない.なぜだろう?走行中にブレークポイントを設定できないくらいなのだから,よほどビジーなのだろう.まぁ,これはこれ以上どうしようもない… タスクバーのアイコンを点滅させるという仕組みは完全に廃止.

加納氏の出題に応答するために,べき剰余検定の機能を少し変更することにしよう.現行ではボタンが3つあり,「n^p%k」「p=1→k」「n=min→max Test」となっているが,「p=1→k」のところを,「n^p^m m=1→k %k」とすることにする.「p=1→k」と同等動作にするためには,p=1で実行すればよいというだけだから,十分な拡張になっている.「n^p^m m=1→k %k」の動作は,まず,n^p%k=αを計算したのち,α^p%kを実行するようになるものと思われる.ただし,これだけではたとえば,

2021^2022^2023

のような計算をストレートに実行することはできないが,いまのところは,これが限界だ.しかし,2021^2023%100=41のとき,41^2023%100=21になってしまうのはなぜだろう?これでは話が合わないような気がするのだが…この辺り,動作を確認しながら少しチェックする必要がある.とりあえず,ここで一度バックアップ.

計算は完全に(wolframと)合っている.計算完了後制御が戻るまでにしばらく掛かるという現象がある.いや,今度はすぐ戻ってきた.41^2023%100という計算なのだが…再現しなくなってしまった.⇒原因は分かった.テキストボックスに入力すると即時応答しようとしているためだ.これは不要な機能だろう.いや,おかしい.TextBox1ではTextChangedを取っていない.

どうも,動作がおかしい.Button2.Clickイベントが入っているようだ.⇒ボタン名を変えておこう.modulo1, modulo2, modulo3としておく.どうも,かなり様子がおかしい.押してもいないのに,SeedTestボタンが入っている.Clearボタンも青くなっている.

One Shotを3回繰り返すと,ハング状態になる.このとき,

‘Kinai.exe’ (CoreCLR: clrhost): ‘C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.17\System.Runtime.CompilerServices.Unsafe.dll’ が読み込まれました。

などのDLLが追加で読み込まれてくるのだが…どうも,これを読み込む間コントロール喪失状態になっているようだ.上記のSeedTestボタンはClearボタンを押すつもりで押し間違えた可能性がある.どうも,まだやはり具合の悪いところがある.今度は別のDLLガロードされてきた.

‘Kinai.exe’ (CoreCLR: clrhost): ‘C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.17\System.Collections.Concurrent.dll’ が読み込まれました。

DLLのロード中はコントロールが効かない.ロードし終わると問題なく動作するようになる.リリース版をビルドしてみよう.やはり,同じ現象が起こる.復旧するまでの時間はかなり長い.イベントループが回らなくなっているというか,詰まっている感じ.ボタン処理を実行している間,砂時計を出すようにした.Periodicでは出力画面に書き込みしたあともまだ何かやっているようだ.

BigInteger.Pow→.Mod をModPowでまとめてやるようにして,何とか収まったようだ.modulo1は現行のままとし,べき乗の結果の大きな値を画面出力できるようにしておこう.

2021のSeedTestで停止した.「WRONG SAMPLE」fixed=0かつk=0つまり桁数ゼロという状態になっている.このテストはN=1~nをテストするもので,n=1, b=10で始まっている.1/1=1.0で固定桁数というのは小数部しか含まないので,この場合は,fixed=0, k=0となるのは仕方ない.つまり,不良ではない.

コメントを残す

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

CAPTCHA