ゴリラと学ぶ「PythonのSympyで因数分解」
ゴリはさいきんよく数学をあつかっているウホ。数学はとくいじゃないんだけど、べんきょうしていくといろいろな事ができるようになってたのしい😀ウホ。数値をつかってなにかするのは、ものをかんがえるときにも応用の幅がきいて、とても便利ウホ。
しかも、いままでもゴリラの数だけウホと言わせることや、ゴリ進数を日本語にしたりなおしたりすることをPythonでやってきたように、すうがくとプログラミングはとてもいいかんけいにあるウホ。
もっといろいろなことを機械的🤖にできるようになりたいウホ!というわけで、きょうはPythonで数式のゴリラを因数分解することをやってみるウホ。
もんだい
ゴリラを因数分解して、解をみちびいてほしいウホ!
ぐたいてきには、$🦍 = x$のつもりで、つぎの式の解をもとめてほしいウホ。
(1) $🦍^2 + 2🦍 + 1$
(2) $🦍^2 + 5🦍 + 1$
🦍🐍🦍🐍🦍🐍🦍🐍🦍🐍🦍🐍
かいとうあん
下にかくほうほういがいにも、やりかたはあるとおもうから、、かいとうあんとしておくウホ。
どうさかんきょう:Google colaboratory (python3 notebook) (2020/02/07動作版)
Pythonでなにか記号をつかって計算するときには、Sympy(公式サイト)をつかうウホ!
これをつかえば、Pythonで因数分解ができるようになるウホ!ほかにもいろいろできるだろうけど、ゴリはまだためしてないウホ。
…
(1) $🦍^2 + 2🦍 + 1$
さっそくだけど、さいしょのかいとうあんはつぎのとおりになるウホ。
import sympy as sp
x = sp.Symbol('🦍')
y = x**2 + 2*x + 1
gori = sp.factor(y)
print(gori)
これの出力はつぎのようになるウホ。
(🦍 + 1)**2
なにやってるのか書いておくウホ。
まずはSympyをimportするウホ!Google colaboratoryにはすでにSympyが入っているみたいだから、インストールしなくてもだいじょうぶウホ。そのままimport sympyとするウホ。colaboratoryでなにかインストールしたいときは!pip install sympyとするウホ。
ゴリはいちいちsympyとかくのがめんどうだから、import sympy as spとして、いこうはspをsympyのつもりであつかうウホ。
そんで、sp.Symbolで変数にする文字をきめるウホ!いつもみんながといている数式上でいうと、$x$みたいに文字をきめるウホ。ちなみに、ほんとうは🦍 = sp.Symbol(‘🦍’)みたいにしたかったけど、識別子にそれつかうのやめて(invalid character in identifier)っていわれたから、ふつうにxをつかうことにしたウホ。
あとは、yに因数分解したいxの式をかくのうして、gori = sp.factor(y)として因数分解するウホ。このfactor()が、因数分解してくれるやつウホ。因数分解した結果をgoriに格納したウホ。こたえだけしりたいときは、いちいちgoriにかくのうしなくても、ちょくせつprint(sp.factor(y))としてもいいウホ。
そして、あとはprint(gori)として、けっかを出力したウホ!
えられた結果から、🦍 = -1になったウホ。負のゴリラというがいねんがでてきたウホ!これはこんごなにかにつかえそうな考え方だウホ。
…
(2) $🦍^2 + 5🦍 + 1$
さっそくつぎのもんだいにうつるウホ!
でも、つぎの問題をおなじように因数分解しようとすると、どうやら因数分解できないものは出力が入力とおなじになっちゃうみたいウホ。ただ$x$がゴリラになっただけになるみたいウホ。
import sympy as sp
x = sp.Symbol('🦍')
y = x**2 + 5*x + 1
gori = sp.factor(y)
print(gori)
これの出力はつぎのようになるウホ。
🦍**2 + 5*🦍 + 1
というわけで、改良版として、因数分解できているものはそのまま出力して、因数分解できていないものは解だけだしてもらうようにするウホ!
いんすうぶんかいできているということは、文字の中には何がふくまれているウホ?
因数分解できてると、式の中にはかっこ()がふくまれているはずウホ!
というわけで、「式のなかにかっこ'(‘がふくまれていないとき、解だけ出す」という処理をやるウホ!
もうちょっとかしこい方法もあるかもだけど、ひとまず次の方法でできたウホ。
import sympy as sp
x = sp.Symbol('🦍')
y = x**2 + 5*x + 1
gori = sp.factor(y)
if '(' not in str(gori):
print(gori)
print('因数分解できなかったから解だけ出すウホ!')
gori = sp.solve(y)
print(gori)
not in str(gori)とすることで、ifの判別のためにいったんgoriを文字列にしたウホ。
あと、sympyのsolve()をつかうことで、解を求めたウホ。
これの出力はつぎのようになるウホ。
🦍**2 + 5*🦍 + 1
因数分解できなかったから解だけ出すウホ!
[-5/2 - sqrt(21)/2, -5/2 + sqrt(21)/2]
こたえがよみにくいけど、🦍 = $\frac{-5}{2} - \frac{\sqrt{21}}{2}, \frac{-5}{2} + \frac{\sqrt{21}}{2}$という答えがでたウホ!にぶんのいちでわかれているけど、分母をまとめて書いてもいいウホ。
こたえ:
(1) 🦍 = -1
(2) 🦍 = $\frac{-5}{2} - \frac{\sqrt{21}}{2}, \frac{-5}{2} + \frac{\sqrt{21}}{2}$
因数分解ができるようになったウホ!変数$x$をなにかべつのもじにするこころみは、すうがくになれてくると違和感がつよいけど、へんすうの意味をぱっと見でわかるためには、おつむ🧠のたいそうとしてべつのもじにしてみるのも悪くないウホ。
sympyでは因数分解だけじゃなくて展開もできるけど(expand()をつかうだけ)、それはまたべつのきかいにつかうことにするウホ。
しかし、sympyはとてもべんりウホ!これからもどんどんかつようしていきたいウホ。