diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2014-06-17 21:34:59 +0200 |
---|---|---|
committer | Marc Glisse <marc.glisse@inria.fr> | 2014-06-17 21:34:59 +0200 |
commit | ec3dbdb4f7f5386c40599ff3cf1fb191ced42fe9 (patch) | |
tree | 5df0b4e0e10bbc042e78677cd0b9837612872c0a | |
parent | cbf97afdfb7202eebb85983865577c832f0f9316 (diff) | |
download | gmp-ec3dbdb4f7f5386c40599ff3cf1fb191ced42fe9.tar.gz |
Add C++ functions gcd and lcm.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | doc/gmp.texi | 3 | ||||
-rw-r--r-- | gmpxx.h | 38 | ||||
-rw-r--r-- | tests/cxx/t-ops2.cc | 12 |
5 files changed, 66 insertions, 0 deletions
@@ -1,3 +1,10 @@ +2014-06-17 Marc Glisse <marc.glisse@inria.fr> + + * gmpxx.h (__gmp_gcd_function, __gmp_lcm_function): New classes. + (gcd, lcm): New functions. + * doc/gmp.texi (C++ Interface Integers): Document them. + * tests/cxx/t-ops2.cc (checkz): Test them. + 2014-06-16 Torbjörn Granlund <tege@gmplib.org> * mpn/generic/perfpow.c (perfpow): Combine TMP_ALLOCs. @@ -4,6 +4,12 @@ Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved. +Changes between GMP version 6.0.* and 6.1.0 + + FEATURES + * New C++ functions gcd and lcm for mpz_class. + + Changes between GMP version 5.1.* and 6.0.0 BUGS FIXED diff --git a/doc/gmp.texi b/doc/gmp.texi index e467d7aaa..8c30bab53 100644 --- a/doc/gmp.texi +++ b/doc/gmp.texi @@ -6843,6 +6843,9 @@ mpz_fdiv_q (q.get_mpz_t(), a.get_mpz_t(), d.get_mpz_t()); @deftypefunx int sgn (mpz_class @var{op}) @deftypefunx mpz_class sqrt (mpz_class @var{op}) @maybepagebreak +@deftypefunx mpz_class gcd (mpz_class @var{op1}, mpz_class @var{op2}) +@deftypefunx mpz_class lcm (mpz_class @var{op1}, mpz_class @var{op2}) +@maybepagebreak @deftypefunx void mpz_class::swap (mpz_class& @var{op}) @deftypefunx void swap (mpz_class& @var{op1}, mpz_class& @var{op2}) These functions provide a C++ class interface to the corresponding GMP C @@ -1105,6 +1105,42 @@ struct __gmp_cmp_function { return -mpf_cmp_d(f, d); } }; +struct __gmp_gcd_function +{ + static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v) + { mpz_gcd(z, w, v); } + static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l) + { mpz_gcd_ui(z, w, l); } + static void eval(mpz_ptr z, unsigned long int l, mpz_srcptr w) + { eval(z, w, l); } + static void eval(mpz_ptr z, mpz_srcptr w, signed long int l) + { eval(z, w, __gmpxx_abs_ui(l)); } + static void eval(mpz_ptr z, signed long int l, mpz_srcptr w) + { eval(z, w, l); } + static void eval(mpz_ptr z, mpz_srcptr w, double d) + { __GMPXX_TMPZ_D; mpz_gcd (z, w, temp); } + static void eval(mpz_ptr z, double d, mpz_srcptr w) + { eval(z, w, d); } +}; + +struct __gmp_lcm_function +{ + static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v) + { mpz_lcm(z, w, v); } + static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l) + { mpz_lcm_ui(z, w, l); } + static void eval(mpz_ptr z, unsigned long int l, mpz_srcptr w) + { eval(z, w, l); } + static void eval(mpz_ptr z, mpz_srcptr w, signed long int l) + { eval(z, w, __gmpxx_abs_ui(l)); } + static void eval(mpz_ptr z, signed long int l, mpz_srcptr w) + { eval(z, w, l); } + static void eval(mpz_ptr z, mpz_srcptr w, double d) + { __GMPXX_TMPZ_D; mpz_lcm (z, w, temp); } + static void eval(mpz_ptr z, double d, mpz_srcptr w) + { eval(z, w, d); } +}; + struct __gmp_rand_function { static void eval(mpz_ptr z, gmp_randstate_t s, mp_bitcnt_t l) @@ -2984,6 +3020,8 @@ __GMP_DEFINE_UNARY_FUNCTION(floor, __gmp_floor_function) __GMP_DEFINE_UNARY_FUNCTION(ceil, __gmp_ceil_function) __GMP_DEFINE_UNARY_FUNCTION(sqrt, __gmp_sqrt_function) __GMP_DEFINE_BINARY_FUNCTION(hypot, __gmp_hypot_function) +__GMP_DEFINE_BINARY_FUNCTION(gcd, __gmp_gcd_function) +__GMP_DEFINE_BINARY_FUNCTION(lcm, __gmp_lcm_function) __GMP_DEFINE_UNARY_TYPE_FUNCTION(int, sgn, __gmp_sgn_function) __GMP_DEFINE_BINARY_TYPE_FUNCTION(int, cmp, __gmp_cmp_function) diff --git a/tests/cxx/t-ops2.cc b/tests/cxx/t-ops2.cc index 3a25442aa..f775a5b7c 100644 --- a/tests/cxx/t-ops2.cc +++ b/tests/cxx/t-ops2.cc @@ -132,6 +132,18 @@ void checkz (){ ASSERT_ALWAYS(mpz_class(1)+DBL_MAX>2); ASSERT_ALWAYS(mpz_class(1)+DBL_MIN<2); ASSERT_ALWAYS(mpz_class(1)+std::numeric_limits<double>::denorm_min()<2); + ASSERT_ALWAYS(gcd(mpz_class(6),mpz_class(8))==2); + ASSERT_ALWAYS(gcd(-mpz_class(6),mpz_class(8))==2); + ASSERT_ALWAYS(gcd(-mpz_class(6),-mpz_class(8))==2); + ASSERT_ALWAYS(gcd(mpz_class(6),8.f)==2); + ASSERT_ALWAYS(gcd(-mpz_class(6),static_cast<unsigned char>(8))==2); + ASSERT_ALWAYS(gcd(static_cast<long>(-6),mpz_class(5)+3)==2); + ASSERT_ALWAYS(lcm(mpz_class(6),mpz_class(8))==24); + ASSERT_ALWAYS(lcm(-mpz_class(6),mpz_class(8))==24); + ASSERT_ALWAYS(lcm(-mpz_class(6),-mpz_class(8))==24); + ASSERT_ALWAYS(lcm(mpz_class(6),static_cast<short>(8))==24); + ASSERT_ALWAYS(lcm(-mpz_class(6),static_cast<unsigned char>(8))==24); + ASSERT_ALWAYS(lcm(-6.,mpz_class(5)+3)==24); } template<class T> |