Jump to content

Lehmer's GCD algorithm

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Jafet (talk | contribs) at 14:16, 25 September 2008 (Cite). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

Lehmer's GCD algorithm, named after Derrick Henry Lehmer, is a rather fast GCD algorithm, an improvement on the simpler but slower Euclidean algorithm.

Algorithm

Lehmer noted that that most of the quotients from each step of the division part of the standard algorithm are small. (For example, Knuth observed that the quotients 1, 2, and 3 comprise 67.7% of all quotients[1].)

Say we want to obtain the GCD of the two integers a and b. Let a ≥ b.

  • If b contains only one digit (in the chosen base, say or ), use some other method, such as the Euclidean algorithm, to obtain the result.
  • If a and b differ in the length of digits, perform a division so that a and b are equal in length, with length equal to m.
  • Iterate until one of a or b is zero:
    • Decrease m by one. Let x be the leading (most significant) digit in a, and y the leading digit in b, .
    • Initialize a 2 by 3 matrix to an extended identity matrix , and perform the euclidean algorithm simultaneously on the pairs and , until the quotients differ. That is, iterate:
      • Compute the quotients w1 of the long divisions of (x + A) by (y + C) and w2 of (x + B) by (y + D) respectively. Also let w be the (not computed) quotient from the current long division in the chain of long divisions of the euclidean algorithm.
      • If w1w2, then break out of the inner iteration. Else set w to w1 (or w2).
      • Set our current matrix
to
      • If B = 0, we have reached a deadlock; perform a normal step of the euclidean algorithm with a and b, and recompute the matrix.
    • Set a to aA + bB and b to Ca + Db (again simultaneously). This applies the steps of the euclidean algorithm that were performed on the leading digits in compressed form to the long integers a and b. Restart the outer iteration.

References

  1. ^ Knuth, The Art of Computer Programming vol 2 "Seminumerical algorithms", chapter 4.5.3 Theorem E.

References