Inverser localement un polynôme


20

Défi

Étant donné un polynôme pavec des coefficients réels d'ordre 1et de degré n, trouver un autre polynôme qde degré au plus ntel que (p∘q)(X) = p(q(X)) ≡ X mod X^(n+1), ou en d'autres termes tel que p(q(X)) = X + h(X)hest un polynôme arbitraire avec ord(h) ≥ n+1. Le polynôme qest uniquement déterminé par p.

Pour un polynôme p(X) = a(n)*X^n + a(n+1)*X^(n+1) + ... + a(m)*X^mn <= met a(n) ≠ 0, a(m) ≠ 0nous disons nest l' ordre de pet mest le degré de p.

Simplification : vous pouvez supposer qu'il pa des coefficients entiers, et a(1)=1(donc p(X) = X + [some integral polynomial of order 2]). Dans ce cas, qa également des coefficients intégraux.

Le but de cette simplification est d'éviter les problèmes avec les nombres à virgule flottante. Il existe cependant un exemple non intégral à des fins d'illustration.

Exemples

  • Considérons la série de Taylor de exp(x)-1 = x + x^2/2 + x^3/6 + x^4/24 + ...et ln(x+1) = x - x^2/2 + x^3/3 - x^4/4 + ...puis évidemment ln(exp(x)-1+1)= x. Si nous considérons simplement les polynômes de Taylor de degré 4 de ces deux fonctions, nous obtenons la notation ci-dessous (voir les cas de test) p = [-1/4,1/3,-1/2,1,0]et q = [1/24, 1/6, 1/2, 1,0]et(p∘q)(X) ≡ X mod X^5

  • Considérez le polynôme p(X) = X + X^2 + X^3 + X^4. Alors pour q(X) = X - X^2 + X^3 - X^4nous

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

Cas de test

Ici, les polynômes d'entrée et de sortie sont écrits sous forme de listes de coefficients (avec le coefficient du monôme le plus élevé en premier, le terme constant en dernier):

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

Testcases intégrales:

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]

Réponses:


5

Python 2 + sympy, 128 octets

Nous inversons localement le polynôme en supposant que q (x) = x, en le composant avec p, en vérifiant le coefficient de x 2 et en le soustrayant de q. Disons que le coefficient était 4, alors le nouveau polynôme devient q (x) = x - 4x 2 . Nous composons ensuite à nouveau ceci avec p, mais recherchons le coefficient pour x 3 . Etc...

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 octets

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

Oui, Mathematica a une fonction intégrée pour cela ....

Fonction sans nom prenant en entrée un polynôme dans la variable x, comme -x^4+3x^3-3x^2+xpour le dernier scénario de test, et renvoyant un polynôme avec une syntaxe similaire, comme x+3x^2+15x^3+91x^4pour le dernier scénario de test.

#+O@x^(#~Exponent~x+1)transforme l'entrée #en un objet de série de puissance, tronqué au degré de #; InverseSeriesfait ce qu'il dit; et Normaltransforme la série de puissance tronquée résultante en un polynôme. (Nous pourrions enregistrer ces 7 octets initiaux si une réponse sous la forme x+3x^2+15x^3+91x^4+O[x]^5était acceptable. En effet, si c'était un format acceptable pour l'entrée et la sortie, alors InverseSeriesseul serait une solution de 13 octets.)


2

JavaScript (ES6), 138 octets

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 de la réponse de @ orlp. Les E / S se présentent sous la forme de tableaux de coefficients dans l'ordre inverse, c'est-à-dire que les deux premiers coefficients sont toujours 0 et 1.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.