進捗をみるためにプログレスバーを導入した

プログレスバーを導入したのだが,どうも動作が思わしくない.初期起動で少しだけ進んだ状態のまま止まってしまう.⇒進捗率6%で抜けてしまっている.⇒ループから横道に抜けていた.基数の情報(約数)などを知りたいのだが,常時画面に出すのではなく,Invert出力でよいのではないか?表示されるべき項目には,基数:素因数分解,nとのGCM,bのレピュニット数など.

CASIOのサイトでφ関数が計算できる.その結果と出力が一致していない.n=1234567のとき,CASIOではφ=1224720となっているが,KINAIでは41088が出力されている.Wolframでも同じ数を出しているので,こちらが間違っているのだろう.φの計算はFukuzo氏に紹介されたものをそのまま使っているつもりなのだが…オリジナルのコードは残っているだろうか?⇒オリジナルのコードに戻してみたが,結果は同じだ.1234567は1, 127, 9721, 1234567しか約数を持っていない.従って,1と1234567を除けば,127, 9721, 127×9721の3つしかない.いや,これらの倍数で1234567より小さいものも含まれるから,実数はもっと大きい.確かに41088という数字は小さ過ぎるような気がする.

オリジナルのコードは新潟大の竹内研究室からのコピーだし,最近のものは,奥村晴彦著『c言語による「アルゴリズム辞典」』が出典だ.2つとも間違っているというのはかなり考えづらい.加工の仕方が悪いのだろうか?確かに古いコードでLongという整数型を使っているのは問題かもしれない.それもあるが,PFactorをsieveを使わないように改造したことも影響している.PFactorは小さく約数から返すようになっているが,逆に大きい約数から返すようにしないと動作しないはずだ.オリジナルコードは廃棄してしまったが,sieveを使うようにするか,ないし,単純で非効率なコードに書き換えるしかない.

奥村のコードは少なくとも整数範囲では正しく動作しているので,こちらを改造して対応することにする.⇒なぜだろう?今度は正しい値がでるようになった.修正箇所としては,パラメータを表示している論理をInvertFuncの外に出したといことしかしていないのだが…いや,原因は分かった.InvertFuncは無茶苦茶時間の掛かる処理でまだφを計算するところまで進んでいなかったというだけの話だ.プログレスバーを取り付けてみたが,数分実行しても値はゼロからまったく変化していない.⇒カウンタを10000で割った剰余の1/100を出すようにして動作するようになった.10000点が1サイクルに当たる.

この論理の高速化は可能だろうか?この計算は循環周期が短ければかなり簡単に終わる場合もあり,周期がnに近いような場合にはとてつもなく時間が掛かってしまう.これは避けられない.⇒10000を1000に短縮した.この方が計算が速そうに感じるので心理的効果はある.これだと変化が速いので,10000点くらいまでは我慢できそうだ.いや,せいぜい5000点くらいかもしれない.値の更新では途中で打ち切ることにする.3000くらいで十分なのではないだろうか?⇒いや,もっと短くてもよい.大きい数字の場合にはInvertを使うという仕様だ.

逆数周期表示を見易くするために,記号の前後に空白文字を入れてみたが,コピーするとき切れてしまうので,空白を入れないように変更した.また,この行に固定部と循環部の桁数を出すようにした.これらの値はInvertFuncが最後まで実行されないと与えられない.処理が中断された場合には0, 0 となる.

コメントを残す

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

CAPTCHA