そろそろ外部に持ち出せる雰囲気になって

まだ,午前9時前(AM08:55)だというのに,こんなキチガイじみた数字が出ている.このペースでカウントが伸びれば,日付が変わるころには確実に1000人を超えることになるだろう.

image

何か異変が起こったという感じなのだが…

そろそろ外部に持ち出せる雰囲気になってきたので,試しにEXEをVAIOにコピーして走らせてみたのだが,ウィンドウ枠が縦長過ぎてスクリーンに収まらない.対策を色々考えてみたが,画面の一番下のブロックを切り出して独立のコントロールパネルのようなもの仕立てるという結論になった.このパネルには主に5種の検定を実行するためのボタンがあるが,一般ユーザにはあまり関心がない部分と思われるので,却って使い易くなるのではないかと思う.このパネル上のボタンで有用なのは右端に置いてある,①Get φ,②Update,③Build Matrixの3つのボタンでできればこのボタンはメイン画面に置きたいところなのだが… まぁ,手元にリモコンを置いて操作するような感じになるのではないかと思う.ともかくやってみよう.⇒大体動作するようになった.

image

InvertTestで画面出力が出ない.⇒解消した.

Updateボタンでマトリックスが開き,BuildMatrixは無動作になっている.⇒修正した.

Ξの判定が間違っている.N=12347のとき,Ξは 0111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111…

のような数になるが,nUは09999999999999999999999999999999999999999999999999
999999999999999 のように先頭にゼロが付いた数になっている.Uは 809, 913, 339, 272, 697, 821, 333, 117, 356, 442, 860, 613, 914, 311, 168, 704, 948, 570, 502, 956, 183, 688, 345, 347, 047, 865, 878, 351, 016, 441, 240, 787, 235, 765, 773, 062, … のような 10進で6173桁の数で,それを12347倍したものがnUだから,5桁上がるとして6178桁になるはずだ.nUの先頭に入っている0というのは何かの間違いではないだろうか?

nUの数字列はConvertNum2Stringで生成されている.ToBCDはこんな巨大数を処理しきれないので,MaxKetaSuで打ち切っているが,バイト配列の先頭に0が入って,{0,9,9,9,…}のような内容になっている.数値をテキストに変換する場合には頭から割り込んできているはずだから,桁数が上限を超えていても処理できなくてはならない.⇒どうも怪しくなってきた.ToBCDでは対象数Nを頭からBで割り込んだ数を配列に格納し,それを逆順にした配列を返している.配列に格納されているのはN%Bの剰余Rだ.確かにこれはBで割った商を求めているのではなく,Bを進数に変換したときのバイト列を取っているのだから,正当な操作と言えるだろう.多分これしか方法はないものと思われる.

つまり,一度頭から尻尾までさばかなければ皿には盛り付けできないということだろう.ということは桁数がオーバーフローした時点でご破算にしなくてはならない.ToBCDでは上限がMAXTEXTLENGTH=32767だ.これでは到底歯が立たない.というか,そもそも整数値と桁数を混同しているように見える.ToBCDではともかく末尾桁まで計算しなくてはならないのだから,その限界を正確に見極める必要がある.ToBCDでは最初から作業配列のサイズを

Dim arraysize As BigInteger = MaxKetaSu

でMaxKetaSu = 1000で固定している.これはかなりまずい.作業用配列サイズをMAXARRAYSIZEまで拡大してみた.桁数は6178なので完全に処理できる.Ξの計算ではテキスト化したnUではなく,nUの生値を使っているはずだから,この判定は正しいと言える.また,出力されたレピュニット数11111…も末尾までさばいた値から生成したものだから正しいと言える.表示桁数は1000桁になっているが,これはこれで十分だろう.ToBCDでオーバーフローした場合には,デバッグコンソールにメッセージを出してブレークするようになっているが,エラー復帰するようにした方がよい.間違った値が表示されると却って混乱の元になる.エラーコードを返すようにした.

UコードはNが6桁辺りで限界になってしまうが,桁数で1万桁台でも表示不能となっている.もう少し拡げることは可能なのではないか?MakeRecursionUnitはMaxOutput=10000が上限になっている.上限をMAXARRAYSIZEに代えてみた.問題なく動作している.ただし.桁数が3万を超えると流石に重くなってくる.MAXTEXTLENGTH4 = 32767を上限としてみよう.⇒まぁ.そこそこの動きになった.

テキストボックスの名前の付け替えを行った.一応収束した.また,ClearParameterという関数を作ってValueChangedの冒頭で呼び出すようにした.これはすべてのテキストボックスを一旦クリアするためのものだ.これで更新されていないボックスが浮き出しになる.また,InvertFuncの冒頭でClearInverseを実行するようにした.

SeedTestではcycleとstripeを更新してない.また,PrimeTestではInvertFuncを呼び出しているが,パラメータはまったく更新していない.InvertTestでも同じだ.以前は動いていたような気がするのだが…

N=12347のとき,Updateボタンを押して例外が発生する.ClearInverseで例外が発生している.なぜだろう?notation.Text = “”というコードで例外が置きている.ただし,初回は問題なくパスしている.⇒パーツを作り直したら収まった.⇒原因は不明

PrimeTestではBの値が変化する以外なにも表示されない.動作はしているのだが,テキストが長過ぎて格納できないのだろう.いや,切り詰める処理は入っている.Uをテキストに変換したときの長さは6169で,テキストボックスの上限は32767だから十分入る大きさだ.⇒消去してから描画までの時間が長過ぎるためだ.描画した直後に消去されるような流れになっている.DispInvertFuncの冒頭でクリアするようにして見えるようになった.ただし,Bの因数リストとB進表記は空欄のままだ.⇒PrimeTestClickの中でDispNotationを実行するようにした.これでボックスBの中身はすべて出力されるようになった.

InvertTestにも同じ問題がある.⇒DispInvertFuncの中で実行した方が分かり易い.stripeはKを変えない限り一定だがNを変えればcycleは変化しなくてはならない.まずこれを見てみよう.⇒DispResidueCycleで出力されている.DispResidueCycleはResidueFuncProから呼び出される.呼び出しているのは,①ValueChangedPro,②modulo3.Click,③GoButton,④TestMatrixの4箇所だ.SeedTestではFactoringとInvertFuncは実行しているが,剰余計算はやっていない.modulo3というのは,現在ReisueTestと呼んでいるものだ.⇒名前を付け替えた.③のGoButtonはすでに廃止されている.

SeedTestのどこかでやけくそ時間が掛かっている.どこかでコントロールを失っている感じだ.カーソルは砂時計のままなので処理は完了していないのだが,ブレークで止められない.N=1234567.いや,処理は明らかにすでに終わっている.カーソルが戻っていないだけと思われる.⇒UseWaitCursorがオンになっていた.⇒ResidueTestとSeedTestではValueChangedProを実行するようにした.これでもれなく表示が更新されるようになった.いや,まだだいぶ落ちているような気がする.ResidueTestでは,1/nやUが更新されていない.ResidueTestでは逆数計算をやっていないからだ.これはそれでよいのではないか?

InvertTestを実行後の状態がおかしい.N=12347, B=10で因子が1,2,3,5 表記がDLHとなっている.前の状態が残ったままになっている.PrimeTestも同じだ.⇒Passflagが立った状態で値を戻しているためだ.passflagをリセット後に値を戻すようにした.

これで大体収まったのではないかと思う.

▲Getψ関数はψ値を確定するためのKを探索するルーチンだが,動作に不審がある.たとえば,N=12358でK=27のときψ=3で確定しているにも関わらず,Getψでk=3にジャンプするというのはおかしい.

▲各種の検定の結果をテーブルに出力する.マトリックスの異種文字数を出す.最初の項目は将来的課題とする.二番目は対処する.

▲出力文字数は制限しない(テキストボックスの容量まで)

コメントを残す

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

CAPTCHA