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
and
by repeatedly applying these identities:
#
: everything divides zero, and
is the largest number that divides
.
#
:
is a common divisor.
#
if
is odd:
is then not a common divisor.
#
if
odd and
.
As GCD is commutative (
), those identities still apply if the operands are swapped:
,
if
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
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 (
): in the example below, the exchange of
and
(ensuring
) 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
, 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
steps, where
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
. Each step involves only a few arithmetic operations (
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
, i.e.
.
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
,
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:
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
and
such that
.
In the case of large integers, the best asymptotic complexity is
, with
the cost of
-bit multiplication; this is near-linear and vastly smaller than the binary GCD algorithm's
, though concrete implementations only outperform older algorithms for numbers larger than about 64 kilobits (''i.e.'' greater than 8×10
19265). 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 algorithmCut-the-Knot: Binary Euclid's Algorithmat
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