ネギ式

適当に生きるおっさんのブログ

プログラミング:因数分解プログラムほぼOK

プログラム修正後、600回くらいランダムに因数分解を試みて全部成功しているので、たぶんもう大丈夫。(多項式の次数と、係数の最大値には制限あり)

多項式の因数分解

ただし、もはやCantor–Zassenhaus algorithmではない。(英語版wikipediaを見ただけで、論文は読んでないので、本当に違うかどうかは分からんけど)

そう禁断のテクニック、「アルゴリズムを勝手に変える」というやつを使ったのだ。これは、料理でレシピを守らないというのに似ている。

人はなぜ料理のレシピを守らないのか? それは材料がない、または高いからである。俺はなぜCantor–Zassenhaus algorithmを守らなかったのか? それは (p^d-1)/2 がjavascript の整数の範囲を超えたから。p は素数、d は多項式の次数。Cantor–Zassenhausではランダムに選んだ多項式をp^d 乗するという部分があるのだ。それがjavascriptの範囲を超えてしまう。というかpによっては超えるということだが、どうしてもそういうpが必要なのだ(たぶん)。

しかし、ランダムに選んだ多項式を何乗かして、ある多項式で割った余りを取るということを考えると、最初がランダムなら何乗して余りをとってもランダムじゃないかという疑問がでてくる。べき乗する意味なくね?

ともかく、やってみてOKならOKさ。そしてやってみたらOKっぽかった。結果よければすべてよし。理論としては「最初がランダムなら何乗して余りをとってもランダム」これは正しかったということだ(たぶん)。

というわけで、Cantor–Zassenhausではなく、ランダムに選んだだけなので「勘で取ってサーセンアルゴリズムということにした。

そしてpの選び方も少しランダムにした。小さいpはヘンゼル持ち上げとか失敗することが多いのだ。そこで三つくらい小さめのpをランダムに選んで、因数分解をし、結果を比較して三つのpが全部一致すればそれ、全部一致でなければ、一番多くの因子に分解したものについて、それぞれの因子を再度因数分解することにした。この再度因数分解の時にまたpをランダムに選ぶのだ(たぶんこれが重要)。

この改良の結果、かなり遅くなった。pが少し大きくなると遅くなる。

夏休みの宿題がようやく終わったという感じである。

 

 

ad2217.hatenablog.com

 

ad2217.hatenablog.com

 

ad2217.hatenablog.com

 

ad2217.hatenablog.com