/* * (C) Copyright Nick Thompson 2018. * Use, modification and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #if (defined(BOOST_MSVC) && (BOOST_MSVC < 1500)) || \ (defined(__clang_major__) && (__clang_major__ == 3) && (__clang_minor__ < 2)) || \ (defined(BOOST_GCC) && defined(BOOST_GCC_CXX11) && BOOST_GCC < 40800) #define DISABLE_MP_TESTS #endif #ifndef DISABLE_MP_TESTS #include #include #include #include using boost::multiprecision::int128_t; using boost::multiprecision::int256_t; using boost::integer::extended_euclidean; using boost::integer::gcd; template void test_extended_euclidean() { // Stress test: //Z max_arg = std::numeric_limits::max(); Z max_arg = 500; for (Z m = max_arg; m > 0; --m) { for (Z n = max_arg; n > 0; --n) { boost::integer::euclidean_result_t u = extended_euclidean(m, n); int256_t gcdmn = gcd(m, n); int256_t x = u.x; int256_t y = u.y; assert(u.gcd == gcdmn); assert(m*x + n*y == gcdmn); } } } int main() { test_extended_euclidean(); test_extended_euclidean(); test_extended_euclidean(); test_extended_euclidean(); return 0; } #else int main() { return 0; } #endif