ภายในพหุนามพหุนาม


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 ของทั้งสองฟังก์ชั่นที่เราได้รับกับสัญกรณ์จากด้านล่าง (ดู testcases) 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
    

Testcases

นี่คือชื่อพหุนามและผลลัพธ์ถูกเขียนเป็นรายการของค่าสัมประสิทธิ์ (กับค่าสัมประสิทธิ์ของระดับสูงสุด monomial ก่อนระยะคงที่สุดท้าย):

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 + sympy, 128 ไบต์

เรากลับหัวพหุนามแบบโลคัลโดยสมมติว่า q (x) = x, เขียนมันด้วย p, ตรวจสอบสัมประสิทธิ์สำหรับ x 2 , และลบมันออกจาก q สมมติว่าค่าสัมประสิทธิ์ 4 แล้วพหุนามใหม่กลายเป็นคิว (x) = x - 4x 2 จากนั้นเราอีกครั้งเขียนนี้กับหน้า แต่มองขึ้นค่าสัมประสิทธิ์สำหรับ 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

Mathematica ขนาด 45 ไบต์

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

ใช่ Mathematica มี builtin สำหรับที่ ....

ฟังก์ชันที่ไม่มีชื่อซึ่งทำหน้าที่ป้อนพหุนามในตัวแปร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 I / O อยู่ในรูปแบบของอาร์เรย์ของสัมประสิทธิ์ในลำดับย้อนกลับนั่นคือสองสัมประสิทธิ์แรกจะเป็น 0 และ 1 เสมอ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.