{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3f99e1f1-a2a6-4058-96fa-4ac8c394cdab",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Python入門講座(第12回)：数式処理(sympy)\n",
    "\n",
    "pythonの強みの一つは世界中の開発者によって開発された豊富なライブラリ(モジュール）です。\n",
    "\n",
    "数値処理には、基本的な機能を提供し、その他のモジュールのベースとして広く使われている`numpy`、グラフ生成の`matplotlib`,\n",
    "それらの基盤の上に構築された高機能な`pandas`などがよく使われます。また、機械学習の分野では`TensorFlow`,`PyTorch`, `Keras`などが知られています。\n",
    "\n",
    "Pythonには数値計算だけでなく, `Mathematica`や`maxima`のように数式を記号のまま取り扱うモジュール, `sympy` も存在しています。\n",
    "つまり、`sympy`　では、次の例のように（数値ではなく）数式そのものを取り扱うことができます。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a3506a20-8023-4384-9a1f-786c98f3dd1c",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## sympyの見本\n",
    "sympyでの処理の例をみてみましょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ac2d200e-4128-4c47-95f9-1a11f8bdd7e0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x - 1\\right) \\left(x + 1\\right)$"
      ],
      "text/plain": [
       "(x - 1)*(x + 1)"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import *\n",
    "var('x')\n",
    "expr=(x+1)*(x-1)\n",
    "expr"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "990e24a0-d996-4d57-a1f8-6c866b09bca6",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "数式を展開することもできます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "907fe28a-508b-42bf-acb1-7398d2006773",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} - 1$"
      ],
      "text/plain": [
       "x**2 - 1"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.expand()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2b2499dc-aa20-4955-98a9-9b133b4cd482",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "逆に因数分解することも、"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2ff037f8-b459-4a92-8298-82383127c813",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x - 1\\right) \\left(x + 1\\right)$"
      ],
      "text/plain": [
       "(x - 1)*(x + 1)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "_.factor()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bed41108-7dcd-4ced-9cb2-5b290362a09b",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "三角関数を含む式の変換だって、"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5ebf090e-88df-4552-ad9e-13d453fb4693",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\sin{\\left(2 x \\right)}}{2}$"
      ],
      "text/plain": [
       "sin(2*x)/2"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=sin(x)*cos(x)\n",
    "expr.simplify()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a776982e-6a83-4db6-b33e-4e155d49a94c",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## [`sympy`][sympy documentation]でできること\n",
    "\n",
    "[`sympy`][sympy documentation]には次のような機能があります([sympy チュートリアル])。 \n",
    "\n",
    "    * 数式処理：数式の展開(expand), 整理(simplify)、因数分解(factor)\n",
    "    * 方程式の解を求める。 (solve)\n",
    "    * 式のままの微分、積分 (diff, integrate)\n",
    "    * 行列計算 (Matrix)\n",
    "    * プロット (plot, plot_implicit, plot_parametric,...)\n",
    "    * その他 (physics, control, ....)\n",
    "[sympy チュートリアル]: http://certik.github.io/scipy-2013-tutorial/html/tutorial/basic_operations.html\n",
    "[sympy documentation]: https://docs.sympy.org/latest/index.html"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bbdd8eb3-32b8-457d-b90e-eed25c01c46d",
   "metadata": {},
   "source": [
    "というように数式そのものを計算対象として取り扱えます。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1433ec7c-4265-4c8d-a5b8-ae98656fe78f",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## [SympyとSageMath][SympyとSageの違い]\n",
    "\n",
    "pythonをベースにした数式処理システムとして`SageMath`もよく知られています。\n",
    "\n",
    "`SageMath`は:\n",
    "\n",
    "1. `Jupyter`を使った`Mathematica`ライクな`Notebook`インタフェースを備えたシステムです。\n",
    "1. `sage`コマンドでコマンドラインからの利用もできます。\n",
    "1. `SageMath`は`sympy`や`maxima`,`R`など複数のライブラリを統合して、一つのシステムとしてまとめ上げています。 \n",
    "1. プログラム言語としては`python`を基本としていますが、数式処理に合わせた拡張(変更）が行われた独自の言語となっています。\n",
    "\n",
    "[SympyとSageの違い]: https://stackoverflow.com/questions/17847902/what-is-the-difference-between-sympy-and-sage\n",
    "\n",
    "[isympyはIPythonをつかったsympy実行環境]: https://docs.sympy.org/latest/modules/interactive.html?highlight=isympy\n",
    "\n",
    "今回は `sympy`を使ったpythonでの数式処理だけをご紹介します。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4a3251a-0a31-42f6-8dad-a53b8580514a",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## `sympy`を使うための準備\n",
    "### `sympy`のインストール\n",
    "`sympy`は標準配布には含まれていないので、利用環境毎にインストールが必要です。\n",
    "\n",
    "インターネットに接続された計算機環境で、\n",
    "``` shell\n",
    "python3 -m pip install sympy\n",
    "```\n",
    "を実行します。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3b2451dd-ec40-45fa-a91c-bd5fa1c8d173",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### モジュールのインポート\n",
    "`sympy`を利用するpythonプログラムでは、`sympy`をインポートしておきます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "7302cdaf-2a8a-4e7a-a8d5-3dac6aedb3aa",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sympy\n",
    "from sympy import var, solve, dsolve, plot, Matrix # from sympy import *　でもよい\n",
    "from sympy import plot, plot_implicit, plot_parametric"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93a488e2-ae46-40c1-a408-df4459660246",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "###  モジュールのバージョン\n",
    "モジュールのバージョンは、そのモジュールの \"\\_\\_version\\_\\_\" で確認します。\n",
    "(Python処理系のバージョンは、sys.version_infoなどで確認します。）\n",
    "\n",
    "インターネット上のドキュメントを利用する際には、そのドキュメントが対象とするバージョンと利用中のモジュールのバージョン\n",
    "が一致していることを、確認しましょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "20846bb3-a94e-4edf-adc3-314638ec88a4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sympy version: 1.9\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "('1.9',\n",
       " sys.version_info(major=3, minor=9, micro=10, releaselevel='final', serial=0),\n",
       " '3.9.10 (v3.9.10:f2f3f53782, Jan 13 2022, 16:55:45) \\n[Clang 13.0.0 (clang-1300.0.29.30)]')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(\"sympy version:\", sympy.__version__)\n",
    "import sys\n",
    "sympy.__version__, sys.version_info, sys.version"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0347a380-b831-4863-b5af-5a974d969e24",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# `sympy`を使ってみよう。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cecedd59-9e9f-452a-a9b4-9ea9b87bc56e",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## `sympy`のシンボル（数式中の変数を表す記号）\n",
    "\n",
    "  * `sympy`で数式を操作する際には、数式の中に現れる記号(シンボル）の名前 (例えば、$x^2 - y^2$ の $x$ や $y$ ) を宣言しておく必要があります。 これには通常`var`関数が使われます。\n",
    "    * `var`関数の引数は数式で使われる変数名(`Symbol`)を並べた文字列です。\n",
    "    * 文字列では、空白あるいはコンマ(',')を区切り文字として使い複数のシンボル名を一度に宣言できます。\n",
    "  *`var()`を実行すると、文字列中の変数名のシンボルが作成され、**同名のpythonの変数**に割り当てられます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a49518c3-3225-4755-8583-4af266bc28f7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(x, y, z, t)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#数式で使用するシンボルを定義します。\n",
    "from sympy import var,symbols\n",
    "var('x y z t')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "e6eb31b6-89fb-4a48-9249-d9a55757bc4a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(sympy.core.symbol.Symbol, 'x')"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(x),x.name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "2cc2ffea-eabe-475b-bde7-b619ea8aa53c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a*b + c*d\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a b + c d$"
      ],
      "text/plain": [
       "a*b + c*d"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('a b c d')\n",
    "print( a*b + c*d)\n",
    "a*b + c*d # jupyter+sympy では出力をLaTex形式を使って表示します。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b335a00b-9208-46c0-a41a-e96ca6e5a9ad",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "`var`関数呼び出しは、`<name> = symbols(\"<name>\")`と等価です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "9b88f465-ae02-4d8a-98a9-60a4783cca60",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3 a$"
      ],
      "text/plain": [
       "3*a"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('a')\n",
    "asym=symbols('a')\n",
    "aSym=Symbol('a')\n",
    "a+asym+aSym"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b6cd4b96-b109-4b0d-8b4b-c0a0c26a88b9",
   "metadata": {},
   "source": [
    "pythonの変数 `a` には名前が 'a'であるSymbolオブジェクトが割り当てられていることを確認してみましょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "c80d155f-bdc9-4ae5-8b1e-26e89777a086",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(sympy.core.symbol.Symbol, 'a')"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(a), a.name"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83a8f40b-16b8-4ce3-9644-f778c9378053",
   "metadata": {},
   "source": [
    "`symbols()`は`var()`と同じく複数の記号名を登録できます。\n",
    "\n",
    "`Symbol()`は一つのシンボルだけを登録します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "4d118a90-2a04-40cf-899a-0e270f4c6917",
   "metadata": {},
   "outputs": [],
   "source": [
    "a,b,c,d=symbols('a b c d')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "77fc7278-b8e9-4008-8b38-79c55ce20107",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a \\left(a b^{2} c^{2} d^{2} + 2 a b c d + a + a b c d\\right)$"
      ],
      "text/plain": [
       "a*(a*b**2*c**2*d**2 + 2*a*b*c*d + a + a b c d)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "abcd=Symbol('a b c d')\n",
    "((a+a*b*c*d)**2+a*abcd).factor()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "75a1d9a6-6696-462a-9d60-3d94b0924c88",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### 注意：\n",
    "\n",
    "* pythonの変数名`a`と`Symbol` 'a'の関係は固定されたものではないことに注意しましょう。\n",
    "* pythonの変数`a`はいつでも別のオブジェクトに再割り当てすることができます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "0565413e-0569-43d8-95df-84955b23acad",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'sympy.core.symbol.Symbol'> a\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a \\left(a + b\\right)$"
      ],
      "text/plain": [
       "a*(a + b)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('a b c')\n",
    "u=a; v=b\n",
    "print(type(u),u.name)\n",
    "u*(a+v)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fc186253-6811-4477-aaa1-a00fadcaaf8f",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## LaTeX表示\n",
    "* Notebook環境では、セルの値となる数式はLaTeX(MathJax)を使った数式として表示されます。\n",
    "* `sympy`の`latex`関数を使って、数式のLaTex表現の文字列を入手できます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "e3891b65-bf6a-4207-85d8-8af6f4ad2a82",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sqrt(a*b + c*d)\n",
      "\\sqrt{a b + c d}\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{a b + c d}$"
      ],
      "text/plain": [
       "sqrt(a*b + c*d)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import latex\n",
    "var('a b c d')\n",
    "print((sqrt(a*b + c*d)))\n",
    "print(latex(sqrt(a*b + c*d)))\n",
    "sqrt(a*b + c*d)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3b2916c1-f645-4448-9926-da941a209739",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### ギリシャ文字\n",
    "名前がギリシャ文字名のシンボルは、jupyter Notebookではギリシャ文字で表示されます。\n",
    "$\\lambda$(`\\lambda`)を使う際にはpythonの予約語`lambda`との衝突を避けるため、`lambda_`とするなどの注意が必要です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "08d4c7c1-9c79-45df-816f-a92c8ea4ef37",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle A B \\Gamma_{\\mu} + \\alpha \\sin^{2}{\\left(\\varphi \\right)} \\cos{\\left(\\phi \\right)} + \\ell \\sqrt{\\lambda_{}} \\tan{\\left(\\rho \\right)}$"
      ],
      "text/plain": [
       "Alpha*Beta*Gamma_mu + alpha*sin(varphi)**2*cos(phi) + ell*sqrt(lambda_)*tan(rho)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('x y z t u v varphi alpha phi ell rho lambda_  Alpha Beta Gamma_mu ') # lambda_は予約語lambdaとの衝突をさけるため\n",
    "sin(varphi)**2 * alpha * cos(phi) + ell * tan(rho) * sqrt(lambda_) + Alpha*Beta*Gamma_mu"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50b31722-38e7-4be9-807f-42f616cc0ec0",
   "metadata": {},
   "source": [
    "`Symbol`関数を使うことで、変数名とシンボルとして印刷されるときの名前を変えておくこともできます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "5932c7de-04e2-4fcb-99ae-861b47694932",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\lambda^{2}$"
      ],
      "text/plain": [
       "\\lambda**2"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lambda_=Symbol(\"\\lambda\")\n",
    "lambda_**2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "02315efd-245e-4c51-8c7d-32d05590e16c",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "LaTeXあるいはMathJaxで結果を利用したい場合には `latex()`関数でLaTeX表記の文字列を入手しましょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "7ddd2aeb-ff63-477a-b48f-30df29b93fba",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\\sqrt{\\lambda} \\ell \\tan{\\left(\\rho \\right)} + \\alpha \\sin^{2}{\\left(\\varphi \\right)} \\cos{\\left(\\phi \\right)}\n"
     ]
    }
   ],
   "source": [
    "print(latex(sin(varphi)**2 * alpha * cos(phi) + ell * tan(rho) * sqrt(lambda_) ))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "59e7594a-c1e7-4605-8587-b11e7b44b9e5",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "余談::\n",
    "ギリシャ文字あるいはアルファベットの一文字を名前とするシンボルは`sympy.abc`モジュールに定義済みです。 `sympy.abc._clash`に含まれる名前は,`sympy`で定義されている変数と`sympy.abc`で定義されている名前で競合が発生するので、注意が必要です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "a350ffb0-8a24-424d-a2e8-882bd87ef925",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['O', 'Q', 'N', 'I', 'E', 'S', 'beta', 'zeta', 'gamma', 'pi'])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import sympy.abc\n",
    "sympy.abc._clash.keys()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3f160421-f85d-4e47-8a5e-b5f21b08c515",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 式の展開(`expand`)、整理(`simplify`)、因数分解(`factor`)\n",
    "記号として $x$, $y$ を使った数式を考えてみます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "c9a4e142-eb23-4f99-8b7b-0c21f8f2f4f7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x - y\\right) \\left(x^{2} + x y + y^{2}\\right)$"
      ],
      "text/plain": [
       "(x - y)*(x**2 + x*y + y**2)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('x y')\n",
    "expr=(x**2 + x*y + y**2)*(x-y)\n",
    "expr"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ba29f17-6f26-4964-8246-01a9979d5d00",
   "metadata": {},
   "source": [
    "このように、sympyでは数式自体が計算結果となります。\n",
    "`type()`関数で調べてみると、`expr`の中身は数値ではなく、`sympy`のオブジェクトであることがわかります(ここでは、`sympy.core.mul.Mul`オブジェクトなっています)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "c6fa6f5a-2c8b-4e64-9e48-0125e4dfed62",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "sympy.core.mul.Mul"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(expr)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f8875e9c-720e-47ed-9998-12e025c6fd88",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "この数式を展開(`.expand()`)してみましょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "3ca80497-372a-463f-988d-38952227f479",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{3} - y^{3}$"
      ],
      "text/plain": [
       "x**3 - y**3"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=expr.expand()\n",
    "expr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "a71a1447-a61c-407c-8664-042055d91c81",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'sympy.core.add.Add'>\n"
     ]
    }
   ],
   "source": [
    "print(type(expr))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ea2aa4f9-c4eb-4658-aae5-ebbafe8944d0",
   "metadata": {},
   "source": [
    "この式は`sympy.core.add.Add`オブジェクトになっています。多項式は、積(`sympy.core.mul.Mul`)で作られた単項を足し合わせ(`sympy.core.add.Add`)て作られていることがわかります。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "55a7eccb-1bdb-4af1-9508-5ee86b812783",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "此の式を因数分解(`.factor()`)してみると、"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "4dac6db4-4d5a-4f4b-a260-4812ce8b72d1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'sympy.core.mul.Mul'>\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x - y\\right) \\left(x^{2} + x y + y^{2}\\right)$"
      ],
      "text/plain": [
       "(x - y)*(x**2 + x*y + y**2)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=expr.factor()\n",
    "print(type(expr))\n",
    "expr"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a817ea36-f1a6-4700-b19b-04141012c2bd",
   "metadata": {},
   "source": [
    "となります。なお、`factor`, `expand`は関数としても利用できます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "9b71df3d-b03a-4a87-8bb8-2942a97eb871",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{3} - y^{3}$"
      ],
      "text/plain": [
       "x**3 - y**3"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "388eca2d-8b1b-468b-84ea-1faa106402db",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x - y\\right) \\left(x^{2} + x y + y^{2}\\right)$"
      ],
      "text/plain": [
       "(x - y)*(x**2 + x*y + y**2)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(expand(expr))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7df4236-22f0-479c-9833-21f474b7b0ec",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### 数式の整理:simplify()\n",
    "式の簡素化に`.simplify()`メソッドが用意されています。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "ca320100-7798-4f54-b5a2-6720829f0675",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{3} - y^{3}$"
      ],
      "text/plain": [
       "x**3 - y**3"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.simplify()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "40f2eea5-81d4-4a58-97a3-08ee1b7c99f0",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 変数への代入(substitute)\n",
    "式の変数を別の値で置き換えた式をつくるには、`.subs`メソッドを使います。\n",
    "式中の変数$x$を数値$123$に置き換えてみましょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "8917fcc7-e5b0-4e06-baf0-3d8c203a4683",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 15500$"
      ],
      "text/plain": [
       "15500"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr= x**2 + 3*x + 2\n",
    "expr.subs(x, 123)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "376cceea-d032-43e8-908e-2a809f8c1fd0",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "式中の変数$x$を別の数式で置き換えることも可能です。式に現れる一部の項だけを置き換えることも可能です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "8d339f10-33c3-4b9b-904c-0502935a205d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3 y + \\left(y + 2\\right)^{2} + 8$"
      ],
      "text/plain": [
       "3*y + (y + 2)**2 + 8"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs({x:2+y}) #置換ルールを辞書型データで指定しています。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "5ab278b1-7a58-48c7-80ed-0ae27d67816c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 56$"
      ],
      "text/plain": [
       "56"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs({x:2+y, y:4})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "b6e2fc0c-162d-4a3f-a2e9-0c8896ee2557",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 3 x + \\left(x + 1\\right)^{3} + 2$"
      ],
      "text/plain": [
       "3*x + (x + 1)**3 + 2"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs({x**2:y,y:(x+1)**3})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "583a1e0f-d505-4213-ab1a-7207d25daf7d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} + y$"
      ],
      "text/plain": [
       "x**2 + y"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs(3*x+2, y )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e55f8c00-7898-4cb5-8f58-213c7fdf2732",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## 三角関数を含む数式の整理\n",
    "三角関数を含む数式の整理には、`trigsimp()`や`expand_trig()`関数を使うことができます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "7ddb1435-206b-41ed-a34a-cfe60d32c812",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sin{\\left(2 x \\right)} + \\cos{\\left(2 x \\right)}$"
      ],
      "text/plain": [
       "sin(2*x) + cos(2*x)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=cos(2*x) + sin(2*x)\n",
    "expr"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b27d5ec-6440-4b5b-bc1a-962303887b09",
   "metadata": {},
   "source": [
    "三角関数専用の簡素化を行う関数`trigsimp()`や展開関数`expand_trig`が用意されています。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "42082455-8c5c-4f75-b2b3-e713d641dd9c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{2} \\sin{\\left(2 x + \\frac{\\pi}{4} \\right)}$"
      ],
      "text/plain": [
       "sqrt(2)*sin(2*x + pi/4)"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trigsimp(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "5698e595-7975-4516-a258-1f30389c509f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\sin{\\left(x \\right)} \\cos{\\left(x \\right)} + 2 \\cos^{2}{\\left(x \\right)} - 1$"
      ],
      "text/plain": [
       "2*sin(x)*cos(x) + 2*cos(x)**2 - 1"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand_trig(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "c20ffab9-93c4-4e0d-a21c-6b1679d87484",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{2} \\sin{\\left(2 x + \\frac{\\pi}{4} \\right)}$"
      ],
      "text/plain": [
       "sqrt(2)*sin(2*x + pi/4)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=cos(2*x) + 2*sin(x)*cos(x)\n",
    "expr.simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "30c29a40-5000-4dc7-b773-2bad62a2204f",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\sin{\\left(x \\right)} \\cos{\\left(x \\right)} + 2 \\cos^{2}{\\left(x \\right)} - 1$"
      ],
      "text/plain": [
       "2*sin(x)*cos(x) + 2*cos(x)**2 - 1"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand_trig(expr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "4326eeff-7af5-40ec-b51d-aee2e545f238",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{2} \\sin{\\left(2 x + \\frac{\\pi}{4} \\right)}$"
      ],
      "text/plain": [
       "sqrt(2)*sin(2*x + pi/4)"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expand_trig(expr).simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "1072051d-4aa5-4f68-8535-a75890526dd7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 \\cos{\\left(x \\right)} \\cos{\\left(x - \\frac{\\pi}{2} \\right)} + \\cos{\\left(2 x \\right)}$"
      ],
      "text/plain": [
       "2*cos(x)*cos(x - pi/2) + cos(2*x)"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.rewrite(cos)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "68bd5f79-a79b-46cf-9084-c3b309471df6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([(2*sin(x)*cos(x), ((2.0, 0.0), (1, 1, 0), ())),\n",
       "  (cos(2*x), ((1.0, 0.0), (0, 0, 1), ()))],\n",
       " [sin(x), cos(x), cos(2*x)])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.as_terms()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "334ecb2b-6654-47bd-a960-7626e7adad4a",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "##　方程式の解\n",
    "2次方程式 $a x^2 + b x + c = 0$ の解を`sympy`を使って求めてみましょう。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "936f4102-233f-4dbe-b5e2-6f780b560d65",
   "metadata": {},
   "source": [
    "まず、$x$についての2次の多項式を作ります。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "83f7e3d7-7968-4d85-b0ea-84f00ba3036e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a x^{2} + b x + c$"
      ],
      "text/plain": [
       "a*x**2 + b*x + c"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('a b c x')\n",
    "expr=a*x**2 + b* x + c\n",
    "expr"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f9f1912-1521-497d-ab35-8799baf24f20",
   "metadata": {},
   "source": [
    "`solve()`関数は与えらてた数式を`0`とする解があれば、それらの解のリストを返します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "b0041fd7-46d8-49e8-8dc4-283f2ca7a89f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)]"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sols=solve(expr, x)\n",
    "sols"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f6a55c1f-6337-483f-bef5-d17be7d43f60",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "`Eq()`クラスを使って、方程式 $expr = 0$ を明示的に表現することもできます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "7e051040-4d49-4659-a034-457ce650210b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a x^{2} + b x + c = 0$"
      ],
      "text/plain": [
       "Eq(a*x**2 + b*x + c, 0)"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Eq(expr,0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "573dcd05-2f0a-4d6c-86dd-c1a22b243492",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)]"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solve(Eq(expr,0),x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "557c2cff-4b62-4fef-b4e9-6399f168458b",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "解を辞書型や集合型のデータとして求めることも可能です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "40bf33b5-86fe-4cd5-8995-4e57825a2edd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{x: (-b + sqrt(-4*a*c + b**2))/(2*a)}, {x: -(b + sqrt(-4*a*c + b**2))/(2*a)}]"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sols_dict=solve(expr, x, dict=True)\n",
    "sols_dict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "b562a061-7300-4dbc-81da-e7afbe65579a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([x],\n",
       " {((-b + sqrt(-4*a*c + b**2))/(2*a),), (-(b + sqrt(-4*a*c + b**2))/(2*a),)})"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sols_set=solve(expr, x, set=True)\n",
    "sols_set"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "003c44fc-4f93-4a3c-b734-6bdc25021da3",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### 方程式の解の確認\n",
    "解(`sols`)の一つを、方程式に代入(substitute)してみます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "45ea7f4c-2e1a-41a1-a1e1-8b4cbade20d1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle c + \\frac{b \\left(- b + \\sqrt{- 4 a c + b^{2}}\\right)}{2 a} + \\frac{\\left(- b + \\sqrt{- 4 a c + b^{2}}\\right)^{2}}{4 a}$"
      ],
      "text/plain": [
       "c + b*(-b + sqrt(-4*a*c + b**2))/(2*a) + (-b + sqrt(-4*a*c + b**2))**2/(4*a)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs(x,sols[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dff21b56-9b2e-41df-a0b9-5e08a7f6445f",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "式を整理してみると、方程式を満足していることがわかります。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "ff26a09a-7a43-425a-a3ee-b8a862def87f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 0$"
      ],
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs(x,sols[1]).simplify()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ef6014d2-6c44-4fcc-a17b-c7d95a7468a1",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "辞書型で求めた解の一つを代入する時には、次のように書きます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "882517c4-1f94-4c1e-bd92-ad3295b95836",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle c + \\frac{b \\left(- b + \\sqrt{- 4 a c + b^{2}}\\right)}{2 a} + \\frac{\\left(- b + \\sqrt{- 4 a c + b^{2}}\\right)^{2}}{4 a}$"
      ],
      "text/plain": [
       "c + b*(-b + sqrt(-4*a*c + b**2))/(2*a) + (-b + sqrt(-4*a*c + b**2))**2/(4*a)"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs(sols_dict[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "11188062-707f-4c00-8ff3-45cd467419d6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 0$"
      ],
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.subs(sols_dict[0]).simplify()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5575d063-34ec-4287-8453-e8ecbb5fa957",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "二つの解がどちらも方程式を満たしていることを,リスト内包表記 `[<expr> for i in <list>]`をつかって 確認してみます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "c2ddc1ba-a9fd-45fe-9ee0-43b79eee34c0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[True, True]"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[expr.subs(sol).simplify() == 0 for sol in sols_dict]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d407b5a0-e865-417e-8a05-bbb922277148",
   "metadata": {},
   "source": [
    "等式(`Eq`)を使った場合はこちら。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "81d47090-52a8-4719-bb67-d000e9906713",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[True, True]"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[Eq(expr, 0).subs(sol).simplify() for sol in sols_dict]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "968e2410-168f-425f-9866-6852f891fd7a",
   "metadata": {},
   "source": [
    "set型の戻り値を使った場合は、このようになるでしょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "10d016e5-0913-44a9-8748-d474bacf3daf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[True, True]"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[expr.subs(sols_set[0][0],sol[0]).simplify() == 0 for sol in sols_set[1]]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4826b223-966f-44bd-b801-8a48488f8576",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 一連の変数名をまとめて作る。\n",
    "`sympy`では `var()`や`symbols()`に与える文字列の中にスライス記法をつかって一連の変数名をまとめて宣言できます。\n",
    "Symbolとしての名前は、LaTeXのルールに従うので、\"_\"を含む名前は下付き文字を使って表現されます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "643bec1c-c6b3-4e26-a14f-af234a3b7f36",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(a_0, a_1, a_2, b_00, b_01, b_10, b_11)"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var(\"a_:3 b_:2(:2)\") # sympyのsymbols/varでは複数のシンボルをスライス記法を用いて指示できます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "85640034-17d3-4ea4-9652-4c31b8cc17b8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a_{0} + a_{1} x + a_{2} x^{2}\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a_{0} + a_{1} x + a_{2} x^{2} + b_{11}$"
      ],
      "text/plain": [
       "a_0 + a_1*x + a_2*x**2 + b_11"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(latex(a_0+a_1*x+ a_2*x**2))\n",
    "a_0+a_1*x+ a_2*x**2 +b_11 # jupyter環境では`_`は下付き指標に整形されます。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "58accc56-a1db-46f0-94c6-15720d051419",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "LaTeXで上付き文字を指定する `^`はpythonの変数名の中で使うことができません。この場合には、`sympy()`の`symbols()`を使うことになります。　(`c^0`などを直接 pythonの変数名とすることはできません）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "df5950cc-52a6-4d21-8efb-a566006d40b8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'c^0'"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c0,c1,c2,d00,d01,d10,d11=symbols(\"c^:3 d^:2(:2)\") #\n",
    "c0.name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "865d0248-9dc3-4397-8789-221c7a56b782",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a_{0} c^{0} + a_{1} c^{1}$"
      ],
      "text/plain": [
       "a_0*c^0 + a_1*c^1"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a_0*c0+a_1*c1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f252007d-3939-44fd-8b58-084e2a62cc3e",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 行列(`Matirx`)\n",
    "`Matrix`オブジェクトを作ることで、行列計算も行えます。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83806dc5-226f-45fe-b327-d87483132dd7",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## 行列の演算\n",
    "行列オブジェクトの和、積を求めてみましょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "02e989f3-83b2-4ad7-91b0-0d1b1bf907d0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}a_{00} + b_{00} & a_{01} + b_{01}\\\\a_{10} + b_{10} & a_{11} + b_{11}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[a_00 + b_00, a_01 + b_01],\n",
       "[a_10 + b_10, a_11 + b_11]])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var(\"a_:2(:2) b_:2(:2)\")\n",
    "\n",
    "m=Matrix(\n",
    "    ((a_00,a_01),\n",
    "     (a_10,a_11)\n",
    "    )\n",
    ")\n",
    "n=Matrix(((b_00,b_01),(b_10,b_11)))\n",
    "m+n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "f52cc000-121c-47ce-92f9-6f36f3f50a74",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}a_{00} b_{00} + a_{01} b_{10} & a_{00} b_{01} + a_{01} b_{11}\\\\a_{10} b_{00} + a_{11} b_{10} & a_{10} b_{01} + a_{11} b_{11}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[a_00*b_00 + a_01*b_10, a_00*b_01 + a_01*b_11],\n",
       "[a_10*b_00 + a_11*b_10, a_10*b_01 + a_11*b_11]])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m*n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e2f6084b-ddc6-46ac-9ce5-6e673f72d156",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### 行列式、逆行列, 転置行列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "4539e0fb-3705-4bcd-95fa-9c70c6ceed1b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a_{00} a_{11} - a_{01} a_{10}$"
      ],
      "text/plain": [
       "a_00*a_11 - a_01*a_10"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.det() #行列式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "dfc218ab-4a51-4972-9c22-e68e3c2f714a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}a_{00} & a_{10}\\\\a_{01} & a_{11}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[a_00, a_10],\n",
       "[a_01, a_11]])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.transpose() # 転置行列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "722a3456-27b8-4648-9a3b-5eded30042ba",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}a_{11} & - a_{01}\\\\- a_{10} & a_{00}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[ a_11, -a_01],\n",
       "[-a_10,  a_00]])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(m**(-1)).subs(det(m), 1) # 行列式が1の行列の逆行列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "d0c81d68-5a9e-4fa4-8848-04ff03036218",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1 & 0\\\\0 & 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[1, 0],\n",
       "[0, 1]])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(m*m**(-1))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0d8fded2-c696-4b1b-b347-030923d48213",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## 行列式、トレース"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "0d2d9612-19b4-43dd-9224-ce9354600bc6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a_{00} a_{11} - a_{01} a_{10}$"
      ],
      "text/plain": [
       "a_00*a_11 - a_01*a_10"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.det()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "604a7ce5-b873-4ed2-adfd-093379b04528",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a_{00} + a_{11}$"
      ],
      "text/plain": [
       "a_00 + a_11"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.trace()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5fa3080-d4a3-419e-afb8-44ff8875e17e",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### 複素共役、エルミート共役\n",
    "各種の共役行列も求めることができます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "78272eb8-ad2a-4f43-a599-7011c9ecc462",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\overline{a_{00}} & \\overline{a_{01}}\\\\\\overline{a_{10}} & \\overline{a_{11}}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[conjugate(a_00), conjugate(a_01)],\n",
       "[conjugate(a_10), conjugate(a_11)]])"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.conjugate() #複素共役"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "d9e10e87-71a1-452e-9181-9f7fea7ebf69",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\overline{a_{00}} & \\overline{a_{10}}\\\\\\overline{a_{01}} & \\overline{a_{11}}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[conjugate(a_00), conjugate(a_10)],\n",
       "[conjugate(a_01), conjugate(a_11)]])"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    " m.adjoint() #随伴行列/エルミート共役"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "d0917ef1-8f07-4fe9-bee6-58a5951a9d40",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}a_{00} \\overline{a_{00}} + a_{01} \\overline{a_{01}} & a_{00} \\overline{a_{10}} + a_{01} \\overline{a_{11}}\\\\a_{10} \\overline{a_{00}} + a_{11} \\overline{a_{01}} & a_{10} \\overline{a_{10}} + a_{11} \\overline{a_{11}}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[a_00*conjugate(a_00) + a_01*conjugate(a_01), a_00*conjugate(a_10) + a_01*conjugate(a_11)],\n",
       "[a_10*conjugate(a_00) + a_11*conjugate(a_01), a_10*conjugate(a_10) + a_11*conjugate(a_11)]])"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simplify(m* m.adjoint())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "733f523e-047b-4611-90a2-ca8832588a3c",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "##  近似値, 定数, 有理数\n",
    "sympyの数式が表す数値の近似値を`.evalf()`メソッドを用いて求めることができます。引数で、有効桁数を指定します。\n",
    "`.evalf()`メソッドの短縮形として、`.n()`メソッドを使うこともできます。`N(expr, n)`関数は`expr.evalf(n)`と等価です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "506b5127-2f60-46bb-97b9-4243c707ba4c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.8414709848, 0.84147098480789650665, 0.841470984807896506652502321630)"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sin(1).evalf(10), sin(1).evalf(20), sin(1).evalf(30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "ac920861-30ae-4691-8fed-4e6c67076a45",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.54030230586813971740, 1.557407724654902230506974807458360173087)"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cos(1).n(20),tan(1).n(40)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "b2e4a820-cf87-469d-9808-349f4aee0490",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3.141592654, 2.7182818284590452354)"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pi.n(10), E.evalf(20) # piは円周率, E=exp(1)=E1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "646afe34-5ea5-49e7-a79a-d5e765fc041f",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### 有理数(`Rational`クラス)\n",
    "`sympy`はPythonの文法に従いますので、`1/3`などの式は`float`として評価されてしまいます。\n",
    "有理数として`1/3`を取り扱うための`Rational`クラスが用意されています。また、Singleton リポジトリ関数`S()`を使って、\n",
    "有理数を作りだすこともできます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "68ec37d2-6dce-4bb6-b515-8cda9335a2fb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.3333333333333333, 1/3, False)"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1/3, Rational(1,3), 1/3 == Rational(1,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "576e800e-5275-47fb-8c06-cdb56ec8feac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{3}{2}$"
      ],
      "text/plain": [
       "3/2"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Rational(1,3) + Rational(1/2) + Rational(1,3)/Rational(1/2) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "d6c462c6-043e-496b-892e-1c6cfe7759e4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Integer(1)/Integer(3) == Rational(1,3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b3b04b4-eb70-4baf-b89b-54b53251bbac",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "`SageMath`とは異なり、`sympy`では有理数を取り扱うためには、明示的に`Rational()`,`Interger()`クラスを使う必要があります。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "8186bf09-1ce1-4976-b6d8-81aa1dc8ee90",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x + 0.333333333333333\\right)^{10}$"
      ],
      "text/plain": [
       "(x + 0.333333333333333)**10"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(x+1/3)**10 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "2e7972cb-f9f1-47a7-8cc6-da822da75cb9",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x + \\frac{1}{3}\\right)^{3}$"
      ],
      "text/plain": [
       "(x + 1/3)**3"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(x+Rational(1,3))**3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "cc693415-cb58-472b-bc6f-cab8c80754ab",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{1}{3}$"
      ],
      "text/plain": [
       "1/3"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "((x+1)/(x+3)).subs(x,0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "7afa5077-1661-4be8-a9c5-223e98571664",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(\\frac{x}{10} + 1\\right)^{10}$"
      ],
      "text/plain": [
       "(x/10 + 1)**10"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(1+x/S(10))**10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "0f27dee6-9c54-4a70-acae-37b4691bf93a",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(sympy.core.numbers.One,\n",
       " sympy.core.numbers.Integer,\n",
       " sympy.core.numbers.Rational,\n",
       " sympy.core.numbers.Rational)"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(S(1)), type(sympify(3)), type(Rational(1,3)), type(1/Integer(3))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f51cdd0-4cd6-481b-9bd8-a02d813c4d4a",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "source": [
    "注:: `sympy.S`はSingletonを管理するクラス。`S()`は`sympify()`と等価(`simplify()`の描き間違いではありません）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "ecfaa361-d60d-4a81-95ec-238e7ae6df3e",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x + \\frac{1}{3}\\right)^{10}$"
      ],
      "text/plain": [
       "(x + 1/3)**10"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "((3*x+1)/3)**10"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d713155-9924-4049-8d3a-14435cf6a6ba",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 極限値\n",
    "$\\lim_{x\\rightarrow \\infty} f(x)$のような極限値を求めることも可能です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "4e1aedfd-8001-4df4-86e4-c25d10cde80d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle e$"
      ],
      "text/plain": [
       "E"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=(1+1/x)**x\n",
    "expr.limit(x,oo) #sympy.core.numbers.Exp1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "477e2235-4e5d-4275-9541-7e9b50d40799",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x - \\frac{x^{3}}{6} + \\frac{x^{5}}{120} - \\frac{x^{7}}{5040} + \\frac{x^{9}}{362880} + O\\left(x^{10}\\right)$"
      ],
      "text/plain": [
       "x - x**3/6 + x**5/120 - x**7/5040 + x**9/362880 + O(x**10)"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sin(x).nseries(x,0,n=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04906739-668e-4267-aa04-904ab12b86da",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### 無限大\n",
    "無限大を表す記号として、`oo`を使います。`oo`は`sympy.core.numbers.Infinity`に割り当てられています。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "980ca6db-bafe-4016-8844-94b31024cb85",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 整数の素因数分解\n",
    "数式（多項式）の因数分解だけでなく、整数の素因数分解(`factorint`)の機能も使えます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "020ab443-f4e9-46c3-be8e-7ac579eec48f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Factoring 5120\n",
      "Trial division with ints [2 ... 32768] and fail_max=600\n",
      "\t2 ** 10\n",
      "Factorization is complete.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{2: 10, 5: 1}"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factorint(5120,verbose=True,multiple=False) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "145c7e7d-3bd2-41e2-af09-de2155c482e7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2^{10} \\cdot 5^{1}$"
      ],
      "text/plain": [
       "2**10*5**1"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factorint(5120, visual=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "7f15bdff-9767-45d2-8faa-bee783fae7f3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "81840\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{2: 4, 3: 1, 5: 1, 11: 1, 31: 1}"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import random\n",
    "ri=random.randint(1,100000)\n",
    "print(ri)\n",
    "factorint(ri)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26ed9039-9438-4b67-881f-868215a0f59e",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## 最小公倍数、最大公約数, 素数チェック"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "a0e5ad59-44a8-4b3d-b302-9aa81c573c6b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1$"
      ],
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gcd(447550424579,304874938368000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "f1d44c08-d182-47ca-9d35-479ee068415c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lcm(447_550_424_579, 304874_938_368_000) == 447550424579*304874938368000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "4bb157b5-9dc7-4a8a-a8ae-c2c36473f412",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(False, True)"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "isprime(447550424579), isprime(2850639647)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "26b123c0-da35-4098-bbe3-befb11825e95",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "({157: 1, 2850639647: 1}, {2: 16, 3: 7, 5: 3, 7: 1, 11: 1, 13: 1, 17: 1})"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factorint(447550424579), factorint(304874938368000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "590936fe-47e3-4642-9f32-93dc20ad3292",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 連立方程式を解く。\n",
    "鶴亀(蟻)算を例に、連立一次方程式を解いてみます。\n",
    "問題は：\n",
    "\n",
    " * 鶴亀蟻が全部で10体、\n",
    " * 足の総数は34本、\n",
    " * 亀は蟻の数より一匹多い\n",
    "  \n",
    "という時の鶴、亀、蟻の数を求めよ\n",
    "  \n",
    "というものです。`eqs`の各要素が0になる解を求めます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "f687e1cc-d14c-4a8e-a21e-1684de7e1d7d",
   "metadata": {},
   "outputs": [],
   "source": [
    "var('鶴　亀　蟻')\n",
    "eqs=[ 2*鶴+4*亀+6*蟻 - 34, 鶴+亀+蟻 - 10,  蟻 + 1 - 亀 ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "id": "540e3259-d9a7-430f-9d13-5a7d51a08244",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{鶴: 5, 亀: 3, 蟻: 2}"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sol=solve( eqs, (鶴, 亀, 蟻))\n",
    "sol"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f57fc845-88dc-4003-a9ae-cf32d3792c16",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### `Eq()`を使う\n",
    "等式を表現する`Eq()`関数を使って、解くべき方程式を表現することも可能です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "f900e2f1-8799-4f73-819d-9625b4acc0eb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4 亀 + 6 蟻 + 2 鶴 = 34$"
      ],
      "text/plain": [
       "Eq(4*亀 + 6*蟻 + 2*鶴, 34)"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Eq(2*鶴+4*亀+6*蟻 , 34)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "2074804d-f5ba-4258-a276-6fd763072365",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{鶴: 5, 亀: 3, 蟻: 2}"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eqs=[Eq( 2*鶴 + 4*亀 + 6*蟻 , 34), #足が全部で34本\n",
    "     Eq( 鶴 + 亀 + 蟻       , 10), #全部で10体\n",
    "     Eq( 蟻 + 1            , 亀) ] # 亀は蟻より1多い\n",
    "sol=solve( eqs, (鶴, 亀, 蟻))\n",
    "sol"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf016d2b-032b-4612-86f3-1835a6ab2e3b",
   "metadata": {},
   "source": [
    "解`sol`を方程式に代入して、確かに解になっていることを確認します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "2450f994-bde8-4911-94e8-6e947bb5a723",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\text{True}$"
      ],
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Eq(2*鶴 + 4*亀 + 6*蟻 , 34).subs(sol)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "75ab916c-f53a-41eb-bc50-c9d3f01bef7d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[True, True, True]"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[eq.subs(sol) for eq in eqs]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8ce05cb0-368f-4244-be5b-9482d11736d8",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 微分、積分\n",
    "数式の微分、積分も記号のまま実行します。\n",
    "\n",
    "微分は数式オブジェクトの\".diff()`メソッドで求めます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "e082792d-ead5-4477-a4e6-a12327e76a45",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 x + 3 \\sin^{2}{\\left(x \\right)} \\cos{\\left(x \\right)}$"
      ],
      "text/plain": [
       "2*x + 3*sin(x)**2*cos(x)"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=x**2+ sin(x)**3\n",
    "expr.diff(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f219967-32dc-4612-8088-a87efbf7189f",
   "metadata": {},
   "source": [
    "`diff()`関数、`Derivative`クラスも使えます"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "id": "7f52f485-3364-4fd3-b536-a31a62650d87",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 x + 3 \\sin^{2}{\\left(x \\right)} \\cos{\\left(x \\right)}$"
      ],
      "text/plain": [
       "2*x + 3*sin(x)**2*cos(x)"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "diff(expr,x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "24aa14b2-127a-4137-b450-43e60d3b02e9",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "`Derivative`クラスは式に対する微分の操作を表現します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "204938c5-6d6d-44e5-bfd7-beba2b65abe7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{d}{d x} \\left(x^{2} + \\sin^{3}{\\left(x \\right)}\\right)$"
      ],
      "text/plain": [
       "Derivative(x**2 + sin(x)**3, x)"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Derivative(expr,x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b76b3911-c2d8-471f-8116-b219deb99a16",
   "metadata": {},
   "source": [
    "`.doit`メソッドで微分操作を実行します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "f8452479-f44f-45a6-a1ca-4224308b1dc6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 x + 3 \\sin^{2}{\\left(x \\right)} \\cos{\\left(x \\right)}$"
      ],
      "text/plain": [
       "2*x + 3*sin(x)**2*cos(x)"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Derivative(expr,x).doit()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f12c7e7f-2e8c-4e8a-91a2-95e7ab5c7c08",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## 積分／定積分\n",
    "\n",
    "`.integrate()`メソッドで積分を実行します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "9e58d1ff-0257-4073-b5cc-11f7da1183b7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\log{\\left(x - 1 \\right)} + \\log{\\left(x^{2} + x + 1 \\right)}$"
      ],
      "text/plain": [
       "-log(x - 1) + log(x**2 + x + 1)"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=(x**2-2*x-2)/(x**3-1)\n",
    "expr.integrate(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "694d91ff-e1e1-4ca1-ae94-2338f27d4e40",
   "metadata": {},
   "source": [
    "`integrate()`関数をつかうこともできます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "38b3933b-0ac4-4d26-9083-3e33f35096c5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\log{\\left(x - 1 \\right)} + \\log{\\left(x^{2} + x + 1 \\right)}$"
      ],
      "text/plain": [
       "-log(x - 1) + log(x**2 + x + 1)"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "integrate(expr,x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0903c11f-adf5-4907-a24c-5512fdf17fcf",
   "metadata": {},
   "source": [
    "被積分関数`expr`を部分分数展開すると、この積分が正しいことは一目瞭然です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "8b0dffe0-08b4-402f-8197-859e8bbf0c8b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{2 x + 1}{x^{2} + x + 1} - \\frac{1}{x - 1}$"
      ],
      "text/plain": [
       "(2*x + 1)/(x**2 + x + 1) - 1/(x - 1)"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.apart()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fcbef6b3-bf65-4efb-8bdc-e5ec3a742279",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### 定積分\n",
    "定積分には、変数範囲をタプルで指定します( `(<var>,<lower range>,<upper range>)`。`sympy`では`oo`は無限大を表します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "853e1266-f8a6-42b7-a8ab-9c7014019be2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{\\pi}$"
      ],
      "text/plain": [
       "sqrt(pi)"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "integrate(exp(-x**2), (x, -oo, oo) )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "4b9cf957-5e28-4e3d-bfad-ec7370df98b0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{\\pi}$"
      ],
      "text/plain": [
       "sqrt(pi)"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(exp(-x**2)).integrate((x,-oo,oo))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2529b022-0c70-49b3-986a-090e71adde94",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### 積分クラス\n",
    "`Integral`クラスは積分の数式を表現します。(`Eq`が等式を表現するクラスであったのと同じです）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "id": "e5e480d0-609b-48a5-b73e-26fe11686e1b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\int\\limits_{-\\infty}^{\\infty} e^{- x^{2}}\\, dx$"
      ],
      "text/plain": [
       "Integral(exp(-x**2), (x, -oo, oo))"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=Integral(exp(-x**2), (x, -oo, oo))\n",
    "expr"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5471a143-aa93-4502-829e-da81d476de25",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### 積分の実行\n",
    "積分クラスの積分を実行した結果を求めるには`.doit()`メソッドを使います。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "id": "a47f3507-71f5-4a50-85f2-6ab69f21b29e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\sqrt{\\pi}$"
      ],
      "text/plain": [
       "sqrt(pi)"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=Integral(exp(-x**2), (x, -oo, oo))\n",
    "expr.doit()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c64daa2a-5443-4065-8e18-f7f9bbf95d07",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## 関数の微分\n",
    "`Function`クラスは関数を表すオブジェクトを作成します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "7c185671-36ec-47aa-be4d-f14475c917fe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle f{\\left(x \\right)}$"
      ],
      "text/plain": [
       "f(x)"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f=Function('f') # `f`は関数を表すオブジェクト\n",
    "f(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "2d84eda8-2411-4e71-9074-3fd8474b78b5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{d}{d x} f{\\left(x \\right)}$"
      ],
      "text/plain": [
       "Derivative(f(x), x)"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f(x).diff(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c501b518-7b4e-4a7d-bcd4-984d9e4bfa43",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### 偏微分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "64370f3b-fac6-405b-874e-56921c540b7c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\partial^{3}}{\\partial y\\partial x^{2}} f{\\left(x,y \\right)}$"
      ],
      "text/plain": [
       "Derivative(f(x, y), (x, 2), y)"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f(x,y).diff(x,y,x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "id": "e7f56cb7-cffc-4c89-8def-7173b57392c1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\partial^{3}}{\\partial y\\partial x^{2}} f{\\left(x,y \\right)}$"
      ],
      "text/plain": [
       "Derivative(f(x, y), (x, 2), y)"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f(x,y).diff(x,2,y) #これも可能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "5f0445a2-fe13-42d0-8378-7ef8986e0d91",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 0$"
      ],
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# n階の微分をあ羅和すには？\n",
    "var('n m',integer=True)\n",
    "f(x,y).diff(x,n,y,m)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bfd18d2e-43c0-4562-b657-a8d3a8aaa82c",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## 合成関数の微分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "id": "631afba3-ec10-4cec-b39d-85559d3f48e8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{d}{d g{\\left(t \\right)}} f{\\left(g{\\left(t \\right)} \\right)} \\frac{d}{d t} g{\\left(t \\right)}$"
      ],
      "text/plain": [
       "Derivative(f(g(t)), g(t))*Derivative(g(t), t)"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f=Function('f') # `f`は関数を表すオブジェクト\n",
    "g=Function('g')\n",
    "f(g(t)).diff(t) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "id": "6378db4d-2603-4f99-b7f4-68b9a437b18e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 f{\\left(x \\right)}$"
      ],
      "text/plain": [
       "2*f(x)"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "( f(x)**2 ).diff(f(x)) # `f(x)**2.diff(f(x))`  は NG"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "29ff8723-1668-40c2-91c4-14068688dcd5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle n f^{n - 1}{\\left(x \\right)} \\frac{d}{d x} f{\\left(x \\right)}$"
      ],
      "text/plain": [
       "n*f(x)**(n - 1)*Derivative(f(x), x)"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "( f(x)**n ).diff(x).simplify() # `f(x)**2.diff(x)`  は NG"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad155d04-6b49-4ba1-aea1-30b53caa3b9c",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 微分方程式を解く\n",
    "`dsolve`関数で微分方程式を解くこともできます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "id": "e50bcdee-f89d-4329-9bfd-f49e2f11cd86",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle f{\\left(t \\right)} = C_{1} + C_{2} t - \\frac{g t^{2}}{2 m}$"
      ],
      "text/plain": [
       "Eq(f(t), C1 + C2*t - g*t**2/(2*m))"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f=Function('f')\n",
    "g=Symbol('g')\n",
    "m=Symbol('m')\n",
    "dsolve(Eq(m*f(t).diff(t,2), -g) , f(t))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dac14d63-68d6-4a28-93b1-e1f857201110",
   "metadata": {},
   "source": [
    "$C_1, C_2$は初期条件で決まる定数を表現しています。初期条件$\\left( f(0) = x_0, \\frac{d f}{d t}(0) = v_0\\right)$ を与えてみましょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "80478156-2776-4f5f-a2d3-713ccfa7648f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle f{\\left(t \\right)} = - \\frac{g t^{2}}{2 m} + t v_{0} + x_{0}$"
      ],
      "text/plain": [
       "Eq(f(t), -g*t**2/(2*m) + t*v_0 + x_0)"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('x_0 v_0')\n",
    "dsolve(Eq(m*f(t).diff(t,2), -g) , f(t), ics={f(0):x_0,f(t).diff(t).subs(t,0):v_0})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "31dcd6ca-c57c-4e62-80f0-51471f90b04c",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle f{\\left(t \\right)} = C_{1} + C_{2} t - \\frac{g t^{2}}{2 m}$"
      ],
      "text/plain": [
       "Eq(f(t), C1 + C2*t - g*t**2/(2*m))"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dsolve(m*f(t).diff(t,2) + g , f(t)) #Eqを使わずに済ますこともできます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "id": "7bb81a2e-0daa-4a62-9c7d-f6a90df5cb9f",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle f{\\left(t \\right)} = C_{1} e^{- i \\omega t} + C_{2} e^{i \\omega t}$"
      ],
      "text/plain": [
       "Eq(f(t), C1*exp(-I*omega*t) + C2*exp(I*omega*t))"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f=Function('f')\n",
    "omega=Symbol('omega')\n",
    "dsolve(Eq(diff(f(t),t,2),- omega**2*f(t)), f(t))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "id": "fda25fdb-f167-40af-803f-51856817f8d4",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'f{\\\\left(t \\\\right)} = C_{1} e^{- i \\\\omega t} + C_{2} e^{i \\\\omega t}'"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "latex(dsolve(Eq(f(t).diff(t,2), -omega**2*f(t)) ,f(t)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "id": "3254cc89-11e7-4bf2-9bf6-a139bf282b3d",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle f{\\left(x \\right)} = - \\frac{C_{1}}{- C_{1} + x}$"
      ],
      "text/plain": [
       "Eq(f(x), -C1/(-C1 + x))"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# http://www.turbare.net/transl/scipy-lecture-notes/packages/sympy.html#equation-solving から\n",
    "f=Function('f')\n",
    "dsolve(Eq(x*f(x).diff(x), -f(x)+f(x)**2),f(x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "id": "29fe770b-f60a-457d-9247-6a6b9a876d81",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle f{\\left(x \\right)} = \\frac{1}{C_{1} x + 1}$"
      ],
      "text/plain": [
       "Eq(f(x), 1/(C1*x + 1))"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dsolve(Eq(x*f(x).diff(x), -f(x)+f(x)**2),f(x),hint=\"Bernoulli\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "819ad419-d1f2-4b85-ac92-81bf83916427",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## 2階の線形微分方程式を解いてみます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "id": "76ef40e5-4df4-4f6b-957e-eb3a69641543",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle f{\\left(t \\right)} = C_{1} \\sin{\\left(\\omega t \\right)} + C_{2} \\cos{\\left(\\omega t \\right)}$"
      ],
      "text/plain": [
       "Eq(f(t), C1*sin(omega*t) + C2*cos(omega*t))"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('omega', positive=True) #パラメータ`omega`は正の数であることを仮定します。\n",
    "eq=Eq(Derivative(f(t), t, t) , -(omega)**2*f(t) )\n",
    "dsolve(eq, f(t))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "id": "cf8048f0-d057-4f15-9bdd-b5f2c6842031",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle f{\\left(t \\right)} = C_{1} e^{- i \\omega t} + C_{2} e^{i \\omega t}$"
      ],
      "text/plain": [
       "Eq(f(t), C1*exp(-I*omega*t) + C2*exp(I*omega*t))"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('omega',complex=True) # `omegaは複素数と仮定します\n",
    "eq=Eq(Derivative(f(t), t, 2) , -(omega)**2*f(t) )\n",
    "dsolve(eq, f(t))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "id": "78166a4b-5eef-4cfb-9f24-f6febd9a2c8e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle f{\\left(t \\right)} = C_{1} e^{- i \\omega t} + C_{2} e^{i \\omega t}$"
      ],
      "text/plain": [
       "Eq(f(t), C1*exp(-I*omega*t) + C2*exp(I*omega*t))"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('omega',complex=True) # `omegaは複素数と仮定します\n",
    "eq=Eq(f(t).diff(t,2) , -(omega)**2*f(t) )\n",
    "dsolve(eq, f(t))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "id": "10689952-a4a9-4a7d-8d86-479c0658fc66",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{d^{2}}{d x^{2}} f{\\left(x \\right)}$"
      ],
      "text/plain": [
       "Derivative(f(x), (x, 2))"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g=Function('g')\n",
    "Derivative(f(x),x,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "id": "ede1e788-a998-4d69-9b89-1ab87f805dfa",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{d^{2}}{d x^{2}} f{\\left(x \\right)}$"
      ],
      "text/plain": [
       "Derivative(f(x), (x, 2))"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f(x).diff(x,2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "283aab94-536e-466f-a21c-515c0a1bc844",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## 連立微分方程式\n",
    "2階の微分方程式を、1階の連立微分方程式に書き直して解いてみましょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "id": "0c3ed5e6-ca27-4122-921b-64fe7b243277",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Eq(f(t), I*C1*exp(-I*omega*t)/omega - I*C2*exp(I*omega*t)/omega),\n",
       " Eq(g(t), C1*exp(-I*omega*t) + C2*exp(I*omega*t))]"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('omega')\n",
    "var('f g', cls=Function)\n",
    "dsolve([Eq(diff(g(t),t), - omega**2* f(t)),\n",
    "        Eq(diff(f(t),t), g(t))], [f(t),g(t)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "id": "3b007a60-c42b-47fa-9788-34de510caa9b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Eq(f(t), C1*sin(omega*t)/omega + C2*cos(omega*t)/omega),\n",
       " Eq(g(t), C1*cos(omega*t) - C2*sin(omega*t))]"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('omega',real=True) # aは実数であるとの条件をつける。\n",
    "g=Function('g')\n",
    "dsolve([Eq(diff(g(t),t), - omega**2*f(t)),\n",
    "        Eq(diff(f(t),t), g(t))], [f(t),g(t)])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "61f7289b-26f4-457e-947c-d66ec3b4243a",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# グラフの描画\n",
    "`matplotlib`がインストールされた環境では、`sympy`は`matplotlib`を利用してグラフを描画します。\n",
    "`matplotlib`が無い場合でも、文字を使ってグラフを表示します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "id": "cf44d294-afc1-4a51-a7bc-02cd0bf325b5",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "var('x y')\n",
    "P=plot(sin(x),(x,-3*pi,3*pi),line_color=\"red\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5c727f02-23cb-4615-ad56-e1e0b2036d10",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## グラフの合成\n",
    "先ほどのグラフに次のグラフを合成したグラフを表示してみましょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "id": "9ffe61ad-5ba5-4bed-9690-c061dfba977b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "Q=plot(cos(x),(x,-3*pi,3*pi),line_color=\"green\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "id": "83092d51-9d42-420c-bb82-3d1a7b4be419",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "P.extend(Q)\n",
    "P.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "031397b5-a780-40cb-bada-7361bb113744",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## 陰関数をプロットする\n",
    "陰関数で定義される曲線を印刷することもできます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "id": "cd430482-44bb-467c-b5bd-5d66cdfe0a18",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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P/7yl7/c8HENBgPPPvssixcvxul08uCDD5KVlcXatWuxWCzk5+fz0EMPcd9995GamorZbGbr1q0AZGVlsWzZMjIzMzEYDDz33HP4+/sP+ncVQlzDYLtg/f3864p/dWcP0u1eeuklvUsYFKlfX4mJiXqXMGi+/v+B1K+fC0N8K9Ugc8RtkySKNhWpnPtz3HJsIbydxWLBarXqXYYQuijaVETO/TnaYI8j56CEEEJ4pUEFlKZpd2uadlTTtB5N0yyXPmcIMmAv673gsr8lZsrKypg1axapqancc889dHV1Daac62az2cjLyyMtLY28vLw+LxB99913ycnJcf0EBQWxbds2AO6//36SkpJczxUVFXld/QD+/v6uGi+dGOAL739RURFz5swhKyuL7Oxsfve737me0+v9H8iSSaWlpV67ZNK16v/5z39OZmYm2dnZLFy4kDNnzrie6++z5EnXqn/Tpk1ERka66tywYYPruc2bN5OWlkZaWpprQoynXav+1atXu2pPT08nPDzc9Zw3vP8PPvggUVFRTJ7c9wzyhpMN/Ofv/hNN005qmnZY07TpF5/TNG2FpmklF35WXLOxwYwPAhnAROA9wHLpczWHa1SltVI5HA6VnJysTp06pTo7O1V2drY6evSoUkqpu+++W23ZskUppdSqVavU888/77Yx0b58//vfV08//bRSSqmnn35aPfbYY1fdv6GhQZlMJtXa2qqUUmrFihXq97//vdvr7M9A6x81alSf233h/T9+/Lg6ceKEUkqpyspKFRMTo+x2u1JKn/f/ap/ni5577jk1duxYpZRSW7ZsUcuWLVNKKXX06FGVnZ2tOjo6VGlpqUpOTlYOh8Pr6n/nnXdcn/Hnn3/eVb9S/X+WPGUg9b/yyivq0UcfveK1DQ0NKikpSTU0NCibzaaSkpKUzWbzVOlKqYHVf6lf/epX6oEHHnA91vv9V0qp999/Xx08eFBlZWX1+fzmn29WC25eoAANmA3sV715YQZKL/yv6cJ/m5S7ppkrpYqVUsevtk9/S8wopXjnnXdYunQpACtWrHD1TDzl0qVtBtL+G2+8wW233UZISIgHqru2663/Ur7y/qenp5OWlgZAXFwcUVFR1NXVebLMywx0yaSxY8cC3rdk0kDqv/XWW12f8dmzZ1NRUeHRGq9mIPX356233iIvLw+z2YzJZCIvL4+d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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "Q=plot_implicit(x**2+y**2-1, (x,-1,1),(y,-1,1),line_color=\"purple\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8c120143-6722-4226-8492-6f0f24ec03d3",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## パラメータ表示の曲線をプロットする"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "id": "807559f7-9ed2-41b2-bd74-c999cd9e282f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "P=plot_parametric((cos(x),sin(x)), (x,-pi,pi),line_color=\"red\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "082d78fb-9fe2-4edc-9ae8-01873b0cc417",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## グラフの保存\n",
    "作成したグラフを保存します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "id": "6c096e33-ac43-4546-9ede-45b22a0cc042",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "P.save('foo.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "640e626a-a7a2-441b-b993-bb780245d867",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 関数の級数展開(Taylor展開）\n",
    "関数のTaylor級数展開を求めることも可能です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "id": "7239387c-799f-4a43-85fe-7a4d946ec6aa",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x - \\frac{x^{3}}{6} + \\frac{x^{5}}{120} - \\frac{x^{7}}{5040} + O\\left(x^{8}\\right)$"
      ],
      "text/plain": [
       "x - x**3/6 + x**5/120 - x**7/5040 + O(x**8)"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sin(x).series(x,0,8) # x=0の周りで8次までの級数展開を求める。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b08eded1-1aca-4d20-a658-88ec8e26c655",
   "metadata": {},
   "source": [
    "異なる点($x=\\frac{\\pi}{2}$)の回りで展開してみましょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "id": "22135c0a-40b2-440d-9e04-32803a4302cf",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1 - \\frac{\\left(x - \\frac{\\pi}{2}\\right)^{2}}{2} + \\frac{\\left(x - \\frac{\\pi}{2}\\right)^{4}}{24} - \\frac{\\left(x - \\frac{\\pi}{2}\\right)^{6}}{720} + O\\left(\\left(x - \\frac{\\pi}{2}\\right)^{8}; x\\rightarrow \\frac{\\pi}{2}\\right)$"
      ],
      "text/plain": [
       "1 - (x - pi/2)**2/2 + (x - pi/2)**4/24 - (x - pi/2)**6/720 + O((x - pi/2)**8, (x, pi/2))"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sin(x).series(x, x0=pi/2, n=8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "id": "787f6982-6e36-4c68-a26b-10a0225e1220",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1 - \\frac{x^{2}}{2} - \\frac{7 x^{4}}{24} - \\frac{97 x^{6}}{720} + O\\left(x^{8}\\right)$"
      ],
      "text/plain": [
       "1 - x**2/2 - 7*x**4/24 - 97*x**6/720 + O(x**8)"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cos(tan(x)).series(x,0,8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "id": "ab5af8fb-9403-487c-bb36-80a77c374ea6",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 - \\frac{x^{2}}{2} - \\frac{7 x^{4}}{24} - \\frac{97 x^{6}}{720} - \\frac{2063 x^{8}}{40320} - \\frac{17803 x^{10}}{1209600} - \\frac{250781 x^{12}}{159667200} + \\frac{166831871 x^{14}}{87178291200} + \\frac{43685848289 x^{16}}{20922789888000} + \\frac{447550424579 x^{18}}{304874938368000} + O\\left(x^{20}\\right)\n"
     ]
    }
   ],
   "source": [
    "print(latex(cos(tan(x)).series(x,0,20)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cde3a69f-8875-4fd6-8c6f-551f727aac7e",
   "metadata": {},
   "source": [
    "級数どうしの積を求めてみます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "id": "c05a81e6-0e0b-4e1e-a5de-93f181d2ea59",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x - \\frac{2 x^{3}}{3} + \\frac{2 x^{5}}{15} - \\frac{4 x^{7}}{315} + O\\left(x^{8}\\right)$"
      ],
      "text/plain": [
       "x - 2*x**3/3 + 2*x**5/15 - 4*x**7/315 + O(x**8)"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(sin(x).series(x,0,8)*cos(x).series(x,0,10)).expand()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ab10842-6abf-41d6-b9d8-da864a86947c",
   "metadata": {},
   "source": [
    "展開前の関数の積を展開しても同じ級数となります。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "id": "a68cdb4f-5376-4005-9a8c-c66cc0ca7015",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x - \\frac{2 x^{3}}{3} + \\frac{2 x^{5}}{15} - \\frac{4 x^{7}}{315} + O\\left(x^{8}\\right)$"
      ],
      "text/plain": [
       "x - 2*x**3/3 + 2*x**5/15 - 4*x**7/315 + O(x**8)"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(sin(x)*cos(x)).series(x,0,8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "id": "9fd89e06-fc6f-4316-a902-d3fd6ab5ae75",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x - \\frac{2 x^{3}}{3} + \\frac{2 x^{5}}{15} - \\frac{4 x^{7}}{315} + O\\left(x^{8}\\right)$"
      ],
      "text/plain": [
       "x - 2*x**3/3 + 2*x**5/15 - 4*x**7/315 + O(x**8)"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(sin(2*x)/2).series(x,0,8)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e63e530-4cab-48df-b7c5-3db731a0d641",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# 級数の和\n",
    "無限級数の和を計算してみましょう。`oo`は無限大を表しています(`sympy.core.numbers.Infinity`)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "id": "9984a198-7ad1-41b0-80d1-52b5f359921e",
   "metadata": {},
   "outputs": [],
   "source": [
    "var('n x')\n",
    "f=lambda n:1/n**n\n",
    "S=Sum(f(n), (n, 1, oo))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "id": "2c79d915-f7b7-4fc2-94c4-773efd8484b0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1.29128599706266$"
      ],
      "text/plain": [
       "1.29128599706266"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "S.evalf()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "id": "982bcbf3-a5fb-409f-86d7-7370ffc300e1",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\int\\limits_{0}^{1} x^{- x}\\, dx$"
      ],
      "text/plain": [
       "Integral(x**(-x), (x, 0, 1))"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Integral(x**(-x), (x, 0,1 ))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "id": "d19553ab-7408-414a-a5b1-bd10ba9d781d",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1.2912859970626635404072825905956005414986193682745$"
      ],
      "text/plain": [
       "1.2912859970626635404072825905956005414986193682745"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "_.evalf(50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "id": "71acfac2-660a-4092-ab52-716b1445103e",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\pi$"
      ],
      "text/plain": [
       "pi"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(Integral(exp(-x**2), (x, -oo, oo))**2).doit()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eebdbfe9-46b9-4b31-a256-18dda864be47",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## 部分分数展開\n",
    "有理関数を部分分数展開してみます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "id": "2641a02d-e257-4cd0-97ed-00892ccff98d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{1}{z + 2} + \\frac{1}{z + 1}$"
      ],
      "text/plain": [
       "-1/(z + 2) + 1/(z + 1)"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('z')\n",
    "expr=1/(z**2 + 3*z +2)\n",
    "apart(expr)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e2f1e55-9337-4529-ac67-330d365b9168",
   "metadata": {},
   "source": [
    "`.apart()`メソッドも使えます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "id": "541e3468-f241-4fac-aa07-dfc2c100bd04",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{1}{z + 2} + \\frac{1}{z + 1}$"
      ],
      "text/plain": [
       "-1/(z + 2) + 1/(z + 1)"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.apart()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc5eb22e-27de-4d2f-bde8-787952d21989",
   "metadata": {},
   "source": [
    "この様な展開はLaplace逆変換を求める際に便利です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "id": "111a3655-a0e7-4139-b11c-aabc21e99b44",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(e^{t} - 1\\right) e^{- 2 t} \\theta\\left(t\\right)$"
      ],
      "text/plain": [
       "(exp(t) - 1)*exp(-2*t)*Heaviside(t)"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sympy.integrals.transforms.inverse_laplace_transform(expr, z, t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "id": "b3ac57ae-2e4b-48f1-a0ac-8d57898f5fbe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\mathcal{F}^{-1}_{\\omega}\\left[\\frac{1}{\\omega - \\omega_{0}}\\right]\\left(t\\right)$"
      ],
      "text/plain": [
       "InverseFourierTransform(1/(omega - omega_0), omega, t)"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('omega omega_0')\n",
    "sympy.integrals.transforms.inverse_fourier_transform(1/(omega-omega_0),  omega,t)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "878dba4b-6be5-4b07-982c-742b360fc409",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### collect, coeff\n",
    "式の中の特定の変数について整理するときは`.collect()`を使います。その変数について特定の次数の係数を`.coeff()`メソッド\n",
    "で取り出します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "id": "b1e104cd-1718-4c9a-8b8a-e8e7d5955e92",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a x y + x^{2} + 3 x y^{2} - 2 x - y^{3}$"
      ],
      "text/plain": [
       "a*x*y + x**2 + 3*x*y**2 - 2*x - y**3"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr=x**2-2*x+a*x*y - (y **3 - 3*x*y**2)\n",
    "expr.simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "id": "714bbad8-01a9-4511-bcae-9128f8a871f9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} + x \\left(a y + 3 y^{2} - 2\\right) - y^{3}$"
      ],
      "text/plain": [
       "x**2 + x*(a*y + 3*y**2 - 2) - y**3"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.collect(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "id": "6aa4c977-8394-446f-877e-d2131a0d6d18",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a x y + x^{2} + 3 x y^{2} - 2 x - y^{3}$"
      ],
      "text/plain": [
       "a*x*y + x**2 + 3*x*y**2 - 2*x - y**3"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "collect(expr,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "id": "08c81b84-c09b-4e65-9512-3c5ff81b73a4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} + x \\left(a y + 3 y^{2} - 2\\right) - y^{3}$"
      ],
      "text/plain": [
       "x**2 + x*(a*y + 3*y**2 - 2) - y**3"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "collect(expr,(y,x)).simplify().collect(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "id": "565c8edd-46c0-44c7-8332-b9edd0b5b731",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle a y + 3 y^{2} - 2$"
      ],
      "text/plain": [
       "a*y + 3*y**2 - 2"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.coeff(x,1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6ca155de-c740-4038-bc54-f6ce5ab37050",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## その他の役に立つ（かもしれない）`sympy`のサブモジュール\n",
    "sympyには、古典／量子力学や高エネルギー物理学の様々な計算を支援するモジュール(sympy.phisics)や、\n",
    "制御理論をサポートするsympy.physics.contorlなどのモジュールも存在します。(制御理論の数値的な取り扱いについては、\n",
    "python-controlの方が便利だと思われますが）\n",
    "詳しくは、[Web]で。\n",
    "\n",
    "[Web]: https://docs.sympy.org/latest/modules/physics/index.html\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "id": "edc83cfe-646a-4944-af93-cc22755b27e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sympy.physics as Physics\n",
    "if sympy.__version__ > \"1.9\":\n",
    "    import sympy.pysics.control as control"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "134ac100-7b26-41b6-91dd-41694a2015de",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "これでおしまい。\n",
    "\n",
    "\n",
    "以下はメモ書き"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0d68169d-b27d-45de-a32a-f86279a4c00f",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## sympyのクラス図を作ってみる。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "id": "b4098a12-5b42-44e2-8214-dac30d2fd6e4",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['parsing /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/sympy/core/add.py...',\n",
       " 'parsing /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/sympy/core/mul.py...',\n",
       " 'parsing /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/sympy/core/numbers.py...']"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%system pyreverse -p sympy -f PUB_ONLY -ASk --colorized --max-color-depth=8 -o png sympy.core.add sympy.core.mul  sympy.core.numbers"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "450b1f78-920e-40eb-a1e1-de447b6a13bc",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "[sympyのクラス図]: classes_sympy.png\n",
    "\n",
    "![sympyのクラス図] (classes_sympy.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "id": "d3bbf8dd-d9ec-41ae-b4e1-b83316afb5d5",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAmEklEQVR4nO3deXxU1d3H8c9AJLIJLmwmSAMBDIGAGBbbxwVJAKNNZBGwQWJBg0VfuOKDRauoGGqrFQX1SUULWKFIMVHAUDapVhACIgWKBBpsNjAIQQKEbOf542gsEEPQZO6dme/79ZpXwtwJ87sE8uWee87veIwxiIiIuE0DpwsQERGpjgJKRERcSQElIiKupIASERFXUkCJiIgrBZ3luKb4iZyDIUOGkJGR4XQZIr7GU92TuoISqUMHDx50ugQRv6GAEhERV1JAiYiIKymgRETElRRQIiLiSgooERFxJQWUiIi4kgJKRERcSQElIiKupIASERFXUkCJiMi5ycyEvLx6fxsFlIiI1F5+Ptx0E9x6a72/lQJKRERqp7QUbrkFiovhlVfq/e3O1s1cRETEevBB+Phj+MtfIDKy3t9OV1AiQElJCX379qVnz55ERkby+OOPA5CdnU2/fv0IDw9n1KhRlJaWOlypiEPmz4dZs2xIjRzplbdUQIkAwcHBrFmzhs8++4ytW7eSkZHBhg0b+N///V/uv/9+9uzZw4UXXsicOXOcLlXE+z7+GO68E667DmbM8NrbKqBEAI/HQ7NmzQAoKyujrKwMj8fDmjVrGDFiBABJSUmkpaU5WKWIA/bsgYQEuOwyWLwYgrx3Z0gBJfKNiooKevXqRevWrYmNjaVTp060bNmSoG/+QYaGhpJXzdTa1NRUoqOjiY6OprCw0Ntli9SfnByIiQFjYNkyuPhir769AkrkGw0bNmTr1q3k5uayceNGdu3aVauvS05OJjMzk8zMTFq1alXPVYp4SXY2XH89HD4Mf/sbdO7s9RIUUCKnadmyJQMGDGD9+vUUFRVRXl4OQG5uLiEhIQ5XJ+IFmZnws5/BV1/BihXQu7cjZSigRIDCwkKKiooAOHHiBCtXriQiIoIBAwawePFiAObOnUtCQoKDVYrUs4oKeOklG05BQfDhh9C/v2PlaB2UCFBQUEBSUhIVFRVUVlYycuRIbrrpJrp168bo0aN59NFHueKKKxg/frzTpYrUvcpKe49p2jTYvBni4mDePK/fczqdxxhT0/EaD4rIqaKjo8nMzHS6DBHLGDh6FE6csI+TJ203iJMn4cgR2L0bPvsMli+3EyLat4dnn4VRo8Dj8Wal1b6ZrqBERPxFZSWsWQPp6fDRRzaAjh+v+WuaNYOBA20wDR8O553nnVprQQElIuLrKivhrbfgiSdg715o0sTeR7ruOggJsb9u3BjOPx8aNbKPpk2hSxd73LtXS7WmgBIR8WW5uXD77bB6NVxxhQ2qoUNtGPk4BZSIiK9at86GUWkp/N//wR13QAP/mZytgBIR8UXLl9t7Rj/5Cbz7riMLaeub/0StiEigWLTI9sfr1g3+/ne/DCdQQImI+JZ16yAx0S6gXbMG/Li9lgJKRMRX7NsHI0ZAeDgsXQotWjhdUb1SQImI+ILiYjusV15u7zn5eTiBJkmIiLhfZSUkJcH27fD++357z+l0CigREbd76ilYsgSeew4GDXK6Gq/REJ+IiJstWWI7RIwdC/ff73Q1XqWAEhFxq3/+0wZTv352Ia5LWxLVFwWUiIgbHTwI8fFwwQX2KsoPWhedK92DEhFxm7IyuOUWKCiwC3EvvdTpihyhgBIRcZv77oMPPoD586FvX6ercYyG+ERE3CQ1FV5+GR56CMaMcboaRymgRETc4sMP4e67YcgQmDHD6Wocp4ASEXGDHTtg2DDo2BEWLICGDZ2uyHEKKBERp+3aZbddP+88WLYMWrZ0uiJXUECJiDjp44/h6qvBGLsrbni40xW5hgJKRMQJlZXw0ktw3XW28etHH0FEhNNVuYoCSkTEm4yxa5uuvRYmTYLYWNi0KWAawJ4LrYMSEakvFRVw4gQcPw5ZWbB+vd0Nd9Mmu9HgG2/YLuUB1sKothRQIiI/1Oef2+0vNm+GPXvgwAEbRidO2EdZ2Zlf07MnzJoF48ZB48ber9mHKKBERM6FMXbDwGeftRMcAEJDoUsX+OlPoUkTGzzfPr79dYcO0Ls3hIQ4W78PUUCJiNTWvn1w552wahV06gTPPw9Dh8JPfuJ0ZX5JASUiUhsZGZCYaIftZs6EiRMhSD9C65Nm8YmInE1qKsTF2aG8LVvs7DuFU71TQIkAOTk5DBgwgG7duhEZGcnMmTMBOHToELGxsXTu3JnY2FgOHz7scKXidS+8ABMm2IBav14Lab1IASUCBAUF8dxzz7Fz5042bNjA7Nmz2blzJzNmzGDgwIFkZWUxcOBAZqiBZ2CZM8dusz58uN00sEkTpysKKAooEaBdu3b07t0bgObNmxMREUFeXh7p6ekkJSUBkJSURFpamoNViletXg3JyTB4MLz1FjRq5HRFAUcBJXKaffv28emnn9KvXz8OHDhAu3btAGjbti0HDhxwuDrxiuxsGDXKth5avFjh5BDd5RP5L8XFxQwfPpwXXniBCy644JRjHo8HTzUr/lNTU0lNTQWgsLDQK3VKPTp+3E4dr6iAtDRo1szpigKWrqBEvlFWVsbw4cNJTExk2LBhALRp04aCggIACgoKaN269Rlfl5ycTGZmJpmZmbRq1cqrNUsdMwbGj4dt2+yeTJoQ4SgFlAhgjGH8+PFERETwwAMPVD0fHx/P3LlzAZg7dy4JCQlOlSje8Pvfw8KFkJJid7UVR3mMMTUdr/GgiL/46KOPuPrqq+nRowcNGtj/tz3zzDP069ePkSNH8p///IcOHTqwaNEiLrroou/9faKjo8nMzPRW2VKX/vY3uOEGGDHChpQauHpTtX/YCiiROqSA8lF790KfPnYh7vr10LSp0xUFmmoDSkN8IhLYiovh5pvt52lpCicX0Sw+EQlcxsAvfwk7d9peex07Ol2R/BcFlIgErhkz7Dqn3/3O7mwrrqIhPhEJTO++C1Onwq23woMPOl2NVEMBJSKB5x//sJ0ioqPhtdc0Y8+lFFAiElg2bLCdydu3h2XL1ADWxRRQIhI41qyBQYOgVSu7K646f7iaAkpE/J8xdnv2wYPhsstg3Tr7UVxNASUi/m3HDoiJsRMhfv5z+OgjCAlxuiqpBQWUiPifw4fh7bchIQF69IBPP4VXXoG//hVatnS6OqklrYMSEd/w9df26uezz+A//4Fjx+zWGKd/PHIE8vPt17RqZaeS33svXHKJs/XLOVNAiYi7rVsHs2bZNkTl5fa5iy+2+zQ1bWofTZpAmzb2Y7NmcPnl8NOfwlVXQZB+zPkqfedExJ327YNJk+C992wgTZoEN95om7o2b+50deIFCigRcZ+0NLj9drur7YwZNpwaN3a6KvEyBZSIuMvMmXDffbbLw6JFEBbmdEXiEM3iExH3+N3vbDgNH24nRCicApoCSkTcISUFHn4YRo+2O9oGBztdkThMASUiznvzTfj1ryExEebP18w7ARRQIuK0Tz6BO+6A666DN95QOEkVBZSIOCc31263fumltvPDeec5XZG4iP6rIiLOOH7chlNxse0srk4PchoFlIh4nzF2WG/LFkhPh8hIpysSF1JAiYj3vfQSLFgATz9tO4yLVEP3oETEu/7xD7v1RXw8PPKI09WIiymgRMR79u+HW26BDh1g7lxooB9B8v00xCci3lFebhfhFhVBRob2ZZKzUkCJSP0zBiZOtFtnzJ8PUVFOVyQ+QNfXIlL/nn0W/vhH2y1izBinqxEfoYASkfr1l7/AlClw663w1FNOVyM+RAElIvVn5UpISoKrr7ZtjDQpQs6B/raIAOPGjaN169Z079696rlDhw4RGxtL586diY2N5fDhww5W6IOWLLFrnLp2hXfeUXdyOWcKKBHg9ttvJyMj45TnZsyYwcCBA8nKymLgwIHMmDHDoep8jDF2KG/4cOjVC9assVu2i5wjBZQIcM0113DRRRed8lx6ejpJSUkAJCUlkZaW5kBlPubzzyE2Fn7zG7jtNvjgA4WT/GAKKJHvceDAAdq1awdA27ZtOXDgQLWvS01NJTo6mujoaAoLC71ZojtUVn63ZUaPHpCZCa+8Yhfinn++09WJD9M6KJFa8Hg8eDyeao8lJyeTnJwMQHR0tDfLqj/GQHY27NwJhYXw1VdQUgKlpd89jh+HvXth61Y4eBAaN4bx4+GJJ6BNG6fPQPyAAkrke7Rp04aCggLatWtHQUEBrVu3drqk+vfPf8Krr9oJDvv3V/+a4GBo1Mh+DAuDG2+0w3pxcXDhhd6tV/yaAkrke8THxzN37lymTJnC3LlzSUhIcLqk+pOXB/fdB4sX2yuhuDgbOj172quhiy+GJk2gYUP4nitJkbqmgBIBbr31Vj744AMOHjxIaGgo06ZNY8qUKYwcOZI5c+bQoUMHFi1a5HSZ9WPxYjs0V1ZmJzfcey+cNmFExAkeY0xNx2s8KCKnio6OJjMz0+kyascYSEmBqVOhf3/bIy883OmqJDBVe1muKyiRQFRZCXfdZfvjJSbCa69pxp24jqaZiwQaY+Cee75r3jp/vsJJXEkBJRJonnnGrlN6+GG75bomPYhLKaBEAsmyZfDYY/CLX8CMGQoncTUFlEigyMqy95t69rTDewoncTkFlEggOHoUEhLgvPMgLc2uaRJxOc3iE/F3lZUwdizs3m33Z+rQwemKRGpFASXi76ZPt1dNf/gDDBjgdDUitaYhPhF/tnQpPP44jBljO0SI+BAFlIi/+vxzOyniiisgNVWTIsTnKKBE/NGRI3Dzzbbj+Dvv2AawIj5G96BE/E1FhV3ntGePnRRx2WVOVyTygyigRPzNI4/A8uW2W8R11zldjcgPpiE+EX/y0kvwu9/BxIm2GayID1NAifiLt96CSZPsgtyZM52uRuRHU0CJ+IPXX4fbboNrr4WFCyFIo/fi+xRQIr6sshKeesruiBsba5vBausM8RP6b5aIr8rJgTvugL/9zS7EnTMHGjVyuiqROqOAEvE1ubkwe7a9z2SMXYR7xx1aiCt+RwEl4gYVFfDll5CfD8XFUFJy6uPYMbuu6aOPYNMmG0YjR8Jvf6vmr+K3FFAiTsnJgTfftGuWNm2Ckydrfn3jxtCrFzz5pB3SCwvzSpkiTlFAiXhbfr4NmTlzoLwc+vSx65bCwyEkBC64wE50OP3RujU0bOh09SJeo4AS8abFi+HOO+2Q3YQJ8OCDuhIS+R4KKBFvqKy0YfTCC9C3rx3a69zZ6apEXE3roETqW3k53H67DadJk+xEB4WTyFnpCkqkPlVUwKhRsGQJPP00/PrXmg4uUksKKJH69MADNpyefx7uv9/pakR8iob4ROrLrFnw4os2mBROIudMASVSH5Yvh3vvhfh4u/2FiJwzBZTIWWRkZNC1a1fCw8OZMWPG2b9g2zZ736lXL7sFhtYuifwgHmNMTcdrPCji7yoqKujSpQsrV64kNDSUPn36sGDBArp161bt66N79SKzqMjO3Nu4ES691LsFi/imamcO6QpKpAYbN24kPDycjh070qhRI0aPHk16enr1Ly4thb174cABSEtTOIn8SAookRrk5eXRvn37ql+HhoaSl5dX/Yvvvdc2ep0zB6KjvVShiP+qcYhvyJAh5uDBg14ppLCwkFatWnnlvdwgkM7Xl8/18OHDfP3113T4pmP4V199xbFjx7jsssuqXlNYWEjF/v20LS1lu8dD9969nSrX63z5e3uuAulcwbvnu3nz5hXGmCGnP++ae1DR0dFkZmZ66+0cF0jn68vnun79ep544glWrFgBQEpKCgCPPPLIdy9atw5iYmDwYJquXcuxY8ecKNURvvy9PVeBdK7g9fPVPSiRc9WnTx+ysrLIzs6mtLSUhQsXEh8f/90L9u2DESNsJ/I//9mxOkX8kTpJiNQgKCiIWbNmMXjwYCoqKhg3bhyRkZH2YHExJCTYGXvp6dCihbPFivgZ1wRUcnKy0yV4VSCdr6+fa1xcHHFxcac+WVlpG8Bu3w7vvw9dugBwySWXeL9AB/n69/ZcBNK5gjvO1zX3oER8yrRp8MQT8Nxztt/eNwLtPoVIHdE9KJE68dxzNpzGjlWPPZF65HhAPfbYY0RFRdGrVy8GDRpEfn4+AMYYJk2aRHh4OFFRUWzZssXhSn+8yZMnc/nllxMVFcXQoUMpKiqqOpaSkkJ4eDhdu3atmjHm695++20iIyNp0KDBGVcVPnm+FRXwyCPw0EMwciT88Y+nbJ2RkZHB9u3ba98SyceMGzeO1q1b071796rnDh06RGxsLJ07dyY2NpbDhw87WGHdycnJYcCAAXTr1o3IyEhmzpwJ+Of5lpSU0LdvX3r27ElkZCSPP/44ANnZ2fTr14/w8HBGjRpFaWmp94szxtT0qHdHjhyp+nzmzJlmwoQJxhhjli1bZoYMGWIqKyvN+vXrTd++fb1RTr1asWKFKSsrM8YY8/DDD5uHH37YGGPMjh07TFRUlCkpKTH//ve/TceOHU15ebmTpdaJnTt3ml27dplrr73WbNq0qep5nzzf/HxjYmKMAWMmTDDmtHrLy8tNx44dTffu3c3JkydNVFSU2bFjh0PF1o9169aZzZs3m8jIyKrnJk+ebFJSUowxxqSkpFT9nfZ1+fn5ZvPmzcYYY77++mvTuXNns2PHDr8838rKSnP06FFjjDGlpaWmb9++Zv369eaWW24xCxYsMMYYM2HCBPPyyy/XZxnVZpDjV1AXXHBB1efHjh3D883/SNPT0xk7diwej4f+/ftTVFREQUGBU2XWiUGDBhEUZOel9O/fn9zcXMCe6+jRowkODiYsLIzw8HA2btzoZKl1IiIigq5du57xvE+d75Ej8NvfQteudifc116DV145owHsty2RgoODz94SyUddc801XHTRRac8l56eTlJSEgBJSUmkpaU5UFnda9euHb2/WXDdvHlzIiIiyMvL88vz9Xg8NGvWDICysjLKysrweDysWbOGESNGAM6dqytm8U2dOpV58+bRokUL1q5dC3x/i5l27do5VWadev311xk1ahRgz7V///5Vx2psp+MHXHO+lZVw4gScPHnq4+BB2LEDVq+222YUF0NcnN2y/Xu2av/27+tXX30F2HP65JNPvHgyzjhw4EDVv8m2bdty4MABhyuqe/v27ePTTz+lX79+fnu+FRUVXHnllezZs4e7776bTp060bJly6r/UDv1b9QrARUTE8P+/fvPeH769OkkJCQwffp0pk+fTkpKCrNmzWLatGneKKtenO1cv/08KCiIxMREb5dX52pzvq5w/Lhdq7RmDXz6KWRnw+HDUNMs1rZt4dZbYcIEuPJK79XqozweT9UIiL8oLi5m+PDhvPDCC6eM9oB/nW/Dhg3ZunUrRUVFDB06lF27djldEuClgFq1alWtXpeYmEhcXBzTpk0jJCSEnJycqmO5ubmEhITUV4l15mzn+qc//YmlS5eyevXqqr/cvnquUPvv7X/z6vkWFkJKip3QUFwMF10EvXtDv3728+bNITj41EfLlhARAR06QIPajYL78vfwx2jTpg0FBQW0a9eOgoICWrdu7XRJdaasrIzhw4eTmJjIsGHDAP8+X4CWLVsyYMAA1q9fT1FREeXl5QQFBTn39/n7bk4ZL02S2L17d9XnL774ohk+fLgxxpilS5eeMkmiT58+3iinXr3//vsmIiLCfPnll6c8v3379lMmDYSFhbl/0sA5OH2ShFfOt7LSmDffNObCC41p0MCYMWOMWbvWmIqKun2fb5SVlZmwsLBTJkls3769Xt7LSdnZ2adMknjooYdOmTQwefJkp0qrU5WVlea2224z99577ynP++P5fvnll+bw4cPGGGOOHz9u/ud//se89957ZsSIEadMkpg9e3Z9llFtBjkeUMOGDTORkZGmR48e5qabbjK5ubnGGPsXZOLEiVUzo/77B5yv6tSpkwkNDTU9e/Y0PXv2rJqxaIwxTz/9tOnYsaPp0qWLWb58uYNV1p0lS5aYkJAQ06hRI9O6dWszaNCgqmP1er5lZcZMnGj/el91lTFemk23bNkyExwcbDp27Giefvppr7ynN40ePdq0bdvWBAUFmZCQEPPaa6+ZgwcPmuuvv96Eh4ebgQMHmq+++srpMuvEhx9+aADTo0ePqn+vy5Yt88vz/eyzz0yvXr1Mjx49TGRkpJk2bZoxxpi9e/eaPn36mE6dOpkRI0aYkpKS+iyj2gxSJwnxL8XFMHo0LFtm1yvNmOHVLdfVSULkB6n2Zp4rZvGJ1ImSEoiPt9tfvPwy/OpXTlckIj+CAkr8Q3m5nXG3di3Mnw9jxjhdkYj8SI4v1BX50YyBu+6CtDSYOVPhJOInFFDi+156CebMgalTYdIkp6sRkTqigBLf9ve/w4MP2ntPTz7pdDUiUocUUOK78vJsV/GwMJg3r9aLakXEN2iShPimkydhxAg7rXz1am23LuKHFFDim+6/HzZsgEWLIDLS6WpEpB5oTER8zxtv2C0vJk+GW25xuhoRqScKKPEtmZl2Ae7118MzzzhdjYjUIwWU+I6cHDtbr00bWLgQgjRCLeLP9C9cfENxMfz85/bjxx9Dq1ZOVyQi9UwBJe5XUWHbGG3fbpvAdu/udEUi4gUKKHE3Y+xC3KVLbQPYwYOdrkhEvET3oMS9jIFHH7X99e67T93JRQKMrqDEnSoq4IEH4MUXYcIEeO45pysSES9TQIn77N8Pv/iF3Trj/vttOHmq3c9MRPyYhvjEPUpL4YUXICLCdol4/XV4/nmFk0iA0hWUOKOiwk4ZP3oUdu+GFSvgzTchPx9iY+19p4gIp6sUEQfpCkrqXmWlXav07LMwdiwMHAi9e0PnztC2LTRtahfZtmwJ7dvb488/D1FR8P77Nqy8GE5vv/02kZGRNGjQgMzMzFOOpaSkEB4eTteuXVmxYoXXahIRXUFJXTp61F75vPYafPGFfa59e/sICYHmzat/XHopXHON/dwB3bt3Z8mSJUyYMOGU53fu3MnChQvZsWMH+fn5xMTEsHv3bho2bOhInSKBRgEldWPhQrubbWEhxMTA9OkwaJBPdHyI+J6rtfT0dEaPHk1wcDBhYWGEh4ezceNGrrrqKi9XKBKYFFDy45SUwF13wdy50K+f7fTQp4/TVdWJvLw8+vfvX/Xr0NBQ8vLyznhdamoqqampABQWFnqtPhF/p4CSH+7IEUhIgHXr4De/gccec20D15iYGPbv33/G89OnTychIeFH/d7JyckkJycDEB0d/aN+LxH5jjt/moj7HTpkJzds3w5//rNdt+Riq1atOuevCQkJIScnp+rXubm5hISE1GVZIlIDzeKTc1dWBiNHws6d8N57rg+nHyo+Pp6FCxdy8uRJsrOzycrKom/fvk6XJRIwFFBy7h54AFavhtRUGDLE6Wp+tHfeeYfQ0FDWr1/PjTfeyOBvGtJGRkYycuRIunXrxpAhQ5g9e7Zm8Il4kccYU9PxGg9KAEpNtb3xHnwQfv97p6txnejo6DPWUonIWVXbLkZXUFJ769bB3XfDDTfAb3/rdDUi4ucUUFI72dkwfDiEh8OCBaChLhGpZwooObujRyE+3rYwevddaNHC6YpEJABomrnUrLISbrsN/vUvyMiw/fRERLxAASU1e+wxSE+3GwfGxDhdjYgEEA3xyfdbsACeeQbuuAPuucfpakQkwCigpHqbNsG4cXD11TB7tjYNFBGvU0DJmfLz4eaboU0b+OtfoVEjpysSkQCke1ByqhMnYOhQ2wj24499YrsMEfFPCij5TkWFHdbbuBGWLLE73IqIOERDfGJVVMD48XbjwZQUexUlIuIgBZRAaSn88pd208EnnoApU5yuSEREQ3wBLy8PEhNtn72nnoJHH3W6IhERQAEVuMrLYf5825X85En7+ZgxTlclIlJFARVocnPtBIhXXoFdu6B/f5g3Ty2MRMR1FFD+ID/fLqzNyoIDB2xz1xMnoKTk1I9790JBgf2aK66wa5yGDtUiXBFxJQWUryopsVc+qamwefN3zwcH227jjRvD+eef+jEmBq68EmJjoVs352oXEakFBZSvMcYO0U2aZK+crrgCZsyAa66BiAgbTroiEhE/oIDyJSUldrv1efOgVy87sWHAAAWSiPglBZSv2L/f3i/asMGuVZo6FYL07RMR/6WfcL4gNxeuvdaG1OLFdut1ERE/p4Byu/374frr4eBBWLsW+vZ1uiIREa9QQLnZyZN2WC8/H1auVDiJSEBRQLmVMXD33fae0+LFcNVVTlckIuJVahbrVq++CnPm2MkQuuckIgFIAeVGH35o1zndeCNMm+Z0NSIijlBAuU1ODowYAR07wptvQsOGTlckIuII3YNyk2+3Wz9xAj74AFq2dLoiERHHKKDcwhi46y7bVy893bYtEhEJYBric4sXX7QtjKZNg/h4p6sJKJMnT+byyy8nKiqKoUOHUlRUVHUsJSWF8PBwunbtyooVK5wrUiQAKaDcYM0au3HgzTdrR1sHxMbGsn37drZt20aXLl1ISUkBYOfOnSxcuJAdO3aQkZHBxIkTqaiocLhakcChgHLavn0wciR07WqvoBroW+JtgwYNIuibvob9+/cnNzcXgPT0dEaPHk1wcDBhYWGEh4ezceNGJ0sVCSj6aeikoiK46Sa7/XpaGjRv7nRFAe/111/nhhtuACAvL4/27dtXHQsNDSUvL8+p0kQCjiZJOKW01C7A3b0bMjK05Xo9i4mJYf/+/Wc8P336dBISEqo+DwoKIjEx8Zx+79TUVFJTUwEoLCz88cWKCKCAckZZmR3WW7MG5s61zWClXq1atarG43/6059YunQpq1evxvPN/lohISHk5ORUvSY3N5eQkJAzvjY5OZnk5GQAoqOj67BqkcCmIT5vO37cLsRNT4eXXoKxY52uKOBlZGTw7LPP8u6779KkSZOq5+Pj41m4cCEnT54kOzubrKws+qphr4jX6ArKm/LybDh98gnMmmWbwYrj7rnnHk6ePElsbCxgJ0q8+uqrREZGMnLkSLp160ZQUBCzZ8+moTp7iHiNxxhT0/EaD0otGQOLFsHEiXYLjXnzYNgwp6uSehAdHU1mZqbTZYj4Gk91T2qIrz6VlsLbb8PPfgajR0NYGGzZonASEakFDfGdq4oK+OIL2LsXDh+G4mIbRGVl9mNpKRQUwK5d8PHHcOwYXHYZ/PGP8MtfqvmriEgtKaBqo7ISli61Q3OrVsGRIzW/vlkzO208Kcmucxo0SMEkInKOFFBn8+678MgjsHMntGtnJzlcdRWEh8Mll0DTphAcDI0awXnn2cf554On2iFVERGpJQXU9/n6azup4c9/hm7d7MeRIyFIf2QiIt6gn7bVycuDuDjYsQMefxx+/Wt7hSQiIl6jgDrdzp0weLC9z7R8ub1/JCIiXqeA+m9ffAGxsXZSxN//Dr16OV2RiEjAUkB96+BBe+V0/Dh8+CF07+50RSIiAU0BBXat0o032r2ZVq5UOImIuIACqrLSrlfKzIS//hWuvtrpikREBAUUTJ9ug+n3v7dbrouIiCsEdi++9HT4zW9gzBh44AGnqxERkf8SuAG1Y4cNpj59IDVVnR9ERFwmMAPq0CFISLA98955Bxo3droiERE5TeDdgyovh1GjICcHPvgAqtnCW0REnBd4AfXww7Yj+euv26avIiLiSoE1xDd3LvzhDzBpkt2bSUREXCtwAuqTTyA5Ga6/3k4pFxERVwuMgMrPh6FD7f2mRYvsnk0iIuJq/n8P6tgxGDbM7u+0YgVcfLHTFYmISC34d0AdPWq3XN+0CRYvhh49nK5IRERqyX+H+L74Aq65Bv7xD3jrLTvEJyIiPsP/AsoYe58pOhqys2HpUrvuSUREfIr/BJQxsG6d3dNp1Ci47DLYuBGGDHG6MhER+QHcfw+qshIOH7aTHI4dg9LS7x4lJXYPp23b7ASIPXvsJIiZM+Huu6FhQ6erFxGRH8h9AWUMrF8PS5bYK6KdO+0utzVp0sTeb5oyBX7xC/XWExHxA+4KqDVrbCuizZuhUSP42c/gzjshLAxatICmTSE42B779tG+vX008J/RShERcUtAHTkCEyfa2XZhYfDqq/ZKqHlzpysTERGHOB9Qu3fbrS/27LGbB06ZoiE6ERFxeBbf5s3Qrx8cPGg7jE+bpnASr3vssceIioqiV69eDBo0iPz8fACMMUyaNInw8HCioqLYsmWLw5WKBBbnAmrbNhg0CFq2tNPBr73WsVIksE2ePJlt27axdetWbrrpJp588kkA3n//fbKyssjKyiI1NZVf/epXDlcqElicCah//QtiYuzsuzVr7H0nEYdccMEFVZ8fO3YMj8cDQHp6OmPHjsXj8dC/f3+KioooKChwqkyRgOP9e1CHDsGNN9pZd6tXK5zEFaZOncq8efNo0aIFa9euBSAvL4/27dtXvSY0NJS8vDzatWt3ytempqaSmpoKQGFhofeKFvFz3r2CKi+H0aMhLw/S0qBLF6++vQSumJgYunfvfsYjPT0dgOnTp5OTk0NiYiKzZs06p987OTmZzMxMMjMzadWqVX2ULxKQvHsF9cgjsHIlzJkD/ft79a0lsK1atapWr0tMTCQuLo5p06YREhJCTk5O1bHc3FxCQkLqq0QROY33rqDeesvuZHv33TBunNfeVuRssrKyqj5PT0/n8ssvByA+Pp558+ZhjGHDhg20aNHijOE9Eak/3rmC2rIFxo+37Yj+8AevvKVIbU2ZMoXPP/+cBg0a0KFDB1599VUA4uLiWL58OeHh4TRp0oQ33njD4UpFAovHGFPT8RoP1sqxY9Ctm236unkztG79o39LEbeKjo4mMzPT6TJEfI2nuifr/wqqaVN48kmIjFQ4iYhIrXlniC8pyStvIyIi/kMtwEVExJUUUCIi4koKKBERcSUFlIiIuJICSkREXEkBJSIirqSAEhERV1JAiYiIKymgRETElRRQIiLiSmdrFisi58Dj8WQYY4Y4XYeIP1BAiYiIK2mIT0REXEkBJSIirqSAEhERV1JAiYiIKymgRETElf4fo1wK2GIymSMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sympy import *\n",
    "var('x y t')\n",
    "P=plot_parametric((t, t+sin(t)), (t,-10*pi,10*pi),line_color=\"red\")\n",
    "Q=plot_parametric((t+sin(t), t), (t,-10*pi,10*pi),line_color=\"green\")\n",
    "P.extend(Q)\n",
    "P.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "id": "6b2f269b-8d65-4f40-9ae8-a138ff700896",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "P.save('foo.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "id": "627407f0-2afc-4a67-9f1c-4b6dd0b70c62",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "var(\"x_:2(:2) b_(:2)(:2)\")\n",
    "m=Matrix(( (x_00,x_01),\n",
    "           (x_10,x_11))\n",
    "      )\n",
    "n=Matrix(((b_00,b_01),(b_10,b_11)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "id": "df0fbe3d-007b-4d2e-b20f-b0025fcb8641",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle b_{00} b_{11} x_{00} x_{11} - b_{00} b_{11} x_{01} x_{10} - b_{01} b_{10} x_{00} x_{11} + b_{01} b_{10} x_{01} x_{10}$"
      ],
      "text/plain": [
       "b_00*b_11*x_00*x_11 - b_00*b_11*x_01*x_10 - b_01*b_10*x_00*x_11 + b_01*b_10*x_01*x_10"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "det(m*n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "id": "03e32f8b-b39c-421a-b479-0b65d0131794",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(b_{00} b_{11} - b_{01} b_{10}\\right) \\left(x_{00} x_{11} - x_{01} x_{10}\\right)$"
      ],
      "text/plain": [
       "(b_00*b_11 - b_01*b_10)*(x_00*x_11 - x_01*x_10)"
      ]
     },
     "execution_count": 162,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "det(m*n).factor()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "id": "1fb55757-e756-4f2d-af72-a1c81cbe1c1a",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}x_{00} & x_{10}\\\\x_{01} & x_{11}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[x_00, x_10],\n",
       "[x_01, x_11]])"
      ]
     },
     "execution_count": 163,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.transpose()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "id": "0b55b3ce-020d-43a1-b51b-0eb75693c52a",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numpy.matrix"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy\n",
    "numpy.matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "id": "3a4e24e6-4e35-433c-b958-ab63a90cd71f",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "M=numpy.matrix(((a_00,a_01),(a_10,a_11)))\n",
    "N=numpy.matrix(((b_00,b_01),(b_10,b_11)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "id": "85d996ff-d5cf-458c-9e75-cc60b1454165",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[a_00*b_00 + a_01*b_10, a_00*b_01 + a_01*b_11],\n",
       "        [a_10*b_00 + a_11*b_10, a_10*b_01 + a_11*b_11]], dtype=object)"
      ]
     },
     "execution_count": 166,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M*N"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "id": "c306ed7b-fff8-42bd-a85f-3166826587cc",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[a_00 + b_00, a_01 + b_01],\n",
       "        [a_10 + b_10, a_11 + b_11]], dtype=object)"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M+N"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "id": "96b62797-1889-44c4-9c1c-97f817e2fc2f",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}b_{00} + x_{00} & b_{01} + x_{01}\\\\b_{10} + x_{10} & b_{11} + x_{11}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[b_00 + x_00, b_01 + x_01],\n",
       "[b_10 + x_10, b_11 + x_11]])"
      ]
     },
     "execution_count": 168,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m+n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "id": "a3f103cc-58a2-44ce-9c70-456adae1b6c6",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(-I*y - 7, y), (I*y - 7, y)]"
      ]
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('x y')\n",
    "solve(x**2+14*x + y**2 +49 , [x,y])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "id": "ccbc7982-dd4b-47f7-963f-b5e4e10973d4",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{x: -I*y - 7}, {x: I*y - 7}]"
      ]
     },
     "execution_count": 170,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x,y = Symbol('x',real=True), Symbol('y',real=True)\n",
    "solve( x**2+14*x + y**2 +49 , [x,y], dict=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "id": "f99bb704-81c8-4fe0-99d3-224a1b75fb0d",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'O': None,\n",
       " 'Q': None,\n",
       " 'N': None,\n",
       " 'I': None,\n",
       " 'E': None,\n",
       " 'S': None,\n",
       " 'beta': None,\n",
       " 'zeta': None,\n",
       " 'gamma': None,\n",
       " 'pi': None}"
      ]
     },
     "execution_count": 171,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sympy.abc._clash"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4ed45fc-89f1-4149-b240-aa4581cefb71",
   "metadata": {},
   "source": [
    "\n",
    "次の連立方程式、\n",
    "$$\n",
    "\\begin{cases}\n",
    "\\begin{array}{ll}\n",
    "{y^{2}} &= x^{3} - 3 x^{2} + 2 x, \\\\\n",
    "y^{3} - 3 y^{2} &= x^{2} - 2 x \\\\\n",
    "\\end{array}\n",
    "\\end{cases}\n",
    "$$\n",
    "\n",
    "を解いてみる。\n",
    "\n",
    "まずは、`solve`を使ってみる。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "id": "83f6f4c9-37b8-4d57-8d96-4551e7ab472b",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{x: 0, y: 0},\n",
       " {x: 2, y: 0},\n",
       " {x: (-100430359332221*2**(2/3)*sqrt(321)*(3*sqrt(321) + 83)**(1/3) - 1799313569466781*2**(2/3)*(3*sqrt(321) + 83)**(1/3) - 10509656634114902 - 586586690687382*sqrt(321) + 738244296370706*2**(1/3)*(3*sqrt(321) + 83)**(2/3) + 41205380328146*2**(1/3)*sqrt(321)*(3*sqrt(321) + 83)**(2/3))/(-14331349955611230 - 799890941846430*sqrt(321) + 4110599705273*2**(1/3)*sqrt(321)*(3*sqrt(321) + 83)**(2/3) + 73655594558553*2**(1/3)*(3*sqrt(321) + 83)**(2/3) + 75878494479370*2**(2/3)*sqrt(321)*(3*sqrt(321) + 83)**(1/3) + 1359479401002570*2**(2/3)*(3*sqrt(321) + 83)**(1/3)),\n",
       "  y: -(3*sqrt(321)/2 + 83/2)**(1/3)/3 - 10/(3*(3*sqrt(321)/2 + 83/2)**(1/3)) + 5/3},\n",
       " {x: (-123616140984438*sqrt(107)*2**(1/3)*(3*sqrt(321) + 83)**(2/3) - 738244296370706*2**(1/3)*sqrt(3)*(3*sqrt(321) + 83)**(2/3) - 301291077996663*sqrt(107)*2**(2/3)*(3*sqrt(321) + 83)**(1/3) - 1799313569466781*2**(2/3)*sqrt(3)*(3*sqrt(321) + 83)**(1/3) - 100430359332221*2**(2/3)*sqrt(321)*I*(3*sqrt(321) + 83)**(1/3) - 1799313569466781*2**(2/3)*I*(3*sqrt(321) + 83)**(1/3) + 1173173381374764*sqrt(321)*I + 21019313268229804*I + 738244296370706*2**(1/3)*I*(3*sqrt(321) + 83)**(2/3) + 41205380328146*2**(1/3)*sqrt(321)*I*(3*sqrt(321) + 83)**(2/3))/(-73655594558553*2**(1/3)*sqrt(3)*(3*sqrt(321) + 83)**(2/3) - 12331799115819*sqrt(107)*2**(1/3)*(3*sqrt(321) + 83)**(2/3) + 227635483438110*sqrt(107)*2**(2/3)*(3*sqrt(321) + 83)**(1/3) + 1359479401002570*2**(2/3)*sqrt(3)*(3*sqrt(321) + 83)**(1/3) + 4110599705273*2**(1/3)*sqrt(321)*I*(3*sqrt(321) + 83)**(2/3) + 73655594558553*2**(1/3)*I*(3*sqrt(321) + 83)**(2/3) + 75878494479370*2**(2/3)*sqrt(321)*I*(3*sqrt(321) + 83)**(1/3) + 1359479401002570*2**(2/3)*I*(3*sqrt(321) + 83)**(1/3) + 1599781883692860*sqrt(321)*I + 28662699911222460*I),\n",
       "  y: 5/3 - (-1/2 + sqrt(3)*I/2)*(3*sqrt(321)/2 + 83/2)**(1/3)/3 - 10/(3*(-1/2 + sqrt(3)*I/2)*(3*sqrt(321)/2 + 83/2)**(1/3))},\n",
       " {x: (1799313569466781*2**(2/3)*sqrt(3)*(3*sqrt(321) + 83)**(1/3) + 301291077996663*sqrt(107)*2**(2/3)*(3*sqrt(321) + 83)**(1/3) + 738244296370706*2**(1/3)*sqrt(3)*(3*sqrt(321) + 83)**(2/3) + 123616140984438*sqrt(107)*2**(1/3)*(3*sqrt(321) + 83)**(2/3) - 100430359332221*2**(2/3)*sqrt(321)*I*(3*sqrt(321) + 83)**(1/3) - 1799313569466781*2**(2/3)*I*(3*sqrt(321) + 83)**(1/3) + 1173173381374764*sqrt(321)*I + 21019313268229804*I + 738244296370706*2**(1/3)*I*(3*sqrt(321) + 83)**(2/3) + 41205380328146*2**(1/3)*sqrt(321)*I*(3*sqrt(321) + 83)**(2/3))/(-1359479401002570*2**(2/3)*sqrt(3)*(3*sqrt(321) + 83)**(1/3) - 227635483438110*sqrt(107)*2**(2/3)*(3*sqrt(321) + 83)**(1/3) + 12331799115819*sqrt(107)*2**(1/3)*(3*sqrt(321) + 83)**(2/3) + 73655594558553*2**(1/3)*sqrt(3)*(3*sqrt(321) + 83)**(2/3) + 4110599705273*2**(1/3)*sqrt(321)*I*(3*sqrt(321) + 83)**(2/3) + 73655594558553*2**(1/3)*I*(3*sqrt(321) + 83)**(2/3) + 75878494479370*2**(2/3)*sqrt(321)*I*(3*sqrt(321) + 83)**(1/3) + 1359479401002570*2**(2/3)*I*(3*sqrt(321) + 83)**(1/3) + 1599781883692860*sqrt(321)*I + 28662699911222460*I),\n",
       "  y: 5/3 - 10/(3*(-1/2 - sqrt(3)*I/2)*(3*sqrt(321)/2 + 83/2)**(1/3)) - (-1/2 - sqrt(3)*I/2)*(3*sqrt(321)/2 + 83/2)**(1/3)/3},\n",
       " {x: 2 - sqrt(2), y: 2 - sqrt(2)},\n",
       " {x: sqrt(2) + 2, y: sqrt(2) + 2}]"
      ]
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import *\n",
    "var('x y')\n",
    "eqs=[Eq(y**2, x**3 - 3*x**2 +2*x), Eq(x**2-2*x ,y**3 - 3*y**2) ]\n",
    "sols=solve(eqs, [x,y], dict=True)\n",
    "sols"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "69f4ae41-b13a-4712-908e-23144f173938",
   "metadata": {},
   "source": [
    "と解はでるが、どうやって解いたのかは解らないので一歩づつ進めてみる。\n",
    "まず、第一式を第２式に代入し、yについて解いてみる。\n",
    "方程式を因数分解してみやすい形にしておく。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "id": "9b185696-1703-45b3-8764-3e6ff8f4e3f6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle y^{2} = x \\left(x - 2\\right) \\left(x - 1\\right)$"
      ],
      "text/plain": [
       "Eq(y**2, x*(x - 2)*(x - 1))"
      ]
     },
     "execution_count": 173,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eqs=factor(eqs)\n",
    "eqs[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "id": "d8e67863-a443-4f3a-a586-8403a8376d4f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x \\left(x - 2\\right) = y^{2} \\left(y - 3\\right)$"
      ],
      "text/plain": [
       "Eq(x*(x - 2), y**2*(y - 3))"
      ]
     },
     "execution_count": 174,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eqs[1]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6534d61a-7eba-41fe-bc64-867331ec09c4",
   "metadata": {},
   "source": [
    "第一式を第二式に代入する。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "id": "22b3db79-da1f-460b-adf0-0d534bb5ee4d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x \\left(x - 2\\right) = x \\left(x - 2\\right) \\left(x - 1\\right) \\left(y - 3\\right)$"
      ],
      "text/plain": [
       "Eq(x*(x - 2), x*(x - 2)*(x - 1)*(y - 3))"
      ]
     },
     "execution_count": 175,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factor(eqs[1].subs(eqs[0].lhs,eqs[0].rhs))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e404e73d-b6a3-4762-899f-d3f8a944fb14",
   "metadata": {},
   "source": [
    "これを解くと次のようになる。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "id": "a61013d6-1e14-4885-b237-11f40951c799",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{x: 0}, {x: 2}, {y: (3*x - 2)/(x - 1)}]"
      ]
     },
     "execution_count": 176,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sols_y=solve(factor(eqs[1].subs(eqs[0].lhs,eqs[0].rhs)),(x,y),dict=True)\n",
    "sols_y"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0478f8ad-164b-48bd-8b71-4829f2888c8b",
   "metadata": {},
   "source": [
    "これらの解を第一式に代入すると、"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "id": "76e25476-182d-4b1e-af05-1f7882a6bcaa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Eq(y**2, 0), Eq(y**2, 0), Eq((3*x - 2)**2/(x - 1)**2, x*(x - 2)*(x - 1))]"
      ]
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[eqs[0].subs(sol) for sol in sols_y]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "id": "6a80d440-ec77-4bdd-b554-1272766834df",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Eq(0, y**2*(y - 3)),\n",
       " Eq(0, y**2*(y - 3)),\n",
       " Eq(x*(x - 2), (-3 + (3*x - 2)/(x - 1))*(3*x - 2)**2/(x - 1)**2)]"
      ]
     },
     "execution_count": 178,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[eqs[1].subs(sol) for sol in sols_y]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65f6a91e-b9f1-4dd8-9f05-6c4f54c98531",
   "metadata": {},
   "source": [
    "それぞれの場合に、これらの方程式の解を求める。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "id": "bbf7237a-a9aa-4c24-aa3a-7da7961627e3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[{y: 0}],\n",
       " [{y: 0}],\n",
       " [{x: 2 - sqrt(2)},\n",
       "  {x: sqrt(2) + 2},\n",
       "  {x: 1/3 + (-1/2 - sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3) - 8/(9*(-1/2 - sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3))},\n",
       "  {x: 1/3 - 8/(9*(-1/2 + sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3)) + (-1/2 + sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3)},\n",
       "  {x: -8/(9*(29/54 + sqrt(321)/18)**(1/3)) + 1/3 + (29/54 + sqrt(321)/18)**(1/3)}]]"
      ]
     },
     "execution_count": 179,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[solve(eqs[0].subs(sol),(x,y),dict=True) for sol in sols_y]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cbfec874-f19a-456e-bd5f-707d0cb31a88",
   "metadata": {},
   "source": [
    "$x=2$ および $x=2$ の場合はいずれも$y=0$が解となることがわかる。\n",
    "$y=\\frac{3 x -2}{x-1}$の場合には、$x$として五個の解がある。これをもう少し調べてみる。\n",
    "$x\\ne0$かつ$x\\ne2$の時の$x,y$の関係を求める。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ef24fedc-baa3-48f6-af9e-9b153bc33e5e",
   "metadata": {},
   "source": [
    "これを方程式の第１式に代入して、整理してみる。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "id": "31b43c76-b931-4490-87e7-3cf8c4727855",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\\left(x^{2} - 4 x + 2\\right) \\left(x^{3} - x^{2} + 3 x - 2\\right)\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x^{2} - 4 x + 2\\right) \\left(x^{3} - x^{2} + 3 x - 2\\right)$"
      ],
      "text/plain": [
       "(x**2 - 4*x + 2)*(x**3 - x**2 + 3*x - 2)"
      ]
     },
     "execution_count": 180,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eq0=eqs[0].subs(sols_y[-1]).simplify()\n",
    "expr0=eq0.lhs-eq0.rhs\n",
    "num,den=expr0.as_numer_denom()\n",
    "expr0 *=den\n",
    "expr0=expr0.factor()\n",
    "print(latex(expr0))\n",
    "expr0"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "abc8cfdc-a841-415e-a3a9-119124f8c01b",
   "metadata": {},
   "source": [
    "第２式に代入しても同じ式にたどり着く。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "id": "158fc4b6-a514-4729-87a3-04e176a3da35",
   "metadata": {},
   "outputs": [],
   "source": [
    "eq1=eqs[1].subs(sols_y[-1]).simplify()\n",
    "expr1=eq1.lhs-eq1.rhs\n",
    "num,den=expr1.as_numer_denom()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "id": "71fe1906-fdd6-4b5e-b270-95f95aaf0566",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x^{2} - 4 x + 2\\right) \\left(x^{3} - x^{2} + 3 x - 2\\right)$"
      ],
      "text/plain": [
       "(x**2 - 4*x + 2)*(x**3 - x**2 + 3*x - 2)"
      ]
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr1 *=den\n",
    "expr1=expr1.factor()\n",
    "expr1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4be08fae-aeb9-48ba-b868-f942a305cd63",
   "metadata": {},
   "source": [
    "$\\left(x^{2} - 4 x + 2\\right) = 0$ および $\\left(x^{3} - x^{2} + 3 x - 2\\right)=0$ をそれぞれ解いて、\n",
    "$y$を$y=\\frac{3 x -2}{x-1}$で求めれば、全ての解が確定する。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ecc067c2-424b-4070-a7d9-9c9bc07bb8ae",
   "metadata": {},
   "source": [
    "`.args`をつかって、因数の各項を取り出せる。これらが0となる解をそれぞれ求める。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "id": "4404db60-48d9-4120-9af2-e69d464829eb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(x**2 - 4*x + 2, x**3 - x**2 + 3*x - 2)"
      ]
     },
     "execution_count": 183,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr1.args"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "id": "67a5eda8-838b-46fc-9518-93b71efbd3b8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2 - sqrt(2), sqrt(2) + 2]"
      ]
     },
     "execution_count": 184,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('x')\n",
    "sol1=solve(Eq(expr1.args[0],0),x)\n",
    "sol1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0da941c-ab3b-4472-8dd1-2229f6f65262",
   "metadata": {},
   "source": [
    "これらの解を、$y=(3 x -2)/(x-1)$に代入して、元の方程式の解 $ x, y$を求める。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "id": "20796d95-5629-4ed0-83e3-6271670a8eac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{x: 2 - sqrt(2), y: 2 - sqrt(2)}, {x: sqrt(2) + 2, y: sqrt(2) + 2}]"
      ]
     },
     "execution_count": 185,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sol1_y=[{x:x1, y:((3*x1-2)/(x1-1)).simplify()} for x1 in sol1]\n",
    "sol1_y"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dda92c01-7524-4885-9f8e-51ab98874755",
   "metadata": {},
   "source": [
    "`expr1`の因数の後半から、"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "id": "c63a015e-fa8d-4113-8b99-2c5d61e70717",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1/3 + (-1/2 - sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3) - 8/(9*(-1/2 - sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3)),\n",
       " 1/3 - 8/(9*(-1/2 + sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3)) + (-1/2 + sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3),\n",
       " -8/(9*(29/54 + sqrt(321)/18)**(1/3)) + 1/3 + (29/54 + sqrt(321)/18)**(1/3)]"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('x')\n",
    "sol2=solve(Eq(expr1.args[1],0),x)\n",
    "sol2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ab49b03c-5c7c-4dc3-b8a4-683d89284bbc",
   "metadata": {},
   "source": [
    "$x,\\,y$のペアを作成"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "id": "aa06d289-57d3-4bf7-bb28-37c6c94dbbeb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{x: 1/3 + (-1/2 - sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3) - 8/(9*(-1/2 - sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3)),\n",
       "  y: 3*(-64*2**(1/3) + (1 + sqrt(3)*I)*(4 + 2**(2/3)*(1 + sqrt(3)*I)*(29 + 3*sqrt(321))**(1/3))*(29 + 3*sqrt(321))**(1/3))/(-64*2**(1/3) + (1 + sqrt(3)*I)*(8 + 2**(2/3)*(1 + sqrt(3)*I)*(29 + 3*sqrt(321))**(1/3))*(29 + 3*sqrt(321))**(1/3))},\n",
       " {x: 1/3 - 8/(9*(-1/2 + sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3)) + (-1/2 + sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3),\n",
       "  y: 3*(-64*2**(1/3) + (1 - sqrt(3)*I)*(4 + 2**(2/3)*(1 - sqrt(3)*I)*(29 + 3*sqrt(321))**(1/3))*(29 + 3*sqrt(321))**(1/3))/(-64*2**(1/3) + (1 - sqrt(3)*I)*(8 + 2**(2/3)*(1 - sqrt(3)*I)*(29 + 3*sqrt(321))**(1/3))*(29 + 3*sqrt(321))**(1/3))},\n",
       " {x: -8/(9*(29/54 + sqrt(321)/18)**(1/3)) + 1/3 + (29/54 + sqrt(321)/18)**(1/3),\n",
       "  y: 3*((29 + 3*sqrt(321))**(1/3)*(-2**(2/3)*(29 + 3*sqrt(321))**(1/3) + 2) + 16*2**(1/3))/((29 + 3*sqrt(321))**(1/3)*(-2**(2/3)*(29 + 3*sqrt(321))**(1/3) + 4) + 16*2**(1/3))}]"
      ]
     },
     "execution_count": 187,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sol2_y=[{x:x1, y:((3*x1-2)/(x1-1)).simplify()} for x1 in sol2]\n",
    "sol2_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "id": "a1cb7d31-0a94-4938-8124-c0a700da2752",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{x: 2 - sqrt(2), y: 2 - sqrt(2)},\n",
       " {x: sqrt(2) + 2, y: sqrt(2) + 2},\n",
       " {x: 1/3 + (-1/2 - sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3) - 8/(9*(-1/2 - sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3)),\n",
       "  y: 3*(-64*2**(1/3) + (1 + sqrt(3)*I)*(4 + 2**(2/3)*(1 + sqrt(3)*I)*(29 + 3*sqrt(321))**(1/3))*(29 + 3*sqrt(321))**(1/3))/(-64*2**(1/3) + (1 + sqrt(3)*I)*(8 + 2**(2/3)*(1 + sqrt(3)*I)*(29 + 3*sqrt(321))**(1/3))*(29 + 3*sqrt(321))**(1/3))},\n",
       " {x: 1/3 - 8/(9*(-1/2 + sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3)) + (-1/2 + sqrt(3)*I/2)*(29/54 + sqrt(321)/18)**(1/3),\n",
       "  y: 3*(-64*2**(1/3) + (1 - sqrt(3)*I)*(4 + 2**(2/3)*(1 - sqrt(3)*I)*(29 + 3*sqrt(321))**(1/3))*(29 + 3*sqrt(321))**(1/3))/(-64*2**(1/3) + (1 - sqrt(3)*I)*(8 + 2**(2/3)*(1 - sqrt(3)*I)*(29 + 3*sqrt(321))**(1/3))*(29 + 3*sqrt(321))**(1/3))},\n",
       " {x: -8/(9*(29/54 + sqrt(321)/18)**(1/3)) + 1/3 + (29/54 + sqrt(321)/18)**(1/3),\n",
       "  y: 3*((29 + 3*sqrt(321))**(1/3)*(-2**(2/3)*(29 + 3*sqrt(321))**(1/3) + 2) + 16*2**(1/3))/((29 + 3*sqrt(321))**(1/3)*(-2**(2/3)*(29 + 3*sqrt(321))**(1/3) + 4) + 16*2**(1/3))}]"
      ]
     },
     "execution_count": 188,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solutions=sol1_y+sol2_y\n",
    "solutions"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0da03616-28d8-4ea4-8d21-2ff5eb0226d3",
   "metadata": {},
   "source": [
    "解が方程式を満たしていることを確認する。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "id": "3e4d2f08-1a76-42ca-b05d-ed86913bd8cd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x \\left(x - 2\\right) \\left(x - 1\\right) = \\frac{\\left(3 x - 2\\right)^{2}}{\\left(x - 1\\right)^{2}}$"
      ],
      "text/plain": [
       "Eq(x*(x - 2)*(x - 1), (3*x - 2)**2/(x - 1)**2)"
      ]
     },
     "execution_count": 189,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "check0=eqs[0].subs(sols_y[2]).simplify()\n",
    "check0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 190,
   "id": "d4d7752d-2b70-45da-9f90-71b96b2bdbf9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[True, True, True, True, True]"
      ]
     },
     "execution_count": 190,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[check0.subs(r, simultaneous=True).simplify() for r in solutions]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "id": "4dfb6abf-4d7d-40a5-bbe4-49233c644f0b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x \\left(x - 2\\right) = \\frac{\\left(3 x - 2\\right)^{2}}{\\left(x - 1\\right)^{3}}$"
      ],
      "text/plain": [
       "Eq(x*(x - 2), (3*x - 2)**2/(x - 1)**3)"
      ]
     },
     "execution_count": 191,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "check1=eqs[1].subs(sols_y[2]).simplify()\n",
    "check1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "id": "43622925-4906-4869-8d01-cc225784a524",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[True, True, True, True, True]"
      ]
     },
     "execution_count": 192,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[check1.subs(r, simultaneous=True).simplify() for r in solutions]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3fcbd721-ff16-4f0b-9612-783f54e64e49",
   "metadata": {},
   "source": [
    "式 $x^3 - x^2 + 3 x - 2 = 0$ は $x\\rightarrow x+\\frac{1}{3}$ を行うことで, カルダノの公式の標準形に変換できる。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "id": "8a70ee82-8da4-411c-8784-f474ceb1a705",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{3} + \\frac{8 x}{3} - \\frac{29}{27}$"
      ],
      "text/plain": [
       "x**3 + 8*x/3 - 29/27"
      ]
     },
     "execution_count": 193,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(x**3 - x**2 + 3*x - 2).subs(x,x+Rational(1,3)).expand().collect(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "id": "af295537-6ac9-4c8a-8f80-8e396928d5c2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{8 \\sqrt[3]{2}}{3 \\sqrt[3]{29 + 3 \\sqrt{321}}} + \\frac{1}{3} + \\frac{2^{\\frac{2}{3}} \\sqrt[3]{29 + 3 \\sqrt{321}}}{6}$"
      ],
      "text/plain": [
       "-8*2**(1/3)/(3*(29 + 3*sqrt(321))**(1/3)) + 1/3 + 2**(2/3)*(29 + 3*sqrt(321))**(1/3)/6"
      ]
     },
     "execution_count": 194,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solutions[-1][x].expand().simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "id": "75ec5cbf-57a8-449c-b22e-63c939c72093",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{29}{54} + \\frac{\\sqrt{321}}{18}$"
      ],
      "text/plain": [
       "29/54 + sqrt(321)/18"
      ]
     },
     "execution_count": 195,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p=Rational(8,3);q=-Rational(29,27)\n",
    "u3=-q/2+sqrt((q/2)**2+(p/3)**3)\n",
    "v3=-q/2-sqrt((q/2)**2+(p/3)**3)\n",
    "(-q/2+sqrt((q/2)**2+(p/3)**3)).simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "id": "b4ac324a-dc49-4b78-a4f8-559f23e108de",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(29/27, 0)"
      ]
     },
     "execution_count": 196,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(u3+v3).expand().simplify(),factor((u3*v3-(-p/3)**3).expand().simplify())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "id": "d4496baf-90d9-42fa-bba9-a11745e99f1d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - \\frac{8 \\sqrt[3]{2}}{3 \\sqrt[3]{29 + 3 \\sqrt{321}}} + \\sqrt[3]{\\frac{29}{54} + \\frac{\\sqrt{321}}{18}}$"
      ],
      "text/plain": [
       "-8*2**(1/3)/(3*(29 + 3*sqrt(321))**(1/3)) + (29/54 + sqrt(321)/18)**(1/3)"
      ]
     },
     "execution_count": 197,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(u3**(Rational(1,3)).simplify() + ((-p/3)*u3**Rational(-1,3)).simplify())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "id": "e213cbcb-6b70-4a8d-afdd-28c9687f4428",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "({2: 9}, {3: 6})"
      ]
     },
     "execution_count": 198,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factorint(512),factorint(729)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "id": "ca08f9ca-1eeb-426d-80fc-b3f14a4aed8b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-8/(9*(29/54 + sqrt(321)/18)**(1/3)) + 1/3 + (29/54 + sqrt(321)/18)**(1/3), 0)"
      ]
     },
     "execution_count": 199,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solutions[-1][x].as_real_imag()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "id": "c3ebb53a-1eff-41a6-9a02-71e015e4156e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((-100430359332221*2**(2/3)*sqrt(321)*(3*sqrt(321) + 83)**(1/3) - 1799313569466781*2**(2/3)*(3*sqrt(321) + 83)**(1/3) - 10509656634114902 - 586586690687382*sqrt(321) + 738244296370706*2**(1/3)*(3*sqrt(321) + 83)**(2/3) + 41205380328146*2**(1/3)*sqrt(321)*(3*sqrt(321) + 83)**(2/3))/(-14331349955611230 - 799890941846430*sqrt(321) + 4110599705273*2**(1/3)*sqrt(321)*(3*sqrt(321) + 83)**(2/3) + 73655594558553*2**(1/3)*(3*sqrt(321) + 83)**(2/3) + 75878494479370*2**(2/3)*sqrt(321)*(3*sqrt(321) + 83)**(1/3) + 1359479401002570*2**(2/3)*(3*sqrt(321) + 83)**(1/3)),\n",
       " 0)"
      ]
     },
     "execution_count": 200,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('omega')\n",
    "sols[2][x].as_real_imag()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "51d4e05a-2904-4e79-80d2-6ee29a726701",
   "metadata": {},
   "source": [
    "これらの解は数値的には0と見做せる小さな違いを除いて一致している。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "id": "174be9ea-ecb7-4cf5-a974-423b52ff35d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle -2.0 \\cdot 10^{-125}$"
      ],
      "text/plain": [
       "-0.e-125"
      ]
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N(sols[2][x]-solutions[-1][x])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "id": "fac98023-d867-4df4-a720-d9d2affd0125",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4.0 \\cdot 10^{-130} - 1.0 \\cdot 10^{-131} i$"
      ],
      "text/plain": [
       "0.e-130 - 0.e-131*I"
      ]
     },
     "execution_count": 202,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N(sols[3][x]-solutions[-2][x])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "id": "b22d28f2-6e19-4190-bf39-598122393f16",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 4.0 \\cdot 10^{-130} + 1.0 \\cdot 10^{-131} i$"
      ],
      "text/plain": [
       "0.e-130 + 0.e-131*I"
      ]
     },
     "execution_count": 203,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N(sols[4][x]-solutions[2][x])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "id": "6223f58a-f8b6-4f21-8964-5ae4afeb4810",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{2: 1, 3: 1, 5: 1, 17: 1, 31: 1, 47: 1, 19286675489: 1}"
      ]
     },
     "execution_count": 204,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factorint(14331349955611230)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 205,
   "id": "e8ac9f65-2e86-4b9e-9712-0057fd662c3f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{2: 1, 3: 2, 5: 1, 7: 1, 83: 1, 241: 1, 4889: 1, 12983: 1}"
      ]
     },
     "execution_count": 205,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factorint(799890941846430)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "id": "2d801daf-bef1-4765-9728-ba80aa2f8573",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2048$"
      ],
      "text/plain": [
       "2048"
      ]
     },
     "execution_count": 206,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "((29+3*sqrt(321))*(3*sqrt(321)-29)).expand().simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "id": "b16fbc26-2a79-4b7e-a2a7-787323bdb9b4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "53.82642291487147"
      ]
     },
     "execution_count": 207,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "160646206240*3/8953569504"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "id": "fb4080a1-5064-43f2-9fa8-f6d2b07261a4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle e^{- \\frac{2 i \\pi}{3}}$"
      ],
      "text/plain": [
       "exp(-2*I*pi/3)"
      ]
     },
     "execution_count": 208,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "omega=exp(2*I*pi/3)\n",
    "omega**2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 209,
   "id": "a8c6c18a-5f27-4948-ac90-7de1cf394693",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1 - \\sqrt[3]{-1} + e^{\\frac{2 i \\pi}{3}}$"
      ],
      "text/plain": [
       "1 - (-1)**(1/3) + exp(2*I*pi/3)"
      ]
     },
     "execution_count": 209,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(1+omega+omega**2).simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 210,
   "id": "e291f497-9e98-48df-aaf5-102c7a7ebb99",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-(-1)**(1/3)*(x**2*y + x**2*z + x*y**2 + 3*x*y*z + x*z**2 + y**2*z + y*z**2 + (-1)**(2/3)*(x**3 + x**2*y + (-1)**(2/3)*x**2*y + x**2*z + (-1)**(2/3)*x**2*z + x*y**2 + (-1)**(2/3)*x*y**2 + 3*(-1)**(2/3)*x*y*z + x*z**2 + (-1)**(2/3)*x*z**2 + y**3 + y**2*z + (-1)**(2/3)*y**2*z + y*z**2 + (-1)**(2/3)*y*z**2 + z**3))\n"
     ]
    }
   ],
   "source": [
    "expr=(x+y+z)*(x+omega*y+omega**2*z)*(x+omega**2*y+omega*z)\n",
    "print(expr.expand().simplify())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "id": "7e47864e-48b3-4143-896f-9b27f4a7976a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-(-1)**(1/3)*(x**2*(y + z) + x*(y**2 + 3*y*z + z**2) + y**2*z + y*z**2 + (-1)**(2/3)*(x**3 + x**2*(y + (-1)**(2/3)*y + z + (-1)**(2/3)*z) + x*(y**2 + (-1)**(2/3)*y**2 + 3*(-1)**(2/3)*y*z + z**2 + (-1)**(2/3)*z**2) + y**3 + y**2*z + (-1)**(2/3)*y**2*z + y*z**2 + (-1)**(2/3)*y*z**2 + z**3))\n"
     ]
    }
   ],
   "source": [
    "print(expr.expand().simplify().collect(x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 212,
   "id": "6b0b33a6-cf3d-4e53-aaea-a57a71015b2b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x + y + z\\right) \\left(x^{2} - x y - x z + y^{2} - y z + z^{2}\\right)$"
      ],
      "text/plain": [
       "(x + y + z)*(x**2 - x*y - x*z + y**2 - y*z + z**2)"
      ]
     },
     "execution_count": 212,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(x**3 + y**3 + z**3 - 3*x*y*z).factor()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "id": "c794a417-f32d-4900-a805-51939ba62796",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} - x y - x z + y^{2} - y z + z^{2}$"
      ],
      "text/plain": [
       "x**2 - x*y - x*z + y**2 - y*z + z**2"
      ]
     },
     "execution_count": 213,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var('omega x y z p q')\n",
    "expr=(x+omega*y+z*omega**2)*(x+y*omega**2+omega*z);\n",
    "expr.expand().subs({omega**4:omega,omega**3:1,}).subs({omega**2:-1-omega}).simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "id": "8f2cf502-fcad-40ad-87d9-bc82182b2bf4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{y**3: q/2 - sqrt(3)*sqrt(4*p**3 + 27*q**2)/18,\n",
       "  z**3: q/2 + sqrt(3)*sqrt(4*p**3 + 27*q**2)/18},\n",
       " {y**3: q/2 + sqrt(3)*sqrt(4*p**3 + 27*q**2)/18,\n",
       "  z**3: q/2 - sqrt(3)*sqrt(4*p**3 + 27*q**2)/18}]"
      ]
     },
     "execution_count": 214,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solve([Eq((-p/3)**3,y**3*z**3),Eq(q,y**3+z**3)],(y**3,z**3),dict=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 215,
   "id": "5de0ebdd-970b-4225-af53-e9ac76f6cda2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{y**3: q/2 - sqrt(12*p**3 + 81*q**2)/18},\n",
       " {y**3: q/2 + sqrt(12*p**3 + 81*q**2)/18}]"
      ]
     },
     "execution_count": 215,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solve(Eq(y**3+(-p/3)**3/y**3,q),y**3,dict=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05addf07-5c6a-4e6e-9995-d78d36aa6cc0",
   "metadata": {},
   "source": [
    "$y^3= \\left(q/2+\\sqrt{12 p^3+81 q^2}/18\\right)$は1の複素3乗根を$\\omega$として、\n",
    "$y = y_0, \\omega y_0, \\omega^2 y_0$ ただし、$y_0=(q/2-\\sqrt(12 p^3+81 q^2)/18)^{1/3}$.\n",
    "此の時、$z$は$z=(-p/3)/y_0, (-p/3)/y_0 \\omega^2, (-p/3)/y_0 \\omega$ということになる。\n",
    "\n",
    "$z_0= (-p/3)/y_0="
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "id": "ddcde35f-1f49-4ed7-83d2-ab106be11081",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\sqrt[3]{- p^{3}}}{3}$"
      ],
      "text/plain": [
       "(-p**3)**(1/3)/3"
      ]
     },
     "execution_count": 216,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_0=(q/2-sqrt(12*p**3+81*q**2)/18)**(Integer(1)/Integer(3))\n",
    "z_0=(q/2+sqrt(12*p**3+81*q**2)/18)**(Integer(1)/Integer(3))\n",
    "((y_0**3*z_0**3).expand())**(Integer(1)/Integer(3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "id": "d70eb8d4-3522-47f6-98bf-0cc84ff12da5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on method expand in module sympy.core.expr:\n",
      "\n",
      "expand(deep=True, modulus=None, power_base=True, power_exp=True, mul=True, log=True, multinomial=True, basic=True, **hints) method of sympy.core.power.Pow instance\n",
      "    Expand an expression using hints.\n",
      "    \n",
      "    See the docstring of the expand() function in sympy.core.function for\n",
      "    more information.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(z_0.expand)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "id": "6b0b61c3-6ea0-420b-a881-a445be6c415f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1$"
      ],
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 218,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(z_0/(q/2+sqrt(12*p**3+81*q**2)/18)**(Integer(1)/Integer(3))).expand(deep=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "id": "ed2c64a4-d2e6-4fc1-97cf-fbdbb0fed0e0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\omega^{4} y z + \\omega^{3} y^{2} + \\omega^{3} z^{2} + \\omega^{2} x y + \\omega^{2} x z + \\omega^{2} y z + \\omega x y + \\omega x z + x^{2}$"
      ],
      "text/plain": [
       "omega**4*y*z + omega**3*y**2 + omega**3*z**2 + omega**2*x*y + omega**2*x*z + omega**2*y*z + omega*x*y + omega*x*z + x**2"
      ]
     },
     "execution_count": 219,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expr.expand().simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "id": "89115166-2106-4a56-b5cd-54884278f11a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{k: -8/9}, {k: 0}]"
      ]
     },
     "execution_count": 220,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import *\n",
    "var('x k y')\n",
    "expr=(k+1)*x**2+k*x-2*k \n",
    "sols=solve(expr,x,dict=True)\n",
    "solve(Eq( x.subs(sols[0]), x.subs(sols[1])),k,dict=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "id": "12a301dd-02df-47ae-8a95-b4e5841d22f1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{k: -8/9}, {k: 0}]"
      ]
     },
     "execution_count": 221,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import *\n",
    "var('x k y')\n",
    "expr=(k+1)*x**2+k*x-2*k \n",
    "sols=solve(expr, x)\n",
    "solve(Eq(sols[0], sols[1]), k, dict=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 222,
   "id": "6cd81ee1-53c3-4adc-909b-8ec7eec5cdee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1935325904 + 108537648 \\sqrt{321}$"
      ],
      "text/plain": [
       "1935325904 + 108537648*sqrt(321)"
      ]
     },
     "execution_count": 222,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "((29 +3*sqrt(321))**5).expand().simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "id": "1b5b57d1-8394-49ec-9350-c311288325bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "({2: 3, 7: 1, 17: 1, 103: 1, 241: 1}, {2: 4, 3: 1, 1171: 1, 1931: 1})"
      ]
     },
     "execution_count": 223,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factorint(23631496),factorint(108537648)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "id": "863227fe-8a7c-43d4-a1db-c45aaa7048b2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{2: 1, 5: 1, 373: 1}"
      ]
     },
     "execution_count": 224,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factorint(3730)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "id": "8740364b-86a1-4da6-ae72-df5286c69150",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 275732 + 16236 \\sqrt{321}$"
      ],
      "text/plain": [
       "275732 + 16236*sqrt(321)"
      ]
     },
     "execution_count": 225,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "((29 +3*sqrt(321))**3).expand().simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "id": "04178251-773b-415c-b354-3d53e3578cd2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "({2: 2, 29: 1, 2377: 1}, {2: 2, 3: 2, 11: 1, 41: 1})"
      ]
     },
     "execution_count": 226,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "factorint(275732), factorint(16236)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.10"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {},
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
