3次方程式の解を求めるプログラムを作ろうと画策している。
まずは敵情視察である。
出来るだけ、端折らずに淡々と計算していく。
ブログ内で数式を扱うのは面倒なので、パワポで書いたものを貼っていく。
まず、
ax3+bx2+cx+d=0
この多項式の係数a,b,c,dは、プログラム内部では整数とします。
まぁ、有理数でもいいんだけど、整数ということにしておこう。
有理数とするならば、有理数クラスを実装しなければならないな。
まず、この多項式が3次方程式であるために、aは0であってはなりません。
当たり前ですが、書いておきます。
いきなりですが、x3の係数は1にしたいので、各項をaで割る。
つまり、有理数でもよいというのはこういうことです。
続いて、x2の係数を0にしたいので、X=x+b/3aとします。
なんでいきなりこんなことするの?と思われるが、xをX-b/3aで置き換えて、展開していくと、見事にx2の係数が0になり、その項を消滅させることが出来る。
x2の項がなくなると、新たな展開が見えてくる。
Xをさらにu+vとおくところが、カルダノの解法の真骨頂なのだが、これはカルダノさんが考え付いたわけじゃないんだよね。
詳しいことは後で書くね。
さて、私は
X3+pX+q=0
という形で話しを進めたが、ネットや本などでは、pやqに更に係数を付けているものを見かける。
その辺りも解説しておこう。
一応、a)~d)までの4パターンを書いてみた。
何が言いたいかというと、xnの式がシンプルにするためということ。
プログラムとしても、pやqを予め整数で割っておくということで、複素数になってから割るよりも誤差が少ないかもしれません。
さて、この式の成り立ちがわかったところで、3次方程式の解を求めるプログラムを作るには何が必要なのかが見えてきました。
pとqは有理数であるから、平方根の中の判別式D=81q2+12p3も有理数。
Dが負になると、立方根の中は複素数となるので、複素数の立方根を求めるプログラムが必要だとわかる。
これは、ド・モアブルの定理から求めることができる。
ω0=1だが、ω1、ω2は複素数となるため、複素数同士の乗算、複素数から有理数の減算、と思ったよりも実装するものは少なくて良さそうですね。
PS:
ここでは、カルダノの解法と書いているが、実はカルダノさんが発見したものではありません。
タルタリアさんが考えた方法を、カルダノさんが教えて教えてとせがむものだから、と内緒で聞いたのにも関わらず、本に書いちゃったんだよな。
なので、タルタリアの解法として広めたほうがいいよね。
さらに、弟子のフェラーリは4次方程式の解法を見つけちゃうわけだから、なんともね。
カルダノさん、現代の呼び方なら、カルダーノの方が近いかな。
ジローラモ・カルダーノさんなんですよね。
カルダノさんは数学者でもあるんだけど、医者でもある。
お父さんは数学者で、ダヴィンチさんとお友達だそうです。
まずは敵情視察である。
出来るだけ、端折らずに淡々と計算していく。
ブログ内で数式を扱うのは面倒なので、パワポで書いたものを貼っていく。
まず、
ax3+bx2+cx+d=0
この多項式の係数a,b,c,dは、プログラム内部では整数とします。
まぁ、有理数でもいいんだけど、整数ということにしておこう。
有理数とするならば、有理数クラスを実装しなければならないな。
まず、この多項式が3次方程式であるために、aは0であってはなりません。
当たり前ですが、書いておきます。
いきなりですが、x3の係数は1にしたいので、各項をaで割る。
つまり、有理数でもよいというのはこういうことです。
続いて、x2の係数を0にしたいので、X=x+b/3aとします。
なんでいきなりこんなことするの?と思われるが、xをX-b/3aで置き換えて、展開していくと、見事にx2の係数が0になり、その項を消滅させることが出来る。
x2の項がなくなると、新たな展開が見えてくる。
Xをさらにu+vとおくところが、カルダノの解法の真骨頂なのだが、これはカルダノさんが考え付いたわけじゃないんだよね。
詳しいことは後で書くね。
さて、私は
X3+pX+q=0
という形で話しを進めたが、ネットや本などでは、pやqに更に係数を付けているものを見かける。
その辺りも解説しておこう。
一応、a)~d)までの4パターンを書いてみた。
何が言いたいかというと、xnの式がシンプルにするためということ。
プログラムとしても、pやqを予め整数で割っておくということで、複素数になってから割るよりも誤差が少ないかもしれません。
さて、この式の成り立ちがわかったところで、3次方程式の解を求めるプログラムを作るには何が必要なのかが見えてきました。
pとqは有理数であるから、平方根の中の判別式D=81q2+12p3も有理数。
Dが負になると、立方根の中は複素数となるので、複素数の立方根を求めるプログラムが必要だとわかる。
これは、ド・モアブルの定理から求めることができる。
ω0=1だが、ω1、ω2は複素数となるため、複素数同士の乗算、複素数から有理数の減算、と思ったよりも実装するものは少なくて良さそうですね。
PS:
ここでは、カルダノの解法と書いているが、実はカルダノさんが発見したものではありません。
タルタリアさんが考えた方法を、カルダノさんが教えて教えてとせがむものだから、と内緒で聞いたのにも関わらず、本に書いちゃったんだよな。
なので、タルタリアの解法として広めたほうがいいよね。
さらに、弟子のフェラーリは4次方程式の解法を見つけちゃうわけだから、なんともね。
カルダノさん、現代の呼び方なら、カルダーノの方が近いかな。
ジローラモ・カルダーノさんなんですよね。
カルダノさんは数学者でもあるんだけど、医者でもある。
お父さんは数学者で、ダヴィンチさんとお友達だそうです。