{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Matematikai Algoritmusok és Felfedezések II.\n", "\n", "## 1. SymPy.\n", "\n", "### 2021 szeptember 9." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Technikai információk" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "### Oktatók\n", "Előadás: Damásdi Gábor \n", " - (Iroda: Déli 3.508)\n", " - Fogadó óra: Előzetes egyeztetés szerint. \n", "\n", "Gyakorlat: \n", " - Dobrovoczki Péter pdobrovoczki@caesar.elte.hu" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Anyagok elérhetősége:\n", "- [damasdigabor.web.elte.hu/teaching](https://damasdigabor.web.elte.hu/teaching)\n", "- [Kooplex](https://kooplex-edu.elte.hu/hub)\n", "- Ha onlinera váltunk: [Youtube csatorna](https://www.youtube.com/playlist?list=PL3L6lTzsxoURHao2aPVWBWak1uxm1J83I)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Tantárgy célja\n", "\n", "- **Matematikusok számára hasznos programozási tudás átadása**\n", "- Programozás általános folyamatának gyakorlása\n", "- Egy programozási nyelv (Python) alapjainak elsajátítása\n", "- Matematikusoknak hasznos programozási könyvtárak megismerése\n", "- Matematikai algoritmusok implementálása\n", "- Alapozás későbbi órákhoz(Algoritmusok tervezése és elemzése, Adatbányászat, Deep learning)\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Tematika\n", " - Haladó Python \n", " - Hasznos könyvtárak\n", " - Matematikai témák/algoritmusok\n", " \n", " \n", " **Lesznek meghívott előadók**\n", " - Differenciálegyenletek\n", " - Algoritmusok\n", " - Gépi tanulás\n", " - Optimalizáció, solverek\n", " " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Követelmények\n", "- Beadandó feladat elkészítése \n", "- Beadandó feladat bemutatása" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Az általunk használt programozási környezet\n", "\n", "- Python\n", "- Jupyter\n", "- Kooplex\n", "- Anaconda\n", "- Github" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Kérdések?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Szimbolikus programozás\n", "### Tudományos csomagok (Python Scientific stack)\n", "| csomag | |\n", "| --- | --- |\n", "| NumPy | Hatékony N-dimenziós tömb |\n", "| SciPy | Numerikus számítások |\n", "| Matplotlib | Grafikonok és rajzok |\n", "| IPython (Jupyter) | Interaktív notebook |\n", "| **SymPy** | **Szimbolikus számítások** |\n", "| Pandas | Adatbányászat |" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "import sympy as sym\n", "import math\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A python alapból kerekítve tárolja a `float`-okat" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "math.log(16), math.log(16, 2), math.exp(2), math.exp(math.log(10)),math.sqrt(8)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "$$\\pi^4+\\pi^5$$ $$=?$$ $$e^6$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "np.pi**4+np.pi**5-np.e**6" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Szimbolikus számítások \n", "A szimbolikus számítások célja, hogy a matematikai objektumokat precízen kezelje, kerekítések nélkül, és hogy formális objektumokkal is tudjunk számolni, mint például polinomok vagy függvények. \n", "\n", "Előnyök:\n", " - Pontos eredmény\n", " - Közelebb van a matematikai gondolkodásmódhoz\n", "\n", "Hátrányok:\n", " - Körülményes használni\n", " - Lassabb \n", " - Sok minden megoldhatatlan pontosan" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## SymPy\n", "\n", "A SymPy három új típust vezet be a számoknak: Real, Rational és Integer." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = sym.Rational(1, 2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.Rational(7)**(sym.Rational(1,2))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(sym.Rational(7)**(sym.Rational(1,2)))**2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.pi**2" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Tetszőleges pontossággal kiértékelhetőek a valós számok:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.pi.evalf()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.pi.evalf(2000)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Itt is van végtelen!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.oo > 99999" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.oo+1" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "1/-sym.oo" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### A szokásos műveletek működnek:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(sym.Rational(1, 2)+sym.Rational(3, 4))\n", "print(sym.Rational(1, 2)*sym.Rational(3, 4))\n", "print(sym.Rational(1, 2)/sym.Rational(3, 4))" ] }, { "cell_type": "raw", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Azért mindent nem tud:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a=sym.real_root((sym.Rational(8)+sym.real_root(sym.Rational(21),2)*sym.Rational(3)),3)+sym.real_root((sym.Rational(8)-sym.real_root(sym.Rational(21),2)*sym.Rational(3)),3)-1\n", "a" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a.evalf(20)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Szimbolikus változók\n", "A Python változóival szemben itt deklarálni kell a változókat!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = sym.Symbol('x') \n", "y = sym.Symbol('y')\n", "alma=sym.Symbol('z') #nem kell hogy passzoljanak" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "2*x+x**2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(x+y)**2" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Expand**\n", "\n", "Kifejti az kifejezést" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.expand((x + y) ** 3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.expand(x + y, complex=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.expand(sym.cos(x + y),trig=True)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Simplify**\n", "\n", "Egyszerűsíti a kifejezést" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(x + x * y) / x" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.simplify((x + x * y) / x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.simplify(sym.sin(x)/sym.cos(x))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.trigsimp(sym.sin(x)**2 + sym.cos(x)**2)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Behelyettesítés, kiértékelés**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "f=sym.cos(x)+7\n", "f.subs(x,y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "f # A SymPy objektumai immutableök!! (kivéve a mátrixokat)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "f.subs(x,0)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Szorzattá alakítás**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "f = x ** 4 - 3 * x ** 2 + 1\n", "sym.factor(f)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "f = x ** 42 -1\n", "sym.factor(f)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Egyebek**\n", "\n", " - apart: parciális törtekre bontás\n", " - collect: adott változó szerint csoportosítás" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "expr = (4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x)\n", "expr" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.apart(expr)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "expr = x*y + x - 3 + 2*x**2*y**2 - y*x**2 + y**2+x**3\n", "collected_expr = sym.collect(expr, y)\n", "collected_expr" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "collected_expr = sym.collect(expr, x)\n", "collected_expr" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Számítások" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Határérték `limit`**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(sym.limit(x, x, sym.oo))\n", "print(sym.limit((2*x+3) / x, x, sym.oo))\n", "print(sym.limit(x ** x, x, 0))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Deriválás\n", "A `sym.diff(func, var, n)` kiszámolja az n. deriváltat." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.diff(sym.sin(2 * x), x, 2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "sym.diff(sym.log(x), x, 1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Taylor sorfejtés**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.series(sym.cos(x), x, 0)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Integrálás\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.integrate(6 * x ** 5, x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.integrate(sym.sin(x), x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.integrate(sym.exp(-x ** 2) * sym.erf(x), x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.integrate(sym.exp(-x**2 - y**2), (x, -sym.oo, sym.oo), (y, -sym.oo, sym.oo))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Határozott integrál**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.integrate(sym.sin(x), (x, 0, sym.pi / 2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Improprius integrál**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.integrate(sym.exp(-x ** 2), (x, -sym.oo, sym.oo))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Egyenletek megoldása\n", "Az első paraméter az egyenlet, aminek a gyökeit keresi, a második a változó." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.solveset(x ** 4 - 1, x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = sym.Symbol('a') \n", "b = sym.Symbol('b')\n", "c = sym.Symbol('c')\n", "d = sym.Symbol('d')\n", "e = sym.Symbol('e')\n", "f = sym.Symbol('f')\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.solveset(a*x ** 2 + b*x +c , x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "sym.solveset(a*x ** 3 + b*x**2 +c*x+d , x) " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "sym.solveset(a*x ** 4 + b*x**3 +c*x**2+d*x+e , x) " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "sym.solveset(a*x ** 5 + b*x**4 +c*x**3+d*x**2+e*x+f , x)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Ezzel szemben a Numpy simán megold nekünk magasabb rendű polinomokat numerikusan:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "coeff = [1, 2, 1,2,7,9,10,11]\n", "np.roots(coeff)\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Lineáris egyenletrendszer**\n", "\n", "A `solve` parancsot használhatjuk, ami egy dict-el tér vissza. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "solution = sym.solve((x + 5 * y - 2, -3 * x + 6 * y - 15), (x, y))\n", "solution[x], solution[y]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "z=sym.Symbol('z')\n", "sym.linsolve([x + y + z - 1, x + y + 2*z - 3 ], (x, y, z))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Lineáris algebra\n", "https://docs.sympy.org/latest/tutorial/matrices.html" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.Matrix([[1, 0], [0, 1]])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**A nagy különbség a Numpy tömbjeivel szemben, hogy szimbólumokat is tehetünk bele!**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "A = sym.Matrix([[1, x], [y, 1]])\n", "A" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "A.det()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "A.eigenvals()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "A.eigenvects() ## sajátérték, multiplicitás, sajátvetor hármasokat ad vissza" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "P, D = A.diagonalize()\n", "print(P)\n", "print(D)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ " P*D*(P**-1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.simplify( P*D*P**-1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bonyolultabb kifejezéseknél olyan problémába is futhatunk, hogy a program nem tudja eldönteni a kifejezésről, hogy 0-e, és elrontja a Gauss-eliminációt. (Ez sajnos elkerülhetetlen: https://en.wikipedia.org/wiki/Constant_problem)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Szimbolikus függvények" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "f, g = sym.symbols('f g', cls=sym.Function)\n", "2*f(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "f(x).diff(x) + f(x)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Differenciálegyenletek**\n", "\n", "$f'(x)=f(x)$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.dsolve(f(x).diff(x) - f(x), f(x))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.dsolve(sym.sin(x) * sym.cos(f(x)) + sym.cos(x) * sym.sin(f(x)) * f(x).diff(x), f(x), hint='separable') " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Számelmélet\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.isprime(4332221111)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.isprime(314159)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.sieve._list" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "120121 in sym.sieve" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.sieve._list" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "sym.ntheory.generate.prime(100)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sym.ntheory.factorint(120)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Minden szám előáll legfeljebb 4 négyzetszám összegeként." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from sympy.solvers.diophantine import diop_general_sum_of_squares\n", "from sympy.abc import a, b, c, d, e\n", "diop_general_sum_of_squares(a**2 + b**2 + c**2 + d**2 - 2345)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "[(i,diop_general_sum_of_squares(a**2 + b**2 + c**2 + d**2 - i)) for i in range (20)]\n", " " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Beépített függvények\n", "\n", "Teljes lista: https://docs.sympy.org/latest/modules/functions/index.html#functions-contents" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(sym.binomial(20,3))\n", "print(sym.factorial(5))\n", "print(sym.gamma(4.5))\n", "print(sym.fibonacci(10))\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Modulok \n", "https://docs.sympy.org/latest/modules/index.html" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Példa\n", "**Létezik-e négy pont a síkon, hogy bármely kettő távolsága páratlan?**\n", "\n", "Tegyük fel, hogy létezik, legyen az egyik pont az origó a másik három pedig $(A_x,A_y),(B_x,B_y),(C_x,C_y)$. Legyen $N=\\begin{pmatrix}\n", "A_y & B_x & C_x\\\\\n", "A_y & B_y & C_y\n", "\\end{pmatrix}\n", "$\n", "\n", "és $M=2NN^T=\\begin{pmatrix}\n", "2|A|^2 & 2 & 2\\\\\n", "2 & 2|B|^2 & 2 \\\\\n", "2 & 2 & 2|C|^2 \\\\\n", "\\end{pmatrix}\n", "=\\begin{pmatrix}\n", "2|A|^2 & |A|^2+|B|^2-|AB|^2 & |A|^2+|C|^2-|AC|^2\\\\\n", "|A|^2+|B|^2-|AB|^2 & 2|B|^2 & |B|^2+|C|^2-|BC|^2 \\\\\n", "|A|^2+|C|^2-|AC|^2 & |B|^2+|C|^2-|BC|^2 & 2|C|^2 \\\\\n", "\\end{pmatrix}\n", "$\n", "\n", "Világos hogy $det(M)=0$ mivel $rank(M)\\le rank(N)\\le 2$\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "a = sym.Symbol('a') \n", "b = sym.Symbol('b')\n", "c = sym.Symbol('c')\n", "d = sym.Symbol('d')\n", "e = sym.Symbol('e')\n", "f = sym.Symbol('f')\n", "ma=2*a+1\n", "mb=2*b+1\n", "mc=2*c+1\n", "md=2*d+1\n", "me=2*e+1\n", "mf=2*f+1\n", "\n", "M=sym.Matrix([[2*ma**2, ma**2+mb**2-md**2,ma**2+mc**2-me**2],[ ma**2+mb**2-md**2,2*mb**2,mb**2+mc**2-mf**2],[ ma**2+mc**2-me**2,mb**2+mc**2-mf**2,2*mc**2] ])\n", "M" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "expr=sym.simplify(sym.expand(M.det()))\n", "expr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "expr.as_coefficients_dict()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "[a%8 for a in expr.as_coefficients_dict().values()]\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Mivel minden együttható osztható 8-al kivéve a konstans tag, a determináns nem lehet osztható 8-al. Tehát nem lehet 0, ellentmondásra jutottunk. " ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3", "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.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }