二次篩法 (QS)
改めて GNFS の勉強をし直してみたくなったので脳内で分かってるつもりになっている事を確認しつつ実装していく予定で書き始めてみました。まずは理論も実装も簡単な QS からスタートです。
篩法
概要
まずは今後やっていく篩系の素因数分解アルゴリズムに共通する概要を説明します。各篩法では最終的に因数分解したい合成数
となる非自明な整数組
すると
例 (N=187 )
例えば
すると右辺は素因数分解の結果から全部かけると平方数になることが分かるので
という計算を経て
では一般の合成数
二次篩法
概要
二次篩法 (QS; Quadratic Sieve) は以下のように大きく4つのステップから構成されます。
-
パラメータの選択
-
篩
-
有効式の選択
-
分解
-
の篩ステップでは 1. で決めた範囲
にある整数[a, b) についてx_k
という二次式の値の素因数分解を考えます。ここで
上の
となります。
次にステップ 3. の有効式の選択では上記のようにある程度の素数で分解できた
そして 4. の分解ステップで既に篩法の概要で述べたように
アルゴリズム
ここまでは数式の上で原理を理解するための概要説明であり、具体的な手順として不明なところや素直に実行しては効率的ではないところがあったかと思いますので順に説明しましょう。
篩
篩ステップでは
for (Integer x = a; x < b; ++x) {
Integer fx = f(x);
for (int p : factor_base) {
while (fx % p == 0) {
exponent[x][p]++;
fx /= p;
}
}
cached_f[x] = fx; // == 1 なら FB-smooth
}
なのでこの
素数
すると
なので
を満たすので、
for (int p : factor_base) {
for (int r : ModSqrts(n % p, p)) {
for (Integer x = a - (a % p) + r; x < b; x += p) {
while (cached_f[x] % p == 0) {
exponent[x][p]++;
cached_f[x] /= p;
}
}
}
}
ModSqrts(a, p)
は
さて、この方法を改めてみてみるとエラトステネスの篩と同じような作業をしていることが分かるでしょう。これが「篩系」アルゴリズムと言われる理由です。
Author And Source
この問題について(二次篩法 (QS) ), 我々は、より多くの情報をここで見つけました https://zenn.dev/peria/articles/db344641fa7cd5著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol