packages feed

egison-5.0.0: sample/math/algebra/quadratic-equation.egi

-- Quadratic Formula

declare symbol x, a, b, c

def quadraticFormula : MathExpr -> MathExpr -> (MathExpr, MathExpr) := qF

def qF (f: MathExpr) (x: MathExpr) : (MathExpr, MathExpr) :=
  match coefficients f x as list mathExpr with
    | [$a_0, $a_1, $a_2] -> qF' a_2 a_1 a_0

def qF' (a: MathExpr) (b: MathExpr) (c: MathExpr) : (MathExpr, MathExpr) :=
  match (a, b, c) as (mathExpr, mathExpr, mathExpr) with
    | (#1, #0, _) -> (sqrt (- c), - sqrt (- c))
    | (#1, _, _) ->
      (2)#((- (b / 2)) + $1, (- (b / 2)) + $2)
        (withSymbols [x, y]
          qF (substitute [(x, y - b / 2)] (x ^ 2 + b * x + c)) y)
    | (_, _, _) -> qF' 1 (b / a) (c / a)

assertEqual "x^2 + x + 1"
  (qF (x ^ 2 + x + 1) x)
  ((-1 + i * sqrt 3) / 2, (-1 - i * sqrt 3) / 2)

assertEqual "x^2 + b*x + c"
  (qF (x ^ 2 + b * x + c) x)
  ((- b + sqrt (b^2 - 4 * c)) / 2, (- b - sqrt (b^2 - 4 * c)) / 2)

assertEqual "a*x^2 + b*x + c"
  (qF (a * x ^ 2 + b * x + c) x)
  ((- b + sqrt (b^2 - 4 * a * c)) / (2 * a), (- b - sqrt (b^2 - 4 * a * c)) / (2 * a))

assertEqual "a*x^2 + 2*b*x + c"
  (qF (a * x ^ 2 + 2 * b * x + c) x)
  ((- b + sqrt (b^2 - a * c)) / a, (- b - sqrt (b^2 - a * c)) / a)