素因数分解の高速なアルゴリズム(ロー法)
更新
ポラードのロー法という素因数分解の高速なアルゴリズムを解説します。
素因数分解のアルゴリズム
素因数分解のアルゴリズム
- 素因数分解の難しさと素数判定でも述べたとおり,大きな数の素因数分解は非常に難しいです。難しいながらもできるだけ速い方法を探したいです。
- ロー法( -アルゴリズム)は高確率で短い計算時間で正しい答えを返しますが,失敗することもあります。実験的にはうまくいっていますが,理論的な保証はないヒューリスティックスです。
アルゴリズムの手順
アルゴリズムの手順
ロー法は が合成数のとき, の非自明な( でも でもない)約数を高確率で求める方法です(これを繰り返し用いることで高確率で を素因数分解できます)。
とします。 を適当な数として, で数列 を定めます。また, とします。
手順0(初期化)
とする
手順1(計算)
と を計算する, と の最大公約数 を計算する
手順2(判定)
のとき, を 増やして手順1に戻る(再挑戦)
のとき,「 が の非自明な約数である」と出力(成功)
のとき,あきらめる(失敗)
成功すればハッピー
成功すればハッピー
ロー法が成功したときには の非自明な約数が得られている。
理由:ロー法が成功したとき, と の最大公約数が です。つまり は の非自明な約数です。
失敗する確率は低い
失敗する確率は低い
が合成数のときロー法が失敗する確率は低い(と期待できる)。
の非自明な約数で最も小さいものを とする。 である。
が の倍数だが の倍数でない,という状況になれば成功。その前に という状況になってしまうと失敗。
ところが は 以上 未満の値をそれなりにランダムに取るとみなせる(注)ので, となる確率は低い(その前に成功する確率が高い)。
注:ここが怪しいです。厳密な解析は未解決問題です。
高確率で短時間で終了する
高確率で短時間で終了する
が合成数のとき, くらいまでやればロー法は高確率で終了する(と期待できる)。
この主張の説明はだいぶ難しいですが面白いです。
異なる 種類の品物から重複を許してランダムに 個(くらい)取るとき,二個以上取る品物が高確率で存在する。という定理を使います。この定理の詳細は省略しますが,誕生日のパラドックスを読めば雰囲気は分かると思います。
を で割った余りを とおく。
は 以上 未満の値をそれなりにランダムに取る(ここが厳密でない)とみなせるので,先述の定理より とすれば高確率で の中に等しいものが存在する。その中で添字の大きい方の番号が最小なペアを とおく。
数列の定め方より,正の整数 が「いずれもが より大きくて二つの差が の倍数」なら となる(→注)。
そこで, 以上 未満の整数で の倍数であるもの(ただ一つある)を とすると, と は「いずれもが より大きくて二つの差が の倍数」なので となる。よって, は の倍数。
つまり遅くとも でロー法が終了することが分かる。
である。
注:この循環する様子を図にするとギリシャ文字の (ロー)っぽいのでロー法, -アルゴリズムと呼ばれています。
なお,手順1はユークリッドの互除法を使うことで 回くらいの割り算でできます。よって全体の計算量は くらいだと期待できます。素朴な方法(試し割り)の計算時間(だいたい )よりも高速です。
でなくても,数字の (小文字のシグマ)などでもよいですね。