二次方程式を解く¶
二次方程式
$$ ax^2+bx+c=0,\qquad a\ne0, $$
の二つの解は、次の公式で与えられます。
$$ x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}. $$
例ごとに解を個別に入力するのではなく、Egisonプログラムで多項式の係数を読み取り、 判別式を組み立て、一つの型付き記号計算ソルバーを適用します。
係数と判別式¶
Egisonの coefficients 関数は、次数の昇順で係数を返します。したがって、 パターン $[a_0,a_1,a_2]$ は $a_2x^2+a_1x+a_0$ を認識します。補助関数では、 分母を払った判別式 $b^2-4ac$ をそのまま保ち、分母を明示的に $2a$ として まとめます。
declare symbol x, a, b, c: MathValue
def solveQuadraticCoefficientsDemo
(a : MathValue)
(b : MathValue)
(c : MathValue)
: (MathValue, MathValue) :=
let discriminant := b ^ 2 - 4 * a * c
in ( ((- b) + sqrt discriminant) / (2 * a)
, ((- b) - sqrt discriminant) / (2 * a) )
def solveQuadraticDemo
(f : MathValue)
(x : MathValue)
: (MathValue, MathValue) :=
match coefficients f x as list mathValue with
| [$a_0, $a_1, $a_2] ->
solveQuadraticCoefficientsDemo a_2 a_1 a_0
円分多項式の例¶
多項式 $x^2+x+1$ の判別式は $-3$ です。その解は、二つの1の原始3乗根です。
solveQuadraticDemo (x ^ 2 + x + 1) x
記号のまま得られる公式¶
$a$、$b$、$c$ を記号のままにすると、特別な整形コードを使わなくても通常の 判別式がそのまま現れます。
solveQuadraticDemo (a * x ^ 2 + b * x + c) x
solveQuadraticDemo (a * x ^ 2 + 2 * b * x + c) x
まとめ¶
パターンマッチと型付き補助関数により、計算を見通しのよい二段階に分けられます。 まず多項式の係数を読み取り、次に判別式と、その平方根の正負両方を組み立てます。 表示される解は事前計算した出力を埋め込んだものではなく、各入力多項式から 実際に生成されたものです。