binary GCD algorithm
   HOME

TheInfoList



OR:

The binary GCD algorithm, also known as Stein's algorithm or the binary Euclidean algorithm, is an algorithm that computes the
greatest common divisor In mathematics, the greatest common divisor (GCD), also known as greatest common factor (GCF), of two or more integers, which are not all zero, is the largest positive integer that divides each of the integers. For two integers , , the greatest co ...
(GCD) of two nonnegative integers. Stein's algorithm uses simpler arithmetic operations than the conventional
Euclidean algorithm In mathematics, the Euclidean algorithm,Some widely used textbooks, such as I. N. Herstein's ''Topics in Algebra'' and Serge Lang's ''Algebra'', use the term "Euclidean algorithm" to refer to Euclidean division or Euclid's algorithm, is a ...
; it replaces division with
arithmetic shift In computer programming, an arithmetic shift is a shift operator, sometimes termed a signed shift (though it is not restricted to signed operands). The two basic types are the arithmetic left shift and the arithmetic right shift. For binary ...
s, comparisons, and subtraction. Although the algorithm in its contemporary form was first published by the physicist and programmer Josef Stein in 1967, it was known by the 2nd century BCE, in ancient China.


Algorithm

The algorithm finds the GCD of two nonnegative numbers u and v by repeatedly applying these identities: # \gcd(u, 0) = u: everything divides zero, and u is the largest number that divides u. # \gcd(2u, 2v) = 2 \cdot \gcd(u, v): 2 is a common divisor. # \gcd(u, 2v) = \gcd(u, v) if u is odd: 2 is then not a common divisor. # \gcd(u, v) = \gcd(u, v - u) if u, v odd and u \leq v. As GCD is commutative (\gcd(u, v) = \gcd(v, u)), those identities still apply if the operands are swapped: \gcd(0, v) = v, \gcd(2u, v) = \gcd(u, v) if v is odd, etc.


Implementation

While the above description of the algorithm is mathematically correct, performant software implementations typically differ from it in a few notable ways: * eschewing trial division by 2 in favour of a single bitshift and the count trailing zeros primitive; this is functionally equivalent to repeatedly applying identity 3, but much faster; * expressing the algorithm iteratively rather than recursively: the resulting implementation can be laid out to avoid repeated work, invoking identity 2 at the start and maintaining as invariant that both numbers are odd upon entering the loop, which only needs to implement identities 3 and 4; * making the loop's body branch-free except for its exit condition (v = 0): in the example below, the exchange of u and v (ensuring u \leq v) compiles down to conditional moves; hard-to-predict branches can have a large, negative impact on performance. The following is an implementation of the algorithm in
Rust Rust is an iron oxide, a usually reddish-brown oxide formed by the reaction of iron and oxygen in the catalytic presence of water or air moisture. Rust consists of hydrous iron(III) oxides (Fe2O3·nH2O) and iron(III) oxide-hydroxide (FeO(OH) ...
exemplifying those differences, adapted fro
''uutils''
use std::cmp::min; use std::mem::swap; pub fn gcd(mut u: u64, mut v: u64) -> u64 Note: The implementation above accepts ''unsigned'' (non-negative) integers; given that \gcd(u, v) = \gcd(\pmu, \pmv), the signed case can be handled as follows: /// Computes the GCD of two signed 64-bit integers /// The result is unsigned and not always representable as i64: gcd(i64::MIN, i64::MIN)

1 << 63 pub fn signed_gcd(u: i64, v: i64) -> u64


Complexity

Asymptotically In analytic geometry, an asymptote () of a curve is a line such that the distance between the curve and the line approaches zero as one or both of the ''x'' or ''y'' coordinates tends to infinity. In projective geometry and related contexts, ...
, the algorithm requires O(n) steps, where n is the number of bits in the larger of the two numbers, as every two steps reduce at least one of the operands by at least a factor of 2. Each step involves only a few arithmetic operations (O(1) with a small constant); when working with word-sized numbers, each arithmetic operation translates to a single machine operation, so the number of machine operations is on the order of n, i.e. \log_(\max(u, v)). For arbitrarily large numbers, the
asymptotic complexity In computer science, the computational complexity or simply complexity of an algorithm is the amount of resources required to run it. Particular focus is given to computation time (generally measured by the number of needed elementary operations ...
of this algorithm is O(n^2), as each arithmetic operation (subtract and shift) involves a linear number of machine operations (one per word in the numbers' binary representation). If the numbers can be represented in the machine's memory, ''i.e.'' each number's ''size'' can be represented by a single machine word, this bound is reduced to: O\left(\frac\right) This is the same as for the Euclidean algorithm, though a more precise analysis by Akhavi and Vallée proved that binary GCD uses about 60% fewer bit operations.


Extensions

The binary GCD algorithm can be extended in several ways, either to output additional information, deal with arbitrarily large integers more efficiently, or to compute GCDs in domains other than the integers. The ''extended binary GCD'' algorithm, analogous to the
extended Euclidean algorithm In arithmetic and computer programming, the extended Euclidean algorithm is an extension to the Euclidean algorithm, and computes, in addition to the greatest common divisor (gcd) of integers ''a'' and ''b'', also the coefficients of Bézout's id ...
, fits in the first kind of extension, as it provides the Bézout coefficients in addition to the GCD: integers a and b such that a\cdotu + b\cdotv = \gcd(u, v). In the case of large integers, the best asymptotic complexity is O(M(n) \log n), with M(n) the cost of n-bit multiplication; this is near-linear and vastly smaller than the binary GCD algorithm's O(n^2), though concrete implementations only outperform older algorithms for numbers larger than about 64 kilobits (''i.e.'' greater than 8×1019265). This is achieved by extending the binary GCD algorithm using ideas from the Schönhage–Strassen algorithm for fast integer multiplication. The binary GCD algorithm has also been extended to domains other than natural numbers, such as
Gaussian integers In number theory, a Gaussian integer is a complex number whose real and imaginary parts are both integers. The Gaussian integers, with ordinary addition and multiplication of complex numbers, form an integral domain, usually written as \mathbf /ma ...
,
Eisenstein integers In mathematics, the Eisenstein integers (named after Gotthold Eisenstein), occasionally also known as Eulerian integers (after Leonhard Euler), are the complex numbers of the form : z = a + b\omega , where and are integers and : \omega = \frac ...
, quadratic rings, and integer rings of number fields.


Historical description

An algorithm for computing the GCD of two numbers was known in ancient China, under the
Han dynasty The Han dynasty was an Dynasties of China, imperial dynasty of China (202 BC9 AD, 25–220 AD) established by Liu Bang and ruled by the House of Liu. The dynasty was preceded by the short-lived Qin dynasty (221–206 BC ...
, as a method to reduce fractions: The phrase "if possible halve it" is ambiguous, * if this applies when ''either'' of the numbers become even, the algorithm is the binary GCD algorithm; * if this only applies when ''both'' numbers are even, the algorithm is similar to the
Euclidean algorithm In mathematics, the Euclidean algorithm,Some widely used textbooks, such as I. N. Herstein's ''Topics in Algebra'' and Serge Lang's ''Algebra'', use the term "Euclidean algorithm" to refer to Euclidean division or Euclid's algorithm, is a ...
.


See also

*
Euclidean algorithm In mathematics, the Euclidean algorithm,Some widely used textbooks, such as I. N. Herstein's ''Topics in Algebra'' and Serge Lang's ''Algebra'', use the term "Euclidean algorithm" to refer to Euclidean division or Euclid's algorithm, is a ...
*
Extended Euclidean algorithm In arithmetic and computer programming, the extended Euclidean algorithm is an extension to the Euclidean algorithm, and computes, in addition to the greatest common divisor (gcd) of integers ''a'' and ''b'', also the coefficients of Bézout's id ...
*
Least common multiple In arithmetic and number theory, the least common multiple (LCM), lowest common multiple, or smallest common multiple (SCM) of two integers ''a'' and ''b'', usually denoted by , is the smallest positive integer that is divisible by both ''a'' and ...


References

, answer to exercise 39 of section 4.5.2 .


Further reading

* Covers the extended binary GCD, and a probabilistic analysis of the algorithm. * Covers a variety of topics, including the extended binary GCD algorithm which outputs Bézout coefficients, efficient handling of multi-precision integers using a variant of Lehmer's GCD algorithm, and the relationship between GCD and continued fraction expansions of real numbers. * An analysis of the algorithm in the average case, through the lens of
functional analysis Functional analysis is a branch of mathematical analysis, the core of which is formed by the study of vector spaces endowed with some kind of limit-related structure (for example, Inner product space#Definition, inner product, Norm (mathematics ...
: the algorithms' main parameters are cast as a
dynamical system In mathematics, a dynamical system is a system in which a Function (mathematics), function describes the time dependence of a Point (geometry), point in an ambient space, such as in a parametric curve. Examples include the mathematical models ...
, and their average value is related to the
invariant measure In mathematics, an invariant measure is a measure that is preserved by some function. The function may be a geometric transformation. For examples, circular angle is invariant under rotation, hyperbolic angle is invariant under squeeze mappin ...
of the system's
transfer operator In mathematics, the transfer operator encodes information about an iterated map and is frequently used to study the behavior of dynamical systems, statistical mechanics, quantum chaos and fractals. In all usual cases, the largest eigenvalue is 1 ...
.


External links


NIST Dictionary of Algorithms and Data Structures: binary GCD algorithm

Cut-the-Knot: Binary Euclid's Algorithm
at
cut-the-knot Alexander Bogomolny (January 4, 1948 July 7, 2018) was a Soviet Union, Soviet-born Israeli Americans, Israeli-American mathematician. He was Professor Emeritus of Mathematics at the University of Iowa, and formerly research fellow at the Moscow ...

''Analysis of the Binary Euclidean Algorithm''
(1976), a paper by Richard P. Brent, including a variant using left shifts {{DEFAULTSORT:Binary Gcd Algorithm Number theoretic algorithms Articles with example Rust code