Đảo ngược cục bộ một đa thức


20

Thử thách

Cho một đa thức pvới hệ số thực sự của trật tự 1và mức độ n, tìm một đa thức qcủa mức độ tối đa là nnhư vậy đó (p∘q)(X) = p(q(X)) ≡ X mod X^(n+1), hay nói cách khác đó là p(q(X)) = X + h(X)nơi hlà một đa thức tùy ý với ord(h) ≥ n+1. Đa thức qđược xác định duy nhất bởi p.

Đối với một đa thức p(X) = a(n)*X^n + a(n+1)*X^(n+1) + ... + a(m)*X^mnơi n <= ma(n) ≠ 0, a(m) ≠ 0, chúng ta nói ntrật tự của pmmức độ của p.

Đơn giản hóa : Bạn có thể giả sử rằng pcó hệ số nguyên và a(1)=1(vì vậy p(X) = X + [some integral polynomial of order 2]). Trong trường hợp qnày có hệ số tích phân quá.

Mục đích của việc đơn giản hóa này là để tránh các vấn đề với số dấu phẩy động. Tuy nhiên, có một ví dụ không tách rời cho mục đích minh họa.

Ví dụ

  • Hãy xem xét loạt Taylor 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 + ...sau đó rõ ràng ln(exp(x)-1+1)= x. Nếu chúng ta chỉ xem xét các đa thức Taylor bậc 4 của hai hàm đó, chúng ta sẽ có ký hiệu từ bên dưới (xem các mẫu thử) 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

  • Xét đa thức p(X) = X + X^2 + X^3 + X^4. Sau đó, q(X) = X - X^2 + X^3 - X^4chúng tôi nhận được

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

Tủ thử

Ở đây các đa thức đầu vào và đầu ra được viết dưới dạng danh sách các hệ số (với hệ số đơn thức bậc nhất trước, thuật ngữ không đổi cuối cùng):

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

Kiểm tra tích phân:

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]

Câu trả lời:


5

Python 2 + sympy, 128 byte

Chúng tôi đảo ngược đa thức cục bộ bằng cách giả sử rằng q (x) = x, kết hợp nó với p, kiểm tra hệ số cho x 2 và trừ nó khỏi q. Giả sử hệ số là 4, thì đa thức mới trở thành q (x) = x - 4x 2 . Sau đó, chúng tôi lại soạn thảo điều này với p, nhưng tìm hệ số cho x 3 . V.v ...

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

Toán học, 45 byte

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

Vâng, Mathematica có một nội dung cho điều đó ....

Hàm không tên lấy đầu vào là một đa thức trong biến x, chẳng hạn như -x^4+3x^3-3x^2+xcho trường hợp thử nghiệm cuối cùng và trả về một đa thức có cú pháp tương tự, chẳng hạn như x+3x^2+15x^3+91x^4đối với trường hợp thử nghiệm cuối cùng.

#+O@x^(#~Exponent~x+1)biến đầu #vào thành một đối tượng chuỗi lũy thừa, bị cắt ở mức độ #; InverseSerieslàm những gì nó nói; và Normalbiến chuỗi lũy thừa kết quả trở lại thành một đa thức. (Chúng ta có thể lưu 7 byte ban đầu nếu câu trả lời ở dạng x+3x^2+15x^3+91x^4+O[x]^5có thể chấp nhận được. Thật vậy, nếu đó là định dạng có thể chấp nhận được cho cả đầu vào và đầu ra, thì InverseSeriesmột mình sẽ là một giải pháp 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]],[])

Cổng câu trả lời của @ orlp. I / O ở dạng mảng các hệ số theo thứ tự ngược lại, tức là hai hệ số đầu tiên luôn là 0 và 1.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.