{ "cells": [ { "cell_type": "markdown", "id": "a63c47e6", "metadata": {}, "source": [ "# 三次方程式を解く\n", "\n", "カルダノの方法では、まずモニックな三次方程式を変数変換し、二次項のない\n", "次の形にします。\n", "\n", "$$\n", "y^3+py+q=0.\n", "$$\n", "\n", "$y=(s_1+s_2)/3$ とおくと、$s_1^3$ と $s_2^3$ は次の二次方程式の解になります。\n", "\n", "$$\n", "t^2+27qt-27p^3=0.\n", "$$\n", "\n", "三つの解は、1の3乗根 $\\omega=(-1+i\\sqrt3)/2$ を使って得られます。\n" ] }, { "cell_type": "markdown", "id": "50a2b9c2", "metadata": {}, "source": [ "## Egisonによるカルダノの構成\n", "\n", "最初のmatch節は、二次項のない三次方程式を扱います。第2の節は変数変換\n", "$x=y-b/3$ を行い、最後の節は最高次係数で割ります。小さな型付き二次方程式\n", "ソルバーも定義することで、このノートブックだけで計算を完結させています。\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "1d39eec2", "metadata": {}, "outputs": [], "source": [ "declare symbol x, a, b, c, d, p, q: MathValue\n", "\n", "def quadraticRoots\n", " (a : MathValue)\n", " (b : MathValue)\n", " (c : MathValue)\n", " : (MathValue, MathValue) :=\n", " ( ((- b) + sqrt (b ^ 2 - 4 * a * c)) / (2 * a)\n", " , ((- b) - sqrt (b ^ 2 - 4 * a * c)) / (2 * a) )\n", "\n", "def omega : MathValue := ((-1) + i * sqrt 3) / 2\n", "\n", "def cubicFormula : MathValue -> MathValue -> (MathValue, MathValue, MathValue) := cF\n", "\n", "def cF (f : MathValue) (x : MathValue) : (MathValue, MathValue, MathValue) :=\n", " match coefficients f x as list mathValue with\n", " | [$a_0, $a_1, $a_2, $a_3] -> cF' a_3 a_2 a_1 a_0\n", "\n", "def cF'\n", " (a : MathValue)\n", " (b : MathValue)\n", " (c : MathValue)\n", " (d : MathValue)\n", " : (MathValue, MathValue, MathValue) :=\n", " match (a, b, c, d) as (mathValue, mathValue, mathValue, mathValue) with\n", " | (#1, #0, $p, $q) ->\n", " let (s1, s2) := (2)#(rt 3 $1, rt 3 $2)\n", " (quadraticRoots 1 (27 * q) ((-27) * p ^ 3))\n", " in ( (s1 + s2) / 3\n", " , (omega ^ 2 * s1 + omega * s2) / 3\n", " , (omega * s1 + omega ^ 2 * s2) / 3 )\n", " | (#1, _, _, _) ->\n", " (3)#($1 - b / 3, $2 - b / 3, $3 - b / 3)\n", " (withSymbols [x, y]\n", " cF\n", " (substitute\n", " [(x, y - b / 3)]\n", " (x ^ 3 + b * x ^ 2 + c * x + d))\n", " y)\n", " | (_, _, _, _) -> cF' 1 (b / a) (c / a) (d / a)\n" ] }, { "cell_type": "markdown", "id": "72b5302d", "metadata": {}, "source": [ "## 二次項のない三次方程式\n", "\n", "$p$ と $q$ を記号のまま保つと、カルダノの公式に現れる冪根が出力にそのまま\n", "現れます。タプルの三つの成分は、$\\omega$ の冪だけが異なります。\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "4a7f8b9c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "$(\\frac{1}{3} \\sqrt[3]{\\frac{3}{2} \\sqrt{4 p^{3} + 27 q^{2}} \\sqrt{3} + \\frac{-27}{2} q} + \\frac{1}{3} \\sqrt[3]{\\frac{-3}{2} \\sqrt{4 p^{3} + 27 q^{2}} \\sqrt{3} + \\frac{-27}{2} q}, \\frac{-1}{3} \\sqrt[3]{\\frac{3}{2} \\sqrt{4 p^{3} + 27 q^{2}} \\sqrt{3} + \\frac{-27}{2} q} w + \\frac{1}{3} \\sqrt[3]{\\frac{-3}{2} \\sqrt{4 p^{3} + 27 q^{2}} \\sqrt{3} + \\frac{-27}{2} q} w + \\frac{-1}{3} \\sqrt[3]{\\frac{3}{2} \\sqrt{4 p^{3} + 27 q^{2}} \\sqrt{3} + \\frac{-27}{2} q}, \\frac{1}{3} \\sqrt[3]{\\frac{3}{2} \\sqrt{4 p^{3} + 27 q^{2}} \\sqrt{3} + \\frac{-27}{2} q} w + \\frac{-1}{3} \\sqrt[3]{\\frac{-3}{2} \\sqrt{4 p^{3} + 27 q^{2}} \\sqrt{3} + \\frac{-27}{2} q} w + \\frac{-1}{3} \\sqrt[3]{\\frac{-3}{2} \\sqrt{4 p^{3} + 27 q^{2}} \\sqrt{3} + \\frac{-27}{2} q})$" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cF (x ^ 3 + p * x + q) x\n" ] }, { "cell_type": "markdown", "id": "589dbd2e", "metadata": {}, "source": [ "## 変数変換を実際に試す\n", "\n", "次の多項式は、解があらかじめ分かるよう因数分解した形で記述します。Egisonは\n", "それを展開し、係数を取り出し、二次項を消去してから、三つの解をすべて\n", "再構成します。\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "4950d42b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "$(2, \\frac{2}{3} \\sqrt{3} i w + \\frac{1}{3} \\sqrt{3} i + 2, \\frac{-2}{3} \\sqrt{3} i w + \\frac{-1}{3} \\sqrt{3} i + 2)$" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cF ((x - 1) * (x - 2) * (x - 3)) x\n" ] }, { "cell_type": "markdown", "id": "9b283169", "metadata": {}, "source": [ "## 一般の最高次係数\n", "\n", "同じ関数で、すべての係数が記号である非モニック三次式\n", "$ax^3+bx^2+cx+d$ も扱えます。最初に $a$ で割って正規化します。\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "cff92e77", "metadata": {}, "outputs": [ { "data": { "text/html": [ "$(\\frac{-1}{3} a^{-1} b + \\frac{1}{3} \\sqrt[3]{-b^{3} + \\frac{-27}{2} a^{2} d + \\frac{9}{2} a b c + \\frac{3}{2} \\sqrt{4 b^{3} d - b^{2} c^{2} + 27 a^{2} d^{2} + 4 a c^{3} - 18 a b c d} \\sqrt{3} a} a^{-1} + \\frac{1}{3} \\sqrt[3]{-b^{3} + \\frac{-27}{2} a^{2} d + \\frac{9}{2} a b c + \\frac{-3}{2} \\sqrt{4 b^{3} d - b^{2} c^{2} + 27 a^{2} d^{2} + 4 a c^{3} - 18 a b c d} \\sqrt{3} a} a^{-1}, \\frac{-1}{3} \\sqrt[3]{-b^{3} + \\frac{-27}{2} a^{2} d + \\frac{9}{2} a b c + \\frac{3}{2} \\sqrt{4 b^{3} d - b^{2} c^{2} + 27 a^{2} d^{2} + 4 a c^{3} - 18 a b c d} \\sqrt{3} a} a^{-1} w + \\frac{1}{3} \\sqrt[3]{-b^{3} + \\frac{-27}{2} a^{2} d + \\frac{9}{2} a b c + \\frac{-3}{2} \\sqrt{4 b^{3} d - b^{2} c^{2} + 27 a^{2} d^{2} + 4 a c^{3} - 18 a b c d} \\sqrt{3} a} a^{-1} w + \\frac{-1}{3} a^{-1} b + \\frac{-1}{3} \\sqrt[3]{-b^{3} + \\frac{-27}{2} a^{2} d + \\frac{9}{2} a b c + \\frac{3}{2} \\sqrt{4 b^{3} d - b^{2} c^{2} + 27 a^{2} d^{2} + 4 a c^{3} - 18 a b c d} \\sqrt{3} a} a^{-1}, \\frac{1}{3} \\sqrt[3]{-b^{3} + \\frac{-27}{2} a^{2} d + \\frac{9}{2} a b c + \\frac{3}{2} \\sqrt{4 b^{3} d - b^{2} c^{2} + 27 a^{2} d^{2} + 4 a c^{3} - 18 a b c d} \\sqrt{3} a} a^{-1} w + \\frac{-1}{3} \\sqrt[3]{-b^{3} + \\frac{-27}{2} a^{2} d + \\frac{9}{2} a b c + \\frac{-3}{2} \\sqrt{4 b^{3} d - b^{2} c^{2} + 27 a^{2} d^{2} + 4 a c^{3} - 18 a b c d} \\sqrt{3} a} a^{-1} w + \\frac{-1}{3} a^{-1} b + \\frac{-1}{3} \\sqrt[3]{-b^{3} + \\frac{-27}{2} a^{2} d + \\frac{9}{2} a b c + \\frac{-3}{2} \\sqrt{4 b^{3} d - b^{2} c^{2} + 27 a^{2} d^{2} + 4 a c^{3} - 18 a b c d} \\sqrt{3} a} a^{-1})$" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cF (a * x ^ 3 + b * x ^ 2 + c * x + d) x\n" ] }, { "cell_type": "markdown", "id": "62238a8e", "metadata": {}, "source": [ "## まとめ\n", "\n", "係数のパターン、代入、解の置換を直接操作できると、カルダノの公式を短い実行可能な\n", "導出として表せます。三つの代数的な分岐は汎用ソルバーの内部に隠れず、明示された\n", "ままです。\n" ] } ], "metadata": { "kernelspec": { "display_name": "Egison", "language": "egison", "name": "egison" }, "language_info": { "codemirror_mode": "egison", "file_extension": ".egi", "mimetype": "text/x-egison", "name": "egison" } }, "nbformat": 4, "nbformat_minor": 5 }