Розрахуйте коефіцієнти енергетичної серії


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

Потужність функцій, 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 + ...


Чи було б прийнятним вважати поліном як нескінченний перелік коефіцієнтів ряду потужностей типу [1,-1,0,0,0,0,...]?
xnor

Так, я думаю, що це прийнятний формат.
недолік

Приємні обрані приклади!
Грег Мартін

Я радий, що ви це цінуєте, дякую =)
недолік

Відповіді:


9

Математика, 24 23 байти

Збережено 1 байт завдяки Грегу Мартіну

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

Чиста функція з двома аргументами #і #2. Припускає, що поліном #2задовольняє PolynomialQ[#2,x]. Звичайно, для цього є вбудований:

SeriesCoefficient[1/#2,{x,0,#}]&

1
Молодці побили вбудований! Я думаю, ви можете зберегти байт, вважаючи, що #це ціле число Nі #2є многочленом.
Грег Мартін

6

Матлаб, 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

4

GeoGebra , 28 байт

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

Введення береться з комірок електронної таблиці А1 і В1 полінома та цілого числа відповідно, і кожен рядок вводиться окремо у рядок введення. Вихід здійснюється через присвоєння змінної a.

Ось подарунок, який показує виконання:

Коефіцієнти Тейлора

Використання вбудованих файлів набагато довше, на 48 байт:

First[Coefficients[TaylorPolynomial[1/A1,0,B1]]]

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.

Ідея полягає в тому, що якщо р - многочлен, а 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.


3

J, 12 байт

1 :'(1%u)t.'

Використовує прислівник, t.який приймає многочлен pу формі дієслова на LHS та неотримне ціле число kна RHS та обчислює коефіцієнт kth ряду Тейлора pна x = 0. Для отримання енергетичного ряду pперед його застосуванням приймається зворотний зв'язок .

Спробуйте в Інтернеті!


2

Клен, 58 26 байт

Це неназвана функція, яка приймає поліном у xціле число N.

EDIT: Я щойно помітив, що є вбудований:

(p,N)->coeftayl(1/p,x=0,N)

1

MATL , 19 байт

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

Переклад чудової відповіді Matlab @ flawr .

Спробуйте в Інтернеті!

Як це працює

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 Спочатку я спробував ітераційну версію, але виявилося, що вона становить 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одночасно зменшити над усім масивом , оскільки нулі не вплинуть на результат. Останній обчислений коефіцієнт - кінцевий результат.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.