From 9606fc35b00ef890f632f98eddcca26631917e10 Mon Sep 17 00:00:00 2001 From: Christian Bauer Date: Wed, 6 Oct 2004 15:31:23 +0000 Subject: [PATCH] binomial(n,k) evaluates for non-integer n [Ralph Stephan] --- ginac/inifcns.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/ginac/inifcns.cpp b/ginac/inifcns.cpp index fa5e9a20..decef1a8 100644 --- a/ginac/inifcns.cpp +++ b/ginac/inifcns.cpp @@ -485,11 +485,32 @@ static ex binomial_evalf(const ex & x, const ex & y) return binomial(x, y).hold(); } +static ex binomial_sym(const ex & x, const numeric & y) +{ + if (y.is_integer()) { + if (y.is_nonneg_integer()) { + const unsigned N = y.to_int(); + if (N == 0) return _num0; + if (N == 1) return x; + ex t = x.expand(); + for (unsigned i = 2; i <= N; ++i) + t = (t * (x + i - y - 1)).expand() / i; + return t; + } else + return _num0; + } + + return binomial(x, y).hold(); +} + static ex binomial_eval(const ex & x, const ex &y) { - if (is_exactly_a(x) && is_exactly_a(y)) - return binomial(ex_to(x), ex_to(y)); - else + if (is_exactly_a(y)) { + if (is_exactly_a(x) && ex_to(x).is_integer()) + return binomial(ex_to(x), ex_to(y)); + else + return binomial_sym(x, ex_to(y)); + } else return binomial(x, y).hold(); } -- 2.44.0