

#ifndef BOOST_MATH_COMMON_FACTOR_RT_HPP
#define BOOST_MATH_COMMON_FACTOR_RT_HPP


namespace boost    {
namespace math    {

// TODO: use binary GCD for unsigned integers ....
template < typename IntegerType >
IntegerType  gcd( IntegerType a, IntegerType b )
{
    const IntegerType zero = (IntegerType)0;
    while ( true )
    {
        if ( a == zero )
            return b;
        b %= a;

        if ( b == zero )
            return a;
        a %= b;
    }
}

template < typename IntegerType >
IntegerType  lcm( IntegerType a, IntegerType b )
{
    const IntegerType t = gcd (a,b);
    if (!t)return t;
    return a / t * b;
}

}}

#endif
