現在,3つの剰余値にR, αR,γRのようなラベルを付けているが,Rとそれ以外の剰余を区別するために,別の文字を割り当てることにする.αR,γR はいずれも数列の周期を表す数字なので,λを用いることにする.λは物理学では波長の意味で使われているので連想が効くのではないかと思う.一旦バックアップを取ってから修正に入ることにしよう.
記号文字の割当てに関してはこれで完璧ではないかと思う.これらはほとんど英文字一文字なので一括変換してすべてのテキスト出力を同期させておきたい.かなり大掛かりな修正になるが,整理してしまった方がよいと思う.⇒作業に入る前に記号の割当てについてもう少し考えてみよう.ψという文字は心理学では超能力を表し,量子力学では波動関数を表す.数学ではフィボナッチ数列の逆数和として使われている.
この意味ではψを剰余数列という波動を示す関数とみなすというのは外れていないとは思われるが,周期であるという点に注目すればむしろ,波長λの方が適切であるような気もする.この場合,αR,γRなどは位相と見るのが順当である.位相には,β,φ,ψが使われることが多い.この意味ではψ(α),ψ(γ)のような使い方が考えられる.未決の懸案事項として,#=ψとするかどうか?という問題があるが,とりあえず,n→α,e→γ,K→Θ,B→βのみ確定としてフィックスしてしまうことにする.
関数内部で同名の記号をローカル変数として使っている場合がある.→nはグローバル変数ではないのだから,差し支えないはずだ.n/Nで269個あった.コンパイルエラーは1件に留まる.b/Bは145個.k/Kは2件しかなかった.本当だろうか?⇒丸残りになっていた.205個出た.γはeとして使われる場合がある.しかし,eはイベントハンドラの引数にも現れるので注意が必要だ.ψ→Λも実行することにする.ψα,ψγも片付けてしまうことにしよう.パネル出力は別として,ほぼ仕上がったのではないかと思う.あとはこれをツールとして活用するというフェーズに入ることになるが,あえて取り上げるとすれば,「離散対数を求める」問題を実装するというのがある.
離散対数というのは,剰余Rに対して決まるγ値のことで,いまのところどうやってそれを求めればよいのか?というアイディアはまとまっていない.しかし,グループでしきりにこの話題が取り上げられているので,いま,ここでそれに対応するというのもありではないかという気がする.少し方式を考えてみることにしよう.Rとγの関係は,
α^γ÷Θ=Q…R つまり,α^γ≡R mod Θ
であるから,α^γ-R≡0 mod Θ を満たすγを求めるという問題になる.αとΘは固定であるから,マトリックスΘのΨαの行でRの位置を求めることに等しい.Rは複数位置に存在し得るので,最小のΨγを見つけることになるだろう.ただし,Matrix(Θ).rows(Ψα)上にRが存在しないという場合もあり得る.(R<Θ)ただし,Θを素数に限定すればかならずγを得ることはできる.⇒いや,できない場合もある.たとえば,α=138, Θ=241のとき,Ψα=138だが,この行はΛ=80で剰余数列の長さは80しかないから,この数列に乗らないRはいくらでもある.
一般には「n を整数として既約剰余類群 G = (Z/nZ)× が巡回群であると仮定」することになっているようだ.「そのような n は 2, 4 および素数冪 q と 2 q の形に書けるものに限られる」とされる.この条件は群Gが原始根を持つ場合と一致するということのようだ.たとえば,α=3,Θ=17は原始根3を持っている.このときの離散対数は指数(index)と呼ばれることもある.離散対数の定義は以下のようなものだ.
G を位数 n の有限巡回群とする。b を G の生成元とすれば、G の任意の元 g は、適当な整数 k を用いて g = b^k の形に書ける。さらに、g を表現する二つの整数 k1, k2 は必ず n を法として合同である。したがって、g に n を法とする k の合同類を対応させることにより log_b:G→Z/nZ なる函数を定義することができる.この函数は準同型写像であり,bを底とする離散対数と呼ばれる.
従って,この問題に入り込むには,まず群が巡回群であるか否かを判定するところから始めなくてはならない.
▲B進表記を10進表記に変換する機能が壊れている.(動作しない)⇒イベントハンドラは残っていたが,ハンドルが消えていた.⇒復活できたが,他にもこのようなところはあるだろうか?⇒一通りチェックした限りでは大丈夫なようだ.
『群 G が巡回群となるかどうかを見るには G の単項生成部分群で G 自身に一致するものがあるかどうかを調べるだけで十分である』
「巡回群とは,だた一つの元で生成される群(単項生成群)のことである」から,これは巡回群の定義そのものである.
「位数 n の群が巡回群となるための必要十分条件は、n の任意の約数 d に対して位数 d の部分群をちょうど一つ持つこと」
これを我々の言語に翻訳すると,位数Λの剰余数列がΛの任意の約数dに対して位数dの剰余数列を持つことのようになる.⇒どうもまったく意味不明だ.いずれにしても,我々はまだ,Λの約数のようなものをチェックしてみたことがない.しかし,いまの場合はφ(Θ)=Λなので,φ(Θ)=の約数を見ることになる.まだやってみたことはないかもしれないが,このアプローチは我々の方法とかけ離れたものではない.原理はよくわからないが,Rからγを逆算ないし探索するというのはそれほど難しくないと思われるので,とりあえず実装してみることにしよう.
▲ ‘System.ArgumentOutOfRangeException’ という例外が発生している.⇒Θに61という値を代入しただけで発生している.この数には限らない.もっと小さくても起きる.⇒DispInvertFuncの中で起きている.⇒DispNotationで起きている.⇒notation.Textに空文字列を書き込んだだけでエラーになっている.⇒Kinai.vbをデザインモードで開けなくなっている.⇒プロジェクトのフォルダ名を変更しようとしたら,別のプロセスがこのフォルダを使っているというメッセージが出た.食事後(落ちていた)にバックアップした版に戻っても同じ.もう一つ前のバックアップ久留島喜内 2023-06-17-4は開けた.⇒この版では障害は発生しない.ここから再開することにする.
WinMergeをインストールしてフォルダを比較してみた.Handles notation.TextChangedを追加しただけだ.⇒DispInvertFuncの中からClearInverseが呼び出され,それがトリガーになってnotation_TextChangedが呼び出されるというループになっていた.passflagを立てて回避するようにした.⇒念のため,ここでバックアップを取っておこう.⇒離散対数計算はざっくり動作するようになった.
パラメータの記号はほぼ固まったことになっているのだが,もう一度考えてみたい.現行では,Nをαとし,Bをβ,KをΘ,eをγとしているが,αβγという三つ組を考えるとすれば,むしろ,NBKではないだろうか?なぜかというと,B進の1/Nの循環節の長さを剰余数列としてみようとすると,β→N,N→Kのようになり,NBKが三つ巴の関係になっているように見えるからだ.このことから考えると,ΘをBとするようなローテーションもあり得るように思われる.群論ではKはnと呼ばれていて,主観的にも相互転換しやすい方がよいような気がする.
現在γと呼ばれているものはΨγと同種のインデックスの仲間と考えられるので,αやβとはカテゴリが違うと考えられる.従って,この値はむしろψと呼んだ方が適切であるかもしれない.ψの用途は位相・角度・電束などとなっており,γよりベターであるような気がする.#や@にはまだ名前は付いていないが,Λの仲間と思われる.γをまず,ψに変更し,ついでΘをγに変えることにする.
