...one of the most highly
regarded and expertly designed C++ library projects in the
world.

— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards

**Header: ** <boost/math/common_factor_ct.hpp>

typedefunspecifiedstatic_gcd_type; template < static_gcd_type Value1, static_gcd_type Value2 > struct boost::math::static_gcd : public mpl::integral_c<static_gcd_type, implementation_defined> { }; template < static_gcd_type Value1, static_gcd_type Value2 > struct boost::math::static_lcm : public mpl::integral_c<static_gcd_type, implementation_defined> { };

The type `static_gcd_type`

is
the widest unsigned-integer-type that is supported for use in integral-constant-expressions
by the compiler. Usually this the same type as `boost::uintmax_t`

,
but may fall back to being ```
unsigned
long
```

for some older compilers.

The boost::math::static_gcd and boost::math::static_lcm class templates take
two value-based template parameters of the *static_gcd_type*
type and inherit from the type `boost::mpl::integral_c`

. Inherited from the base class,
they have a member *value* that is the greatest common factor
or least common multiple, respectively, of the template arguments. A compile-time
error will occur if the least common multiple is beyond the range of `static_gcd_type`

.

#include <boost/math/common_factor.hpp> #include <algorithm> #include <iterator> #include <iostream> int main() { using std::cout; using std::endl; cout << "The GCD and LCM of 6 and 15 are " << boost::math::gcd(6, 15) << " and " << boost::math::lcm(6, 15) << ", respectively." << endl; cout << "The GCD and LCM of 8 and 9 are " << boost::math::static_gcd<8, 9>::value << " and " << boost::math::static_lcm<8, 9>::value << ", respectively." << endl; int a[] = { 4, 5, 6 }, b[] = { 7, 8, 9 }, c[3]; std::transform( a, a + 3, b, c, boost::math::gcd_evaluator<int>() ); std::copy( c, c + 3, std::ostream_iterator<int>(cout, " ") ); }