Рассчитать коэффициенты степенных рядов

24

Если дан многочлен p(x)с целыми коэффициентами и постоянным членом p(0) = 1 or -1, а также неотрицательное целое число N, вернуть N-й коэффициент степенной степени (иногда называемый "ряд Тейлора"), полученный f(x) = 1/p(x)при x0 = 0, т. Е. Коэффициент монома степени N.

Данные условия гарантируют, что степенной ряд существует и что его коэффициенты являются целыми числами.

Детали

Как всегда, многочлен может быть принят в любом удобном формате, например, список коэффициентов, например, p(x) = x^3-2x+5может быть представлен как [1,0,-2,5].

Powerseries функции, fразработанной в 0дается

а N-й коэффициент (коэффициент x^N) определяется как

где обозначает n-й производную отf

Примеры

  • Результатом полинома p(x) = 1-xявляется геометрический ряд, f(x) = 1 + x + x^2 + ...поэтому вывод должен быть 1для всех N.

  • p(x) = (1-x)^2 = x^2 - 2x + 1приводит к производной геометрических рядов f(x) = 1 + 2x + 3x^2 + 4x^3 + ..., поэтому выход за Nэто N+1.

  • p(x) = 1 - x - x^2 приводит к производящей функции последовательности Фибоначчи f(x) = 1 + x + 2x^2 + 3x^3 + 5x^4 + 8x^5 + 13x^6 + ...

  • p(x) = 1 - x^2приводит к производящей функции 1,0,1,0,...т.е.f(x) = 1 + x^2 + x^4 + x^6 + ...

  • p(x) = (1 - x)^3 = 1 -3x + 3x^2 - x^3приводит к производящей функции треугольных чисел, f(x) = 1 + 3x + 6x^6 + 10x^3 + 15x^4 + 21x^5 + ...что означает, что N-й коэффициент является биномиальным коэффициентом(N+2, N)

  • p(x) = (x - 3)^2 + (x - 2)^3 = 1 + 6x - 5x^2 + x^3 результаты в f(x) = 1 - 6x + 41x^2 - 277x^3 + 1873x4 - 12664x^5 + 85626x^6 - 57849x^7 + ...

flawr
источник
Было бы приемлемо принять полином как бесконечный список коэффициентов степенных рядов [1,-1,0,0,0,0,...]?
xnor
Да, я думаю, что это приемлемый формат.
flawr
Хорошие примеры выбраны!
Грег Мартин
Я рад, что вы цените это, спасибо =)
flawr

Ответы:

9

Mathematica, 24 23 байта

Сохранено 1 байт благодаря Грегу Мартину

D[1/#2,{x,#}]/#!/.x->0&

Чистая функция с двумя аргументами #и #2. Предполагается, что полином #2удовлетворяет PolynomialQ[#2,x]. Конечно, есть встроенное для этого:

SeriesCoefficient[1/#2,{x,0,#}]&
ngenisis
источник
1
Молодцы, обыграв встроенный! Я предполагаю, что вы можете сохранить байт, предполагая, что #это целое число Nи #2полином.
Грег Мартин
6

Matlab, 81 79 75 байт

В отличие от двух предыдущих ответов, здесь не используются символические вычисления. Идея состоит в том, что вы можете итеративно рассчитать коэффициенты:

function C=f(p,N);s=p(end);for k=1:N;q=conv(p,s);s=[-q(end-k),s];end;C=s(1)

Попробуйте онлайн!

объяснение

function C=f(p,N);
s=p(end);            % get the first (constant coefficient)
for k=1:N;           
    q=conv(p,s);     % multiply the known coefficients with the polynomial
    s=[-q(end-k),s]; % determine the new coefficient to make the the product get "closer" 
end;
C=s(1)           % output the N-th coefficient
flawr
источник
4

GeoGebra , 28 байт

Derivative[1/A1,B1]/B1!
f(0)

Ввод берется из ячеек электронной таблицы A1 и B1 полинома и целого числа соответственно, и каждая строка вводится отдельно в строку ввода. Выход через присвоение переменной a.

Вот рисунок, показывающий исполнение:

Коэффициенты Тейлора

Использование встроенных функций намного дольше - 48 байт:

First[Coefficients[TaylorPolynomial[1/A1,0,B1]]]
TheBikingViking
источник
4

Haskell, 44 байта

p%n=(0^n-sum[p!!i*p%(n-i)|i<-[1..n]])/head p

Прямое вычисление без алгебраических встроенных функций. Принимает ввод как бесконечный список коэффициентов степенных рядов, например, p = [1,-2,3,0,0,0,0...]( p = [1,-2,3] ++ repeat 0для) 1-2*x+x^2. Назовите это как p%3, что дает -4.0.

Идея состоит в том, что если p - это многочлен, а q = 1 / p , если он обратный, то мы можем выразить равенство p · q = 1 поэлементно. Коэффициент x n в p · q задается сверткой коэффициентов в p и q :

p 0 · q n + p 1 · q n-1 + ... + p n · q 0

Для выполнения p · q = 1 вышеприведенное должно быть равно нулю для всех n> 0 . Ибо здесь мы можем выразить q n рекурсивно через q 0 , ..., q n-1 и коэффициенты p .

q n = - 1 / p 0 · (p 1 · q n-1 + ... + p n · q 0 )

Это именно то, что рассчитывается в выражении sum[p!!i*p%(n-i)|i<-[1..n]]/head pс head pведущим коэффициентом p 0 . Начальный коэффициент q 0 = 1 / p 0 обрабатывается арифметически в том же выражении с использованием 0^nв качестве индикатора для n==0.

XNOR
источник
3

J, 12 байт

1 :'(1%u)t.'

Использует наречие, t.которое принимает полином pв форме глагола на LHS и неотрицательное целое число kна RHS и вычисляет kth-й коэффициент ряда Тейлора pat x = 0. Чтобы получить степенной ряд, pперед его применением берется обратная величина .

Попробуйте онлайн!

миль
источник
2

Клен, 58 26 байтов

Это безымянная функция, которая принимает полином от xи целое число N.

РЕДАКТИРОВАТЬ: Я только что заметил, что есть встроенный:

(p,N)->coeftayl(1/p,x=0,N)
flawr
источник
1

MATL , 19 байт

0)i:"1GY+@_)_8Mh]1)

Перевод @ Flawr большой ответ Matlab .

Попробуйте онлайн!

Как это работает

0)      % Implicitly input vector of polynomial coefficients and get last entry
i       % Input N
:"      % For k in [1 2 ... N]
  1G    %   Push vector of polynomial coefficients
  Y+    %   Convolution, full size
  @     %   Push k
  _     %   Negate
  )     %   Index. This produces the end-k coefficient
  _     %   Negate
  8M    %   Push first input of the latest convolution
  h     %   Concatenate horizontally
]       % End
1)      % Get first entry. Implicitly display
Луис Мендо
источник
1

JavaScript (ES6), 57 байт

(a,n)=>a.reduce((s,p,i)=>!i|i>n?s:s-p*f(a,n-i),!n)/a[0]

Порт ответа @ xnor's Haskell. Первоначально я попробовал итеративную версию, но оказалось, что она составляет 98 байт, но для больших N это будет намного быстрее, поскольку я эффективно запоминаю рекурсивные вызовы:

(a,n)=>[...Array(n+1)].fill(0).map((_,i,r)=>r[i]=r.reduce((s,p,j)=>s-p*(a[i-j]||0),!i)/a[0]).pop()

n+1необходимы условия, которые сохраняются в массиве r. Изначально это нули, которые позволяют сократить весь массив rсразу, так как нули не влияют на результат. Последний рассчитанный коэффициент является окончательным результатом.

Нил
источник
1

PARI / GP, 31 27 байт

f->n->Pol(Ser(1/f,,n+1))\x^n
alephalpha
источник