LoginSignup
4
2

More than 5 years have passed since last update.

Sympyによる因数分解

Last updated at Posted at 2018-03-03

まず、文字式が使えるように文字x,y,zを準備する

>>> import sympy
>>> x,y,z = sympy.symbols('x,y,z')

sympyのfactor関数を使えば、整式を因数分解してくれる。

x^2-y^2=(x-y)(x+y)\\
x^2+3x=x(x+3)\\
2x^2+3x+1=(x+1)(2x+1)
>>> A1=x**2-y**2
>>> sympy.factor(A1)
(x - y)*(x + y)
>>> A2 = x**2+3*x
>>> sympy.factor(A2)
x*(x + 3)
>>> sympy.factor(2*x**2 + 3*x + 1)
(x + 1)*(2*x + 1)

難しめの因数分解もしてくれる。

(2x-1)(x+4)-(x-6)(x-2)=(x - 1)(x + 16)\\
x^3+y^3+z^3-3xyz=(x+y+z)(x^2-xy-xz+y^2-yz+z^2)

>>> A3=(2*x-1)*(x+4)-(x-6)*(x-2)
>>> sympy.factor(A3)
(x - 1)*(x + 16)
>>> sympy.factor(x**3+y**3+z**3-3*x*y*z)
(x + y + z)*(x**2 - x*y - x*z + y**2 - y*z + z**2)

ただし、

x^2-5=(x+\sqrt{5})(x-\sqrt{5})\\
x^2+5x+1=(x- \frac{-5+{\sqrt{21}}}{2})(x- \frac{-5-{\sqrt{21}}}{2})

のような無理数を含む式には因数分解してくれない。

>>> sympy.factor(x**2-5)
x**2 - 5
>>> sympy.factor(x**2+5*x+1)
x**2 + 5*x + 1

複素数の範囲での因数分解も然り。

>>> sympy.factor(x**3+1)
(x + 1)*(x**2 - x + 1)
>>> sympy.factor(x**2+1)
x**2 + 1

また分数が入った式を展開すると、分数が計算されて小数表記になる。
(sympyのexpand関数を使えば、整式を展開してくれる。)
しかし、その式を因数分解すると挙動がおかしくなる。
何故かわからないが・・・

(x+\frac{1}{2})(x+1)=x^2+1.5x+0.5\\
x^2+1.5x+0.5=1.0(0.5x-0.5)(1.0x+0.5)

>>> sympy.expand((x+1/2)*(x+1))
x**2 + 1.5*x + 0.5
>>> sympy.factor(x**2 + 1.5*x + 0.5)
1.0*(0.5*x + 0.5)*(1.0*x + 0.5)

これを解消するためにはRational関数を使って分数を有理数として表現する。

(x+\frac{1}{2})(x+1)=x^2+\frac{3}{2}x+\frac{1}{2}\\
x^2+\frac{3}{2}x+\frac{1}{2}=\frac{(x+1)(2x+1)}{2}

>>> A1=(x+sympy.Rational(1,2))*(x+1)
>>> A1
(x + 1/2)*(x + 1)
>>> sympy.expand(A1)
x**2 + 3*x/2 + 1/2
>>> A2=x**2 + sympy.Rational(3,2)*x + sympy.Rational(1,2)
>>> A2
x**2 + 3*x/2 + 1/2
>>> sympy.factor(A2)
(x + 1)*(2*x + 1)/2
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2