GSoC 2026

issue 4

Please implement asymptotic expansion of Gamma...

Labels: series

Hello, it would be great if sympy allowed for asymptotic expansion of some combinatorial quantities like binomial coefficients.... at least very approximate, like 2^(leadterm * (1 + o(1))), that would be sufficient for most applications.. (in my case designing algorithms in theoretical computer science)

Currently, I can get many different errors depending on how exactly I formulate the request, but there is no way to get an answer, it seems, although the computation is in fact pretty simple to do by hand (but I would like to estimate a bit more involved expressions, of course, on computer..)

Sorry, I don't know what is inside, but is it hard to just substitute Stirling's expansion whenever factorials or gamma have to be expanded at +inf?

>>> sympy.series(sympy.log(sympy.binomial(n, n / 3)), n, oo)
Traceback (most recent call last):
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/elementary/exponential.py", line 989, in _eval_nseries
    a, b = z.leadterm(t, logx=logx, cdir=1)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3538, in leadterm
    l = self.as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/cache.py", line 72, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3501, in as_leading_term
    obj = self._eval_as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/combinatorial/factorials.py", line 1102, in _eval_as_leading_term
    return self.rewrite(gamma)._eval_as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/mul.py", line 2035, in _eval_as_leading_term
    return self.func(*[t.as_leading_term(x, logx=logx, cdir=cdir) for t in self.args])
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/mul.py", line 2035, in <listcomp>
    return self.func(*[t.as_leading_term(x, logx=logx, cdir=cdir) for t in self.args])
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/cache.py", line 72, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3501, in as_leading_term
    obj = self._eval_as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/special/gamma_functions.py", line 215, in _eval_as_leading_term
    raise PoleError()
sympy.core.function.PoleError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3005, in series
    s = self.subs(x, cdir/x).series(x, n=n, dir='+', cdir=1)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3026, in series
    rv = self.subs(x, xpos).series(xpos, x0, n, dir, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3034, in series
    s1 = self._eval_nseries(x, n=n, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/elementary/exponential.py", line 991, in _eval_nseries
    s = z._eval_nseries(t, n=n, logx=logx, cdir=1)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/function.py", line 690, in _eval_nseries
    return self._eval_aseries(n, args0, x, logx)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/function.py", line 653, in _eval_aseries
    raise PoleError(filldedent('''
sympy.core.function.PoleError: 
Asymptotic expansion of binomial around [oo, oo] is not implemented.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/series/series.py", line 63, in series
    return expr.series(x, x0, n, dir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3010, in series
    s = self.subs(x, cdir*x).aseries(x, n=n)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3209, in aseries
    return self.subs(x, xpos).aseries(xpos, n, bound, hir).subs(xpos, x)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3215, in aseries
    om, exps = mrv(self, x)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/series/gruntz.py", line 285, in mrv
    s, expr = mrv(e.args[0], x)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/series/gruntz.py", line 311, in mrv
    raise NotImplementedError("MRV set computation for functions in"
NotImplementedError: MRV set computation for functions in several variables not implemented.

Or, another attempt, directly via gamma:

>>> sympy.series(sympy.log(sympy.gamma(n) / sympy.gamma(1/3 * n) / sympy.gamma(2/3 * n)), n, oo)
Traceback (most recent call last):
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/elementary/exponential.py", line 989, in _eval_nseries
    a, b = z.leadterm(t, logx=logx, cdir=1)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3538, in leadterm
    l = self.as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/cache.py", line 72, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3501, in as_leading_term
    obj = self._eval_as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/mul.py", line 2035, in _eval_as_leading_term
    return self.func(*[t.as_leading_term(x, logx=logx, cdir=cdir) for t in self.args])
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/mul.py", line 2035, in <listcomp>
    return self.func(*[t.as_leading_term(x, logx=logx, cdir=cdir) for t in self.args])
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/cache.py", line 72, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3501, in as_leading_term
    obj = self._eval_as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/special/gamma_functions.py", line 215, in _eval_as_leading_term
    raise PoleError()
sympy.core.function.PoleError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/mul.py", line 1964, in _eval_nseries
    coeff, exp = t.leadterm(x)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3544, in leadterm
    raise ValueError(filldedent("""
ValueError: 
cannot compute leadterm(1/gamma(0.333333333333333/_t), _t). The
coefficient should have been free of _t but got
1/gamma(0.333333333333333/_t)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/power.py", line 1678, in _eval_nseries
    _, m = b.leadterm(x)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3538, in leadterm
    l = self.as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/cache.py", line 72, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3501, in as_leading_term
    obj = self._eval_as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/special/gamma_functions.py", line 215, in _eval_as_leading_term
    raise PoleError()
sympy.core.function.PoleError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3005, in series
    s = self.subs(x, cdir/x).series(x, n=n, dir='+', cdir=1)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3026, in series
    rv = self.subs(x, xpos).series(xpos, x0, n, dir, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3034, in series
    s1 = self._eval_nseries(x, n=n, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/elementary/exponential.py", line 991, in _eval_nseries
    s = z._eval_nseries(t, n=n, logx=logx, cdir=1)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/mul.py", line 1985, in _eval_nseries
    facs = [t.nseries(x, n=ceiling(n-n0), logx=logx, cdir=cdir) for t in self.args]
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/mul.py", line 1985, in <listcomp>
    facs = [t.nseries(x, n=ceiling(n-n0), logx=logx, cdir=cdir) for t in self.args]
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3407, in nseries
    return self._eval_nseries(x, n=n, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/power.py", line 1680, in _eval_nseries
    b = b._eval_nseries(x, n=max(2, n), logx=logx, cdir=cdir).removeO()
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/special/gamma_functions.py", line 201, in _eval_nseries
    return super()._eval_nseries(x, n, logx)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/function.py", line 690, in _eval_nseries
    return self._eval_aseries(n, args0, x, logx)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/function.py", line 653, in _eval_aseries
    raise PoleError(filldedent('''
sympy.core.function.PoleError: 
Asymptotic expansion of gamma around [oo] is not implemented.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/elementary/exponential.py", line 989, in _eval_nseries
    a, b = z.leadterm(t, logx=logx, cdir=1)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3538, in leadterm
    l = self.as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/cache.py", line 72, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3501, in as_leading_term
    obj = self._eval_as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/mul.py", line 2035, in _eval_as_leading_term
    return self.func(*[t.as_leading_term(x, logx=logx, cdir=cdir) for t in self.args])
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/mul.py", line 2035, in <listcomp>
    return self.func(*[t.as_leading_term(x, logx=logx, cdir=cdir) for t in self.args])
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/cache.py", line 72, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3501, in as_leading_term
    obj = self._eval_as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/special/gamma_functions.py", line 215, in _eval_as_leading_term
    raise PoleError()
sympy.core.function.PoleError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/mul.py", line 1964, in _eval_nseries
    coeff, exp = t.leadterm(x)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3544, in leadterm
    raise ValueError(filldedent("""
ValueError: 
cannot compute leadterm(1/gamma(0.333333333333333/_t), _t). The
coefficient should have been free of _t but got
1/gamma(0.333333333333333/_t)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/power.py", line 1678, in _eval_nseries
    _, m = b.leadterm(x)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3538, in leadterm
    l = self.as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/cache.py", line 72, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3501, in as_leading_term
    obj = self._eval_as_leading_term(x, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/special/gamma_functions.py", line 215, in _eval_as_leading_term
    raise PoleError()
sympy.core.function.PoleError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/series/series.py", line 63, in series
    return expr.series(x, x0, n, dir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3010, in series
    s = self.subs(x, cdir*x).aseries(x, n=n)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3209, in aseries
    return self.subs(x, xpos).aseries(xpos, n, bound, hir).subs(xpos, x)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3227, in aseries
    s = self.subs(x, exp(x)).aseries(x, n, bound, hir).subs(x, log(x))
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3249, in aseries
    s = func.series(k, 0, n)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3034, in series
    s1 = self._eval_nseries(x, n=n, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/elementary/exponential.py", line 991, in _eval_nseries
    s = z._eval_nseries(t, n=n, logx=logx, cdir=1)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/mul.py", line 1985, in _eval_nseries
    facs = [t.nseries(x, n=ceiling(n-n0), logx=logx, cdir=cdir) for t in self.args]
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/mul.py", line 1985, in <listcomp>
    facs = [t.nseries(x, n=ceiling(n-n0), logx=logx, cdir=cdir) for t in self.args]
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/expr.py", line 3407, in nseries
    return self._eval_nseries(x, n=n, logx=logx, cdir=cdir)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/power.py", line 1680, in _eval_nseries
    b = b._eval_nseries(x, n=max(2, n), logx=logx, cdir=cdir).removeO()
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/functions/special/gamma_functions.py", line 201, in _eval_nseries
    return super()._eval_nseries(x, n, logx)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/function.py", line 690, in _eval_nseries
    return self._eval_aseries(n, args0, x, logx)
  File "/home/elexunix/.local/lib/python3.10/site-packages/sympy/core/function.py", line 653, in _eval_aseries
    raise PoleError(filldedent('''
sympy.core.function.PoleError: 
Asymptotic expansion of gamma around [oo] is not implemented.

Command Palette

Search for a command to run...