剰余数列の周期をカラー表示する

まず,横数列の周期をカラー表示するところから始めよう.

パネルのタイトルが空欄になっている.「久留島喜内の置き土産」となっているはずなのだが… どこかで消してしまったようだ.

ボタンを押されたときに計算するとしてみたが,チェックがオンになっている状態でBuild Matrixが押された場合,カラー表示されないというのは不都合だ.やはり,初期描画するタイミングで色別表示するしかない.というか,マトリックスを描画しているのはForm2の関数であり,BuildMatrixではテーブルを構成しているだけなのだから,BuildPowerGridで対処すればよいのではないか?⇒チェックボックスをチェックしただけでは表示は変わらず,描画を更新するためには,BuildMatrixを押す必要があるというのでもよい.

どうもラジオボタンの使い方が難しい.すべてをオフにするためにはもう一つボタンを追加しなくてはならない.ラジオボタンの場合にはすでにオンのボタンがあると,そのボタンの(オフ)イベントが先に発生してしまう.⇒やや変則的だが,下記のようにしてみた.

image

★LambdaFunctionでγをgcm(α, γ)で割り込むという処理が組み込まれているが,この除算回数と固定部の桁数は完全に一致する.⇒これは必ずしも言えない.LambdaFunctionではΛ値を確定できるが,いまのところ固定部桁数を決定できる論理にはなっていない.

LambdaFunctionではGetResidueCycleでべき剰余数列の周期を取り出しているが,戻り値のcycは固定桁+周期のはずなのに数値が合わない場合がある.reduced+Λがcycと一致しない.たとえば,α=4, γ=16のとき,reduced=2,Λ=0, でcyc=1となっている.α=6 Γ=16 では,γ=1 reduced=4 Λ=0 cyc=1 となる.ただし,画面では 4 # 0 のように正しく表示されている.⇒GetResidueCycleの仕様をチェックする必要がある.この関数はLambdaFunction専用となっている.周期を出力しているところでは何を使っているのだろう?

周期を出力しているResidueFuncProではPowerResidueFuncで数列とその長さを取り出している.この関数では固定部と周期を分けた数値を返している.剰余数列はPRCycleという配列形式で返されて,それをDispResidueCycleで表示している.GetResidueCycleでも配列で剰余数列を返している.Λはこの配列内で1を検出することで決定している.GetResidueCycleの返す値には固定部は入っていない模様だ.cycは1を返しているが,cycle配列の内容は{0}だ.⇒GetResidueCycleはループカウンタのjを返しているが,jは0発進なので最小でも1になる.最初の値はα mod γ なので割り切れる場合は0になる.サイクルの長さに換算すれば,これは0とみなくてはならない.いずれにしても,cycには固定部は含まれないので数字の一致を求めることはできない.

逆に言うと,Λとcycはつねに一致しているのではないか?⇒そう言える.従って,Λは計算しなくても求められる.計算値は検算としては有効だが… むしろ,固定桁数とreducedが一致しない方が問題だ.α=22 Γ=12 γ=3 reduced=2 Λ=1 cyc=1の場合,2回GCMによって割り込んでいるが,FIXEDは1桁しかない.つまり,reduced値は決定的ではない.しかし,gcm(22, 12)=2でreduced=2というのはおかしい.⇒いや,数字は間違っていない.gcmで割り込んでいるのはγ値で,αには手を付けていないからだ.γ=12は2^2×3なので2で2回割られている.

おそらく,αの約数となるγの因数の個数が固定桁になるのだろう.⇒GCMが変化したときだけreducedをカウントアップするようにした.これでα=12 Γ=36 γ=1 reduced=2 Λ=0 cyc=1のときの固定桁2 # 0 と完全一致した.この計算は多分間違っていないと思われるが,GetResidueCycleの戻り値とΛが完全一致するように調整しておきたい.Λが値を持つ条件は数列に1を含むことだったと思うので,それだけをチェックしてやればよいのではないか?

GetResidueCycleはLambdaFunction+剰余数列の生成になっているので,各行ごとにGetResidueCycleを実行して周期列を取り出し,その先頭文字を見つけてそこから周期分着色するという方法で色分けしてみた.一応動いた.こんな感じになる.

image

もう一つ,これをダンダラに塗り分けてみた.

image

多少やり過ぎの感はあるが,わかり易くてよいのではないだろうか?一応動いてはいるのだが,まだどこか不備があるようだ.γ=12では失敗している.α2, 3, 4, 6, 8, 9 , 10 など,軒並み落としている.

image

GetResidueCycleでR=1が検出されない場合は0を返しているためだ.これは間違いだ.どういう場合,Λが0と判定すればよいのか?⇒Rが0になっているかどうかを見ればよい.

image

大体できたようだ.γが素数の場合にはこんな感じになる.

image

この図ではγ=17でマトリックスサイズはその倍近い32なので,中央付近で折返しになる.長さ16の周期列が最長で,これが原始根と呼ばれるものだ.つまり,γ=17の原始根は{3, 5, 6, 7, 10, 11, 12, 14}だ.素数499のマトリックスはこんな感じになった.

image

頭の1が塗りつぶされていないのは,1が周期の末項になっているためだ.設定ではεが115なのでその辺りが中央に来るように配置されている.ε=460で描画してみよう.どうもあんまり芳しい図にはならない.

image

γ=499では,ほとんどの周期は83, 166, 249, 498 などの長いものになる.これはφ(γ)が {1, 2, 3, 6, 83, 166, 249, 498} のような約数を持っているためだ.周期がマトリックスの横幅より大きいときにはすでに周期に入っていると見て,終わりを探るという動作の方が実情に合っているのではないか?この場合は末項を見つけて折り返すようになる.周期とオフセットの両方が分かれば,計算だけで出せるようになるのだが… そのためには,LambDaFunctionのオフセット仮説の証明が必要だ.これが確立すれば,LambDaFunctionだけで計算が完結する.⇒Matrix Test で検査してみよう.

▲マトリックスをビルド/テストしたときには,Λのリストを出力する.同様に原始根のリストも出力すべきだろう.これらはγだけで決定されるデータなので,ビルドマトリックスで出力するのが適当だ.

GetResidueCycleで配列サイズオーバーが発生した.γ=1でα=6.⇒修正ミスがあった.⇒対処した.

GetResidueCycleを少し改造して固定桁を計算できるようにした.この値は呼び出し元に参照渡しで返せるようにした.LambdaFunctionでも固定桁をoffsetとして参照渡しで返せるようにした.比較してみると,GetResidueCycleは使い物にならない.修正の余地はあるかもしれないが,一旦ここは廃棄するしかないような気がする.LambdaFunctionは確実に動作しているように思われるので,試してみよう.

▲α=2,γ=18でLambDaFunctionの返すoffsetとdropが一致しない.offset=1, drop=0.drio=0が正しい.GCMで割り込むという手法は正しいと思われるが,そのカウントが直ちに固定桁数に転化する訳ではない.その辺りをもう少し整理する必要がある.

コメントを残す

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

CAPTCHA