このアルゴリズムも x2 - y2≡0 (mod n) を利用する。
まず、Fermat の方法 x2 - y2 = (x+y)(x-y) のときに使った、
x = int(sqrt(n)) + 1
から始める。
x2≡r(mod n)
において、r が2乗数であれば話は終わりだが、なかなかそうはなってくれないので、
いろんな x について r を求めて、r の積が2乗数になるようにする。
12345679 を例にとって考えてみよう。x = isqrt(12345679) + 1 = 3514 から始める。
35142 - 12345679 = 2517 = 3×839
35152 - 12345679 = 9546 = 2×3×37×43
35162 - 12345679 = 16577 = 11×11×137
35172 - 12345679 = 23610 = 2×3×5×787
35182 - 12345679 = 30645 = 3×3×3×5×227
……
3番目、5番目等は、なかなかいい線に行っている。
このようなのを、もっと多数求める。
……などとやっていたら、求めるものがいつ得られるのかわからない。
そこで方針を変える。
いろいろ計算して、使えそうなものを組み合わせる
のではなく、
最初から右辺の素数を固定しておき、
素因数分解結果がそれ以下の素数から構成されるもののみを集める
とする。この素因数分解はいちいち完全にやる必要はなく、必要としている素数の組、
p1, p2, …… , pk
で順に割っていき、割り切れなかったものを除去していけばよい。
このようにして得られた x と r の組から、2乗になるものを構成するには、
各素数のべき数の和が偶数となるような一次結合
を求めればよい。これは、上記 k 個の変数からなる連立方程式を解く問題に帰着される。
この方法を、複数多項式二次ふるい法(MPQS : Multiple Polynomial Quadratic Sieve Method)
と呼ぶ。
このアルゴリズムは、
というメリットがある。
実際に、Silverman は、24台の Sun3 を結合して、90桁前後の合成数を数多く素因数分解している。
ここでは、コーディング例は示さない。
詳細は、
木田祐司、牧野潔夫「UBASICによるコンピュータ整数論」(株)日本評論社(1994)
参照のこと。
前 | この章の目次 | 次 |
---|