超冪剰余計算の実装を続ける

昨日の続き,超冪の計算だ.ともかく,最後まで書いてしまおう.フェーズⅡは再帰関数になるはずなのだが… 基底から実行して塔の尖端まで上昇するという作りになるはずだ.引数でdepthと2つの配列を渡せばよいのではないだろうか?⇒基底の除数が配列に入っていないこれを先に詰め込む必要がある.Cも一つずれがある.最初の除数47が入っていない.⇒いや,ちょっと読み違えているようだ.基底が呼び出されたときの基数は2で除数47でなくてはならない.⇒一応計算できたようだ.25という値が出力されている.

基数を除数が割り切れるとき,冒頭の a = base Mod k で a が0になってしまう.どうすればよいか.⇒剰余ゼロなのだから,ゼロ復帰するしかない.⇒値が1になっている.初期値には0が与えられている.CalcPowerで1を返しているのだろう.⇒動作するようになった.どうも基底と除数が互いに素でない場合は正しい答えにならないような気がする.これは後で確認することにする.

塔の上部がカットされた場合の階高を表示できるようにしたい.⇒配列BないしCに入っている有効データをカウントすれば分かる.⇒基底が除数で割り切れて剰余ゼロとなる場合は有効階数=0とした.除数が素数でも基底が大きいと階高はかなり小さくなる.なぜだろう?⇒どっちみち,この塔はあまり高いものにはならないのではないだろうか?除数を十分大きくすれば少しは伸長するかもしれない.⇒あまり効果はなさそうだ.上限を計算できるだろうか?

基底ないし除数が与えられたとき,最高塔を作るための条件はなにか?剰余演算によって生成される超冪は原木を刈り込んだ,いわば盆栽のようなものである.このとき,原木の形状と盆栽超冪は準同型であると言えるか?つまり,盆栽は原木のミニチュアになっているか?

いずれにしても,超冪剰余がかなり小さい塔になることはわかったので,生値から生成される原木を計算して比較してみることにしよう.⇒原木を計算できるようになったが,盆栽と一致しない.いや,おかしい.どこか壊してしまったのだろうか?盆栽の値が間違っている.ループが一回り足りていないようだ.

どうも,配列に冒頭の基底47を押し込んだところで末尾の25が押し出されてしまっているようだ.⇒いや,それも違うのでは?25が表示されていたのはexpの値で,47を押し込んだのはdivisorの方だ.

height=0 base=2 divisor=47
height=1 base=3 divisor=23
height=2 base=5 divisor=11
height=3 base=4 divisor=5
height=4 base=0 divisor=2
height=3 exp=1
height=2 exp=5
height=1 exp=13
height=0 exp=14

1→5→13→14

CalcPowerでheight = depth + 1で復帰しているところで,CalcPower = C(depth) ^ 18 Mod C(0)を実行してその値を返したところ下記のようになった.

height=3 exp=4
height=2 exp=9
height=1 exp=18
height=0 exp=25

どうも,どこかでこじれてしまったような感じだ.前のバージョンに戻って調べた方がよいかもしれない.⇒一つ前のバージョンでは上と同じ動作になっている.こちらの方が正しい.どこを修正したのか分からないが,戻した方が早そうだ.このバージョンでは基底の除数47が配列に入っている.⇒おそらく,原木の剰余を計算する処理を組み込んだところでどこか余分なところをいじってしまったのだろう.

基底49,除数47,階高3の計算で原木の剰余と計算結果が合わない.もう少し小さい数でテストしてみることにしよう.⇒どうも,現行のアルゴリズムが間違っている可能性が出てきた.2^^3 mod 47でテストしてみると,原木は超冪原木=16 超冪盆栽=16となっているが,計算結果は4だ.これはかなりおかしい.⇒もうひとつ重要なパラメータとしてexpがあるので,これも配列に収集しておこう.一度ここでバックアップを取ってから開始することにする.

コメントを残す

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

CAPTCHA