Локально переверніть поліном


20

Виклик

Давши многочлен pз реальними коефіцієнтами порядку 1та ступеня n, знайдіть інший многочлен qступеня максимум nтакий, який (p∘q)(X) = p(q(X)) ≡ X mod X^(n+1), або іншими словами такий, p(q(X)) = X + h(X)де де hдовільний многочлен ord(h) ≥ n+1. Поліном qоднозначно визначається p.

Для полінома , p(X) = a(n)*X^n + a(n+1)*X^(n+1) + ... + a(m)*X^mде n <= mі a(n) ≠ 0, a(m) ≠ 0ми говоримо , nє порядок з pі mє ступінь з p.

Спрощення : Ви можете припустити, що pмає цілі коефіцієнти та a(1)=1(так p(X) = X + [some integral polynomial of order 2]). І в цьому випадку qє інтегральні коефіцієнти.

Мета цього спрощення - уникнути проблем із числами з плаваючою комою. Однак є нецілісний приклад для цілей ілюстрації.

Приклади

  • Розгляньте серію Тейлора exp(x)-1 = x + x^2/2 + x^3/6 + x^4/24 + ...та ln(x+1) = x - x^2/2 + x^3/3 - x^4/4 + ...очевидно ln(exp(x)-1+1)= x. Якщо ми просто розглянемо поліноми Тейлора ступеня 4 цих двох функцій, то отримаємо позначення знизу (див. Тестові шкали) p = [-1/4,1/3,-1/2,1,0]та q = [1/24, 1/6, 1/2, 1,0]і(p∘q)(X) ≡ X mod X^5

  • Розглянемо многочлен p(X) = X + X^2 + X^3 + X^4. Тоді для q(X) = X - X^2 + X^3 - X^4отримання

    (p∘q)(X) = p(q(X)) = X - 2X^5 + 3X^6 - 10X^7 +...+ X^16 ≡ X mod X^5
    

Тестові шафи

Тут поліноми вводу та виводу записуються у вигляді списків коефіцієнтів (з першим коефіцієнтом одночлена найвищого ступеня, останнім постійним членом):

p = [4,3,2,0];  q=[0.3125,-.375,0.5,0]

Інтегральні тести:

p = [1,0]; q = [1,0]

p = [9,8,7,6,5,4,3,2,1,0]; q = [4862,-1430,429,-132,42,-14,5,-2,1,0]

p = [-1,3,-3,1,0]; q = [91,15,3,1,0]

Відповіді:


5

Python 2 + symy, 128 байт

Ми локально інвертуємо многочлен, вважаючи, що q (x) = x, склавши його з p, перевіривши коефіцієнт на x 2 і віднісши його від q. Скажімо, коефіцієнт дорівнював 4, тоді новий многочлен стає q (x) = x - 4x 2 . Потім ми знову складемо це з p, але шукаємо коефіцієнт для x 3 . І т.д. ...

from sympy import*
i=input()
p=Poly(i,var('x'));q=p*0+x
n=2
for _ in i[2:]:q-=compose(p,q).nth(n)*x**n;n+=1
print q.all_coeffs()

2

Математика, 45 байт

Normal@InverseSeries[#+O@x^(#~Exponent~x+1)]&

Так, у Mathematica є вбудований для цього….

Безіменна функція приймає введення полінома в змінну x, наприклад -x^4+3x^3-3x^2+xдля останнього тестового випадку, і повертає поліном з аналогічним синтаксисом, наприклад, x+3x^2+15x^3+91x^4для останнього тестового випадку.

#+O@x^(#~Exponent~x+1)перетворює вхід #в енергетичний ряд об'єкта, усічений на ступінь #; InverseSeriesробить те, що говорить; і Normalперетворює отриманий усічений ряд потужності назад у многочлен. (Ми могли б зберегти ці початкові 7 байт, якби відповідь у формі x+3x^2+15x^3+91x^4+O[x]^5була прийнятною. Дійсно, якби це був прийнятний формат і для вводу, і для виводу, тоді InverseSeriesодне було б 13-байтовим рішенням.)


2

JavaScript (ES6), 138 байт

a=>a.reduce((r,_,i)=>[...r,i<2?i:a.map(l=>c=p.map((m,j)=>(r.map((n,k)=>p[k+=j]=m*n+(p[k]||0)),m*l+(c[j]||0)),p=[]),c=[],p=[1])&&-c[i]],[])

Порт відповіді @ orlp. Введення / виведення у вигляді масивів коефіцієнтів у зворотному порядку, тобто перші два коефіцієнти завжди 0 і 1.


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