diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2015-11-12 07:00:04 +0100 |
---|---|---|
committer | Marc Glisse <marc.glisse@inria.fr> | 2015-11-12 07:00:04 +0100 |
commit | ad4ce78ca479da52138dc2b4ad3ea3b08a7e9080 (patch) | |
tree | a5d77489d93388dacb558a8df8f5a0ec0d7a8dd6 /gmpxx.h | |
parent | bd5a7c516b870f1014c849dfb20f883912eb37c4 (diff) | |
download | gmp-ad4ce78ca479da52138dc2b4ad3ea3b08a7e9080.tar.gz |
New C++ function fibonacci.
Diffstat (limited to 'gmpxx.h')
-rw-r--r-- | gmpxx.h | 47 |
1 files changed, 39 insertions, 8 deletions
@@ -1206,10 +1206,12 @@ struct __gmp_fac_function static void eval(mpz_ptr z, mpz_srcptr w) { if (!mpz_fits_ulong_p(w)) - if (mpz_sgn(w) < 0) - throw std::domain_error ("factorial(negative)"); - else - throw std::bad_alloc(); // or std::overflow_error ("factorial")? + { + if (mpz_sgn(w) < 0) + throw std::domain_error ("factorial(negative)"); + else + throw std::bad_alloc(); // or std::overflow_error ("factorial")? + } eval(z, mpz_get_ui(w)); } static void eval(mpz_ptr z, double d) @@ -1228,16 +1230,42 @@ struct __gmp_primorial_function static void eval(mpz_ptr z, mpz_srcptr w) { if (!mpz_fits_ulong_p(w)) - if (mpz_sgn(w) < 0) - throw std::domain_error ("primorial(negative)"); - else - throw std::bad_alloc(); // or std::overflow_error ("primorial")? + { + if (mpz_sgn(w) < 0) + throw std::domain_error ("primorial(negative)"); + else + throw std::bad_alloc(); // or std::overflow_error ("primorial")? + } eval(z, mpz_get_ui(w)); } static void eval(mpz_ptr z, double d) { __GMPXX_TMPZ_D; eval (z, temp); } }; +struct __gmp_fib_function +{ + static void eval(mpz_ptr z, unsigned long l) { mpz_fib_ui(z, l); } + static void eval(mpz_ptr z, signed long l) + { + if (l < 0) + { + eval(z, -static_cast<unsigned long>(l)); + if ((l & 1) == 0) + mpz_neg(z, z); + } + else + eval(z, static_cast<unsigned long>(l)); + } + static void eval(mpz_ptr z, mpz_srcptr w) + { + if (!mpz_fits_slong_p(w)) + throw std::bad_alloc(); // or std::overflow_error ("fibonacci")? + eval(z, mpz_get_si(w)); + } + static void eval(mpz_ptr z, double d) + { __GMPXX_TMPZ_D; eval (z, temp); } +}; + /**************** Auxiliary classes ****************/ @@ -1682,6 +1710,7 @@ public: __GMP_DECLARE_UNARY_STATIC_MEMFUN(mpz_t, factorial, __gmp_fac_function) __GMP_DECLARE_UNARY_STATIC_MEMFUN(mpz_t, primorial, __gmp_primorial_function) + __GMP_DECLARE_UNARY_STATIC_MEMFUN(mpz_t, fibonacci, __gmp_fib_function) }; typedef __gmp_expr<mpz_t, mpz_t> mpz_class; @@ -3273,6 +3302,7 @@ __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_UNARY_FUNCTION_1(mpz_t, fibonacci, __gmp_fib_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) @@ -3304,6 +3334,7 @@ __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) +__GMP_DEFINE_UNARY_STATIC_MEMFUN(mpz_t, mpz_class::fibonacci, __gmp_fib_function) // member operators for mpq_class |