二次方程式を解く

二次方程式

$$ 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
$(\frac{1}{2} \sqrt{3} i + \frac{-1}{2}, \frac{-1}{2} \sqrt{3} i + \frac{-1}{2})$

記号のまま得られる公式

$a$、$b$、$c$ を記号のままにすると、特別な整形コードを使わなくても通常の 判別式がそのまま現れます。

solveQuadraticDemo (a * x ^ 2 + b * x + c) x
$(\frac{-1}{2} a^{-1} b + \frac{1}{2} \sqrt{b^{2} - 4 a c} a^{-1}, \frac{-1}{2} a^{-1} b + \frac{-1}{2} \sqrt{b^{2} - 4 a c} a^{-1})$

便利な係数の取り方

一次の係数を $2b$ と書けば、同値で簡潔な次の形が得られます。

$$ x=\frac{-b\pm\sqrt{b^2-ac}}{a}. $$

solveQuadraticDemo (a * x ^ 2 + 2 * b * x + c) x
$(-a^{-1} b + \sqrt{b^{2} - a c} a^{-1}, -a^{-1} b - \sqrt{b^{2} - a c} a^{-1})$

まとめ

パターンマッチと型付き補助関数により、計算を見通しのよい二段階に分けられます。 まず多項式の係数を読み取り、次に判別式と、その平方根の正負両方を組み立てます。 表示される解は事前計算した出力を埋め込んだものではなく、各入力多項式から 実際に生成されたものです。

リンク

Egison 数学ノート目次に戻る