20桁の12345678901234567890のPrimeTestで落ちる

障害が発生している.20桁の数値12345678901234567890のPrimeTestを実行して,MakeDecimalStringで落ちる.b=2. nnstr = New String(“0″c, fixed – 1) + “1”で落ちている.fixedが巨大数になっている.maxfixed を使うようにして解決したが,今度はInvertFuncで停止する.途中で打ち切りになっているため,kが計算不能でゼロのままだ.ψの値が得られていないため,このままでは検定を続けることができない.b=61ならば計算できる.b=60では計算不能となる.φからψを推定する方法はまず,ψが計算可能でなくてはならないが,その条件はbとnが互いに素であることであると思われる.bが素数であればほとんどの場合,この条件をクリアできるが,bが合成数の場合にはこの方式ではψを得ることができず,ψをkに転記することもできない.

1/nの循環桁数はBに依存する.仮にこれをk=K(n, b)のように関数化したとき,既知のbとkの値から別のb’におけるk’の値を推定できるだろうか?ψ関数には周期性があるという指摘がある.⇒確かにある種の規則性は認められる.たとえば,n=1234の場合,b=2~64まで変化させたときに出現するk値は{154, 616, 77, 56, 308, 88, 44, 11, 28, 14…}のようにかなり特徴的な数字の集まりになっている.しかし,完全な周期性というところまでは認められない.

An Efficient Factoring Algorithm by Repunit Number Methodで述べているψ関数の周期性というのは,y=b^x mod n という関数の周期性だ.この関数は明らかにψ(n, b)の周期を持っている.これはある意味当然のことだろう.というのは,y=b^ψ≡1 mod n であり,%nが1になるということは,その周期が繰り返されることを意味しているからだ.従って,この事実はψないしkを推定するためにはなんの足しにもならない.仮に周期桁数kが何らかの方法で決定できたとしよう.その値が実際周期桁数を表す数字であることを示すことができるだろうか?

それを行うためには結局kを求めるInvertFuncの計算を実行するしかないのではないか?いや,kの値がわかっていればこの計算をもっと簡略なものにできる可能性はあるような気がする.たとえば,べき乗と除算をステップ動作するのではなく,一括実行するようなことが考えられる.このようなことは可能であるような気がするので,kを得られる方法があればなんとかなると考えてみよう.

kがφを割り切れることはすでに確定しているのではないか?現在ψを求める計算として行っている手順はむしろkを求める手順と考えるべきではないだろうか?⇒多分,この考え方は正しいと思う.であるとすれば,その値が循環周期を与えるものであるということが言えればよいのではないか?循環周期を示すためには,べき乗剰余が2つのポイントで一致することが示されればよい.これは循環小数の生成ではなく,整数演算の範囲で考えられそうな気がするのだが…

多分,この考え方は正しいと思う.つまり,べき乗剰余と循環節周期は基本的に同じ事柄の二面に過ぎないと思う.試してみよう.たとえば,n=1234, b=64, k=77のとき,b^k mod n = 64^77%1234≡618で,かつ,この冪剰余の周期は{618, 618}つまり,周期1の循環になっている.この618というのはべき乗剰余で,rep%k+1と一致する.このrepという数は,DivideRepunit(b, k, n)で求めた数で,b進数でk桁のレピュニット数のnを法とする剰余と考えられる.この意味ではこの数はかんり重要なパラメータと考えてよい.

ここまで分かると,kを決定できる方法を得たのとほぼ同じではないか?「B^K%N」というボタンを追加してResidueFuncを使った検定を行うことにした.ResidueFuncは1/Nの循環周期を求めるInvertFuncの逆関数とも言うべきもので,Kに周期桁数を与えると,この関数の戻り値が1であることが確認できる.これを使ってKの値を決定できるだろう.

8桁の数値12345678をInvertFuncして,ループカウントオーバーで停止した.⇒桁数制限を掛けているのだから当然だ.停止しないで処理を続行するようにした.

すでにφ→ψ転換は完全に完了しているように思われる.GCD(n, b)=1の場合でψが取得できないというケースは発生しなくなっている.PsiFunctionの中ではこの処理の剰余計算をModPowによって実行しているが,これをPowとDivRemに分割すると多大な時間消費が発生してしまう.また,このループの中でResidueFuncを実行しようとするとほとんどハング状態になってします.従って,PsiFunctionは現在の論理で閉じるものとし,ResidueFuncはInvertFuncの中で使うことにする.ResidueFuncはべき乗の剰余を取っているので,多分ModPowを使うように改造できるのではないかと思う.⇒いや,そうもいかない.ResidueFuncでは最初に剰余配列を生成してから,繰り返しが起きるのを待っているので,べきと剰余が同時に実行されることはない.

ダメだ.ResidueFuncが1を返してくるというのは決め手にはならない.確かに,周期数がφの約数の中に入っていることは確かだが,そのうちのどれかを決める決定的な手掛かりがない.特に固定部の終端が決まらないというのは問題なのではないだろうか?周期が確定するまでは固定長は決定できない.なにか妙案はないものか?

コメントを残す

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

CAPTCHA