Next: Subquadratic GCD, Previous: Binary GCD, Up: Greatest Common Divisor Algorithms [Index]
Euclidのアルゴリズムを改良したLehmerの方法は,
商の列の最初の部分が,入力値の最大有効桁にのみ依存して決まっているという観察に基づいています。
GMPで使っているのはLehmerのアルゴリズムの一種で,
例えばJebeleanによる (see References)“A Double-Digit Lehmer-Euclid Algorithm” が示している通り,
最大有効リムの二つを分割します。
2つの2リムの入力値の商は2×2行列に1リムごとに格納されます。
これはmpn_hgcd2
関数で行っています。この結果,行列は mpn_mul_1
や
mpn_submul_1
で使われる入力値に適用されます。通常は大体1リムごとに入力値を
削減していきます。滅多にないことですが,商が大きい場合は大きい方の2有効リムを試すだけで計算がストップしてしまうことがあるので,この場合は商は通常の除算で求めるようにして下さい。
結果として得られるアルゴリズムは漸近的に O(N^2)となり,
Euclidアルゴリズムや2進分割法と同等程度になります。このアルゴリズムの2乗となる計算部分は
mpn_mul_1
と mpn_submul_1
を呼び出して行っています。小さいサイズの場合は,ここよりも
線型量となっている部分の方が比重が高くなります。つまり,大体N回のmpn_hgcd2
関数呼び出し
が必要となります。この関数は重要な下記の3つの最適化を行っています。
mpn_hgcd
関数(次節を参照)と同じように厳密性を緩めた方法を使います。
つまり,二つの大きな数の,最大有効リム2つ分を呼び出して生成した行列は,この2数の商の列の最初の部分と
完全に一致しなくてもよい,とするものです。最終的な商は時々ずれることがあります。