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


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


Было бы приемлемо принять полином как бесконечный список коэффициентов степенных рядов [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,#}]&

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

4

GeoGebra , 28 байт

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

Ввод берется из ячеек электронной таблицы A1 и B1 полинома и целого числа соответственно, и каждая строка вводится отдельно в строку ввода. Выход через присвоение переменной 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.

Идея состоит в том, что если 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.


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)

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сразу, так как нули не влияют на результат. Последний рассчитанный коэффициент является окончательным результатом.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.