diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2015-11-08 13:11:38 +0100 |
---|---|---|
committer | Marc Glisse <marc.glisse@inria.fr> | 2015-11-08 13:11:38 +0100 |
commit | cae313a4ce290e879b3e39abae867df3ddea2196 (patch) | |
tree | cdd9456a52e05a5a187b07f71dbb1e0fdc71e7da /gmpxx.h | |
parent | 1d7f3e2cc1bc3b6de7e76a7c80bcd00b725b62cc (diff) | |
download | gmp-cae313a4ce290e879b3e39abae867df3ddea2196.tar.gz |
New C++ function primorial.
Diffstat (limited to 'gmpxx.h')
-rw-r--r-- | gmpxx.h | 27 |
1 files changed, 27 insertions, 0 deletions
@@ -1216,6 +1216,30 @@ struct __gmp_fac_function { __GMPXX_TMPZ_D; eval (z, temp); } }; +struct __gmp_primorial_function +{ + static void eval(mpz_ptr z, unsigned long l) { mpz_primorial_ui(z, l); } + static void eval(mpz_ptr z, signed long l) + { + if (l < 0) + mpz_set_ui(z, 1); + else + eval(z, static_cast<unsigned long>(l)); + } + static void eval(mpz_ptr z, mpz_srcptr w) + { + if (!mpz_fits_ulong_p(w)) + if (mpz_sgn(w) < 0) + mpz_set_ui(z, 1); + else + throw std::bad_alloc(); // or std::overflow_error ("factorial")? + else + eval(z, mpz_get_ui(w)); + } + static void eval(mpz_ptr z, double d) + { __GMPXX_TMPZ_D; eval (z, temp); } +}; + /**************** Auxiliary classes ****************/ @@ -1659,6 +1683,7 @@ public: __GMP_DECLARE_INCREMENT_OPERATOR(operator--) __GMP_DECLARE_UNARY_STATIC_MEMFUN(mpz_t, factorial, __gmp_fac_function) + __GMP_DECLARE_UNARY_STATIC_MEMFUN(mpz_t, primorial, __gmp_primorial_function) }; typedef __gmp_expr<mpz_t, mpz_t> mpz_class; @@ -3249,6 +3274,7 @@ __GMP_DEFINE_UNARY_FUNCTION_1(mpf_t, ceil, __gmp_ceil_function) __GMP_DEFINE_UNARY_FUNCTION_1(mpf_t, sqrt, __gmp_sqrt_function) __GMP_DEFINE_UNARY_FUNCTION_1(mpz_t, sqrt, __gmp_sqrt_function) __GMP_DEFINE_UNARY_FUNCTION_1(mpz_t, factorial, __gmp_fac_function) +__GMP_DEFINE_UNARY_FUNCTION_1(mpz_t, primorial, __gmp_primorial_function) __GMP_DEFINE_BINARY_FUNCTION_1(mpf_t, hypot, __gmp_hypot_function) __GMP_DEFINE_BINARY_FUNCTION_1(mpz_t, gcd, __gmp_gcd_function) __GMP_DEFINE_BINARY_FUNCTION_1(mpz_t, lcm, __gmp_lcm_function) @@ -3279,6 +3305,7 @@ __GMPZ_DEFINE_INCREMENT_OPERATOR(operator++, __gmp_unary_increment) __GMPZ_DEFINE_INCREMENT_OPERATOR(operator--, __gmp_unary_decrement) __GMP_DEFINE_UNARY_STATIC_MEMFUN(mpz_t, mpz_class::factorial, __gmp_fac_function) +__GMP_DEFINE_UNARY_STATIC_MEMFUN(mpz_t, mpz_class::primorial, __gmp_primorial_function) // member operators for mpq_class |