B=1の場合の逆数の進数表記をどうするか?

N=7, B=1で起動するとInvertFuncで例外が発生する.QTなどの配列のRedimをPowerResidueFuncに移してしまったため,ここではQTにアクセスすることはできない.暫定的にQTのRedimはInvertFuncで実施することにしておく.これで例外の発生は抑制されるようになったが,問題は残っている.B=1の場合の逆数の進数表記をどうするか?という問題だ.2023/04/26には以下のような記述がある.

b=1というのはかなり特殊な場合で,ペアノの公理の後者関数のような形式になっている.このとき,b^ψ=1^1=1となり,いかなるnに対してもψ=1となると考えられるが,1進数の1/nは0.000…1 のような固定桁のみの数字になるため,k=0となり,ψと一致しない.gcd(n, b)=gcd(n, 1)=1でψが有効となるケースは基本的にψ=k=gcd(φ, k)になると考えられるが,b=1はそこでψ≠kとなる唯一のケースと考えられる.また,このとき,gcd(φ, k)=gcd(φ, 0)=φとなるため,三者がすべて異なる値を持つという特殊ケースになる.

とりあえず,これでよいということにしておこう.実装もそのようになっている.さて,このPowerResidueFuncを使い回しできるかどうか?が問題だ.つまり,この関数を使ってResidueFuncを実現できるかどうか?言い換えれば,InvertFuncとResidueFuncはどこが共通で,どこが違うのかを明らかにする必要がある.これらが一種の逆関数であることは明らかだが,剰余演算として実装されているところに共通点がある.しかし,もちろん,大きな違いがある.一方の対象がNであるとして,他方の対象は1/Nだ.これを共通処理化可能だろうか?

どうもかなり難しそうだ.その前に一度ResidueFuncをPowerResidueFuncのように抽象化してみてはどうか?そうすれば,もう少し見えてくるものもあるのではないか?

N=3, B=10で固定部1になっている.これはおかしい.1/3=0.333なのだから,固定部0でなくてはならない.どうも直近の修正で壊してしまったようだ.⇒PowerResidueFuncのループの入口にあったはずの「RT(0) = B Mod n」が消えてしまっている.RTを外部で初期化するように修正した際に削ってしまった模様だ.

コメントを残す

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

CAPTCHA