だいぶいい感じになってきた

だいぶいい感じになってきた.特に,B進数⇔10進数の相互変換が自在にできるようになったのがうれしい.これは相当役に立つと思う.循環小数は基数が決まらないと意味がないので,基数を変化させることができることはその辺りを調査するときに使うツールとしては必須の機能だ.ここまでやると,Invertを実行しなくても,逆数の循環単位などを常時表示できるようにしたくなってくる.整数Nの逆数である循環小数Dの固定部Xと循環部Yを2つの整数とみなすと,XのB進数表記の桁数をx,Yの桁数をyとすれば,0≦x, y<N,0≦X<B^x,0≦Y<B^yで,

D = X / b^x + Y * ρ(x, y) (1)

ここで ρ は ρ(x, y) = Σ{k=0→∞}(1 / {B^y}^k) / b^x のような無限級数.(1)式はどんな小数にも適用できる等式だが,桁数 x, y が不定というところが厄介なところだ.4093という素数をB=11で逆数を取ったところ,循環単位の桁数が2046になった.ρ(x, y) は無限等比級数で,r=1/B^y < 1 により収束する.Σ{n=1→∞}a_n = a_1/(1 – r) .これが正しいとすると,1 – r という数がどのようなものであるのかが気になる.この値を計算するには,B^y という数を決定し,その逆数を取って,それと1の差分を計算する必要がある.どうもこの当たりが鍵になりそうな気がするので,実装を試みることにしよう.

電卓としても使えるようにn^pの計算で剰余だけでなく計算数値も出すようにした.循環小数値をX&Yの形式で表記することを考えてみる.たとえば,252_10であれば,00&390625のようになる.つまり,1/252 = 00&390625(10)と表記できる.この表記では頭のゼロは落とせないので,/00/390625/10とするのがよいのではないだろうか?あるいは,10/00/390625の方がベターかもしれない.⇒このような値を与えられたとき,これから1/252という元の数字を導くことができるだろうか?

InverseClickでエラーが発生した.n=255, b=12のとき,固定桁 fixed=1, 循環桁 k=16で,1+16*2=33桁の数字列を取り出したあと,zerosup = keta – nnstr.Length が –4 という負値になったため, New String(“0″c, zerosup)でエラーが発生した.nnに入っている値は,{1608573608807851864064416092523532}という大きなもので,b^keta / n の値だが,ConvertNum2String でテキストに変換したとき,桁数が37しか取れなかった.

ConvertNum2Stringが誤動作しているようだ.間にNULLキャラが入っているように思われる.いや,”A8”とか,”BA3”のような複数文字がつながった部分がある.⇒エンコードの問題だ.UTF8を使っていたが,UNICODEに変更して動作するようになった.

System.Text.Encoding.Unicode.GetString(BitConverter.GetBytes(c))

SeedTestでWRONG TOTIENTが出ているが,これは何だろう?「pk <> k And tot > 1」という理由だ.tot はφ関数,kは循環単位長,pkはtotとkのGCMだ.SeedTestは1~Nの範囲で検定を行い,整数の属性をチェックしている.pk=2, k=0, tot=2だ.対象数は4で基数は10.⇒ツールで常時φやψが見えるようにしておこう.

InverseClickで「R <> b And R <> 1」で停止した.R=0, b=20, b=128.⇒今度は,R=4, b=10, n=12 で停止した.InvertFuncではまずx=b=10として,x\n=10\12=0…10.次にx=x*b=10*10=100として,100\12=8…4,次に,x=R=4で,x*b=4*10=40\12=3…4.このRは既出だから,循環が閉じて復帰している.この計算は正しい.つまり,循環が閉じるときのRはbや1に限った話ではない.従って,ここで停止する必要はないと言ってよい.

ファイルを開こうとして,競合エラーが発生する.これはおもしろくない.⇒エラートラップを仕掛けてresumeするようにした.⇒ファイルに保存をオプションとする.

InverseClickで「ERROR:Count cannot be less than zero. (Parameter ‘count’)」というエラーになった.zerosupが-1になっている.上で出ていた症状だ.nnstr.Length=2でketa=1のため,差分がマイナスになってしまう.nnstrには”10”という文字列が入っている.nnも10だ.fixed=1でkが0であるため,keta=1+2*0で1になっている.n=1という数が入っている.n=1というのは,1/nが1になるというかなり特殊な数字だ.”循環小数=0.” + nnstrとあるように,ここでは1/nが1より大きくなることを想定していない.⇒暫定的にn=1の場合はエラーを回避して抜けるようにした.

▲φφというパラメータをチェックする必要があるだろうか?この値はφ(φ())で,nのトーシェント関数のトーシェントだから,nを変えない限り変化しない.

▲ψがゼロになる場合がある.このようなときは,循環桁数=φになる.通常は,φ≧ψでψ=循環桁数になっているのだが…これは調べておく必要がある.どうもBの約数と関係があるようなので,Bの約数も表示できるようにするとよいのだが…

ToBCDで例外が発生している.以下の計算式で発生する.

Dim byteCount As BigInteger = Math.Log(val) / Math.Log(b) + 1

n=255と小さな数字だが,逆数を整数化した数は巨大数になる.3921568627450980392156862745098 ToBCDでは冒頭で配列サイズを決めるためにMath.Logを使っている.対数計算しないように方式変更した.⇒最初にInt16.MaxValueサイズの配列を確保し,これを使って直接n\bの剰余(BCD値)を格納して桁数をカウントするようにした.

コメントを残す

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

CAPTCHA