From c07f8287f91c473063166fde1ce33b3e32c6af5a Mon Sep 17 00:00:00 2001 From: Richard Kreckel Date: Wed, 8 Feb 2023 00:03:06 +0100 Subject: [PATCH] =?utf8?q?Fix=20numeric=20binomial(n,=20k)=20for=20integer?= =?utf8?q?=20n<0=20and=20k=E2=89=A4n...?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit ...by instead returning binomial(n, n-k). Suggested by Marko Riedel . --- ginac/numeric.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ginac/numeric.cpp b/ginac/numeric.cpp index c643d041..c28cc56a 100644 --- a/ginac/numeric.cpp +++ b/ginac/numeric.cpp @@ -2138,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()) { @@ -2149,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); } } -- 2.47.0