코딩 연습

(파이썬) 다항식의 전개와 인수분해 본문

Python

(파이썬) 다항식의 전개와 인수분해

코딩아저씨 2016. 3. 15. 16:23
반응형

mathematica 나 MS mathematics 에서는 \((x+1)^2\)의 결과로 \(x^2 +2x+1\) 을 얻는 것이 가능하지만, 일반적인 프로그래밍 언어에서는 이런 결과를 어떻게 얻어야 할지 모르는 경우가 대부분이다. (아니면 나만 몰랐던가 ㅠㅠ) 

파이썬에서 다항식의 계산을 어떤 식으로 할 수 있는지에 대해서 알아 보자.

>>> x = 1
>>> (x + 1) ** 2
4

위와 같은 결과를 얻는 것은 지극히 당연해 보인다. 그렇다면 \((x+1)^2\) 이 전개된 결과를 얻고 싶다면 어떻게 해야할까?  이럴 때 사용할 수 있는 것이 sympy 모듈의 Symbol 클래스이다. 사용법은 다음과 같다. 

>>> from sympy import Symbol
>>> x = Symbol('x')
>>> x + x + 3
2*x + 3

(sympy 모듈을 찾을 수 없다고 나온다면 여기 에 나와있는 설치 방법대로 설치하면 된다.) 

이렇게 \(x\) 에 대한 다항식의 계산 결과를 얻을 수 있다. \(x, \; y\) 에 대한 다항식이라면 다음과 같이 동시에 symbol을 만들어 낼 수 있다.

>>> from sympy import symbols
>>> x, y = symbols('x, y')
>>> x * y + x * y + x * y
3*x*y

이제 부푼 꿈을 안고 다음과 같이 다항식의 곱셈을 해 보지만 결과는 우리가 원하는 것이 아니다. 

>>> (x + 1) * (x + 2)
(x + 1)*(x + 2)

우리가 원하는 결과를 얻고 싶다면 sympy 부터 expand 와 factor 를 가져오면 된다.

>>> from sympy import expand, factor
>>> expand((x + 1) * (x + 2))
x**2 + 3*x + 2

당연히 인수분해도 가능해진다.

>>> factor(x**2 + 3*x + 2)
(x + 1)*(x + 2)

오~~~ 인수 분해가 된다. 그런데 한 가지 딱 걸리는게 있다. 바로 \((x+1)(x+2)\) 를 전개했을 때의 결과다. 파이썬에서 \(x^2\) 을 \(x ** 2\) 으로 표현하는 것을 알고 있다 하더라도 보기가 영 좋지 않다. 우리한테 친숙한 형태로 결과를 받아볼 수는 없는 것일까? 

이때 필요한 것이 바로 pretty printing 즉 pprint 이다. 다음의 결과를 보자.

>>> from sympy import pprint
>>> pprint(expand((x + 1) * (x + 2)))
 2
x  + 3⋅x + 2

솔직하게 말해서 별로 프리티해 보이지는 않는다. 그렇지만 여하튼 친숙한 형태인 것은 맞다. 일반적인 \(x\) 에 대한 다항식의 경우 pprint 는 내림차순으로 정리하여 결과를 보여준다. 

>>> polynomial = 2 + 3*x + x**2
>>> pprint(polynomial)
 2
x  + 3⋅x + 2

이것을 오름차순으로 정리하고 싶다면 다음과 같이 init_printing 을 이용하면 된다. 

>>> from sympy import init_printing
>>> init_printing(order='rev-lex')
>>> pprint(polynomial)
           2
2 + 3⋅x + x

여기서 rev-lex 는 reverse lexicographical order 를 나타낸다고 한다. 이렇게 하면 결과가 오름차순으로 정렬되어 나타나는 것을 볼 수 있다.


마지막으로 \(x\) 나 \(y\) 에 특정한 값을 대입한 결과를 출력하는 방법을 알아보자.

\(x^2 + 2xy+y^2\) 이라는 다항식에 \(x=2,\; y=1\) 을 대입한 결과를 얻고 싶다면 어떻게 해야 할까? 이럴 땐 다음과 같이 subs() 메서드(method는 클래스의 함수로 이해하면 된다)를 쓰면 된다. 

>>> polynomial = x**2 + 2*x*y + y**2
>>> polynomial.subs({x:2, y:1})
9

여기서 우리가 신경써야 할 부분은 바로 subs 메서드의 인수로 \(x, \;y\) 값을 줄 때는 파이썬의 사전(dict) 형태로 줘야 한다는 것이다. 즉, \(\{x:2,\;y:1\}\) 의 형태로 인수를 전달해야 한다는 뜻이다. 이렇게 전달하면 \(2^2 + 2 \times 2 \times 1 + 1^2\) 이 계산된 결과 \(9\) 를 얻을 수 있다. 


이제 대충 감이 오는가?

반응형


Comments