일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- one-to-one
- 일차변환
- Big Theta
- python
- trivial solution
- Big-Oh 예제
- itertools
- homogeneous linear system
- 빅세타
- nontrivial solution
- 랜덤 순서 배열
- Big Omega
- 빅오메가
- matrix trnasformations
- 이진 탐색
- 배열 섞기
- Big-O 예제
- 코틀린 Hello World!
- NumPy
- nonhomogeneous linear system
- 재귀함수
- 빅오 표기법
- 코틀린 시작하기
- solutions of matrix equation
- 알고리즘 분석의 실례
- recursive algorithms
- linear dependence
- Big-Oh notation
- matrix-vector product
- matrix fo a linear transformation
- Today
- Total
코딩 연습
(파이썬) 다항식의 전개와 인수분해 본문
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\) 를 얻을 수 있다.
이제 대충 감이 오는가?
'Python' 카테고리의 다른 글
(파이썬) 집합 (0) | 2016.03.15 |
---|---|
(파이썬) 방정식 풀기 (0) | 2016.03.15 |
(파이썬) 최빈값 구하기 (0) | 2016.03.15 |
(파이썬) 막대 그래프 그리기 (0) | 2016.03.15 |
(파이썬) 함수식을 이용한 이차함수의 그래프 그리기 (2) | 2016.03.15 |