X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fnumeric.cpp;h=92b3c46645f71bbf1ff028244d9c4320965e6fba;hp=f27fd3aca60d7d1b090a59aa6562e3bb2bc33620;hb=HEAD;hpb=c12c8ec3c5cf0c75f061f6c52d04206277bbdcca diff --git a/ginac/numeric.cpp b/ginac/numeric.cpp index f27fd3ac..900cac17 100644 --- a/ginac/numeric.cpp +++ b/ginac/numeric.cpp @@ -7,7 +7,7 @@ * of special functions or implement the interface to the bignum package. */ /* - * GiNaC Copyright (C) 1999-2016 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2024 Johannes Gutenberg University Mainz, Germany * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,10 +24,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - #include "numeric.h" #include "ex.h" #include "operators.h" @@ -89,7 +85,7 @@ numeric::numeric() numeric::numeric(int i) { // Not the whole int-range is available if we don't cast to long - // first. This is due to the behaviour of the cl_I-ctor, which + // first. This is due to the behavior of the cl_I-ctor, which // emphasizes efficiency. However, if the integer is small enough // we save space and dereferences by using an immediate type. // (C.f. ) @@ -110,7 +106,7 @@ numeric::numeric(int i) numeric::numeric(unsigned int i) { // Not the whole uint-range is available if we don't cast to ulong - // first. This is due to the behaviour of the cl_I-ctor, which + // first. This is due to the behavior of the cl_I-ctor, which // emphasizes efficiency. However, if the integer is small enough // we save space and dereferences by using an immediate type. // (C.f. ) @@ -141,6 +137,17 @@ numeric::numeric(unsigned long i) setflag(status_flags::evaluated | status_flags::expanded); } +numeric::numeric(long long i) +{ + value = cln::cl_I(i); + setflag(status_flags::evaluated | status_flags::expanded); +} + +numeric::numeric(unsigned long long i) +{ + value = cln::cl_I(i); + setflag(status_flags::evaluated | status_flags::expanded); +} /** Constructor for rational numerics a/b. * @@ -442,7 +449,7 @@ static void print_real_csrc(const print_context & c, const cln::cl_R & x) // Rational number const cln::cl_I numer = cln::numerator(cln::the(x)); const cln::cl_I denom = cln::denominator(cln::the(x)); - if (cln::plusp(x) > 0) { + if (cln::plusp(x)) { c.s << "("; print_integer_csrc(c, numer); } else { @@ -466,7 +473,7 @@ static inline bool coerce(T1& dst, const T2& arg); /** * @brief Check if CLN integer can be converted into int * - * @sa http://www.ginac.de/pipermail/cln-list/2006-October/000248.html + * @sa https://www.ginac.de/pipermail/cln-list/2006-October/000248.html */ template<> inline bool coerce(int& dst, const cln::cl_I& arg) @@ -506,7 +513,7 @@ static void print_real_cl_N(const print_context & c, const cln::cl_R & x) if (coerce(dst, cln::the(x))) { // can be converted to native int if (dst < 0) - c.s << "(-" << dst << ")"; + c.s << '(' << dst << ')'; else c.s << dst; } else { @@ -1739,7 +1746,7 @@ class lanczos_coeffs std::vector *current_vector; }; -std::vector* lanczos_coeffs::coeffs = 0; +std::vector* lanczos_coeffs::coeffs = nullptr; bool lanczos_coeffs::sufficiently_accurate(int digits) { if (digits<=20) { @@ -2131,8 +2138,10 @@ const numeric doublefactorial(const numeric &n) /** The Binomial coefficients. It computes the binomial coefficients. For * integer n and k and positive n this is the number of ways of choosing k - * objects from n distinct objects. If n is negative, the formula - * binomial(n,k) == (-1)^k*binomial(k-n-1,k) is used to compute the result. */ + * objects from n distinct objects. If n is a negative integer, the formula + * binomial(n,k) == (-1)^k*binomial(k-n-1,k) (if k>=0) + * binomial(n,k) == (-1)^(n-k)*binomial(-k-1,n-k) (otherwise) + * is used to compute the result. */ const numeric binomial(const numeric &n, const numeric &k) { if (n.is_integer() && k.is_integer()) { @@ -2142,7 +2151,10 @@ const numeric binomial(const numeric &n, const numeric &k) else return *_num0_p; } else { - return _num_1_p->power(k)*binomial(k-n-(*_num1_p),k); + if (k.is_nonneg_integer()) + return _num_1_p->power(k)*binomial(k-n-(*_num1_p), k); + else + return _num_1_p->power(n-k)*binomial(-k-(*_num1_p), n-k); } } @@ -2217,7 +2229,7 @@ const numeric bernoulli(const numeric &nn) results.reserve(n/2); for (unsigned p=next_r; p<=n; p+=2) { - cln::cl_I c = 1; // seed for binonmial coefficients + cln::cl_I c = 1; // seed for binomial coefficients cln::cl_RA b = cln::cl_RA(p-1)/-2; // The CLN manual says: "The conversion from `unsigned int' works only // if the argument is < 2^29" (This is for 32 Bit machines. More