基数64で1234567891の逆数の計算を完了

一晩走らせているが,n=1234567891の逆数の循環節長の計算がまだ終わらない.進捗率10%というところだ.nが素数の場合には桁数がn-1になることが多いので,おそらくこの数もそのくらいの桁数になるのだろう.ψはφを割り切るので,φ=n-1のときは,n-1を因数分解してみれば,その約数の候補を列挙することができる.1234567890 = 2 * 3^2 * 5 * 3607 * 3803 なので,1234567890/2=617,283,945 となるから,この数字まで達したら残りは1234567890しかないことになる.しかし,そこまでやらなくても,事前にその検査をすれば少なくとも桁数だけは実際に計算しなくても割り出すことは可能だ.

まず,以下の論理を導入する必要がある.そのためには,①n-1を因数分解し,②n-1の約数を列挙して,そのそれぞれについて(小さい方から),n^d=1 mod kとなるかどうかを検査し,③成立すればその数をψとする.これを実装するのはそれほど難しくないのでやっておくべきだろう.循環節を実際に出力する論理は,テキストボックスのサイズ内で打ち切ればよい.これなら,かなり高速に結果が出せるのではないだろうか?厄介なのは,nが合成数の場合だ.nが合成数の場合にはn-1はψでは割り切れないと予想されている.いや,この予想は,ψではなくφについてのものだ.n-1とψの整除関係に関してはもう少し調べる必要がある.ただし,合成数の場合には比較的簡単に実計算からでもψが計算できるはずなので,とりあえず上記の論理を適用するのはnが素数の場合に限定しておくとしてよい.

基数を64に設定して,1234567891の計算を完了した.桁数は68587105でn-1の1/18.n-1=1234567890=2 * 3^2 * 5 * 3607 * 3803 なので,2X3X3で割り切っている.任意基数を使えるように拡張することも考えたが,まだ調べることもいろいろあるので,しばらくは基数最大64という現行版でゆくことにする.ただし,上記の修正は入れておくことにしよう.まず,約数のセットを作り,それをソートして小さい順にテストするというところから始めなくてはならない.ただし,この方法が適用できるのはnが素数である場合にのみ限定される.

nが合成数の場合にはn-1はφでは割り切れないと予想されている.逆に,ψの素因数の一つをpiとして,pi-1はnの素因数を約数として持つという予想がある.ともかく,nの素因数分解から始めなくてはならない.素因数分解ルーチンは実装されているが,文字列を出力するだけなのでもう少し扱い易いように改造する必要がある.nの約数の最大個数maxはnが2のベキになっているときと考えられるから,max = log_2(n) でよいはずだ.⇒因数分解の部分はできた.あとはこれを使ってテストするだけだ.最初に約数を列挙してそれを昇順にソートする必要がある.これが意外と厄介だ.約数の個数は計算できるようになった.約数の列挙は再帰を使うのが順当だが,ループで間に合わせた.

個別の約数は高さ一律の木になるので,木を巡回する手順が必要になる.これは再帰関数を作って呼び出すしかないのではないか?⇒配列に書き込むのは,最後の葉になっているノードで行うことにする.葉ノードはつねに末尾ノードだから,そのノードがしかるべき位置に書き込めばよいのではないか?あるいは,飛び飛びになることは分かっているのだから,すべてのノードで必要な計算をして値を書き込むというのでもよいのではあるが,たとえば,13680の約数は60個あり,指数が4, 2, 1, 1であったとすると,最初の数では,60/5=12個に同じ数を書き込むことになる.次の数では60/3=20に同じ数を書き込み,それ以外では60/2=30に同じ数を書き込むことになる.

ただし,それをどうやって書き込むかが問題だ.1段目では12個づつ同じ数を連続的に書き込めばよいだけだが,最後の段では一つ置きに書き込まなくてはならないだろう.かなり厄介な計算になりそうな気がする.そのノードの下にあるノードの数がわかれば,よいのかもしれないが,それより再帰の方が間違いないのではないだろうか?どちらがより効率的であるかは一概には言えない.掛け算の回数はまとめて書き込む方が少なくて済むはずだが,ノード数の計算などの余分な計算が入る.ノード数の計算はそれほど難しくはないはずだが,書き込みのループを構成するのが面倒なのではないか?いや,それほどではないような気もする.やってみることにしよう.

まぁ,なんとか整った.あとは,PSIのテストを行うだけだ.ψ数というのは,b^e ≡1 mod n となるような最小のeと定義されている.⇒できたようだ.少なくともn=13681では正しい値が計算されている.

コメントを残す

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

CAPTCHA