📄 common_factor_test.cpp
字号:
{ char buf[20]; sprintf(buf,"%I64d", i); os << buf; return os;}inline ostream& operator<<(ostream& os, unsigned __int64 i){ char buf[20]; sprintf(buf,"%I64u", i); os << buf; return os;}#endif} // namespace std// GCD testsBOOST_AUTO_TEST_SUITE( gcd_test_suite )// GCD on signed integer typesBOOST_AUTO_TEST_CASE_TEMPLATE( gcd_int_test, T, signed_test_types ){#ifndef BOOST_MSVC using boost::math::gcd;#else using namespace boost::math;#endif // Originally from Boost.Rational tests BOOST_CHECK_EQUAL( gcd<T>( 1, -1), static_cast<T>( 1) ); BOOST_CHECK_EQUAL( gcd<T>( -1, 1), static_cast<T>( 1) ); BOOST_CHECK_EQUAL( gcd<T>( 1, 1), static_cast<T>( 1) ); BOOST_CHECK_EQUAL( gcd<T>( -1, -1), static_cast<T>( 1) ); BOOST_CHECK_EQUAL( gcd<T>( 0, 0), static_cast<T>( 0) ); BOOST_CHECK_EQUAL( gcd<T>( 7, 0), static_cast<T>( 7) ); BOOST_CHECK_EQUAL( gcd<T>( 0, 9), static_cast<T>( 9) ); BOOST_CHECK_EQUAL( gcd<T>( -7, 0), static_cast<T>( 7) ); BOOST_CHECK_EQUAL( gcd<T>( 0, -9), static_cast<T>( 9) ); BOOST_CHECK_EQUAL( gcd<T>( 42, 30), static_cast<T>( 6) ); BOOST_CHECK_EQUAL( gcd<T>( 6, -9), static_cast<T>( 3) ); BOOST_CHECK_EQUAL( gcd<T>(-10, -10), static_cast<T>(10) ); BOOST_CHECK_EQUAL( gcd<T>(-25, -10), static_cast<T>( 5) ); BOOST_CHECK_EQUAL( gcd<T>( 3, 7), static_cast<T>( 1) ); BOOST_CHECK_EQUAL( gcd<T>( 8, 9), static_cast<T>( 1) ); BOOST_CHECK_EQUAL( gcd<T>( 7, 49), static_cast<T>( 7) );}// GCD on unmarked signed integer typeBOOST_AUTO_TEST_CASE( gcd_unmarked_int_test ){#ifndef BOOST_MSVC using boost::math::gcd;#else using namespace boost::math;#endif // The regular signed-integer GCD function performs the unsigned version, // then does an absolute-value on the result. Signed types that are not // marked as such (due to no std::numeric_limits specialization) may be off // by a sign. BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( 1, -1 )), MyInt2( 1) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( -1, 1 )), MyInt2( 1) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( 1, 1 )), MyInt2( 1) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( -1, -1 )), MyInt2( 1) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( 0, 0 )), MyInt2( 0) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( 7, 0 )), MyInt2( 7) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( 0, 9 )), MyInt2( 9) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( -7, 0 )), MyInt2( 7) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( 0, -9 )), MyInt2( 9) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( 42, 30 )), MyInt2( 6) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( 6, -9 )), MyInt2( 3) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( -10, -10 )), MyInt2(10) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( -25, -10 )), MyInt2( 5) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( 3, 7 )), MyInt2( 1) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( 8, 9 )), MyInt2( 1) ); BOOST_CHECK_EQUAL( abs(gcd<MyInt2>( 7, 49 )), MyInt2( 7) );}// GCD on unsigned integer typesBOOST_AUTO_TEST_CASE_TEMPLATE( gcd_unsigned_test, T, unsigned_test_types ){#ifndef BOOST_MSVC using boost::math::gcd;#else using namespace boost::math;#endif // Note that unmarked types (i.e. have no std::numeric_limits // specialization) are treated like non/unsigned types BOOST_CHECK_EQUAL( gcd<T>( 1u, 1u), static_cast<T>( 1u) ); BOOST_CHECK_EQUAL( gcd<T>( 0u, 0u), static_cast<T>( 0u) ); BOOST_CHECK_EQUAL( gcd<T>( 7u, 0u), static_cast<T>( 7u) ); BOOST_CHECK_EQUAL( gcd<T>( 0u, 9u), static_cast<T>( 9u) ); BOOST_CHECK_EQUAL( gcd<T>(42u, 30u), static_cast<T>( 6u) ); BOOST_CHECK_EQUAL( gcd<T>( 3u, 7u), static_cast<T>( 1u) ); BOOST_CHECK_EQUAL( gcd<T>( 8u, 9u), static_cast<T>( 1u) ); BOOST_CHECK_EQUAL( gcd<T>( 7u, 49u), static_cast<T>( 7u) );}// GCD at compile-timeBOOST_AUTO_TEST_CASE( gcd_static_test ){#ifndef BOOST_MSVC using boost::math::static_gcd;#else using namespace boost::math;#endif // Can't use "BOOST_CHECK_EQUAL", otherwise the "value" member will be // disqualified as compile-time-only constant, needing explicit definition BOOST_CHECK( (static_gcd< 1, 1>::value) == 1 ); BOOST_CHECK( (static_gcd< 0, 0>::value) == 0 ); BOOST_CHECK( (static_gcd< 7, 0>::value) == 7 ); BOOST_CHECK( (static_gcd< 0, 9>::value) == 9 ); BOOST_CHECK( (static_gcd<42, 30>::value) == 6 ); BOOST_CHECK( (static_gcd< 3, 7>::value) == 1 ); BOOST_CHECK( (static_gcd< 8, 9>::value) == 1 ); BOOST_CHECK( (static_gcd< 7, 49>::value) == 7 );}// TODO: non-built-in signed and unsigned integer tests, with and without// numeric_limits specialization; polynominal tests; note any changes if// built-ins switch to binary-GCD algorithmBOOST_AUTO_TEST_SUITE_END()// LCM testsBOOST_AUTO_TEST_SUITE( lcm_test_suite )// LCM on signed integer typesBOOST_AUTO_TEST_CASE_TEMPLATE( lcm_int_test, T, signed_test_types ){#ifndef BOOST_MSVC using boost::math::lcm;#else using namespace boost::math;#endif // Originally from Boost.Rational tests BOOST_CHECK_EQUAL( lcm<T>( 1, -1), static_cast<T>( 1) ); BOOST_CHECK_EQUAL( lcm<T>( -1, 1), static_cast<T>( 1) ); BOOST_CHECK_EQUAL( lcm<T>( 1, 1), static_cast<T>( 1) ); BOOST_CHECK_EQUAL( lcm<T>( -1, -1), static_cast<T>( 1) ); BOOST_CHECK_EQUAL( lcm<T>( 0, 0), static_cast<T>( 0) ); BOOST_CHECK_EQUAL( lcm<T>( 6, 0), static_cast<T>( 0) ); BOOST_CHECK_EQUAL( lcm<T>( 0, 7), static_cast<T>( 0) ); BOOST_CHECK_EQUAL( lcm<T>( -5, 0), static_cast<T>( 0) ); BOOST_CHECK_EQUAL( lcm<T>( 0, -4), static_cast<T>( 0) ); BOOST_CHECK_EQUAL( lcm<T>( 18, 30), static_cast<T>(90) ); BOOST_CHECK_EQUAL( lcm<T>( -6, 9), static_cast<T>(18) ); BOOST_CHECK_EQUAL( lcm<T>(-10, -10), static_cast<T>(10) ); BOOST_CHECK_EQUAL( lcm<T>( 25, -10), static_cast<T>(50) ); BOOST_CHECK_EQUAL( lcm<T>( 3, 7), static_cast<T>(21) ); BOOST_CHECK_EQUAL( lcm<T>( 8, 9), static_cast<T>(72) ); BOOST_CHECK_EQUAL( lcm<T>( 7, 49), static_cast<T>(49) );}// LCM on unmarked signed integer typeBOOST_AUTO_TEST_CASE( lcm_unmarked_int_test ){#ifndef BOOST_MSVC using boost::math::lcm;#else using namespace boost::math;#endif // The regular signed-integer LCM function performs the unsigned version, // then does an absolute-value on the result. Signed types that are not // marked as such (due to no std::numeric_limits specialization) may be off // by a sign. BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( 1, -1 )), MyInt2( 1) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( -1, 1 )), MyInt2( 1) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( 1, 1 )), MyInt2( 1) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( -1, -1 )), MyInt2( 1) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( 0, 0 )), MyInt2( 0) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( 6, 0 )), MyInt2( 0) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( 0, 7 )), MyInt2( 0) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( -5, 0 )), MyInt2( 0) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( 0, -4 )), MyInt2( 0) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( 18, 30 )), MyInt2(90) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( -6, 9 )), MyInt2(18) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( -10, -10 )), MyInt2(10) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( 25, -10 )), MyInt2(50) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( 3, 7 )), MyInt2(21) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( 8, 9 )), MyInt2(72) ); BOOST_CHECK_EQUAL( abs(lcm<MyInt2>( 7, 49 )), MyInt2(49) );}// LCM on unsigned integer typesBOOST_AUTO_TEST_CASE_TEMPLATE( lcm_unsigned_test, T, unsigned_test_types ){#ifndef BOOST_MSVC using boost::math::lcm;#else using namespace boost::math;#endif // Note that unmarked types (i.e. have no std::numeric_limits // specialization) are treated like non/unsigned types BOOST_CHECK_EQUAL( lcm<T>( 1u, 1u), static_cast<T>( 1u) ); BOOST_CHECK_EQUAL( lcm<T>( 0u, 0u), static_cast<T>( 0u) ); BOOST_CHECK_EQUAL( lcm<T>( 6u, 0u), static_cast<T>( 0u) ); BOOST_CHECK_EQUAL( lcm<T>( 0u, 7u), static_cast<T>( 0u) ); BOOST_CHECK_EQUAL( lcm<T>(18u, 30u), static_cast<T>(90u) ); BOOST_CHECK_EQUAL( lcm<T>( 3u, 7u), static_cast<T>(21u) ); BOOST_CHECK_EQUAL( lcm<T>( 8u, 9u), static_cast<T>(72u) ); BOOST_CHECK_EQUAL( lcm<T>( 7u, 49u), static_cast<T>(49u) );}// LCM at compile-timeBOOST_AUTO_TEST_CASE( lcm_static_test ){#ifndef BOOST_MSVC using boost::math::static_lcm;#else using namespace boost::math;#endif // Can't use "BOOST_CHECK_EQUAL", otherwise the "value" member will be // disqualified as compile-time-only constant, needing explicit definition BOOST_CHECK( (static_lcm< 1, 1>::value) == 1 ); BOOST_CHECK( (static_lcm< 0, 0>::value) == 0 ); BOOST_CHECK( (static_lcm< 6, 0>::value) == 0 ); BOOST_CHECK( (static_lcm< 0, 7>::value) == 0 ); BOOST_CHECK( (static_lcm<18, 30>::value) == 90 ); BOOST_CHECK( (static_lcm< 3, 7>::value) == 21 ); BOOST_CHECK( (static_lcm< 8, 9>::value) == 72 ); BOOST_CHECK( (static_lcm< 7, 49>::value) == 49 );}// TODO: see GCD to-doBOOST_AUTO_TEST_SUITE_END()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -