다항식을 로컬로 반전


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 <= ma(n) ≠ 0, a(m) ≠ 0우리 말 n은 IS 순서pm는 IS 정도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
    

테스트 케이스

여기에서 입력 및 출력 다항식은 계수 목록으로 작성됩니다 (최고도의 최소 차수, 상수 항의 마지막 계수).

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라고 가정하면 새로운 다항식은 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

Mathematica, 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다항식에 결과립니다 멱급수 다시 켜집니다. (우리는 형식의 응답 x+3x^2+15x^3+91x^4+O[x]^5이 허용 가능한 경우 초기 7 바이트를 저장할 수 있습니다. 실제로 입력 및 출력 모두에 허용되는 형식이면 InverseSeries13 바이트 솔루션입니다.)


2

자바 스크립트 (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.