Расширяющийся многочлен с переменным показателем в симпы - PullRequest
1 голос
/ 09 ноября 2019

Я не очень разбираюсь в симпати, так что извините, если это простой вопрос.

Как я могу использовать sympy для расширения биномиальных выражений? Например, скажем, я хочу, чтобы sympy вычислил коэффициент $ x ^ 2 $ в многочлене $ (x ^ 2 + x + 1) ^ n $ (где я ожидал, что ответ будет $ n + \ binom {n}{2} $).

Я попробовал следующий код:

x = symbols('x')
n = symbols('n', integer=True, nonnegative = True)
expand((x**2+x+1)**n)

, но результат всего лишь $ (x ^ 2 + x + 1) ^ n $, тогда как я хотел бы получить биномиальное расширение, то есть $(1+x+x^2)^n=\sum_{i=0}^{2n}{\left(\sum_{l=\max{0,i-n}}^{[i/2]}{\binom{n}{i-2l,l,n-i+l}}\right)x^i}$.

Заранее спасибо.

1 Ответ

3 голосов
/ 09 ноября 2019

Если показатель степени не является символическим, то следующее очень быстро дает коэффициент для степени произвольного многочлена с целыми коэффициентами, например,

>>> eq
x**3 + 3*x + 2
>>> (Poly(eq)**42).coeff_monomial(x**57)
2294988464559317378977138572972

Но в настоящее время нет подпрограммы для указания коэффициента, еслипоказатель многочлена является символическим. rsolve также можно использовать для выражения замкнутой формы, если в коэффициенте также можно увидеть шаблон:

>>> print([((x**2+x+1)**i).expand().coeff(x**2) for i in range(8)])
[0, 1, 3, 6, 10, 15, 21, 28]
>>> from sympy.abc import n
>>> f=Function('f') # f(n) represents the coefficient of x**2 for a given n

Коэффициент для x^2 для данного n равен n большечем последнее значение:

>>> rsolve(f(n)-f(n-1)-n, f(n),{f(0):0,f(1):1})
n*(n + 1)/2

Это окончательное выражение является коэффициентом x^2 для произвольного n.

Issue 17889 дает процедуру, которая будет вычислятькоэффициент члена в одномерном полиноме (с произвольными коэффициентами для каждого члена), возведенный в степень n:

>>> eq = 2 + x + x**2
>>> unicoeff(eq, 4).simplify()
Piecewise(
    (0, n < 2),
    (2**(n - 3)*n*(n - 1), n < 3),
    (2**(n - 4)*n**2*(n - 1), n < 4),
    (2**n*n*(n - 1)*(n**2 + 19*n + 6)/384, True))
>>> _.subs(n, 5)
210
>>> (eq**5).expand().coeff(x**4)
210

Для вашего выражения (где константа равна 1):

>>> unicoeff(1+x+x**2,2).simplify()
Piecewise((0, n < 1), (n, n < 2), (n*(n + 1)/2, True))
...