Boost C++ Libraries of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for an old version of Boost. Click here to view this page for the latest version.

Compile time GCD and LCM determination

Header: <boost/math/common_factor_ct.hpp>

typedef unspecified static_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, " ") );