朝起きるとPCが落ちているというのは日課になっている

朝起きると,PCが落ちているというのは日課になっているが,今のところ何とか走ってくれている.これが起動できなくなったらどういうことになるのか?考えても仕方ないので考えないようにしている… VSを起動してkinaiを走らせたら,以下のパネルが出た.

image_thumb

一旦ソリューションを閉じて再起動で問題なくロードできた.昨日は新しいプロジェクトを起こして「AKS素数判定法」を実装しようとしていたのだが,Pythonコードからの移植なので動かすまでにはかなり掛かりそうだ.むしろ,Pythonコードを直接試してみた方が早いのではということになったので,下記URLからコードを借りることにしたのだが,この中にψ数を計算しているところがある.現行ではψ数が求められないというケースがしばしばあるが,ψ数を独自に計算するツールを一つ作っておいた方がよい.ψ(n, K)で適切なKを選択すれば任意のnでψ数を計算できるはずなので,まず,それを実装してみることにする.

これはMatrix Testでやっていることに一番近いので,MatrixTestの隣りにボタンを置くことにしよう.(ボタンはすでに昨日作っている)

PsiFunctionで反例が出た.N=1234567926,K=5,e=44のとき,ψ値を検出できない事例が出た.⇒1234567926ではなく,1234567927だ.動作がおかしい.その後どこかへ跳んでしまった.画面が出てこない.直下のループに落ちていた.⇒このNはK=2でψを与えるようになっている.つまり,GCMが1であっても任意のKでψを取得できるとは限っていない.K=5の場合,剰余周期は{2,4,3,1}なので,べきを取ればR=1になる場合もあり得ると考えられる.⇒確かにeR=4ならR=1となる.ただし,ψ数はeに依存しない値なので,ψ不定という状態は変わらない.ちなみに,1234567927は素数である.

MatrixTestではφの約数列とψは更新されていない.⇒しかし,φの約数をどこかで(部分的に)書き込んでいる.⇒Kを更新した時点でイベントハンドラがValueChangedProを呼び出している.⇒K_TextChangedはpassflagでパスするようにした.出してもよいのだが,遅くなるだけだし,ここでは不要と思われる.

ψが決定されることとψに原始根マークが出るのは完全に一致しているように見える.それで正しいか?⇒ψ=K-1の場合を原始根と判定している.また,このときφ(K)=ψとなる.ψはつねにKよりも小さいのか?ψ=#と考えられる.#<Kであるのだから当然ψ<Kとなるだろう.

ψを因数分解のツールとして使おうという意図があるのだが,ψが<Kのような小さい数であるとしたら,ほとんど役に立たないのではないだろうか?むしろ最大のべきを探すべきなのではないか?AKS素数判定では多項式の剰余というのを使っているが,これがネックになっているのではないだろうか?素数判定だけならむしろトーシェント関数で直接判定した方が効率がよいような気がする.Wheel Factoringは確かに効果がある.種になる素数を増やせばそれだけ効率は改善されるものと思われる.現在は{2,3,5,7}を種としているが,それを{2,3,5,7,11}にしたらどうなるかを試してみたい.下記URLでは100万までの素数を列挙するというプログラムを公開しているので,参考にした.

https://keisan.casio.jp/exec/user/1648462730

ResidueTestでは素因数などが変化しない.SeedTestでは変化するが,Qなどは不変.cycleなども変化しない.⇒検定種別により,注目している項目が異なるということのようだが,変化しないところは空欄にしておいた方がよい.PrimeTestではInvertが上限オーバーしているため,何も変化しない.FactoringSubなどは実行されているが,値が同一のため動作していないように見える.InvertTestではB進表記だけは動く.PrimeTestではそれすら変化しない.

{2,3,5,7}のホイールの円周は2x3x5x7=210だ.この円周上には48個の素数点がある.この素数点を抽出する簡単なプログラムを書いて,

{1,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,
89,97,101,103,107,109,113,121,127,131,137,139,143,149,151,
157,163,167,169,173,179,181,187,191,193,197,199,209}

のような数列を得た.小さい素数については,

{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 121,
127, 131, 137, 139, 143, 149, 151, 157, 163, 167, 169, 173,
179, 181, 187, 191, 193, 197, 199, 209}

を素数リストに追加し,残る部分にホイールを適用するという構成にしたので,ホイールのスタート地点は211になる.これを導入して従来の円周30のホイールと差し替えた.W30の素数点は{4, 2, 4, 2, 4, 6, 2, 6}の8個だが,W210には48個の素数点が載っている.安定動作しているので,多分これで行けると思う.どの程度高速化しているかはあまりはっきりしないが,改善されていることは確かだと思う.

これで大体収まったと思うのだが,An Efficient Factoring Algorithm by Repunit Number Methodに書いてあることとはだいぶ乖離が発生してしまった.そもそもψ数が一致しない.定義は同じだと思うのだが,数字が合わない.また,逆数検定に循環単位Uというのを導入しているが,その辺りも書いてあることと実装にはかなりの隔たりがある.EFAではψ数をψ(b,n)のように表記し,以下のように定義している.

Given mutually prime numbers n and b, there exist nonnegative integer x<n and positive integers y and z such that z=x*by \n…x, that reads n divides x*by, the quotient z, and the remainder x, in other words, n*z+x=x*by. A set of {x,y,z} exists infinitely. u-length function y(b,n) is defined as the minimum such number y

乗法群の位相と呼ばれているord_n(a)の定義は現在使っているψ数とほぼ一致すると思う.⇒EFAに戻って読み直しを始めた.

コメントを残す

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

CAPTCHA