らんだむな記憶

blogというものを体験してみようか!的なー

多項式の根

import numpy as np

print np.roots([1, 2, 3, 4, 5, 1, -3, 2])
[ 0.34523851+1.4618159j   0.34523851-1.4618159j  -1.10377352+1.06074637j
 -1.10377352-1.06074637j -1.31561780+0.j          0.41634391+0.33791178j
  0.41634391-0.33791178j]

数値計算で求めているんだろうな。5次以上の代数多項式には一般解の公式はないから代数的には解けない。しかるにこの7次の多項式の根が7個得られるというのだから、代数的には解いていない。
代数学の基本定理により複素数の範囲で根が求まるということで、7つの根が求まるのはそうなのだが、どうやっているのかな?実部と虚部に分けて、ニュートン法でそれぞれ求めて組み合わせるのかな??

studyのため、$a > 0$として、次の実数係数の2次方程式を考えてみよう。
根を$x + iy,\ x,y \in \R$ として、
\begin{align}
a(x+iy)^2 + b(x+iy) + c &= 0 \\
(ax^2 + bx + c - ay^2) + iy(2ax + b) &= 0
\end{align}

虚部の評価より、$y = 0$か$x = -b/2a$が考えられる。
$y = 0$とすると、$ax^2 + bx + c = 0$の実根を求めることに帰着する。判別式が$b^2 - 4ac < 0$なら実根が求まらないから$y \neq 0$となって、$x = -b/2a$となる。
この時、$y^2 = \frac{1}{a}\{\frac{b^2}{4a} - \frac{b^2}{2a} + c\} = \frac{-(b^2 - 4ac)}{4a^2}$を解けば良いが、右辺は正の実数なので、
\begin{equation}
y = \pm \frac{\sqrt{-(b^2 - 4ac)}}{2a}
\end{equation}

となる。結局$b^2 - 4ac < 0$の場合の2つの虚数解は
\begin{equation}
x + iy = -\frac{b}{2a} \pm i \frac{\sqrt{-(b^2 - 4ac)}}{2a} = -\frac{b}{2a} \mp \frac{\sqrt{b^2 - 4ac}}{2a}
\end{equation}

となる。ということで、中学くらいで習う「解の公式」の形になりましたねっと。

2次方程式の場合は簡単だけど、高次の方程式の場合、未知変数が2個なのでなんかちょっと面倒臭そう。
2変数のニュートン法というのもあるようなので、原理的には、それで実部と虚部をがしがし処理して矛盾の起きないケースが求める根として定まりそうな気はするね、ということでこれ以上は面倒くさいので追求しない。numpy.roots がよろしくやってくれるさ!