{ "cells": [ { "cell_type": "markdown", "id": "66721ceb-ddb1-4abc-98b5-24942baefd8d", "metadata": {}, "source": [ "# Expression Manipulation" ] }, { "cell_type": "code", "execution_count": 1, "id": "b40da1b1-b53a-4646-b9bf-88689b9132d9", "metadata": {}, "outputs": [], "source": [ "from sympy import *\n", "from sympy_equation import table_of_expressions\n", "init_printing()" ] }, { "cell_type": "markdown", "id": "5c7a2a42-bf55-49a3-a45d-44e67ea4942f", "metadata": {}, "source": [ "*Expression manipulation* indicates all the techniques that can be used in order to change the structure of a symbolic expression.\n", "\n", "Think, for example, to collecting terms:\n", "\n", "$$\n", "a b + b = b (a + 1)\n", "$$\n", "\n", "This is the code to achieve it with SymPy:" ] }, { "cell_type": "code", "execution_count": 2, "id": "d50e318d-4d13-4b94-9bed-3ff0cdd868a2", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEkAAAAVCAYAAAAKP8NQAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADKElEQVRYCd2Y7XETQQyGD4YCDHRwdOCQCog7MO6AcQfJT/sfEzogqSAkHRgqILgDuwM87sC8z2a1c98+5y4bB83Iq9NqtZJW0p4v2e12SR84m83SPvQ8t44qP14nPcB8Pj+XmmEPqo5BRer9Cba84uTEHIhzK/wo3Oj5Q5DYQ0h2LJFTjRd7RI9mWrZyoPh7InpbNEw8Dn2r8Yo5FyQTEvOP6HuNU+M1jZIjuL80njTJHcOct/VatmyEJAOBeit+KUjiJ+ITi0/Mv4GRARZ+zTzvIy8l8H2fUF/zMvhMuigHd8KH6MVZyX9mjeg27QG/8G8aepIWYgDw82Fo9TvRuoMNbqW5WojMBZ8cvF/4NwhB0q4j4VrMyvQrWiU5etG6yP/PnvFvki03Mmkp50lF4FR4o+c791T+IaiNWae1qWRIWTb7K0TXWPxvGl8C4N/IZZKMJoXpRzh15Z34IvrWOyqyBDS/VYnrGVpH0Gl+F6JBAuPqXHSUkvGmdBnwL7Vys37kujla5QhlB1JWVYCj3BQl8EHgiiU42ZKEbl3SJcXxGfiXWrlROpQaQckCgXifZWTod6KL8jZNiQ2kr9jUOYy68rW1idaRcXZwgS+CPZmvekXBfnd7ZRd0pDnUgQWpZLw2NCN/P2Kjidbk+pX0EXDKebFPX00QEvHJal4BYvU0lwhWbhhfDIadSs7ZjIOkIo7nQA7AA4vBIHA4WqeP6WMD/NhYkDAu9A7vKE5NRW+ZrADkCW4dBH1ewJU0tHRywzWtrdMZm08mrS1I9AluKwOa7g85UuwpNs+4FPKakAOtIahkSwgCQdHzUHgvBEbiFYP4MBPn1/qs63ENW/J3a2k9iev+Wobzx5YU4+pvCpBEkhvkICqAUkUf71wYhCyZdOl50f7KaM8A2tvstX6LnxzWQmOVv8hNO31L0reXlXAY6xuQ9hoLz2Psp31S4Yq9rNxCtA8kuOqrruMD1bQWp5TremRrJS0F+fSDf0mnTCLKivaCqMc43Vh7+Cxa2H5dM4k403+epcew+RMB/oQKyX10e+yGanrcZC/pj2utq/KFy+bON3Qn9w/tjm9rTtJ4LgAAAABJRU5ErkJggg==", "text/latex": [ "$\\displaystyle b \\left(a + 1\\right)$" ], "text/plain": [ "b⋅(a + 1)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a, b = symbols(\"a, b\")\n", "expr = a * b + b\n", "expr.collect(b)" ] }, { "cell_type": "markdown", "id": "657348ad-97d9-4994-bdec-1d8c891d809d", "metadata": {}, "source": [ "This was a simple procedure, because:\n", "\n", "1. The expression is very easy.\n", "2. The term to collect, $b$, is just a single symbol. So we only had to type a single character.\n", "\n", "Now, imagine some complicated expression, in which we need to collect some complicated terms.\n", "Hand-typing the terms to be collected might not be the best way to proceed, because:\n", "\n", "1. we risk introducing typing errors. \n", "2. it takes time to type and double check the correctness of the terms.\n", "\n", "Luckily for us, SymPy's symbolic expressions exposes the `find(pattern)` method, which can be used to extract sub-expressions matching the provided pattern.\n", "\n", "**In this tutorial we are going to explore the limitations of `find(pattern)`, and introduce the `table_of_expressions` class exposed by this module which solves some of these limitations.**" ] }, { "cell_type": "markdown", "id": "d21d6208-fa0d-4e72-b32d-c7336887ae1d", "metadata": {}, "source": [ "## find and table_of_expressions" ] }, { "cell_type": "markdown", "id": "bda80488-d5c7-4ea5-9ada-6f28caac68af", "metadata": {}, "source": [ "Let's consider this expression (which is reasonably simple in order to let the user understand the workflow that can be applied to much more convoluted expressions):" ] }, { "cell_type": "code", "execution_count": 3, "id": "4fcde4d9-be26-4040-841c-6b42115d1db1", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle x^{2} \\left(\\frac{z^{4}}{c} + \\frac{y^{3}}{b} + \\frac{x^{2} \\left(a - b + y z\\right)}{a}\\right) + x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right) \\left(\\frac{z^{4}}{c} + \\frac{y^{3}}{b} + \\frac{x^{2} \\left(a - b + y z\\right)}{a}\\right)$" ], "text/plain": [ " ⎛ 4 3 2 ⎞ ⎛ 4 3 2 ↪\n", " 2 ⎜z y x ⋅(a - b + y⋅z)⎟ a⋅b + 4 a⋅b + 2 ⎜z y x ⋅ ↪\n", "x ⋅⎜── + ── + ────────────────⎟ + x ⋅(y⋅z) ⋅(a - b)⋅⎜── + ── + ─── ↪\n", " ⎝c b a ⎠ ⎝c b ↪\n", "\n", "↪ ⎞\n", "↪ (a - b + y⋅z)⎟\n", "↪ ─────────────⎟\n", "↪ a ⎠" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x, y, z, a, b, c = symbols(\"x:z a:c\", real=True, positive=True)\n", "expr = x**2 * (x**2 / a * (a - b + y*z) + y**3 / b + z**4 / c) + x**(a*b + 4) * (y * z)**(a*b + 2) * (a - b) * (x**2 / a * (a - b + y*z) + y**3 / b + z**4 / c)\n", "expr" ] }, { "cell_type": "markdown", "id": "a28720d6-886a-4de6-97f9-f61432ed9618", "metadata": {}, "source": [ "We would like to simplify it, so the first thing we can attempt is:" ] }, { "cell_type": "code", "execution_count": 4, "id": "f861cf6a-ec99-4d1d-83e8-57b735abccbd", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle \\frac{\\left(x^{2} + x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right)\\right) \\left(a b z^{4} + a c y^{3} + b c x^{2} \\left(a - b + y z\\right)\\right)}{a b c}$" ], "text/plain": [ "⎛ 2 a⋅b + 4 a⋅b + 2 ⎞ ⎛ 4 3 2 ⎞\n", "⎝x + x ⋅(y⋅z) ⋅(a - b)⎠⋅⎝a⋅b⋅z + a⋅c⋅y + b⋅c⋅x ⋅(a - b + y⋅z)⎠\n", "─────────────────────────────────────────────────────────────────────────────\n", " a⋅b⋅c " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr = expr.simplify()\n", "expr" ] }, { "cell_type": "markdown", "id": "e52cca82-7dfe-450c-958c-192354715059", "metadata": {}, "source": [ "This is a pretty nice results, but there is one more thing that can be done. Under the assumption that all symbols are real and positive, bring out the $x^{2}$ term from the first addition. In order to do so, we have to perform this edit:\n", "\n", "$$\n", "x^{a b + 4} (y z)^{a b + 2} = x^{2} x^{a b + 2} (y z)^{a b + 2} = x^{2} (x y z)^{a b + 2}\n", "$$" ] }, { "cell_type": "markdown", "id": "1e0c3b27-5ac9-4562-be92-ba1ca9ce58a5", "metadata": {}, "source": [ "The first thing to do is to extract that specific term, using the `find` method:" ] }, { "cell_type": "code", "execution_count": 5, "id": "d2fae297-16e6-4c23-83ec-2ff4948cd121", "metadata": {}, "outputs": [ { "data": { "image/png": "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ObPRxMVg5q+scIR9Kb/GmekihH9MwARMYFoCJ/ZwnwE9bfZOzQRMwARMwARMwARMYHcEglF7MmMsRU/8OsJWuCjc9xUPn5iACZjACgj0LeFegYgWwQRMwARMwARMwARMwARMwARMwAQuT8AG9OXLwBKYgAmYgAmYgAmYgAmYgAmYgAlsgIAN6A0UkkU0ARMwARMwARMwARMwARMwARO4PAEb0JcvA0tgAiZgAiZgAiZgAiZgAiZgAiawAQI2oDdQSBbRBEzABEzABEzABEzABEzABEzg8gRsQF++DCyBCZiACZiACZiACZiACZiACZjABgjYgN5AIVlEEzABEzABEzABEzABEzABEzCByxPoM6D5w3o7EzABEzABEzABEzABEzABEzABE9g9Af0HfWoDf6gr3GZA/x4Cfl6P4HMTMAETMAETMAETMAETMAETMAET2CmBB4le0S4uvdoM6N9CiEdlSB+YgAmYgAmYgAmYgAmYgAmYgAmYwL4JPEnUyzagfwyRHtamsJO0fGgCJmACJmACJmACJmACJmACJmACuyLwNGjzVrbwXV2zxhloBfxFAaO1/bweyecmYAImYAImYAImYAImYAImYAImsCcCYfL4q6BTnFSuqNhoQIcQ34b9C89CV5j5xARMwARMwARMwARMwARMwARMYH8EXgWVmH1mUvnEtRrQIcIPisFXyGJCJwnYwwRMwARMwARMwARMwARMwARMwAS2TED2L+8+M/v8u46ftenSakATQRG/1+6ttq903DiFTTg7EzABEzABEzABEzABEzABEzABE9giAdm6GM8/a+Od5/gOdKMqnQY0MZQY1jeG9HMd/4SfnQmYgAmYgAmYgAmYgAmYgAmYgAlsnUBiPLNk+886j98Ca1St14AmlhJhKTf/Cf2aczsTMAETMAETMAETMAETMAETMAET2AEBDOZnsnmfajv56nZdv/8H67hALvDPIn8AAAAASUVORK5CYII=", "text/latex": [ "$\\displaystyle \\left\\{x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right), b c x^{2} \\left(a - b + y z\\right), \\frac{\\left(x^{2} + x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right)\\right) \\left(a b z^{4} + a c y^{3} + b c x^{2} \\left(a - b + y z\\right)\\right)}{a b c}\\right\\}$" ], "text/plain": [ "⎧ ⎛ 2 a⋅b + 4 a⋅b ↪\n", "⎪ a⋅b + 4 a⋅b + 2 2 ⎝x + x ⋅(y⋅z) ↪\n", "⎨x ⋅(y⋅z) ⋅(a - b), b⋅c⋅x ⋅(a - b + y⋅z), ──────────────────────── ↪\n", "⎪ ↪\n", "⎩ ↪\n", "\n", "↪ + 2 ⎞ ⎛ 4 3 2 ⎞⎫\n", "↪ ⋅(a - b)⎠⋅⎝a⋅b⋅z + a⋅c⋅y + b⋅c⋅x ⋅(a - b + y⋅z)⎠⎪\n", "↪ ─────────────────────────────────────────────────────⎬\n", "↪ a⋅b⋅c ⎪\n", "↪ ⎭" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "found = expr.find(lambda t: t.is_Mul and t.has(a - b))\n", "found" ] }, { "cell_type": "markdown", "id": "9180d69f-d0f3-4fbe-b063-d91a2d129e2c", "metadata": {}, "source": [ "Note that our interested term, $x^{a b + 4} (y z)^{a b + 2}$ is contained in this term: $x^{a b + 4} (y z)^{a b + 2} (a - b)$.\n", "\n", "There are a few problems with this approach.\n", "\n", "First, writing a more appropriate query is often time consuming. As a consequence, we will often get multiple matches.\n", "\n", "Second, `found` is a set. The easiest way to retrive a particular element from a set is to convert it to a list, and index it. However, this process is non-deterministic:" ] }, { "cell_type": "code", "execution_count": 6, "id": "8f0f7692-58bf-4b14-a44e-218332a6fd5e", "metadata": {}, "outputs": [ { "data": { "image/png": "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AtdNQIYtxjEfZMVoTr/3wvEf8kvfa8bIxn0S/cOeMPx7QXS8E833Y9LZ6C/lh7+dCZiACSxGwMu2F0PrhE3ABEzABEzABEzg6gkwG/xAhm7zL/8wlFPjF1D84wlLtlODGn8M8I840DVmrJmFPvoat/w/4LqdCZiACSxJwDPPS9J12iZgAiZgAiZgAiZw3QSYET76m08ZuhjDGMDNmWIM6mbYOBv9RtdwVXpKo2lg3131rwmYgAksSMDG84JwnbQJmIAJmIAJmIAJXCuBYCRjKDeNZAzgg64fGcrywqCORjJBcF/c7Q6/9qQXgnhnAiZgAssSsPG8LF+nbgImYAImYAImYALXTiB91xkW1fJsDmQQ88VtjObo6rDBWMbQ/kbHt2whUNzHONVe1+Ms9ZG/T0zABExgLgI2nuci6XRMwARMwARMwARMwARqAsHYZXa5No7lx4e/+KL22xDwM/lFg5l3oB8Ff3Z8aOyVrqfvS3McZ6MJUzmF4d3q9+HUOxMwARNYhMDNIqk6URMwARMwARMwARMwARO4M3RfyLj9VjD46NdLbcw88zdV+PEBsOj4WyrCfqw9y735i6rUcD7onFlo4mIs83dVOMI+l1/rjHQVwj8mYAImMAMBG88zQHQSJmACJmACJmACJmACpwSCQXsyU6yQJ349YY8SVrjvjjx8YgImYAIrEfCy7ZVAOxsTMAETMAETMAETMAETMAETMIH9ErDxvF/dWXITMAETMAETMAETMAETMAETMIGVCNh4Xgm0szEBEzABEzABEzABEzABEzABE9gvARvP+9WdJTcBEzABEzABEzABEzABEzABE1iJgI3nlUA7GxMwARMwARMwARMwARMwARMwgf0SsPG8X91ZchMwARMwARMwARMwARMwARMwgZUI2HheCbSzMQETMAETMAETMAETMAETMAET2C8BG8/71Z0lNwETMAETMAETMAETMAETMAETWImAjeeVQDsbEzABEzABEzABEzABEzABEzCB/RKw8bxf3VlyEzABEzABEzABEzABEzABEzCBlQjYeF4JtLMxARMwARMwARMwARMwARMwARPYLwEbz/vVnSU3ARMwARMwARMwARMwARMwARNYiYCN55VAOxsTMAETMAETMAETMAETMAETMIH9ErDxvF/dWXITMAETMAETMAETMAETMAETMIGVCNh4Xgm0szEBEzABEzABEzABEzABEzABE9gvgZtE9N+///775LQ6fC2/L5qePjcBEzABEzABEzABEzABEzABEzCBSyIg2/d3ledvXWXCeP5D2zcdAbhmZwImYAImYAImYAImYAImYAImYAKXTuCHvgL+P/phRR9q3k7ZAAAAAElFTkSuQmCC", "text/latex": [ "$\\displaystyle \\left[ x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right), \\ b c x^{2} \\left(a - b + y z\\right), \\ \\frac{\\left(x^{2} + x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right)\\right) \\left(a b z^{4} + a c y^{3} + b c x^{2} \\left(a - b + y z\\right)\\right)}{a b c}\\right]$" ], "text/plain": [ "⎡ ⎛ 2 a⋅b + 4 a⋅b ↪\n", "⎢ a⋅b + 4 a⋅b + 2 2 ⎝x + x ⋅(y⋅z) ↪\n", "⎢x ⋅(y⋅z) ⋅(a - b), b⋅c⋅x ⋅(a - b + y⋅z), ──────────────────────── ↪\n", "⎣ ↪\n", "\n", "↪ + 2 ⎞ ⎛ 4 3 2 ⎞⎤\n", "↪ ⋅(a - b)⎠⋅⎝a⋅b⋅z + a⋅c⋅y + b⋅c⋅x ⋅(a - b + y⋅z)⎠⎥\n", "↪ ─────────────────────────────────────────────────────⎥\n", "↪ a⋅b⋅c ⎦" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = list(found)\n", "results" ] }, { "cell_type": "code", "execution_count": 7, "id": "93b9961f-e15c-45de-8fbd-55d92e24d6ae", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right)$" ], "text/plain": [ " a⋅b + 4 a⋅b + 2 \n", "x ⋅(y⋅z) ⋅(a - b)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "interested_expr = results[0]\n", "interested_expr" ] }, { "cell_type": "markdown", "id": "31ec9e6a-c3c7-4a0b-809d-1aad9f6ce66d", "metadata": {}, "source": [ "There is no guarantee that this code is reproducible. The next time the user will restart the kernel and execute the above cells, it is very likely that `interested_expr` shows a different expression, which would compute wrong results in the next cells of the notebook. In order to solve this problem, the conversion from a set to list must be deterministic. One way to achieve it is by sorting the results with an appropriate key, for example, the number of operations of an expression and its string representation:" ] }, { "cell_type": "code", "execution_count": 8, "id": "dc109ce9-e20d-47b6-892e-105597392139", "metadata": {}, "outputs": [ { "data": { "image/png": "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BGw8L4bWCZuACZiACZiACZjAdROQYYtxzAdcMZrj759w/If84veaMbJxnwT/ek8Y/lkiON6J5nsq8Wz0l/LD384ETMAEFiPgZduLoXXCJmACJmACJmACJnD1BJgNfiBDt/13lRjKsfELKP4hhSXbsUGNPwb4RxzoGjPWzEIffY1b/h9w3c4ETMAEliTgmecl6TptEzABEzABEzABE7huAswIH/31pQxdjGEM4PZMMQZ1O2yYjX6ja7gqPaXRNrDvrvrXBEzABBYkYON5QbhO2gRMwARMwARMwASulUBtJGMot41kDOCDrh8ZyvLCoA5GMkFwX9ztDr8OpFcH8c4ETMAEliVg43lZvk7dBEzABEzABEzABK6dQPyuMyyq5dkcyCDmi9sYzcE1YWtjGUP7Gx3fstWBwj7Eqfa6Hmapj/x9YgImYAJzEbDxPBdJp2MCJmACJmACJmACJtAQqI1dZpcb41h+fPiLL2q/rQN+Jr9gMPMO9KPanx0fGnul6/H70hyH2WjCVE5heLf6fX3qnQmYgAksQuBmkVSdqAmYgAmYgAmYgAmYgAncGbovZNx+Kxh89OulNmae+Zsq/PgAWHD8LRVhP9ae5d78RVVsOB90ziw0cTGW+bsqHGGfy69zRroK4R8TMAETmIGAjecZIDoJEzABEzABEzABEzCBUwK1QXsyU6yQJ34DYY8SVrjvjjx8YgImYAIrEfCy7ZVAOxsTMAETMAETMAETMAETMAETMIH9ErDxvF/dWXITMAETMAETMAETMAETMAETMIGVCNh4Xgm0szEBEzABEzABEzABEzABEzABE9gvARvP+9WdJTcBEzABEzABEzABEzABEzABE1iJgI3nlUA7GxMwARMwARMwARMwARMwARMwgf0SsPG8X91ZchMwARMwARMwARMwARMwARMwgZUI2HheCbSzMQETMAETMAETMAETMAETMAET2C8BG8/71Z0lNwETMAETMAETMAETMAETMAETWImAjeeVQDsbEzABEzABEzABEzABEzABEzCB/RKw8bxf3VlyEzABEzABEzABEzABEzABEzCBlQjYeF4JtLMxARMwARMwARMwARMwARMwARPYLwEbz/vVnSU3ARMwARMwARMwARMwARMwARNYiYCN55VAOxsTMAETMAETMAETMAETMAETMIH9ErDxvF/dWXITMAETMAETMAETMAETMAETMIGVCNh4Xgm0szEBEzABEzABEzABEzABEzABE9gvgZtI9N+///776LQ6fC2/L9qePjcBEzABEzABEzABEzABEzABEzCBSyIg2/d3ledvfWXCeP5D2zc9AbhmZwImYAImYAImYAImYAImYAImYAKXTuCHoQL+P1CqRR8zKlkkAAAAAElFTkSuQmCC", "text/latex": [ "$\\displaystyle \\left[ b c x^{2} \\left(a - b + y z\\right), \\ x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right), \\ \\frac{\\left(x^{2} + x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right)\\right) \\left(a b z^{4} + a c y^{3} + b c x^{2} \\left(a - b + y z\\right)\\right)}{a b c}\\right]$" ], "text/plain": [ "⎡ ⎛ 2 a⋅b + 4 a⋅b ↪\n", "⎢ 2 a⋅b + 4 a⋅b + 2 ⎝x + x ⋅(y⋅z) ↪\n", "⎢b⋅c⋅x ⋅(a - b + y⋅z), x ⋅(y⋅z) ⋅(a - b), ──────────────────────── ↪\n", "⎣ ↪\n", "\n", "↪ + 2 ⎞ ⎛ 4 3 2 ⎞⎤\n", "↪ ⋅(a - b)⎠⋅⎝a⋅b⋅z + a⋅c⋅y + b⋅c⋅x ⋅(a - b + y⋅z)⎠⎥\n", "↪ ─────────────────────────────────────────────────────⎥\n", "↪ a⋅b⋅c ⎦" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = sorted(found, key=lambda expression: (count_ops(expression), str(expr)))\n", "results" ] }, { "cell_type": "markdown", "id": "e722e96a-00cf-4caf-a8b3-587a63d3a9df", "metadata": {}, "source": [ "The third problem with this approach is that we need to count the index of the interested element in the list. With this simple example, it is trivial: the element we are interested in is at index 1. But for more complicated expressions or queries, we will soon discover that visually findind the correct index is time consuming and prone to errors." ] }, { "cell_type": "code", "execution_count": 9, "id": "2b7aeac4-085b-4d5f-a3e2-3839ce8ccb6b", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right)$" ], "text/plain": [ " a⋅b + 4 a⋅b + 2 \n", "x ⋅(y⋅z) ⋅(a - b)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "interested_expr = results[1]\n", "interested_expr" ] }, { "cell_type": "markdown", "id": "37de9209-3fa9-449d-9283-19f9915ac1cd", "metadata": {}, "source": [ "The last problem is that we need to remember all these things every time we execute the `find` method.\n", "\n", "Here enter the `table_of_expressions` class. Given the results of a `find` operation, it shows a nice deterministic table containing expressions sorted as above, with visible indices:" ] }, { "cell_type": "code", "execution_count": 10, "id": "50599a73-f7b8-4420-b17c-e162a3c3e4cf", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "| idx | exprs |\n", "|:-----:|:------|\n", "| 0 | $b c x^{2} \\left(a - b + y z\\right)$ |\n", "| 1 | $x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right)$ |\n", "| 2 | $\\frac{\\left(x^{2} + x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right)\\right) \\left(a b z^{4} + a c y^{3} + b c x^{2} \\left(a - b + y z\\right)\\right)}{a b c}$ |\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "toe = table_of_expressions(found)" ] }, { "cell_type": "markdown", "id": "d38f4d18-41a5-4b6b-9580-c6263364003c", "metadata": {}, "source": [ "We can think of `toe` as a list, from which we can extract an element by its index:" ] }, { "cell_type": "code", "execution_count": 11, "id": "0ee7a52c-0b36-4ecb-a28d-5283b3935a2e", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle x^{a b + 4} \\left(y z\\right)^{a b + 2} \\left(a - b\\right)$" ], "text/plain": [ " a⋅b + 4 a⋅b + 2 \n", "x ⋅(y⋅z) ⋅(a - b)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "interested_expr = toe[1]\n", "interested_expr" ] }, { "cell_type": "markdown", "id": "cbccf3c7-0e3f-4346-a6b4-b03f0ff4f94a", "metadata": {}, "source": [ "Now we can start the actual edit:" ] }, { "cell_type": "code", "execution_count": 12, "id": "cbb41a33-da5a-46ee-949d-7c203eb66c94", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIAAAAAaCAYAAAB/w1TuAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF8UlEQVRoBe2a7XHUMBBAzQ0FAKkA6CCQCggd8FFBoINk8i//GOgAqCBAB9ABkA6gAyAdhPeE5NHp7LPP57s4E3ZGWVla7a52V6u1czcuLi6q/zAtC5ycnOyi0Xvab/qP19UOHrfgcRz53Iv4gPHz2brM/68f3wI45gyuP2niToD+bQfRa2iOYnsK7W/ad9dsLAAQtkv7TvusoLFB3mPznBi/ffQ57alTOtVt5C+wl/wSvKZzj7Hdm2lkbAzzM5pRbOsEaN/SXnYSQgDdIcg0eSUB/VNK/sEG7O/Q3H+wFdi9Ob5PX8ft0ULKBg8B7fqtaeHGMkAUNmYUB5bRIL2CqmnDlz2G/jrW7KXD34G/0AzoHLSbe3wHzRvwV5qndhAoh3aeLTYgfjJ2NjgDsNiNWFhsK4qrKNPToeEGATxMfRsLoB78deSXQofz4tnCz3s7OU38cNCGi0Xw1H5PaA+cGhQAMNH5RvFjFY9MQ1TLNEIexW7QKHfzvdJ8YlJg77I3NOWvDFEHnb+xAIC3AfZEPVsUfMa4hVgC7WQWyEFnH2UDOivoDF8LvvLOf8h4WWt9ZGzuoPDsOn3wgH4IrkEBEJlsNYpR2Kj9RBsEcf0OuM0xg/iWi+CvXSyADdbSAQauLQ9AT7vOCkEN1jG3wPkbgEFzQKsYXzhAjH2mLX1dZF7n+yYQ6OLzsAwAo61GcVT2Djg3nPboBazTuMfgkPZ6LVqDCDlmKd+APtB0aAD7xbPp2AzgqdSmH2iCWdUgkP4Fz9/A6wS/zjdzGADKFAyko5UzAAw0pi13xqajWHn3ka2hBJ+r+PwV3GUc13W9K8tyTFCecssTa/rXEV6Zvo+b6rXfD8bOwYI01gDWVxV46emWpgOUpc3ENcD35Y0hXwJZ+Acu3iP5/a+SRlqIeuZUPtw19I3ip+DWjTDXmcbgEQBa5cj/Nv1ktH+TDX+h+UO73TC10SHlIuBuHx3XUQT+vW1XypmVAz2fUxTrWJ2RorjKNpui+JB501mr83vKDGTwUWbKBJ4Sa4NWiPN5tmql3cCEck3tm4bB+6uvAAxlitC4wh7tgKZzn9OEOtVCa9VaVq6BKP2BxiKmTH9pejCGr4XVXHHVwczAa9Q12/N9aLyza75x7j3YQK6BZ+/Qj3HArOYHL+20D67Xx3nlKr8cj9PjIOQOtvMsU8HTZPGSPjz4zwg35ek2ONKpy5aM2h0cxR1a+EoV7tIGOgtD9+srVLk/T+5cdoFWO2gX73frDm3mOnGTk5VrcEwWQgZA+Tytqqz3qps3Cwh3aKWBwsRYf9BhcBR36KDTLLbmAHmeZL+wCZ7SkqYpc2iHR6zVPgHoa5dkpzhaI3lOPwBQ0teM/AT6umRqCxsFz6XBentXo6PTaodlKodPofHZ0/4qm7Pr69ncWG4j+gbWsTTJTvRL0KbSTRZSBvC+zqHJIPn8le8np4F1tE6qUzhjZgfH2moHT7Vf+7wel0Fb8C1bs9W5WSktM0j9bs2YVfykI7ncR/ZsGl6mu9mtznZxnUHhR5jyYFSMOWdtVH9RpN/G33HlTxZuRuWtai1kjHjvYjefXwkWS13RPtVNuo9l97Bz+V7dR9P9X2GDUBSC62whMWBh2HRNmgFK3tJPBrwCQkSD/Tq1ELGMOZ+KpckovoIinuK9JfQ6SEcFiPt1z3NFKeNeC46ZLcS+OezQDIom5zMc/uO2kEWcmAoYAJ56I9pNV26O5pclX3XC50r69XUgzRWDU/RN7+1NqpvZfN+3mv9F85uAUN7/z6ExM1Rgne6pN3i0V5uTFwIJ+knBoE/Bk9pBD2VwkO/j4aNNFzm0BoJ3/Fr/OGK9V4sHKQVUl+hLmZ9ditTtC9WpcyldFXCOdU/9DxL6XoF+E3nl/JpgZlHupOFaBACO9YrzhxqeyhxM5afZgGndn0+tdeVFOcori8VM1DS61gDXBSzUrAXCPR437Sn1dwaHYFO1v9Mr7/5IuhKyflrIOCtx2BLxtagBki3jyVz2c61EOhjHYPoEnvTrX9rgX/dDfC3lRhJWAAAAAElFTkSuQmCC", "text/latex": [ "$\\displaystyle x^{a b + 4} \\left(y z\\right)^{a b + 2}$" ], "text/plain": [ " a⋅b + 4 a⋅b + 2\n", "x ⋅(y⋅z) " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "target = interested_expr / (a - b)\n", "target" ] }, { "cell_type": "code", "execution_count": 13, "id": "6855dc8d-0ef8-4bc3-96a0-0145773b9735", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAG8AAAAaCAYAAAC5KgISAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFc0lEQVRoBe2a/XHUOBTAl50UkIMKjusgQAXkOuCjgpAOYPJf/mOgA6CCG+gAOgDSAXRALh3kfj8heWTt2l7Li8+T4c0oT36Snt63ZG9uXV9fr37D/ixwfn5+BLd3tEv6f0/lDI9DeJxFPncjPoF+tZ7K/Pf6tgUw6gWU7zTxIDD/zcCkV8x5Edtj5l7SvrrmwD9jAUad0TCW1w2df4xeD3fULWVT1/Rn2Ps97VOc8Aos7ajKeSw2Gk7TbvSNHqPhr0S7qRhdU+B+Q0f7d2hvoJttK7BlU/oxfZ34gBbKHLgGtPOXbQtry6aeV7AERsPdKHii3TiMfjrFINVZb8Fmw3NaDtpFR75lzmvwZ5r2qQL3oV1li3Xmd2gXtc7rjIZsk8EuAgyVjEEe+5ywgzw64RPzQpbFva+KZy8pVqZkcPH9OHcSgqdZ/Yh2T0ZVZRMmRl0OTTTkxL4+PIxYjZAbom/JHGNWj0c0M2YbPIHopSGBWZbOokTTUS/SA1hDBx3h6/FSBux96B+z+XY941o25tl1Bs89+iEwqpwn9wQwakVDovdh1hg9d8BdRupb/svGkMesOqJ5LJTGO2RjWx5sZpmGlr4Ca9RDcH7T1OEncdwgbwFzP9J6XykY13HeOMO8+LxatziNfIhMWtEwxII1KnoGzqNzaNls48hlQJ1GOZt9edYxtgA8G7TpfNNBCTyP1HEFfgb6Av6QBsdi1uo4M9Zz1sByX213WZ15kelGNEDPI5M9NkBnD73bbCyamaB8yllmiiVTnb20+L6lEc2Gb9CSY53jmedtdAXuzSrnDIB7GQziBuB7eqvmCwsLUzTk2aOiKpaUaDbKO4z/S/sjpy2xr5zI9eeQPlNlh/9g2ezaozbzOqOhayPpCOpZN5SZfSzmHFNOy2Hr7PsFAlTbo3EehjU1rdFCeLEEm2FPJQCfmRNqN7g2cywh5e0sMPfPSBmSvH4Y+MraxsiRzztwczOk71nx3n2Axzxf0NTvGNysDaM//yin8m4by6ZN67J3WZp3ZrjOZlqnX9ug+WLpx1UVszRqKM+AqeA1OpwFHYzGyOClR1m9ZpeymTFmeQDmKb/6eJYZgO7jGnGXc5RT5y4WQuahgBmXG+CKZ5U/iZLfLsYjeTTSiB70GzBGBuaaRQaYYHaUPMsMV/6HrFOvAPTVN+kXqS0kz+U7DyG9zua11xdLy0pQFtyUn5Z64x80YmPAYvkYGcLnobjeLHtZ8DrOablu9A2gM8eTfsXa9Kg9nLtYSJl3UUi4zSDFlP0+YsidZUhGB+skDdyUPmhmpbSNs5UxM8kvKPktGdJW6Au0rQvmJq7LDTODNC+W0PxqsI8otBQN8hkhgxWhqRBRFx3q98ZWMESenuHNVx36fbI4pryLhYOogLcwD2+j1dtP+bF1X19ELEUb58gEGeSVl3sewxnYyjr4h8sLuMlQJwJeYrqOBDOv5O2axYBl00i1+YK9EW3QHEuXA7qTwGx4sIVDrQwaVyMHiLLKq7l+Q7OM+myGir2d+hucDu1yHEPhg3IreyUuCQ4Qxig1IlV6pYI03/q9VofPQPSbEuqcCfAPa83yEmpl8Ozyfc6b4w9a+jE4z7ynjHv7XIF1mNmm09WzzzmtIGD+4qDq89gULTCY70/hJXkKn21r4a0TPdfC713b5uxCY73l2ABOwbDLstnnrGff8ef7ZFPWavfXUbTmYy19S77vqy9reWbrzGgDYdEwu/MwsiXaHz2N7ilgCbQMJ7Ac+i8Dk0p8lEv5ystN2mcx2DPv/wAvCp594SyqFMDsuI2Rn4Mtb/7elZ91lWzDJ7TJlaF28zHrZj/zknAxwvv+5SBNnQ3HQPgAXvQrQjLIf/ZePztRuAsOAAAAAElFTkSuQmCC", "text/latex": [ "$\\displaystyle x^{2} \\left(x y z\\right)^{a b + 2}$" ], "text/plain": [ " 2 a⋅b + 2\n", "x ⋅(x⋅y⋅z) " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "replace = (target / x**2).powsimp() * x**2\n", "replace" ] }, { "cell_type": "markdown", "id": "990a632a-9aee-4bb7-87aa-46cce7b4eb38", "metadata": {}, "source": [ "We can quickly verify that this manipulation didn't introduce errors:" ] }, { "cell_type": "code", "execution_count": 14, "id": "bd0275b8-30a9-455f-92e0-9ce1a436dd2a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "replace.equals(target)" ] }, { "cell_type": "markdown", "id": "340d0464-7a22-4da1-8a3a-6fafcbfce371", "metadata": {}, "source": [ "Finally:" ] }, { "cell_type": "code", "execution_count": 15, "id": "42988312-bfba-469a-b3d7-5ba6a048d477", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle \\frac{x^{2} \\left(\\left(x y z\\right)^{a b + 2} \\left(a - b\\right) + 1\\right) \\left(a b z^{4} + a c y^{3} + b c x^{2} \\left(a - b + y z\\right)\\right)}{a b c}$" ], "text/plain": [ " 2 ⎛ a⋅b + 2 ⎞ ⎛ 4 3 2 ⎞\n", "x ⋅⎝(x⋅y⋅z) ⋅(a - b) + 1⎠⋅⎝a⋅b⋅z + a⋅c⋅y + b⋅c⋅x ⋅(a - b + y⋅z)⎠\n", "────────────────────────────────────────────────────────────────────────\n", " a⋅b⋅c " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr = expr.subs(target, replace).collect(x**2)\n", "expr" ] }, { "cell_type": "markdown", "id": "dabb9497-c2c6-481a-8d53-3a9bb161d7c4", "metadata": {}, "source": [ "**And that's about it for this tutorial.**\n", "\n", "Before moving on, let's see what else `table_of_expressions` can do.\n", "\n", "## table_of_expressions with `mode=\"args\"`\n", "\n", "If a symbolic expression is provided and `mode=\"args\"` (default value), the table shows the arguments (or terms) that composes `expr` (as you would see when executing `expr.args`). They are not sorted! The fact that in this example they appear to be sorted is purely coincidental." ] }, { "cell_type": "code", "execution_count": 16, "id": "7e42f4a7-5ed1-4260-94ea-89a3106fc064", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "| idx | args |\n", "|:-----:|:------|\n", "| 0 | $\\frac{1}{a}$ |\n", "| 1 | $\\frac{1}{b}$ |\n", "| 2 | $\\frac{1}{c}$ |\n", "| 3 | $x^{2}$ |\n", "| 4 | $\\left(x y z\\right)^{a b + 2} \\left(a - b\\right) + 1$ |\n", "| 5 | $a b z^{4} + a c y^{3} + b c x^{2} \\left(a - b + y z\\right)$ |\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "toe = table_of_expressions(expr, mode=\"args\")" ] }, { "cell_type": "markdown", "id": "8fd4ae38-0df0-4cb3-9889-a3d1ef2c7de0", "metadata": {}, "source": [ "In this mode of operation, it is guaranteed that:" ] }, { "cell_type": "code", "execution_count": 17, "id": "66c849b0-1fb6-42f0-a726-f5fc418138f2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "toe[4] == expr.args[4]" ] }, { "cell_type": "markdown", "id": "d91296c6-d07b-4863-aeb9-a214f25a1c12", "metadata": {}, "source": [ "In other words, using `toe[idx]` or `expr.args[idx]` will get the same expression." ] }, { "cell_type": "markdown", "id": "aecb46d1-7784-4e12-9f7e-d2b070b588ce", "metadata": {}, "source": [ "With this mode of operation, if `expr` is a huge expression, then the table will be huge. We could filter the table to show only the elements that contains specific sub-expressions:" ] }, { "cell_type": "code", "execution_count": 18, "id": "f77ab8dc-77fd-475d-a708-e635292b7476", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "| idx | args |\n", "|:-----:|:------|\n", "| 4 | $\\left(x y z\\right)^{a b + 2} \\left(a - b\\right) + 1$ |\n", "| 5 | $a b z^{4} + a c y^{3} + b c x^{2} \\left(a - b + y z\\right)$ |\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "table_of_expressions(expr, select=[z**4, a*b])" ] }, { "cell_type": "markdown", "id": "be16e2fc-2bb8-4efe-ae51-3df3f529db7c", "metadata": {}, "source": [ "We will see in a different tutorial that this mode of operation is actually pretty useful." ] }, { "cell_type": "markdown", "id": "b48cf5ba-2f06-4b9a-8a8c-f733d914ec1c", "metadata": {}, "source": [ "## table_of_expressions with `mode=\"nodes\"`\n", "\n", "The other mode of operation is `mode=\"nodes\"`, which shows an ordered list of unique nodes that makes up the expression tree. This is likely the least useful mode of operation, because for large expressions, it shows very large tables." ] }, { "cell_type": "code", "execution_count": 19, "id": "d92ca6a1-f72e-4655-b350-30bae1f32564", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "| idx | nodes |\n", "|:-----:|:------|\n", "| 0 | $1$ |\n", "| 1 | $2$ |\n", "| 2 | $3$ |\n", "| 3 | $4$ |\n", "| 4 | $a$ |\n", "| 5 | $b$ |\n", "| 6 | $c$ |\n", "| 7 | $x$ |\n", "| 8 | $y$ |\n", "| 9 | $z$ |\n", "| 10 | $-1$ |\n", "| 11 | $- b$ |\n", "| 12 | $\\frac{1}{a}$ |\n", "| 13 | $\\frac{1}{b}$ |\n", "| 14 | $\\frac{1}{c}$ |\n", "| 15 | $a - b$ |\n", "| 16 | $a b$ |\n", "| 17 | $x^{2}$ |\n", "| 18 | $y^{3}$ |\n", "| 19 | $y z$ |\n", "| 20 | $z^{4}$ |\n", "| 21 | $a b + 2$ |\n", "| 22 | $x y z$ |\n", "| 23 | $a - b + y z$ |\n", "| 24 | $a b z^{4}$ |\n", "| 25 | $a c y^{3}$ |\n", "| 26 | $\\left(x y z\\right)^{a b + 2}$ |\n", "| 27 | $\\left(x y z\\right)^{a b + 2} \\left(a - b\\right)$ |\n", "| 28 | $b c x^{2} \\left(a - b + y z\\right)$ |\n", "| 29 | $\\left(x y z\\right)^{a b + 2} \\left(a - b\\right) + 1$ |\n", "| 30 | $a b z^{4} + a c y^{3} + b c x^{2} \\left(a - b + y z\\right)$ |\n", "| 31 | $\\frac{x^{2} \\left(\\left(x y z\\right)^{a b + 2} \\left(a - b\\right) + 1\\right) \\left(a b z^{4} + a c y^{3} + b c x^{2} \\left(a - b + y z\\right)\\right)}{a b c}$ |\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "table_of_expressions(expr, mode=\"nodes\")" ] }, { "cell_type": "markdown", "id": "3a02c013-4dea-4424-8a21-c432eea977ae", "metadata": {}, "source": [ "However, it is possible to filter the table in order to show elements that contains certain expressions:" ] }, { "cell_type": "code", "execution_count": 20, "id": "3e315363-d5ee-458b-a131-50e1ba6a63c1", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "| idx | nodes |\n", "|:-----:|:------|\n", "| 15 | $a - b$ |\n", "| 23 | $a - b + y z$ |\n", "| 27 | $\\left(x y z\\right)^{a b + 2} \\left(a - b\\right)$ |\n", "| 28 | $b c x^{2} \\left(a - b + y z\\right)$ |\n", "| 29 | $\\left(x y z\\right)^{a b + 2} \\left(a - b\\right) + 1$ |\n", "| 30 | $a b z^{4} + a c y^{3} + b c x^{2} \\left(a - b + y z\\right)$ |\n", "| 31 | $\\frac{x^{2} \\left(\\left(x y z\\right)^{a b + 2} \\left(a - b\\right) + 1\\right) \\left(a b z^{4} + a c y^{3} + b c x^{2} \\left(a - b + y z\\right)\\right)}{a b c}$ |\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "table_of_expressions(expr, mode=\"nodes\", select=[a - b])" ] }, { "cell_type": "code", "execution_count": null, "id": "e6cd144d-d718-44c3-8a3c-5850cf83c7ce", "metadata": {}, "outputs": [], "source": [] } ], "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.12.7" } }, "nbformat": 4, "nbformat_minor": 5 }