다항식


22

f,g정수에 대해 임의의 정도의 두 개의 다항식 이 주어지면 프로그램 / 함수는 두 번째 다항식의 첫 번째 다항식을 평가해야합니다. f(g(x))(일명 조성물 (fog)(x) 두 다항식)

세부

내장이 허용됩니다. 적절한 형식을 입력 / 출력으로 가정 할 수 있지만 입력 및 출력 형식은 일치해야합니다. 예를 들어 문자열로 형식화

x^2+3x+5

또는 계수 목록으로 :

[1,3,5] or alternatively [5,3,1]

또한 입력 다항식이 완전히 확장 된 것으로 가정 할 수 있으며 출력도 완전히 확장 될 것으로 예상됩니다.

A(x) = x^2 + 3x + 5, B(y) = y+1
A(B(y)) = (y+1)^2 + 3(y+1) + 5 = y^2 + 5y + 9

A(x) = x^6 + x^2 + 1, B(y) = y^2 - y
A(B(y))= y^12 - 6y^11 + 15y^10 - 20y^9 + 15y^8 - 6y^7 + y^6 + y^4 - 2 y^3 + y^2 + 1

A(x) = 24x^3 - 144x^2 + 288x - 192, B(y) = y + 2
A(B(y)) = 24y^3

A(x) = 3x^4 - 36x^3 + 138x^2 - 180x + 27, B(y) = 2y + 3
A(B(y)) = 48y^4 - 96y^2

내장은 어떻습니까?
Maltysen

1
@Maltysen "세부 사항 : 내장 허용. (...)" : D
flawr

2
"합리적인 형식"은 약간 확장 가능하다고 생각합니다. 다항식을 평가하는 함수가 허용되면, (.)작도 함수 는 Haskell의 답변입니다. 아마도 계수 목록의 일부 표현을 의미 할 것입니다.
xnor

1
제목! 방금 받았어요 : -D
Luis Mendo

2
@LuisMendo 빠른 사상가 = P
flawr

답변:


10

하스켈, 86 72 바이트

u!c=foldr1((.u).zipWith(+).(++[0,0..])).map c
o g=(0:)!((<$>g).(*))!pure

다음 o과 같은 기능을 정의합니다.o g f컴포지션 f ∘ g 계산 . 다항식은 상수 항에서 시작하는 비어 있지 않은 계수 목록으로 표시됩니다.

데모

*Main> o [1,1] [5,3,1]
[9,5,1]
*Main> o [0,-1,1] [1,0,1,0,0,0,1]
[1,0,1,-2,1,0,1,-6,15,-20,15,-6,1]
*Main> o [2,1] [-192,288,-144,24]
[0,0,0,24]
*Main> o [3,2] [27,-180,138,-36,3]
[0,0,-96,0,48]

작동 원리

다항식 관련 내장 또는 라이브러리가 없습니다. 유사한 재발을 관찰하십시오

f (x) = a + f₁ (x) x ⇒ f (x) g (x) = ag (x) + f₁ (x) g (x) x,
f (x) = a + f₁ (x) x ⇒ f (g (x)) = a + f₁ (g (x)) g (x),

다항식 곱셈과 구성 그들은 둘 다 형태를 취합니다

f (x) = a + f₁ (x) x ⇒ W (f) (x) = C (a) (x) + U (W (f₁)) (x).

연산자 !는 다음을 사용하여 U와 C가 주어진 W에 대해이 양식의 반복을 해결합니다.zipWith(+).(++[0,0..]) 다항식 덧셈을 (두 번째 주장이 더 길다고 가정 할 때, 항상 그렇습니다). 그때,

(0:)다항식 인수에 x를 곱하여 (제로 계수 앞에 추가)
(<$>g).(*)스칼라 인수에 다항식을 곱합니다 g.
(0:)!((<$>g).(*))다항식에 다항식을 곱합니다 g.
pure스칼라 인수를 상수 다항식 (단일리스트)으로 올립니다.
(0:)!((<$>g).(*))!pure다항식을 다항식으로 구성합니다 g.


9

매스 매 티카, 17 바이트

Expand[#/.x->#2]&

사용법 예 :

In[17]:= Expand[#/.x->#2]& [27 - 180x + 138x^2 - 36x^3 + 3x^4, 3 + 2x]

              2       4
Out[17]= -96 x  + 48 x

7

TI 기본 68k, 12 바이트

a|x=b→f(a,b)

사용법은 간단합니다 (예 : 첫 번째 예).

f(x^2+3x+5,y+1)

어떤 반환

y^2+5y+9

입력이 다른 변수에 있어야한다고 속이는 것 같습니다. 이 답변에 중요합니까?
feersum

합리적인 입력 형식을 명시 적으로 허용했습니다.
flawr

귀하의 의견 편집과 관련하여 : 그렇습니다.
flawr

이 사이트의 규칙에 익숙하지 않습니다. TI-BASIC에서 1 바이트 가되는 것이 맞 습니까?
asmeurer

@asmeurer 실제로 : TI-Basic은 해당 계산기에서 사용되는 인코딩으로 점수가 매겨집니다. 세부 사항에 관심이 있으시면 여기 meta에서 읽을 수 있습니다 . ti-basic-dev에서 토큰 테이블을 찾을 수 있습니다 .
flawr

6

파이썬 2 138 156 162 바이트

입력은 가장 작은 거듭 제곱을 갖는 정수 목록이어야합니다.

def c(a,b):
 g=lambda p,q:q>[]and q[0]+p*g(p,q[1:]);B=99**len(`a+b`);s=g(g(B,b),a);o=[]
 while s:o+=(s+B/2)%B-B/2,;s=(s-o[-1])/B
 return o

언 골프 드 :

def c(a,b):
 B=sum(map(abs,a+b))**len(a+b)**2
 w=sum(B**i*x for i,x in enumerate(b))
 s=sum(w**i*x for i,x in enumerate(a))
 o=[]
 while s:o+=min(s%B,s%B-B,key=abs),; s=(s-o[-1])/B
 return o

이 계산에서 다항식 계수는 매우 큰 기수에서 숫자의 자릿수 (음수 일 수 있음)로 표시됩니다. 다항식이이 형식으로 된 후에는 곱셈 또는 덧셈이 단일 정수 연산입니다. 밑면이 충분히 크면 인접한 숫자로 넘겨지는 캐리가 없습니다.

B@xnor에서 제안한대로 -18에서 바운드 개선 .


좋은 방법입니다. 를 들어 B, 것 10**len(`a+b`)충분?
xnor

@ xnor 아마도 ... 내가 말하기가 어렵습니다.
feersum

+1 이것은 정말 창의적인 해결책이며 bigints를 잘 사용합니다 !!!
flawr

@xnor 지금은 그 했나 계수 길이 : 입력의 길이에 선형 자신을 설득하기 위해 관리했습니다
feersum

5

Python + SymPy, 59 35 바이트

from sympy import*
var('x')
compose

24 바이트를 골라 낸 @asmeurer에게 감사드립니다!

시운전

>>> from sympy import*
>>> var('x')
x
>>> f = compose
>>> f(x**2 + 3*x + 5, x + 1)
x**2 + 5*x + 9

1
SymPy에는 compose()기능이 있습니다.
asmeurer

1
답은 어디에 있습니까? 그것은 더 이상 기능을 정의하거나 아무것도하지 않습니다 ...
feersum

1
@feersum 지금까지 없었습니다. 메타 게시물을 편집했습니다.
Mego

3
@feersum 자신의 일정에 대한 정책을 수정하기 위해 허용 된 메타 게시물을 편집했습니다. 괜찮습니다.
Mego

3
@feersum 비록 당신이 당신의 표현이 모호하다고 생각했을지 모르지만, 그것은 분명히 지역 사회의 다른 사람들에게는 해당되지 않았습니다. 우리 from module import*;function는 유효한 제출 인 컨센서스를 수락했습니다 . 그럼에도 불구하고, 이것은 이름이없는 람다를 사용하여 가져 오기 및 도우미 기능을 허용하는 최신 정책입니다.
Mego

3

세이지, 24 바이트

lambda A,B:A(B).expand()

Sage 6.9 ( http://sagecell.sagemath.org 에서 실행되는 버전 )부터 명시적인 인수 할당없이 함수를 호출 f(2) rather than f(x=2)하면 성 가시고 도움이되지 않는 메시지가 STDERR에 인쇄됩니다. 코드 골프에서는 STDERR을 기본적으로 무시할 수 있기 때문에 여전히 유효합니다.

이것은 매우 유사하다 데니스의 SymPy 응답 세이지 파이썬에 내장)를을, 그리고 b)는 사용하기 때문에 맥시마 , 여러 가지 방법으로 SymPy 매우 유사한 컴퓨터 대수 시스템. 그러나 Sage는 SymPy를 사용하는 Python보다 훨씬 강력하므로 자체 답변을 얻을만큼 충분히 다른 언어입니다.

모든 테스트 사례를 온라인으로 확인


2

PARI / GP , 19 바이트

(a,b)->subst(a,x,b)

당신이 할 수있는

%(x^2+1,x^2+x-1)

얻을

% 2 = x ^ 4 + 2 * x ^ 3-x ^ 2-2 * x + 2


1

Symbolic Toolbox가있는 MATLAB, 28 바이트

@(f,g)collect(subs(f,'x',g))

이것은 익명의 기능입니다. 호출하려면 변수에 지정하거나을 사용하십시오 ans. 입력은 형식의 문자열입니다 (공백은 선택 사항 임)

x^2 + 3*x + 5

예제 실행 :

>> @(f,g)collect(subs(f,'x',g))
ans = 
    @(f,g)collect(subs(f,'x',g))
>> ans('3*x^4 - 36*x^3 + 138*x^2 - 180*x + 27','2*x + 3')
ans =
48*x^4 - 96*x^2

1

파이썬 2 239 232 223 바이트

r=range
e=reduce
a=lambda*l:map(lambda x,y:(x or 0)+(y or 0),*l)
m=lambda p,q:[sum((p+k*[0])[i]*(q+k*[0])[k-i]for i in r(k+1))for k in r(len(p+q)-1)]
o=lambda f,g:e(a,[e(m,[[c]]+[g]*k)for k,c in enumerate(f)])

기지를 남용하지 않는 '적절한'구현. 중요 계수가 가장 낮습니다.

a다항식 덧셈, m다항식 곱셈, o구성입니다.


m([c],e(m,[[1]]+[g]*k))동일하지 e(m,[[c]]+[g]*k)?
Neil

@Neil 좋은 전화, 그 중 하나와 함께 스쿼시 수 있습니다!
orlp

a=lambda*l:map(lambda x,y:(x or 0)+(y or 0),*l)
Anders Kaseorg

@AndersKaseorg 맞아요, 감사합니다 :)
orlp

하나의 목록이 항상 다른 목록보다 길기 때문에 다항식 추가를 단순화 할 수 있으므로 ( or 0)해당 버전 에서는 필요하지 않습니다 .
Neil

1

자바 스크립트 (ES6), (150) 103 바이트

(f,g)=>f.map(n=>r=p.map((m,i)=>(g.map((n,j)=>p[j+=i]=m*n+(p[j]||0)),m*n+(r[i]||0)),p=[]),r=[],p=[1])&&r

다항식을 수용 하여 0 + a 1 * x + a 2 * x 2 ... 를 나타내는 배열 a = [a 0 , a 1 , a 2 , ...] 로 반환합니다 .

편집 : 재귀에서 반복 다항식 곱셈으로 전환하여 47 바이트를 절약 한 다음 두 map통화 를 병합 할 수있었습니다 .

설명 : r 은 빈 배열로 표시되는 0에서 시작하는 결과이며, pg h 이며 1에서 시작합니다. 에 각 f h 를 차례로 곱한 결과는 r에 누적됩니다 . p 도 동시에 g 를 곱합니다 .

(f,g)=>f.map(n=>            Loop through each term of f (n = f[h])
 r=p.map((m,i)=>(           Loop through each term of p (m = p[i])
  g.map((n,j)=>             Loop though each term of g (n = g[j])
   p[j+=i]=m*n+(p[j]||0)),  Accumulate p*g in p
  m*n+(r[i]||0)),           Meanwhile add p[i]*f[h] to r[i]
  p=[]),                    Reset p to 0 each loop to calculate p*g
 r=[],                      Initialise r to 0
 p=[1]                      Initialise p to 1
)&&r                        Return the result


1

루비 2.4 + 다항식 , 41 + 12 = 53 바이트

플래그를 사용합니다 -rpolynomial . 입력은 2Polynomial 객체입니다.

누군가가 바닐라 루비 (다항식 외부 라이브러리 없음)에서 나를 능가하면 매우 감동 할 것입니다.

->a,b{i=-1;a.coefs.map{|c|c*b**i+=1}.sum}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.