まず、文字式が使えるように文字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