Расширяющийся многочлен с переменным показателем в sympy

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

Как я могу использовать 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, in}} ^ {[i / 2]} {\ binom {n} {i-2l, l, n-i + l}} \ right  ) x ^ i} $ .

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


person Mohit    schedule 09.11.2019    source источник
comment
Не могли бы вы дать точный результат, который вы ожидаете от своего примера? Биномы складываются из 2 членов, а у вас - 3.   -  person JohanC    schedule 09.11.2019
comment
@JohanC Я добавил желаемое выражение, но думаю, вы правы в том, что sympy не может полностью его раскрыть.   -  person Mohit    schedule 09.11.2019


Ответы (1)


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

>>> 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.

В задаче 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))
person smichr    schedule 09.11.2019
comment
Интересная проблема. Если члены имеют степени x, равные p1...pm, и вам нужен коэффициент x**pj, тогда это будет сумма всех полиномиальных коэффициентов, таких что sum(pk*ik)=pj где sum(ik,k=1,m)=n. Мы знаем, что ik равно 0, если pk больше pj. Это интересная проблема с разделами. - person smichr; 10.11.2019