[SymPy] 有理化

[SymPy] 有理化

有理化

 分数の分母または分子から根号を取り除いて有理数にすることを 有理化 (rationalization) とよびます。

分母の有理化

 数学の式変形においては、普通は分母を有理化します。
 たとえば、分母に根号を含む分数
 
\[\frac{1}{1+\sqrt{5}}\]
の分子と分母に $1-\sqrt{5}$ を掛けると、
 
\[\frac{1-\sqrt{5}}{(1+\sqrt{5})(1-\sqrt{5})}=\frac{1-\sqrt{5}}{1-5}=\frac{\sqrt{5}-1}{4}\]
となって、分母が有理数となります。

 SymPy の標準簡略化関数 simplify() は分母に無理数を含む数式を有理化しますが、明示的に数式の有理化だけ実行したい場合は以下で解説する radsimp() を使います。
 

radsimp()

 SymPy の radsimp() は分母を 有理化 します。

# RADSIMP-1

from sympy import *

var("a b x")

expr = a / (b + sqrt(2))

# 分母を有理化
expr = radsimp(expr)

print(expr)
a*(b - sqrt(2))/(b**2 - 2)

 分母が二重根号であっても有理化してくれます。

# RADSIMP-2

# 分母が二重根号を含む式
x = 1/sqrt(a + b + sqrt(a*b))

# 分母を有理化
x = radsimp(x)

print(x)
(a + b - sqrt(a*b))*sqrt(a + b + sqrt(a*b))/(a**2 + a*b + b**2)

 人間には手に負えないような有理化も難なく実行してくれます。
 三重根号を含む式を有理化してみましょう。

# RADSIMP-3

init_printing()

# 分母が三重根号を含む式
x = 1/sqrt(11 + sqrt(6 + sqrt(19)))

# 分母を有理化
x = radsimp(x)

print(x)
\[\frac{\sqrt{\sqrt{\sqrt{19} + 6} + 11} \left(- 115 \sqrt{\sqrt{19} + 6} - \sqrt{19} \sqrt{\sqrt{19} + 6} + 11 \sqrt{19} + 1265\right)}{13206}\]

 

rad_rationalize()

 rad_rationalize(num, den) に分子と分母を渡すと、分母が有理化された分数をタプル表式で返します。

# RATIONALIZE

from sympy.simplify.radsimp import rad_rationalize

# (num,den)=(1,1+sqrt(2))を有理化
y = rad_rationalize(1, 1 + sqrt(2))

print(y)
(-1 + sqrt(2), 1)