Inverti localmente un polinomio


20

Sfida

Dato un polinomio pcon coefficienti reali di ordine 1e grado n, trova un altro polinomio qdi grado al massimo ntale(p∘q)(X) = p(q(X)) ≡ X mod X^(n+1) , o in altre parole tale p(q(X)) = X + h(X)dove si htrova un polinomio arbitrario ord(h) ≥ n+1. Il polinomio qè determinato in modo univoco da p.

Per un polinomio in p(X) = a(n)*X^n + a(n+1)*X^(n+1) + ... + a(m)*X^mcui n <= me a(n) ≠ 0, a(m) ≠ 0diciamo, nè l' ordine dip ed mè il grado di p.

Semplificazione : si può presumere che pabbia coefficienti interi e a(1)=1(così p(X) = X + [some integral polynomial of order 2]). In questo caso qha anche coefficienti integrali.

Lo scopo di questa semplificazione è di evitare i problemi con i numeri in virgola mobile. Vi è tuttavia un esempio non integrale a scopo illustrativo.

Esempi

  • Considera la serie di Taylor exp(x)-1 = x + x^2/2 + x^3/6 + x^4/24 + ...e ln(x+1) = x - x^2/2 + x^3/3 - x^4/4 + ...quindi ovviamente ln(exp(x)-1+1)= x. Se consideriamo solo i polinomi di Taylor di grado 4 di queste due funzioni si ottiene con la notazione dal basso (vedi casi di test) p = [-1/4,1/3,-1/2,1,0]e q = [1/24, 1/6, 1/2, 1,0]e(p∘q)(X) ≡ X mod X^5

  • Considera il polinomio p(X) = X + X^2 + X^3 + X^4. Quindi per q(X) = X - X^2 + X^3 - X^4noi abbiamo

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

Casi test

Qui i polinomi di input e output sono scritti come elenchi di coefficienti (con il coefficiente del monomio di grado più alto per primo, il termine costante per ultimo):

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

Test integrali:

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]

Risposte:


5

Python 2 + sympy, 128 byte

Invertiamo localmente il polinomio ipotizzando che q (x) = x, componendolo con p, controllando il coefficiente per x 2 e sottraendolo da q. Diciamo che il coefficiente era 4, quindi il nuovo polinomio diventa q (x) = x - 4x 2 . Quindi componiamo nuovamente questo con p, ma cerchiamo il coefficiente per x 3 . Eccetera...

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

Mathematica, 45 byte

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

Sì, Mathematica ha una risposta per questo ...

Funzione senza nome che prende come input un polinomio nella variabile x, come -x^4+3x^3-3x^2+xper l'ultimo caso di test, e restituisce un polinomio con sintassi simile, come x+3x^2+15x^3+91x^4per l'ultimo caso di test.

#+O@x^(#~Exponent~x+1)trasforma l'ingresso #in un oggetto serie di potenze, troncato al grado di #; InverseSeriesfa quello che dice; e Normaltrasforma le serie di potenze troncate risultanti in un polinomio. (Potremmo salvare quei 7 byte iniziali se una risposta nel modulo x+3x^2+15x^3+91x^4+O[x]^5fosse accettabile. In effetti, se quello fosse un formato accettabile sia per l'input che per l'output, InverseSeriesda solo sarebbe una soluzione a 13 byte.)


2

JavaScript (ES6), 138 byte

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]],[])

Port of @ orlp's answer. L'I / O è sotto forma di matrici di coefficienti in ordine inverso, ovvero i primi due coefficienti sono sempre 0 e 1.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.