⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common_factor_rt.hpp

📁 CGAL is a collaborative effort of several sites in Europe and Israel. The goal is to make the most i
💻 HPP
字号:
//  Boost common_factor_rt.hpp header file  ----------------------------------////  (C) Copyright Daryle Walker and Paul Moore 2001-2002.  Permission to copy,//  use, modify, sell and distribute this software is granted provided this//  copyright notice appears in all copies.  This software is provided "as is"//  without express or implied warranty, and with no claim as to its suitability//  for any purpose. //  See http://www.boost.org for updates, documentation, and revision history. #ifndef BOOST_MATH_COMMON_FACTOR_RT_HPP#define BOOST_MATH_COMMON_FACTOR_RT_HPP#include <boost/math_fwd.hpp>  // self include#include <boost/config.hpp>  // for BOOST_NESTED_TEMPLATE, etc.#include <boost/limits.hpp>  // for std::numeric_limitsnamespace boost{namespace math{//  Forward declarations for function templates  -----------------------------//template < typename IntegerType >    IntegerType  gcd( IntegerType const &a, IntegerType const &b );template < typename IntegerType >    IntegerType  lcm( IntegerType const &a, IntegerType const &b );//  Greatest common divisor evaluator class declaration  ---------------------//template < typename IntegerType >class gcd_evaluator{public:    // Types    typedef IntegerType  result_type, first_argument_type, second_argument_type;    // Function object interface    result_type  operator ()( first_argument_type const &a,     second_argument_type const &b ) const;};  // boost::math::gcd_evaluator//  Least common multiple evaluator class declaration  -----------------------//template < typename IntegerType >class lcm_evaluator{public:    // Types    typedef IntegerType  result_type, first_argument_type, second_argument_type;    // Function object interface    result_type  operator ()( first_argument_type const &a,     second_argument_type const &b ) const;};  // boost::math::lcm_evaluator//  Implementation details  --------------------------------------------------//namespace detail{    // Greatest common divisor for rings (including unsigned integers)    template < typename RingType >    RingType    gcd_euclidean    (        RingType  a,        RingType  b    )    {        // Avoid repeated construction        #ifndef __BORLANDC__        RingType const  zero = static_cast<RingType>( 0 );        #else        RingType  zero = static_cast<RingType>( 0 );        #endif        // Reduce by GCD-remainder property [GCD(a,b) == GCD(b,a MOD b)]        while ( true )        {            if ( a == zero )                return b;            b %= a;            if ( b == zero )                return a;            a %= b;        }    }    // Greatest common divisor for (signed) integers    template < typename IntegerType >    inline    IntegerType    gcd_integer    (        IntegerType const &  a,        IntegerType const &  b    )    {        // Avoid repeated construction        IntegerType const  zero = static_cast<IntegerType>( 0 );        IntegerType const  result = gcd_euclidean( a, b );        return ( result < zero ) ? -result : result;    }    // Least common multiple for rings (including unsigned integers)    template < typename RingType >    inline    RingType    lcm_euclidean    (        RingType const &  a,        RingType const &  b    )    {        RingType const  zero = static_cast<RingType>( 0 );        RingType const  temp = gcd_euclidean( a, b );        return ( temp != zero ) ? ( a / temp * b ) : zero;    }    // Least common multiple for (signed) integers    template < typename IntegerType >    inline    IntegerType    lcm_integer    (        IntegerType const &  a,        IntegerType const &  b    )    {        // Avoid repeated construction        IntegerType const  zero = static_cast<IntegerType>( 0 );        IntegerType const  result = lcm_euclidean( a, b );        return ( result < zero ) ? -result : result;    }    // Function objects to find the best way of computing GCD or LCM#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION    template < typename T, bool IsSpecialized, bool IsSigned >    struct gcd_optimal_evaluator_helper_t    {        T  operator ()( T const &a, T const &b )        {            return gcd_euclidean( a, b );        }    };    template < typename T >    struct gcd_optimal_evaluator_helper_t< T, true, true >    {        T  operator ()( T const &a, T const &b )        {            return gcd_integer( a, b );        }    };#else    template < bool IsSpecialized, bool IsSigned >    struct gcd_optimal_evaluator_helper2_t    {        template < typename T >        struct helper        {            T  operator ()( T const &a, T const &b )            {                return gcd_euclidean( a, b );            }        };    };    template < >    struct gcd_optimal_evaluator_helper2_t< true, true >    {        template < typename T >        struct helper        {            T  operator ()( T const &a, T const &b )            {                return gcd_integer( a, b );            }        };    };    template < typename T, bool IsSpecialized, bool IsSigned >    struct gcd_optimal_evaluator_helper_t        : gcd_optimal_evaluator_helper2_t<IsSpecialized, IsSigned>           ::BOOST_NESTED_TEMPLATE helper<T>    {    };#endif    template < typename T >    struct gcd_optimal_evaluator    {        T  operator ()( T const &a, T const &b )        {            typedef ::std::numeric_limits<T>  limits_type;            typedef gcd_optimal_evaluator_helper_t<T,             limits_type::is_specialized, limits_type::is_signed>  helper_type;            helper_type  solver;            return solver( a, b );        }    };#else // BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS    template < typename T >    struct gcd_optimal_evaluator    {        T  operator ()( T const &a, T const &b )        {            return gcd_integer( a, b );        }    };#endif#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION    template < typename T, bool IsSpecialized, bool IsSigned >    struct lcm_optimal_evaluator_helper_t    {        T  operator ()( T const &a, T const &b )        {            return lcm_euclidean( a, b );        }    };    template < typename T >    struct lcm_optimal_evaluator_helper_t< T, true, true >    {        T  operator ()( T const &a, T const &b )        {            return lcm_integer( a, b );        }    };#else    template < bool IsSpecialized, bool IsSigned >    struct lcm_optimal_evaluator_helper2_t    {        template < typename T >        struct helper        {            T  operator ()( T const &a, T const &b )            {                return lcm_euclidean( a, b );            }        };    };    template < >    struct lcm_optimal_evaluator_helper2_t< true, true >    {        template < typename T >        struct helper        {            T  operator ()( T const &a, T const &b )            {                return lcm_integer( a, b );            }        };    };    template < typename T, bool IsSpecialized, bool IsSigned >    struct lcm_optimal_evaluator_helper_t        : lcm_optimal_evaluator_helper2_t<IsSpecialized, IsSigned>           ::BOOST_NESTED_TEMPLATE helper<T>    {    };#endif    template < typename T >    struct lcm_optimal_evaluator    {        T  operator ()( T const &a, T const &b )        {            typedef ::std::numeric_limits<T>  limits_type;            typedef lcm_optimal_evaluator_helper_t<T,             limits_type::is_specialized, limits_type::is_signed>  helper_type;            helper_type  solver;            return solver( a, b );        }    };#else // BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS    template < typename T >    struct lcm_optimal_evaluator    {        T  operator ()( T const &a, T const &b )        {            return lcm_integer( a, b );        }    };#endif    // Functions to find the GCD or LCM in the best way    template < typename T >    inline    T    gcd_optimal    (        T const &  a,        T const &  b    )    {        gcd_optimal_evaluator<T>  solver;        return solver( a, b );    }    template < typename T >    inline    T    lcm_optimal    (        T const &  a,        T const &  b    )    {        lcm_optimal_evaluator<T>  solver;        return solver( a, b );    }}  // namespace detail//  Greatest common divisor evaluator member function definition  ------------//template < typename IntegerType >inlinetypename gcd_evaluator<IntegerType>::result_typegcd_evaluator<IntegerType>::operator ()(    first_argument_type const &   a,    second_argument_type const &  b) const{    return detail::gcd_optimal( a, b );}//  Least common multiple evaluator member function definition  --------------//template < typename IntegerType >inlinetypename lcm_evaluator<IntegerType>::result_typelcm_evaluator<IntegerType>::operator ()(    first_argument_type const &   a,    second_argument_type const &  b) const{    return detail::lcm_optimal( a, b );}//  Greatest common divisor and least common multiple function definitions  --//template < typename IntegerType >inlineIntegerTypegcd(    IntegerType const &  a,    IntegerType const &  b){    gcd_evaluator<IntegerType>  solver;    return solver( a, b );}template < typename IntegerType >inlineIntegerTypelcm(    IntegerType const &  a,    IntegerType const &  b){    lcm_evaluator<IntegerType>  solver;    return solver( a, b );}}  // namespace math}  // namespace boost#endif  // BOOST_MATH_COMMON_FACTOR_RT_HPP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -