Next: , Previous: , Up: Greatest Common Divisor Algorithms   [Index]


15.3.2 Lehmerのアルゴリズム

Euclidのアルゴリズムを改良したLehmerの方法は, 商の列の最初の部分が,入力値の最大有効桁にのみ依存して決まっているという観察に基づいています。 GMPで使っているのはLehmerのアルゴリズムの一種で, 例えばJebeleanによる (see References)“A Double-Digit Lehmer-Euclid Algorithm” が示している通り, 最大有効リムの二つを分割します。 2つの2リムの入力値の商は2×2行列に1リムごとに格納されます。 これはmpn_hgcd2関数で行っています。この結果,行列は mpn_mul_1mpn_submul_1で使われる入力値に適用されます。通常は大体1リムごとに入力値を 削減していきます。滅多にないことですが,商が大きい場合は大きい方の2有効リムを試すだけで計算がストップしてしまうことがあるので,この場合は商は通常の除算で求めるようにして下さい。

結果として得られるアルゴリズムは漸近的に O(N^2)となり, Euclidアルゴリズムや2進分割法と同等程度になります。このアルゴリズムの2乗となる計算部分は mpn_mul_1mpn_submul_1を呼び出して行っています。小さいサイズの場合は,ここよりも 線型量となっている部分の方が比重が高くなります。つまり,大体N回のmpn_hgcd2関数呼び出し が必要となります。この関数は重要な下記の3つの最適化を行っています。