From f5e0cc14d4f0efaa388d1f3682daa143155a1d7e Mon Sep 17 00:00:00 2001 From: urojony Date: Sun, 17 May 2020 23:46:53 +0200 Subject: [PATCH] added statistics and fixed few minor bugs --- .ipynb_checkpoints/examples-checkpoint.ipynb | 2045 +++-- .ipynb_checkpoints/sandbox-checkpoint.ipynb | 2706 +++++-- .../statistics-checkpoint.ipynb | 476 ++ __pycache__/shiroindev.cpython-36.pyc | Bin 15679 -> 16636 bytes __pycache__/shiroindev.cpython-37.pyc | Bin 15309 -> 19697 bytes examples.ipynb | 380 +- examples.pdf | Bin 227669 -> 59577 bytes sandbox.ipynb | 7076 ++++++++++++++--- shiroindev.py | 352 +- statistics.ipynb | 1563 ++++ statistics.pdf | Bin 0 -> 71326 bytes 11 files changed, 12183 insertions(+), 2415 deletions(-) create mode 100644 .ipynb_checkpoints/statistics-checkpoint.ipynb create mode 100644 statistics.ipynb create mode 100644 statistics.pdf diff --git a/.ipynb_checkpoints/examples-checkpoint.ipynb b/.ipynb_checkpoints/examples-checkpoint.ipynb index b8a7d20..4e27353 100644 --- a/.ipynb_checkpoints/examples-checkpoint.ipynb +++ b/.ipynb_checkpoints/examples-checkpoint.ipynb @@ -4,7 +4,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In this notebook there are presented examples of usage of shiroin, a python library for proving inequalities of multivariate polynomials." + "In this notebook there are presented examples of usage of shiroin, a python library for proving inequalities of multivariate polynomials.\n", + "\n", + "At the beginning we need to load the packages." ] }, { @@ -13,17 +15,20 @@ "metadata": {}, "outputs": [], "source": [ + "from sympy import *\n", "from shiroindev import *\n", - "sVars.seed=1\n", "from IPython.display import Latex\n", - "sVars.display=lambda x:display(Latex(x))" + "shiro.seed=1\n", + "shiro.display=lambda x:display(Latex(x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The first line obviously loads this package. The second one sets a seed for proving functions. If you don't write it, you can get a slightly different proof each time you run a function. The next two lines provide a nicer display of proofs, i.e. formulas will be shown instead of LaTeX code of these formulas. Note that this works on Jupyter, but not on the git page.\n", + "`shiro.seed=1` sets a seed for proving functions. If you don't write it, you can get a slightly different proof each time you run a function. This line is here only for the sake of reproducibility. \n", + "\n", + "The next line provides a nicer display of proofs, i.e. formulas will be shown instead of LaTeX code of these formulas. Note that this works on Jupyter, but not on the git page.\n", "\n", "Now let's make some proofs. We will use problems from https://www.imomath.com/index.php?options=593&lmm=0." ] @@ -51,7 +56,7 @@ { "data": { "text/latex": [ - "numerator: $a^2-ab-ac+b^2-bc+c^2$" + "numerator: $a^{2} - a b - a c + b^{2} - b c + c^{2}$" ], "text/plain": [ "" @@ -111,7 +116,7 @@ { "data": { "text/latex": [ - "$$ ab+ac+bc \\le a^2+b^2+c^2 $$" + "$$ a b+a c+b c \\le a^{2}+b^{2}+c^{2} $$" ], "text/plain": [ "" @@ -139,7 +144,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Function prove prints several things. The first two gives us a formula after expanding it. To proceed, a **numerator** has to be a **polynomial with integer coefficients**. The next one is status, which is the return status of the first use of ```scipy.optimize.linprog```. Possible outputs and explanations are\n", + "Function prove prints several things. The first two gives us a formula after expanding it. The next one is status, which is the return status of the first use of ```scipy.optimize.linprog```. Possible outputs and explanations are\n", "\n", "* 0 - found a proof with real coefficients,\n", "* 1 - need more time, \n", @@ -157,7 +162,7 @@ { "data": { "text/latex": [ - "numerator: $2a^2-2ab-2ac+2b^2-2bc+2c^2$" + "numerator: $2 a^{2} - 2 a b - 2 a c + 2 b^{2} - 2 b c + 2 c^{2}$" ], "text/plain": [ "" @@ -205,7 +210,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 a b \\le a^{2}+b^{2}$$" ], "text/plain": [ "" @@ -217,7 +222,7 @@ { "data": { "text/latex": [ - "$$2ac \\le a^2+c^2$$" + "$$2 a c \\le a^{2}+c^{2}$$" ], "text/plain": [ "" @@ -229,7 +234,7 @@ { "data": { "text/latex": [ - "$$2bc \\le b^2+c^2$$" + "$$2 b c \\le b^{2}+c^{2}$$" ], "text/plain": [ "" @@ -300,7 +305,7 @@ { "data": { "text/latex": [ - "numerator: $a^2-ab-ac-ad+b^2+c^2+d^2$" + "numerator: $a^{2} - a b - a c - a d + b^{2} + c^{2} + d^{2}$" ], "text/plain": [ "" @@ -348,7 +353,7 @@ { "data": { "text/latex": [ - "$$ ab+ac+ad \\le a^2+b^2+c^2+d^2 $$" + "$$ a b+a c+a d \\le a^{2}+b^{2}+c^{2}+d^{2} $$" ], "text/plain": [ "" @@ -379,9 +384,10 @@ "This time `prove` didn't found the proof. But it doesn't mean that the inequality is not true! `prove` uses a list of $n$ positive values, where $n$ is a number of variables in the formula. List of values should correspond to the list of variables in alphabetical order. Here are a few tips how to choose the right values.\n", "\n", "1. Consider a function $pos(values)$ which is the sum of the positive addends in the formula after substitution of values to variables. Analogically, let $neg(values)$ be the sum of the negative addends. We should choose such values for which $quotient=pos(values)/|neg(values)|$ is small. \n", - "2. If the symmetry group of the formula is transitive (for example, the formula is cyclic or symmetric)\n", + "2. The symmetry group of the formula splits set of variables into orbits. Using the same values for variables in one orbit is recommended. In particular, if the symmetry group of the formula is transitive (for example, when the formula is cyclic), then all values (probably) should be the same.\n", + "3. If the formula is homogeneous, then $values=(a_1,a_2,...,a_n)$ provide a proof iff $values=(ka_1,ka_2,...,ka_n)$ provides a proof for any $k\\in Q_+$ (as long as you don't run into overflow error).\n", "\n", - "So let's try $a=2$ and $b=c=d=1$." + "In the formula above $b,c,d$ are in one orbit and the formula is homogenous, so let's try $a=2$ and $b=c=d=1$." ] }, { @@ -392,7 +398,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 2a$" + "Substitute $a\\to 2 e$" ], "text/plain": [ "" @@ -404,7 +410,7 @@ { "data": { "text/latex": [ - "numerator: $4a^2-2ab-2ac-2ad+b^2+c^2+d^2$" + "numerator: $b^{2} - 2 b e + c^{2} - 2 c e + d^{2} - 2 d e + 4 e^{2}$" ], "text/plain": [ "" @@ -452,7 +458,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 b e \\le b^{2}+e^{2}$$" ], "text/plain": [ "" @@ -464,7 +470,7 @@ { "data": { "text/latex": [ - "$$2ac \\le a^2+c^2$$" + "$$2 c e \\le c^{2}+e^{2}$$" ], "text/plain": [ "" @@ -476,7 +482,7 @@ { "data": { "text/latex": [ - "$$2ad \\le a^2+d^2$$" + "$$2 d e \\le d^{2}+e^{2}$$" ], "text/plain": [ "" @@ -488,7 +494,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le a^2 $$" + "$$ 0 \\le e^{2} $$" ], "text/plain": [ "" @@ -528,7 +534,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Function makes a substitution $a\\to 2a$ (which should be understood as $a=2a'$) and try to prove new inequality. This time it succeeded. Moreover, if starting formula is equal to 0, then all these inequalities have to be equalities, so $a'^2=0$ and eventually $a=0$. We can also try a little bit lower value for $a$." + "Function makes a substitution $a\\to 2e$ and try to prove new inequality. This time it succeeded. Moreover, if starting formula is equal to 0, then all these inequalities have to be equalities, so $e^2=0$ and eventually $a=0$. We can also try a little bit lower value for $a$." ] }, { @@ -539,7 +545,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 7a/4$" + "Substitute $a\\to \\frac{7 f}{4}$" ], "text/plain": [ "" @@ -551,7 +557,7 @@ { "data": { "text/latex": [ - "numerator: $49a^2-28ab-28ac-28ad+16b^2+16c^2+16d^2$" + "numerator: $16 b^{2} - 28 b f + 16 c^{2} - 28 c f + 16 d^{2} - 28 d f + 49 f^{2}$" ], "text/plain": [ "" @@ -599,7 +605,7 @@ { "data": { "text/latex": [ - "$$28ab \\le 14a^2+14b^2$$" + "$$28 b f \\le 14 b^{2}+14 f^{2}$$" ], "text/plain": [ "" @@ -611,7 +617,7 @@ { "data": { "text/latex": [ - "$$28ac \\le 14a^2+14c^2$$" + "$$28 c f \\le 14 c^{2}+14 f^{2}$$" ], "text/plain": [ "" @@ -623,7 +629,7 @@ { "data": { "text/latex": [ - "$$28ad \\le 14a^2+14d^2$$" + "$$28 d f \\le 14 d^{2}+14 f^{2}$$" ], "text/plain": [ "" @@ -635,7 +641,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 7a^2+2b^2+2c^2+2d^2 $$" + "$$ 0 \\le 2 b^{2}+2 c^{2}+2 d^{2}+7 f^{2} $$" ], "text/plain": [ "" @@ -675,24 +681,88 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we can see that if $a^2+b^2+c^2+d^2-a(b+c+d)=0$, then $7a'^2+2b^2+2c^2+2d^2=0$ and eventually $a=b=c=d=0$. Note that inequality is proved only for positive numbers (which, by continuity, can be expanded to nonnegative numbers). But using similar argumentation to the one in previous problem, if $(a,b,c,d)=(x,y,z,t)$ is the solution of $a^2+b^2+c^2+d^2-a(b+c+d)=0$, then $(a,b,c,d)=(|x|,|y|,|z|,|t|)$ is a solution, too. Since the only nonnegative solution is $(0,0,0,0)$, it means that it is the only solution.\n", + "Now we can see that if $a^2+b^2+c^2+d^2-a(b+c+d)=0$, then $7f^2+2b^2+2c^2+2d^2=0$ and eventually $a=b=c=d=0$. Note that inequality is proved only for positive numbers (which, by continuity, can be expanded to nonnegative numbers). But using similar argumentation to the one in previous problem, if $(a,b,c,d)=(x,y,z,t)$ is the solution of $a^2+b^2+c^2+d^2-a(b+c+d)=0$, then $(a,b,c,d)=(|x|,|y|,|z|,|t|)$ is a solution, too. Since the only nonnegative solution is $(0,0,0,0)$, it means that it is the only solution.\n", "\n", - "Let's skip the problem 3 and look solve the problem 4 instead.\n", + "It is worth noting that this time function `prove` used $f$ as a new variable instead of $e$. If you want to start a new proof and you don't care about the collision of variables from previous proofs, you can use `newproof` function, which clears the set of used variables.\n", "\n", - "#### Problem 4\n", - "If $x$ and $y$ are two positive numbers less than 1, prove that\n", - "$$\\frac{1}{1-x^2}+\\frac{1}{1-y^2}\\ge \\frac{2}{1-xy}.$$" + "We can also use the `findvalues` function to find values for the proof more automatically. It looks for (local) minimum of the $quotient$ value defined above." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimization terminated successfully.\n", + " Current function value: 1.154701\n", + " Iterations: 68\n", + " Function evaluations: 127\n" + ] + }, + { + "data": { + "text/plain": [ + "(1.4339109663193974,\n", + " 0.8278441585048405,\n", + " 0.8279027492686561,\n", + " 0.8278930696996669)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "formula=S('a^2+b^2+c^2+d^2-a*(b+c+d)')\n", + "numvalues=findvalues(formula)\n", + "numvalues" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If the $quotient$ value were less than 1, that would mean that the formula is negative for given values. If $quotient$ were equal to 1, then we have to choose exactly these values (or other values for which the $quotient$ is equal to 1. But here $quotient$ is greater than 1, so we can take a point near it and (probably) still have a proof. The values given to the `prove` function must not be floating point numbers, so we can rationalize them." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "numerator: $-x^3y+2x^2y^2-x^2-xy^3+2xy-y^2$" + "$\\displaystyle \\left( \\frac{10}{7}, \\ \\frac{5}{6}, \\ \\frac{5}{6}, \\ \\frac{5}{6}\\right)$" + ], + "text/plain": [ + "(10/7, 5/6, 5/6, 5/6)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "values=nsimplify(numvalues,tolerance=0.1,rational=True)\n", + "values" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "Substitute $a\\to \\frac{10 e}{7}$" ], "text/plain": [ "" @@ -704,7 +774,197 @@ { "data": { "text/latex": [ - "denominator: $x^3y^3-x^3y-x^2y^2+x^2-xy^3+xy+y^2-1$" + "Substitute $b\\to \\frac{5 f}{6}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $c\\to \\frac{5 g}{6}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $d\\to \\frac{5 h}{6}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "numerator: $3600 e^{2} - 2100 e f - 2100 e g - 2100 e h + 1225 f^{2} + 1225 g^{2} + 1225 h^{2}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $1764$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "status: 0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "From weighted AM-GM inequality:" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2100 e f \\le 1050 e^{2}+1050 f^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2100 e g \\le 1050 e^{2}+1050 g^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2100 e h \\le 1050 e^{2}+1050 h^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ 0 \\le 450 e^{2}+175 f^{2}+175 g^{2}+175 h^{2} $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "The sum of all inequalities gives us a proof of the inequality." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "newproof()\n", + "prove(formula,values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you set the tolerance bigger, then the values will have smaller numerators and denominators, so coefficients in the proof will be smaller, too. But if the tolerance is too big, then proof will not be found.\n", + "\n", + "Let's skip the problem 3 and look solve the problem 4 instead.\n", + "\n", + "#### Problem 4\n", + "If $x$ and $y$ are two positive numbers less than 1, prove that\n", + "$$\\frac{1}{1-x^2}+\\frac{1}{1-y^2}\\ge \\frac{2}{1-xy}.$$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "numerator: $- x^{3} y + 2 x^{2} y^{2} - x^{2} - x y^{3} + 2 x y - y^{2}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $x^{3} y^{3} - x^{3} y - x^{2} y^{2} + x^{2} - x y^{3} + x y + y^{2} - 1$" ], "text/plain": [ "" @@ -740,7 +1000,7 @@ { "data": { "text/latex": [ - "$$ x^3y+x^2+xy^3+y^2 \\le 2x^2y^2+2xy $$" + "$$ x^{3} y+x^{2}+x y^{3}+y^{2} \\le 2 x^{2} y^{2}+2 x y $$" ], "text/plain": [ "" @@ -779,7 +1039,7 @@ "2" ] }, - "execution_count": 7, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -794,19 +1054,19 @@ "source": [ "`prove` assumes that formula is well-defined if all variables are positive, so it doesn't have to analyze the denominator (except of choosing the right sign). In this case it is not true, since if $x=1$, then $1-x^2=0$. Also denominator is equal to $(x^2-1)(y^2-1)(xy-1)$ which is negative for $x,y\\in (0,1)$. So we need to make some substitution after which new variables can have all positive values, not just these inside (0,1) interval.\n", "\n", - "We will use a function `makesubs` to generate these substitutions. It has three basic parameters: `formula`, `intervals` and `values`. `intervals` are current limitations of variables, `values` are values of variables for which `formula` is small. `values` should be inside corresponding `intervals`. This argument is optional but it's better to use it.\n", + "We will use a function `makesubs` to generate these substitutions. It has three basic parameters: `formula`, `intervals` and `values`. `intervals` are current limitations of variables, `values` are values of variables for which $quotient$ of `formula` is small. `values` should be inside corresponding `intervals`. This argument is optional but it's better to use it.\n", "Let's go back to our problem. If $x=y$, then $\\frac{1}{1-x^2}+\\frac{1}{1-y^2}\\ge \\frac{2}{1-xy}$, so it's the minimum value of the formula. So let `values=(1/2,1/2)` (**warning: do not use decimal point**, for example '0.5,0.5')." ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "Substitute $x\\to 1-1/(x+1)$" + "Substitute $x\\to 1 - \\frac{1}{a + 1}$" ], "text/plain": [ "" @@ -818,7 +1078,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to 1-1/(y+1)$" + "Substitute $y\\to 1 - \\frac{1}{b + 1}$" ], "text/plain": [ "" @@ -830,7 +1090,7 @@ { "data": { "text/latex": [ - "numerator: $6x^3y+3x^3-12x^2y^2-3x^2y+3x^2+6xy^3-3xy^2-6xy+3y^3+3y^2$" + "numerator: $6 a^{3} b + 3 a^{3} - 12 a^{2} b^{2} - 3 a^{2} b + 3 a^{2} + 6 a b^{3} - 3 a b^{2} - 6 a b + 3 b^{3} + 3 b^{2}$" ], "text/plain": [ "" @@ -842,7 +1102,7 @@ { "data": { "text/latex": [ - "denominator: $4x^2y+2x^2+4xy^2+8xy+3x+2y^2+3y+1$" + "denominator: $4 a^{2} b + 2 a^{2} + 4 a b^{2} + 8 a b + 3 a + 2 b^{2} + 3 b + 1$" ], "text/plain": [ "" @@ -878,7 +1138,7 @@ { "data": { "text/latex": [ - "$$12x^2y^2 \\le 6x^3y+6xy^3$$" + "$$12 a^{2} b^{2} \\le 6 a^{3} b+6 a b^{3}$$" ], "text/plain": [ "" @@ -890,7 +1150,7 @@ { "data": { "text/latex": [ - "$$3x^2y \\le 2x^3+y^3$$" + "$$3 a^{2} b \\le 2 a^{3}+b^{3}$$" ], "text/plain": [ "" @@ -902,7 +1162,7 @@ { "data": { "text/latex": [ - "$$3xy^2 \\le x^3+2y^3$$" + "$$3 a b^{2} \\le a^{3}+2 b^{3}$$" ], "text/plain": [ "" @@ -914,7 +1174,7 @@ { "data": { "text/latex": [ - "$$6xy \\le 3x^2+3y^2$$" + "$$6 a b \\le 3 a^{2}+3 b^{2}$$" ], "text/plain": [ "" @@ -953,12 +1213,13 @@ "0" ] }, - "execution_count": 8, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "newproof()\n", "newformula,newvalues=makesubs('1/(1-x^2)+1/(1-y^2)-2/(1-x*y)','[0,1],[0,1]','1/2,1/2')\n", "prove(newformula*3,newvalues)" ] @@ -978,411 +1239,7 @@ "* constraints for variables are written as intervals,\n", "* there are no \"backwards dependencies\", i.e. there is no $x$ in the interval of $y$.\n", "\n", - "If these two conditions hold, then you can use `makesubs` function.\n", - "**Warning:** at this moment `makesubs` **doesn't warn you if your list of intervals doesn't follow these rules!**\n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "Substitute $x\\to -y+1+(y-1)/(x+1)$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Substitute $y\\to 1-1/(y+1)$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Substitute $y\\to y/2$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "numerator: $x^4y^2+x^3y^2-2x^3y-4x^2y+4x^2+xy^2-2xy+y^2$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "denominator: $x^3y^2+2x^3y+2x^2y^2+4x^2y+xy^2+2xy$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "status: 0" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "From weighted AM-GM inequality:" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$2x^3y \\le x^4y^2+x^2$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$4x^2y \\le x^3y^2+2x^2+xy^2$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$2xy \\le x^2+y^2$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$ 0 \\le 0 $$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "The sum of all inequalities gives us a proof of the inequality." - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "formula=Sm('xy/z+yz/x+zx/y-1').subs('z',S('1-x-y'))\n", - "newformula,values=makesubs(formula,'[0,1-y],[0,1]','1/3,1/3')\n", - "prove(newformula,values)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The proof is found, so the assumption that 1 is the minimum of `xy/z+yz/x+zx/y` was good.\n", - "\n", - "Functions `S` and `Sm` creates a SymPy object from a string. The only difference is that `Sm` assumes that there are no multi-letter variables and adds a multiplication sign between every two terms which has no operator sign, so object `Sm(xy/z+yz/x+zx/y)` has 3 variables `x,y,z` and `S('xy/z+yz/x+zx/y')` has 6 variables `x,y,z,xy,yz,zx`. \n", - "\n", - "As you may have noticed, formulas are often cyclic or symmetric. Therefore you can use `cyclize` or `symmetrize` function to reduce the length of the written formula. Here are a few commands which will do the same as each other. " - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "numerator: $2a^2-2ab-2ac+2b^2-2bc+2c^2$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "denominator: $1$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "status: 0" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "From weighted AM-GM inequality:" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$2ab \\le a^2+b^2$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$2ac \\le a^2+c^2$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$2bc \\le b^2+c^2$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$ 0 \\le 0 $$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "The sum of all inequalities gives us a proof of the inequality." - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "prove('(a^2+b^2+c^2-a*b-a*c-b*c)*2')\n", - "#prove(S('(a^2+b^2+c^2-a*b-a*c-b*c)*2'))\n", - "#prove(Sm('2(a^2+b^2+c^2-ab-ac-bc)'))\n", - "#prove(cyclize('2*a^2-2*a*b'))\n", - "#prove(symmetrize('a^2-a*b'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now look at formula $(x-1)^4$. It's quite obvious that it's nonnegative, but `prove` fails to show this!" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "numerator: $x^4-4x^3+6x^2-4x+1$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "denominator: $1$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "status: 2" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Program couldn't find any proof." - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$ 4x^3+4x \\le x^4+6x^2+1 $$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "prove('(x-1)^4')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But there is a relatively simple method to generate a proof using this library. We will make to proofs: one for $x\\in (1,\\infty)$ and the second one for $(-\\infty,1)$." + "If these two conditions hold, then you can use `makesubs` function." ] }, { @@ -1393,7 +1250,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+1$" + "Substitute $x\\to - y + 1 + \\frac{y - 1}{a + 1}$" ], "text/plain": [ "" @@ -1405,7 +1262,7 @@ { "data": { "text/latex": [ - "numerator: $x^4$" + "Substitute $y\\to 1 - \\frac{1}{b + 1}$" ], "text/plain": [ "" @@ -1417,7 +1274,31 @@ { "data": { "text/latex": [ - "denominator: $1$" + "Substitute $b\\to \\frac{c}{2}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "numerator: $a^{4} c^{2} + a^{3} c^{2} - 2 a^{3} c - 4 a^{2} c + 4 a^{2} + a c^{2} - 2 a c + c^{2}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $a^{3} c^{2} + 2 a^{3} c + 2 a^{2} c^{2} + 4 a^{2} c + a c^{2} + 2 a c$" ], "text/plain": [ "" @@ -1441,7 +1322,55 @@ { "data": { "text/latex": [ - "$$ 0 \\le x^4 $$" + "From weighted AM-GM inequality:" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 a^{3} c \\le a^{4} c^{2}+a^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$4 a^{2} c \\le a^{3} c^{2}+2 a^{2}+a c^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 a c \\le a^{2}+c^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ 0 \\le 0 $$" ], "text/plain": [ "" @@ -1474,32 +1403,32 @@ } ], "source": [ - "prove(makesubs('(x-1)^4','(1,oo)'))" + "newproof()\n", + "formula=Sm('xy/z+yz/x+zx/y-1').subs('z',S('1-x-y'))\n", + "newformula,values=makesubs(formula,'[0,1-y],[0,1]','1/3,1/3')\n", + "prove(newformula,values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The proof is found, so the assumption that 1 is the minimum of `xy/z+yz/x+zx/y` was good.\n", + "\n", + "Functions `S` and `Sm` creates a SymPy object from a string. The only difference is that `Sm` assumes that there are no multi-letter variables and adds a multiplication sign between every two terms which has no operator sign, so object `Sm(xy/z+yz/x+zx/y)` has 3 variables `x,y,z` and `S('xy/z+yz/x+zx/y')` has 6 variables `x,y,z,xy,yz,zx`. \n", + "\n", + "As you may have noticed, formulas are often cyclic or symmetric. Therefore you can use `cyclize` or `symmetrize` function to reduce the length of the written formula. Here are a few commands which will do the same as each other. " ] }, { "cell_type": "code", "execution_count": 13, - "metadata": { - "scrolled": true - }, + "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "Substitute $x\\to 1-x$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "numerator: $x^4$" + "numerator: $2 a^{2} - 2 a b - 2 a c + 2 b^{2} - 2 b c + 2 c^{2}$" ], "text/plain": [ "" @@ -1535,7 +1464,55 @@ { "data": { "text/latex": [ - "$$ 0 \\le x^4 $$" + "From weighted AM-GM inequality:" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 a b \\le a^{2}+b^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 a c \\le a^{2}+c^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 b c \\le b^{2}+c^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ 0 \\le 0 $$" ], "text/plain": [ "" @@ -1568,19 +1545,18 @@ } ], "source": [ - "prove(makesubs('(x-1)^4','(-oo,1)'))" + "prove('(a^2+b^2+c^2-a*b-a*c-b*c)*2')\n", + "#prove(S('(a^2+b^2+c^2-a*b-a*c-b*c)*2'))\n", + "#prove(Sm('2(a^2+b^2+c^2-ab-ac-bc)'))\n", + "#prove(cyclize('2*a^2-2*a*b'))\n", + "#prove(symmetrize('a^2-a*b'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Now let's go to the problem 10\n", - "#### Problem 10\n", - "If $a,b,c,d>0$, prove that\n", - "$$\\frac a{b+c}+\\frac b{c+d}+ \\frac c{d+a}+ \\frac d{a+b}\\geq 2.$$\n", - "\n", - "Let's try a simple approach." + "Now look at formula $(x-1)^4$. It's quite obvious that it's nonnegative, but `prove` fails to show this!" ] }, { @@ -1591,31 +1567,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\frac{a}{b + c} + \\frac{b}{c + d} + \\frac{c}{a + d} + \\frac{d}{a + b} - 2$" - ], - "text/plain": [ - "a/(b + c) + b/(c + d) + c/(a + d) + d/(a + b) - 2" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "formula=cyclize('a/(b+c)',variables='a,b,c,d')-2\n", - "formula" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "numerator: $a^3c+a^3d+a^2b^2-a^2bd-2a^2c^2-a^2cd+a^2d^2+ab^3-ab^2c-ab^2d-abc^2+ac^3-acd^2+b^3d+b^2c^2-2b^2d^2+bc^3-bc^2d-bcd^2+bd^3+c^2d^2+cd^3$" + "numerator: $x^{4} - 4 x^{3} + 6 x^{2} - 4 x + 1$" ], "text/plain": [ "" @@ -1627,7 +1579,7 @@ { "data": { "text/latex": [ - "denominator: $a^2bc+a^2bd+a^2c^2+a^2cd+ab^2c+ab^2d+abc^2+2abcd+abd^2+ac^2d+acd^2+b^2cd+b^2d^2+bc^2d+bcd^2$" + "denominator: $1$" ], "text/plain": [ "" @@ -1663,7 +1615,7 @@ { "data": { "text/latex": [ - "$$ a^2bd+2a^2c^2+a^2cd+ab^2c+ab^2d+abc^2+acd^2+2b^2d^2+bc^2d+bcd^2 \\le a^3c+a^3d+a^2b^2+a^2d^2+ab^3+ac^3+b^3d+b^2c^2+bc^3+bd^3+c^2d^2+cd^3 $$" + "$$ 4 x^{3}+4 x \\le x^{4}+6 x^{2}+1 $$" ], "text/plain": [ "" @@ -1678,11 +1630,322 @@ "2" ] }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prove('(x-1)^4')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But there is a relatively simple method to generate a proof using this library. We will make to proofs: one for $x\\in (1,\\infty)$ and the second one for $(-\\infty,1)$." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "Substitute $x\\to a + 1$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "numerator: $a^{4}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $1$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "status: 0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ 0 \\le a^{4} $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "The sum of all inequalities gives us a proof of the inequality." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "0" + ] + }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], + "source": [ + "newproof()\n", + "prove(makesubs('(x-1)^4','(1,oo)'))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/latex": [ + "Substitute $x\\to 1 - a$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "numerator: $a^{4}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $1$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "status: 0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ 0 \\le a^{4} $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "The sum of all inequalities gives us a proof of the inequality." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "newproof()\n", + "prove(makesubs('(x-1)^4','(-oo,1)'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's go to the problem 10\n", + "#### Problem 10\n", + "If $a,b,c,d>0$, prove that\n", + "$$\\frac a{b+c}+\\frac b{c+d}+ \\frac c{d+a}+ \\frac d{a+b}\\geq 2.$$\n", + "\n", + "Let's try a simple approach." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{a}{b + c} + \\frac{b}{c + d} + \\frac{c}{a + d} + \\frac{d}{a + b} - 2$" + ], + "text/plain": [ + "a/(b + c) + b/(c + d) + c/(a + d) + d/(a + b) - 2" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "formula=cyclize('a/(b+c)',variables='a,b,c,d')-2\n", + "formula" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "numerator: $a^{3} c + a^{3} d + a^{2} b^{2} - a^{2} b d - 2 a^{2} c^{2} - a^{2} c d + a^{2} d^{2} + a b^{3} - a b^{2} c - a b^{2} d - a b c^{2} + a c^{3} - a c d^{2} + b^{3} d + b^{2} c^{2} - 2 b^{2} d^{2} + b c^{3} - b c^{2} d - b c d^{2} + b d^{3} + c^{2} d^{2} + c d^{3}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $a^{2} b c + a^{2} b d + a^{2} c^{2} + a^{2} c d + a b^{2} c + a b^{2} d + a b c^{2} + 2 a b c d + a b d^{2} + a c^{2} d + a c d^{2} + b^{2} c d + b^{2} d^{2} + b c^{2} d + b c d^{2}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "status: 2" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Program couldn't find any proof." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ a^{2} b d+2 a^{2} c^{2}+a^{2} c d+a b^{2} c+a b^{2} d+a b c^{2}+a c d^{2}+2 b^{2} d^{2}+b c^{2} d+b c d^{2} \\le a^{3} c+a^{3} d+a^{2} b^{2}+a^{2} d^{2}+a b^{3}+a c^{3}+b^{3} d+b^{2} c^{2}+b c^{3}+b d^{3}+c^{2} d^{2}+c d^{3} $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "prove(formula)" ] @@ -1696,13 +1959,13 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "Substitute $a\\to a+c$" + "Substitute $a\\to c + e$" ], "text/plain": [ "" @@ -1714,7 +1977,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+d$" + "Substitute $b\\to d + f$" ], "text/plain": [ "" @@ -1726,7 +1989,7 @@ { "data": { "text/latex": [ - "numerator: $a^3c+a^3d+a^2b^2+a^2bd+a^2c^2+2a^2cd+a^2d^2+ab^3+ab^2c+2ab^2d-abc^2+abd^2+b^3c+b^3d+b^2c^2+2b^2cd+b^2d^2$" + "numerator: $c^{2} e^{2} - c^{2} e f + c^{2} f^{2} + 2 c d e^{2} + 2 c d f^{2} + c e^{3} + c e f^{2} + c f^{3} + d^{2} e^{2} + d^{2} e f + d^{2} f^{2} + d e^{3} + d e^{2} f + 2 d e f^{2} + d f^{3} + e^{2} f^{2} + e f^{3}$" ], "text/plain": [ "" @@ -1738,7 +2001,7 @@ { "data": { "text/latex": [ - "denominator: $a^2bc+a^2bd+a^2c^2+2a^2cd+a^2d^2+ab^2c+ab^2d+3abc^2+6abcd+3abd^2+2ac^3+6ac^2d+6acd^2+2ad^3+b^2c^2+2b^2cd+b^2d^2+2bc^3+6bc^2d+6bcd^2+2bd^3+c^4+4c^3d+6c^2d^2+4cd^3+d^4$" + "denominator: $c^{4} + 4 c^{3} d + 2 c^{3} e + 2 c^{3} f + 6 c^{2} d^{2} + 6 c^{2} d e + 6 c^{2} d f + c^{2} e^{2} + 3 c^{2} e f + c^{2} f^{2} + 4 c d^{3} + 6 c d^{2} e + 6 c d^{2} f + 2 c d e^{2} + 6 c d e f + 2 c d f^{2} + c e^{2} f + c e f^{2} + d^{4} + 2 d^{3} e + 2 d^{3} f + d^{2} e^{2} + 3 d^{2} e f + d^{2} f^{2} + d e^{2} f + d e f^{2}$" ], "text/plain": [ "" @@ -1786,7 +2049,7 @@ { "data": { "text/latex": [ - "$$ abc^2 \\le a^3c+a^3d+a^2b^2+a^2bd+a^2c^2+2a^2cd+a^2d^2+ab^3+ab^2c+2ab^2d+abd^2+b^3c+b^3d+b^2c^2+2b^2cd+b^2d^2 $$" + "$$ c^{2} e f \\le c^{2} e^{2}+c^{2} f^{2}+2 c d e^{2}+2 c d f^{2}+c e^{3}+c e f^{2}+c f^{3}+d^{2} e^{2}+d^{2} e f+d^{2} f^{2}+d e^{3}+d e^{2} f+2 d e f^{2}+d f^{3}+e^{2} f^{2}+e f^{3} $$" ], "text/plain": [ "" @@ -1801,24 +2064,25 @@ "0" ] }, - "execution_count": 16, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "newproof()\n", "prove(makesubs(formula,'[c,oo],[d,oo]'))" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "Substitute $a\\to a+c$" + "Substitute $a\\to c + e$" ], "text/plain": [ "" @@ -1830,7 +2094,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+d$" + "Substitute $b\\to d + f$" ], "text/plain": [ "" @@ -1842,7 +2106,7 @@ { "data": { "text/latex": [ - "numerator: $2a^3c+2a^3d+2a^2b^2+2a^2bd+2a^2c^2+4a^2cd+2a^2d^2+2ab^3+2ab^2c+4ab^2d-2abc^2+2abd^2+2b^3c+2b^3d+2b^2c^2+4b^2cd+2b^2d^2$" + "numerator: $2 c^{2} e^{2} - 2 c^{2} e f + 2 c^{2} f^{2} + 4 c d e^{2} + 4 c d f^{2} + 2 c e^{3} + 2 c e f^{2} + 2 c f^{3} + 2 d^{2} e^{2} + 2 d^{2} e f + 2 d^{2} f^{2} + 2 d e^{3} + 2 d e^{2} f + 4 d e f^{2} + 2 d f^{3} + 2 e^{2} f^{2} + 2 e f^{3}$" ], "text/plain": [ "" @@ -1854,7 +2118,7 @@ { "data": { "text/latex": [ - "denominator: $a^2bc+a^2bd+a^2c^2+2a^2cd+a^2d^2+ab^2c+ab^2d+3abc^2+6abcd+3abd^2+2ac^3+6ac^2d+6acd^2+2ad^3+b^2c^2+2b^2cd+b^2d^2+2bc^3+6bc^2d+6bcd^2+2bd^3+c^4+4c^3d+6c^2d^2+4cd^3+d^4$" + "denominator: $c^{4} + 4 c^{3} d + 2 c^{3} e + 2 c^{3} f + 6 c^{2} d^{2} + 6 c^{2} d e + 6 c^{2} d f + c^{2} e^{2} + 3 c^{2} e f + c^{2} f^{2} + 4 c d^{3} + 6 c d^{2} e + 6 c d^{2} f + 2 c d e^{2} + 6 c d e f + 2 c d f^{2} + c e^{2} f + c e f^{2} + d^{4} + 2 d^{3} e + 2 d^{3} f + d^{2} e^{2} + 3 d^{2} e f + d^{2} f^{2} + d e^{2} f + d e f^{2}$" ], "text/plain": [ "" @@ -1890,7 +2154,7 @@ { "data": { "text/latex": [ - "$$2abc^2 \\le a^2c^2+b^2c^2$$" + "$$2 c^{2} e f \\le c^{2} e^{2}+c^{2} f^{2}$$" ], "text/plain": [ "" @@ -1902,7 +2166,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 2a^3c+2a^3d+2a^2b^2+2a^2bd+a^2c^2+4a^2cd+2a^2d^2+2ab^3+2ab^2c+4ab^2d+2abd^2+2b^3c+2b^3d+b^2c^2+4b^2cd+2b^2d^2 $$" + "$$ 0 \\le c^{2} e^{2}+c^{2} f^{2}+4 c d e^{2}+4 c d f^{2}+2 c e^{3}+2 c e f^{2}+2 c f^{3}+2 d^{2} e^{2}+2 d^{2} e f+2 d^{2} f^{2}+2 d e^{3}+2 d e^{2} f+4 d e f^{2}+2 d f^{3}+2 e^{2} f^{2}+2 e f^{3} $$" ], "text/plain": [ "" @@ -1929,12 +2193,13 @@ "0" ] }, - "execution_count": 17, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "newproof()\n", "prove(makesubs(formula,'[c,oo],[d,oo]')*2)" ] }, @@ -1947,13 +2212,13 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "Substitute $a\\to c-c/(a+1)$" + "Substitute $a\\to c - \\frac{c}{e + 1}$" ], "text/plain": [ "" @@ -1965,7 +2230,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to d-d/(b+1)$" + "Substitute $b\\to d - \\frac{d}{f + 1}$" ], "text/plain": [ "" @@ -1977,7 +2242,7 @@ { "data": { "text/latex": [ - "numerator: $2a^3bc^2d^2+4a^3bcd^3+2a^3bd^4+2a^3c^2d^2+2a^3cd^3-2a^2b^2c^3d+2a^2b^2cd^3-4a^2bc^3d+4a^2bc^2d^2+12a^2bcd^3+6a^2bd^4-2a^2c^3d+4a^2c^2d^2+6a^2cd^3+2ab^3c^4+4ab^3c^3d+2ab^3c^2d^2+6ab^2c^4+8ab^2c^3d+4ab^2c^2d^2+4ab^2cd^3+6abc^4+4abc^3d+6abc^2d^2+12abcd^3+6abd^4+2ac^4+4ac^2d^2+6acd^3+2b^3c^3d+2b^3c^2d^2+4b^2c^3d+4b^2c^2d^2+2b^2cd^3+2bc^3d+4bc^2d^2+4bcd^3+2bd^4+2c^2d^2+2cd^3$" + "numerator: $2 c^{4} e f^{3} + 6 c^{4} e f^{2} + 6 c^{4} e f + 2 c^{4} e - 2 c^{3} d e^{2} f^{2} - 4 c^{3} d e^{2} f - 2 c^{3} d e^{2} + 4 c^{3} d e f^{3} + 8 c^{3} d e f^{2} + 4 c^{3} d e f + 2 c^{3} d f^{3} + 4 c^{3} d f^{2} + 2 c^{3} d f + 2 c^{2} d^{2} e^{3} f + 2 c^{2} d^{2} e^{3} + 4 c^{2} d^{2} e^{2} f + 4 c^{2} d^{2} e^{2} + 2 c^{2} d^{2} e f^{3} + 4 c^{2} d^{2} e f^{2} + 6 c^{2} d^{2} e f + 4 c^{2} d^{2} e + 2 c^{2} d^{2} f^{3} + 4 c^{2} d^{2} f^{2} + 4 c^{2} d^{2} f + 2 c^{2} d^{2} + 4 c d^{3} e^{3} f + 2 c d^{3} e^{3} + 2 c d^{3} e^{2} f^{2} + 12 c d^{3} e^{2} f + 6 c d^{3} e^{2} + 4 c d^{3} e f^{2} + 12 c d^{3} e f + 6 c d^{3} e + 2 c d^{3} f^{2} + 4 c d^{3} f + 2 c d^{3} + 2 d^{4} e^{3} f + 6 d^{4} e^{2} f + 6 d^{4} e f + 2 d^{4} f$" ], "text/plain": [ "" @@ -1989,7 +2254,7 @@ { "data": { "text/latex": [ - "denominator: $a^3b^3c^4+4a^3b^3c^3d+6a^3b^3c^2d^2+4a^3b^3cd^3+a^3b^3d^4+3a^3b^2c^4+10a^3b^2c^3d+12a^3b^2c^2d^2+6a^3b^2cd^3+a^3b^2d^4+3a^3bc^4+8a^3bc^3d+7a^3bc^2d^2+2a^3bcd^3+a^3c^4+2a^3c^3d+a^3c^2d^2+a^2b^3c^4+6a^2b^3c^3d+12a^2b^3c^2d^2+10a^2b^3cd^3+3a^2b^3d^4+3a^2b^2c^4+15a^2b^2c^3d+24a^2b^2c^2d^2+15a^2b^2cd^3+3a^2b^2d^4+3a^2bc^4+12a^2bc^3d+14a^2bc^2d^2+5a^2bcd^3+a^2c^4+3a^2c^3d+2a^2c^2d^2+2ab^3c^3d+7ab^3c^2d^2+8ab^3cd^3+3ab^3d^4+5ab^2c^3d+14ab^2c^2d^2+12ab^2cd^3+3ab^2d^4+4abc^3d+8abc^2d^2+4abcd^3+ac^3d+ac^2d^2+b^3c^2d^2+2b^3cd^3+b^3d^4+2b^2c^2d^2+3b^2cd^3+b^2d^4+bc^2d^2+bcd^3$" + "denominator: $c^{4} e^{3} f^{3} + 3 c^{4} e^{3} f^{2} + 3 c^{4} e^{3} f + c^{4} e^{3} + c^{4} e^{2} f^{3} + 3 c^{4} e^{2} f^{2} + 3 c^{4} e^{2} f + c^{4} e^{2} + 4 c^{3} d e^{3} f^{3} + 10 c^{3} d e^{3} f^{2} + 8 c^{3} d e^{3} f + 2 c^{3} d e^{3} + 6 c^{3} d e^{2} f^{3} + 15 c^{3} d e^{2} f^{2} + 12 c^{3} d e^{2} f + 3 c^{3} d e^{2} + 2 c^{3} d e f^{3} + 5 c^{3} d e f^{2} + 4 c^{3} d e f + c^{3} d e + 6 c^{2} d^{2} e^{3} f^{3} + 12 c^{2} d^{2} e^{3} f^{2} + 7 c^{2} d^{2} e^{3} f + c^{2} d^{2} e^{3} + 12 c^{2} d^{2} e^{2} f^{3} + 24 c^{2} d^{2} e^{2} f^{2} + 14 c^{2} d^{2} e^{2} f + 2 c^{2} d^{2} e^{2} + 7 c^{2} d^{2} e f^{3} + 14 c^{2} d^{2} e f^{2} + 8 c^{2} d^{2} e f + c^{2} d^{2} e + c^{2} d^{2} f^{3} + 2 c^{2} d^{2} f^{2} + c^{2} d^{2} f + 4 c d^{3} e^{3} f^{3} + 6 c d^{3} e^{3} f^{2} + 2 c d^{3} e^{3} f + 10 c d^{3} e^{2} f^{3} + 15 c d^{3} e^{2} f^{2} + 5 c d^{3} e^{2} f + 8 c d^{3} e f^{3} + 12 c d^{3} e f^{2} + 4 c d^{3} e f + 2 c d^{3} f^{3} + 3 c d^{3} f^{2} + c d^{3} f + d^{4} e^{3} f^{3} + d^{4} e^{3} f^{2} + 3 d^{4} e^{2} f^{3} + 3 d^{4} e^{2} f^{2} + 3 d^{4} e f^{3} + 3 d^{4} e f^{2} + d^{4} f^{3} + d^{4} f^{2}$" ], "text/plain": [ "" @@ -2025,7 +2290,7 @@ { "data": { "text/latex": [ - "$$2a^2b^2c^3d \\le a^3bc^2d^2+ab^3c^4$$" + "$$2 c^{3} d e^{2} f^{2} \\le c^{4} e f^{3}+c^{2} d^{2} e^{3} f$$" ], "text/plain": [ "" @@ -2037,7 +2302,7 @@ { "data": { "text/latex": [ - "$$2a^2c^3d \\le a^3c^2d^2+ac^4$$" + "$$2 c^{3} d e^{2} \\le c^{4} e+c^{2} d^{2} e^{3}$$" ], "text/plain": [ "" @@ -2049,7 +2314,7 @@ { "data": { "text/latex": [ - "$$4a^2bc^3d \\le a^3bc^2d^2+a^3c^2d^2+ab^3c^4+ac^4$$" + "$$4 c^{3} d e^{2} f \\le c^{4} e f^{3}+c^{4} e+c^{2} d^{2} e^{3} f+c^{2} d^{2} e^{3}$$" ], "text/plain": [ "" @@ -2061,7 +2326,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^3bcd^3+2a^3bd^4+2a^3cd^3+2a^2b^2cd^3+4a^2bc^2d^2+12a^2bcd^3+6a^2bd^4+4a^2c^2d^2+6a^2cd^3+4ab^3c^3d+2ab^3c^2d^2+6ab^2c^4+8ab^2c^3d+4ab^2c^2d^2+4ab^2cd^3+6abc^4+4abc^3d+6abc^2d^2+12abcd^3+6abd^4+4ac^2d^2+6acd^3+2b^3c^3d+2b^3c^2d^2+4b^2c^3d+4b^2c^2d^2+2b^2cd^3+2bc^3d+4bc^2d^2+4bcd^3+2bd^4+2c^2d^2+2cd^3 $$" + "$$ 0 \\le 6 c^{4} e f^{2}+6 c^{4} e f+4 c^{3} d e f^{3}+8 c^{3} d e f^{2}+4 c^{3} d e f+2 c^{3} d f^{3}+4 c^{3} d f^{2}+2 c^{3} d f+4 c^{2} d^{2} e^{2} f+4 c^{2} d^{2} e^{2}+2 c^{2} d^{2} e f^{3}+4 c^{2} d^{2} e f^{2}+6 c^{2} d^{2} e f+4 c^{2} d^{2} e+2 c^{2} d^{2} f^{3}+4 c^{2} d^{2} f^{2}+4 c^{2} d^{2} f+2 c^{2} d^{2}+4 c d^{3} e^{3} f+2 c d^{3} e^{3}+2 c d^{3} e^{2} f^{2}+12 c d^{3} e^{2} f+6 c d^{3} e^{2}+4 c d^{3} e f^{2}+12 c d^{3} e f+6 c d^{3} e+2 c d^{3} f^{2}+4 c d^{3} f+2 c d^{3}+2 d^{4} e^{3} f+6 d^{4} e^{2} f+6 d^{4} e f+2 d^{4} f $$" ], "text/plain": [ "" @@ -2088,12 +2353,13 @@ "0" ] }, - "execution_count": 18, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "newproof()\n", "prove(makesubs(formula,'[0,c],[0,d]')*2)" ] }, @@ -2106,13 +2372,13 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "numerator: $x^4-4x^3+6x^2-4x+1$" + "numerator: $x^{4} - 4 x^{3} + 6 x^{2} - 4 x + 1$" ], "text/plain": [ "" @@ -2136,8 +2402,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2149,7 +2414,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to 1+x$" + "Substitute $x\\to 1+a$" ], "text/plain": [ "" @@ -2161,7 +2426,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $x^4$" + "Numerator after substitutions: $a^{4}$" ], "text/plain": [ "" @@ -2185,7 +2450,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le x^4 $$" + "$$ 0 \\le a^{4} $$" ], "text/plain": [ "" @@ -2209,8 +2474,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2222,7 +2486,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to 1/(1+x)$" + "Substitute $x\\to 1/(1+b)$" ], "text/plain": [ "" @@ -2234,7 +2498,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $x^4$" + "Numerator after substitutions: $b^{4}$" ], "text/plain": [ "" @@ -2258,7 +2522,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le x^4 $$" + "$$ 0 \\le b^{4} $$" ], "text/plain": [ "" @@ -2278,21 +2542,32 @@ }, "metadata": {}, "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Counter({0: 2})" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ + "newproof()\n", "powerprove('(x-1)^4')" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "numerator: $4a^5+4a^4b+4a^4c-6a^4-4a^3b-2a^3c+4ab^3-9ab^2+4ac^2-18ac+9a+4b^4+4b^3c-6b^3-3b^2c+4bc^2-12bc+10b+4c^3-6c^2+11c$" + "numerator: $4 a^{5} + 4 a^{4} b + 4 a^{4} c - 6 a^{4} - 4 a^{3} b - 2 a^{3} c + 4 a b^{3} - 9 a b^{2} + 4 a c^{2} - 18 a c + 9 a + 4 b^{4} + 4 b^{3} c - 6 b^{3} - 3 b^{2} c + 4 b c^{2} - 12 b c + 10 b + 4 c^{3} - 6 c^{2} + 11 c$" ], "text/plain": [ "" @@ -2316,8 +2591,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2329,7 +2603,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1+a,b\\to 1+b,c\\to 1+c$" + "Substitute $a\\to 1+d,b\\to 1+e,c\\to 1+f$" ], "text/plain": [ "" @@ -2341,7 +2615,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5+4a^4b+4a^4c+22a^4+12a^3b+14a^3c+42a^3+12a^2b+18a^2c+34a^2+4ab^3+3ab^2-2ab+4ac^2+4b^4+4b^3c+18b^3+9b^2c+18b^2+4bc^2+2bc+4c^3+14c^2$" + "Numerator after substitutions: $4 d^{5} + 4 d^{4} e + 4 d^{4} f + 22 d^{4} + 12 d^{3} e + 14 d^{3} f + 42 d^{3} + 12 d^{2} e + 18 d^{2} f + 34 d^{2} + 4 d e^{3} + 3 d e^{2} - 2 d e + 4 d f^{2} + 4 e^{4} + 4 e^{3} f + 18 e^{3} + 9 e^{2} f + 18 e^{2} + 4 e f^{2} + 2 e f + 4 f^{3} + 14 f^{2}$" ], "text/plain": [ "" @@ -2377,7 +2651,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 d e \\le d^{2}+e^{2}$$" ], "text/plain": [ "" @@ -2389,7 +2663,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5+4a^4b+4a^4c+22a^4+12a^3b+14a^3c+42a^3+12a^2b+18a^2c+33a^2+4ab^3+3ab^2+4ac^2+4b^4+4b^3c+18b^3+9b^2c+17b^2+4bc^2+2bc+4c^3+14c^2 $$" + "$$ 0 \\le 4 d^{5}+4 d^{4} e+4 d^{4} f+22 d^{4}+12 d^{3} e+14 d^{3} f+42 d^{3}+12 d^{2} e+18 d^{2} f+33 d^{2}+4 d e^{3}+3 d e^{2}+4 d f^{2}+4 e^{4}+4 e^{3} f+18 e^{3}+9 e^{2} f+17 e^{2}+4 e f^{2}+2 e f+4 f^{3}+14 f^{2} $$" ], "text/plain": [ "" @@ -2413,8 +2687,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2426,7 +2699,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1/(1+a),b\\to 1+b,c\\to 1+c$" + "Substitute $a\\to 1/(1+g),b\\to 1+h,c\\to 1+i$" ], "text/plain": [ "" @@ -2438,7 +2711,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5b^4+4a^5b^3c+14a^5b^3+9a^5b^2c+15a^5b^2+4a^5bc^2+2a^5bc+6a^5b+4a^5c^3+10a^5c^2+8a^5c+10a^5+20a^4b^4+20a^4b^3c+74a^4b^3+45a^4b^2c+78a^4b^2+20a^4bc^2+10a^4bc+24a^4b+20a^4c^3+54a^4c^2+30a^4c+40a^4+40a^3b^4+40a^3b^3c+156a^3b^3+90a^3b^2c+162a^3b^2+40a^3bc^2+20a^3bc+36a^3b+40a^3c^3+116a^3c^2+40a^3c+60a^3+40a^2b^4+40a^2b^3c+164a^2b^3+90a^2b^2c+168a^2b^2+40a^2bc^2+20a^2bc+20a^2b+40a^2c^3+124a^2c^2+18a^2c+34a^2+20ab^4+20ab^3c+86ab^3+45ab^2c+87ab^2+20abc^2+10abc+2ab+20ac^3+66ac^2+4b^4+4b^3c+18b^3+9b^2c+18b^2+4bc^2+2bc+4c^3+14c^2$" + "Numerator after substitutions: $4 g^{5} h^{4} + 4 g^{5} h^{3} i + 14 g^{5} h^{3} + 9 g^{5} h^{2} i + 15 g^{5} h^{2} + 4 g^{5} h i^{2} + 2 g^{5} h i + 6 g^{5} h + 4 g^{5} i^{3} + 10 g^{5} i^{2} + 8 g^{5} i + 10 g^{5} + 20 g^{4} h^{4} + 20 g^{4} h^{3} i + 74 g^{4} h^{3} + 45 g^{4} h^{2} i + 78 g^{4} h^{2} + 20 g^{4} h i^{2} + 10 g^{4} h i + 24 g^{4} h + 20 g^{4} i^{3} + 54 g^{4} i^{2} + 30 g^{4} i + 40 g^{4} + 40 g^{3} h^{4} + 40 g^{3} h^{3} i + 156 g^{3} h^{3} + 90 g^{3} h^{2} i + 162 g^{3} h^{2} + 40 g^{3} h i^{2} + 20 g^{3} h i + 36 g^{3} h + 40 g^{3} i^{3} + 116 g^{3} i^{2} + 40 g^{3} i + 60 g^{3} + 40 g^{2} h^{4} + 40 g^{2} h^{3} i + 164 g^{2} h^{3} + 90 g^{2} h^{2} i + 168 g^{2} h^{2} + 40 g^{2} h i^{2} + 20 g^{2} h i + 20 g^{2} h + 40 g^{2} i^{3} + 124 g^{2} i^{2} + 18 g^{2} i + 34 g^{2} + 20 g h^{4} + 20 g h^{3} i + 86 g h^{3} + 45 g h^{2} i + 87 g h^{2} + 20 g h i^{2} + 10 g h i + 2 g h + 20 g i^{3} + 66 g i^{2} + 4 h^{4} + 4 h^{3} i + 18 h^{3} + 9 h^{2} i + 18 h^{2} + 4 h i^{2} + 2 h i + 4 i^{3} + 14 i^{2}$" ], "text/plain": [ "" @@ -2462,7 +2735,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5b^4+4a^5b^3c+14a^5b^3+9a^5b^2c+15a^5b^2+4a^5bc^2+2a^5bc+6a^5b+4a^5c^3+10a^5c^2+8a^5c+10a^5+20a^4b^4+20a^4b^3c+74a^4b^3+45a^4b^2c+78a^4b^2+20a^4bc^2+10a^4bc+24a^4b+20a^4c^3+54a^4c^2+30a^4c+40a^4+40a^3b^4+40a^3b^3c+156a^3b^3+90a^3b^2c+162a^3b^2+40a^3bc^2+20a^3bc+36a^3b+40a^3c^3+116a^3c^2+40a^3c+60a^3+40a^2b^4+40a^2b^3c+164a^2b^3+90a^2b^2c+168a^2b^2+40a^2bc^2+20a^2bc+20a^2b+40a^2c^3+124a^2c^2+18a^2c+34a^2+20ab^4+20ab^3c+86ab^3+45ab^2c+87ab^2+20abc^2+10abc+2ab+20ac^3+66ac^2+4b^4+4b^3c+18b^3+9b^2c+18b^2+4bc^2+2bc+4c^3+14c^2 $$" + "$$ 0 \\le 4 g^{5} h^{4}+4 g^{5} h^{3} i+14 g^{5} h^{3}+9 g^{5} h^{2} i+15 g^{5} h^{2}+4 g^{5} h i^{2}+2 g^{5} h i+6 g^{5} h+4 g^{5} i^{3}+10 g^{5} i^{2}+8 g^{5} i+10 g^{5}+20 g^{4} h^{4}+20 g^{4} h^{3} i+74 g^{4} h^{3}+45 g^{4} h^{2} i+78 g^{4} h^{2}+20 g^{4} h i^{2}+10 g^{4} h i+24 g^{4} h+20 g^{4} i^{3}+54 g^{4} i^{2}+30 g^{4} i+40 g^{4}+40 g^{3} h^{4}+40 g^{3} h^{3} i+156 g^{3} h^{3}+90 g^{3} h^{2} i+162 g^{3} h^{2}+40 g^{3} h i^{2}+20 g^{3} h i+36 g^{3} h+40 g^{3} i^{3}+116 g^{3} i^{2}+40 g^{3} i+60 g^{3}+40 g^{2} h^{4}+40 g^{2} h^{3} i+164 g^{2} h^{3}+90 g^{2} h^{2} i+168 g^{2} h^{2}+40 g^{2} h i^{2}+20 g^{2} h i+20 g^{2} h+40 g^{2} i^{3}+124 g^{2} i^{2}+18 g^{2} i+34 g^{2}+20 g h^{4}+20 g h^{3} i+86 g h^{3}+45 g h^{2} i+87 g h^{2}+20 g h i^{2}+10 g h i+2 g h+20 g i^{3}+66 g i^{2}+4 h^{4}+4 h^{3} i+18 h^{3}+9 h^{2} i+18 h^{2}+4 h i^{2}+2 h i+4 i^{3}+14 i^{2} $$" ], "text/plain": [ "" @@ -2486,8 +2759,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2499,7 +2771,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1+a,b\\to 1/(1+b),c\\to 1+c$" + "Substitute $a\\to 1+j,b\\to 1/(1+k),c\\to 1+l$" ], "text/plain": [ "" @@ -2511,7 +2783,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5b^4+16a^5b^3+24a^5b^2+16a^5b+4a^5+4a^4b^4c+18a^4b^4+16a^4b^3c+76a^4b^3+24a^4b^2c+120a^4b^2+16a^4bc+84a^4b+4a^4c+22a^4+14a^3b^4c+30a^3b^4+56a^3b^3c+132a^3b^3+84a^3b^2c+216a^3b^2+56a^3bc+156a^3b+14a^3c+42a^3+18a^2b^4c+22a^2b^4+72a^2b^3c+100a^2b^3+108a^2b^2c+168a^2b^2+72a^2bc+124a^2b+18a^2c+34a^2+4ab^4c^2+ab^4+16ab^3c^2+8ab^3+24ab^2c^2+9ab^2+16abc^2+2ab+4ac^2+4b^4c^3+10b^4c^2+3b^4c+4b^4+16b^3c^3+44b^3c^2+8b^3c+18b^3+24b^2c^3+72b^2c^2+3b^2c+18b^2+16bc^3+52bc^2-2bc+4c^3+14c^2$" + "Numerator after substitutions: $4 j^{5} k^{4} + 16 j^{5} k^{3} + 24 j^{5} k^{2} + 16 j^{5} k + 4 j^{5} + 4 j^{4} k^{4} l + 18 j^{4} k^{4} + 16 j^{4} k^{3} l + 76 j^{4} k^{3} + 24 j^{4} k^{2} l + 120 j^{4} k^{2} + 16 j^{4} k l + 84 j^{4} k + 4 j^{4} l + 22 j^{4} + 14 j^{3} k^{4} l + 30 j^{3} k^{4} + 56 j^{3} k^{3} l + 132 j^{3} k^{3} + 84 j^{3} k^{2} l + 216 j^{3} k^{2} + 56 j^{3} k l + 156 j^{3} k + 14 j^{3} l + 42 j^{3} + 18 j^{2} k^{4} l + 22 j^{2} k^{4} + 72 j^{2} k^{3} l + 100 j^{2} k^{3} + 108 j^{2} k^{2} l + 168 j^{2} k^{2} + 72 j^{2} k l + 124 j^{2} k + 18 j^{2} l + 34 j^{2} + 4 j k^{4} l^{2} + j k^{4} + 16 j k^{3} l^{2} + 8 j k^{3} + 24 j k^{2} l^{2} + 9 j k^{2} + 16 j k l^{2} + 2 j k + 4 j l^{2} + 4 k^{4} l^{3} + 10 k^{4} l^{2} + 3 k^{4} l + 4 k^{4} + 16 k^{3} l^{3} + 44 k^{3} l^{2} + 8 k^{3} l + 18 k^{3} + 24 k^{2} l^{3} + 72 k^{2} l^{2} + 3 k^{2} l + 18 k^{2} + 16 k l^{3} + 52 k l^{2} - 2 k l + 4 l^{3} + 14 l^{2}$" ], "text/plain": [ "" @@ -2547,7 +2819,7 @@ { "data": { "text/latex": [ - "$$2bc \\le b^2+c^2$$" + "$$2 k l \\le k^{2}+l^{2}$$" ], "text/plain": [ "" @@ -2559,7 +2831,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5b^4+16a^5b^3+24a^5b^2+16a^5b+4a^5+4a^4b^4c+18a^4b^4+16a^4b^3c+76a^4b^3+24a^4b^2c+120a^4b^2+16a^4bc+84a^4b+4a^4c+22a^4+14a^3b^4c+30a^3b^4+56a^3b^3c+132a^3b^3+84a^3b^2c+216a^3b^2+56a^3bc+156a^3b+14a^3c+42a^3+18a^2b^4c+22a^2b^4+72a^2b^3c+100a^2b^3+108a^2b^2c+168a^2b^2+72a^2bc+124a^2b+18a^2c+34a^2+4ab^4c^2+ab^4+16ab^3c^2+8ab^3+24ab^2c^2+9ab^2+16abc^2+2ab+4ac^2+4b^4c^3+10b^4c^2+3b^4c+4b^4+16b^3c^3+44b^3c^2+8b^3c+18b^3+24b^2c^3+72b^2c^2+3b^2c+17b^2+16bc^3+52bc^2+4c^3+13c^2 $$" + "$$ 0 \\le 4 j^{5} k^{4}+16 j^{5} k^{3}+24 j^{5} k^{2}+16 j^{5} k+4 j^{5}+4 j^{4} k^{4} l+18 j^{4} k^{4}+16 j^{4} k^{3} l+76 j^{4} k^{3}+24 j^{4} k^{2} l+120 j^{4} k^{2}+16 j^{4} k l+84 j^{4} k+4 j^{4} l+22 j^{4}+14 j^{3} k^{4} l+30 j^{3} k^{4}+56 j^{3} k^{3} l+132 j^{3} k^{3}+84 j^{3} k^{2} l+216 j^{3} k^{2}+56 j^{3} k l+156 j^{3} k+14 j^{3} l+42 j^{3}+18 j^{2} k^{4} l+22 j^{2} k^{4}+72 j^{2} k^{3} l+100 j^{2} k^{3}+108 j^{2} k^{2} l+168 j^{2} k^{2}+72 j^{2} k l+124 j^{2} k+18 j^{2} l+34 j^{2}+4 j k^{4} l^{2}+j k^{4}+16 j k^{3} l^{2}+8 j k^{3}+24 j k^{2} l^{2}+9 j k^{2}+16 j k l^{2}+2 j k+4 j l^{2}+4 k^{4} l^{3}+10 k^{4} l^{2}+3 k^{4} l+4 k^{4}+16 k^{3} l^{3}+44 k^{3} l^{2}+8 k^{3} l+18 k^{3}+24 k^{2} l^{3}+72 k^{2} l^{2}+3 k^{2} l+17 k^{2}+16 k l^{3}+52 k l^{2}+4 l^{3}+13 l^{2} $$" ], "text/plain": [ "" @@ -2583,8 +2855,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2596,7 +2867,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1/(1+a),b\\to 1/(1+b),c\\to 1+c$" + "Substitute $a\\to 1/(1+m),b\\to 1/(1+n),c\\to 1+o$" ], "text/plain": [ "" @@ -2608,7 +2879,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5b^4c^3+6a^5b^4c^2+11a^5b^4c+9a^5b^4+16a^5b^3c^3+28a^5b^3c^2+40a^5b^3c+38a^5b^3+24a^5b^2c^3+48a^5b^2c^2+51a^5b^2c+57a^5b^2+16a^5bc^3+36a^5bc^2+30a^5bc+34a^5b+4a^5c^3+10a^5c^2+8a^5c+10a^5+20a^4b^4c^3+34a^4b^4c^2+45a^4b^4c+40a^4b^4+80a^4b^3c^3+156a^4b^3c^2+160a^4b^3c+170a^4b^3+120a^4b^2c^3+264a^4b^2c^2+195a^4b^2c+246a^4b^2+80a^4bc^3+196a^4bc^2+110a^4bc+136a^4b+20a^4c^3+54a^4c^2+30a^4c+40a^4+40a^3b^4c^3+76a^3b^4c^2+70a^3b^4c+70a^3b^4+160a^3b^3c^3+344a^3b^3c^2+240a^3b^3c+300a^3b^3+240a^3b^2c^3+576a^3b^2c^2+270a^3b^2c+414a^3b^2+160a^3bc^3+424a^3bc^2+140a^3bc+204a^3b+40a^3c^3+116a^3c^2+40a^3c+60a^3+40a^2b^4c^3+84a^2b^4c^2+48a^2b^4c+58a^2b^4+160a^2b^3c^3+376a^2b^3c^2+152a^2b^3c+248a^2b^3+240a^2b^2c^3+624a^2b^2c^2+138a^2b^2c+312a^2b^2+160a^2bc^3+456a^2bc^2+52a^2bc+116a^2b+40a^2c^3+124a^2c^2+18a^2c+34a^2+20ab^4c^3+46ab^4c^2+15ab^4c+19ab^4+80ab^3c^3+204ab^3c^2+40ab^3c+82ab^3+120ab^2c^3+336ab^2c^2+15ab^2c+81ab^2+80abc^3+244abc^2-10abc-2ab+20ac^3+66ac^2+4b^4c^3+10b^4c^2+3b^4c+4b^4+16b^3c^3+44b^3c^2+8b^3c+18b^3+24b^2c^3+72b^2c^2+3b^2c+18b^2+16bc^3+52bc^2-2bc+4c^3+14c^2$" + "Numerator after substitutions: $4 m^{5} n^{4} o^{3} + 6 m^{5} n^{4} o^{2} + 11 m^{5} n^{4} o + 9 m^{5} n^{4} + 16 m^{5} n^{3} o^{3} + 28 m^{5} n^{3} o^{2} + 40 m^{5} n^{3} o + 38 m^{5} n^{3} + 24 m^{5} n^{2} o^{3} + 48 m^{5} n^{2} o^{2} + 51 m^{5} n^{2} o + 57 m^{5} n^{2} + 16 m^{5} n o^{3} + 36 m^{5} n o^{2} + 30 m^{5} n o + 34 m^{5} n + 4 m^{5} o^{3} + 10 m^{5} o^{2} + 8 m^{5} o + 10 m^{5} + 20 m^{4} n^{4} o^{3} + 34 m^{4} n^{4} o^{2} + 45 m^{4} n^{4} o + 40 m^{4} n^{4} + 80 m^{4} n^{3} o^{3} + 156 m^{4} n^{3} o^{2} + 160 m^{4} n^{3} o + 170 m^{4} n^{3} + 120 m^{4} n^{2} o^{3} + 264 m^{4} n^{2} o^{2} + 195 m^{4} n^{2} o + 246 m^{4} n^{2} + 80 m^{4} n o^{3} + 196 m^{4} n o^{2} + 110 m^{4} n o + 136 m^{4} n + 20 m^{4} o^{3} + 54 m^{4} o^{2} + 30 m^{4} o + 40 m^{4} + 40 m^{3} n^{4} o^{3} + 76 m^{3} n^{4} o^{2} + 70 m^{3} n^{4} o + 70 m^{3} n^{4} + 160 m^{3} n^{3} o^{3} + 344 m^{3} n^{3} o^{2} + 240 m^{3} n^{3} o + 300 m^{3} n^{3} + 240 m^{3} n^{2} o^{3} + 576 m^{3} n^{2} o^{2} + 270 m^{3} n^{2} o + 414 m^{3} n^{2} + 160 m^{3} n o^{3} + 424 m^{3} n o^{2} + 140 m^{3} n o + 204 m^{3} n + 40 m^{3} o^{3} + 116 m^{3} o^{2} + 40 m^{3} o + 60 m^{3} + 40 m^{2} n^{4} o^{3} + 84 m^{2} n^{4} o^{2} + 48 m^{2} n^{4} o + 58 m^{2} n^{4} + 160 m^{2} n^{3} o^{3} + 376 m^{2} n^{3} o^{2} + 152 m^{2} n^{3} o + 248 m^{2} n^{3} + 240 m^{2} n^{2} o^{3} + 624 m^{2} n^{2} o^{2} + 138 m^{2} n^{2} o + 312 m^{2} n^{2} + 160 m^{2} n o^{3} + 456 m^{2} n o^{2} + 52 m^{2} n o + 116 m^{2} n + 40 m^{2} o^{3} + 124 m^{2} o^{2} + 18 m^{2} o + 34 m^{2} + 20 m n^{4} o^{3} + 46 m n^{4} o^{2} + 15 m n^{4} o + 19 m n^{4} + 80 m n^{3} o^{3} + 204 m n^{3} o^{2} + 40 m n^{3} o + 82 m n^{3} + 120 m n^{2} o^{3} + 336 m n^{2} o^{2} + 15 m n^{2} o + 81 m n^{2} + 80 m n o^{3} + 244 m n o^{2} - 10 m n o - 2 m n + 20 m o^{3} + 66 m o^{2} + 4 n^{4} o^{3} + 10 n^{4} o^{2} + 3 n^{4} o + 4 n^{4} + 16 n^{3} o^{3} + 44 n^{3} o^{2} + 8 n^{3} o + 18 n^{3} + 24 n^{2} o^{3} + 72 n^{2} o^{2} + 3 n^{2} o + 18 n^{2} + 16 n o^{3} + 52 n o^{2} - 2 n o + 4 o^{3} + 14 o^{2}$" ], "text/plain": [ "" @@ -2644,7 +2915,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 m n \\le m^{2}+n^{2}$$" ], "text/plain": [ "" @@ -2656,7 +2927,7 @@ { "data": { "text/latex": [ - "$$2bc \\le b^2+c^2$$" + "$$2 n o \\le n^{2}+o^{2}$$" ], "text/plain": [ "" @@ -2668,7 +2939,7 @@ { "data": { "text/latex": [ - "$$10abc \\le 2a^2+2ab^2c+4ac^2+2b^3$$" + "$$10 m n o \\le 2 m^{2}+2 m n^{2} o+4 m o^{2}+2 n^{3}$$" ], "text/plain": [ "" @@ -2680,7 +2951,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5b^4c^3+6a^5b^4c^2+11a^5b^4c+9a^5b^4+16a^5b^3c^3+28a^5b^3c^2+40a^5b^3c+38a^5b^3+24a^5b^2c^3+48a^5b^2c^2+51a^5b^2c+57a^5b^2+16a^5bc^3+36a^5bc^2+30a^5bc+34a^5b+4a^5c^3+10a^5c^2+8a^5c+10a^5+20a^4b^4c^3+34a^4b^4c^2+45a^4b^4c+40a^4b^4+80a^4b^3c^3+156a^4b^3c^2+160a^4b^3c+170a^4b^3+120a^4b^2c^3+264a^4b^2c^2+195a^4b^2c+246a^4b^2+80a^4bc^3+196a^4bc^2+110a^4bc+136a^4b+20a^4c^3+54a^4c^2+30a^4c+40a^4+40a^3b^4c^3+76a^3b^4c^2+70a^3b^4c+70a^3b^4+160a^3b^3c^3+344a^3b^3c^2+240a^3b^3c+300a^3b^3+240a^3b^2c^3+576a^3b^2c^2+270a^3b^2c+414a^3b^2+160a^3bc^3+424a^3bc^2+140a^3bc+204a^3b+40a^3c^3+116a^3c^2+40a^3c+60a^3+40a^2b^4c^3+84a^2b^4c^2+48a^2b^4c+58a^2b^4+160a^2b^3c^3+376a^2b^3c^2+152a^2b^3c+248a^2b^3+240a^2b^2c^3+624a^2b^2c^2+138a^2b^2c+312a^2b^2+160a^2bc^3+456a^2bc^2+52a^2bc+116a^2b+40a^2c^3+124a^2c^2+18a^2c+31a^2+20ab^4c^3+46ab^4c^2+15ab^4c+19ab^4+80ab^3c^3+204ab^3c^2+40ab^3c+82ab^3+120ab^2c^3+336ab^2c^2+13ab^2c+81ab^2+80abc^3+244abc^2+20ac^3+62ac^2+4b^4c^3+10b^4c^2+3b^4c+4b^4+16b^3c^3+44b^3c^2+8b^3c+16b^3+24b^2c^3+72b^2c^2+3b^2c+16b^2+16bc^3+52bc^2+4c^3+13c^2 $$" + "$$ 0 \\le 4 m^{5} n^{4} o^{3}+6 m^{5} n^{4} o^{2}+11 m^{5} n^{4} o+9 m^{5} n^{4}+16 m^{5} n^{3} o^{3}+28 m^{5} n^{3} o^{2}+40 m^{5} n^{3} o+38 m^{5} n^{3}+24 m^{5} n^{2} o^{3}+48 m^{5} n^{2} o^{2}+51 m^{5} n^{2} o+57 m^{5} n^{2}+16 m^{5} n o^{3}+36 m^{5} n o^{2}+30 m^{5} n o+34 m^{5} n+4 m^{5} o^{3}+10 m^{5} o^{2}+8 m^{5} o+10 m^{5}+20 m^{4} n^{4} o^{3}+34 m^{4} n^{4} o^{2}+45 m^{4} n^{4} o+40 m^{4} n^{4}+80 m^{4} n^{3} o^{3}+156 m^{4} n^{3} o^{2}+160 m^{4} n^{3} o+170 m^{4} n^{3}+120 m^{4} n^{2} o^{3}+264 m^{4} n^{2} o^{2}+195 m^{4} n^{2} o+246 m^{4} n^{2}+80 m^{4} n o^{3}+196 m^{4} n o^{2}+110 m^{4} n o+136 m^{4} n+20 m^{4} o^{3}+54 m^{4} o^{2}+30 m^{4} o+40 m^{4}+40 m^{3} n^{4} o^{3}+76 m^{3} n^{4} o^{2}+70 m^{3} n^{4} o+70 m^{3} n^{4}+160 m^{3} n^{3} o^{3}+344 m^{3} n^{3} o^{2}+240 m^{3} n^{3} o+300 m^{3} n^{3}+240 m^{3} n^{2} o^{3}+576 m^{3} n^{2} o^{2}+270 m^{3} n^{2} o+414 m^{3} n^{2}+160 m^{3} n o^{3}+424 m^{3} n o^{2}+140 m^{3} n o+204 m^{3} n+40 m^{3} o^{3}+116 m^{3} o^{2}+40 m^{3} o+60 m^{3}+40 m^{2} n^{4} o^{3}+84 m^{2} n^{4} o^{2}+48 m^{2} n^{4} o+58 m^{2} n^{4}+160 m^{2} n^{3} o^{3}+376 m^{2} n^{3} o^{2}+152 m^{2} n^{3} o+248 m^{2} n^{3}+240 m^{2} n^{2} o^{3}+624 m^{2} n^{2} o^{2}+138 m^{2} n^{2} o+312 m^{2} n^{2}+160 m^{2} n o^{3}+456 m^{2} n o^{2}+52 m^{2} n o+116 m^{2} n+40 m^{2} o^{3}+124 m^{2} o^{2}+18 m^{2} o+31 m^{2}+20 m n^{4} o^{3}+46 m n^{4} o^{2}+15 m n^{4} o+19 m n^{4}+80 m n^{3} o^{3}+204 m n^{3} o^{2}+40 m n^{3} o+82 m n^{3}+120 m n^{2} o^{3}+336 m n^{2} o^{2}+13 m n^{2} o+81 m n^{2}+80 m n o^{3}+244 m n o^{2}+20 m o^{3}+62 m o^{2}+4 n^{4} o^{3}+10 n^{4} o^{2}+3 n^{4} o+4 n^{4}+16 n^{3} o^{3}+44 n^{3} o^{2}+8 n^{3} o+16 n^{3}+24 n^{2} o^{3}+72 n^{2} o^{2}+3 n^{2} o+16 n^{2}+16 n o^{3}+52 n o^{2}+4 o^{3}+13 o^{2} $$" ], "text/plain": [ "" @@ -2704,8 +2975,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2717,7 +2987,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1+a,b\\to 1+b,c\\to 1/(1+c)$" + "Substitute $a\\to 1+p,b\\to 1+q,c\\to 1/(1+r)$" ], "text/plain": [ "" @@ -2729,7 +2999,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5c^3+12a^5c^2+12a^5c+4a^5+4a^4bc^3+12a^4bc^2+12a^4bc+4a^4b+18a^4c^3+58a^4c^2+62a^4c+22a^4+12a^3bc^3+36a^3bc^2+36a^3bc+12a^3b+28a^3c^3+98a^3c^2+112a^3c+42a^3+12a^2bc^3+36a^2bc^2+36a^2bc+12a^2b+16a^2c^3+66a^2c^2+84a^2c+34a^2+4ab^3c^3+12ab^3c^2+12ab^3c+4ab^3+3ab^2c^3+9ab^2c^2+9ab^2c+3ab^2-2abc^3-6abc^2-6abc-2ab+4ac^3+4ac^2+4b^4c^3+12b^4c^2+12b^4c+4b^4+14b^3c^3+46b^3c^2+50b^3c+18b^3+9b^2c^3+36b^2c^2+45b^2c+18b^2+2bc^3-2bc+10c^3+14c^2$" + "Numerator after substitutions: $4 p^{5} r^{3} + 12 p^{5} r^{2} + 12 p^{5} r + 4 p^{5} + 4 p^{4} q r^{3} + 12 p^{4} q r^{2} + 12 p^{4} q r + 4 p^{4} q + 18 p^{4} r^{3} + 58 p^{4} r^{2} + 62 p^{4} r + 22 p^{4} + 12 p^{3} q r^{3} + 36 p^{3} q r^{2} + 36 p^{3} q r + 12 p^{3} q + 28 p^{3} r^{3} + 98 p^{3} r^{2} + 112 p^{3} r + 42 p^{3} + 12 p^{2} q r^{3} + 36 p^{2} q r^{2} + 36 p^{2} q r + 12 p^{2} q + 16 p^{2} r^{3} + 66 p^{2} r^{2} + 84 p^{2} r + 34 p^{2} + 4 p q^{3} r^{3} + 12 p q^{3} r^{2} + 12 p q^{3} r + 4 p q^{3} + 3 p q^{2} r^{3} + 9 p q^{2} r^{2} + 9 p q^{2} r + 3 p q^{2} - 2 p q r^{3} - 6 p q r^{2} - 6 p q r - 2 p q + 4 p r^{3} + 4 p r^{2} + 4 q^{4} r^{3} + 12 q^{4} r^{2} + 12 q^{4} r + 4 q^{4} + 14 q^{3} r^{3} + 46 q^{3} r^{2} + 50 q^{3} r + 18 q^{3} + 9 q^{2} r^{3} + 36 q^{2} r^{2} + 45 q^{2} r + 18 q^{2} + 2 q r^{3} - 2 q r + 10 r^{3} + 14 r^{2}$" ], "text/plain": [ "" @@ -2765,7 +3035,7 @@ { "data": { "text/latex": [ - "$$2abc^3 \\le a^2bc^3+bc^3$$" + "$$2 p q r^{3} \\le p^{2} q r^{3}+q r^{3}$$" ], "text/plain": [ "" @@ -2777,7 +3047,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 p q \\le p^{2}+q^{2}$$" ], "text/plain": [ "" @@ -2789,7 +3059,7 @@ { "data": { "text/latex": [ - "$$2bc \\le b^2+c^2$$" + "$$2 q r \\le q^{2}+r^{2}$$" ], "text/plain": [ "" @@ -2801,7 +3071,7 @@ { "data": { "text/latex": [ - "$$6abc \\le 2a^3b+2b^2c+2c^2$$" + "$$6 p q r \\le 2 p^{3} q+2 q^{2} r+2 r^{2}$$" ], "text/plain": [ "" @@ -2813,7 +3083,7 @@ { "data": { "text/latex": [ - "$$6abc^2 \\le 2ab^2c^3+ab^2+3ac^2$$" + "$$6 p q r^{2} \\le 2 p q^{2} r^{3}+p q^{2}+3 p r^{2}$$" ], "text/plain": [ "" @@ -2825,7 +3095,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5c^3+12a^5c^2+12a^5c+4a^5+4a^4bc^3+12a^4bc^2+12a^4bc+4a^4b+18a^4c^3+58a^4c^2+62a^4c+22a^4+12a^3bc^3+36a^3bc^2+36a^3bc+10a^3b+28a^3c^3+98a^3c^2+112a^3c+42a^3+11a^2bc^3+36a^2bc^2+36a^2bc+12a^2b+16a^2c^3+66a^2c^2+84a^2c+33a^2+4ab^3c^3+12ab^3c^2+12ab^3c+4ab^3+ab^2c^3+9ab^2c^2+9ab^2c+2ab^2+4ac^3+ac^2+4b^4c^3+12b^4c^2+12b^4c+4b^4+14b^3c^3+46b^3c^2+50b^3c+18b^3+9b^2c^3+36b^2c^2+43b^2c+16b^2+bc^3+10c^3+11c^2 $$" + "$$ 0 \\le 4 p^{5} r^{3}+12 p^{5} r^{2}+12 p^{5} r+4 p^{5}+4 p^{4} q r^{3}+12 p^{4} q r^{2}+12 p^{4} q r+4 p^{4} q+18 p^{4} r^{3}+58 p^{4} r^{2}+62 p^{4} r+22 p^{4}+12 p^{3} q r^{3}+36 p^{3} q r^{2}+36 p^{3} q r+10 p^{3} q+28 p^{3} r^{3}+98 p^{3} r^{2}+112 p^{3} r+42 p^{3}+11 p^{2} q r^{3}+36 p^{2} q r^{2}+36 p^{2} q r+12 p^{2} q+16 p^{2} r^{3}+66 p^{2} r^{2}+84 p^{2} r+33 p^{2}+4 p q^{3} r^{3}+12 p q^{3} r^{2}+12 p q^{3} r+4 p q^{3}+p q^{2} r^{3}+9 p q^{2} r^{2}+9 p q^{2} r+2 p q^{2}+4 p r^{3}+p r^{2}+4 q^{4} r^{3}+12 q^{4} r^{2}+12 q^{4} r+4 q^{4}+14 q^{3} r^{3}+46 q^{3} r^{2}+50 q^{3} r+18 q^{3}+9 q^{2} r^{3}+36 q^{2} r^{2}+43 q^{2} r+16 q^{2}+q r^{3}+10 r^{3}+11 r^{2} $$" ], "text/plain": [ "" @@ -2849,8 +3119,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2862,7 +3131,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1/(1+a),b\\to 1+b,c\\to 1/(1+c)$" + "Substitute $a\\to 1/(1+s),b\\to 1+t,c\\to 1/(1+u)$" ], "text/plain": [ "" @@ -2874,7 +3143,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5b^4c^3+12a^5b^4c^2+12a^5b^4c+4a^5b^4+10a^5b^3c^3+34a^5b^3c^2+38a^5b^3c+14a^5b^3+6a^5b^2c^3+27a^5b^2c^2+36a^5b^2c+15a^5b^2+8a^5bc^3+18a^5bc^2+16a^5bc+6a^5b+8a^5c^3+24a^5c^2+22a^5c+10a^5+20a^4b^4c^3+60a^4b^4c^2+60a^4b^4c+20a^4b^4+54a^4b^3c^3+182a^4b^3c^2+202a^4b^3c+74a^4b^3+33a^4b^2c^3+144a^4b^2c^2+189a^4b^2c+78a^4b^2+34a^4bc^3+72a^4bc^2+62a^4bc+24a^4b+44a^4c^3+114a^4c^2+90a^4c+40a^4+40a^3b^4c^3+120a^3b^4c^2+120a^3b^4c+40a^3b^4+116a^3b^3c^3+388a^3b^3c^2+428a^3b^3c+156a^3b^3+72a^3b^2c^3+306a^3b^2c^2+396a^3b^2c+162a^3b^2+56a^3bc^3+108a^3bc^2+88a^3bc+36a^3b+96a^3c^3+216a^3c^2+140a^3c+60a^3+40a^2b^4c^3+120a^2b^4c^2+120a^2b^4c+40a^2b^4+124a^2b^3c^3+412a^2b^3c^2+452a^2b^3c+164a^2b^3+78a^2b^2c^3+324a^2b^2c^2+414a^2b^2c+168a^2b^2+40a^2bc^3+60a^2bc^2+40a^2bc+20a^2b+100a^2c^3+190a^2c^2+84a^2c+34a^2+20ab^4c^3+60ab^4c^2+60ab^4c+20ab^4+66ab^3c^3+218ab^3c^2+238ab^3c+86ab^3+42ab^2c^3+171ab^2c^2+216ab^2c+87ab^2+12abc^3+6abc^2-4abc+2ab+46ac^3+66ac^2+4b^4c^3+12b^4c^2+12b^4c+4b^4+14b^3c^3+46b^3c^2+50b^3c+18b^3+9b^2c^3+36b^2c^2+45b^2c+18b^2+2bc^3-2bc+10c^3+14c^2$" + "Numerator after substitutions: $4 s^{5} t^{4} u^{3} + 12 s^{5} t^{4} u^{2} + 12 s^{5} t^{4} u + 4 s^{5} t^{4} + 10 s^{5} t^{3} u^{3} + 34 s^{5} t^{3} u^{2} + 38 s^{5} t^{3} u + 14 s^{5} t^{3} + 6 s^{5} t^{2} u^{3} + 27 s^{5} t^{2} u^{2} + 36 s^{5} t^{2} u + 15 s^{5} t^{2} + 8 s^{5} t u^{3} + 18 s^{5} t u^{2} + 16 s^{5} t u + 6 s^{5} t + 8 s^{5} u^{3} + 24 s^{5} u^{2} + 22 s^{5} u + 10 s^{5} + 20 s^{4} t^{4} u^{3} + 60 s^{4} t^{4} u^{2} + 60 s^{4} t^{4} u + 20 s^{4} t^{4} + 54 s^{4} t^{3} u^{3} + 182 s^{4} t^{3} u^{2} + 202 s^{4} t^{3} u + 74 s^{4} t^{3} + 33 s^{4} t^{2} u^{3} + 144 s^{4} t^{2} u^{2} + 189 s^{4} t^{2} u + 78 s^{4} t^{2} + 34 s^{4} t u^{3} + 72 s^{4} t u^{2} + 62 s^{4} t u + 24 s^{4} t + 44 s^{4} u^{3} + 114 s^{4} u^{2} + 90 s^{4} u + 40 s^{4} + 40 s^{3} t^{4} u^{3} + 120 s^{3} t^{4} u^{2} + 120 s^{3} t^{4} u + 40 s^{3} t^{4} + 116 s^{3} t^{3} u^{3} + 388 s^{3} t^{3} u^{2} + 428 s^{3} t^{3} u + 156 s^{3} t^{3} + 72 s^{3} t^{2} u^{3} + 306 s^{3} t^{2} u^{2} + 396 s^{3} t^{2} u + 162 s^{3} t^{2} + 56 s^{3} t u^{3} + 108 s^{3} t u^{2} + 88 s^{3} t u + 36 s^{3} t + 96 s^{3} u^{3} + 216 s^{3} u^{2} + 140 s^{3} u + 60 s^{3} + 40 s^{2} t^{4} u^{3} + 120 s^{2} t^{4} u^{2} + 120 s^{2} t^{4} u + 40 s^{2} t^{4} + 124 s^{2} t^{3} u^{3} + 412 s^{2} t^{3} u^{2} + 452 s^{2} t^{3} u + 164 s^{2} t^{3} + 78 s^{2} t^{2} u^{3} + 324 s^{2} t^{2} u^{2} + 414 s^{2} t^{2} u + 168 s^{2} t^{2} + 40 s^{2} t u^{3} + 60 s^{2} t u^{2} + 40 s^{2} t u + 20 s^{2} t + 100 s^{2} u^{3} + 190 s^{2} u^{2} + 84 s^{2} u + 34 s^{2} + 20 s t^{4} u^{3} + 60 s t^{4} u^{2} + 60 s t^{4} u + 20 s t^{4} + 66 s t^{3} u^{3} + 218 s t^{3} u^{2} + 238 s t^{3} u + 86 s t^{3} + 42 s t^{2} u^{3} + 171 s t^{2} u^{2} + 216 s t^{2} u + 87 s t^{2} + 12 s t u^{3} + 6 s t u^{2} - 4 s t u + 2 s t + 46 s u^{3} + 66 s u^{2} + 4 t^{4} u^{3} + 12 t^{4} u^{2} + 12 t^{4} u + 4 t^{4} + 14 t^{3} u^{3} + 46 t^{3} u^{2} + 50 t^{3} u + 18 t^{3} + 9 t^{2} u^{3} + 36 t^{2} u^{2} + 45 t^{2} u + 18 t^{2} + 2 t u^{3} - 2 t u + 10 u^{3} + 14 u^{2}$" ], "text/plain": [ "" @@ -2910,7 +3179,7 @@ { "data": { "text/latex": [ - "$$4abc \\le a^2c^2+2ab^2+c^2$$" + "$$4 s t u \\le s^{2} u^{2}+2 s t^{2}+u^{2}$$" ], "text/plain": [ "" @@ -2922,7 +3191,7 @@ { "data": { "text/latex": [ - "$$2bc \\le b^2+c^2$$" + "$$2 t u \\le t^{2}+u^{2}$$" ], "text/plain": [ "" @@ -2934,7 +3203,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5b^4c^3+12a^5b^4c^2+12a^5b^4c+4a^5b^4+10a^5b^3c^3+34a^5b^3c^2+38a^5b^3c+14a^5b^3+6a^5b^2c^3+27a^5b^2c^2+36a^5b^2c+15a^5b^2+8a^5bc^3+18a^5bc^2+16a^5bc+6a^5b+8a^5c^3+24a^5c^2+22a^5c+10a^5+20a^4b^4c^3+60a^4b^4c^2+60a^4b^4c+20a^4b^4+54a^4b^3c^3+182a^4b^3c^2+202a^4b^3c+74a^4b^3+33a^4b^2c^3+144a^4b^2c^2+189a^4b^2c+78a^4b^2+34a^4bc^3+72a^4bc^2+62a^4bc+24a^4b+44a^4c^3+114a^4c^2+90a^4c+40a^4+40a^3b^4c^3+120a^3b^4c^2+120a^3b^4c+40a^3b^4+116a^3b^3c^3+388a^3b^3c^2+428a^3b^3c+156a^3b^3+72a^3b^2c^3+306a^3b^2c^2+396a^3b^2c+162a^3b^2+56a^3bc^3+108a^3bc^2+88a^3bc+36a^3b+96a^3c^3+216a^3c^2+140a^3c+60a^3+40a^2b^4c^3+120a^2b^4c^2+120a^2b^4c+40a^2b^4+124a^2b^3c^3+412a^2b^3c^2+452a^2b^3c+164a^2b^3+78a^2b^2c^3+324a^2b^2c^2+414a^2b^2c+168a^2b^2+40a^2bc^3+60a^2bc^2+40a^2bc+20a^2b+100a^2c^3+189a^2c^2+84a^2c+34a^2+20ab^4c^3+60ab^4c^2+60ab^4c+20ab^4+66ab^3c^3+218ab^3c^2+238ab^3c+86ab^3+42ab^2c^3+171ab^2c^2+216ab^2c+85ab^2+12abc^3+6abc^2+2ab+46ac^3+66ac^2+4b^4c^3+12b^4c^2+12b^4c+4b^4+14b^3c^3+46b^3c^2+50b^3c+18b^3+9b^2c^3+36b^2c^2+45b^2c+17b^2+2bc^3+10c^3+12c^2 $$" + "$$ 0 \\le 4 s^{5} t^{4} u^{3}+12 s^{5} t^{4} u^{2}+12 s^{5} t^{4} u+4 s^{5} t^{4}+10 s^{5} t^{3} u^{3}+34 s^{5} t^{3} u^{2}+38 s^{5} t^{3} u+14 s^{5} t^{3}+6 s^{5} t^{2} u^{3}+27 s^{5} t^{2} u^{2}+36 s^{5} t^{2} u+15 s^{5} t^{2}+8 s^{5} t u^{3}+18 s^{5} t u^{2}+16 s^{5} t u+6 s^{5} t+8 s^{5} u^{3}+24 s^{5} u^{2}+22 s^{5} u+10 s^{5}+20 s^{4} t^{4} u^{3}+60 s^{4} t^{4} u^{2}+60 s^{4} t^{4} u+20 s^{4} t^{4}+54 s^{4} t^{3} u^{3}+182 s^{4} t^{3} u^{2}+202 s^{4} t^{3} u+74 s^{4} t^{3}+33 s^{4} t^{2} u^{3}+144 s^{4} t^{2} u^{2}+189 s^{4} t^{2} u+78 s^{4} t^{2}+34 s^{4} t u^{3}+72 s^{4} t u^{2}+62 s^{4} t u+24 s^{4} t+44 s^{4} u^{3}+114 s^{4} u^{2}+90 s^{4} u+40 s^{4}+40 s^{3} t^{4} u^{3}+120 s^{3} t^{4} u^{2}+120 s^{3} t^{4} u+40 s^{3} t^{4}+116 s^{3} t^{3} u^{3}+388 s^{3} t^{3} u^{2}+428 s^{3} t^{3} u+156 s^{3} t^{3}+72 s^{3} t^{2} u^{3}+306 s^{3} t^{2} u^{2}+396 s^{3} t^{2} u+162 s^{3} t^{2}+56 s^{3} t u^{3}+108 s^{3} t u^{2}+88 s^{3} t u+36 s^{3} t+96 s^{3} u^{3}+216 s^{3} u^{2}+140 s^{3} u+60 s^{3}+40 s^{2} t^{4} u^{3}+120 s^{2} t^{4} u^{2}+120 s^{2} t^{4} u+40 s^{2} t^{4}+124 s^{2} t^{3} u^{3}+412 s^{2} t^{3} u^{2}+452 s^{2} t^{3} u+164 s^{2} t^{3}+78 s^{2} t^{2} u^{3}+324 s^{2} t^{2} u^{2}+414 s^{2} t^{2} u+168 s^{2} t^{2}+40 s^{2} t u^{3}+60 s^{2} t u^{2}+40 s^{2} t u+20 s^{2} t+100 s^{2} u^{3}+189 s^{2} u^{2}+84 s^{2} u+34 s^{2}+20 s t^{4} u^{3}+60 s t^{4} u^{2}+60 s t^{4} u+20 s t^{4}+66 s t^{3} u^{3}+218 s t^{3} u^{2}+238 s t^{3} u+86 s t^{3}+42 s t^{2} u^{3}+171 s t^{2} u^{2}+216 s t^{2} u+85 s t^{2}+12 s t u^{3}+6 s t u^{2}+2 s t+46 s u^{3}+66 s u^{2}+4 t^{4} u^{3}+12 t^{4} u^{2}+12 t^{4} u+4 t^{4}+14 t^{3} u^{3}+46 t^{3} u^{2}+50 t^{3} u+18 t^{3}+9 t^{2} u^{3}+36 t^{2} u^{2}+45 t^{2} u+17 t^{2}+2 t u^{3}+10 u^{3}+12 u^{2} $$" ], "text/plain": [ "" @@ -2958,8 +3227,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2971,7 +3239,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1+a,b\\to 1/(1+b),c\\to 1/(1+c)$" + "Substitute $a\\to 1+v,b\\to 1/(1+w),c\\to 1/(1+x)$" ], "text/plain": [ "" @@ -2983,7 +3251,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5b^4c^3+12a^5b^4c^2+12a^5b^4c+4a^5b^4+16a^5b^3c^3+48a^5b^3c^2+48a^5b^3c+16a^5b^3+24a^5b^2c^3+72a^5b^2c^2+72a^5b^2c+24a^5b^2+16a^5bc^3+48a^5bc^2+48a^5bc+16a^5b+4a^5c^3+12a^5c^2+12a^5c+4a^5+14a^4b^4c^3+46a^4b^4c^2+50a^4b^4c+18a^4b^4+60a^4b^3c^3+196a^4b^3c^2+212a^4b^3c+76a^4b^3+96a^4b^2c^3+312a^4b^2c^2+336a^4b^2c+120a^4b^2+68a^4bc^3+220a^4bc^2+236a^4bc+84a^4b+18a^4c^3+58a^4c^2+62a^4c+22a^4+16a^3b^4c^3+62a^3b^4c^2+76a^3b^4c+30a^3b^4+76a^3b^3c^3+284a^3b^3c^2+340a^3b^3c+132a^3b^3+132a^3b^2c^3+480a^3b^2c^2+564a^3b^2c+216a^3b^2+100a^3bc^3+356a^3bc^2+412a^3bc+156a^3b+28a^3c^3+98a^3c^2+112a^3c+42a^3+4a^2b^4c^3+30a^2b^4c^2+48a^2b^4c+22a^2b^4+28a^2b^3c^3+156a^2b^3c^2+228a^2b^3c+100a^2b^3+60a^2b^2c^3+288a^2b^2c^2+396a^2b^2c+168a^2b^2+52a^2bc^3+228a^2bc^2+300a^2bc+124a^2b+16a^2c^3+66a^2c^2+84a^2c+34a^2+5ab^4c^3+7ab^4c^2+3ab^4c+ab^4+24ab^3c^3+40ab^3c^2+24ab^3c+8ab^3+33ab^2c^3+51ab^2c^2+27ab^2c+9ab^2+18abc^3+22abc^2+6abc+2ab+4ac^3+4ac^2+7b^4c^3+16b^4c^2+9b^4c+4b^4+38b^3c^3+82b^3c^2+46b^3c+18b^3+63b^2c^3+120b^2c^2+51b^2c+18b^2+38bc^3+56bc^2+2bc+10c^3+14c^2$" + "Numerator after substitutions: $4 v^{5} w^{4} x^{3} + 12 v^{5} w^{4} x^{2} + 12 v^{5} w^{4} x + 4 v^{5} w^{4} + 16 v^{5} w^{3} x^{3} + 48 v^{5} w^{3} x^{2} + 48 v^{5} w^{3} x + 16 v^{5} w^{3} + 24 v^{5} w^{2} x^{3} + 72 v^{5} w^{2} x^{2} + 72 v^{5} w^{2} x + 24 v^{5} w^{2} + 16 v^{5} w x^{3} + 48 v^{5} w x^{2} + 48 v^{5} w x + 16 v^{5} w + 4 v^{5} x^{3} + 12 v^{5} x^{2} + 12 v^{5} x + 4 v^{5} + 14 v^{4} w^{4} x^{3} + 46 v^{4} w^{4} x^{2} + 50 v^{4} w^{4} x + 18 v^{4} w^{4} + 60 v^{4} w^{3} x^{3} + 196 v^{4} w^{3} x^{2} + 212 v^{4} w^{3} x + 76 v^{4} w^{3} + 96 v^{4} w^{2} x^{3} + 312 v^{4} w^{2} x^{2} + 336 v^{4} w^{2} x + 120 v^{4} w^{2} + 68 v^{4} w x^{3} + 220 v^{4} w x^{2} + 236 v^{4} w x + 84 v^{4} w + 18 v^{4} x^{3} + 58 v^{4} x^{2} + 62 v^{4} x + 22 v^{4} + 16 v^{3} w^{4} x^{3} + 62 v^{3} w^{4} x^{2} + 76 v^{3} w^{4} x + 30 v^{3} w^{4} + 76 v^{3} w^{3} x^{3} + 284 v^{3} w^{3} x^{2} + 340 v^{3} w^{3} x + 132 v^{3} w^{3} + 132 v^{3} w^{2} x^{3} + 480 v^{3} w^{2} x^{2} + 564 v^{3} w^{2} x + 216 v^{3} w^{2} + 100 v^{3} w x^{3} + 356 v^{3} w x^{2} + 412 v^{3} w x + 156 v^{3} w + 28 v^{3} x^{3} + 98 v^{3} x^{2} + 112 v^{3} x + 42 v^{3} + 4 v^{2} w^{4} x^{3} + 30 v^{2} w^{4} x^{2} + 48 v^{2} w^{4} x + 22 v^{2} w^{4} + 28 v^{2} w^{3} x^{3} + 156 v^{2} w^{3} x^{2} + 228 v^{2} w^{3} x + 100 v^{2} w^{3} + 60 v^{2} w^{2} x^{3} + 288 v^{2} w^{2} x^{2} + 396 v^{2} w^{2} x + 168 v^{2} w^{2} + 52 v^{2} w x^{3} + 228 v^{2} w x^{2} + 300 v^{2} w x + 124 v^{2} w + 16 v^{2} x^{3} + 66 v^{2} x^{2} + 84 v^{2} x + 34 v^{2} + 5 v w^{4} x^{3} + 7 v w^{4} x^{2} + 3 v w^{4} x + v w^{4} + 24 v w^{3} x^{3} + 40 v w^{3} x^{2} + 24 v w^{3} x + 8 v w^{3} + 33 v w^{2} x^{3} + 51 v w^{2} x^{2} + 27 v w^{2} x + 9 v w^{2} + 18 v w x^{3} + 22 v w x^{2} + 6 v w x + 2 v w + 4 v x^{3} + 4 v x^{2} + 7 w^{4} x^{3} + 16 w^{4} x^{2} + 9 w^{4} x + 4 w^{4} + 38 w^{3} x^{3} + 82 w^{3} x^{2} + 46 w^{3} x + 18 w^{3} + 63 w^{2} x^{3} + 120 w^{2} x^{2} + 51 w^{2} x + 18 w^{2} + 38 w x^{3} + 56 w x^{2} + 2 w x + 10 x^{3} + 14 x^{2}$" ], "text/plain": [ "" @@ -3007,7 +3275,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5b^4c^3+12a^5b^4c^2+12a^5b^4c+4a^5b^4+16a^5b^3c^3+48a^5b^3c^2+48a^5b^3c+16a^5b^3+24a^5b^2c^3+72a^5b^2c^2+72a^5b^2c+24a^5b^2+16a^5bc^3+48a^5bc^2+48a^5bc+16a^5b+4a^5c^3+12a^5c^2+12a^5c+4a^5+14a^4b^4c^3+46a^4b^4c^2+50a^4b^4c+18a^4b^4+60a^4b^3c^3+196a^4b^3c^2+212a^4b^3c+76a^4b^3+96a^4b^2c^3+312a^4b^2c^2+336a^4b^2c+120a^4b^2+68a^4bc^3+220a^4bc^2+236a^4bc+84a^4b+18a^4c^3+58a^4c^2+62a^4c+22a^4+16a^3b^4c^3+62a^3b^4c^2+76a^3b^4c+30a^3b^4+76a^3b^3c^3+284a^3b^3c^2+340a^3b^3c+132a^3b^3+132a^3b^2c^3+480a^3b^2c^2+564a^3b^2c+216a^3b^2+100a^3bc^3+356a^3bc^2+412a^3bc+156a^3b+28a^3c^3+98a^3c^2+112a^3c+42a^3+4a^2b^4c^3+30a^2b^4c^2+48a^2b^4c+22a^2b^4+28a^2b^3c^3+156a^2b^3c^2+228a^2b^3c+100a^2b^3+60a^2b^2c^3+288a^2b^2c^2+396a^2b^2c+168a^2b^2+52a^2bc^3+228a^2bc^2+300a^2bc+124a^2b+16a^2c^3+66a^2c^2+84a^2c+34a^2+5ab^4c^3+7ab^4c^2+3ab^4c+ab^4+24ab^3c^3+40ab^3c^2+24ab^3c+8ab^3+33ab^2c^3+51ab^2c^2+27ab^2c+9ab^2+18abc^3+22abc^2+6abc+2ab+4ac^3+4ac^2+7b^4c^3+16b^4c^2+9b^4c+4b^4+38b^3c^3+82b^3c^2+46b^3c+18b^3+63b^2c^3+120b^2c^2+51b^2c+18b^2+38bc^3+56bc^2+2bc+10c^3+14c^2 $$" + "$$ 0 \\le 4 v^{5} w^{4} x^{3}+16 v^{5} w^{3} x^{3}+24 v^{5} w^{2} x^{3}+16 v^{5} w x^{3}+4 v^{5} x^{3}+14 v^{4} w^{4} x^{3}+60 v^{4} w^{3} x^{3}+96 v^{4} w^{2} x^{3}+68 v^{4} w x^{3}+18 v^{4} x^{3}+16 v^{3} w^{4} x^{3}+76 v^{3} w^{3} x^{3}+132 v^{3} w^{2} x^{3}+100 v^{3} w x^{3}+28 v^{3} x^{3}+4 v^{2} w^{4} x^{3}+28 v^{2} w^{3} x^{3}+60 v^{2} w^{2} x^{3}+52 v^{2} w x^{3}+16 v^{2} x^{3}+5 v w^{4} x^{3}+24 v w^{3} x^{3}+33 v w^{2} x^{3}+18 v w x^{3}+4 v x^{3}+7 w^{4} x^{3}+38 w^{3} x^{3}+63 w^{2} x^{3}+38 w x^{3}+10 x^{3}+12 v^{5} w^{4} x^{2}+48 v^{5} w^{3} x^{2}+72 v^{5} w^{2} x^{2}+48 v^{5} w x^{2}+12 v^{5} x^{2}+46 v^{4} w^{4} x^{2}+196 v^{4} w^{3} x^{2}+312 v^{4} w^{2} x^{2}+220 v^{4} w x^{2}+58 v^{4} x^{2}+62 v^{3} w^{4} x^{2}+284 v^{3} w^{3} x^{2}+480 v^{3} w^{2} x^{2}+356 v^{3} w x^{2}+98 v^{3} x^{2}+30 v^{2} w^{4} x^{2}+156 v^{2} w^{3} x^{2}+288 v^{2} w^{2} x^{2}+228 v^{2} w x^{2}+66 v^{2} x^{2}+7 v w^{4} x^{2}+40 v w^{3} x^{2}+51 v w^{2} x^{2}+22 v w x^{2}+4 v x^{2}+16 w^{4} x^{2}+82 w^{3} x^{2}+120 w^{2} x^{2}+56 w x^{2}+14 x^{2}+12 v^{5} w^{4} x+48 v^{5} w^{3} x+72 v^{5} w^{2} x+48 v^{5} w x+12 v^{5} x+50 v^{4} w^{4} x+212 v^{4} w^{3} x+336 v^{4} w^{2} x+236 v^{4} w x+62 v^{4} x+76 v^{3} w^{4} x+340 v^{3} w^{3} x+564 v^{3} w^{2} x+412 v^{3} w x+112 v^{3} x+48 v^{2} w^{4} x+228 v^{2} w^{3} x+396 v^{2} w^{2} x+300 v^{2} w x+84 v^{2} x+3 v w^{4} x+24 v w^{3} x+27 v w^{2} x+6 v w x+9 w^{4} x+46 w^{3} x+51 w^{2} x+2 w x+4 v^{5} w^{4}+16 v^{5} w^{3}+24 v^{5} w^{2}+16 v^{5} w+4 v^{5}+18 v^{4} w^{4}+76 v^{4} w^{3}+120 v^{4} w^{2}+84 v^{4} w+22 v^{4}+30 v^{3} w^{4}+132 v^{3} w^{3}+216 v^{3} w^{2}+156 v^{3} w+42 v^{3}+22 v^{2} w^{4}+100 v^{2} w^{3}+168 v^{2} w^{2}+124 v^{2} w+34 v^{2}+v w^{4}+8 v w^{3}+9 v w^{2}+2 v w+4 w^{4}+18 w^{3}+18 w^{2} $$" ], "text/plain": [ "" @@ -3031,8 +3299,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -3044,7 +3311,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1/(1+a),b\\to 1/(1+b),c\\to 1/(1+c)$" + "Substitute $a\\to 1/(1+y),b\\to 1/(1+z),c\\to 1/(1+a_{1})$" ], "text/plain": [ "" @@ -3056,7 +3323,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $11a^5b^4c^2+16a^5b^4c+9a^5b^4+10a^5b^3c^3+62a^5b^3c^2+74a^5b^3c+38a^5b^3+30a^5b^2c^3+117a^5b^2c^2+120a^5b^2c+57a^5b^2+24a^5bc^3+78a^5bc^2+72a^5bc+34a^5b+8a^5c^3+24a^5c^2+22a^5c+10a^5+9a^4b^4c^3+64a^4b^4c^2+75a^4b^4c+40a^4b^4+86a^4b^3c^3+346a^4b^3c^2+350a^4b^3c+170a^4b^3+195a^4b^2c^3+612a^4b^2c^2+543a^4b^2c+246a^4b^2+142a^4bc^3+384a^4bc^2+298a^4bc+136a^4b+44a^4c^3+114a^4c^2+90a^4c+40a^4+36a^3b^4c^3+146a^3b^4c^2+140a^3b^4c+70a^3b^4+244a^3b^3c^3+764a^3b^3c^2+660a^3b^3c+300a^3b^3+480a^3b^2c^3+1278a^3b^2c^2+972a^3b^2c+414a^3b^2+328a^3bc^3+756a^3bc^2+472a^3bc+204a^3b+96a^3c^3+216a^3c^2+140a^3c+60a^3+54a^2b^4c^3+162a^2b^4c^2+126a^2b^4c+58a^2b^4+312a^2b^3c^3+816a^2b^3c^2+592a^2b^3c+248a^2b^3+558a^2b^2c^3+1284a^2b^2c^2+798a^2b^2c+312a^2b^2+360a^2bc^3+700a^2bc^2+296a^2bc+116a^2b+100a^2c^3+190a^2c^2+84a^2c+34a^2+30ab^4c^3+73ab^4c^2+42ab^4c+19ab^4+166ab^3c^3+370ab^3c^2+206ab^3c+82ab^3+282ab^2c^3+549ab^2c^2+228ab^2c+81ab^2+172abc^3+258abc^2+4abc-2ab+46ac^3+66ac^2+7b^4c^3+16b^4c^2+9b^4c+4b^4+38b^3c^3+82b^3c^2+46b^3c+18b^3+63b^2c^3+120b^2c^2+51b^2c+18b^2+38bc^3+56bc^2+2bc+10c^3+14c^2$" + "Numerator after substitutions: $10 a_{1}^{3} y^{5} z^{3} + 30 a_{1}^{3} y^{5} z^{2} + 24 a_{1}^{3} y^{5} z + 8 a_{1}^{3} y^{5} + 9 a_{1}^{3} y^{4} z^{4} + 86 a_{1}^{3} y^{4} z^{3} + 195 a_{1}^{3} y^{4} z^{2} + 142 a_{1}^{3} y^{4} z + 44 a_{1}^{3} y^{4} + 36 a_{1}^{3} y^{3} z^{4} + 244 a_{1}^{3} y^{3} z^{3} + 480 a_{1}^{3} y^{3} z^{2} + 328 a_{1}^{3} y^{3} z + 96 a_{1}^{3} y^{3} + 54 a_{1}^{3} y^{2} z^{4} + 312 a_{1}^{3} y^{2} z^{3} + 558 a_{1}^{3} y^{2} z^{2} + 360 a_{1}^{3} y^{2} z + 100 a_{1}^{3} y^{2} + 30 a_{1}^{3} y z^{4} + 166 a_{1}^{3} y z^{3} + 282 a_{1}^{3} y z^{2} + 172 a_{1}^{3} y z + 46 a_{1}^{3} y + 7 a_{1}^{3} z^{4} + 38 a_{1}^{3} z^{3} + 63 a_{1}^{3} z^{2} + 38 a_{1}^{3} z + 10 a_{1}^{3} + 11 a_{1}^{2} y^{5} z^{4} + 62 a_{1}^{2} y^{5} z^{3} + 117 a_{1}^{2} y^{5} z^{2} + 78 a_{1}^{2} y^{5} z + 24 a_{1}^{2} y^{5} + 64 a_{1}^{2} y^{4} z^{4} + 346 a_{1}^{2} y^{4} z^{3} + 612 a_{1}^{2} y^{4} z^{2} + 384 a_{1}^{2} y^{4} z + 114 a_{1}^{2} y^{4} + 146 a_{1}^{2} y^{3} z^{4} + 764 a_{1}^{2} y^{3} z^{3} + 1278 a_{1}^{2} y^{3} z^{2} + 756 a_{1}^{2} y^{3} z + 216 a_{1}^{2} y^{3} + 162 a_{1}^{2} y^{2} z^{4} + 816 a_{1}^{2} y^{2} z^{3} + 1284 a_{1}^{2} y^{2} z^{2} + 700 a_{1}^{2} y^{2} z + 190 a_{1}^{2} y^{2} + 73 a_{1}^{2} y z^{4} + 370 a_{1}^{2} y z^{3} + 549 a_{1}^{2} y z^{2} + 258 a_{1}^{2} y z + 66 a_{1}^{2} y + 16 a_{1}^{2} z^{4} + 82 a_{1}^{2} z^{3} + 120 a_{1}^{2} z^{2} + 56 a_{1}^{2} z + 14 a_{1}^{2} + 16 a_{1} y^{5} z^{4} + 74 a_{1} y^{5} z^{3} + 120 a_{1} y^{5} z^{2} + 72 a_{1} y^{5} z + 22 a_{1} y^{5} + 75 a_{1} y^{4} z^{4} + 350 a_{1} y^{4} z^{3} + 543 a_{1} y^{4} z^{2} + 298 a_{1} y^{4} z + 90 a_{1} y^{4} + 140 a_{1} y^{3} z^{4} + 660 a_{1} y^{3} z^{3} + 972 a_{1} y^{3} z^{2} + 472 a_{1} y^{3} z + 140 a_{1} y^{3} + 126 a_{1} y^{2} z^{4} + 592 a_{1} y^{2} z^{3} + 798 a_{1} y^{2} z^{2} + 296 a_{1} y^{2} z + 84 a_{1} y^{2} + 42 a_{1} y z^{4} + 206 a_{1} y z^{3} + 228 a_{1} y z^{2} + 4 a_{1} y z + 9 a_{1} z^{4} + 46 a_{1} z^{3} + 51 a_{1} z^{2} + 2 a_{1} z + 9 y^{5} z^{4} + 38 y^{5} z^{3} + 57 y^{5} z^{2} + 34 y^{5} z + 10 y^{5} + 40 y^{4} z^{4} + 170 y^{4} z^{3} + 246 y^{4} z^{2} + 136 y^{4} z + 40 y^{4} + 70 y^{3} z^{4} + 300 y^{3} z^{3} + 414 y^{3} z^{2} + 204 y^{3} z + 60 y^{3} + 58 y^{2} z^{4} + 248 y^{2} z^{3} + 312 y^{2} z^{2} + 116 y^{2} z + 34 y^{2} + 19 y z^{4} + 82 y z^{3} + 81 y z^{2} - 2 y z + 4 z^{4} + 18 z^{3} + 18 z^{2}$" ], "text/plain": [ "" @@ -3092,7 +3359,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 y z \\le y^{2}+z^{2}$$" ], "text/plain": [ "" @@ -3104,7 +3371,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 11a^5b^4c^2+16a^5b^4c+9a^5b^4+10a^5b^3c^3+62a^5b^3c^2+74a^5b^3c+38a^5b^3+30a^5b^2c^3+117a^5b^2c^2+120a^5b^2c+57a^5b^2+24a^5bc^3+78a^5bc^2+72a^5bc+34a^5b+8a^5c^3+24a^5c^2+22a^5c+10a^5+9a^4b^4c^3+64a^4b^4c^2+75a^4b^4c+40a^4b^4+86a^4b^3c^3+346a^4b^3c^2+350a^4b^3c+170a^4b^3+195a^4b^2c^3+612a^4b^2c^2+543a^4b^2c+246a^4b^2+142a^4bc^3+384a^4bc^2+298a^4bc+136a^4b+44a^4c^3+114a^4c^2+90a^4c+40a^4+36a^3b^4c^3+146a^3b^4c^2+140a^3b^4c+70a^3b^4+244a^3b^3c^3+764a^3b^3c^2+660a^3b^3c+300a^3b^3+480a^3b^2c^3+1278a^3b^2c^2+972a^3b^2c+414a^3b^2+328a^3bc^3+756a^3bc^2+472a^3bc+204a^3b+96a^3c^3+216a^3c^2+140a^3c+60a^3+54a^2b^4c^3+162a^2b^4c^2+126a^2b^4c+58a^2b^4+312a^2b^3c^3+816a^2b^3c^2+592a^2b^3c+248a^2b^3+558a^2b^2c^3+1284a^2b^2c^2+798a^2b^2c+312a^2b^2+360a^2bc^3+700a^2bc^2+296a^2bc+116a^2b+100a^2c^3+190a^2c^2+84a^2c+33a^2+30ab^4c^3+73ab^4c^2+42ab^4c+19ab^4+166ab^3c^3+370ab^3c^2+206ab^3c+82ab^3+282ab^2c^3+549ab^2c^2+228ab^2c+81ab^2+172abc^3+258abc^2+4abc+46ac^3+66ac^2+7b^4c^3+16b^4c^2+9b^4c+4b^4+38b^3c^3+82b^3c^2+46b^3c+18b^3+63b^2c^3+120b^2c^2+51b^2c+17b^2+38bc^3+56bc^2+2bc+10c^3+14c^2 $$" + "$$ 0 \\le 11 a_{1}^{2} y^{5} z^{4}+16 a_{1} y^{5} z^{4}+9 y^{5} z^{4}+10 a_{1}^{3} y^{5} z^{3}+62 a_{1}^{2} y^{5} z^{3}+74 a_{1} y^{5} z^{3}+38 y^{5} z^{3}+30 a_{1}^{3} y^{5} z^{2}+117 a_{1}^{2} y^{5} z^{2}+120 a_{1} y^{5} z^{2}+57 y^{5} z^{2}+24 a_{1}^{3} y^{5} z+78 a_{1}^{2} y^{5} z+72 a_{1} y^{5} z+34 y^{5} z+8 a_{1}^{3} y^{5}+24 a_{1}^{2} y^{5}+22 a_{1} y^{5}+10 y^{5}+9 a_{1}^{3} y^{4} z^{4}+64 a_{1}^{2} y^{4} z^{4}+75 a_{1} y^{4} z^{4}+40 y^{4} z^{4}+86 a_{1}^{3} y^{4} z^{3}+346 a_{1}^{2} y^{4} z^{3}+350 a_{1} y^{4} z^{3}+170 y^{4} z^{3}+195 a_{1}^{3} y^{4} z^{2}+612 a_{1}^{2} y^{4} z^{2}+543 a_{1} y^{4} z^{2}+246 y^{4} z^{2}+142 a_{1}^{3} y^{4} z+384 a_{1}^{2} y^{4} z+298 a_{1} y^{4} z+136 y^{4} z+44 a_{1}^{3} y^{4}+114 a_{1}^{2} y^{4}+90 a_{1} y^{4}+40 y^{4}+36 a_{1}^{3} y^{3} z^{4}+146 a_{1}^{2} y^{3} z^{4}+140 a_{1} y^{3} z^{4}+70 y^{3} z^{4}+244 a_{1}^{3} y^{3} z^{3}+764 a_{1}^{2} y^{3} z^{3}+660 a_{1} y^{3} z^{3}+300 y^{3} z^{3}+480 a_{1}^{3} y^{3} z^{2}+1278 a_{1}^{2} y^{3} z^{2}+972 a_{1} y^{3} z^{2}+414 y^{3} z^{2}+328 a_{1}^{3} y^{3} z+756 a_{1}^{2} y^{3} z+472 a_{1} y^{3} z+204 y^{3} z+96 a_{1}^{3} y^{3}+216 a_{1}^{2} y^{3}+140 a_{1} y^{3}+60 y^{3}+54 a_{1}^{3} y^{2} z^{4}+162 a_{1}^{2} y^{2} z^{4}+126 a_{1} y^{2} z^{4}+58 y^{2} z^{4}+312 a_{1}^{3} y^{2} z^{3}+816 a_{1}^{2} y^{2} z^{3}+592 a_{1} y^{2} z^{3}+248 y^{2} z^{3}+558 a_{1}^{3} y^{2} z^{2}+1284 a_{1}^{2} y^{2} z^{2}+798 a_{1} y^{2} z^{2}+312 y^{2} z^{2}+360 a_{1}^{3} y^{2} z+700 a_{1}^{2} y^{2} z+296 a_{1} y^{2} z+116 y^{2} z+100 a_{1}^{3} y^{2}+190 a_{1}^{2} y^{2}+84 a_{1} y^{2}+33 y^{2}+30 a_{1}^{3} y z^{4}+73 a_{1}^{2} y z^{4}+42 a_{1} y z^{4}+19 y z^{4}+166 a_{1}^{3} y z^{3}+370 a_{1}^{2} y z^{3}+206 a_{1} y z^{3}+82 y z^{3}+282 a_{1}^{3} y z^{2}+549 a_{1}^{2} y z^{2}+228 a_{1} y z^{2}+81 y z^{2}+172 a_{1}^{3} y z+258 a_{1}^{2} y z+4 a_{1} y z+46 a_{1}^{3} y+66 a_{1}^{2} y+7 a_{1}^{3} z^{4}+16 a_{1}^{2} z^{4}+9 a_{1} z^{4}+4 z^{4}+38 a_{1}^{3} z^{3}+82 a_{1}^{2} z^{3}+46 a_{1} z^{3}+18 z^{3}+63 a_{1}^{3} z^{2}+120 a_{1}^{2} z^{2}+51 a_{1} z^{2}+17 z^{2}+38 a_{1}^{3} z+56 a_{1}^{2} z+2 a_{1} z+10 a_{1}^{3}+14 a_{1}^{2} $$" ], "text/plain": [ "" @@ -3124,9 +3391,20 @@ }, "metadata": {}, "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Counter({0: 8})" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ + "newproof()\n", "formula=Sm('-(3a + 2b + c)(2a^3 + 3b^2 + 6c + 1) + (4a + 4b + 4c)(a^4 + b^3 + c^2 + 3)')\n", "powerprove(formula)" ] @@ -3145,13 +3423,13 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "numerator: $21f(-1,4,3)-21f(1,2,3)-21f(2,3,1)+21f(3,-1,4)-21f(3,1,2)+21f(4,3,-1)$" + "numerator: $21 f{\\left(-1,4,3 \\right)} - 21 f{\\left(1,2,3 \\right)} - 21 f{\\left(2,3,1 \\right)} + 21 f{\\left(3,-1,4 \\right)} - 21 f{\\left(3,1,2 \\right)} + 21 f{\\left(4,3,-1 \\right)}$" ], "text/plain": [ "" @@ -3255,18 +3533,575 @@ }, "metadata": {}, "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ "provef('(-f(1,2,3)-f(2,3,1)-f(3,1,2)+f(4,3,-1)+f(3,-1,4)+f(-1,4,3))*21')" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's try to solve problem 6 from the finals of LXIII Polish Mathematical Olympiad. It was one of the hardest inequality in the history of this contest, solved only by 3 finalists.\n", + "\n", + "#### Problem\n", + "Prove the inequality\n", + "$$\\left(\\frac{a - b}{c}\\right)^2 + \\left(\\frac{b - c}{a}\\right)^2 + \\left(\\frac{c - a}{b}\\right)^2\\ge 2 \\sqrt{2} \\left(\\frac{a - b}{c} + \\frac{b - c}{a}+ \\frac{c-a}{b}\\right)$$\n", + "for any positive numbers $a,b,c$.\n", + "\n", + "The first observation is that the formula is cyclic, so without loss of generality we may assume that $a\\ge b,c$. We can go a step further and divide it into two cases: $a\\ge b\\ge c$ and $a\\ge c\\ge b$." + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "shiro.display=lambda x:None #turn off printing of proofs\n", + "newproof()\n", + "formula=cyclize('((a-b)/c)^2-2*sqrt(2)*(a-b)/c')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "formula1=makesubs(formula,'[b,oo],[c,oo]',variables='a,b') #a>=b>=c\n", + "prove(formula1) " + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "formula2=makesubs(formula,'[c,oo],[b,oo]',variables='a,c') #a>=c>=b\n", + "prove(formula2) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So the case $a\\ge c\\ge b$ is done, but $a\\ge b\\ge c$ is not. But maybe we can adjust values." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimization terminated successfully.\n", + " Current function value: 1.000000\n", + " Iterations: 137\n", + " Function evaluations: 249\n" + ] + }, + { + "data": { + "text/plain": [ + "(1.7908873553542452e-10, 2.5326984818340415e-10, 7.129450063690368)" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "values=findvalues(formula1)\n", + "values" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First and second value is approximately equal to 0, so we can try to replace 0 with 1." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prove(formula1,values='1,1,7')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The key observation is that the `formula1` is homogenous, so we can scale values." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1, 1.4142142855953455, 39809595184.05965)" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "newvalues=(1,values[1]/values[0],values[2]/values[0])\n", + "newvalues" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.000002045581953" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "newvalues[1]**2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now the third value is very big. Technically we could use it, but it would run into overflow error, so we will use 1 instead of it. Second value is very close to $\\sqrt{2}$, so this value will be our next try." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prove(formula1,values='1,sqrt(2),1')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So after getting the code all together we have got the following proof." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "Case $a\\ge c\\ge b$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $a\\to c + d$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $c\\to b + e$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "numerator: $2 b^{4} d^{2} + 2 b^{4} d e + 2 b^{4} e^{2} + 4 b^{3} d^{3} + 2 \\sqrt{2} b^{3} d^{2} e + 10 b^{3} d^{2} e + 2 \\sqrt{2} b^{3} d e^{2} + 6 b^{3} d e^{2} + 4 b^{3} e^{3} + 2 b^{2} d^{4} + 2 \\sqrt{2} b^{2} d^{3} e + 10 b^{2} d^{3} e + 6 \\sqrt{2} b^{2} d^{2} e^{2} + 12 b^{2} d^{2} e^{2} + 4 b^{2} d e^{3} + 4 \\sqrt{2} b^{2} d e^{3} + 2 b^{2} e^{4} + 2 b d^{4} e + 2 \\sqrt{2} b d^{3} e^{2} + 6 b d^{3} e^{2} + 4 b d^{2} e^{3} + 4 \\sqrt{2} b d^{2} e^{3} + 2 \\sqrt{2} b d e^{4} + d^{4} e^{2} + 2 d^{3} e^{3} + d^{2} e^{4}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $b^{6} + 2 b^{5} d + 4 b^{5} e + b^{4} d^{2} + 6 b^{4} d e + 6 b^{4} e^{2} + 2 b^{3} d^{2} e + 6 b^{3} d e^{2} + 4 b^{3} e^{3} + b^{2} d^{2} e^{2} + 2 b^{2} d e^{3} + b^{2} e^{4}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "status: 0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ 0 \\le 2 b^{4} d^{2}+2 b^{4} d e+2 b^{4} e^{2}+4 b^{3} d^{3}+2 \\sqrt{2} b^{3} d^{2} e+10 b^{3} d^{2} e+2 \\sqrt{2} b^{3} d e^{2}+6 b^{3} d e^{2}+4 b^{3} e^{3}+2 b^{2} d^{4}+2 \\sqrt{2} b^{2} d^{3} e+10 b^{2} d^{3} e+6 \\sqrt{2} b^{2} d^{2} e^{2}+12 b^{2} d^{2} e^{2}+4 \\sqrt{2} b^{2} d e^{3}+4 b^{2} d e^{3}+2 b^{2} e^{4}+2 b d^{4} e+2 \\sqrt{2} b d^{3} e^{2}+6 b d^{3} e^{2}+4 \\sqrt{2} b d^{2} e^{3}+4 b d^{2} e^{3}+2 \\sqrt{2} b d e^{4}+d^{4} e^{2}+2 d^{3} e^{3}+d^{2} e^{4} $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "The sum of all inequalities gives us a proof of the inequality." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Case $a\\ge b\\ge c$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $a\\to b + f$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $b\\to c + g$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $f\\to \\sqrt{2} h$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "numerator: $2 c^{4} g^{2} + 2 \\sqrt{2} c^{4} g h + 4 c^{4} h^{2} + 4 c^{3} g^{3} - 4 c^{3} g^{2} h + 6 \\sqrt{2} c^{3} g^{2} h - 4 \\sqrt{2} c^{3} g h^{2} + 20 c^{3} g h^{2} + 8 \\sqrt{2} c^{3} h^{3} + 2 c^{2} g^{4} - 8 c^{2} g^{3} h + 4 \\sqrt{2} c^{2} g^{3} h - 12 \\sqrt{2} c^{2} g^{2} h^{2} + 24 c^{2} g^{2} h^{2} - 8 c^{2} g h^{3} + 20 \\sqrt{2} c^{2} g h^{3} + 8 c^{2} h^{4} - 4 c g^{4} h - 8 \\sqrt{2} c g^{3} h^{2} + 8 c g^{3} h^{2} - 8 c g^{2} h^{3} + 12 \\sqrt{2} c g^{2} h^{3} + 8 c g h^{4} + 2 g^{4} h^{2} + 4 \\sqrt{2} g^{3} h^{3} + 4 g^{2} h^{4}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $c^{6} + 4 c^{5} g + 2 \\sqrt{2} c^{5} h + 6 c^{4} g^{2} + 6 \\sqrt{2} c^{4} g h + 2 c^{4} h^{2} + 4 c^{3} g^{3} + 6 \\sqrt{2} c^{3} g^{2} h + 4 c^{3} g h^{2} + c^{2} g^{4} + 2 \\sqrt{2} c^{2} g^{3} h + 2 c^{2} g^{2} h^{2}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "status: 0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "From weighted AM-GM inequality:" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$4 c^{3} g^{2} h \\le 2 c^{4} g^{2}+2 c^{2} g^{2} h^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$4 \\sqrt{2} c^{3} g h^{2} \\le 2 \\sqrt{2} c^{4} g h+\\sqrt{2} c^{3} h^{3}+\\sqrt{2} c g^{2} h^{3}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$8 c^{2} g^{3} h \\le 4 c^{3} g^{3}+4 c g^{3} h^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$12 \\sqrt{2} c^{2} g^{2} h^{2} \\le 6 \\sqrt{2} c^{3} g^{2} h+6 \\sqrt{2} c g^{2} h^{3}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$8 c^{2} g h^{3} \\le 4 c^{3} g h^{2}+2 c^{2} h^{4}+2 g^{2} h^{4}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$4 c g^{4} h \\le 2 c^{2} g^{4}+2 g^{4} h^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$8 \\sqrt{2} c g^{3} h^{2} \\le 4 \\sqrt{2} c^{2} g^{3} h+4 \\sqrt{2} g^{3} h^{3}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$8 c g^{2} h^{3} \\le 4 c g^{3} h^{2}+4 c g h^{4}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ 0 \\le 4 c^{4} h^{2}+16 c^{3} g h^{2}+7 \\sqrt{2} c^{3} h^{3}+22 c^{2} g^{2} h^{2}+20 \\sqrt{2} c^{2} g h^{3}+6 c^{2} h^{4}+5 \\sqrt{2} c g^{2} h^{3}+4 c g h^{4}+2 g^{2} h^{4} $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "The sum of all inequalities gives us a proof of the inequality." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "newproof()\n", + "shiro.display=lambda x:display(Latex(x)) #turn on printing proofs \n", + "formula=cyclize('((a-b)/c)^2-2*sqrt(2)*(a-b)/c')\n", + "display(Latex('Case $a\\ge c\\ge b$'))\n", + "formula1=makesubs(formula,'[c,oo],[b,oo]',variables='a,c,b')\n", + "prove(formula1)\n", + "display(Latex('Case $a\\ge b\\ge c$'))\n", + "formula2=makesubs(formula,'[b,oo],[c,oo]')\n", + "prove(formula2,values='1,2**(1/2),1')" + ] } ], "metadata": { diff --git a/.ipynb_checkpoints/sandbox-checkpoint.ipynb b/.ipynb_checkpoints/sandbox-checkpoint.ipynb index 8b7f55a..3e2ac3a 100644 --- a/.ipynb_checkpoints/sandbox-checkpoint.ipynb +++ b/.ipynb_checkpoints/sandbox-checkpoint.ipynb @@ -16,145 +16,39 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "from shiroindev import *\n", "from sympy import *\n", "from itertools import permutations, combinations\n", - "sVars.seed=1\n", + "shiro.seed=1\n", "from IPython.display import Latex\n", - "sVars.display=lambda x:display(Latex(x))" + "shiro.display=lambda x:display(Latex(x))" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "numerator: $12a^3-18a^2b+6a^2c+6ab^2-18ac^2+12b^3-18b^2c+6bc^2+12c^3$" + "__________________________" ], "text/plain": [ "" ] }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "denominator: $4a^2b+2a^2c+2ab^2+9abc+4ac^2+4b^2c+2bc^2$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "status: 0" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "From weighted AM-GM inequality:" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$18a^2b \\le 10a^3+6ab^2+2b^3$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$18ac^2 \\le 2a^3+6a^2c+10c^3$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$18b^2c \\le 10b^3+6bc^2+2c^3$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$ 0 \\le 0 $$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "The sum of all inequalities gives us a proof of the inequality." - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 3, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "formula=cyclize('(a+b)/(2*b+c)')-2\n", - "prove(formula*6)" + "Latex(r'__________________________')" ] }, { @@ -165,7 +59,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to s-s/(a+1)$" + "Substitute $a\\to s-\\frac{s}{d+1}$" ], "text/plain": [ "" @@ -177,7 +71,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to s-s/(b+1)$" + "Substitute $b\\to s-\\frac{s}{e+1}$" ], "text/plain": [ "" @@ -189,7 +83,7 @@ { "data": { "text/latex": [ - "Substitute $c\\to s-s/(c+1)$" + "Substitute $c\\to s-\\frac{s}{f+1}$" ], "text/plain": [ "" @@ -201,7 +95,7 @@ { "data": { "text/latex": [ - "numerator: $abcs^2+s^2$" + "numerator: $defs^2+s^2$" ], "text/plain": [ "" @@ -213,7 +107,7 @@ { "data": { "text/latex": [ - "denominator: $abc+ab+ac+a+bc+b+c+1$" + "denominator: $def+de+df+d+ef+e+f+1$" ], "text/plain": [ "" @@ -237,7 +131,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le abcs^2+s^2 $$" + "$$ 0 \\le defs^2+s^2 $$" ], "text/plain": [ "" @@ -317,7 +211,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $x\\to g+y$" ], "text/plain": [ "" @@ -329,7 +223,7 @@ { "data": { "text/latex": [ - "$$y^{2}$$" + "$$g^{2}$$" ], "text/plain": [ "" @@ -372,7 +266,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+z$" + "Substitute $y\\to h+x$" ], "text/plain": [ "" @@ -384,7 +278,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} \\left(x + z\\right)^{t} - x y y^{t} + x y z^{t} - x y \\left(x + z\\right)^{t} + x y^{t} z - x z z^{t} + x z \\left(x + z\\right)^{t} + y^{2} y^{t} - 2 y y^{t} z + y^{t} z^{2}$$" + "4 $$h^{2} \\left(h + x\\right)^{t} - h x x^{t} + h x z^{t} + h x \\left(h + x\\right)^{t} + h x^{t} z - h z z^{t} - h z \\left(h + x\\right)^{t} + x^{2} z^{t} - 2 x z z^{t} + z^{2} z^{t}$$" ], "text/plain": [ "" @@ -396,7 +290,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to y+z$" + "Substitute $z\\to i+x$" ], "text/plain": [ "" @@ -408,7 +302,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} x^{t} - x x^{t} y - 2 x x^{t} z + x y z^{t} - x y \\left(y + z\\right)^{t} + x^{t} y z + x^{t} z^{2} + y^{2} \\left(y + z\\right)^{t} - y z z^{t} + y z \\left(y + z\\right)^{t}$$" + "4 $$i^{2} \\left(i + x\\right)^{t} - i x x^{t} + i x y^{t} + i x \\left(i + x\\right)^{t} + i x^{t} y - i y y^{t} - i y \\left(i + x\\right)^{t} + x^{2} y^{t} - 2 x y y^{t} + y^{2} y^{t}$$" ], "text/plain": [ "" @@ -420,7 +314,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $z\\to j+y$" ], "text/plain": [ "" @@ -432,7 +326,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} z^{t} - x x^{t} y + x y z^{t} + x y \\left(x + y\\right)^{t} - 2 x z z^{t} + x^{t} y z + y^{2} \\left(x + y\\right)^{t} - y z z^{t} - y z \\left(x + y\\right)^{t} + z^{2} z^{t}$$" + "4 $$j^{2} \\left(j + y\\right)^{t} - j x x^{t} + j x y^{t} - j x \\left(j + y\\right)^{t} + j x^{t} y - j y y^{t} + j y \\left(j + y\\right)^{t} + x^{2} x^{t} - 2 x x^{t} y + x^{t} y^{2}$$" ], "text/plain": [ "" @@ -444,7 +338,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+z$" + "Substitute $y\\to k+x$" ], "text/plain": [ "" @@ -456,7 +350,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to y+z$" + "Substitute $z\\to l+x$" ], "text/plain": [ "" @@ -468,7 +362,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} \\left(x + z\\right)^{t} + x y z^{t} - x y \\left(x + z\\right)^{t} - x y \\left(y + z\\right)^{t} + y^{2} \\left(y + z\\right)^{t}$$" + "4 $$k^{2} \\left(k + x\\right)^{t} + k l x^{t} - k l \\left(k + x\\right)^{t} - k l \\left(l + x\\right)^{t} + l^{2} \\left(l + x\\right)^{t}$$" ], "text/plain": [ "" @@ -480,7 +374,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $l\\to k+m$" ], "text/plain": [ "" @@ -492,7 +386,7 @@ { "data": { "text/latex": [ - "3 $$x^{2} z^{t} + x y z^{t} - x y \\left(x + z\\right)^{t} + x y \\left(x + y + z\\right)^{t} + y^{2} \\left(x + y + z\\right)^{t}$$" + "3 $$k^{2} x^{t} + k m x^{t} - k m \\left(k + x\\right)^{t} + k m \\left(k + m + x\\right)^{t} + m^{2} \\left(k + m + x\\right)^{t}$$" ], "text/plain": [ "" @@ -504,7 +398,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to y+z$" + "Substitute $z\\to n+x$" ], "text/plain": [ "" @@ -516,7 +410,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+z$" + "Substitute $y\\to o+x$" ], "text/plain": [ "" @@ -528,7 +422,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} \\left(x + z\\right)^{t} + x y z^{t} - x y \\left(x + z\\right)^{t} - x y \\left(y + z\\right)^{t} + y^{2} \\left(y + z\\right)^{t}$$" + "4 $$n^{2} \\left(n + x\\right)^{t} + n o x^{t} - n o \\left(n + x\\right)^{t} - n o \\left(o + x\\right)^{t} + o^{2} \\left(o + x\\right)^{t}$$" ], "text/plain": [ "" @@ -540,7 +434,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $o\\to n+p$" ], "text/plain": [ "" @@ -552,7 +446,7 @@ { "data": { "text/latex": [ - "3 $$x^{2} z^{t} + x y z^{t} - x y \\left(x + z\\right)^{t} + x y \\left(x + y + z\\right)^{t} + y^{2} \\left(x + y + z\\right)^{t}$$" + "3 $$n^{2} x^{t} + n p x^{t} - n p \\left(n + x\\right)^{t} + n p \\left(n + p + x\\right)^{t} + p^{2} \\left(n + p + x\\right)^{t}$$" ], "text/plain": [ "" @@ -574,7 +468,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+y$" + "Substitute $x\\to q+y$" ], "text/plain": [ "" @@ -586,10 +480,10 @@ { "data": { "text/latex": [ - "$\\displaystyle x^{2} \\left(x + y\\right)^{t} - x y y^{t} + x y z^{t} + x y \\left(x + y\\right)^{t} + x y^{t} z - x z z^{t} - x z \\left(x + y\\right)^{t} + y^{2} z^{t} - 2 y z z^{t} + z^{2} z^{t}$" + "$\\displaystyle q^{2} \\left(q + y\\right)^{t} - q y y^{t} + q y z^{t} + q y \\left(q + y\\right)^{t} + q y^{t} z - q z z^{t} - q z \\left(q + y\\right)^{t} + y^{2} z^{t} - 2 y z z^{t} + z^{2} z^{t}$" ], "text/plain": [ - "x**2*(x + y)**t - x*y*y**t + x*y*z**t + x*y*(x + y)**t + x*y**t*z - x*z*z**t - x*z*(x + y)**t + y**2*z**t - 2*y*z*z**t + z**2*z**t" + "q**2*(q + y)**t - q*y*y**t + q*y*z**t + q*y*(q + y)**t + q*y**t*z - q*z*z**t - q*z*(q + y)**t + y**2*z**t - 2*y*z*z**t + z**2*z**t" ] }, "execution_count": 10, @@ -609,7 +503,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+y$" + "Substitute $x\\to r+y$" ], "text/plain": [ "" @@ -621,10 +515,10 @@ { "data": { "text/latex": [ - "$\\displaystyle x^{2} \\left(x + y\\right)^{t} - x y y^{t} + x y z^{t} + x y \\left(x + y\\right)^{t} + x y^{t} z - x z z^{t} - x z \\left(x + y\\right)^{t} + y^{2} z^{t} - 2 y z z^{t} + z^{2} z^{t}$" + "$\\displaystyle r^{2} \\left(r + y\\right)^{t} - r y y^{t} + r y z^{t} + r y \\left(r + y\\right)^{t} + r y^{t} z - r z z^{t} - r z \\left(r + y\\right)^{t} + y^{2} z^{t} - 2 y z z^{t} + z^{2} z^{t}$" ], "text/plain": [ - "x**2*(x + y)**t - x*y*y**t + x*y*z**t + x*y*(x + y)**t + x*y**t*z - x*z*z**t - x*z*(x + y)**t + y**2*z**t - 2*y*z*z**t + z**2*z**t" + "r**2*(r + y)**t - r*y*y**t + r*y*z**t + r*y*(r + y)**t + r*y**t*z - r*z*z**t - r*z*(r + y)**t + y**2*z**t - 2*y*z*z**t + z**2*z**t" ] }, "execution_count": 11, @@ -644,7 +538,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+z$" + "Substitute $y\\to u+x$" ], "text/plain": [ "" @@ -656,7 +550,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} \\left(x + z\\right)^{t} - x y y^{t} + x y z^{t} - x y \\left(x + z\\right)^{t} + x y^{t} z - x z z^{t} + x z \\left(x + z\\right)^{t} + y^{2} y^{t} - 2 y y^{t} z + y^{t} z^{2}$$" + "4 $$u^{2} \\left(u + x\\right)^{t} - u x x^{t} + u x z^{t} + u x \\left(u + x\\right)^{t} + u x^{t} z - u z z^{t} - u z \\left(u + x\\right)^{t} + x^{2} z^{t} - 2 x z z^{t} + z^{2} z^{t}$$" ], "text/plain": [ "" @@ -668,7 +562,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to y+z$" + "Substitute $z\\to v+x$" ], "text/plain": [ "" @@ -680,7 +574,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} x^{t} - x x^{t} y - 2 x x^{t} z + x y z^{t} - x y \\left(y + z\\right)^{t} + x^{t} y z + x^{t} z^{2} + y^{2} \\left(y + z\\right)^{t} - y z z^{t} + y z \\left(y + z\\right)^{t}$$" + "4 $$v^{2} \\left(v + x\\right)^{t} - v x x^{t} + v x y^{t} + v x \\left(v + x\\right)^{t} + v x^{t} y - v y y^{t} - v y \\left(v + x\\right)^{t} + x^{2} y^{t} - 2 x y y^{t} + y^{2} y^{t}$$" ], "text/plain": [ "" @@ -692,7 +586,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $z\\to w+y$" ], "text/plain": [ "" @@ -704,7 +598,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} z^{t} - x x^{t} y + x y z^{t} + x y \\left(x + y\\right)^{t} - 2 x z z^{t} + x^{t} y z + y^{2} \\left(x + y\\right)^{t} - y z z^{t} - y z \\left(x + y\\right)^{t} + z^{2} z^{t}$$" + "4 $$w^{2} \\left(w + y\\right)^{t} - w x x^{t} + w x y^{t} - w x \\left(w + y\\right)^{t} + w x^{t} y - w y y^{t} + w y \\left(w + y\\right)^{t} + x^{2} x^{t} - 2 x x^{t} y + x^{t} y^{2}$$" ], "text/plain": [ "" @@ -716,7 +610,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+z$" + "Substitute $y\\to a_{1}+x$" ], "text/plain": [ "" @@ -728,7 +622,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to y+z$" + "Substitute $z\\to b_{1}+x$" ], "text/plain": [ "" @@ -740,7 +634,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} \\left(x + z\\right)^{t} + x y z^{t} - x y \\left(x + z\\right)^{t} - x y \\left(y + z\\right)^{t} + y^{2} \\left(y + z\\right)^{t}$$" + "4 $$a_{1}^{2} \\left(a_{1} + x\\right)^{t} + a_{1} b_{1} x^{t} - a_{1} b_{1} \\left(a_{1} + x\\right)^{t} - a_{1} b_{1} \\left(b_{1} + x\\right)^{t} + b_{1}^{2} \\left(b_{1} + x\\right)^{t}$$" ], "text/plain": [ "" @@ -752,7 +646,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $b_{1}\\to a_{1}+c_{1}$" ], "text/plain": [ "" @@ -764,7 +658,7 @@ { "data": { "text/latex": [ - "3 $$x^{2} z^{t} + x y z^{t} - x y \\left(x + z\\right)^{t} + x y \\left(x + y + z\\right)^{t} + y^{2} \\left(x + y + z\\right)^{t}$$" + "3 $$a_{1}^{2} x^{t} + a_{1} c_{1} x^{t} - a_{1} c_{1} \\left(a_{1} + x\\right)^{t} + a_{1} c_{1} \\left(a_{1} + c_{1} + x\\right)^{t} + c_{1}^{2} \\left(a_{1} + c_{1} + x\\right)^{t}$$" ], "text/plain": [ "" @@ -776,7 +670,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to y+z$" + "Substitute $z\\to d_{1}+x$" ], "text/plain": [ "" @@ -788,7 +682,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+z$" + "Substitute $y\\to e_{1}+x$" ], "text/plain": [ "" @@ -800,7 +694,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} \\left(x + z\\right)^{t} + x y z^{t} - x y \\left(x + z\\right)^{t} - x y \\left(y + z\\right)^{t} + y^{2} \\left(y + z\\right)^{t}$$" + "4 $$d_{1}^{2} \\left(d_{1} + x\\right)^{t} + d_{1} e_{1} x^{t} - d_{1} e_{1} \\left(d_{1} + x\\right)^{t} - d_{1} e_{1} \\left(e_{1} + x\\right)^{t} + e_{1}^{2} \\left(e_{1} + x\\right)^{t}$$" ], "text/plain": [ "" @@ -812,7 +706,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $e_{1}\\to d_{1}+f_{1}$" ], "text/plain": [ "" @@ -824,7 +718,7 @@ { "data": { "text/latex": [ - "3 $$x^{2} z^{t} + x y z^{t} - x y \\left(x + z\\right)^{t} + x y \\left(x + y + z\\right)^{t} + y^{2} \\left(x + y + z\\right)^{t}$$" + "3 $$d_{1}^{2} x^{t} + d_{1} f_{1} x^{t} - d_{1} f_{1} \\left(d_{1} + x\\right)^{t} + d_{1} f_{1} \\left(d_{1} + f_{1} + x\\right)^{t} + f_{1}^{2} \\left(d_{1} + f_{1} + x\\right)^{t}$$" ], "text/plain": [ "" @@ -953,7 +847,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 11a/8$" + "Substitute $a\\to 11g_{1}/8$" ], "text/plain": [ "" @@ -965,7 +859,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to 4b/5$" + "Substitute $b\\to 4h_{1}/5$" ], "text/plain": [ "" @@ -977,7 +871,7 @@ { "data": { "text/latex": [ - "Substitute $c\\to 4c/5$" + "Substitute $c\\to 4i_{1}/5$" ], "text/plain": [ "" @@ -989,7 +883,7 @@ { "data": { "text/latex": [ - "Substitute $d\\to 4d/5$" + "Substitute $d\\to 4j_{1}/5$" ], "text/plain": [ "" @@ -1001,7 +895,7 @@ { "data": { "text/latex": [ - "numerator: $3025a^2-1760ab-1760ac-1760ad+1024b^2+1024c^2+1024d^2$" + "numerator: $3025g_{1}^2-1760g_{1}h_{1}-1760g_{1}i_{1}-1760g_{1}j_{1}+1024h_{1}^2+1024i_{1}^2+1024j_{1}^2$" ], "text/plain": [ "" @@ -1049,7 +943,7 @@ { "data": { "text/latex": [ - "$$1760ab \\le 880a^2+880b^2$$" + "$$1760g_{1}h_{1} \\le 880g_{1}^2+880h_{1}^2$$" ], "text/plain": [ "" @@ -1061,7 +955,7 @@ { "data": { "text/latex": [ - "$$1760ac \\le 880a^2+880c^2$$" + "$$1760g_{1}i_{1} \\le 880g_{1}^2+880i_{1}^2$$" ], "text/plain": [ "" @@ -1073,7 +967,7 @@ { "data": { "text/latex": [ - "$$1760ad \\le 880a^2+880d^2$$" + "$$1760g_{1}j_{1} \\le 880g_{1}^2+880j_{1}^2$$" ], "text/plain": [ "" @@ -1085,7 +979,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 385a^2+144b^2+144c^2+144d^2 $$" + "$$ 0 \\le 385g_{1}^2+144h_{1}^2+144i_{1}^2+144j_{1}^2 $$" ], "text/plain": [ "" @@ -1148,76 +1042,29 @@ "outputs": [ { "data": { - "text/latex": [ - "$\\displaystyle - \\frac{2 \\sqrt{2} \\left(a - b\\right)}{c} + \\frac{\\left(a - b\\right)^{2}}{c^{2}} - \\frac{2 \\sqrt{2} \\left(- a + c\\right)}{b} + \\frac{\\left(- a + c\\right)^{2}}{b^{2}} - \\frac{2 \\sqrt{2} \\left(b - c\\right)}{a} + \\frac{\\left(b - c\\right)^{2}}{a^{2}}$" - ], "text/plain": [ - "-2*sqrt(2)*(a - b)/c + (a - b)**2/c**2 - 2*sqrt(2)*(-a + c)/b + (-a + c)**2/b**2 - 2*sqrt(2)*(b - c)/a + (b - c)**2/a**2" + "\"formula=cyclize(Sm('((a-b)/c)^2-8**(1/2)*(a-b)/c'))\\ndisplay(formula)\\nfrom scipy.optimize import fmin\\nimport numpy as np\\ndef f(x):\\n num,den=fraction(cancel(newformula))\\n fs=sorted(newformula.free_symbols,key=str)\\n return float(num.subs(list(zip(fs,x))))\\nnewformula=(makesubs(formula,'[b,oo],[c,oo]'))\\nprint(f([2,1,1]))\\nfmin(f,[2,1,1])\\nprint(fmin(f,np.array([2,1,1])))\\ndisplay(simplify(newformula))\"" ] }, + "execution_count": 20, "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Substitute $a\\to a+b$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Substitute $b\\to b+c$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimization terminated successfully.\n", - " Current function value: 0.000000\n", - " Iterations: 51\n", - " Function evaluations: 97\n", - "[1.17092486 1.170961 1.17093843]\n" - ] - }, - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{a^{4} b^{2} + 2 a^{4} b c + 2 a^{4} c^{2} + 2 a^{3} b^{3} - 2 \\sqrt{2} a^{3} b^{2} c + 6 a^{3} b^{2} c - 2 \\sqrt{2} a^{3} b c^{2} + 10 a^{3} b c^{2} + 4 a^{3} c^{3} + a^{2} b^{4} - 4 \\sqrt{2} a^{2} b^{3} c + 4 a^{2} b^{3} c - 6 \\sqrt{2} a^{2} b^{2} c^{2} + 12 a^{2} b^{2} c^{2} - 2 \\sqrt{2} a^{2} b c^{3} + 10 a^{2} b c^{3} + 2 a^{2} c^{4} - 2 \\sqrt{2} a b^{4} c - 4 \\sqrt{2} a b^{3} c^{2} + 4 a b^{3} c^{2} - 2 \\sqrt{2} a b^{2} c^{3} + 6 a b^{2} c^{3} + 2 a b c^{4} + 2 b^{4} c^{2} + 4 b^{3} c^{3} + 2 b^{2} c^{4}}{c^{2} \\left(a^{2} b^{2} + 2 a^{2} b c + a^{2} c^{2} + 2 a b^{3} + 6 a b^{2} c + 6 a b c^{2} + 2 a c^{3} + b^{4} + 4 b^{3} c + 6 b^{2} c^{2} + 4 b c^{3} + c^{4}\\right)}$" - ], - "text/plain": [ - "(a**4*b**2 + 2*a**4*b*c + 2*a**4*c**2 + 2*a**3*b**3 - 2*sqrt(2)*a**3*b**2*c + 6*a**3*b**2*c - 2*sqrt(2)*a**3*b*c**2 + 10*a**3*b*c**2 + 4*a**3*c**3 + a**2*b**4 - 4*sqrt(2)*a**2*b**3*c + 4*a**2*b**3*c - 6*sqrt(2)*a**2*b**2*c**2 + 12*a**2*b**2*c**2 - 2*sqrt(2)*a**2*b*c**3 + 10*a**2*b*c**3 + 2*a**2*c**4 - 2*sqrt(2)*a*b**4*c - 4*sqrt(2)*a*b**3*c**2 + 4*a*b**3*c**2 - 2*sqrt(2)*a*b**2*c**3 + 6*a*b**2*c**3 + 2*a*b*c**4 + 2*b**4*c**2 + 4*b**3*c**3 + 2*b**2*c**4)/(c**2*(a**2*b**2 + 2*a**2*b*c + a**2*c**2 + 2*a*b**3 + 6*a*b**2*c + 6*a*b*c**2 + 2*a*c**3 + b**4 + 4*b**3*c + 6*b**2*c**2 + 4*b*c**3 + c**4))" - ] - }, - "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ - "formula=cyclize(Sm('((a-b)/c)^2-8**(1/2)*(a-b)/c'))\n", + "\"\"\"formula=cyclize(Sm('((a-b)/c)^2-8**(1/2)*(a-b)/c'))\n", "display(formula)\n", "from scipy.optimize import fmin\n", "import numpy as np\n", "def f(x):\n", - " num,den=fraction(cancel(formula))\n", + " num,den=fraction(cancel(newformula))\n", " fs=sorted(newformula.free_symbols,key=str)\n", - " return num.subs(zip(fs,x))\n", + " return float(num.subs(list(zip(fs,x))))\n", "newformula=(makesubs(formula,'[b,oo],[c,oo]'))\n", + "print(f([2,1,1]))\n", + "fmin(f,[2,1,1])\n", "print(fmin(f,np.array([2,1,1])))\n", - "display(simplify(newformula))\n", + "display(simplify(newformula))\"\"\"\n", "#prove(newformula)\n", "#prove(makesubs(formula,'[b,oo],[a,oo]',variables='c,b,a'))" ] @@ -1326,13 +1173,13 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "Substitute $a\\to a+b$" + "Substitute $a\\to b+k_{1}$" ], "text/plain": [ "" @@ -1344,7 +1191,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+c$" + "Substitute $b\\to c+l_{1}$" ], "text/plain": [ "" @@ -1354,68 +1201,15 @@ "output_type": "display_data" }, { - "data": { - "text/latex": [ - "$\\displaystyle a^{8} b^{4} + 2 a^{8} b^{2} c^{2} + 2 a^{8} c^{4} + 2 a^{6} b^{6} - 2 \\sqrt{2} a^{6} b^{4} c^{2} + 6 a^{6} b^{4} c^{2} - 2 \\sqrt{2} a^{6} b^{2} c^{4} + 10 a^{6} b^{2} c^{4} + 4 a^{6} c^{6} + a^{4} b^{8} - 4 \\sqrt{2} a^{4} b^{6} c^{2} + 4 a^{4} b^{6} c^{2} - 6 \\sqrt{2} a^{4} b^{4} c^{4} + 12 a^{4} b^{4} c^{4} - 2 \\sqrt{2} a^{4} b^{2} c^{6} + 10 a^{4} b^{2} c^{6} + 2 a^{4} c^{8} - 2 \\sqrt{2} a^{2} b^{8} c^{2} - 4 \\sqrt{2} a^{2} b^{6} c^{4} + 4 a^{2} b^{6} c^{4} - 2 \\sqrt{2} a^{2} b^{4} c^{6} + 6 a^{2} b^{4} c^{6} + 2 a^{2} b^{2} c^{8} + 2 b^{8} c^{4} + 4 b^{6} c^{6} + 2 b^{4} c^{8}$" - ], - "text/plain": [ - "a**8*b**4 + 2*a**8*b**2*c**2 + 2*a**8*c**4 + 2*a**6*b**6 - 2*sqrt(2)*a**6*b**4*c**2 + 6*a**6*b**4*c**2 - 2*sqrt(2)*a**6*b**2*c**4 + 10*a**6*b**2*c**4 + 4*a**6*c**6 + a**4*b**8 - 4*sqrt(2)*a**4*b**6*c**2 + 4*a**4*b**6*c**2 - 6*sqrt(2)*a**4*b**4*c**4 + 12*a**4*b**4*c**4 - 2*sqrt(2)*a**4*b**2*c**6 + 10*a**4*b**2*c**6 + 2*a**4*c**8 - 2*sqrt(2)*a**2*b**8*c**2 - 4*sqrt(2)*a**2*b**6*c**4 + 4*a**2*b**6*c**4 - 2*sqrt(2)*a**2*b**4*c**6 + 6*a**2*b**4*c**6 + 2*a**2*b**2*c**8 + 2*b**8*c**4 + 4*b**6*c**6 + 2*b**4*c**8" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{a: 2, b: 2, c: 2}\n" + "ename": "NameError", + "evalue": "name 'fs' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mformula\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmakesubs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mformula\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'[b,oo],[c,oo]'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mnum\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mden\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfraction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcancel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mformula\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mnum\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnum\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mfs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mdisplay\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnum\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mnumm\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'fs' is not defined" ] - }, - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{19 \\sqrt{2}}{12}$" - ], - "text/plain": [ - "19*sqrt(2)/12" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "x\n", - "Optimization terminated successfully.\n", - " Current function value: 1.000000\n", - " Iterations: 147\n", - " Function evaluations: 267\n" - ] - }, - { - "data": { - "text/plain": [ - "(4.4110810020775736e-12, 28.52020821072961, 3.1191098416324057e-12)" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$\\displaystyle \\left( 0, \\ \\frac{57}{2}, \\ 0\\right)$" - ], - "text/plain": [ - "(0, 57/2, 0)" - ] - }, - "execution_count": 107, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -1470,7 +1264,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -1479,7 +1273,7 @@ "1.414211498165453" ] }, - "execution_count": 65, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -1490,7 +1284,7 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -1508,7 +1302,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to a+c$" + "Substitute $a\\to c+r_{1}$" ], "text/plain": [ "" @@ -1520,7 +1314,7 @@ { "data": { "text/latex": [ - "Substitute $c\\to b+c$" + "Substitute $c\\to b+s_{1}$" ], "text/plain": [ "" @@ -1532,7 +1326,7 @@ { "data": { "text/latex": [ - "numerator: $2a^4b^2+2a^4bc+a^4c^2+4a^3b^3+2\\sqrt{2}a^3b^2c+10a^3b^2c+2\\sqrt{2}a^3bc^2+6a^3bc^2+2a^3c^3+2a^2b^4+2\\sqrt{2}a^2b^3c+10a^2b^3c+6\\sqrt{2}a^2b^2c^2+12a^2b^2c^2+4a^2bc^3+4\\sqrt{2}a^2bc^3+a^2c^4+2ab^4c+2\\sqrt{2}ab^3c^2+6ab^3c^2+4ab^2c^3+4\\sqrt{2}ab^2c^3+2\\sqrt{2}abc^4+2b^4c^2+4b^3c^3+2b^2c^4$" + "numerator: $2b^4r_{1}^2+2b^4r_{1}s_{1}+2b^4s_{1}^2+4b^3r_{1}^3+2\\sqrt{2}b^3r_{1}^2s_{1}+10b^3r_{1}^2s_{1}+2\\sqrt{2}b^3r_{1}s_{1}^2+6b^3r_{1}s_{1}^2+4b^3s_{1}^3+2b^2r_{1}^4+2\\sqrt{2}b^2r_{1}^3s_{1}+10b^2r_{1}^3s_{1}+6\\sqrt{2}b^2r_{1}^2s_{1}^2+12b^2r_{1}^2s_{1}^2+4b^2r_{1}s_{1}^3+4\\sqrt{2}b^2r_{1}s_{1}^3+2b^2s_{1}^4+2br_{1}^4s_{1}+2\\sqrt{2}br_{1}^3s_{1}^2+6br_{1}^3s_{1}^2+4br_{1}^2s_{1}^3+4\\sqrt{2}br_{1}^2s_{1}^3+2\\sqrt{2}br_{1}s_{1}^4+r_{1}^4s_{1}^2+2r_{1}^3s_{1}^3+r_{1}^2s_{1}^4$" ], "text/plain": [ "" @@ -1544,7 +1338,7 @@ { "data": { "text/latex": [ - "denominator: $a^2b^4+2a^2b^3c+a^2b^2c^2+2ab^5+6ab^4c+6ab^3c^2+2ab^2c^3+b^6+4b^5c+6b^4c^2+4b^3c^3+b^2c^4$" + "denominator: $b^6+2b^5r_{1}+4b^5s_{1}+b^4r_{1}^2+6b^4r_{1}s_{1}+6b^4s_{1}^2+2b^3r_{1}^2s_{1}+6b^3r_{1}s_{1}^2+4b^3s_{1}^3+b^2r_{1}^2s_{1}^2+2b^2r_{1}s_{1}^3+b^2s_{1}^4$" ], "text/plain": [ "" @@ -1568,7 +1362,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 2a^4b^2+2a^4bc+a^4c^2+4a^3b^3+2\\sqrt{2}a^3b^2c+10a^3b^2c+2\\sqrt{2}a^3bc^2+6a^3bc^2+2a^3c^3+2a^2b^4+2\\sqrt{2}a^2b^3c+10a^2b^3c+6\\sqrt{2}a^2b^2c^2+12a^2b^2c^2+4\\sqrt{2}a^2bc^3+4a^2bc^3+a^2c^4+2ab^4c+2\\sqrt{2}ab^3c^2+6ab^3c^2+4\\sqrt{2}ab^2c^3+4ab^2c^3+2\\sqrt{2}abc^4+2b^4c^2+4b^3c^3+2b^2c^4 $$" + "$$ 0 \\le r_{1}^4s_{1}^2+2br_{1}^4s_{1}+2b^2r_{1}^4+2r_{1}^3s_{1}^3+2\\sqrt{2}br_{1}^3s_{1}^2+6br_{1}^3s_{1}^2+2\\sqrt{2}b^2r_{1}^3s_{1}+10b^2r_{1}^3s_{1}+4b^3r_{1}^3+r_{1}^2s_{1}^4+4\\sqrt{2}br_{1}^2s_{1}^3+4br_{1}^2s_{1}^3+6\\sqrt{2}b^2r_{1}^2s_{1}^2+12b^2r_{1}^2s_{1}^2+2\\sqrt{2}b^3r_{1}^2s_{1}+10b^3r_{1}^2s_{1}+2b^4r_{1}^2+2\\sqrt{2}br_{1}s_{1}^4+4\\sqrt{2}b^2r_{1}s_{1}^3+4b^2r_{1}s_{1}^3+2\\sqrt{2}b^3r_{1}s_{1}^2+6b^3r_{1}s_{1}^2+2b^4r_{1}s_{1}+2b^2s_{1}^4+4b^3s_{1}^3+2b^4s_{1}^2 $$" ], "text/plain": [ "" @@ -1604,7 +1398,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to a+b$" + "Substitute $a\\to b+t_{1}$" ], "text/plain": [ "" @@ -1616,7 +1410,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+c$" + "Substitute $b\\to c+u_{1}$" ], "text/plain": [ "" @@ -1628,7 +1422,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to \\sqrt{2}a$" + "Substitute $t_{1}\\to \\sqrt{2}v_{1}$" ], "text/plain": [ "" @@ -1640,7 +1434,7 @@ { "data": { "text/latex": [ - "numerator: $16a^4b^2+32a^4bc+32a^4c^2+16\\sqrt{2}a^3b^3-32a^3b^2c+48\\sqrt{2}a^3b^2c-32a^3bc^2+80\\sqrt{2}a^3bc^2+32\\sqrt{2}a^3c^3+8a^2b^4-32\\sqrt{2}a^2b^3c+32a^2b^3c-48\\sqrt{2}a^2b^2c^2+96a^2b^2c^2-16\\sqrt{2}a^2bc^3+80a^2bc^3+16a^2c^4-16ab^4c-32ab^3c^2+16\\sqrt{2}ab^3c^2-16ab^2c^3+24\\sqrt{2}ab^2c^3+8\\sqrt{2}abc^4+8b^4c^2+16b^3c^3+8b^2c^4$" + "numerator: $8c^4u_{1}^2+8\\sqrt{2}c^4u_{1}v_{1}+16c^4v_{1}^2+16c^3u_{1}^3-16c^3u_{1}^2v_{1}+24\\sqrt{2}c^3u_{1}^2v_{1}-16\\sqrt{2}c^3u_{1}v_{1}^2+80c^3u_{1}v_{1}^2+32\\sqrt{2}c^3v_{1}^3+8c^2u_{1}^4-32c^2u_{1}^3v_{1}+16\\sqrt{2}c^2u_{1}^3v_{1}-48\\sqrt{2}c^2u_{1}^2v_{1}^2+96c^2u_{1}^2v_{1}^2-32c^2u_{1}v_{1}^3+80\\sqrt{2}c^2u_{1}v_{1}^3+32c^2v_{1}^4-16cu_{1}^4v_{1}-32\\sqrt{2}cu_{1}^3v_{1}^2+32cu_{1}^3v_{1}^2-32cu_{1}^2v_{1}^3+48\\sqrt{2}cu_{1}^2v_{1}^3+32cu_{1}v_{1}^4+8u_{1}^4v_{1}^2+16\\sqrt{2}u_{1}^3v_{1}^3+16u_{1}^2v_{1}^4$" ], "text/plain": [ "" @@ -1652,7 +1446,7 @@ { "data": { "text/latex": [ - "denominator: $2a^2b^2c^2+4a^2bc^3+2a^2c^4+2\\sqrt{2}ab^3c^2+6\\sqrt{2}ab^2c^3+6\\sqrt{2}abc^4+2\\sqrt{2}ac^5+b^4c^2+4b^3c^3+6b^2c^4+4bc^5+c^6$" + "denominator: $c^6+4c^5u_{1}+2\\sqrt{2}c^5v_{1}+6c^4u_{1}^2+6\\sqrt{2}c^4u_{1}v_{1}+2c^4v_{1}^2+4c^3u_{1}^3+6\\sqrt{2}c^3u_{1}^2v_{1}+4c^3u_{1}v_{1}^2+c^2u_{1}^4+2\\sqrt{2}c^2u_{1}^3v_{1}+2c^2u_{1}^2v_{1}^2$" ], "text/plain": [ "" @@ -1688,7 +1482,7 @@ { "data": { "text/latex": [ - "$$32a^3b^2c \\le 16a^4b^2+16a^2b^2c^2$$" + "$$16cu_{1}^4v_{1} \\le 8u_{1}^4v_{1}^2+8c^2u_{1}^4$$" ], "text/plain": [ "" @@ -1700,7 +1494,7 @@ { "data": { "text/latex": [ - "$$32\\sqrt{2}a^2b^3c \\le 16\\sqrt{2}a^3b^3+16\\sqrt{2}ab^3c^2$$" + "$$32\\sqrt{2}cu_{1}^3v_{1}^2 \\le 16\\sqrt{2}u_{1}^3v_{1}^3+16\\sqrt{2}c^2u_{1}^3v_{1}$$" ], "text/plain": [ "" @@ -1712,7 +1506,7 @@ { "data": { "text/latex": [ - "$$48\\sqrt{2}a^2b^2c^2 \\le 24\\sqrt{2}a^3b^2c+24\\sqrt{2}ab^2c^3$$" + "$$32c^2u_{1}^3v_{1} \\le 16cu_{1}^3v_{1}^2+16c^3u_{1}^3$$" ], "text/plain": [ "" @@ -1724,7 +1518,7 @@ { "data": { "text/latex": [ - "$$16\\sqrt{2}a^2bc^3 \\le 8\\sqrt{2}a^3bc^2+8\\sqrt{2}abc^4$$" + "$$32cu_{1}^2v_{1}^3 \\le 16cu_{1}^3v_{1}^2+16cu_{1}v_{1}^4$$" ], "text/plain": [ "" @@ -1736,7 +1530,7 @@ { "data": { "text/latex": [ - "$$16ab^4c \\le 8a^2b^4+8b^4c^2$$" + "$$48\\sqrt{2}c^2u_{1}^2v_{1}^2 \\le 24\\sqrt{2}cu_{1}^2v_{1}^3+24\\sqrt{2}c^3u_{1}^2v_{1}$$" ], "text/plain": [ "" @@ -1748,7 +1542,7 @@ { "data": { "text/latex": [ - "$$32ab^3c^2 \\le 16a^2b^3c+16b^3c^3$$" + "$$16c^3u_{1}^2v_{1} \\le 8c^2u_{1}^2v_{1}^2+8c^4u_{1}^2$$" ], "text/plain": [ "" @@ -1760,7 +1554,7 @@ { "data": { "text/latex": [ - "$$32a^3bc^2 \\le 16a^4bc+16a^2bc^3$$" + "$$32c^2u_{1}v_{1}^3 \\le 16u_{1}^2v_{1}^4+16c^4v_{1}^2$$" ], "text/plain": [ "" @@ -1772,7 +1566,7 @@ { "data": { "text/latex": [ - "$$16ab^2c^3 \\le 8a^2b^2c^2+8b^2c^4$$" + "$$16\\sqrt{2}c^3u_{1}v_{1}^2 \\le 8\\sqrt{2}c^2u_{1}v_{1}^3+8\\sqrt{2}c^4u_{1}v_{1}$$" ], "text/plain": [ "" @@ -1784,7 +1578,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 16a^4bc+32a^4c^2+24\\sqrt{2}a^3b^2c+72\\sqrt{2}a^3bc^2+32\\sqrt{2}a^3c^3+16a^2b^3c+72a^2b^2c^2+64a^2bc^3+16a^2c^4 $$" + "$$ 0 \\le 24\\sqrt{2}cu_{1}^2v_{1}^3+88c^2u_{1}^2v_{1}^2+16cu_{1}v_{1}^4+72\\sqrt{2}c^2u_{1}v_{1}^3+80c^3u_{1}v_{1}^2+32c^2v_{1}^4+32\\sqrt{2}c^3v_{1}^3 $$" ], "text/plain": [ "" @@ -1807,11 +1601,14 @@ }, { "data": { + "text/latex": [ + "$\\displaystyle - \\frac{2 \\sqrt{2} \\left(a - b\\right)}{c} + \\frac{\\left(a - b\\right)^{2}}{c^{2}} - \\frac{2 \\sqrt{2} \\left(- a + c\\right)}{b} + \\frac{\\left(- a + c\\right)^{2}}{b^{2}} - \\frac{2 \\sqrt{2} \\left(b - c\\right)}{a} + \\frac{\\left(b - c\\right)^{2}}{a^{2}}$" + ], "text/plain": [ - "0" + "-2*sqrt(2)*(a - b)/c + (a - b)**2/c**2 - 2*sqrt(2)*(-a + c)/b + (-a + c)**2/b**2 - 2*sqrt(2)*(b - c)/a + (b - c)**2/a**2" ] }, - "execution_count": 111, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1823,18 +1620,19 @@ "prove(formula1)\n", "display(Latex('Case $a\\ge b\\ge c$'))\n", "formula2=makesubs(formula,'[b,oo],[c,oo]')\n", - "prove(formula2*4,values='2**(1/2),1,1')" + "prove(formula2*4,values='1,sqrt(2),1')\n", + "formula" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "Substitute $a\\to a+b$" + "Substitute $a\\to b+w_{1}$" ], "text/plain": [ "" @@ -1846,7 +1644,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+c$" + "Substitute $b\\to c+x_{1}$" ], "text/plain": [ "" @@ -1870,7 +1668,7 @@ { "data": { "text/latex": [ - "numerator: $4a^4b^2+8a^4bc+8a^4c^2+4\\sqrt{2}a^3b^3-8a^3b^2c+12\\sqrt{2}a^3b^2c-8a^3bc^2+20\\sqrt{2}a^3bc^2+8\\sqrt{2}a^3c^3+2a^2b^4-8\\sqrt{2}a^2b^3c+8a^2b^3c-12\\sqrt{2}a^2b^2c^2+24a^2b^2c^2-4\\sqrt{2}a^2bc^3+20a^2bc^3+4a^2c^4-4ab^4c-8ab^3c^2+4\\sqrt{2}ab^3c^2-4ab^2c^3+6\\sqrt{2}ab^2c^3+2\\sqrt{2}abc^4+2b^4c^2+4b^3c^3+2b^2c^4$" + "numerator: $2c^4w_{1}^2+2c^4w_{1}x_{1}+2c^4x_{1}^2+4c^3w_{1}^3-2\\sqrt{2}c^3w_{1}^2x_{1}+10c^3w_{1}^2x_{1}-2\\sqrt{2}c^3w_{1}x_{1}^2+6c^3w_{1}x_{1}^2+4c^3x_{1}^3+2c^2w_{1}^4-2\\sqrt{2}c^2w_{1}^3x_{1}+10c^2w_{1}^3x_{1}-6\\sqrt{2}c^2w_{1}^2x_{1}^2+12c^2w_{1}^2x_{1}^2-4\\sqrt{2}c^2w_{1}x_{1}^3+4c^2w_{1}x_{1}^3+2c^2x_{1}^4+2cw_{1}^4x_{1}-2\\sqrt{2}cw_{1}^3x_{1}^2+6cw_{1}^3x_{1}^2-4\\sqrt{2}cw_{1}^2x_{1}^3+4cw_{1}^2x_{1}^3-2\\sqrt{2}cw_{1}x_{1}^4+w_{1}^4x_{1}^2+2w_{1}^3x_{1}^3+w_{1}^2x_{1}^4$" ], "text/plain": [ "" @@ -1894,7 +1692,7 @@ { "data": { "text/latex": [ - "status: 0" + "status: 2" ], "text/plain": [ "" @@ -1906,7 +1704,7 @@ { "data": { "text/latex": [ - "From weighted AM-GM inequality:" + "Program couldn't find any proof." ], "text/plain": [ "" @@ -1918,115 +1716,7 @@ { "data": { "text/latex": [ - "$$8a^3b^2c \\le 4a^4b^2+4a^2b^2c^2$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$8\\sqrt{2}a^2b^3c \\le 4\\sqrt{2}a^3b^3+4\\sqrt{2}ab^3c^2$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$12\\sqrt{2}a^2b^2c^2 \\le 6\\sqrt{2}a^3b^2c+6\\sqrt{2}ab^2c^3$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$4\\sqrt{2}a^2bc^3 \\le 2\\sqrt{2}a^3bc^2+2\\sqrt{2}abc^4$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$4ab^4c \\le 2a^2b^4+2b^4c^2$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$8ab^3c^2 \\le 4a^2b^3c+4b^3c^3$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$8a^3bc^2 \\le 4a^4bc+4a^2bc^3$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$4ab^2c^3 \\le 2a^2b^2c^2+2b^2c^4$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$ 0 \\le 4a^4bc+8a^4c^2+6\\sqrt{2}a^3b^2c+18\\sqrt{2}a^3bc^2+8\\sqrt{2}a^3c^3+4a^2b^3c+18a^2b^2c^2+16a^2bc^3+4a^2c^4 $$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "The sum of all inequalities gives us a proof of the inequality." + "$$ 2\\sqrt{2}cw_{1}x_{1}^4+4\\sqrt{2}cw_{1}^2x_{1}^3+4\\sqrt{2}c^2w_{1}x_{1}^3+2\\sqrt{2}cw_{1}^3x_{1}^2+6\\sqrt{2}c^2w_{1}^2x_{1}^2+2\\sqrt{2}c^3w_{1}x_{1}^2+2\\sqrt{2}c^2w_{1}^3x_{1}+2\\sqrt{2}c^3w_{1}^2x_{1} \\le w_{1}^2x_{1}^4+2c^2x_{1}^4+2w_{1}^3x_{1}^3+4cw_{1}^2x_{1}^3+4c^2w_{1}x_{1}^3+4c^3x_{1}^3+w_{1}^4x_{1}^2+6cw_{1}^3x_{1}^2+12c^2w_{1}^2x_{1}^2+6c^3w_{1}x_{1}^2+2c^4x_{1}^2+2cw_{1}^4x_{1}+10c^2w_{1}^3x_{1}+10c^3w_{1}^2x_{1}+2c^4w_{1}x_{1}+2c^2w_{1}^4+4c^3w_{1}^3+2c^4w_{1}^2 $$" ], "text/plain": [ "" @@ -2038,10 +1728,10 @@ { "data": { "text/plain": [ - "0" + "2" ] }, - "execution_count": 27, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -2057,7 +1747,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -2066,7 +1756,7 @@ "(1, (x, y, sqrt(2)))" ] }, - "execution_count": 28, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -2077,7 +1767,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -2086,7 +1776,7 @@ "(1, (x, y, sqrt(2)))" ] }, - "execution_count": 29, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -2097,7 +1787,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -2106,7 +1796,7 @@ "[(1, 1, 1), (0, 0, 0)]" ] }, - "execution_count": 30, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -2117,7 +1807,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -2126,7 +1816,7 @@ "[1, 58]" ] }, - "execution_count": 31, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -2137,7 +1827,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -2146,7 +1836,7 @@ "(x, y, sqrt(2), sqrt(3), sqrt(6))" ] }, - "execution_count": 32, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -2157,7 +1847,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -2166,7 +1856,7 @@ "([0], [(0, 0)], [1, 7], [(2, 0), (0, 1)], (x, y))" ] }, - "execution_count": 33, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -2188,7 +1878,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -2281,7 +1971,7 @@ "0" ] }, - "execution_count": 34, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -2292,7 +1982,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -2301,7 +1991,7 @@ "[[(1, 0), (0, 2), (0, 1), (0, 0)], [1, 1, 1, 1]]" ] }, - "execution_count": 35, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -2312,7 +2002,7 @@ }, { "cell_type": "code", - "execution_count": 168, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -2324,7 +2014,7 @@ "Poly(x + (sqrt(x)), x, sqrt(x), domain='ZZ')" ] }, - "execution_count": 168, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -2336,7 +2026,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 39, "metadata": {}, "outputs": [], "source": [ @@ -2345,7 +2035,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -2357,7 +2047,7 @@ "Poly(x**2 + 1, x, domain='ZZ')" ] }, - "execution_count": 42, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -2368,7 +2058,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -2380,7 +2070,7 @@ "Poly(x*(1/(x + y)), x, 1/(x + y), domain='ZZ')" ] }, - "execution_count": 43, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -2391,7 +2081,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -2403,7 +2093,7 @@ "Poly(x + (sqrt(x)) + (x**(1/3))**2 + (x**(1/3)) + (x**(1/4)) + sqrt(2), x, sqrt(x), x**(1/3), x**(1/4), domain='QQ')" ] }, - "execution_count": 44, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -2414,7 +2104,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -2423,7 +2113,7 @@ "[1, sqrt(6)]" ] }, - "execution_count": 45, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -2434,7 +2124,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 44, "metadata": {}, "outputs": [ { @@ -2443,7 +2133,7 @@ "[1, x]" ] }, - "execution_count": 47, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -2454,9 +2144,22 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 45, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/decorators.py:38: SymPyDeprecationWarning: \n", + "\n", + "source has been deprecated since SymPy 1.3. Use ?? in IPython/Jupyter\n", + "or inspect.getsource instead. See\n", + "https://github.com/sympy/sympy/issues/14905 for more info.\n", + "\n", + " _warn_deprecation(wrapped, 3)\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -6569,19 +6272,6 @@ " return isinstance(g, f.__class__) and f.gens == g.gens and f.rep.eq(g.rep, strict=True)\n", "\n" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/decorators.py:38: SymPyDeprecationWarning: \n", - "\n", - "source has been deprecated since SymPy 1.3. Use ?? in IPython/Jupyter\n", - "or inspect.getsource instead. See\n", - "https://github.com/sympy/sympy/issues/14905 for more info.\n", - "\n", - " _warn_deprecation(wrapped, 3)\n" - ] } ], "source": [ @@ -6590,7 +6280,7 @@ }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 46, "metadata": {}, "outputs": [ { @@ -6602,7 +6292,7 @@ "Poly((sqrt(x))**2 + (sqrt(x)), sqrt(x), domain='ZZ')" ] }, - "execution_count": 126, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -6613,7 +6303,7 @@ }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -6625,7 +6315,7 @@ "-x + sqrt(x**2)" ] }, - "execution_count": 115, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -6637,7 +6327,7 @@ }, { "cell_type": "code", - "execution_count": 130, + "execution_count": 48, "metadata": {}, "outputs": [ { @@ -6646,7 +6336,7 @@ "\"Poly((sqrt(x))**4 + (sqrt(x))**2 + (sqrt(x)), sqrt(x), domain='ZZ')\"" ] }, - "execution_count": 130, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -6657,7 +6347,7 @@ }, { "cell_type": "code", - "execution_count": 131, + "execution_count": 49, "metadata": {}, "outputs": [ { @@ -6666,7 +6356,7 @@ "\"Poly(x**2 + x + (sqrt(x)), x, sqrt(x), domain='ZZ')\"" ] }, - "execution_count": 131, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -6677,13 +6367,13 @@ }, { "cell_type": "code", - "execution_count": 164, + "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "Substitute $a\\to a+b$" + "Substitute $a\\to b+y_{1}$" ], "text/plain": [ "" @@ -6695,7 +6385,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+c$" + "Substitute $b\\to c+z_{1}$" ], "text/plain": [ "" @@ -6717,7 +6407,7 @@ { "data": { "text/plain": [ - "(2.5326984818340415e-10, 7.129450063690368, 1.7908873553542452e-10)" + "(1.7908873553542452e-10, 2.5326984818340415e-10, 7.129450063690368)" ] }, "metadata": {}, @@ -6726,20 +6416,21 @@ { "data": { "text/plain": [ - "1.4142142855953455" + "2.5119572187973787e-11" ] }, - "execution_count": 164, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def findvalues(formula,values=None,variables=None):\n", + " formula=S(formula)\n", " num,den=fractioncancel(formula)\n", " if variables==None:\n", " variables=sorted(num.free_symbols,key=str)\n", - " num=num.subs(zip(variables,list(map(lambda x:x**2,fs))))\n", + " num=num.subs(zip(variables,list(map(lambda x:x**2,variables))))\n", " num=Poly(num)\n", " newformula=S((num.abs()+num)/(num.abs()-num))\n", " f=lambdify(variables,newformula)\n", @@ -6758,13 +6449,13 @@ }, { "cell_type": "code", - "execution_count": 156, + "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "Substitute $a\\to a+b$" + "Substitute $a\\to b+e_{2}$" ], "text/plain": [ "" @@ -6776,7 +6467,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+c$" + "Substitute $b\\to c+f_{2}$" ], "text/plain": [ "" @@ -6790,29 +6481,19 @@ "output_type": "stream", "text": [ "ok\n", - "100 loops, best of 5: 9.06 ms per loop\n" + "100 loops, best of 5: 8.66 ms per loop\n", + "1000 loops, best of 5: 1.31 ms per loop\n" ] }, { - "ename": "TypeError", - "evalue": "int() argument must be a string, a bytes-like object or a number, not 'dict'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'ok'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmagic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'timeit evaluate((random(),random(),random()))'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmagic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'timeit evaluate2((random(),random(),random()))'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 19\u001b[0m \u001b[0mPoly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'x^2+sqrt(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0meval\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/IPython/core/interactiveshell.py\u001b[0m in \u001b[0;36mmagic\u001b[0;34m(self, arg_s)\u001b[0m\n\u001b[1;32m 2158\u001b[0m \u001b[0mmagic_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmagic_arg_s\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marg_s\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpartition\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m' '\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2159\u001b[0m \u001b[0mmagic_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmagic_name\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlstrip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprefilter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mESC_MAGIC\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2160\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmagic_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmagic_arg_s\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2161\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2162\u001b[0m \u001b[0;31m#-------------------------------------------------------------------------\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/IPython/core/interactiveshell.py\u001b[0m in \u001b[0;36mrun_line_magic\u001b[0;34m(self, magic_name, line)\u001b[0m\n\u001b[1;32m 2079\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'local_ns'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getframe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstack_depth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf_locals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2080\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2081\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2082\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2083\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell)\u001b[0m\n", - "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/IPython/core/magic.py\u001b[0m in \u001b[0;36m\u001b[0;34m(f, *a, **k)\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 187\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 188\u001b[0;31m \u001b[0mcall\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 189\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 190\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell)\u001b[0m\n\u001b[1;32m 1055\u001b[0m \u001b[0mnumber\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1056\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1057\u001b[0;31m \u001b[0mtime_number\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1058\u001b[0m \u001b[0mworst_tuning\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mworst_tuning\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime_number\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1059\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtime_number\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0;36m0.2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, number)\u001b[0m\n\u001b[1;32m 137\u001b[0m \u001b[0mgc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdisable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 138\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 139\u001b[0;31m \u001b[0mtiming\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 140\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 141\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgcold\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36minner\u001b[0;34m(_it, _timer)\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mevaluate2\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnewformula\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevalf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msubs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mevaluate2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mnum1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevalf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnum2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevalf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0;31m#display(num2.eval(dict(zip(fs,(1,1,1)))))\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'ok'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/evalf.py\u001b[0m in \u001b[0;36mevalf\u001b[0;34m(self, n, subs, maxn, chop, strict, quad, verbose)\u001b[0m\n\u001b[1;32m 1432\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mevalf_table\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1433\u001b[0m \u001b[0m_create_evalf_table\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1434\u001b[0;31m \u001b[0mprec\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdps_to_prec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1435\u001b[0m options = {'maxprec': max(prec, int(maxn*LG10)), 'chop': chop,\n\u001b[1;32m 1436\u001b[0m 'strict': strict, 'verbose': verbose}\n", - "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/mpmath/libmp/libmpf.py\u001b[0m in \u001b[0;36mdps_to_prec\u001b[0;34m(n)\u001b[0m\n\u001b[1;32m 65\u001b[0m \"\"\"Return the number of bits required to represent n decimals\n\u001b[1;32m 66\u001b[0m accurately.\"\"\"\n\u001b[0;32m---> 67\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mround\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m3.3219280948873626\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 68\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrepr_dps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: int() argument must be a string, a bytes-like object or a number, not 'dict'" - ] + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -6829,7 +6510,7 @@ "def evaluate(x):\n", " return newformula.evalf(subs=dict(zip(fs,(1,1,1))))\n", "def evaluate2(x):\n", - " return num1.evalf(dict(zip(fs,x)))/num2.eval(dict(zip(fs,x)))\n", + " return num1.eval(dict(zip(fs,x)))/num2.eval(dict(zip(fs,x)))\n", "#display(num2.eval(dict(zip(fs,(1,1,1)))))\n", "print('ok')\n", "%timeit evaluate((random(),random(),random()))\n", @@ -6839,18 +6520,9 @@ }, { "cell_type": "code", - "execution_count": 162, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100000 loops, best of 5: 6.56 µs per loop\n", - "100000 loops, best of 5: 6.39 µs per loop\n" - ] - } - ], + "outputs": [], "source": [ "evaluate4=lambdify(fs,newformula)\n", "evaluate5=lambda x:evaluate4(*x)\n", @@ -6860,19 +6532,9 @@ }, { "cell_type": "code", - "execution_count": 172, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "first attempt: Poly(x**2 + x + (sqrt(x)), x, sqrt(x), domain='ZZ')\n", - "second attempt: Poly(x**2 + x + (sqrt(x)), x, sqrt(x), domain='ZZ')\n", - "third attempt: Poly((sqrt(x))**4 + (sqrt(x))**2 + (sqrt(x)), sqrt(x), domain='ZZ')\n" - ] - } - ], + "outputs": [], "source": [ "from sympy import *\n", "print('first attempt:',Poly('x^2+x+sqrt(x)'))\n", @@ -6883,7 +6545,7 @@ }, { "cell_type": "code", - "execution_count": 176, + "execution_count": 52, "metadata": {}, "outputs": [ { @@ -6895,7 +6557,7 @@ "sqrt(x) + x" ] }, - "execution_count": 176, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -6906,7 +6568,7 @@ }, { "cell_type": "code", - "execution_count": 178, + "execution_count": 55, "metadata": {}, "outputs": [ { @@ -6915,7 +6577,7 @@ "(x*(1 - x), [])" ] }, - "execution_count": 178, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -6927,7 +6589,7 @@ }, { "cell_type": "code", - "execution_count": 206, + "execution_count": 56, "metadata": {}, "outputs": [ { @@ -6936,7 +6598,7 @@ "True" ] }, - "execution_count": 206, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -6948,7 +6610,7 @@ }, { "cell_type": "code", - "execution_count": 223, + "execution_count": 57, "metadata": {}, "outputs": [ { @@ -6957,7 +6619,7 @@ "(x, 1/2)" ] }, - "execution_count": 223, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" } @@ -6968,21 +6630,16 @@ }, { "cell_type": "code", - "execution_count": 222, + "execution_count": 58, "metadata": {}, "outputs": [ { - "data": { - "text/latex": [ - "$\\displaystyle \\operatorname{Poly}{\\left( x^{2} + y^{2} + \\sqrt{x + y} + \\sqrt{x} + \\sqrt[3]{x_{12}}, x, y, \\sqrt{x + y}, \\sqrt{x}, \\sqrt[3]{x_{12}}, domain=\\mathbb{Z} \\right)}$" - ], - "text/plain": [ - "Poly(x**2 + y**2 + (sqrt(x + y)) + (sqrt(x)) + (x12**(1/3)), x, y, sqrt(x + y), sqrt(x), x12**(1/3), domain='ZZ')" - ] - }, - "execution_count": 222, - "metadata": {}, - "output_type": "execute_result" + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 12)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m12\u001b[0m\n\u001b[0;31m newgens[gen[0]]=\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] } ], "source": [ @@ -6992,11 +6649,11 @@ "\telse:\n", "\t\treturn [formula,S('1')]\n", "pol=Poly('x**2+y**2+sqrt(x+y)+x**(1/2)+x**(1/3)')\n", - "genes=pol.gens\n", "newgens={}\n", - "for gen in genes:\n", - " gen=_powr(gen):\n", - " if gen[0] in newgens:\n", + "for gen in pol.gens:\n", + " base,pw=_powr(gen)\n", + " num,den=fraction(pw)\n", + " if (gen[0],num) in newgens:\n", " newgens[gen[0]]=\n", " else:\n", " newgens[gen[0]]=gen[1]" @@ -7004,27 +6661,27 @@ }, { "cell_type": "code", - "execution_count": 227, + "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "sympy.core.add.Add" + "True" ] }, - "execution_count": 227, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "S('x+y*6').func==" + "isinstance(S('1'),Rational)" ] }, { "cell_type": "code", - "execution_count": 229, + "execution_count": 60, "metadata": {}, "outputs": [ { @@ -7033,7 +6690,7 @@ "False" ] }, - "execution_count": 229, + "execution_count": 60, "metadata": {}, "output_type": "execute_result" } @@ -7042,6 +6699,1925 @@ "6 in {3:4,5:6}" ] }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle 1$" + ], + "text/plain": [ + "1" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from math import *\n", + "from sympy import *\n", + "gcd(S('a/b'),S('c/d'))" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( x^{2 \\pi}, x^{\\pi}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly((x**pi)**2, x**pi, domain='ZZ')" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly('x^(2*pi)')" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{1}{8}$" + ], + "text/plain": [ + "1/8" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gcd(S('1/8'),S('1/4'))" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(3, (x, sqrt(2)))" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "S('sqrt(2)*3*x').as_coeff_mul()" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Poly((sqrt(x))**4 + (sqrt(x))**2 + (sqrt(x)), sqrt(x), domain='ZZ')\n", + "Poly((x**(1/6))**12 + (x**(1/6))**3 + (x**(1/6))**2 + y**2, x**(1/6), y, domain='ZZ')\n", + "Poly((sqrt(x)) + (sqrt(x*z)) + (sqrt(z)), sqrt(x), sqrt(x*z), sqrt(z), domain='ZZ')\n", + "Poly((sqrt(x))*(sqrt(z)) + (sqrt(x)) + (sqrt(z)), sqrt(x), sqrt(z), domain='ZZ')\n", + "Poly((sqrt(t + z)) + (sqrt(t*x + t*y + x*z + y*z)) + (sqrt(x + y)), sqrt(t + z), sqrt(t*x + t*y + x*z + y*z), sqrt(x + y), domain='ZZ')\n", + "Poly((sqrt(2)) + (sqrt(3)) + (sqrt(6)), sqrt(2), sqrt(3), sqrt(6), domain='ZZ')\n" + ] + } + ], + "source": [ + "def _powr(formula):\n", + "\tif formula.func==Pow:\n", + "\t\treturn formula.args\n", + "\telse:\n", + "\t\treturn [formula,S('1')]\n", + "def reducegens(formula):\n", + "\tpol=Poly(formula)\n", + "\tnewgens={}\n", + "\tind={}\n", + "\tfor gen in pol.gens:\n", + "\t\tbase,pw=_powr(gen)\n", + "\t\tcoef,_=pw.as_coeff_mul()\n", + "\t\tml=pw/coef\n", + "\t\tif base**ml in newgens:\n", + "\t\t\tnewgens[base**ml]=gcd(newgens[base**ml],coef)\n", + "\t\telse:\n", + "\t\t\tnewgens[base**ml]=coef\n", + "\t\t\tind[base**ml]=S('tmp'+str(len(ind)))\n", + "\tfor gen in pol.gens:\n", + "\t\tbase,pw=_powr(gen)\n", + "\t\tcoef,_=pw.as_coeff_mul()\n", + "\t\tml=pw/coef\n", + "\t\tpol=pol.replace(gen,ind[base**ml]**(coef/newgens[base**ml]))\n", + "\tnewpol=Poly(pol.as_expr())\n", + "\tfor gen in newgens:\n", + "\t\tnewpol=newpol.replace(ind[gen],gen**newgens[gen])\n", + "\treturn newpol\n", + "print(reducegens(S('x^2+x+sqrt(x)')))\n", + "print(reducegens(S('x**2+y**2+x**(1/2)+x**(1/3)')))\n", + "print(reducegens(S('sqrt(x)+sqrt(z)+sqrt(x*z)')))\n", + "print(reducegens(S('sqrt(x)+sqrt(z)+sqrt(x)*sqrt(z)')))\n", + "print(reducegens(S('sqrt(x+y)+sqrt(z+t)+sqrt((x+y)*(z+t))')))\n", + "print(reducegens(S('sqrt(2)+sqrt(3)+sqrt(6)')))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "S('-2').as_coeff_mul()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x=Symbol('x', positive=True)\n", + "y=Symbol('y', positive=True)\n", + "Poly(sqrt(x)+sqrt(y)+sqrt(x*y))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sqrt(x*y)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "simplify(S('sqrt(x*y)-sqrt(x)*sqrt(y)'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x=symbols('x',positive=True)\n", + "ask(Q.positive(x))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Poly('x^2+x')+Poly('-x+7')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(reducegens(S('sqrt(8)')))\n", + "sqrt(-1*-1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Poly('sqrt(2*x)+sqrt(3*x)+sqrt(6*x)')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Poly('sqrt(2*pi)+sqrt(3*pi)')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "solve(S('sqrt(6*x)')-S('sqrt(2*y)'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Poly('sqrt(6)+sqrt(10)+sqrt(14)+sqrt(15)+sqrt(21)+sqrt(35)+sqrt()')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from shiroindev import *\n", + "formula=S('(a+b-c)^2')\n", + "prove(makesubs(formula,'[c,oo]'))\n", + "prove(makesubs(formula,'[a,oo]',variables='c'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "formula=S('(a+b-d)^2+(a+b-c)^2')\n", + "prove(makesubs(formula,'[a+b,oo],[a+b,oo]',variables='c,d'))\n", + "prove(makesubs(formula,'[0,a+b],[a+b,oo]',variables='c,d'))\n", + "prove(makesubs(formula,'[0,a+b],[0,a+b]',variables='c,d'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "findvalues(formula)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "display(cyclize('((a-b)/c)^2'))\n", + "display(S('sqrt(8)')*cyclize('(a-b)/c'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "formula=cyclize('((a-b)/c)^2-8**(1/2)*(a-b)/c')\n", + "display(Latex('Case $a\\ge c\\ge b$'))\n", + "formula1=makesubs(formula,'[c,oo],[b,oo]',variables='a,c,b')\n", + "prove(formula1)\n", + "display(Latex('Case $a\\ge b\\ge c$'))\n", + "formula2=makesubs(formula,'[b,oo],[c,oo]')\n", + "prove(formula2*4,values='2**(1/2),1,1')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "formula=cyclize('((a-b)/c)^2-8**(1/2)*(a-b)/c')\n", + "formula2=makesubs(formula,'[c,oo],[c,oo]')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "findvalues(formula2,values=[5,2,7])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x,y=symbols('x,y')\n", + "ask(Q.positive(x**2+1),Q.real(x))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "formula=Sm('(a^2+b^2+c^2)^2- 3(a^3b+b^3c+c^3a)')\n", + "formula1=makesubs(formula,'[b,oo],[c,oo]',variables='a,b')\n", + "formula2=makesubs(formula,'[c,oo],[b,oo]',variables='a,c')\n", + "prove(formula2)\n", + "print(findvalues(formula1))\n", + "#prove(formula1,values='4*b*(1-b)-1,4*c*(1-c)-1,1')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "makesubs(Sm('a^2-2ab+bc-c^2+ca'),'[c,oo],[a,oo]',variables='b,c')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - \\sqrt{x} \\sqrt{y} + \\sqrt{x y}$" + ], + "text/plain": [ + "-sqrt(x)*sqrt(y) + sqrt(x*y)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle 0$" + ], + "text/plain": [ + "0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "formula=S('sqrt(x*y)-sqrt(x)*sqrt(y)')\n", + "display(formula)\n", + "def assumeall(formula,**kwargs):\n", + " formula=S(formula)\n", + " fs=formula.free_symbols\n", + " for x in fs:\n", + " y=Symbol(str(x),**kwargs)\n", + " formula=formula.subs(x,y)\n", + " return formula\n", + "display(assumeall(formula,positive=True))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Poly(assumeall('x+sqrt(x)',positive=True))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "str(type(S('f1(x,y,z)')))=='f1'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ReprPrinter?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "srepr(S('x^2+f(x)+f(x,y)+f()+sqrt(y)'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import Function,srepr,S\n", + "import re\n", + "f=Function('f')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def allsymbols(formula):\n", + " formula=S(formula)\n", + " funcsymbols=[x[10:-2] for x in re.findall(r\"Function\\(\\'.*?\\'\\)\",srepr(formula))]\n", + " return set(funcsymbols)|set(map(str,formula.free_symbols))\n", + "def vargen(n):\n", + " x='abcdefghijklmnopqrstuvwxyz'[n%26]\n", + " if n>=26:\n", + " x+=str(n//26)\n", + " return x\n", + "allsymbols(S('f(5,7)+f(5)+g(8)+sqrt(x*y)'))\n", + "vargen(36)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import *\n", + "from sympy.printing.repr import *\n", + "ReprPrinter??" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "{5,7} | {8,7}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "[x[10:-2] for x in re.findall(r\"Function\\(\\'.*?\\'\\)\",srepr(S('x^2')))]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "S('f(5,7)+f(5)+g(8)+sqrt(x*y)')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "srepr(S('f(5,7)+f(5)+g(8)+sqrt(x*y)'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "display(Latex('$'+str(S('z12345'))+'$'))" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "invalid literal for int() with base 10: ''", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;34m'xyz'\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mValueError\u001b[0m: invalid literal for int() with base 10: ''" + ] + } + ], + "source": [ + "'xyz'[-2::]" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "def sortkey(x):\n", + " x=str(x)\n", + " i=len(x)-1\n", + " while i>=0:\n", + " if x[i] not in '0123456789':\n", + " break\n", + " i-=1\n", + " if i==len(x)-1:\n", + " return (-1,x)\n", + " return (int(x[i+1:]),x[:i+1])" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[x, y, x0, qq1, z1, t2]" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted(S('x,y,z1,t2,qq1,x0'),key=sortkey)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimization terminated successfully.\n", + " Current function value: 1.154701\n", + " Iterations: 85\n", + " Function evaluations: 152\n" + ] + }, + { + "data": { + "text/plain": [ + "[1.0,\n", + " 3.000209557356011,\n", + " 3.9998018341331227,\n", + " 2.9997236704279775,\n", + " 0.999903278712487]" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "S('x_1^2+x_2^2+x_3^2+x_4^2+x_5^2')\n", + "formula=S('x_1^2+x_2^2+x_3^2+x_4^2+x_5^2- (x_1*x_2+x_2*x_3+x_3*x_4+x_4*x_5)')\n", + "values=findvalues(formula)\n", + "values=[value/values[0] for value in values]\n", + "[value**2 for value in values]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{2 \\sqrt{3}}{3}$" + ], + "text/plain": [ + "2*sqrt(3)/3" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "formula1=S('(x_1^2+x_2^2+x_3^2+x_4^2+x_5^2)/(x_1*x_2+x_2*x_3+x_3*x_4+x_4*x_5)')\n", + "formula1.subs(S('[[x_1,1],[x_2,sqrt(3)],[x_3,2],[x_4,sqrt(3)],[x_5,1]]'))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "formula2=S('x_1^2+x_2^2+x_3^2+x_4^2+x_5^2- (2/sqrt(3))*(x_1*x_2+x_2*x_3+x_3*x_4+x_4*x_5)')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "Substitute $x_{2}\\to \\sqrt{3} g$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $x_{3}\\to 2 h$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $x_{4}\\to \\sqrt{3} i$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "numerator: $3 g^{2} - 4 g h - 2 g x_{1} + 4 h^{2} - 4 h i + 3 i^{2} - 2 i x_{5} + x_{1}^{2} + x_{5}^{2}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $1$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "status: 0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "From weighted AM-GM inequality:" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$4 g h \\le 2 g^{2}+2 h^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 g x_{1} \\le g^{2}+x_{1}^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$4 h i \\le 2 h^{2}+2 i^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 i x_{5} \\le i^{2}+x_{5}^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ 0 \\le 0 $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "The sum of all inequalities gives us a proof of the inequality." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prove(formula2,values='1,sqrt(3),2,sqrt(3),1')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{k}a^{n}, a^{k}, a^{n}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly((a**k)*(a**n), a**k, a**n, domain='ZZ')" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly('a^(n+k)')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'FiniteSet' object has no attribute 'as_coeff_Mul'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mS\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'a^{n+k}/{b^n}+{b^{n+k}}/{c^n}+{c^{n+k}}/{a^n}-( a^k+b^k+c^k)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/sympify.py\u001b[0m in \u001b[0;36msympify\u001b[0;34m(a, locals, convert_xor, strict, rational, evaluate)\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 383\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'\\n'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 384\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mparse_expr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlocal_dict\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlocals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtransformations\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtransformations\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mevaluate\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 385\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mTokenError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSyntaxError\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mexc\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 386\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mSympifyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'could not parse %r'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/parsing/sympy_parser.py\u001b[0m in \u001b[0;36mparse_expr\u001b[0;34m(s, local_dict, transformations, global_dict, evaluate)\u001b[0m\n\u001b[1;32m 964\u001b[0m \u001b[0mcode\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevaluateFalse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcode\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'eval'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 965\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 966\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0meval_expr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlocal_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mglobal_dict\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 967\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 968\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/parsing/sympy_parser.py\u001b[0m in \u001b[0;36meval_expr\u001b[0;34m(code, local_dict, global_dict)\u001b[0m\n\u001b[1;32m 877\u001b[0m \"\"\"\n\u001b[1;32m 878\u001b[0m expr = eval(\n\u001b[0;32m--> 879\u001b[0;31m code, global_dict, local_dict) # take local objects in preference\n\u001b[0m\u001b[1;32m 880\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 881\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/expr.py\u001b[0m in \u001b[0;36m__pow__\u001b[0;34m(self, other, mod)\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__pow__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmod\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 165\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_pow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 166\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m \u001b[0m_self\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmod\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mas_int\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mas_int\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mas_int\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmod\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/decorators.py\u001b[0m in \u001b[0;36m__sympifyit_wrapper\u001b[0;34m(a, b)\u001b[0m\n\u001b[1;32m 89\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'_op_priority'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msympify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstrict\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 91\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 92\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mSympifyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mretval\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/decorators.py\u001b[0m in \u001b[0;36mbinary_op_wrapper\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 127\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mf\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 128\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 129\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 130\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mbinary_op_wrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 131\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mpriority_decorator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/expr.py\u001b[0m in \u001b[0;36m_pow\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 159\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mcall_highest_priority\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'__rpow__'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 160\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_pow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 161\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mPow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 162\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__pow__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/cache.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 92\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 94\u001b[0;31m \u001b[0mretval\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 95\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[0mretval\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/power.py\u001b[0m in \u001b[0;36m__new__\u001b[0;34m(cls, b, e, evaluate)\u001b[0m\n\u001b[1;32m 274\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Atom\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mb\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mExp1\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexp_polar\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 275\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0msympy\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdenom\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlog\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msign\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mim\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfactor_terms\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 276\u001b[0;31m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfactor_terms\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msign\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_coeff_Mul\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 277\u001b[0m \u001b[0mden\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdenom\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 278\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mden\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlog\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mden\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAttributeError\u001b[0m: 'FiniteSet' object has no attribute 'as_coeff_Mul'" + ] + } + ], + "source": [ + "S('a^{n+k}/{b^n}+{b^(n+k)/(c^n)+c^(n+k)/{a^n}-( a^k+b^k+c^k)')" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'767980716'" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import re\n", + "s=r\"\"\"99-my-name-is-John-Smith-6376827-%^-1-2-767980716\"\"\"\n", + "re.compile(r\"^(.*?)-\").search(str(s[::-1])).group(1)[::-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ANTLR runtime and generated code versions disagree: 4.8!=4.7.1\n", + "ANTLR runtime and generated code versions disagree: 4.8!=4.7.1\n" + ] + }, + { + "data": { + "text/latex": [ + "numerator: $a^{k} a^{2 n} c^{n} - a^{k} a^{n} b^{n} c^{n} + a^{n} b^{k} b^{2 n} - a^{n} b^{k} b^{n} c^{n} - a^{n} b^{n} c^{k} c^{n} + b^{n} c^{k} c^{2 n}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $1$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "status: 2" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Program couldn't find any proof." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ a^{k} a^{n} b^{n} c^{n}+a^{n} b^{k} b^{n} c^{n}+a^{n} b^{n} c^{k} c^{n} \\le a^{k} a^{2 n} c^{n}+a^{n} b^{k} b^{2 n}+b^{n} c^{k} c^{2 n} $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $n\\to d + k$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "numerator: $a^{2 d} a^{3 k} c^{d} c^{k} - a^{d} a^{2 k} b^{d} b^{k} c^{d} c^{k} + a^{d} a^{k} b^{2 d} b^{3 k} - a^{d} a^{k} b^{d} b^{2 k} c^{d} c^{k} - a^{d} a^{k} b^{d} b^{k} c^{d} c^{2 k} + b^{d} b^{k} c^{2 d} c^{3 k}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $1$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "status: 2" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Program couldn't find any proof." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ a^{d} a^{2 k} b^{d} b^{k} c^{d} c^{k}+a^{d} a^{k} b^{d} b^{2 k} c^{d} c^{k}+a^{d} a^{k} b^{d} b^{k} c^{d} c^{2 k} \\le a^{2 d} a^{3 k} c^{d} c^{k}+a^{d} a^{k} b^{2 d} b^{3 k}+b^{d} b^{k} c^{2 d} c^{3 k} $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sympy import *\n", + "from sympy.parsing.latex import parse_latex\n", + "from shiroindev import *\n", + "shiro.seed=1\n", + "from IPython.display import Latex\n", + "shiro.display=lambda x:display(Latex(x))\n", + "formula=expand(parse_latex(r'(\\frac{a^{n+k}}{b^n}+\\frac{b^{n+k}}{c^n}+\\frac{c^{n+k}}{a^n}-( a^k+b^k+c^k))*a^nb^nc^n'))\n", + "newproof()\n", + "prove(formula)\n", + "prove(makesubs(formula,['k',oo],variables='n'))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 6 x^{3}y^{9} + 5 x^{2}y^{7} + 4 xy^{8}, x, y, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(6*x**3*y**9 + 5*x**2*y**7 + 4*x*y**8, x, y, domain='ZZ')" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly(dict(zip([(1,8),(2,7),(3,9)],[4,5,6])),gens=S('x,y'))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\sqrt{x} + x^{2} + x$" + ], + "text/plain": [ + "sqrt(x) + x**2 + x" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly({1:1,2:1,4:1},gens=S('sqrt(x)')).as_expr()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "def _writ2(coef,fun,variables):\n", + "\treturn latex(Poly(dict(zip(fun,coef)),gens=variables).as_expr())" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'8 x^{3} y^{4} + 7 x y^{2}'" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "_writ2([7,8],[(1,2),(3,4)],S('x,y'))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ANTLR runtime and generated code versions disagree: 4.8!=4.7.1\n", + "ANTLR runtime and generated code versions disagree: 4.8!=4.7.1\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle 2 a b$" + ], + "text/plain": [ + "2*(a*b)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "parse_latex(r' a^2+b^2\\geq 2ab').rhs" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ANTLR runtime and generated code versions disagree: 4.8!=4.7.1\n", + "ANTLR runtime and generated code versions disagree: 4.8!=4.7.1\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle a^{2} + b^{2}$" + ], + "text/plain": [ + "a**2 + b**2" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "parse_latex(r'2ab \\geq a^2+b^2').rhs" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "numerator: $a d + a f + b c + b e + c f + d e - 2 \\sqrt{a b} \\sqrt{c d} - 2 \\sqrt{a b} \\sqrt{e f} - 2 \\sqrt{c d} \\sqrt{e f}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $1$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Poly((sqrt(a))**2*(sqrt(d))**2 + (sqrt(a))**2*(sqrt(f))**2 - 2*(sqrt(a))*(sqrt(b))*(sqrt(c))*(sqrt(d)) - 2*(sqrt(a))*(sqrt(b))*(sqrt(e))*(sqrt(f)) + (sqrt(b))**2*(sqrt(c))**2 + (sqrt(b))**2*(sqrt(e))**2 + (sqrt(c))**2*(sqrt(f))**2 - 2*(sqrt(c))*(sqrt(d))*(sqrt(e))*(sqrt(f)) + (sqrt(d))**2*(sqrt(e))**2, sqrt(a), sqrt(b), sqrt(c), sqrt(d), sqrt(e), sqrt(f), domain='ZZ')\n", + "Poly((sqrt(a))**2*(sqrt(d))**2 + (sqrt(a))**2*(sqrt(f))**2 + (sqrt(b))**2*(sqrt(c))**2 + (sqrt(b))**2*(sqrt(e))**2 + (sqrt(c))**2*(sqrt(f))**2 + (sqrt(d))**2*(sqrt(e))**2, sqrt(a), sqrt(b), sqrt(c), sqrt(d), sqrt(e), sqrt(f), domain='QQ')\n", + "Poly(2*(sqrt(a))*(sqrt(b))*(sqrt(c))*(sqrt(d)) + 2*(sqrt(a))*(sqrt(b))*(sqrt(e))*(sqrt(f)) + 2*(sqrt(c))*(sqrt(d))*(sqrt(e))*(sqrt(f)), sqrt(a), sqrt(b), sqrt(c), sqrt(d), sqrt(e), sqrt(f), domain='QQ')\n" + ] + }, + { + "data": { + "text/latex": [ + "status: 0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "From weighted AM-GM inequality:" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 \\sqrt{a} \\sqrt{b} \\sqrt{c} \\sqrt{d} \\le a d+b c$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 \\sqrt{a} \\sqrt{b} \\sqrt{e} \\sqrt{f} \\le a f+b e$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 \\sqrt{c} \\sqrt{d} \\sqrt{e} \\sqrt{f} \\le c f+d e$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ 0 \\le 0 $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "The sum of all inequalities gives us a proof of the inequality." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fr=parse_latex(r'\\sqrt{ab}+\\sqrt{cd}+\\sqrt{ef}\\leq\\sqrt{(a+c+e)(b+d+f)}')\n", + "prove(fr.rhs**2-fr.lhs**2)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle 0$" + ], + "text/plain": [ + "0" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "assumeall(S('sqrt(x*y)-sqrt(x)*sqrt(y)'),positive=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "ename": "GeneratorsError", + "evalue": "duplicated generators: [sqrt(x), sqrt(x)]", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mGeneratorsError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mreducegens\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'x+sqrt(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mq\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mS\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'x+sqrt(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mPoly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mS\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sqrt(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mS\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sqrt(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mPoly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mS\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sqrt(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/polytools.py\u001b[0m in \u001b[0;36m__new__\u001b[0;34m(cls, rep, *gens, **args)\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__new__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0;34m\"\"\"Create a new polynomial instance out of something useful. \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m \u001b[0mopt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuild_options\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 110\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 111\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'order'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mopt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/polyoptions.py\u001b[0m in \u001b[0;36mbuild_options\u001b[0;34m(gens, args)\u001b[0m\n\u001b[1;32m 729\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 730\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m'opt'\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mgens\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 731\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mOptions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 732\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 733\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'opt'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/polyoptions.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, gens, args, flags, strict)\u001b[0m\n\u001b[1;32m 152\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0moption\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpreprocess\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 153\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 154\u001b[0;31m \u001b[0mpreprocess_options\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 155\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 156\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdefaults\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/polyoptions.py\u001b[0m in \u001b[0;36mpreprocess_options\u001b[0;34m(args)\u001b[0m\n\u001b[1;32m 150\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 151\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 152\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0moption\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpreprocess\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 153\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[0mpreprocess_options\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/polyoptions.py\u001b[0m in \u001b[0;36mpreprocess\u001b[0;34m(cls, gens)\u001b[0m\n\u001b[1;32m 289\u001b[0m \u001b[0mgens\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 290\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mhas_dups\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 291\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mGeneratorsError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"duplicated generators: %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 292\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_commutative\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mFalse\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mgen\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mgens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 293\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mGeneratorsError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"non-commutative generators: %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mGeneratorsError\u001b[0m: duplicated generators: [sqrt(x), sqrt(x)]" + ] + } + ], + "source": [ + "p=reducegens('x+sqrt(x)')\n", + "q=S('x+sqrt(x)')\n", + "print(Poly(p,gens=[S('sqrt(x)'),S('sqrt(x)')]))\n", + "print(Poly(q,gens=S('sqrt(x)')))" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "from importlib import reload\n", + "from sympy import *\n", + "import shiroindev\n", + "reload(shiroindev)\n", + "from shiroindev import *\n", + "from sympy.parsing.latex import parse_latex\n", + "from itertools import permutations, combinations\n", + "shiro.seed=1\n", + "from IPython.display import Latex\n", + "shiro.display=lambda x:display(Latex(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( x, \\sqrt{x}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly((sqrt(x))**2, sqrt(x), domain='ZZ')" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly('sqrt(x)')*Poly('sqrt(x)')" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 0, x, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(0, x, domain='ZZ')" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly('x')-Poly('x').abs()" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( x, x, y, domain=\\mathbb{Q} \\right)}$" + ], + "text/plain": [ + "Poly(x, x, y, domain='QQ')" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fr=Poly('x-y')\n", + "(fr+fr.abs())*(S('1/2'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from itertools import permutations \n", + "t5=[]\n", + "for ineq in ineqs2:\n", + " u=0\n", + " for vars in permutations(ineq.free_symbols):\n", + " ineqp=makesubs(ineq,list(zip(vars[1:],[oo]*len(vars[1:]))),variables=vars[:-1])\n", + " u=max(u,prove(ineqp))\n", + " print(u,end=',')\n", + " t5+=[u]\n", + "Counter(t5)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pvalue 4.43444926375551e-06\n", + "statistic 59.0\n" + ] + } + ], + "source": [ + "from statsmodels.stats.contingency_tables import mcnemar\n", + "print(mcnemar([[101,121],[59,33]]))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "nsimplify?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "shiro.display=lambda x:display(Latex(x))\n", + "newproof()\n", + "fr=makesubs(ineqs2[15],'[c,oo],[a,oo]',variables='b,c')\n", + "display(fr)\n", + "fr2=fractioncancel(fr.subs(S('[[e,(sqrt(5)-1)/2*f]]')))[0]\n", + "display(fr2)\n", + "prove(makesubs(fr2,'11/5,9/4',variables=[S('sqrt(5)')]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def makesubs(formula,intervals,values=None,variables=None,numden=False):\n", + "#This function generates a new formula which satisfies this condition:\n", + "#for all positive variables new formula is nonnegative iff\n", + "#for all variables in corresponding intervals old formula is nonnegative\n", + "\tformula=S(formula)\n", + "\taddsymbols(formula)\n", + "\tintervals=_smakeiterable2(intervals)\n", + "\tif variables: variables=_smakeiterable(variables)\n", + "\telse: variables=sorted(formula.free_symbols,key=str)\n", + "\tif values!=None:\n", + "\t\tvalues=_smakeiterable(values)\n", + "\t\tequations=[var-value for var,value in zip(variables,values)]\n", + "\telse:\n", + "\t\tequations=[]\n", + "\tnewvars=[]\n", + "\tusedvars=set()\n", + "\tfor var,interval in zip(variables,intervals):\n", + "\t\tend1,end2=interval\n", + "\t\tz=newvar()\n", + "\t\tnewvars+=[z]\n", + "\t\tusedvars|={z}\n", + "\t\tif (end1.free_symbols|end2.free_symbols)&usedvars:\n", + "\t\t\tshiro.warning(shiro.translation[\n", + "\t\t\t'Warning: intervals contain backwards dependencies. Consider changing order of variables'])\n", + "\t\tif end1 in {S('-oo'),S('oo')}:\n", + "\t\t\tend1,end2=end2,end1\n", + "\t\tif {end1,end2}=={S('-oo'),S('oo')}:\n", + "\t\t\tsub1=sub2=(z-1/z)\n", + "\t\telif end2==S('oo'):\n", + "\t\t\tsub1=sub2=(end1+z)\n", + "\t\telif end2==S('-oo'):\n", + "\t\t\tsub1=sub2=end1-z\n", + "\t\telse:\n", + "\t\t\tsub1=end2+(end1-end2)/z\n", + "\t\t\tsub2=end2+(end1-end2)/(1+z)\n", + "\t\tformula=formula.subs(var,sub1)\n", + "\t\tshiro.display(shiro.translation['Substitute']+\" $\"+latex(var)+'\\\\to '+latex(sub2)+'$')\n", + "\t\tequations=[equation.subs(var,sub1) for equation in equations]\n", + "\tnum,den=fractioncancel(formula)\n", + "\tfor var,interval in zip(newvars,intervals):\n", + "\t\tif {interval[0],interval[1]} & {S('oo'),S('-oo')}==set():\n", + "\t\t\tnum=num.subs(var,var+1)\n", + "\t\t\tden=den.subs(var,var+1)\n", + "\t\t\tequations=[equation.subs(var,var+1) for equation in equations]\n", + "\tif values:\n", + "\t\tvalues=ssolve(equations,newvars)\n", + "\t\tif len(values):\n", + "\t\t\tvalues=values[0]\n", + "\tnum,den=expand(num),expand(den)\n", + "\t#shiro.display(shiro.translation[\"Formula after substitution:\"],\"$$\",latex(num/den),'$$')\n", + "\tif values and numden:\n", + "\t\treturn num,den,values\n", + "\telif values:\n", + "\t\treturn num/den,values\n", + "\telif numden:\n", + "\t\treturn num,den\n", + "\telse:\n", + "\t\treturn num/den" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{3, 5, 7, 8}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x={5,7,8}\n", + "x|={3}\n", + "x" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{x}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from shiroindev import *\n", + "S('x+7').free_symbols" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool(set())" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "Substitute $x\\to - y + 1 + \\frac{y - 1}{a + 1}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $y\\to 1 - \\frac{1}{b + 1}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $b\\to \\frac{c}{2}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "numerator: $a^{4} c^{2} + a^{3} c^{2} - 2 a^{3} c - 4 a^{2} c + 4 a^{2} + a c^{2} - 2 a c + c^{2}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $a^{3} c^{2} + 2 a^{3} c + 2 a^{2} c^{2} + 4 a^{2} c + a c^{2} + 2 a c$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "status: 0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "From weighted AM-GM inequality:" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 a^{3} c \\le a^{4} c^{2}+a^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$4 a^{2} c \\le a^{3} c^{2}+2 a^{2}+a c^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 a c \\le a^{2}+c^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ 0 \\le 0 $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "The sum of all inequalities gives us a proof of the inequality." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from importlib import reload\n", + "newproof()\n", + "import shiroindev\n", + "reload(shiroindev)\n", + "from shiroindev import *\n", + "shiro.display=lambda x:display(Latex(x))\n", + "formula=Sm('xy/z+yz/x+zx/y-1').subs('z',S('1-x-y'))\n", + "newformula,values=makesubs(formula,'[0,1-y],[0,1]','1/3,1/3')\n", + "prove(newformula,values)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "def findvalues(formula,values=None,variables=None,**kwargs):\n", + "\t\"\"\"finds a candidate for parameter \"values\" in \"prove\" function\n", + "\tblabla\"\"\"\n", + "\tformula=S(formula)\n", + "\taddsymbols(formula)\n", + "\tnum,den=fractioncancel(formula)\n", + "\tif variables==None:\n", + "\t\tvariables=sorted(formula.free_symbols,key=str)\n", + "\tnum=num.subs(zip(variables,list(map(lambda x:x**2,variables))))\n", + "\tnum=Poly(num)\n", + "\tnewformula=S((num.abs()+num)/(num.abs()-num))\n", + "\tf=lambdify(variables,newformula)\n", + "\tf2=lambda x:f(*x)\n", + "\tif values==None:\n", + "\t\tvalues=[1.0]*len(variables)\n", + "\telse:\n", + "\t\tvalues=S(values)\n", + "\ttup=tuple(fmin(f2,values,**kwargs))\n", + "\treturn tuple([x*x for x in tup])" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimization terminated successfully.\n", + " Current function value: 1.000000\n", + " Iterations: 51\n", + " Function evaluations: 109\n" + ] + }, + { + "data": { + "text/plain": [ + "(1.9999999989778676, 0.6689493176765962)" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "findvalues(Sm('(x^2-4x+4)/y'))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "findvalues?" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/.ipynb_checkpoints/statistics-checkpoint.ipynb b/.ipynb_checkpoints/statistics-checkpoint.ipynb new file mode 100644 index 0000000..ad6b447 --- /dev/null +++ b/.ipynb_checkpoints/statistics-checkpoint.ipynb @@ -0,0 +1,476 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this notebook several methods for proving inequalities have been compared.\n", + "\n", + "First of all we need a dataset. 35 inequalities were selected from https://www.imomath.com/index.php?options=592&lmm=0. Each inequality is represented by a tuple: inequality (in LaTeX), inequality constraints (for example: $a\\in [0,1]$, equality constraints (for example: $abc=1$) and a function which converts inequality to a formula which we want to prove it's nonnegativity. In most cases when this function is simply a difference between left and right-hand side, but sometimes it's better to use difference between squares of sides (to get rid of square roots). These tuples are used as parameters in `parser` function which converts them to equivalent inequalities with default constraints (i.e. all variables are positive).\n", + "\n", + "Some tuples have less than 4 elements. In this case `parser` use default arguments." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from importlib import reload\n", + "from sympy import *\n", + "import shiroindev\n", + "from shiroindev import *\n", + "from sympy.parsing.latex import parse_latex\n", + "shiro.seed=1\n", + "from IPython.display import Latex\n", + "shiro.display=lambda x:display(Latex(x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`sympy` has a `parse_latex` function which converts LaTeX formula to a `sympy` one. Unfortunately it doesn't deal with missing braces in the way that LaTeX do. For example `\\frac12` generates $\\frac12$ which is the same as `\\frac{1}{2}`, but `parse_latex` accepts only the second version. So here there is a boring function which adds missing braces." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\frac{ \\sqrt {3}}{2}\n", + "a^2+b^2+c^2\\geq ab+bc+ca\n" + ] + } + ], + "source": [ + "def addbraces(s):\n", + " arg={r'\\frac':2,r'\\sqrt':1}\n", + " s2=''\n", + " p=0\n", + " while 1:\n", + " m=re.search(r\"\\\\[a-zA-Z]+\", s[p:])\n", + " if not m:\n", + " break\n", + " s2+=s[p:p+m.end()]\n", + " #print('a',s[p:m.end()],p)\n", + " p+=m.end()\n", + " if m.group() in arg:\n", + " for i in range(arg[m.group()]):\n", + " sp=re.search('^ *',s[p:])\n", + " s2+=sp.group()\n", + " #print('b',sp.group(),p)\n", + " p+=sp.end()\n", + " if s[p]=='{':\n", + " cb=re.search(r'^\\{.*?\\}',s[p:])\n", + " ab=addbraces(cb.group())\n", + " s2+=ab\n", + " #print('c',ab,p)\n", + " p+=cb.end()\n", + " else:\n", + " s2+='{'+s[p]+'}'\n", + " #print('d','{'+s[p]+'}',p)\n", + " p+=1\n", + " #print('e',p)\n", + " s2+=s[p:]\n", + " return s2\n", + "print(addbraces(r'\\frac{ \\sqrt 3}2'))\n", + "print(addbraces(r'a^2+b^2+c^2\\geq ab+bc+ca'))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "#(formula,intervals,subs,function)\n", + "dif=lambda b,s:b-s\n", + "dif2=lambda b,s:b*b-s*s\n", + "ineqs=[\n", + " (r'a^2+b^2+c^2\\geq ab+bc+ca',),\n", + " (r'a^2+b^2+c^2+d^2\\geq a(b+c+d)',),\n", + " (r'1\\leq\\frac{a^2b^2}{c^2}+\\frac{b^2c^2}{a^2}+\\frac{c^2a^2}{b^2}',\n", + " '[0,1-f],[0,1]','[a,sqrt(1-e-f)],[b,sqrt(e)],[c,sqrt(f)]',),\n", + " (r'\\frac1{1-x^2}+\\frac1{1-y^2}\\geq \\frac2{1-xy}','[0,1],[0,1]'),\n", + " (r'a^3+b^3\\geq a^2b+ab^2',),\n", + " (r'\\frac a{b+c}+\\frac b{c+a}+\\frac c{a+b}\\geq \\frac32',),\n", + " (r'2a^3+b^3\\geq 3a^2b',),\n", + " (r'a^3+b^3+c^3\\geq a^2b+b^2c+c^2a',),\n", + " (r'\\frac a{b+c}+\\frac b{c+d}+ \\frac c{d+a}+ \\frac d{a+b}\\geq 2',),\n", + " (r'\\frac{a^3}{a^2+ab+b^2}+ \\frac{b^3}{b^2+bc+c^2}+ \\frac{c^3}{c^2+ca+a^2} \\geq \\frac{a+b+c}3',),\n", + " (r'\\sqrt{ab}+\\sqrt{cd}+\\sqrt{ef}\\leq\\sqrt{(a+c+e)(b+d+f)}','','',dif2),\n", + " (r'\\frac{5a^3-ab^2}{a+b}+\\frac{5b^3-bc^2}{b+c}+\\frac{5c^3-ca^2}{c+a}\\geq 2(a^2+b^2+c^2)',),\n", + " #(r'\\frac{a^2}{(1+b)(1-c)}+\\frac{b^3}{(1+c)(1-d)}+\\frac{c^3}{(1+d)(1-a)}+\\frac{d^3}{(1+a)(1-b)}\\geq\\frac1{15}',\n", + " # '[0,1-c-d],[0,1-d],[0,1]','[a,1-b-c-d]'),\n", + " (r'\\frac{x^3}{(1+y)(1+z)}+\\frac{y^3}{(1+z)(1+x)}+\\frac{z^3}{(1+x)(1+y)}\\geq\\frac{3}{4}','','[z,1/(x*y)]'),\n", + " (r'\\frac ab+\\frac bc+\\frac ca\\geq \\frac{(a+b+c)^2}{ab+bc+ca}',),\n", + " (r'\\frac{a^2}b+\\frac{b^2}c+\\frac{c^2}a\\geq \\frac{a^2+b^2+c^2}{a+b+c}',),\n", + " (r'\\frac{a^2}b+\\frac{b^2}c+\\frac{c^2}a\\geq a+b+c+\\frac{4(a-b)^2}{a+b+c}',),\n", + " (r'\\frac1{a^3+b^3+abc}+ \\frac1{b^3+c^3+abc} +\\frac1{c^3+a^3+ abc} \\leq \\frac1{abc}',),\n", + " (r'\\frac1{a^3(b+c)}+ \\frac1{b^3(c+a)}+ \\frac1{c^3(a+b)} \\geq \\frac32','','[c,1/(a*b)]'),\n", + " (r'\\frac{a^3}{b^2-bc+c^2}+\\frac{b^3}{c^2-ca+a^2} + \\frac{c^3}{a^2-ab+b^2} \\geq 3 \\cdot\\frac{ab+bc+ca}{a+b+c}',),\n", + " (r'\\frac{x^5-x^2}{x^5+y^2+z^2}+\\frac{y^5-y^2}{y^5+z^2+x^2}+\\frac{z^5-z^2}{z^5+x^2+y^2}\\geq0','','[x,1/(y*z)]'),\n", + " (r'(a+b-c)(b+c-a)(c+a-b)\\leq abc',),\n", + " (r'\\frac1{1+xy}+\\frac1{1+yz}+\\frac1{1+zx}\\leq \\frac34','','[x,(y+z)/(y*z-1)]'),\n", + " (r'\\frac{x\\sqrt x}{y+z}+\\frac{y\\sqrt y}{z+x}+\\frac{z\\sqrt z}{x+y}\\geq\\frac{ \\sqrt 3}2',\n", + " '[0,1-z],[0,1]','[x,1-y-z]'),\n", + " (r'a^4+b^4+c^4+d^4\\geq 4abcd',),\n", + " (r'\\frac{ab}{a+b}+\\frac{bc}{b+c}+\\frac{ca}{c+a}\\leq\\frac{3(ab+bc+ca)}{2(a+b+c)}',),\n", + " (r'\\sqrt{a-1}+\\sqrt{b-1}+ \\sqrt{c-1} \\leq \\sqrt{c(ab+1)}','[1,oo],[1,oo],[1,oo]','',dif2),\n", + " (r'(x-1)(y-1)(z-1)\\geq 8','[0,1-b-c],[0,1-c],[0,1]','[x,1/a],[y,1/b],[z,1/c]'),\n", + " (r'ay+bz+cx\\leq s^2','[0,s],[0,s],[0,s]','[x,s-a],[y,s-b],[z,s-c]'),\n", + " (r'x_1^2+x_2^2+x_3^2+x_4^2+x_5^2\\geq 2 (x_1x_2+x_2x_3+x_3x_4+x_4x_5)/\\sqrt{3}',),\n", + " (r' xy+yz+zx - 2xyz \\leq \\frac7{27}', '[0,1-z],[0,1]','[x,1-y-z]'),\n", + " (r'0 \\leq xy+yz+zx - 2xyz', '[0,1-z],[0,1]','[x,1-y-z]'),\n", + " (r'\\sqrt{3+a+b+c}\\geq\\sqrt a+\\sqrt b+\\sqrt c','[1-z,1],[0,1]','[a,1/x-1],[b,1/y-1],[c,1/z-1],[x,2-y-z]',\n", + " dif2),\n", + " (r'\\frac{2a^3}{a^2+b^2}+\\frac{2b^3}{b^2+c^2}+\\frac{2c^3}{c^2+a^2}\\geq a+b+c',),\n", + " (r'\\frac{a^2}{b+c}+\\frac{b^2}{c+a}+\\frac{c^2}{a+b}\\geq \\frac12','[0,1-c],[0,1]','[a,1-b-c]'),\n", + " (r'\\frac{a+b}{2b+c}+\\frac{b+c}{2c+a}+\\frac{c+a}{2a+b}\\geq 2',),\n", + " #(r'\\frac x{5-y^2}+\\frac y{5-z^2}+\\frac z{5-x^2}\\geq \\frac34','[0,sqrt(5)],[0,sqrt(5)]','[x,1/(y*z)]')\n", + "]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def parser(formula,intervals='[]',subs='[]',func=dif):\n", + " newproof()\n", + " shiro.display=lambda x:None\n", + " #display=lambda x:None\n", + " if intervals=='':\n", + " intervals='[]'\n", + " if subs=='':\n", + " subs='[]'\n", + " formula=addbraces(formula)\n", + " formula=Sm(str(parse_latex(formula)))\n", + " formula,_=fractioncancel(formula)\n", + " formula=formula.subs(shiroindev._smakeiterable2(subs))\n", + " formula=makesubs(formula,intervals)\n", + " b,s=formula.lhs,formula.rhs\n", + " if type(formula)==LessThan:\n", + " b,s=s,b\n", + " formula=func(b,s)\n", + " formula=simplify(formula)\n", + " num,den=fractioncancel(formula)\n", + " return num" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 74%|███████▍ | 26/35 [00:21<00:07, 1.21it/s]\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mineqs2\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mineq\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtqdm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mineqs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mineqs2\u001b[0m\u001b[0;34m+=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mparser\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mineq\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mparser\u001b[0;34m(formula, intervals, subs, func)\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mformula\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0mformula\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msimplify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mformula\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 19\u001b[0m \u001b[0mnum\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mden\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfractioncancel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mformula\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnum\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/simplify/simplify.py\u001b[0m in \u001b[0;36msimplify\u001b[0;34m(expr, ratio, measure, rational, inverse)\u001b[0m\n\u001b[1;32m 560\u001b[0m \u001b[0m_e\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcancel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 561\u001b[0m \u001b[0mexpr1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mshorter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_e\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_mexpand\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_e\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcancel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# issue 6829\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 562\u001b[0;31m \u001b[0mexpr2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mshorter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtogether\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdeep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtogether\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdeep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 563\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 564\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mratio\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mInfinity\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/rationaltools.py\u001b[0m in \u001b[0;36mtogether\u001b[0;34m(expr, deep, fraction)\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 85\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_together\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msympify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/rationaltools.py\u001b[0m in \u001b[0;36m_together\u001b[0;34m(expr)\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbase\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 78\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 79\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0m_together\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m \u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 80\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0m_together\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mex\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mex\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mexpr\u001b[0m \u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/rationaltools.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbase\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 78\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 79\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0m_together\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m \u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 80\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0m_together\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mex\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mex\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mexpr\u001b[0m \u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/rationaltools.py\u001b[0m in \u001b[0;36m_together\u001b[0;34m(expr)\u001b[0m\n\u001b[1;32m 66\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 67\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 68\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mgcd_terms\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_together\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mAdd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmake_args\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfraction\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfraction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 69\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Pow\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 70\u001b[0m \u001b[0mbase\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_together\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbase\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/rationaltools.py\u001b[0m in \u001b[0;36m_together\u001b[0;34m(expr)\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbase\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 78\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 79\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0m_together\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m \u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 80\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0m_together\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mex\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mex\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mexpr\u001b[0m \u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/rationaltools.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbase\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 78\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 79\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0m_together\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m \u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 80\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0m_together\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mex\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mex\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mexpr\u001b[0m \u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/rationaltools.py\u001b[0m in \u001b[0;36m_together\u001b[0;34m(expr)\u001b[0m\n\u001b[1;32m 66\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 67\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 68\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mgcd_terms\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_together\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mAdd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmake_args\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfraction\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfraction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 69\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Pow\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 70\u001b[0m \u001b[0mbase\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_together\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbase\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/exprtools.py\u001b[0m in \u001b[0;36mgcd_terms\u001b[0;34m(terms, isprimitive, clear, fraction)\u001b[0m\n\u001b[1;32m 1061\u001b[0m \u001b[0mterms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msympify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mterms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1062\u001b[0m \u001b[0mterms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreps\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmask\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mterms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1063\u001b[0;31m \u001b[0mcont\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdenom\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_gcd_terms\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mterms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0misprimitive\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfraction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1064\u001b[0m \u001b[0mnumer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnumer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1065\u001b[0m \u001b[0mcoeff\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfactors\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcont\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_coeff_Mul\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/exprtools.py\u001b[0m in \u001b[0;36m_gcd_terms\u001b[0;34m(terms, isprimitive, fraction)\u001b[0m\n\u001b[1;32m 954\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 955\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mterm\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mterms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 956\u001b[0;31m \u001b[0mterms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mterm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcont\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 957\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 958\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfraction\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/exprtools.py\u001b[0m in \u001b[0;36mquo\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 872\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 873\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mquo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# Term\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 874\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmul\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 875\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 876\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mpow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# Term\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/exprtools.py\u001b[0m in \u001b[0;36mmul\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 864\u001b[0m \u001b[0mdenom\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdenom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmul\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdenom\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 865\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 866\u001b[0;31m \u001b[0mnumer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdenom\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnumer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnormal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdenom\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 867\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 868\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mTerm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcoeff\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdenom\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/exprtools.py\u001b[0m in \u001b[0;36mnormal\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 556\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mother_factors\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfactor\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 557\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 558\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mFactors\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself_factors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mFactors\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother_factors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 559\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 560\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdiv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# Factors\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/exprtools.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, factors)\u001b[0m\n\u001b[1;32m 367\u001b[0m \u001b[0mhandle\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 368\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mfactors\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 369\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mI\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 370\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 371\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/basic.py\u001b[0m in \u001b[0;36m__eq__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 333\u001b[0m \u001b[0;31m# (https://github.com/sympy/sympy/issues/4269), we only compare\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 334\u001b[0m \u001b[0;31m# types in Python 2 directly if they actually have __ne__.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 335\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mPY3\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__ne__\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__ne__\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 336\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtself\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mtother\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 337\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "from tqdm import tqdm\n", + "ineqs2=[]\n", + "for ineq in tqdm(ineqs):\n", + " ineqs2+=[parser(*ineq)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's look at the formulas when converted to polynomials." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for i,ineq in zip(range(len(ineqs2)),ineqs2):\n", + " print(i)\n", + " display(reducegens(assumeall(ineq,positive=True)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Most formulas was converted to polynomials of independent variables. However formulas No. 22 and No. 31 were not. For this reason it's very unlikely that any method of proving these ones will succeed.\n", + "\n", + "Now let's try some methods of proving these inequalities. The first one would be the simple `prove`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tm=[0]*4" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from collections import Counter\n", + "from timeit import default_timer as timer\n", + "start=timer()\n", + "t=[]\n", + "for ineq in ineqs2:\n", + " t+=[prove(ineq)]\n", + " print(t[-1],end=',')\n", + "tm[0]=timer()-start\n", + "print('\\n',tm[0],sep='')\n", + "Counter(t)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Code 0 means that the proof was found, all other codes means that proof wasn't found. So this method has proved 21 inequalities.\n", + "\n", + "The second method uses `findvalues` function, rationalizes the result numbers and gives them as additional parameter to `prove` function." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def cut(a):\n", + " if a<=0 or a>=100 or (a is None):\n", + " return 1\n", + " return a\n", + "start=timer()\n", + "t2=[]\n", + "for ineq in ineqs2:\n", + " numvalues=findvalues(ineq,disp=0)\n", + " values=nsimplify(numvalues,tolerance=0.1,rational=True)\n", + " values=list(map(cut,values))\n", + " t2+=[prove(ineq,values=values)]\n", + " print(t2[-1],end=',')\n", + "tm[1]=timer()-start\n", + "print('\\n',tm[1],sep='')\n", + "Counter(t2)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The third method is similar to the second one, but instead of rationalize values it squares, rationalizes and makes square roots of these values." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def cut(a):\n", + " if a<=0 or a>=1000 or (a is None):\n", + " return S(1)\n", + " return a\n", + " \n", + "start=timer()\n", + "t3=[]\n", + "for ineq in ineqs2:\n", + " numvalues=findvalues(ineq,disp=0)\n", + " numvalues=tuple([x**2 for x in numvalues])\n", + " values=nsimplify(numvalues,tolerance=0.1,rational=True)\n", + " values=[sqrt(x) for x in values]\n", + " values=list(map(cut,values))\n", + " t3+=[prove(ineq,values=values)]\n", + " print(t3[-1],end=',')\n", + "tm[2]=timer()-start\n", + "print('\\n',tm[2],sep='')\n", + "Counter(t3)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, the fourth method is a slight modification to the third method. It does the same \"findvalues, square, rationalize and make square roots\" thing, but then it scales the values and runs it again. It can sometimes help with uniform formulas." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def betw(a):\n", + " return a>0.001 and a<1000 and a!=None\n", + "def cut(a):\n", + " if betw(a):\n", + " return a\n", + " return S(1)\n", + "\n", + "start=timer()\n", + "t4=[]\n", + "for ineq in ineqs2:\n", + " numvalues=findvalues(ineq,disp=0)\n", + " n=1\n", + " numvalues2=[]\n", + " for i in numvalues:\n", + " if betw(i):\n", + " n=1/i\n", + " break\n", + " for i in numvalues:\n", + " if betw(i):\n", + " numvalues2+=[i*n]\n", + " else:\n", + " numvalues2+=[1]\n", + " numvalues3=findvalues(ineq,values=numvalues2,disp=0)\n", + " numvalues4=tuple([x**2 for x in numvalues3])\n", + " values=nsimplify(numvalues4,tolerance=0.1,rational=True)\n", + " values=[sqrt(x) for x in values]\n", + " values=list(map(cut,values))\n", + " t4+=[prove(ineq,values=values)]\n", + " print(t4[-1],end=',')\n", + "tm[3]=timer()-start\n", + "print('\\n',tm[3],sep='')\n", + "Counter(t4)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.bar(['1','2','3','4'],tm)\n", + "plt.ylabel('time [seconds]')\n", + "plt.xlabel('method')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "u=pd.DataFrame(zip(['']*len(ineqs),t,t2,t3,t4))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.bar(['1','2','3','4'],[sum(u[i]==0)/len(ineqs2)*100 for i in range(1,5)])\n", + "plt.ylabel('inequalities proven [%]')\n", + "plt.xlabel('method')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Down below there are contingency tables and McNemar test for every pair of methods." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(4):\n", + " for j in range(i+1,4):\n", + " display(pd.crosstab(u[i+1]==0, u[j+1]==0))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from statsmodels.stats.contingency_tables import mcnemar\n", + "for i in range(4):\n", + " for j in range(i+1,4):\n", + " print(mcnemar(pd.crosstab(u[i+1]==0, u[j+1]==0)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In all cases p-value is greater than 0.05, so there is no statistical difference between the methods." + ] + } + ], + "metadata": { + "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 +} diff --git a/__pycache__/shiroindev.cpython-36.pyc b/__pycache__/shiroindev.cpython-36.pyc index 4c76e4511411b88952562e197ba9663c51d1e56a..5422fdab43f4eaf22771a008f4ad989ab8537302 100644 GIT binary patch literal 16636 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" @@ -116,7 +116,7 @@ { "data": { "text/latex": [ - "$$ ab+ac+bc \\le a^2+b^2+c^2 $$" + "$$ a b+a c+b c \\le a^{2}+b^{2}+c^{2} $$" ], "text/plain": [ "" @@ -162,7 +162,7 @@ { "data": { "text/latex": [ - "numerator: $2a^2-2ab-2ac+2b^2-2bc+2c^2$" + "numerator: $2 a^{2} - 2 a b - 2 a c + 2 b^{2} - 2 b c + 2 c^{2}$" ], "text/plain": [ "" @@ -210,7 +210,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 a b \\le a^{2}+b^{2}$$" ], "text/plain": [ "" @@ -222,7 +222,7 @@ { "data": { "text/latex": [ - "$$2ac \\le a^2+c^2$$" + "$$2 a c \\le a^{2}+c^{2}$$" ], "text/plain": [ "" @@ -234,7 +234,7 @@ { "data": { "text/latex": [ - "$$2bc \\le b^2+c^2$$" + "$$2 b c \\le b^{2}+c^{2}$$" ], "text/plain": [ "" @@ -305,7 +305,7 @@ { "data": { "text/latex": [ - "numerator: $a^2-ab-ac-ad+b^2+c^2+d^2$" + "numerator: $a^{2} - a b - a c - a d + b^{2} + c^{2} + d^{2}$" ], "text/plain": [ "" @@ -353,7 +353,7 @@ { "data": { "text/latex": [ - "$$ ab+ac+ad \\le a^2+b^2+c^2+d^2 $$" + "$$ a b+a c+a d \\le a^{2}+b^{2}+c^{2}+d^{2} $$" ], "text/plain": [ "" @@ -398,7 +398,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 2a$" + "Substitute $a\\to 2 e$" ], "text/plain": [ "" @@ -410,7 +410,7 @@ { "data": { "text/latex": [ - "numerator: $4a^2-2ab-2ac-2ad+b^2+c^2+d^2$" + "numerator: $b^{2} - 2 b e + c^{2} - 2 c e + d^{2} - 2 d e + 4 e^{2}$" ], "text/plain": [ "" @@ -458,7 +458,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 b e \\le b^{2}+e^{2}$$" ], "text/plain": [ "" @@ -470,7 +470,7 @@ { "data": { "text/latex": [ - "$$2ac \\le a^2+c^2$$" + "$$2 c e \\le c^{2}+e^{2}$$" ], "text/plain": [ "" @@ -482,7 +482,7 @@ { "data": { "text/latex": [ - "$$2ad \\le a^2+d^2$$" + "$$2 d e \\le d^{2}+e^{2}$$" ], "text/plain": [ "" @@ -494,7 +494,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le a^2 $$" + "$$ 0 \\le e^{2} $$" ], "text/plain": [ "" @@ -534,7 +534,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Function makes a substitution $a\\to 2a$ (which should be understood as $a=2a'$) and try to prove new inequality. This time it succeeded. Moreover, if starting formula is equal to 0, then all these inequalities have to be equalities, so $a'^2=0$ and eventually $a=0$. We can also try a little bit lower value for $a$." + "Function makes a substitution $a\\to 2e$ and try to prove new inequality. This time it succeeded. Moreover, if starting formula is equal to 0, then all these inequalities have to be equalities, so $e^2=0$ and eventually $a=0$. We can also try a little bit lower value for $a$." ] }, { @@ -545,7 +545,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 7a/4$" + "Substitute $a\\to \\frac{7 f}{4}$" ], "text/plain": [ "" @@ -557,7 +557,7 @@ { "data": { "text/latex": [ - "numerator: $49a^2-28ab-28ac-28ad+16b^2+16c^2+16d^2$" + "numerator: $16 b^{2} - 28 b f + 16 c^{2} - 28 c f + 16 d^{2} - 28 d f + 49 f^{2}$" ], "text/plain": [ "" @@ -605,7 +605,7 @@ { "data": { "text/latex": [ - "$$28ab \\le 14a^2+14b^2$$" + "$$28 b f \\le 14 b^{2}+14 f^{2}$$" ], "text/plain": [ "" @@ -617,7 +617,7 @@ { "data": { "text/latex": [ - "$$28ac \\le 14a^2+14c^2$$" + "$$28 c f \\le 14 c^{2}+14 f^{2}$$" ], "text/plain": [ "" @@ -629,7 +629,7 @@ { "data": { "text/latex": [ - "$$28ad \\le 14a^2+14d^2$$" + "$$28 d f \\le 14 d^{2}+14 f^{2}$$" ], "text/plain": [ "" @@ -641,7 +641,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 7a^2+2b^2+2c^2+2d^2 $$" + "$$ 0 \\le 2 b^{2}+2 c^{2}+2 d^{2}+7 f^{2} $$" ], "text/plain": [ "" @@ -681,7 +681,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we can see that if $a^2+b^2+c^2+d^2-a(b+c+d)=0$, then $7a'^2+2b^2+2c^2+2d^2=0$ and eventually $a=b=c=d=0$. Note that inequality is proved only for positive numbers (which, by continuity, can be expanded to nonnegative numbers). But using similar argumentation to the one in previous problem, if $(a,b,c,d)=(x,y,z,t)$ is the solution of $a^2+b^2+c^2+d^2-a(b+c+d)=0$, then $(a,b,c,d)=(|x|,|y|,|z|,|t|)$ is a solution, too. Since the only nonnegative solution is $(0,0,0,0)$, it means that it is the only solution.\n", + "Now we can see that if $a^2+b^2+c^2+d^2-a(b+c+d)=0$, then $7f^2+2b^2+2c^2+2d^2=0$ and eventually $a=b=c=d=0$. Note that inequality is proved only for positive numbers (which, by continuity, can be expanded to nonnegative numbers). But using similar argumentation to the one in previous problem, if $(a,b,c,d)=(x,y,z,t)$ is the solution of $a^2+b^2+c^2+d^2-a(b+c+d)=0$, then $(a,b,c,d)=(|x|,|y|,|z|,|t|)$ is a solution, too. Since the only nonnegative solution is $(0,0,0,0)$, it means that it is the only solution.\n", + "\n", + "It is worth noting that this time function `prove` used $f$ as a new variable instead of $e$. If you want to start a new proof and you don't care about the collision of variables from previous proofs, you can use `newproof` function, which clears the set of used variables.\n", "\n", "We can also use the `findvalues` function to find values for the proof more automatically. It looks for (local) minimum of the $quotient$ value defined above." ] @@ -760,7 +762,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 10a/7$" + "Substitute $a\\to \\frac{10 e}{7}$" ], "text/plain": [ "" @@ -772,7 +774,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to 5b/6$" + "Substitute $b\\to \\frac{5 f}{6}$" ], "text/plain": [ "" @@ -784,7 +786,7 @@ { "data": { "text/latex": [ - "Substitute $c\\to 5c/6$" + "Substitute $c\\to \\frac{5 g}{6}$" ], "text/plain": [ "" @@ -796,7 +798,7 @@ { "data": { "text/latex": [ - "Substitute $d\\to 5d/6$" + "Substitute $d\\to \\frac{5 h}{6}$" ], "text/plain": [ "" @@ -808,7 +810,7 @@ { "data": { "text/latex": [ - "numerator: $3600a^2-2100ab-2100ac-2100ad+1225b^2+1225c^2+1225d^2$" + "numerator: $3600 e^{2} - 2100 e f - 2100 e g - 2100 e h + 1225 f^{2} + 1225 g^{2} + 1225 h^{2}$" ], "text/plain": [ "" @@ -856,7 +858,7 @@ { "data": { "text/latex": [ - "$$2100ab \\le 1050a^2+1050b^2$$" + "$$2100 e f \\le 1050 e^{2}+1050 f^{2}$$" ], "text/plain": [ "" @@ -868,7 +870,7 @@ { "data": { "text/latex": [ - "$$2100ac \\le 1050a^2+1050c^2$$" + "$$2100 e g \\le 1050 e^{2}+1050 g^{2}$$" ], "text/plain": [ "" @@ -880,7 +882,7 @@ { "data": { "text/latex": [ - "$$2100ad \\le 1050a^2+1050d^2$$" + "$$2100 e h \\le 1050 e^{2}+1050 h^{2}$$" ], "text/plain": [ "" @@ -892,7 +894,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 450a^2+175b^2+175c^2+175d^2 $$" + "$$ 0 \\le 450 e^{2}+175 f^{2}+175 g^{2}+175 h^{2} $$" ], "text/plain": [ "" @@ -925,6 +927,7 @@ } ], "source": [ + "newproof()\n", "prove(formula,values)" ] }, @@ -949,7 +952,7 @@ { "data": { "text/latex": [ - "numerator: $-x^3y+2x^2y^2-x^2-xy^3+2xy-y^2$" + "numerator: $- x^{3} y + 2 x^{2} y^{2} - x^{2} - x y^{3} + 2 x y - y^{2}$" ], "text/plain": [ "" @@ -961,7 +964,7 @@ { "data": { "text/latex": [ - "denominator: $x^3y^3-x^3y-x^2y^2+x^2-xy^3+xy+y^2-1$" + "denominator: $x^{3} y^{3} - x^{3} y - x^{2} y^{2} + x^{2} - x y^{3} + x y + y^{2} - 1$" ], "text/plain": [ "" @@ -997,7 +1000,7 @@ { "data": { "text/latex": [ - "$$ x^3y+x^2+xy^3+y^2 \\le 2x^2y^2+2xy $$" + "$$ x^{3} y+x^{2}+x y^{3}+y^{2} \\le 2 x^{2} y^{2}+2 x y $$" ], "text/plain": [ "" @@ -1063,7 +1066,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to 1-1/(x+1)$" + "Substitute $x\\to 1 - \\frac{1}{a + 1}$" ], "text/plain": [ "" @@ -1075,7 +1078,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to 1-1/(y+1)$" + "Substitute $y\\to 1 - \\frac{1}{b + 1}$" ], "text/plain": [ "" @@ -1087,7 +1090,7 @@ { "data": { "text/latex": [ - "numerator: $6x^3y+3x^3-12x^2y^2-3x^2y+3x^2+6xy^3-3xy^2-6xy+3y^3+3y^2$" + "numerator: $6 a^{3} b + 3 a^{3} - 12 a^{2} b^{2} - 3 a^{2} b + 3 a^{2} + 6 a b^{3} - 3 a b^{2} - 6 a b + 3 b^{3} + 3 b^{2}$" ], "text/plain": [ "" @@ -1099,7 +1102,7 @@ { "data": { "text/latex": [ - "denominator: $4x^2y+2x^2+4xy^2+8xy+3x+2y^2+3y+1$" + "denominator: $4 a^{2} b + 2 a^{2} + 4 a b^{2} + 8 a b + 3 a + 2 b^{2} + 3 b + 1$" ], "text/plain": [ "" @@ -1135,7 +1138,7 @@ { "data": { "text/latex": [ - "$$12x^2y^2 \\le 6x^3y+6xy^3$$" + "$$12 a^{2} b^{2} \\le 6 a^{3} b+6 a b^{3}$$" ], "text/plain": [ "" @@ -1147,7 +1150,7 @@ { "data": { "text/latex": [ - "$$3x^2y \\le 2x^3+y^3$$" + "$$3 a^{2} b \\le 2 a^{3}+b^{3}$$" ], "text/plain": [ "" @@ -1159,7 +1162,7 @@ { "data": { "text/latex": [ - "$$3xy^2 \\le x^3+2y^3$$" + "$$3 a b^{2} \\le a^{3}+2 b^{3}$$" ], "text/plain": [ "" @@ -1171,7 +1174,7 @@ { "data": { "text/latex": [ - "$$6xy \\le 3x^2+3y^2$$" + "$$6 a b \\le 3 a^{2}+3 b^{2}$$" ], "text/plain": [ "" @@ -1216,6 +1219,7 @@ } ], "source": [ + "newproof()\n", "newformula,newvalues=makesubs('1/(1-x^2)+1/(1-y^2)-2/(1-x*y)','[0,1],[0,1]','1/2,1/2')\n", "prove(newformula*3,newvalues)" ] @@ -1235,8 +1239,7 @@ "* constraints for variables are written as intervals,\n", "* there are no \"backwards dependencies\", i.e. there is no $x$ in the interval of $y$.\n", "\n", - "If these two conditions hold, then you can use `makesubs` function.\n", - "**Warning:** at this moment `makesubs` **doesn't warn you if your list of intervals doesn't follow these rules!**\n" + "If these two conditions hold, then you can use `makesubs` function." ] }, { @@ -1247,7 +1250,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to -y+1+(y-1)/(x+1)$" + "Substitute $x\\to - y + 1 + \\frac{y - 1}{a + 1}$" ], "text/plain": [ "" @@ -1259,7 +1262,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to 1-1/(y+1)$" + "Substitute $y\\to 1 - \\frac{1}{b + 1}$" ], "text/plain": [ "" @@ -1271,7 +1274,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to y/2$" + "Substitute $b\\to \\frac{c}{2}$" ], "text/plain": [ "" @@ -1283,7 +1286,7 @@ { "data": { "text/latex": [ - "numerator: $x^4y^2+x^3y^2-2x^3y-4x^2y+4x^2+xy^2-2xy+y^2$" + "numerator: $a^{4} c^{2} + a^{3} c^{2} - 2 a^{3} c - 4 a^{2} c + 4 a^{2} + a c^{2} - 2 a c + c^{2}$" ], "text/plain": [ "" @@ -1295,7 +1298,7 @@ { "data": { "text/latex": [ - "denominator: $x^3y^2+2x^3y+2x^2y^2+4x^2y+xy^2+2xy$" + "denominator: $a^{3} c^{2} + 2 a^{3} c + 2 a^{2} c^{2} + 4 a^{2} c + a c^{2} + 2 a c$" ], "text/plain": [ "" @@ -1331,7 +1334,7 @@ { "data": { "text/latex": [ - "$$2x^3y \\le x^4y^2+x^2$$" + "$$2 a^{3} c \\le a^{4} c^{2}+a^{2}$$" ], "text/plain": [ "" @@ -1343,7 +1346,7 @@ { "data": { "text/latex": [ - "$$4x^2y \\le x^3y^2+2x^2+xy^2$$" + "$$4 a^{2} c \\le a^{3} c^{2}+2 a^{2}+a c^{2}$$" ], "text/plain": [ "" @@ -1355,7 +1358,7 @@ { "data": { "text/latex": [ - "$$2xy \\le x^2+y^2$$" + "$$2 a c \\le a^{2}+c^{2}$$" ], "text/plain": [ "" @@ -1400,6 +1403,7 @@ } ], "source": [ + "newproof()\n", "formula=Sm('xy/z+yz/x+zx/y-1').subs('z',S('1-x-y'))\n", "newformula,values=makesubs(formula,'[0,1-y],[0,1]','1/3,1/3')\n", "prove(newformula,values)" @@ -1424,7 +1428,7 @@ { "data": { "text/latex": [ - "numerator: $2a^2-2ab-2ac+2b^2-2bc+2c^2$" + "numerator: $2 a^{2} - 2 a b - 2 a c + 2 b^{2} - 2 b c + 2 c^{2}$" ], "text/plain": [ "" @@ -1472,7 +1476,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 a b \\le a^{2}+b^{2}$$" ], "text/plain": [ "" @@ -1484,7 +1488,7 @@ { "data": { "text/latex": [ - "$$2ac \\le a^2+c^2$$" + "$$2 a c \\le a^{2}+c^{2}$$" ], "text/plain": [ "" @@ -1496,7 +1500,7 @@ { "data": { "text/latex": [ - "$$2bc \\le b^2+c^2$$" + "$$2 b c \\le b^{2}+c^{2}$$" ], "text/plain": [ "" @@ -1563,7 +1567,7 @@ { "data": { "text/latex": [ - "numerator: $x^4-4x^3+6x^2-4x+1$" + "numerator: $x^{4} - 4 x^{3} + 6 x^{2} - 4 x + 1$" ], "text/plain": [ "" @@ -1611,7 +1615,7 @@ { "data": { "text/latex": [ - "$$ 4x^3+4x \\le x^4+6x^2+1 $$" + "$$ 4 x^{3}+4 x \\le x^{4}+6 x^{2}+1 $$" ], "text/plain": [ "" @@ -1650,7 +1654,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+1$" + "Substitute $x\\to a + 1$" ], "text/plain": [ "" @@ -1662,7 +1666,7 @@ { "data": { "text/latex": [ - "numerator: $x^4$" + "numerator: $a^{4}$" ], "text/plain": [ "" @@ -1698,7 +1702,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le x^4 $$" + "$$ 0 \\le a^{4} $$" ], "text/plain": [ "" @@ -1731,6 +1735,7 @@ } ], "source": [ + "newproof()\n", "prove(makesubs('(x-1)^4','(1,oo)'))" ] }, @@ -1744,7 +1749,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to 1-x$" + "Substitute $x\\to 1 - a$" ], "text/plain": [ "" @@ -1756,7 +1761,7 @@ { "data": { "text/latex": [ - "numerator: $x^4$" + "numerator: $a^{4}$" ], "text/plain": [ "" @@ -1792,7 +1797,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le x^4 $$" + "$$ 0 \\le a^{4} $$" ], "text/plain": [ "" @@ -1825,6 +1830,7 @@ } ], "source": [ + "newproof()\n", "prove(makesubs('(x-1)^4','(-oo,1)'))" ] }, @@ -1872,7 +1878,7 @@ { "data": { "text/latex": [ - "numerator: $a^3c+a^3d+a^2b^2-a^2bd-2a^2c^2-a^2cd+a^2d^2+ab^3-ab^2c-ab^2d-abc^2+ac^3-acd^2+b^3d+b^2c^2-2b^2d^2+bc^3-bc^2d-bcd^2+bd^3+c^2d^2+cd^3$" + "numerator: $a^{3} c + a^{3} d + a^{2} b^{2} - a^{2} b d - 2 a^{2} c^{2} - a^{2} c d + a^{2} d^{2} + a b^{3} - a b^{2} c - a b^{2} d - a b c^{2} + a c^{3} - a c d^{2} + b^{3} d + b^{2} c^{2} - 2 b^{2} d^{2} + b c^{3} - b c^{2} d - b c d^{2} + b d^{3} + c^{2} d^{2} + c d^{3}$" ], "text/plain": [ "" @@ -1884,7 +1890,7 @@ { "data": { "text/latex": [ - "denominator: $a^2bc+a^2bd+a^2c^2+a^2cd+ab^2c+ab^2d+abc^2+2abcd+abd^2+ac^2d+acd^2+b^2cd+b^2d^2+bc^2d+bcd^2$" + "denominator: $a^{2} b c + a^{2} b d + a^{2} c^{2} + a^{2} c d + a b^{2} c + a b^{2} d + a b c^{2} + 2 a b c d + a b d^{2} + a c^{2} d + a c d^{2} + b^{2} c d + b^{2} d^{2} + b c^{2} d + b c d^{2}$" ], "text/plain": [ "" @@ -1920,7 +1926,7 @@ { "data": { "text/latex": [ - "$$ a^2bd+2a^2c^2+a^2cd+ab^2c+ab^2d+abc^2+acd^2+2b^2d^2+bc^2d+bcd^2 \\le a^3c+a^3d+a^2b^2+a^2d^2+ab^3+ac^3+b^3d+b^2c^2+bc^3+bd^3+c^2d^2+cd^3 $$" + "$$ a^{2} b d+2 a^{2} c^{2}+a^{2} c d+a b^{2} c+a b^{2} d+a b c^{2}+a c d^{2}+2 b^{2} d^{2}+b c^{2} d+b c d^{2} \\le a^{3} c+a^{3} d+a^{2} b^{2}+a^{2} d^{2}+a b^{3}+a c^{3}+b^{3} d+b^{2} c^{2}+b c^{3}+b d^{3}+c^{2} d^{2}+c d^{3} $$" ], "text/plain": [ "" @@ -1959,7 +1965,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to a+c$" + "Substitute $a\\to c + e$" ], "text/plain": [ "" @@ -1971,7 +1977,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+d$" + "Substitute $b\\to d + f$" ], "text/plain": [ "" @@ -1983,7 +1989,7 @@ { "data": { "text/latex": [ - "numerator: $a^3c+a^3d+a^2b^2+a^2bd+a^2c^2+2a^2cd+a^2d^2+ab^3+ab^2c+2ab^2d-abc^2+abd^2+b^3c+b^3d+b^2c^2+2b^2cd+b^2d^2$" + "numerator: $c^{2} e^{2} - c^{2} e f + c^{2} f^{2} + 2 c d e^{2} + 2 c d f^{2} + c e^{3} + c e f^{2} + c f^{3} + d^{2} e^{2} + d^{2} e f + d^{2} f^{2} + d e^{3} + d e^{2} f + 2 d e f^{2} + d f^{3} + e^{2} f^{2} + e f^{3}$" ], "text/plain": [ "" @@ -1995,7 +2001,7 @@ { "data": { "text/latex": [ - "denominator: $a^2bc+a^2bd+a^2c^2+2a^2cd+a^2d^2+ab^2c+ab^2d+3abc^2+6abcd+3abd^2+2ac^3+6ac^2d+6acd^2+2ad^3+b^2c^2+2b^2cd+b^2d^2+2bc^3+6bc^2d+6bcd^2+2bd^3+c^4+4c^3d+6c^2d^2+4cd^3+d^4$" + "denominator: $c^{4} + 4 c^{3} d + 2 c^{3} e + 2 c^{3} f + 6 c^{2} d^{2} + 6 c^{2} d e + 6 c^{2} d f + c^{2} e^{2} + 3 c^{2} e f + c^{2} f^{2} + 4 c d^{3} + 6 c d^{2} e + 6 c d^{2} f + 2 c d e^{2} + 6 c d e f + 2 c d f^{2} + c e^{2} f + c e f^{2} + d^{4} + 2 d^{3} e + 2 d^{3} f + d^{2} e^{2} + 3 d^{2} e f + d^{2} f^{2} + d e^{2} f + d e f^{2}$" ], "text/plain": [ "" @@ -2043,7 +2049,7 @@ { "data": { "text/latex": [ - "$$ abc^2 \\le a^3c+a^3d+a^2b^2+a^2bd+a^2c^2+2a^2cd+a^2d^2+ab^3+ab^2c+2ab^2d+abd^2+b^3c+b^3d+b^2c^2+2b^2cd+b^2d^2 $$" + "$$ c^{2} e f \\le c^{2} e^{2}+c^{2} f^{2}+2 c d e^{2}+2 c d f^{2}+c e^{3}+c e f^{2}+c f^{3}+d^{2} e^{2}+d^{2} e f+d^{2} f^{2}+d e^{3}+d e^{2} f+2 d e f^{2}+d f^{3}+e^{2} f^{2}+e f^{3} $$" ], "text/plain": [ "" @@ -2064,6 +2070,7 @@ } ], "source": [ + "newproof()\n", "prove(makesubs(formula,'[c,oo],[d,oo]'))" ] }, @@ -2075,7 +2082,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to a+c$" + "Substitute $a\\to c + e$" ], "text/plain": [ "" @@ -2087,7 +2094,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+d$" + "Substitute $b\\to d + f$" ], "text/plain": [ "" @@ -2099,7 +2106,7 @@ { "data": { "text/latex": [ - "numerator: $2a^3c+2a^3d+2a^2b^2+2a^2bd+2a^2c^2+4a^2cd+2a^2d^2+2ab^3+2ab^2c+4ab^2d-2abc^2+2abd^2+2b^3c+2b^3d+2b^2c^2+4b^2cd+2b^2d^2$" + "numerator: $2 c^{2} e^{2} - 2 c^{2} e f + 2 c^{2} f^{2} + 4 c d e^{2} + 4 c d f^{2} + 2 c e^{3} + 2 c e f^{2} + 2 c f^{3} + 2 d^{2} e^{2} + 2 d^{2} e f + 2 d^{2} f^{2} + 2 d e^{3} + 2 d e^{2} f + 4 d e f^{2} + 2 d f^{3} + 2 e^{2} f^{2} + 2 e f^{3}$" ], "text/plain": [ "" @@ -2111,7 +2118,7 @@ { "data": { "text/latex": [ - "denominator: $a^2bc+a^2bd+a^2c^2+2a^2cd+a^2d^2+ab^2c+ab^2d+3abc^2+6abcd+3abd^2+2ac^3+6ac^2d+6acd^2+2ad^3+b^2c^2+2b^2cd+b^2d^2+2bc^3+6bc^2d+6bcd^2+2bd^3+c^4+4c^3d+6c^2d^2+4cd^3+d^4$" + "denominator: $c^{4} + 4 c^{3} d + 2 c^{3} e + 2 c^{3} f + 6 c^{2} d^{2} + 6 c^{2} d e + 6 c^{2} d f + c^{2} e^{2} + 3 c^{2} e f + c^{2} f^{2} + 4 c d^{3} + 6 c d^{2} e + 6 c d^{2} f + 2 c d e^{2} + 6 c d e f + 2 c d f^{2} + c e^{2} f + c e f^{2} + d^{4} + 2 d^{3} e + 2 d^{3} f + d^{2} e^{2} + 3 d^{2} e f + d^{2} f^{2} + d e^{2} f + d e f^{2}$" ], "text/plain": [ "" @@ -2147,7 +2154,7 @@ { "data": { "text/latex": [ - "$$2abc^2 \\le a^2c^2+b^2c^2$$" + "$$2 c^{2} e f \\le c^{2} e^{2}+c^{2} f^{2}$$" ], "text/plain": [ "" @@ -2159,7 +2166,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 2a^3c+2a^3d+2a^2b^2+2a^2bd+a^2c^2+4a^2cd+2a^2d^2+2ab^3+2ab^2c+4ab^2d+2abd^2+2b^3c+2b^3d+b^2c^2+4b^2cd+2b^2d^2 $$" + "$$ 0 \\le c^{2} e^{2}+c^{2} f^{2}+4 c d e^{2}+4 c d f^{2}+2 c e^{3}+2 c e f^{2}+2 c f^{3}+2 d^{2} e^{2}+2 d^{2} e f+2 d^{2} f^{2}+2 d e^{3}+2 d e^{2} f+4 d e f^{2}+2 d f^{3}+2 e^{2} f^{2}+2 e f^{3} $$" ], "text/plain": [ "" @@ -2192,6 +2199,7 @@ } ], "source": [ + "newproof()\n", "prove(makesubs(formula,'[c,oo],[d,oo]')*2)" ] }, @@ -2210,7 +2218,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to c-c/(a+1)$" + "Substitute $a\\to c - \\frac{c}{e + 1}$" ], "text/plain": [ "" @@ -2222,7 +2230,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to d-d/(b+1)$" + "Substitute $b\\to d - \\frac{d}{f + 1}$" ], "text/plain": [ "" @@ -2234,7 +2242,7 @@ { "data": { "text/latex": [ - "numerator: $2a^3bc^2d^2+4a^3bcd^3+2a^3bd^4+2a^3c^2d^2+2a^3cd^3-2a^2b^2c^3d+2a^2b^2cd^3-4a^2bc^3d+4a^2bc^2d^2+12a^2bcd^3+6a^2bd^4-2a^2c^3d+4a^2c^2d^2+6a^2cd^3+2ab^3c^4+4ab^3c^3d+2ab^3c^2d^2+6ab^2c^4+8ab^2c^3d+4ab^2c^2d^2+4ab^2cd^3+6abc^4+4abc^3d+6abc^2d^2+12abcd^3+6abd^4+2ac^4+4ac^2d^2+6acd^3+2b^3c^3d+2b^3c^2d^2+4b^2c^3d+4b^2c^2d^2+2b^2cd^3+2bc^3d+4bc^2d^2+4bcd^3+2bd^4+2c^2d^2+2cd^3$" + "numerator: $2 c^{4} e f^{3} + 6 c^{4} e f^{2} + 6 c^{4} e f + 2 c^{4} e - 2 c^{3} d e^{2} f^{2} - 4 c^{3} d e^{2} f - 2 c^{3} d e^{2} + 4 c^{3} d e f^{3} + 8 c^{3} d e f^{2} + 4 c^{3} d e f + 2 c^{3} d f^{3} + 4 c^{3} d f^{2} + 2 c^{3} d f + 2 c^{2} d^{2} e^{3} f + 2 c^{2} d^{2} e^{3} + 4 c^{2} d^{2} e^{2} f + 4 c^{2} d^{2} e^{2} + 2 c^{2} d^{2} e f^{3} + 4 c^{2} d^{2} e f^{2} + 6 c^{2} d^{2} e f + 4 c^{2} d^{2} e + 2 c^{2} d^{2} f^{3} + 4 c^{2} d^{2} f^{2} + 4 c^{2} d^{2} f + 2 c^{2} d^{2} + 4 c d^{3} e^{3} f + 2 c d^{3} e^{3} + 2 c d^{3} e^{2} f^{2} + 12 c d^{3} e^{2} f + 6 c d^{3} e^{2} + 4 c d^{3} e f^{2} + 12 c d^{3} e f + 6 c d^{3} e + 2 c d^{3} f^{2} + 4 c d^{3} f + 2 c d^{3} + 2 d^{4} e^{3} f + 6 d^{4} e^{2} f + 6 d^{4} e f + 2 d^{4} f$" ], "text/plain": [ "" @@ -2246,7 +2254,7 @@ { "data": { "text/latex": [ - "denominator: $a^3b^3c^4+4a^3b^3c^3d+6a^3b^3c^2d^2+4a^3b^3cd^3+a^3b^3d^4+3a^3b^2c^4+10a^3b^2c^3d+12a^3b^2c^2d^2+6a^3b^2cd^3+a^3b^2d^4+3a^3bc^4+8a^3bc^3d+7a^3bc^2d^2+2a^3bcd^3+a^3c^4+2a^3c^3d+a^3c^2d^2+a^2b^3c^4+6a^2b^3c^3d+12a^2b^3c^2d^2+10a^2b^3cd^3+3a^2b^3d^4+3a^2b^2c^4+15a^2b^2c^3d+24a^2b^2c^2d^2+15a^2b^2cd^3+3a^2b^2d^4+3a^2bc^4+12a^2bc^3d+14a^2bc^2d^2+5a^2bcd^3+a^2c^4+3a^2c^3d+2a^2c^2d^2+2ab^3c^3d+7ab^3c^2d^2+8ab^3cd^3+3ab^3d^4+5ab^2c^3d+14ab^2c^2d^2+12ab^2cd^3+3ab^2d^4+4abc^3d+8abc^2d^2+4abcd^3+ac^3d+ac^2d^2+b^3c^2d^2+2b^3cd^3+b^3d^4+2b^2c^2d^2+3b^2cd^3+b^2d^4+bc^2d^2+bcd^3$" + "denominator: $c^{4} e^{3} f^{3} + 3 c^{4} e^{3} f^{2} + 3 c^{4} e^{3} f + c^{4} e^{3} + c^{4} e^{2} f^{3} + 3 c^{4} e^{2} f^{2} + 3 c^{4} e^{2} f + c^{4} e^{2} + 4 c^{3} d e^{3} f^{3} + 10 c^{3} d e^{3} f^{2} + 8 c^{3} d e^{3} f + 2 c^{3} d e^{3} + 6 c^{3} d e^{2} f^{3} + 15 c^{3} d e^{2} f^{2} + 12 c^{3} d e^{2} f + 3 c^{3} d e^{2} + 2 c^{3} d e f^{3} + 5 c^{3} d e f^{2} + 4 c^{3} d e f + c^{3} d e + 6 c^{2} d^{2} e^{3} f^{3} + 12 c^{2} d^{2} e^{3} f^{2} + 7 c^{2} d^{2} e^{3} f + c^{2} d^{2} e^{3} + 12 c^{2} d^{2} e^{2} f^{3} + 24 c^{2} d^{2} e^{2} f^{2} + 14 c^{2} d^{2} e^{2} f + 2 c^{2} d^{2} e^{2} + 7 c^{2} d^{2} e f^{3} + 14 c^{2} d^{2} e f^{2} + 8 c^{2} d^{2} e f + c^{2} d^{2} e + c^{2} d^{2} f^{3} + 2 c^{2} d^{2} f^{2} + c^{2} d^{2} f + 4 c d^{3} e^{3} f^{3} + 6 c d^{3} e^{3} f^{2} + 2 c d^{3} e^{3} f + 10 c d^{3} e^{2} f^{3} + 15 c d^{3} e^{2} f^{2} + 5 c d^{3} e^{2} f + 8 c d^{3} e f^{3} + 12 c d^{3} e f^{2} + 4 c d^{3} e f + 2 c d^{3} f^{3} + 3 c d^{3} f^{2} + c d^{3} f + d^{4} e^{3} f^{3} + d^{4} e^{3} f^{2} + 3 d^{4} e^{2} f^{3} + 3 d^{4} e^{2} f^{2} + 3 d^{4} e f^{3} + 3 d^{4} e f^{2} + d^{4} f^{3} + d^{4} f^{2}$" ], "text/plain": [ "" @@ -2282,7 +2290,7 @@ { "data": { "text/latex": [ - "$$2a^2b^2c^3d \\le a^3bc^2d^2+ab^3c^4$$" + "$$2 c^{3} d e^{2} f^{2} \\le c^{4} e f^{3}+c^{2} d^{2} e^{3} f$$" ], "text/plain": [ "" @@ -2294,7 +2302,7 @@ { "data": { "text/latex": [ - "$$2a^2c^3d \\le a^3c^2d^2+ac^4$$" + "$$2 c^{3} d e^{2} \\le c^{4} e+c^{2} d^{2} e^{3}$$" ], "text/plain": [ "" @@ -2306,7 +2314,7 @@ { "data": { "text/latex": [ - "$$4a^2bc^3d \\le a^3bc^2d^2+a^3c^2d^2+ab^3c^4+ac^4$$" + "$$4 c^{3} d e^{2} f \\le c^{4} e f^{3}+c^{4} e+c^{2} d^{2} e^{3} f+c^{2} d^{2} e^{3}$$" ], "text/plain": [ "" @@ -2318,7 +2326,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^3bcd^3+2a^3bd^4+2a^3cd^3+2a^2b^2cd^3+4a^2bc^2d^2+12a^2bcd^3+6a^2bd^4+4a^2c^2d^2+6a^2cd^3+4ab^3c^3d+2ab^3c^2d^2+6ab^2c^4+8ab^2c^3d+4ab^2c^2d^2+4ab^2cd^3+6abc^4+4abc^3d+6abc^2d^2+12abcd^3+6abd^4+4ac^2d^2+6acd^3+2b^3c^3d+2b^3c^2d^2+4b^2c^3d+4b^2c^2d^2+2b^2cd^3+2bc^3d+4bc^2d^2+4bcd^3+2bd^4+2c^2d^2+2cd^3 $$" + "$$ 0 \\le 6 c^{4} e f^{2}+6 c^{4} e f+4 c^{3} d e f^{3}+8 c^{3} d e f^{2}+4 c^{3} d e f+2 c^{3} d f^{3}+4 c^{3} d f^{2}+2 c^{3} d f+4 c^{2} d^{2} e^{2} f+4 c^{2} d^{2} e^{2}+2 c^{2} d^{2} e f^{3}+4 c^{2} d^{2} e f^{2}+6 c^{2} d^{2} e f+4 c^{2} d^{2} e+2 c^{2} d^{2} f^{3}+4 c^{2} d^{2} f^{2}+4 c^{2} d^{2} f+2 c^{2} d^{2}+4 c d^{3} e^{3} f+2 c d^{3} e^{3}+2 c d^{3} e^{2} f^{2}+12 c d^{3} e^{2} f+6 c d^{3} e^{2}+4 c d^{3} e f^{2}+12 c d^{3} e f+6 c d^{3} e+2 c d^{3} f^{2}+4 c d^{3} f+2 c d^{3}+2 d^{4} e^{3} f+6 d^{4} e^{2} f+6 d^{4} e f+2 d^{4} f $$" ], "text/plain": [ "" @@ -2351,6 +2359,7 @@ } ], "source": [ + "newproof()\n", "prove(makesubs(formula,'[0,c],[0,d]')*2)" ] }, @@ -2369,7 +2378,7 @@ { "data": { "text/latex": [ - "numerator: $x^4-4x^3+6x^2-4x+1$" + "numerator: $x^{4} - 4 x^{3} + 6 x^{2} - 4 x + 1$" ], "text/plain": [ "" @@ -2393,8 +2402,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2406,7 +2414,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to 1+x$" + "Substitute $x\\to 1+a$" ], "text/plain": [ "" @@ -2418,7 +2426,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $x^4$" + "Numerator after substitutions: $a^{4}$" ], "text/plain": [ "" @@ -2442,7 +2450,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le x^4 $$" + "$$ 0 \\le a^{4} $$" ], "text/plain": [ "" @@ -2466,8 +2474,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2479,7 +2486,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to 1/(1+x)$" + "Substitute $x\\to 1/(1+b)$" ], "text/plain": [ "" @@ -2491,7 +2498,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $x^4$" + "Numerator after substitutions: $b^{4}$" ], "text/plain": [ "" @@ -2515,7 +2522,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le x^4 $$" + "$$ 0 \\le b^{4} $$" ], "text/plain": [ "" @@ -2548,6 +2555,7 @@ } ], "source": [ + "newproof()\n", "powerprove('(x-1)^4')" ] }, @@ -2559,7 +2567,7 @@ { "data": { "text/latex": [ - "numerator: $4a^5+4a^4b+4a^4c-6a^4-4a^3b-2a^3c+4ab^3-9ab^2+4ac^2-18ac+9a+4b^4+4b^3c-6b^3-3b^2c+4bc^2-12bc+10b+4c^3-6c^2+11c$" + "numerator: $4 a^{5} + 4 a^{4} b + 4 a^{4} c - 6 a^{4} - 4 a^{3} b - 2 a^{3} c + 4 a b^{3} - 9 a b^{2} + 4 a c^{2} - 18 a c + 9 a + 4 b^{4} + 4 b^{3} c - 6 b^{3} - 3 b^{2} c + 4 b c^{2} - 12 b c + 10 b + 4 c^{3} - 6 c^{2} + 11 c$" ], "text/plain": [ "" @@ -2583,8 +2591,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2596,7 +2603,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1+a,b\\to 1+b,c\\to 1+c$" + "Substitute $a\\to 1+d,b\\to 1+e,c\\to 1+f$" ], "text/plain": [ "" @@ -2608,7 +2615,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5+4a^4b+4a^4c+22a^4+12a^3b+14a^3c+42a^3+12a^2b+18a^2c+34a^2+4ab^3+3ab^2-2ab+4ac^2+4b^4+4b^3c+18b^3+9b^2c+18b^2+4bc^2+2bc+4c^3+14c^2$" + "Numerator after substitutions: $4 d^{5} + 4 d^{4} e + 4 d^{4} f + 22 d^{4} + 12 d^{3} e + 14 d^{3} f + 42 d^{3} + 12 d^{2} e + 18 d^{2} f + 34 d^{2} + 4 d e^{3} + 3 d e^{2} - 2 d e + 4 d f^{2} + 4 e^{4} + 4 e^{3} f + 18 e^{3} + 9 e^{2} f + 18 e^{2} + 4 e f^{2} + 2 e f + 4 f^{3} + 14 f^{2}$" ], "text/plain": [ "" @@ -2644,7 +2651,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 d e \\le d^{2}+e^{2}$$" ], "text/plain": [ "" @@ -2656,7 +2663,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5+4a^4b+4a^4c+22a^4+12a^3b+14a^3c+42a^3+12a^2b+18a^2c+33a^2+4ab^3+3ab^2+4ac^2+4b^4+4b^3c+18b^3+9b^2c+17b^2+4bc^2+2bc+4c^3+14c^2 $$" + "$$ 0 \\le 4 d^{5}+4 d^{4} e+4 d^{4} f+22 d^{4}+12 d^{3} e+14 d^{3} f+42 d^{3}+12 d^{2} e+18 d^{2} f+33 d^{2}+4 d e^{3}+3 d e^{2}+4 d f^{2}+4 e^{4}+4 e^{3} f+18 e^{3}+9 e^{2} f+17 e^{2}+4 e f^{2}+2 e f+4 f^{3}+14 f^{2} $$" ], "text/plain": [ "" @@ -2680,8 +2687,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2693,7 +2699,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1/(1+a),b\\to 1+b,c\\to 1+c$" + "Substitute $a\\to 1/(1+g),b\\to 1+h,c\\to 1+i$" ], "text/plain": [ "" @@ -2705,7 +2711,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5b^4+4a^5b^3c+14a^5b^3+9a^5b^2c+15a^5b^2+4a^5bc^2+2a^5bc+6a^5b+4a^5c^3+10a^5c^2+8a^5c+10a^5+20a^4b^4+20a^4b^3c+74a^4b^3+45a^4b^2c+78a^4b^2+20a^4bc^2+10a^4bc+24a^4b+20a^4c^3+54a^4c^2+30a^4c+40a^4+40a^3b^4+40a^3b^3c+156a^3b^3+90a^3b^2c+162a^3b^2+40a^3bc^2+20a^3bc+36a^3b+40a^3c^3+116a^3c^2+40a^3c+60a^3+40a^2b^4+40a^2b^3c+164a^2b^3+90a^2b^2c+168a^2b^2+40a^2bc^2+20a^2bc+20a^2b+40a^2c^3+124a^2c^2+18a^2c+34a^2+20ab^4+20ab^3c+86ab^3+45ab^2c+87ab^2+20abc^2+10abc+2ab+20ac^3+66ac^2+4b^4+4b^3c+18b^3+9b^2c+18b^2+4bc^2+2bc+4c^3+14c^2$" + "Numerator after substitutions: $4 g^{5} h^{4} + 4 g^{5} h^{3} i + 14 g^{5} h^{3} + 9 g^{5} h^{2} i + 15 g^{5} h^{2} + 4 g^{5} h i^{2} + 2 g^{5} h i + 6 g^{5} h + 4 g^{5} i^{3} + 10 g^{5} i^{2} + 8 g^{5} i + 10 g^{5} + 20 g^{4} h^{4} + 20 g^{4} h^{3} i + 74 g^{4} h^{3} + 45 g^{4} h^{2} i + 78 g^{4} h^{2} + 20 g^{4} h i^{2} + 10 g^{4} h i + 24 g^{4} h + 20 g^{4} i^{3} + 54 g^{4} i^{2} + 30 g^{4} i + 40 g^{4} + 40 g^{3} h^{4} + 40 g^{3} h^{3} i + 156 g^{3} h^{3} + 90 g^{3} h^{2} i + 162 g^{3} h^{2} + 40 g^{3} h i^{2} + 20 g^{3} h i + 36 g^{3} h + 40 g^{3} i^{3} + 116 g^{3} i^{2} + 40 g^{3} i + 60 g^{3} + 40 g^{2} h^{4} + 40 g^{2} h^{3} i + 164 g^{2} h^{3} + 90 g^{2} h^{2} i + 168 g^{2} h^{2} + 40 g^{2} h i^{2} + 20 g^{2} h i + 20 g^{2} h + 40 g^{2} i^{3} + 124 g^{2} i^{2} + 18 g^{2} i + 34 g^{2} + 20 g h^{4} + 20 g h^{3} i + 86 g h^{3} + 45 g h^{2} i + 87 g h^{2} + 20 g h i^{2} + 10 g h i + 2 g h + 20 g i^{3} + 66 g i^{2} + 4 h^{4} + 4 h^{3} i + 18 h^{3} + 9 h^{2} i + 18 h^{2} + 4 h i^{2} + 2 h i + 4 i^{3} + 14 i^{2}$" ], "text/plain": [ "" @@ -2729,7 +2735,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5b^4+4a^5b^3c+14a^5b^3+9a^5b^2c+15a^5b^2+4a^5bc^2+2a^5bc+6a^5b+4a^5c^3+10a^5c^2+8a^5c+10a^5+20a^4b^4+20a^4b^3c+74a^4b^3+45a^4b^2c+78a^4b^2+20a^4bc^2+10a^4bc+24a^4b+20a^4c^3+54a^4c^2+30a^4c+40a^4+40a^3b^4+40a^3b^3c+156a^3b^3+90a^3b^2c+162a^3b^2+40a^3bc^2+20a^3bc+36a^3b+40a^3c^3+116a^3c^2+40a^3c+60a^3+40a^2b^4+40a^2b^3c+164a^2b^3+90a^2b^2c+168a^2b^2+40a^2bc^2+20a^2bc+20a^2b+40a^2c^3+124a^2c^2+18a^2c+34a^2+20ab^4+20ab^3c+86ab^3+45ab^2c+87ab^2+20abc^2+10abc+2ab+20ac^3+66ac^2+4b^4+4b^3c+18b^3+9b^2c+18b^2+4bc^2+2bc+4c^3+14c^2 $$" + "$$ 0 \\le 4 g^{5} h^{4}+4 g^{5} h^{3} i+14 g^{5} h^{3}+9 g^{5} h^{2} i+15 g^{5} h^{2}+4 g^{5} h i^{2}+2 g^{5} h i+6 g^{5} h+4 g^{5} i^{3}+10 g^{5} i^{2}+8 g^{5} i+10 g^{5}+20 g^{4} h^{4}+20 g^{4} h^{3} i+74 g^{4} h^{3}+45 g^{4} h^{2} i+78 g^{4} h^{2}+20 g^{4} h i^{2}+10 g^{4} h i+24 g^{4} h+20 g^{4} i^{3}+54 g^{4} i^{2}+30 g^{4} i+40 g^{4}+40 g^{3} h^{4}+40 g^{3} h^{3} i+156 g^{3} h^{3}+90 g^{3} h^{2} i+162 g^{3} h^{2}+40 g^{3} h i^{2}+20 g^{3} h i+36 g^{3} h+40 g^{3} i^{3}+116 g^{3} i^{2}+40 g^{3} i+60 g^{3}+40 g^{2} h^{4}+40 g^{2} h^{3} i+164 g^{2} h^{3}+90 g^{2} h^{2} i+168 g^{2} h^{2}+40 g^{2} h i^{2}+20 g^{2} h i+20 g^{2} h+40 g^{2} i^{3}+124 g^{2} i^{2}+18 g^{2} i+34 g^{2}+20 g h^{4}+20 g h^{3} i+86 g h^{3}+45 g h^{2} i+87 g h^{2}+20 g h i^{2}+10 g h i+2 g h+20 g i^{3}+66 g i^{2}+4 h^{4}+4 h^{3} i+18 h^{3}+9 h^{2} i+18 h^{2}+4 h i^{2}+2 h i+4 i^{3}+14 i^{2} $$" ], "text/plain": [ "" @@ -2753,8 +2759,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2766,7 +2771,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1+a,b\\to 1/(1+b),c\\to 1+c$" + "Substitute $a\\to 1+j,b\\to 1/(1+k),c\\to 1+l$" ], "text/plain": [ "" @@ -2778,7 +2783,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5b^4+16a^5b^3+24a^5b^2+16a^5b+4a^5+4a^4b^4c+18a^4b^4+16a^4b^3c+76a^4b^3+24a^4b^2c+120a^4b^2+16a^4bc+84a^4b+4a^4c+22a^4+14a^3b^4c+30a^3b^4+56a^3b^3c+132a^3b^3+84a^3b^2c+216a^3b^2+56a^3bc+156a^3b+14a^3c+42a^3+18a^2b^4c+22a^2b^4+72a^2b^3c+100a^2b^3+108a^2b^2c+168a^2b^2+72a^2bc+124a^2b+18a^2c+34a^2+4ab^4c^2+ab^4+16ab^3c^2+8ab^3+24ab^2c^2+9ab^2+16abc^2+2ab+4ac^2+4b^4c^3+10b^4c^2+3b^4c+4b^4+16b^3c^3+44b^3c^2+8b^3c+18b^3+24b^2c^3+72b^2c^2+3b^2c+18b^2+16bc^3+52bc^2-2bc+4c^3+14c^2$" + "Numerator after substitutions: $4 j^{5} k^{4} + 16 j^{5} k^{3} + 24 j^{5} k^{2} + 16 j^{5} k + 4 j^{5} + 4 j^{4} k^{4} l + 18 j^{4} k^{4} + 16 j^{4} k^{3} l + 76 j^{4} k^{3} + 24 j^{4} k^{2} l + 120 j^{4} k^{2} + 16 j^{4} k l + 84 j^{4} k + 4 j^{4} l + 22 j^{4} + 14 j^{3} k^{4} l + 30 j^{3} k^{4} + 56 j^{3} k^{3} l + 132 j^{3} k^{3} + 84 j^{3} k^{2} l + 216 j^{3} k^{2} + 56 j^{3} k l + 156 j^{3} k + 14 j^{3} l + 42 j^{3} + 18 j^{2} k^{4} l + 22 j^{2} k^{4} + 72 j^{2} k^{3} l + 100 j^{2} k^{3} + 108 j^{2} k^{2} l + 168 j^{2} k^{2} + 72 j^{2} k l + 124 j^{2} k + 18 j^{2} l + 34 j^{2} + 4 j k^{4} l^{2} + j k^{4} + 16 j k^{3} l^{2} + 8 j k^{3} + 24 j k^{2} l^{2} + 9 j k^{2} + 16 j k l^{2} + 2 j k + 4 j l^{2} + 4 k^{4} l^{3} + 10 k^{4} l^{2} + 3 k^{4} l + 4 k^{4} + 16 k^{3} l^{3} + 44 k^{3} l^{2} + 8 k^{3} l + 18 k^{3} + 24 k^{2} l^{3} + 72 k^{2} l^{2} + 3 k^{2} l + 18 k^{2} + 16 k l^{3} + 52 k l^{2} - 2 k l + 4 l^{3} + 14 l^{2}$" ], "text/plain": [ "" @@ -2814,7 +2819,7 @@ { "data": { "text/latex": [ - "$$2bc \\le b^2+c^2$$" + "$$2 k l \\le k^{2}+l^{2}$$" ], "text/plain": [ "" @@ -2826,7 +2831,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5b^4+16a^5b^3+24a^5b^2+16a^5b+4a^5+4a^4b^4c+18a^4b^4+16a^4b^3c+76a^4b^3+24a^4b^2c+120a^4b^2+16a^4bc+84a^4b+4a^4c+22a^4+14a^3b^4c+30a^3b^4+56a^3b^3c+132a^3b^3+84a^3b^2c+216a^3b^2+56a^3bc+156a^3b+14a^3c+42a^3+18a^2b^4c+22a^2b^4+72a^2b^3c+100a^2b^3+108a^2b^2c+168a^2b^2+72a^2bc+124a^2b+18a^2c+34a^2+4ab^4c^2+ab^4+16ab^3c^2+8ab^3+24ab^2c^2+9ab^2+16abc^2+2ab+4ac^2+4b^4c^3+10b^4c^2+3b^4c+4b^4+16b^3c^3+44b^3c^2+8b^3c+18b^3+24b^2c^3+72b^2c^2+3b^2c+17b^2+16bc^3+52bc^2+4c^3+13c^2 $$" + "$$ 0 \\le 4 j^{5} k^{4}+16 j^{5} k^{3}+24 j^{5} k^{2}+16 j^{5} k+4 j^{5}+4 j^{4} k^{4} l+18 j^{4} k^{4}+16 j^{4} k^{3} l+76 j^{4} k^{3}+24 j^{4} k^{2} l+120 j^{4} k^{2}+16 j^{4} k l+84 j^{4} k+4 j^{4} l+22 j^{4}+14 j^{3} k^{4} l+30 j^{3} k^{4}+56 j^{3} k^{3} l+132 j^{3} k^{3}+84 j^{3} k^{2} l+216 j^{3} k^{2}+56 j^{3} k l+156 j^{3} k+14 j^{3} l+42 j^{3}+18 j^{2} k^{4} l+22 j^{2} k^{4}+72 j^{2} k^{3} l+100 j^{2} k^{3}+108 j^{2} k^{2} l+168 j^{2} k^{2}+72 j^{2} k l+124 j^{2} k+18 j^{2} l+34 j^{2}+4 j k^{4} l^{2}+j k^{4}+16 j k^{3} l^{2}+8 j k^{3}+24 j k^{2} l^{2}+9 j k^{2}+16 j k l^{2}+2 j k+4 j l^{2}+4 k^{4} l^{3}+10 k^{4} l^{2}+3 k^{4} l+4 k^{4}+16 k^{3} l^{3}+44 k^{3} l^{2}+8 k^{3} l+18 k^{3}+24 k^{2} l^{3}+72 k^{2} l^{2}+3 k^{2} l+17 k^{2}+16 k l^{3}+52 k l^{2}+4 l^{3}+13 l^{2} $$" ], "text/plain": [ "" @@ -2850,8 +2855,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2863,7 +2867,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1/(1+a),b\\to 1/(1+b),c\\to 1+c$" + "Substitute $a\\to 1/(1+m),b\\to 1/(1+n),c\\to 1+o$" ], "text/plain": [ "" @@ -2875,7 +2879,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5b^4c^3+6a^5b^4c^2+11a^5b^4c+9a^5b^4+16a^5b^3c^3+28a^5b^3c^2+40a^5b^3c+38a^5b^3+24a^5b^2c^3+48a^5b^2c^2+51a^5b^2c+57a^5b^2+16a^5bc^3+36a^5bc^2+30a^5bc+34a^5b+4a^5c^3+10a^5c^2+8a^5c+10a^5+20a^4b^4c^3+34a^4b^4c^2+45a^4b^4c+40a^4b^4+80a^4b^3c^3+156a^4b^3c^2+160a^4b^3c+170a^4b^3+120a^4b^2c^3+264a^4b^2c^2+195a^4b^2c+246a^4b^2+80a^4bc^3+196a^4bc^2+110a^4bc+136a^4b+20a^4c^3+54a^4c^2+30a^4c+40a^4+40a^3b^4c^3+76a^3b^4c^2+70a^3b^4c+70a^3b^4+160a^3b^3c^3+344a^3b^3c^2+240a^3b^3c+300a^3b^3+240a^3b^2c^3+576a^3b^2c^2+270a^3b^2c+414a^3b^2+160a^3bc^3+424a^3bc^2+140a^3bc+204a^3b+40a^3c^3+116a^3c^2+40a^3c+60a^3+40a^2b^4c^3+84a^2b^4c^2+48a^2b^4c+58a^2b^4+160a^2b^3c^3+376a^2b^3c^2+152a^2b^3c+248a^2b^3+240a^2b^2c^3+624a^2b^2c^2+138a^2b^2c+312a^2b^2+160a^2bc^3+456a^2bc^2+52a^2bc+116a^2b+40a^2c^3+124a^2c^2+18a^2c+34a^2+20ab^4c^3+46ab^4c^2+15ab^4c+19ab^4+80ab^3c^3+204ab^3c^2+40ab^3c+82ab^3+120ab^2c^3+336ab^2c^2+15ab^2c+81ab^2+80abc^3+244abc^2-10abc-2ab+20ac^3+66ac^2+4b^4c^3+10b^4c^2+3b^4c+4b^4+16b^3c^3+44b^3c^2+8b^3c+18b^3+24b^2c^3+72b^2c^2+3b^2c+18b^2+16bc^3+52bc^2-2bc+4c^3+14c^2$" + "Numerator after substitutions: $4 m^{5} n^{4} o^{3} + 6 m^{5} n^{4} o^{2} + 11 m^{5} n^{4} o + 9 m^{5} n^{4} + 16 m^{5} n^{3} o^{3} + 28 m^{5} n^{3} o^{2} + 40 m^{5} n^{3} o + 38 m^{5} n^{3} + 24 m^{5} n^{2} o^{3} + 48 m^{5} n^{2} o^{2} + 51 m^{5} n^{2} o + 57 m^{5} n^{2} + 16 m^{5} n o^{3} + 36 m^{5} n o^{2} + 30 m^{5} n o + 34 m^{5} n + 4 m^{5} o^{3} + 10 m^{5} o^{2} + 8 m^{5} o + 10 m^{5} + 20 m^{4} n^{4} o^{3} + 34 m^{4} n^{4} o^{2} + 45 m^{4} n^{4} o + 40 m^{4} n^{4} + 80 m^{4} n^{3} o^{3} + 156 m^{4} n^{3} o^{2} + 160 m^{4} n^{3} o + 170 m^{4} n^{3} + 120 m^{4} n^{2} o^{3} + 264 m^{4} n^{2} o^{2} + 195 m^{4} n^{2} o + 246 m^{4} n^{2} + 80 m^{4} n o^{3} + 196 m^{4} n o^{2} + 110 m^{4} n o + 136 m^{4} n + 20 m^{4} o^{3} + 54 m^{4} o^{2} + 30 m^{4} o + 40 m^{4} + 40 m^{3} n^{4} o^{3} + 76 m^{3} n^{4} o^{2} + 70 m^{3} n^{4} o + 70 m^{3} n^{4} + 160 m^{3} n^{3} o^{3} + 344 m^{3} n^{3} o^{2} + 240 m^{3} n^{3} o + 300 m^{3} n^{3} + 240 m^{3} n^{2} o^{3} + 576 m^{3} n^{2} o^{2} + 270 m^{3} n^{2} o + 414 m^{3} n^{2} + 160 m^{3} n o^{3} + 424 m^{3} n o^{2} + 140 m^{3} n o + 204 m^{3} n + 40 m^{3} o^{3} + 116 m^{3} o^{2} + 40 m^{3} o + 60 m^{3} + 40 m^{2} n^{4} o^{3} + 84 m^{2} n^{4} o^{2} + 48 m^{2} n^{4} o + 58 m^{2} n^{4} + 160 m^{2} n^{3} o^{3} + 376 m^{2} n^{3} o^{2} + 152 m^{2} n^{3} o + 248 m^{2} n^{3} + 240 m^{2} n^{2} o^{3} + 624 m^{2} n^{2} o^{2} + 138 m^{2} n^{2} o + 312 m^{2} n^{2} + 160 m^{2} n o^{3} + 456 m^{2} n o^{2} + 52 m^{2} n o + 116 m^{2} n + 40 m^{2} o^{3} + 124 m^{2} o^{2} + 18 m^{2} o + 34 m^{2} + 20 m n^{4} o^{3} + 46 m n^{4} o^{2} + 15 m n^{4} o + 19 m n^{4} + 80 m n^{3} o^{3} + 204 m n^{3} o^{2} + 40 m n^{3} o + 82 m n^{3} + 120 m n^{2} o^{3} + 336 m n^{2} o^{2} + 15 m n^{2} o + 81 m n^{2} + 80 m n o^{3} + 244 m n o^{2} - 10 m n o - 2 m n + 20 m o^{3} + 66 m o^{2} + 4 n^{4} o^{3} + 10 n^{4} o^{2} + 3 n^{4} o + 4 n^{4} + 16 n^{3} o^{3} + 44 n^{3} o^{2} + 8 n^{3} o + 18 n^{3} + 24 n^{2} o^{3} + 72 n^{2} o^{2} + 3 n^{2} o + 18 n^{2} + 16 n o^{3} + 52 n o^{2} - 2 n o + 4 o^{3} + 14 o^{2}$" ], "text/plain": [ "" @@ -2911,7 +2915,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 m n \\le m^{2}+n^{2}$$" ], "text/plain": [ "" @@ -2923,7 +2927,7 @@ { "data": { "text/latex": [ - "$$2bc \\le b^2+c^2$$" + "$$2 n o \\le n^{2}+o^{2}$$" ], "text/plain": [ "" @@ -2935,7 +2939,7 @@ { "data": { "text/latex": [ - "$$10abc \\le 2a^2+2ab^2c+4ac^2+2b^3$$" + "$$10 m n o \\le 2 m^{2}+2 m n^{2} o+4 m o^{2}+2 n^{3}$$" ], "text/plain": [ "" @@ -2947,7 +2951,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5b^4c^3+6a^5b^4c^2+11a^5b^4c+9a^5b^4+16a^5b^3c^3+28a^5b^3c^2+40a^5b^3c+38a^5b^3+24a^5b^2c^3+48a^5b^2c^2+51a^5b^2c+57a^5b^2+16a^5bc^3+36a^5bc^2+30a^5bc+34a^5b+4a^5c^3+10a^5c^2+8a^5c+10a^5+20a^4b^4c^3+34a^4b^4c^2+45a^4b^4c+40a^4b^4+80a^4b^3c^3+156a^4b^3c^2+160a^4b^3c+170a^4b^3+120a^4b^2c^3+264a^4b^2c^2+195a^4b^2c+246a^4b^2+80a^4bc^3+196a^4bc^2+110a^4bc+136a^4b+20a^4c^3+54a^4c^2+30a^4c+40a^4+40a^3b^4c^3+76a^3b^4c^2+70a^3b^4c+70a^3b^4+160a^3b^3c^3+344a^3b^3c^2+240a^3b^3c+300a^3b^3+240a^3b^2c^3+576a^3b^2c^2+270a^3b^2c+414a^3b^2+160a^3bc^3+424a^3bc^2+140a^3bc+204a^3b+40a^3c^3+116a^3c^2+40a^3c+60a^3+40a^2b^4c^3+84a^2b^4c^2+48a^2b^4c+58a^2b^4+160a^2b^3c^3+376a^2b^3c^2+152a^2b^3c+248a^2b^3+240a^2b^2c^3+624a^2b^2c^2+138a^2b^2c+312a^2b^2+160a^2bc^3+456a^2bc^2+52a^2bc+116a^2b+40a^2c^3+124a^2c^2+18a^2c+31a^2+20ab^4c^3+46ab^4c^2+15ab^4c+19ab^4+80ab^3c^3+204ab^3c^2+40ab^3c+82ab^3+120ab^2c^3+336ab^2c^2+13ab^2c+81ab^2+80abc^3+244abc^2+20ac^3+62ac^2+4b^4c^3+10b^4c^2+3b^4c+4b^4+16b^3c^3+44b^3c^2+8b^3c+16b^3+24b^2c^3+72b^2c^2+3b^2c+16b^2+16bc^3+52bc^2+4c^3+13c^2 $$" + "$$ 0 \\le 4 m^{5} n^{4} o^{3}+6 m^{5} n^{4} o^{2}+11 m^{5} n^{4} o+9 m^{5} n^{4}+16 m^{5} n^{3} o^{3}+28 m^{5} n^{3} o^{2}+40 m^{5} n^{3} o+38 m^{5} n^{3}+24 m^{5} n^{2} o^{3}+48 m^{5} n^{2} o^{2}+51 m^{5} n^{2} o+57 m^{5} n^{2}+16 m^{5} n o^{3}+36 m^{5} n o^{2}+30 m^{5} n o+34 m^{5} n+4 m^{5} o^{3}+10 m^{5} o^{2}+8 m^{5} o+10 m^{5}+20 m^{4} n^{4} o^{3}+34 m^{4} n^{4} o^{2}+45 m^{4} n^{4} o+40 m^{4} n^{4}+80 m^{4} n^{3} o^{3}+156 m^{4} n^{3} o^{2}+160 m^{4} n^{3} o+170 m^{4} n^{3}+120 m^{4} n^{2} o^{3}+264 m^{4} n^{2} o^{2}+195 m^{4} n^{2} o+246 m^{4} n^{2}+80 m^{4} n o^{3}+196 m^{4} n o^{2}+110 m^{4} n o+136 m^{4} n+20 m^{4} o^{3}+54 m^{4} o^{2}+30 m^{4} o+40 m^{4}+40 m^{3} n^{4} o^{3}+76 m^{3} n^{4} o^{2}+70 m^{3} n^{4} o+70 m^{3} n^{4}+160 m^{3} n^{3} o^{3}+344 m^{3} n^{3} o^{2}+240 m^{3} n^{3} o+300 m^{3} n^{3}+240 m^{3} n^{2} o^{3}+576 m^{3} n^{2} o^{2}+270 m^{3} n^{2} o+414 m^{3} n^{2}+160 m^{3} n o^{3}+424 m^{3} n o^{2}+140 m^{3} n o+204 m^{3} n+40 m^{3} o^{3}+116 m^{3} o^{2}+40 m^{3} o+60 m^{3}+40 m^{2} n^{4} o^{3}+84 m^{2} n^{4} o^{2}+48 m^{2} n^{4} o+58 m^{2} n^{4}+160 m^{2} n^{3} o^{3}+376 m^{2} n^{3} o^{2}+152 m^{2} n^{3} o+248 m^{2} n^{3}+240 m^{2} n^{2} o^{3}+624 m^{2} n^{2} o^{2}+138 m^{2} n^{2} o+312 m^{2} n^{2}+160 m^{2} n o^{3}+456 m^{2} n o^{2}+52 m^{2} n o+116 m^{2} n+40 m^{2} o^{3}+124 m^{2} o^{2}+18 m^{2} o+31 m^{2}+20 m n^{4} o^{3}+46 m n^{4} o^{2}+15 m n^{4} o+19 m n^{4}+80 m n^{3} o^{3}+204 m n^{3} o^{2}+40 m n^{3} o+82 m n^{3}+120 m n^{2} o^{3}+336 m n^{2} o^{2}+13 m n^{2} o+81 m n^{2}+80 m n o^{3}+244 m n o^{2}+20 m o^{3}+62 m o^{2}+4 n^{4} o^{3}+10 n^{4} o^{2}+3 n^{4} o+4 n^{4}+16 n^{3} o^{3}+44 n^{3} o^{2}+8 n^{3} o+16 n^{3}+24 n^{2} o^{3}+72 n^{2} o^{2}+3 n^{2} o+16 n^{2}+16 n o^{3}+52 n o^{2}+4 o^{3}+13 o^{2} $$" ], "text/plain": [ "" @@ -2971,8 +2975,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -2984,7 +2987,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1+a,b\\to 1+b,c\\to 1/(1+c)$" + "Substitute $a\\to 1+p,b\\to 1+q,c\\to 1/(1+r)$" ], "text/plain": [ "" @@ -2996,7 +2999,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5c^3+12a^5c^2+12a^5c+4a^5+4a^4bc^3+12a^4bc^2+12a^4bc+4a^4b+18a^4c^3+58a^4c^2+62a^4c+22a^4+12a^3bc^3+36a^3bc^2+36a^3bc+12a^3b+28a^3c^3+98a^3c^2+112a^3c+42a^3+12a^2bc^3+36a^2bc^2+36a^2bc+12a^2b+16a^2c^3+66a^2c^2+84a^2c+34a^2+4ab^3c^3+12ab^3c^2+12ab^3c+4ab^3+3ab^2c^3+9ab^2c^2+9ab^2c+3ab^2-2abc^3-6abc^2-6abc-2ab+4ac^3+4ac^2+4b^4c^3+12b^4c^2+12b^4c+4b^4+14b^3c^3+46b^3c^2+50b^3c+18b^3+9b^2c^3+36b^2c^2+45b^2c+18b^2+2bc^3-2bc+10c^3+14c^2$" + "Numerator after substitutions: $4 p^{5} r^{3} + 12 p^{5} r^{2} + 12 p^{5} r + 4 p^{5} + 4 p^{4} q r^{3} + 12 p^{4} q r^{2} + 12 p^{4} q r + 4 p^{4} q + 18 p^{4} r^{3} + 58 p^{4} r^{2} + 62 p^{4} r + 22 p^{4} + 12 p^{3} q r^{3} + 36 p^{3} q r^{2} + 36 p^{3} q r + 12 p^{3} q + 28 p^{3} r^{3} + 98 p^{3} r^{2} + 112 p^{3} r + 42 p^{3} + 12 p^{2} q r^{3} + 36 p^{2} q r^{2} + 36 p^{2} q r + 12 p^{2} q + 16 p^{2} r^{3} + 66 p^{2} r^{2} + 84 p^{2} r + 34 p^{2} + 4 p q^{3} r^{3} + 12 p q^{3} r^{2} + 12 p q^{3} r + 4 p q^{3} + 3 p q^{2} r^{3} + 9 p q^{2} r^{2} + 9 p q^{2} r + 3 p q^{2} - 2 p q r^{3} - 6 p q r^{2} - 6 p q r - 2 p q + 4 p r^{3} + 4 p r^{2} + 4 q^{4} r^{3} + 12 q^{4} r^{2} + 12 q^{4} r + 4 q^{4} + 14 q^{3} r^{3} + 46 q^{3} r^{2} + 50 q^{3} r + 18 q^{3} + 9 q^{2} r^{3} + 36 q^{2} r^{2} + 45 q^{2} r + 18 q^{2} + 2 q r^{3} - 2 q r + 10 r^{3} + 14 r^{2}$" ], "text/plain": [ "" @@ -3032,7 +3035,7 @@ { "data": { "text/latex": [ - "$$2abc^3 \\le a^2bc^3+bc^3$$" + "$$2 p q r^{3} \\le p^{2} q r^{3}+q r^{3}$$" ], "text/plain": [ "" @@ -3044,7 +3047,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 p q \\le p^{2}+q^{2}$$" ], "text/plain": [ "" @@ -3056,7 +3059,7 @@ { "data": { "text/latex": [ - "$$2bc \\le b^2+c^2$$" + "$$2 q r \\le q^{2}+r^{2}$$" ], "text/plain": [ "" @@ -3068,7 +3071,7 @@ { "data": { "text/latex": [ - "$$6abc \\le 2a^3b+2b^2c+2c^2$$" + "$$6 p q r \\le 2 p^{3} q+2 q^{2} r+2 r^{2}$$" ], "text/plain": [ "" @@ -3080,7 +3083,7 @@ { "data": { "text/latex": [ - "$$6abc^2 \\le 2ab^2c^3+ab^2+3ac^2$$" + "$$6 p q r^{2} \\le 2 p q^{2} r^{3}+p q^{2}+3 p r^{2}$$" ], "text/plain": [ "" @@ -3092,7 +3095,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5c^3+12a^5c^2+12a^5c+4a^5+4a^4bc^3+12a^4bc^2+12a^4bc+4a^4b+18a^4c^3+58a^4c^2+62a^4c+22a^4+12a^3bc^3+36a^3bc^2+36a^3bc+10a^3b+28a^3c^3+98a^3c^2+112a^3c+42a^3+11a^2bc^3+36a^2bc^2+36a^2bc+12a^2b+16a^2c^3+66a^2c^2+84a^2c+33a^2+4ab^3c^3+12ab^3c^2+12ab^3c+4ab^3+ab^2c^3+9ab^2c^2+9ab^2c+2ab^2+4ac^3+ac^2+4b^4c^3+12b^4c^2+12b^4c+4b^4+14b^3c^3+46b^3c^2+50b^3c+18b^3+9b^2c^3+36b^2c^2+43b^2c+16b^2+bc^3+10c^3+11c^2 $$" + "$$ 0 \\le 4 p^{5} r^{3}+12 p^{5} r^{2}+12 p^{5} r+4 p^{5}+4 p^{4} q r^{3}+12 p^{4} q r^{2}+12 p^{4} q r+4 p^{4} q+18 p^{4} r^{3}+58 p^{4} r^{2}+62 p^{4} r+22 p^{4}+12 p^{3} q r^{3}+36 p^{3} q r^{2}+36 p^{3} q r+10 p^{3} q+28 p^{3} r^{3}+98 p^{3} r^{2}+112 p^{3} r+42 p^{3}+11 p^{2} q r^{3}+36 p^{2} q r^{2}+36 p^{2} q r+12 p^{2} q+16 p^{2} r^{3}+66 p^{2} r^{2}+84 p^{2} r+33 p^{2}+4 p q^{3} r^{3}+12 p q^{3} r^{2}+12 p q^{3} r+4 p q^{3}+p q^{2} r^{3}+9 p q^{2} r^{2}+9 p q^{2} r+2 p q^{2}+4 p r^{3}+p r^{2}+4 q^{4} r^{3}+12 q^{4} r^{2}+12 q^{4} r+4 q^{4}+14 q^{3} r^{3}+46 q^{3} r^{2}+50 q^{3} r+18 q^{3}+9 q^{2} r^{3}+36 q^{2} r^{2}+43 q^{2} r+16 q^{2}+q r^{3}+10 r^{3}+11 r^{2} $$" ], "text/plain": [ "" @@ -3116,8 +3119,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -3129,7 +3131,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1/(1+a),b\\to 1+b,c\\to 1/(1+c)$" + "Substitute $a\\to 1/(1+s),b\\to 1+t,c\\to 1/(1+u)$" ], "text/plain": [ "" @@ -3141,7 +3143,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5b^4c^3+12a^5b^4c^2+12a^5b^4c+4a^5b^4+10a^5b^3c^3+34a^5b^3c^2+38a^5b^3c+14a^5b^3+6a^5b^2c^3+27a^5b^2c^2+36a^5b^2c+15a^5b^2+8a^5bc^3+18a^5bc^2+16a^5bc+6a^5b+8a^5c^3+24a^5c^2+22a^5c+10a^5+20a^4b^4c^3+60a^4b^4c^2+60a^4b^4c+20a^4b^4+54a^4b^3c^3+182a^4b^3c^2+202a^4b^3c+74a^4b^3+33a^4b^2c^3+144a^4b^2c^2+189a^4b^2c+78a^4b^2+34a^4bc^3+72a^4bc^2+62a^4bc+24a^4b+44a^4c^3+114a^4c^2+90a^4c+40a^4+40a^3b^4c^3+120a^3b^4c^2+120a^3b^4c+40a^3b^4+116a^3b^3c^3+388a^3b^3c^2+428a^3b^3c+156a^3b^3+72a^3b^2c^3+306a^3b^2c^2+396a^3b^2c+162a^3b^2+56a^3bc^3+108a^3bc^2+88a^3bc+36a^3b+96a^3c^3+216a^3c^2+140a^3c+60a^3+40a^2b^4c^3+120a^2b^4c^2+120a^2b^4c+40a^2b^4+124a^2b^3c^3+412a^2b^3c^2+452a^2b^3c+164a^2b^3+78a^2b^2c^3+324a^2b^2c^2+414a^2b^2c+168a^2b^2+40a^2bc^3+60a^2bc^2+40a^2bc+20a^2b+100a^2c^3+190a^2c^2+84a^2c+34a^2+20ab^4c^3+60ab^4c^2+60ab^4c+20ab^4+66ab^3c^3+218ab^3c^2+238ab^3c+86ab^3+42ab^2c^3+171ab^2c^2+216ab^2c+87ab^2+12abc^3+6abc^2-4abc+2ab+46ac^3+66ac^2+4b^4c^3+12b^4c^2+12b^4c+4b^4+14b^3c^3+46b^3c^2+50b^3c+18b^3+9b^2c^3+36b^2c^2+45b^2c+18b^2+2bc^3-2bc+10c^3+14c^2$" + "Numerator after substitutions: $4 s^{5} t^{4} u^{3} + 12 s^{5} t^{4} u^{2} + 12 s^{5} t^{4} u + 4 s^{5} t^{4} + 10 s^{5} t^{3} u^{3} + 34 s^{5} t^{3} u^{2} + 38 s^{5} t^{3} u + 14 s^{5} t^{3} + 6 s^{5} t^{2} u^{3} + 27 s^{5} t^{2} u^{2} + 36 s^{5} t^{2} u + 15 s^{5} t^{2} + 8 s^{5} t u^{3} + 18 s^{5} t u^{2} + 16 s^{5} t u + 6 s^{5} t + 8 s^{5} u^{3} + 24 s^{5} u^{2} + 22 s^{5} u + 10 s^{5} + 20 s^{4} t^{4} u^{3} + 60 s^{4} t^{4} u^{2} + 60 s^{4} t^{4} u + 20 s^{4} t^{4} + 54 s^{4} t^{3} u^{3} + 182 s^{4} t^{3} u^{2} + 202 s^{4} t^{3} u + 74 s^{4} t^{3} + 33 s^{4} t^{2} u^{3} + 144 s^{4} t^{2} u^{2} + 189 s^{4} t^{2} u + 78 s^{4} t^{2} + 34 s^{4} t u^{3} + 72 s^{4} t u^{2} + 62 s^{4} t u + 24 s^{4} t + 44 s^{4} u^{3} + 114 s^{4} u^{2} + 90 s^{4} u + 40 s^{4} + 40 s^{3} t^{4} u^{3} + 120 s^{3} t^{4} u^{2} + 120 s^{3} t^{4} u + 40 s^{3} t^{4} + 116 s^{3} t^{3} u^{3} + 388 s^{3} t^{3} u^{2} + 428 s^{3} t^{3} u + 156 s^{3} t^{3} + 72 s^{3} t^{2} u^{3} + 306 s^{3} t^{2} u^{2} + 396 s^{3} t^{2} u + 162 s^{3} t^{2} + 56 s^{3} t u^{3} + 108 s^{3} t u^{2} + 88 s^{3} t u + 36 s^{3} t + 96 s^{3} u^{3} + 216 s^{3} u^{2} + 140 s^{3} u + 60 s^{3} + 40 s^{2} t^{4} u^{3} + 120 s^{2} t^{4} u^{2} + 120 s^{2} t^{4} u + 40 s^{2} t^{4} + 124 s^{2} t^{3} u^{3} + 412 s^{2} t^{3} u^{2} + 452 s^{2} t^{3} u + 164 s^{2} t^{3} + 78 s^{2} t^{2} u^{3} + 324 s^{2} t^{2} u^{2} + 414 s^{2} t^{2} u + 168 s^{2} t^{2} + 40 s^{2} t u^{3} + 60 s^{2} t u^{2} + 40 s^{2} t u + 20 s^{2} t + 100 s^{2} u^{3} + 190 s^{2} u^{2} + 84 s^{2} u + 34 s^{2} + 20 s t^{4} u^{3} + 60 s t^{4} u^{2} + 60 s t^{4} u + 20 s t^{4} + 66 s t^{3} u^{3} + 218 s t^{3} u^{2} + 238 s t^{3} u + 86 s t^{3} + 42 s t^{2} u^{3} + 171 s t^{2} u^{2} + 216 s t^{2} u + 87 s t^{2} + 12 s t u^{3} + 6 s t u^{2} - 4 s t u + 2 s t + 46 s u^{3} + 66 s u^{2} + 4 t^{4} u^{3} + 12 t^{4} u^{2} + 12 t^{4} u + 4 t^{4} + 14 t^{3} u^{3} + 46 t^{3} u^{2} + 50 t^{3} u + 18 t^{3} + 9 t^{2} u^{3} + 36 t^{2} u^{2} + 45 t^{2} u + 18 t^{2} + 2 t u^{3} - 2 t u + 10 u^{3} + 14 u^{2}$" ], "text/plain": [ "" @@ -3177,7 +3179,7 @@ { "data": { "text/latex": [ - "$$4abc \\le a^2c^2+2ab^2+c^2$$" + "$$4 s t u \\le s^{2} u^{2}+2 s t^{2}+u^{2}$$" ], "text/plain": [ "" @@ -3189,7 +3191,7 @@ { "data": { "text/latex": [ - "$$2bc \\le b^2+c^2$$" + "$$2 t u \\le t^{2}+u^{2}$$" ], "text/plain": [ "" @@ -3201,7 +3203,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5b^4c^3+12a^5b^4c^2+12a^5b^4c+4a^5b^4+10a^5b^3c^3+34a^5b^3c^2+38a^5b^3c+14a^5b^3+6a^5b^2c^3+27a^5b^2c^2+36a^5b^2c+15a^5b^2+8a^5bc^3+18a^5bc^2+16a^5bc+6a^5b+8a^5c^3+24a^5c^2+22a^5c+10a^5+20a^4b^4c^3+60a^4b^4c^2+60a^4b^4c+20a^4b^4+54a^4b^3c^3+182a^4b^3c^2+202a^4b^3c+74a^4b^3+33a^4b^2c^3+144a^4b^2c^2+189a^4b^2c+78a^4b^2+34a^4bc^3+72a^4bc^2+62a^4bc+24a^4b+44a^4c^3+114a^4c^2+90a^4c+40a^4+40a^3b^4c^3+120a^3b^4c^2+120a^3b^4c+40a^3b^4+116a^3b^3c^3+388a^3b^3c^2+428a^3b^3c+156a^3b^3+72a^3b^2c^3+306a^3b^2c^2+396a^3b^2c+162a^3b^2+56a^3bc^3+108a^3bc^2+88a^3bc+36a^3b+96a^3c^3+216a^3c^2+140a^3c+60a^3+40a^2b^4c^3+120a^2b^4c^2+120a^2b^4c+40a^2b^4+124a^2b^3c^3+412a^2b^3c^2+452a^2b^3c+164a^2b^3+78a^2b^2c^3+324a^2b^2c^2+414a^2b^2c+168a^2b^2+40a^2bc^3+60a^2bc^2+40a^2bc+20a^2b+100a^2c^3+189a^2c^2+84a^2c+34a^2+20ab^4c^3+60ab^4c^2+60ab^4c+20ab^4+66ab^3c^3+218ab^3c^2+238ab^3c+86ab^3+42ab^2c^3+171ab^2c^2+216ab^2c+85ab^2+12abc^3+6abc^2+2ab+46ac^3+66ac^2+4b^4c^3+12b^4c^2+12b^4c+4b^4+14b^3c^3+46b^3c^2+50b^3c+18b^3+9b^2c^3+36b^2c^2+45b^2c+17b^2+2bc^3+10c^3+12c^2 $$" + "$$ 0 \\le 4 s^{5} t^{4} u^{3}+12 s^{5} t^{4} u^{2}+12 s^{5} t^{4} u+4 s^{5} t^{4}+10 s^{5} t^{3} u^{3}+34 s^{5} t^{3} u^{2}+38 s^{5} t^{3} u+14 s^{5} t^{3}+6 s^{5} t^{2} u^{3}+27 s^{5} t^{2} u^{2}+36 s^{5} t^{2} u+15 s^{5} t^{2}+8 s^{5} t u^{3}+18 s^{5} t u^{2}+16 s^{5} t u+6 s^{5} t+8 s^{5} u^{3}+24 s^{5} u^{2}+22 s^{5} u+10 s^{5}+20 s^{4} t^{4} u^{3}+60 s^{4} t^{4} u^{2}+60 s^{4} t^{4} u+20 s^{4} t^{4}+54 s^{4} t^{3} u^{3}+182 s^{4} t^{3} u^{2}+202 s^{4} t^{3} u+74 s^{4} t^{3}+33 s^{4} t^{2} u^{3}+144 s^{4} t^{2} u^{2}+189 s^{4} t^{2} u+78 s^{4} t^{2}+34 s^{4} t u^{3}+72 s^{4} t u^{2}+62 s^{4} t u+24 s^{4} t+44 s^{4} u^{3}+114 s^{4} u^{2}+90 s^{4} u+40 s^{4}+40 s^{3} t^{4} u^{3}+120 s^{3} t^{4} u^{2}+120 s^{3} t^{4} u+40 s^{3} t^{4}+116 s^{3} t^{3} u^{3}+388 s^{3} t^{3} u^{2}+428 s^{3} t^{3} u+156 s^{3} t^{3}+72 s^{3} t^{2} u^{3}+306 s^{3} t^{2} u^{2}+396 s^{3} t^{2} u+162 s^{3} t^{2}+56 s^{3} t u^{3}+108 s^{3} t u^{2}+88 s^{3} t u+36 s^{3} t+96 s^{3} u^{3}+216 s^{3} u^{2}+140 s^{3} u+60 s^{3}+40 s^{2} t^{4} u^{3}+120 s^{2} t^{4} u^{2}+120 s^{2} t^{4} u+40 s^{2} t^{4}+124 s^{2} t^{3} u^{3}+412 s^{2} t^{3} u^{2}+452 s^{2} t^{3} u+164 s^{2} t^{3}+78 s^{2} t^{2} u^{3}+324 s^{2} t^{2} u^{2}+414 s^{2} t^{2} u+168 s^{2} t^{2}+40 s^{2} t u^{3}+60 s^{2} t u^{2}+40 s^{2} t u+20 s^{2} t+100 s^{2} u^{3}+189 s^{2} u^{2}+84 s^{2} u+34 s^{2}+20 s t^{4} u^{3}+60 s t^{4} u^{2}+60 s t^{4} u+20 s t^{4}+66 s t^{3} u^{3}+218 s t^{3} u^{2}+238 s t^{3} u+86 s t^{3}+42 s t^{2} u^{3}+171 s t^{2} u^{2}+216 s t^{2} u+85 s t^{2}+12 s t u^{3}+6 s t u^{2}+2 s t+46 s u^{3}+66 s u^{2}+4 t^{4} u^{3}+12 t^{4} u^{2}+12 t^{4} u+4 t^{4}+14 t^{3} u^{3}+46 t^{3} u^{2}+50 t^{3} u+18 t^{3}+9 t^{2} u^{3}+36 t^{2} u^{2}+45 t^{2} u+17 t^{2}+2 t u^{3}+10 u^{3}+12 u^{2} $$" ], "text/plain": [ "" @@ -3225,8 +3227,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -3238,7 +3239,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1+a,b\\to 1/(1+b),c\\to 1/(1+c)$" + "Substitute $a\\to 1+v,b\\to 1/(1+w),c\\to 1/(1+x)$" ], "text/plain": [ "" @@ -3250,7 +3251,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $4a^5b^4c^3+12a^5b^4c^2+12a^5b^4c+4a^5b^4+16a^5b^3c^3+48a^5b^3c^2+48a^5b^3c+16a^5b^3+24a^5b^2c^3+72a^5b^2c^2+72a^5b^2c+24a^5b^2+16a^5bc^3+48a^5bc^2+48a^5bc+16a^5b+4a^5c^3+12a^5c^2+12a^5c+4a^5+14a^4b^4c^3+46a^4b^4c^2+50a^4b^4c+18a^4b^4+60a^4b^3c^3+196a^4b^3c^2+212a^4b^3c+76a^4b^3+96a^4b^2c^3+312a^4b^2c^2+336a^4b^2c+120a^4b^2+68a^4bc^3+220a^4bc^2+236a^4bc+84a^4b+18a^4c^3+58a^4c^2+62a^4c+22a^4+16a^3b^4c^3+62a^3b^4c^2+76a^3b^4c+30a^3b^4+76a^3b^3c^3+284a^3b^3c^2+340a^3b^3c+132a^3b^3+132a^3b^2c^3+480a^3b^2c^2+564a^3b^2c+216a^3b^2+100a^3bc^3+356a^3bc^2+412a^3bc+156a^3b+28a^3c^3+98a^3c^2+112a^3c+42a^3+4a^2b^4c^3+30a^2b^4c^2+48a^2b^4c+22a^2b^4+28a^2b^3c^3+156a^2b^3c^2+228a^2b^3c+100a^2b^3+60a^2b^2c^3+288a^2b^2c^2+396a^2b^2c+168a^2b^2+52a^2bc^3+228a^2bc^2+300a^2bc+124a^2b+16a^2c^3+66a^2c^2+84a^2c+34a^2+5ab^4c^3+7ab^4c^2+3ab^4c+ab^4+24ab^3c^3+40ab^3c^2+24ab^3c+8ab^3+33ab^2c^3+51ab^2c^2+27ab^2c+9ab^2+18abc^3+22abc^2+6abc+2ab+4ac^3+4ac^2+7b^4c^3+16b^4c^2+9b^4c+4b^4+38b^3c^3+82b^3c^2+46b^3c+18b^3+63b^2c^3+120b^2c^2+51b^2c+18b^2+38bc^3+56bc^2+2bc+10c^3+14c^2$" + "Numerator after substitutions: $4 v^{5} w^{4} x^{3} + 12 v^{5} w^{4} x^{2} + 12 v^{5} w^{4} x + 4 v^{5} w^{4} + 16 v^{5} w^{3} x^{3} + 48 v^{5} w^{3} x^{2} + 48 v^{5} w^{3} x + 16 v^{5} w^{3} + 24 v^{5} w^{2} x^{3} + 72 v^{5} w^{2} x^{2} + 72 v^{5} w^{2} x + 24 v^{5} w^{2} + 16 v^{5} w x^{3} + 48 v^{5} w x^{2} + 48 v^{5} w x + 16 v^{5} w + 4 v^{5} x^{3} + 12 v^{5} x^{2} + 12 v^{5} x + 4 v^{5} + 14 v^{4} w^{4} x^{3} + 46 v^{4} w^{4} x^{2} + 50 v^{4} w^{4} x + 18 v^{4} w^{4} + 60 v^{4} w^{3} x^{3} + 196 v^{4} w^{3} x^{2} + 212 v^{4} w^{3} x + 76 v^{4} w^{3} + 96 v^{4} w^{2} x^{3} + 312 v^{4} w^{2} x^{2} + 336 v^{4} w^{2} x + 120 v^{4} w^{2} + 68 v^{4} w x^{3} + 220 v^{4} w x^{2} + 236 v^{4} w x + 84 v^{4} w + 18 v^{4} x^{3} + 58 v^{4} x^{2} + 62 v^{4} x + 22 v^{4} + 16 v^{3} w^{4} x^{3} + 62 v^{3} w^{4} x^{2} + 76 v^{3} w^{4} x + 30 v^{3} w^{4} + 76 v^{3} w^{3} x^{3} + 284 v^{3} w^{3} x^{2} + 340 v^{3} w^{3} x + 132 v^{3} w^{3} + 132 v^{3} w^{2} x^{3} + 480 v^{3} w^{2} x^{2} + 564 v^{3} w^{2} x + 216 v^{3} w^{2} + 100 v^{3} w x^{3} + 356 v^{3} w x^{2} + 412 v^{3} w x + 156 v^{3} w + 28 v^{3} x^{3} + 98 v^{3} x^{2} + 112 v^{3} x + 42 v^{3} + 4 v^{2} w^{4} x^{3} + 30 v^{2} w^{4} x^{2} + 48 v^{2} w^{4} x + 22 v^{2} w^{4} + 28 v^{2} w^{3} x^{3} + 156 v^{2} w^{3} x^{2} + 228 v^{2} w^{3} x + 100 v^{2} w^{3} + 60 v^{2} w^{2} x^{3} + 288 v^{2} w^{2} x^{2} + 396 v^{2} w^{2} x + 168 v^{2} w^{2} + 52 v^{2} w x^{3} + 228 v^{2} w x^{2} + 300 v^{2} w x + 124 v^{2} w + 16 v^{2} x^{3} + 66 v^{2} x^{2} + 84 v^{2} x + 34 v^{2} + 5 v w^{4} x^{3} + 7 v w^{4} x^{2} + 3 v w^{4} x + v w^{4} + 24 v w^{3} x^{3} + 40 v w^{3} x^{2} + 24 v w^{3} x + 8 v w^{3} + 33 v w^{2} x^{3} + 51 v w^{2} x^{2} + 27 v w^{2} x + 9 v w^{2} + 18 v w x^{3} + 22 v w x^{2} + 6 v w x + 2 v w + 4 v x^{3} + 4 v x^{2} + 7 w^{4} x^{3} + 16 w^{4} x^{2} + 9 w^{4} x + 4 w^{4} + 38 w^{3} x^{3} + 82 w^{3} x^{2} + 46 w^{3} x + 18 w^{3} + 63 w^{2} x^{3} + 120 w^{2} x^{2} + 51 w^{2} x + 18 w^{2} + 38 w x^{3} + 56 w x^{2} + 2 w x + 10 x^{3} + 14 x^{2}$" ], "text/plain": [ "" @@ -3274,7 +3275,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^5b^4c^3+12a^5b^4c^2+12a^5b^4c+4a^5b^4+16a^5b^3c^3+48a^5b^3c^2+48a^5b^3c+16a^5b^3+24a^5b^2c^3+72a^5b^2c^2+72a^5b^2c+24a^5b^2+16a^5bc^3+48a^5bc^2+48a^5bc+16a^5b+4a^5c^3+12a^5c^2+12a^5c+4a^5+14a^4b^4c^3+46a^4b^4c^2+50a^4b^4c+18a^4b^4+60a^4b^3c^3+196a^4b^3c^2+212a^4b^3c+76a^4b^3+96a^4b^2c^3+312a^4b^2c^2+336a^4b^2c+120a^4b^2+68a^4bc^3+220a^4bc^2+236a^4bc+84a^4b+18a^4c^3+58a^4c^2+62a^4c+22a^4+16a^3b^4c^3+62a^3b^4c^2+76a^3b^4c+30a^3b^4+76a^3b^3c^3+284a^3b^3c^2+340a^3b^3c+132a^3b^3+132a^3b^2c^3+480a^3b^2c^2+564a^3b^2c+216a^3b^2+100a^3bc^3+356a^3bc^2+412a^3bc+156a^3b+28a^3c^3+98a^3c^2+112a^3c+42a^3+4a^2b^4c^3+30a^2b^4c^2+48a^2b^4c+22a^2b^4+28a^2b^3c^3+156a^2b^3c^2+228a^2b^3c+100a^2b^3+60a^2b^2c^3+288a^2b^2c^2+396a^2b^2c+168a^2b^2+52a^2bc^3+228a^2bc^2+300a^2bc+124a^2b+16a^2c^3+66a^2c^2+84a^2c+34a^2+5ab^4c^3+7ab^4c^2+3ab^4c+ab^4+24ab^3c^3+40ab^3c^2+24ab^3c+8ab^3+33ab^2c^3+51ab^2c^2+27ab^2c+9ab^2+18abc^3+22abc^2+6abc+2ab+4ac^3+4ac^2+7b^4c^3+16b^4c^2+9b^4c+4b^4+38b^3c^3+82b^3c^2+46b^3c+18b^3+63b^2c^3+120b^2c^2+51b^2c+18b^2+38bc^3+56bc^2+2bc+10c^3+14c^2 $$" + "$$ 0 \\le 4 v^{5} w^{4} x^{3}+16 v^{5} w^{3} x^{3}+24 v^{5} w^{2} x^{3}+16 v^{5} w x^{3}+4 v^{5} x^{3}+14 v^{4} w^{4} x^{3}+60 v^{4} w^{3} x^{3}+96 v^{4} w^{2} x^{3}+68 v^{4} w x^{3}+18 v^{4} x^{3}+16 v^{3} w^{4} x^{3}+76 v^{3} w^{3} x^{3}+132 v^{3} w^{2} x^{3}+100 v^{3} w x^{3}+28 v^{3} x^{3}+4 v^{2} w^{4} x^{3}+28 v^{2} w^{3} x^{3}+60 v^{2} w^{2} x^{3}+52 v^{2} w x^{3}+16 v^{2} x^{3}+5 v w^{4} x^{3}+24 v w^{3} x^{3}+33 v w^{2} x^{3}+18 v w x^{3}+4 v x^{3}+7 w^{4} x^{3}+38 w^{3} x^{3}+63 w^{2} x^{3}+38 w x^{3}+10 x^{3}+12 v^{5} w^{4} x^{2}+48 v^{5} w^{3} x^{2}+72 v^{5} w^{2} x^{2}+48 v^{5} w x^{2}+12 v^{5} x^{2}+46 v^{4} w^{4} x^{2}+196 v^{4} w^{3} x^{2}+312 v^{4} w^{2} x^{2}+220 v^{4} w x^{2}+58 v^{4} x^{2}+62 v^{3} w^{4} x^{2}+284 v^{3} w^{3} x^{2}+480 v^{3} w^{2} x^{2}+356 v^{3} w x^{2}+98 v^{3} x^{2}+30 v^{2} w^{4} x^{2}+156 v^{2} w^{3} x^{2}+288 v^{2} w^{2} x^{2}+228 v^{2} w x^{2}+66 v^{2} x^{2}+7 v w^{4} x^{2}+40 v w^{3} x^{2}+51 v w^{2} x^{2}+22 v w x^{2}+4 v x^{2}+16 w^{4} x^{2}+82 w^{3} x^{2}+120 w^{2} x^{2}+56 w x^{2}+14 x^{2}+12 v^{5} w^{4} x+48 v^{5} w^{3} x+72 v^{5} w^{2} x+48 v^{5} w x+12 v^{5} x+50 v^{4} w^{4} x+212 v^{4} w^{3} x+336 v^{4} w^{2} x+236 v^{4} w x+62 v^{4} x+76 v^{3} w^{4} x+340 v^{3} w^{3} x+564 v^{3} w^{2} x+412 v^{3} w x+112 v^{3} x+48 v^{2} w^{4} x+228 v^{2} w^{3} x+396 v^{2} w^{2} x+300 v^{2} w x+84 v^{2} x+3 v w^{4} x+24 v w^{3} x+27 v w^{2} x+6 v w x+9 w^{4} x+46 w^{3} x+51 w^{2} x+2 w x+4 v^{5} w^{4}+16 v^{5} w^{3}+24 v^{5} w^{2}+16 v^{5} w+4 v^{5}+18 v^{4} w^{4}+76 v^{4} w^{3}+120 v^{4} w^{2}+84 v^{4} w+22 v^{4}+30 v^{3} w^{4}+132 v^{3} w^{3}+216 v^{3} w^{2}+156 v^{3} w+42 v^{3}+22 v^{2} w^{4}+100 v^{2} w^{3}+168 v^{2} w^{2}+124 v^{2} w+34 v^{2}+v w^{4}+8 v w^{3}+9 v w^{2}+2 v w+4 w^{4}+18 w^{3}+18 w^{2} $$" ], "text/plain": [ "" @@ -3298,8 +3299,7 @@ { "data": { "text/latex": [ - "\n", - "\\hline\n" + "_______________________" ], "text/plain": [ "" @@ -3311,7 +3311,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 1/(1+a),b\\to 1/(1+b),c\\to 1/(1+c)$" + "Substitute $a\\to 1/(1+y),b\\to 1/(1+z),c\\to 1/(1+a_{1})$" ], "text/plain": [ "" @@ -3323,7 +3323,7 @@ { "data": { "text/latex": [ - "Numerator after substitutions: $11a^5b^4c^2+16a^5b^4c+9a^5b^4+10a^5b^3c^3+62a^5b^3c^2+74a^5b^3c+38a^5b^3+30a^5b^2c^3+117a^5b^2c^2+120a^5b^2c+57a^5b^2+24a^5bc^3+78a^5bc^2+72a^5bc+34a^5b+8a^5c^3+24a^5c^2+22a^5c+10a^5+9a^4b^4c^3+64a^4b^4c^2+75a^4b^4c+40a^4b^4+86a^4b^3c^3+346a^4b^3c^2+350a^4b^3c+170a^4b^3+195a^4b^2c^3+612a^4b^2c^2+543a^4b^2c+246a^4b^2+142a^4bc^3+384a^4bc^2+298a^4bc+136a^4b+44a^4c^3+114a^4c^2+90a^4c+40a^4+36a^3b^4c^3+146a^3b^4c^2+140a^3b^4c+70a^3b^4+244a^3b^3c^3+764a^3b^3c^2+660a^3b^3c+300a^3b^3+480a^3b^2c^3+1278a^3b^2c^2+972a^3b^2c+414a^3b^2+328a^3bc^3+756a^3bc^2+472a^3bc+204a^3b+96a^3c^3+216a^3c^2+140a^3c+60a^3+54a^2b^4c^3+162a^2b^4c^2+126a^2b^4c+58a^2b^4+312a^2b^3c^3+816a^2b^3c^2+592a^2b^3c+248a^2b^3+558a^2b^2c^3+1284a^2b^2c^2+798a^2b^2c+312a^2b^2+360a^2bc^3+700a^2bc^2+296a^2bc+116a^2b+100a^2c^3+190a^2c^2+84a^2c+34a^2+30ab^4c^3+73ab^4c^2+42ab^4c+19ab^4+166ab^3c^3+370ab^3c^2+206ab^3c+82ab^3+282ab^2c^3+549ab^2c^2+228ab^2c+81ab^2+172abc^3+258abc^2+4abc-2ab+46ac^3+66ac^2+7b^4c^3+16b^4c^2+9b^4c+4b^4+38b^3c^3+82b^3c^2+46b^3c+18b^3+63b^2c^3+120b^2c^2+51b^2c+18b^2+38bc^3+56bc^2+2bc+10c^3+14c^2$" + "Numerator after substitutions: $10 a_{1}^{3} y^{5} z^{3} + 30 a_{1}^{3} y^{5} z^{2} + 24 a_{1}^{3} y^{5} z + 8 a_{1}^{3} y^{5} + 9 a_{1}^{3} y^{4} z^{4} + 86 a_{1}^{3} y^{4} z^{3} + 195 a_{1}^{3} y^{4} z^{2} + 142 a_{1}^{3} y^{4} z + 44 a_{1}^{3} y^{4} + 36 a_{1}^{3} y^{3} z^{4} + 244 a_{1}^{3} y^{3} z^{3} + 480 a_{1}^{3} y^{3} z^{2} + 328 a_{1}^{3} y^{3} z + 96 a_{1}^{3} y^{3} + 54 a_{1}^{3} y^{2} z^{4} + 312 a_{1}^{3} y^{2} z^{3} + 558 a_{1}^{3} y^{2} z^{2} + 360 a_{1}^{3} y^{2} z + 100 a_{1}^{3} y^{2} + 30 a_{1}^{3} y z^{4} + 166 a_{1}^{3} y z^{3} + 282 a_{1}^{3} y z^{2} + 172 a_{1}^{3} y z + 46 a_{1}^{3} y + 7 a_{1}^{3} z^{4} + 38 a_{1}^{3} z^{3} + 63 a_{1}^{3} z^{2} + 38 a_{1}^{3} z + 10 a_{1}^{3} + 11 a_{1}^{2} y^{5} z^{4} + 62 a_{1}^{2} y^{5} z^{3} + 117 a_{1}^{2} y^{5} z^{2} + 78 a_{1}^{2} y^{5} z + 24 a_{1}^{2} y^{5} + 64 a_{1}^{2} y^{4} z^{4} + 346 a_{1}^{2} y^{4} z^{3} + 612 a_{1}^{2} y^{4} z^{2} + 384 a_{1}^{2} y^{4} z + 114 a_{1}^{2} y^{4} + 146 a_{1}^{2} y^{3} z^{4} + 764 a_{1}^{2} y^{3} z^{3} + 1278 a_{1}^{2} y^{3} z^{2} + 756 a_{1}^{2} y^{3} z + 216 a_{1}^{2} y^{3} + 162 a_{1}^{2} y^{2} z^{4} + 816 a_{1}^{2} y^{2} z^{3} + 1284 a_{1}^{2} y^{2} z^{2} + 700 a_{1}^{2} y^{2} z + 190 a_{1}^{2} y^{2} + 73 a_{1}^{2} y z^{4} + 370 a_{1}^{2} y z^{3} + 549 a_{1}^{2} y z^{2} + 258 a_{1}^{2} y z + 66 a_{1}^{2} y + 16 a_{1}^{2} z^{4} + 82 a_{1}^{2} z^{3} + 120 a_{1}^{2} z^{2} + 56 a_{1}^{2} z + 14 a_{1}^{2} + 16 a_{1} y^{5} z^{4} + 74 a_{1} y^{5} z^{3} + 120 a_{1} y^{5} z^{2} + 72 a_{1} y^{5} z + 22 a_{1} y^{5} + 75 a_{1} y^{4} z^{4} + 350 a_{1} y^{4} z^{3} + 543 a_{1} y^{4} z^{2} + 298 a_{1} y^{4} z + 90 a_{1} y^{4} + 140 a_{1} y^{3} z^{4} + 660 a_{1} y^{3} z^{3} + 972 a_{1} y^{3} z^{2} + 472 a_{1} y^{3} z + 140 a_{1} y^{3} + 126 a_{1} y^{2} z^{4} + 592 a_{1} y^{2} z^{3} + 798 a_{1} y^{2} z^{2} + 296 a_{1} y^{2} z + 84 a_{1} y^{2} + 42 a_{1} y z^{4} + 206 a_{1} y z^{3} + 228 a_{1} y z^{2} + 4 a_{1} y z + 9 a_{1} z^{4} + 46 a_{1} z^{3} + 51 a_{1} z^{2} + 2 a_{1} z + 9 y^{5} z^{4} + 38 y^{5} z^{3} + 57 y^{5} z^{2} + 34 y^{5} z + 10 y^{5} + 40 y^{4} z^{4} + 170 y^{4} z^{3} + 246 y^{4} z^{2} + 136 y^{4} z + 40 y^{4} + 70 y^{3} z^{4} + 300 y^{3} z^{3} + 414 y^{3} z^{2} + 204 y^{3} z + 60 y^{3} + 58 y^{2} z^{4} + 248 y^{2} z^{3} + 312 y^{2} z^{2} + 116 y^{2} z + 34 y^{2} + 19 y z^{4} + 82 y z^{3} + 81 y z^{2} - 2 y z + 4 z^{4} + 18 z^{3} + 18 z^{2}$" ], "text/plain": [ "" @@ -3359,7 +3359,7 @@ { "data": { "text/latex": [ - "$$2ab \\le a^2+b^2$$" + "$$2 y z \\le y^{2}+z^{2}$$" ], "text/plain": [ "" @@ -3371,7 +3371,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 11a^5b^4c^2+16a^5b^4c+9a^5b^4+10a^5b^3c^3+62a^5b^3c^2+74a^5b^3c+38a^5b^3+30a^5b^2c^3+117a^5b^2c^2+120a^5b^2c+57a^5b^2+24a^5bc^3+78a^5bc^2+72a^5bc+34a^5b+8a^5c^3+24a^5c^2+22a^5c+10a^5+9a^4b^4c^3+64a^4b^4c^2+75a^4b^4c+40a^4b^4+86a^4b^3c^3+346a^4b^3c^2+350a^4b^3c+170a^4b^3+195a^4b^2c^3+612a^4b^2c^2+543a^4b^2c+246a^4b^2+142a^4bc^3+384a^4bc^2+298a^4bc+136a^4b+44a^4c^3+114a^4c^2+90a^4c+40a^4+36a^3b^4c^3+146a^3b^4c^2+140a^3b^4c+70a^3b^4+244a^3b^3c^3+764a^3b^3c^2+660a^3b^3c+300a^3b^3+480a^3b^2c^3+1278a^3b^2c^2+972a^3b^2c+414a^3b^2+328a^3bc^3+756a^3bc^2+472a^3bc+204a^3b+96a^3c^3+216a^3c^2+140a^3c+60a^3+54a^2b^4c^3+162a^2b^4c^2+126a^2b^4c+58a^2b^4+312a^2b^3c^3+816a^2b^3c^2+592a^2b^3c+248a^2b^3+558a^2b^2c^3+1284a^2b^2c^2+798a^2b^2c+312a^2b^2+360a^2bc^3+700a^2bc^2+296a^2bc+116a^2b+100a^2c^3+190a^2c^2+84a^2c+33a^2+30ab^4c^3+73ab^4c^2+42ab^4c+19ab^4+166ab^3c^3+370ab^3c^2+206ab^3c+82ab^3+282ab^2c^3+549ab^2c^2+228ab^2c+81ab^2+172abc^3+258abc^2+4abc+46ac^3+66ac^2+7b^4c^3+16b^4c^2+9b^4c+4b^4+38b^3c^3+82b^3c^2+46b^3c+18b^3+63b^2c^3+120b^2c^2+51b^2c+17b^2+38bc^3+56bc^2+2bc+10c^3+14c^2 $$" + "$$ 0 \\le 11 a_{1}^{2} y^{5} z^{4}+16 a_{1} y^{5} z^{4}+9 y^{5} z^{4}+10 a_{1}^{3} y^{5} z^{3}+62 a_{1}^{2} y^{5} z^{3}+74 a_{1} y^{5} z^{3}+38 y^{5} z^{3}+30 a_{1}^{3} y^{5} z^{2}+117 a_{1}^{2} y^{5} z^{2}+120 a_{1} y^{5} z^{2}+57 y^{5} z^{2}+24 a_{1}^{3} y^{5} z+78 a_{1}^{2} y^{5} z+72 a_{1} y^{5} z+34 y^{5} z+8 a_{1}^{3} y^{5}+24 a_{1}^{2} y^{5}+22 a_{1} y^{5}+10 y^{5}+9 a_{1}^{3} y^{4} z^{4}+64 a_{1}^{2} y^{4} z^{4}+75 a_{1} y^{4} z^{4}+40 y^{4} z^{4}+86 a_{1}^{3} y^{4} z^{3}+346 a_{1}^{2} y^{4} z^{3}+350 a_{1} y^{4} z^{3}+170 y^{4} z^{3}+195 a_{1}^{3} y^{4} z^{2}+612 a_{1}^{2} y^{4} z^{2}+543 a_{1} y^{4} z^{2}+246 y^{4} z^{2}+142 a_{1}^{3} y^{4} z+384 a_{1}^{2} y^{4} z+298 a_{1} y^{4} z+136 y^{4} z+44 a_{1}^{3} y^{4}+114 a_{1}^{2} y^{4}+90 a_{1} y^{4}+40 y^{4}+36 a_{1}^{3} y^{3} z^{4}+146 a_{1}^{2} y^{3} z^{4}+140 a_{1} y^{3} z^{4}+70 y^{3} z^{4}+244 a_{1}^{3} y^{3} z^{3}+764 a_{1}^{2} y^{3} z^{3}+660 a_{1} y^{3} z^{3}+300 y^{3} z^{3}+480 a_{1}^{3} y^{3} z^{2}+1278 a_{1}^{2} y^{3} z^{2}+972 a_{1} y^{3} z^{2}+414 y^{3} z^{2}+328 a_{1}^{3} y^{3} z+756 a_{1}^{2} y^{3} z+472 a_{1} y^{3} z+204 y^{3} z+96 a_{1}^{3} y^{3}+216 a_{1}^{2} y^{3}+140 a_{1} y^{3}+60 y^{3}+54 a_{1}^{3} y^{2} z^{4}+162 a_{1}^{2} y^{2} z^{4}+126 a_{1} y^{2} z^{4}+58 y^{2} z^{4}+312 a_{1}^{3} y^{2} z^{3}+816 a_{1}^{2} y^{2} z^{3}+592 a_{1} y^{2} z^{3}+248 y^{2} z^{3}+558 a_{1}^{3} y^{2} z^{2}+1284 a_{1}^{2} y^{2} z^{2}+798 a_{1} y^{2} z^{2}+312 y^{2} z^{2}+360 a_{1}^{3} y^{2} z+700 a_{1}^{2} y^{2} z+296 a_{1} y^{2} z+116 y^{2} z+100 a_{1}^{3} y^{2}+190 a_{1}^{2} y^{2}+84 a_{1} y^{2}+33 y^{2}+30 a_{1}^{3} y z^{4}+73 a_{1}^{2} y z^{4}+42 a_{1} y z^{4}+19 y z^{4}+166 a_{1}^{3} y z^{3}+370 a_{1}^{2} y z^{3}+206 a_{1} y z^{3}+82 y z^{3}+282 a_{1}^{3} y z^{2}+549 a_{1}^{2} y z^{2}+228 a_{1} y z^{2}+81 y z^{2}+172 a_{1}^{3} y z+258 a_{1}^{2} y z+4 a_{1} y z+46 a_{1}^{3} y+66 a_{1}^{2} y+7 a_{1}^{3} z^{4}+16 a_{1}^{2} z^{4}+9 a_{1} z^{4}+4 z^{4}+38 a_{1}^{3} z^{3}+82 a_{1}^{2} z^{3}+46 a_{1} z^{3}+18 z^{3}+63 a_{1}^{3} z^{2}+120 a_{1}^{2} z^{2}+51 a_{1} z^{2}+17 z^{2}+38 a_{1}^{3} z+56 a_{1}^{2} z+2 a_{1} z+10 a_{1}^{3}+14 a_{1}^{2} $$" ], "text/plain": [ "" @@ -3404,6 +3404,7 @@ } ], "source": [ + "newproof()\n", "formula=Sm('-(3a + 2b + c)(2a^3 + 3b^2 + 6c + 1) + (4a + 4b + 4c)(a^4 + b^3 + c^2 + 3)')\n", "powerprove(formula)" ] @@ -3428,7 +3429,7 @@ { "data": { "text/latex": [ - "numerator: $21f(-1,4,3)-21f(1,2,3)-21f(2,3,1)+21f(3,-1,4)-21f(3,1,2)+21f(4,3,-1)$" + "numerator: $21 f{\\left(-1,4,3 \\right)} - 21 f{\\left(1,2,3 \\right)} - 21 f{\\left(2,3,1 \\right)} + 21 f{\\left(3,-1,4 \\right)} - 21 f{\\left(3,1,2 \\right)} + 21 f{\\left(4,3,-1 \\right)}$" ], "text/plain": [ "" @@ -3568,7 +3569,8 @@ "metadata": {}, "outputs": [], "source": [ - "sVars.display=lambda x:None #turn off printing of proofs\n", + "shiro.display=lambda x:None #turn off printing of proofs\n", + "newproof()\n", "formula=cyclize('((a-b)/c)^2-2*sqrt(2)*(a-b)/c')" ] }, @@ -3639,7 +3641,7 @@ { "data": { "text/plain": [ - "(2.5326984818340415e-10, 7.129450063690368, 1.7908873553542452e-10)" + "(1.7908873553542452e-10, 2.5326984818340415e-10, 7.129450063690368)" ] }, "execution_count": 28, @@ -3656,7 +3658,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "First and third value is approximately equal to 0, so we can try to replace 0 with 1." + "First and second value is approximately equal to 0, so we can try to replace 0 with 1." ] }, { @@ -3676,7 +3678,7 @@ } ], "source": [ - "prove(formula1,values='1,7,1')" + "prove(formula1,values='1,1,7')" ] }, { @@ -3694,7 +3696,7 @@ { "data": { "text/plain": [ - "(1.4142142855953455, 39809595184.05965, 1)" + "(1, 1.4142142855953455, 39809595184.05965)" ] }, "execution_count": 30, @@ -3703,7 +3705,7 @@ } ], "source": [ - "newvalues=(values[0]/values[2],values[1]/values[2],1)\n", + "newvalues=(1,values[1]/values[0],values[2]/values[0])\n", "newvalues" ] }, @@ -3724,14 +3726,14 @@ } ], "source": [ - "newvalues[0]**2" + "newvalues[1]**2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Now the second value is very big. Technically we could use it, but it would run into overflow error, so we will use 1 instead of it. First value is very close to $\\sqrt{2}$, so this value will be our next try." + "Now the third value is very big. Technically we could use it, but it would run into overflow error, so we will use 1 instead of it. Second value is very close to $\\sqrt{2}$, so this value will be our next try." ] }, { @@ -3751,7 +3753,7 @@ } ], "source": [ - "prove(formula1,values='sqrt(2),1,1')" + "prove(formula1,values='1,sqrt(2),1')" ] }, { @@ -3781,7 +3783,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to a+c$" + "Substitute $a\\to c + d$" ], "text/plain": [ "" @@ -3793,7 +3795,7 @@ { "data": { "text/latex": [ - "Substitute $c\\to b+c$" + "Substitute $c\\to b + e$" ], "text/plain": [ "" @@ -3805,7 +3807,7 @@ { "data": { "text/latex": [ - "numerator: $2a^4b^2+2a^4bc+a^4c^2+4a^3b^3+2\\sqrt{2}a^3b^2c+10a^3b^2c+2\\sqrt{2}a^3bc^2+6a^3bc^2+2a^3c^3+2a^2b^4+2\\sqrt{2}a^2b^3c+10a^2b^3c+6\\sqrt{2}a^2b^2c^2+12a^2b^2c^2+4a^2bc^3+4\\sqrt{2}a^2bc^3+a^2c^4+2ab^4c+2\\sqrt{2}ab^3c^2+6ab^3c^2+4ab^2c^3+4\\sqrt{2}ab^2c^3+2\\sqrt{2}abc^4+2b^4c^2+4b^3c^3+2b^2c^4$" + "numerator: $2 b^{4} d^{2} + 2 b^{4} d e + 2 b^{4} e^{2} + 4 b^{3} d^{3} + 2 \\sqrt{2} b^{3} d^{2} e + 10 b^{3} d^{2} e + 2 \\sqrt{2} b^{3} d e^{2} + 6 b^{3} d e^{2} + 4 b^{3} e^{3} + 2 b^{2} d^{4} + 2 \\sqrt{2} b^{2} d^{3} e + 10 b^{2} d^{3} e + 6 \\sqrt{2} b^{2} d^{2} e^{2} + 12 b^{2} d^{2} e^{2} + 4 b^{2} d e^{3} + 4 \\sqrt{2} b^{2} d e^{3} + 2 b^{2} e^{4} + 2 b d^{4} e + 2 \\sqrt{2} b d^{3} e^{2} + 6 b d^{3} e^{2} + 4 b d^{2} e^{3} + 4 \\sqrt{2} b d^{2} e^{3} + 2 \\sqrt{2} b d e^{4} + d^{4} e^{2} + 2 d^{3} e^{3} + d^{2} e^{4}$" ], "text/plain": [ "" @@ -3817,7 +3819,7 @@ { "data": { "text/latex": [ - "denominator: $a^2b^4+2a^2b^3c+a^2b^2c^2+2ab^5+6ab^4c+6ab^3c^2+2ab^2c^3+b^6+4b^5c+6b^4c^2+4b^3c^3+b^2c^4$" + "denominator: $b^{6} + 2 b^{5} d + 4 b^{5} e + b^{4} d^{2} + 6 b^{4} d e + 6 b^{4} e^{2} + 2 b^{3} d^{2} e + 6 b^{3} d e^{2} + 4 b^{3} e^{3} + b^{2} d^{2} e^{2} + 2 b^{2} d e^{3} + b^{2} e^{4}$" ], "text/plain": [ "" @@ -3841,7 +3843,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 2a^4b^2+2a^4bc+a^4c^2+4a^3b^3+2\\sqrt{2}a^3b^2c+10a^3b^2c+2\\sqrt{2}a^3bc^2+6a^3bc^2+2a^3c^3+2a^2b^4+2\\sqrt{2}a^2b^3c+10a^2b^3c+6\\sqrt{2}a^2b^2c^2+12a^2b^2c^2+4\\sqrt{2}a^2bc^3+4a^2bc^3+a^2c^4+2ab^4c+2\\sqrt{2}ab^3c^2+6ab^3c^2+4\\sqrt{2}ab^2c^3+4ab^2c^3+2\\sqrt{2}abc^4+2b^4c^2+4b^3c^3+2b^2c^4 $$" + "$$ 0 \\le 2 b^{4} d^{2}+2 b^{4} d e+2 b^{4} e^{2}+4 b^{3} d^{3}+2 \\sqrt{2} b^{3} d^{2} e+10 b^{3} d^{2} e+2 \\sqrt{2} b^{3} d e^{2}+6 b^{3} d e^{2}+4 b^{3} e^{3}+2 b^{2} d^{4}+2 \\sqrt{2} b^{2} d^{3} e+10 b^{2} d^{3} e+6 \\sqrt{2} b^{2} d^{2} e^{2}+12 b^{2} d^{2} e^{2}+4 \\sqrt{2} b^{2} d e^{3}+4 b^{2} d e^{3}+2 b^{2} e^{4}+2 b d^{4} e+2 \\sqrt{2} b d^{3} e^{2}+6 b d^{3} e^{2}+4 \\sqrt{2} b d^{2} e^{3}+4 b d^{2} e^{3}+2 \\sqrt{2} b d e^{4}+d^{4} e^{2}+2 d^{3} e^{3}+d^{2} e^{4} $$" ], "text/plain": [ "" @@ -3877,7 +3879,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to a+b$" + "Substitute $a\\to b + f$" ], "text/plain": [ "" @@ -3889,7 +3891,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+c$" + "Substitute $b\\to c + g$" ], "text/plain": [ "" @@ -3901,7 +3903,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to \\sqrt{2}a$" + "Substitute $f\\to \\sqrt{2} h$" ], "text/plain": [ "" @@ -3913,7 +3915,7 @@ { "data": { "text/latex": [ - "numerator: $4a^4b^2+8a^4bc+8a^4c^2+4\\sqrt{2}a^3b^3-8a^3b^2c+12\\sqrt{2}a^3b^2c-8a^3bc^2+20\\sqrt{2}a^3bc^2+8\\sqrt{2}a^3c^3+2a^2b^4-8\\sqrt{2}a^2b^3c+8a^2b^3c-12\\sqrt{2}a^2b^2c^2+24a^2b^2c^2-4\\sqrt{2}a^2bc^3+20a^2bc^3+4a^2c^4-4ab^4c-8ab^3c^2+4\\sqrt{2}ab^3c^2-4ab^2c^3+6\\sqrt{2}ab^2c^3+2\\sqrt{2}abc^4+2b^4c^2+4b^3c^3+2b^2c^4$" + "numerator: $2 c^{4} g^{2} + 2 \\sqrt{2} c^{4} g h + 4 c^{4} h^{2} + 4 c^{3} g^{3} - 4 c^{3} g^{2} h + 6 \\sqrt{2} c^{3} g^{2} h - 4 \\sqrt{2} c^{3} g h^{2} + 20 c^{3} g h^{2} + 8 \\sqrt{2} c^{3} h^{3} + 2 c^{2} g^{4} - 8 c^{2} g^{3} h + 4 \\sqrt{2} c^{2} g^{3} h - 12 \\sqrt{2} c^{2} g^{2} h^{2} + 24 c^{2} g^{2} h^{2} - 8 c^{2} g h^{3} + 20 \\sqrt{2} c^{2} g h^{3} + 8 c^{2} h^{4} - 4 c g^{4} h - 8 \\sqrt{2} c g^{3} h^{2} + 8 c g^{3} h^{2} - 8 c g^{2} h^{3} + 12 \\sqrt{2} c g^{2} h^{3} + 8 c g h^{4} + 2 g^{4} h^{2} + 4 \\sqrt{2} g^{3} h^{3} + 4 g^{2} h^{4}$" ], "text/plain": [ "" @@ -3925,7 +3927,7 @@ { "data": { "text/latex": [ - "denominator: $2a^2b^2c^2+4a^2bc^3+2a^2c^4+2\\sqrt{2}ab^3c^2+6\\sqrt{2}ab^2c^3+6\\sqrt{2}abc^4+2\\sqrt{2}ac^5+b^4c^2+4b^3c^3+6b^2c^4+4bc^5+c^6$" + "denominator: $c^{6} + 4 c^{5} g + 2 \\sqrt{2} c^{5} h + 6 c^{4} g^{2} + 6 \\sqrt{2} c^{4} g h + 2 c^{4} h^{2} + 4 c^{3} g^{3} + 6 \\sqrt{2} c^{3} g^{2} h + 4 c^{3} g h^{2} + c^{2} g^{4} + 2 \\sqrt{2} c^{2} g^{3} h + 2 c^{2} g^{2} h^{2}$" ], "text/plain": [ "" @@ -3961,7 +3963,7 @@ { "data": { "text/latex": [ - "$$8a^3b^2c \\le 4a^4b^2+4a^2b^2c^2$$" + "$$4 c^{3} g^{2} h \\le 2 c^{4} g^{2}+2 c^{2} g^{2} h^{2}$$" ], "text/plain": [ "" @@ -3973,7 +3975,7 @@ { "data": { "text/latex": [ - "$$8\\sqrt{2}a^2b^3c \\le 4\\sqrt{2}a^3b^3+4\\sqrt{2}ab^3c^2$$" + "$$4 \\sqrt{2} c^{3} g h^{2} \\le 2 \\sqrt{2} c^{4} g h+\\sqrt{2} c^{3} h^{3}+\\sqrt{2} c g^{2} h^{3}$$" ], "text/plain": [ "" @@ -3985,7 +3987,7 @@ { "data": { "text/latex": [ - "$$12\\sqrt{2}a^2b^2c^2 \\le 6\\sqrt{2}a^3b^2c+6\\sqrt{2}ab^2c^3$$" + "$$8 c^{2} g^{3} h \\le 4 c^{3} g^{3}+4 c g^{3} h^{2}$$" ], "text/plain": [ "" @@ -3997,7 +3999,7 @@ { "data": { "text/latex": [ - "$$4\\sqrt{2}a^2bc^3 \\le 2\\sqrt{2}a^3bc^2+2\\sqrt{2}abc^4$$" + "$$12 \\sqrt{2} c^{2} g^{2} h^{2} \\le 6 \\sqrt{2} c^{3} g^{2} h+6 \\sqrt{2} c g^{2} h^{3}$$" ], "text/plain": [ "" @@ -4009,7 +4011,7 @@ { "data": { "text/latex": [ - "$$4ab^4c \\le 2a^2b^4+2b^4c^2$$" + "$$8 c^{2} g h^{3} \\le 4 c^{3} g h^{2}+2 c^{2} h^{4}+2 g^{2} h^{4}$$" ], "text/plain": [ "" @@ -4021,7 +4023,7 @@ { "data": { "text/latex": [ - "$$8ab^3c^2 \\le 4a^2b^3c+4b^3c^3$$" + "$$4 c g^{4} h \\le 2 c^{2} g^{4}+2 g^{4} h^{2}$$" ], "text/plain": [ "" @@ -4033,7 +4035,7 @@ { "data": { "text/latex": [ - "$$8a^3bc^2 \\le 4a^4bc+4a^2bc^3$$" + "$$8 \\sqrt{2} c g^{3} h^{2} \\le 4 \\sqrt{2} c^{2} g^{3} h+4 \\sqrt{2} g^{3} h^{3}$$" ], "text/plain": [ "" @@ -4045,7 +4047,7 @@ { "data": { "text/latex": [ - "$$4ab^2c^3 \\le 2a^2b^2c^2+2b^2c^4$$" + "$$8 c g^{2} h^{3} \\le 4 c g^{3} h^{2}+4 c g h^{4}$$" ], "text/plain": [ "" @@ -4057,7 +4059,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 4a^4bc+8a^4c^2+6\\sqrt{2}a^3b^2c+18\\sqrt{2}a^3bc^2+8\\sqrt{2}a^3c^3+4a^2b^3c+18a^2b^2c^2+16a^2bc^3+4a^2c^4 $$" + "$$ 0 \\le 4 c^{4} h^{2}+16 c^{3} g h^{2}+7 \\sqrt{2} c^{3} h^{3}+22 c^{2} g^{2} h^{2}+20 \\sqrt{2} c^{2} g h^{3}+6 c^{2} h^{4}+5 \\sqrt{2} c g^{2} h^{3}+4 c g h^{4}+2 g^{2} h^{4} $$" ], "text/plain": [ "" @@ -4090,22 +4092,16 @@ } ], "source": [ - "sVars.display=lambda x:display(Latex(x)) #turn on printing proofs \n", + "newproof()\n", + "shiro.display=lambda x:display(Latex(x)) #turn on printing proofs \n", "formula=cyclize('((a-b)/c)^2-2*sqrt(2)*(a-b)/c')\n", "display(Latex('Case $a\\ge c\\ge b$'))\n", "formula1=makesubs(formula,'[c,oo],[b,oo]',variables='a,c,b')\n", "prove(formula1)\n", "display(Latex('Case $a\\ge b\\ge c$'))\n", "formula2=makesubs(formula,'[b,oo],[c,oo]')\n", - "prove(formula2,values='2**(1/2),1,1')" + "prove(formula2,values='1,2**(1/2),1')" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples.pdf b/examples.pdf index 71c7234f4aefd958513db3209d7541198c746231..f90f158f16c5ce450ee3b0594c67779a0ed6b2f4 100644 GIT binary patch literal 59577 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

-s*r-J>WvDF9D>~K^g}XGBfS_=f!>|osQ!05 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 z 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

K zSoH2%mvLYeWDha;W~VtO=uJ{1`K&0KWWKWY5@rg%0Eumr<3q*3HhM40SMBMl1inN} z;ne)tz)Di(3po@IHL@6TBLflo1NS2{Geo+B0xvwet@KnrZhRH1S;q#>GEqmTSu?s&!tKTn*7wi@ROGi+`BW9QLn<`>G_$ z^qK-z0GDabKl4^;KIL{JKE9LOJiFn$bZcBTMi^GU)bFt;UW`t45|eABz1mH@CnSC*@u=3-Etvz(Ra>u znm!HdK^rhbMy&6}GoqEg{}zbuoLOEbVML`e;*h>GSw0*_jgGqoyc4q4EAW zBap@me^a>M6oi6_lrgw+SQ@9k+WoRA`Pk0-*|IJ@*HmJk$?r8JR5DjeNcq6)4Jb?`1ZKYpC|^gQzo-DPhy|*b(wp0s6xn_G`BbUhk}G?XF5b zEQOa@`HmiAUtbHLimT+lZE*UgEWcq}nECjXsCN}sXxY70(Hu!6F>190MF0R<9#5wk zK{)mAx6^yADq^!6QT^VcsZ!^!qhk3h@2XoA-vyhaNA(+H16|V=4Yv;(zf(}dv*u%--?~opK4Z7dT;fOHmvhibs}?_GxaIrb!_hK?HuP<^r}*SaWiSjG1K;U{ z8l}~o3CO;lGhtVZwN{|12CA0cwqEdjI)N8ngkWVTCnipW@AddxUWM5AWO1~tn$L-K zUa%PSl%BtjOu?Dx{b8MuW-~I1pQH_c=63PTo>m9npFue*LPJ!Xe*Rkj?dvT82=EJ~ zerHC;mDx9{8-N+j+kx(H2Ei#lfTqXBgu6wlM5qWQ^$nG&J>!Kc5n?)S6-$bR)OQt4 zs?HDz3s=fP+t&4VLA0hGK`}r}#yIZC5F$m2T7s_dAVxDLOY%ju!^};ld{&Hk=yR-Z zmTz+F$B`o_ zgqpG;&+;<;v2KN|Cr$F{B>NNr`kocBO5t)&s7~mU=RtAli9QX7)&>qFA_$mg1NW3< zY=WJxps4I5S4@LUuS@7}ybM~Ml&wEzjRYG!}$j4 zc@~~<<2vYUaOy7AO_!Ei6R>_5-J+9wjil2BH#%Bw%~wfXqF4EIT5L{Yt0~5udgV|3 zVr6&7!CU_R+-#db7i2_wohql zB%jdq$4hY-VLYb;S6>&tkUmAel139e6~=RJ|ERa;s-tO}(qt)_;{wC?E2S}%CoFix zkYc@8U!FIjJ+(cwJ$z3t@&rm1cogO1H+h$TawB#iw`12p%#W00dz=4~eEvAxp5P%m|L@F0x%+(_s zon03-_hW64S5%ZTH?L`fDAa2$44Tz-gV+7kX5q*5lo4O;YbFlWY2H9?ZeINre!3(S zICjxD0`{Ml$-j{k2S?DZVYY^)Xatbv3UkV-LeAOxa@0uBbhJsLR~fyYF#vjBiOzZ>|SMaRta+x-#1 z2n5d*9gVD12!VJG2PX%B1qhT0>Dh`KnVFdWc6Vf_=j7mE24+eC$r&>P0c#UWBf{SV z3~)4pf4NH1u>y%BP5>*AmZW201j0wm%s?iJiG}em_=tmvkdvJg*a#zl9mw(gt_Fl> zjF<`kqHF$1+x%wL{%gYjs_|#qgnz{a$dwA}IT-zAo%3I_S9H>M{L7|ONJ98`iQjf< zKRmquXEEif#_T2uN5P+x#}%R4_6z16~R@LP`Okp`{TO z41=7#p^?3rwFx2RzpDW=6`gEtf$Y`qSTX{UAqLgo_L`dPe_?1qt2}mgdJYz5MwWl1 zSXhD1o4>;VoagT!HZ~yO#K{bV^O!h+;1v@)Cp!?IW1(kcWCsTAA1MwX+r-Am#74-< z0Sxr-OZ3lH|E}@B=~MeR`p3*c$jZt_&je(z0EEn(KtAj5!Tlb_pGNmsK-W?r-}omiK-y08_wfGY{7L<(^(XI73b@+; zClr5DzgznA>F;T369TU*FiL+abFluV-~N5c|El(P1pk!!o&R@)vuWc`Ody{-h^cgyA?Tx=CoQ(>7|@^5gmET;DT?MVl_} z74uhvtvAHxDZ0wNN6@O-)ZPEyt^W%&{Jrt~-X#8KEBd_$0XNP6_f1R08psg--edmW zn&`y;y;~dV0ryN`dqBvS{r4UB8(~$lQMNYwjU5uQ|AmeIgIfFtxBEA>$jr(D+yehk zYl4Fl@E?m}&D~5*No?MBj@RWVa^2K4wZQBrL?|&7@wR9<%~@#Fb_bEQfXpnZc?718 zAB;FId$|A9U}nD)z5<`sMZltVTggHGMu2R=nu+!NlX<6&qi z+{4=u?K1Q|9f>RgwY!9K#^gYKJ+msBo!_*?HL63Lw3kk#^k<-~4lIU5rLKtiZ7n(= zmoQ}4C2Oh$)FI@6&)X2EZpum$znw2*vh2Q!PfbBcwyYt{x|>Zkg9=RrbxWXxXyBqH zyRs~&=*ayE|IQ^(OE#`ymu;>~3;^%Z@L=7D8CX|f_~Xf#%2Oz@3)wz1oiwTD9$p60 zGbxke%MG=l=KBi0e0ZM0LpzE&QJUy9Pi=TdAd>2KX852vh~^ekz)OuQf(bu)pc-48 zwjuHzr?Ca{JIyX36)~M*nXSKc@0-Ui$97N1R1>5XsSC0~!X)ILhHw-~y_F%3wiNad z%6ECZ$~JOVm<*(2f&6bVDTY60DXsQiel~t-6=|jy8Dy=M2^FB`*l?a9sV`%UO&_>d zjjdtC%KSD`|2YCVD+niFiI6d4l)|JybV*b)0aJncV0v%cv7vnT23jtB#_UszFQZBK z1V@zMXk!@~s=d6cG&WVFaH@ly^^Yg* zUsS%6DUcAcT~!iG5ktj0I;Y&jo|UJ+W{TBmQ;-XjIliq;8mVYK4;=y@^J%l*pGS|Q z_vAxA7hJq<&YxneF)h5!^jJV=1V@fL&&fak1OXoHU4-~^h-qnYk0ibS(HC^q#B<>_ z7U#XT@Z4oA^<-Ih9cjkF-_3afEMJEZn|QS|8a)u{UdSj(10l}FlrTd!{OGHO7{g>* zw@x5KHjZVGgMNOq;3|oFKDa`S#=51d^))f~Ec0i&nYr2?)p)3e2p{>(FO8Jvlo)PP za0`}Go|R5!N#^%QxUg@Px}={ z!_CP8N?2?9YlI3@+&756W8Y$Cy+02UtSsxW*DI8$#6<~>`8&|Zw3JJy)BF5RFM|{!aCs_ zd$sJ@DI;ODbZ1mbiGA3+^|3ocn{(s3rXyq3*atoPp0OY7W9Xw$t0a;I+iKS`Vk&KBL-+E=0lm zndvDG?(?CF2PgK2#Tf?g7srR4Ufw$)jNc*y3OE(_)AOoA!i%Ct9&agSVp@9%PSdC+ z6~E6JRpGLEzqjwgdDSWA4&q0aZ#4e0(ExP#VU-4G@W6jAKUb)gCCw#FRi1AE5N0x= z=iJei)Fj}b2%3HR0Y73$V^2M85Ze@&6bS+YQYJ0vDC$YmvJ{&cRpp)*S4<1GRDPGN zM%0kT3ZM9?Tw7CKy~9YV#nMW@z2hzH_T`D3_ij&lc{0M5f@HOstr;e`OujuRAVh_? z`<9L39fF-~5!(>>eD!R8*7{>cd3U++VQoXoZHIg0t@T@?w`+T-_n_CLwO;WeG+jnu z#El~x}Id(Yb4^0PGpRbh__~X0#gVGNQf;iiNA5M33=|!5m%9 zutd*IaLFXqbOLYuN93p>K{Bz9@$$e^h;nXb_8B?0dCo91C?V z=(NA>sO#dW4Bg__=9Jw>+V7;(!bHd@eZo{!VLlENxW`^MWVBqX86^drJS{#m7EQ+yD6`3 zzD0_&xVxd}c&}71)5p7`6LGu>)Z=W~^0?z&t^!%bqKcWhBgj_@!xzmifL$s;CbLj_ zMtbHd@*OoBLGci6xxz!zo>3zp`Ec>4X_tOuA*m*vF_G+R)EAS(TjVv52>gU~12qAO zFJFfGb8{p4*ITZ4qUq?m$Lgo@X51ri=`BsNs^d=4o&(6I&H$0*%C#no*mpc0L6vzE zQ*(}Zl4tay{{HgzTqq|s0xgvBQYUB%m236_NmuEH6hcVQPW7zS6Pd>n7d{SK z84*)qgs4-FC`MXH z*O%wt6;KTkH)V@TCPCY{CE*nkm2mpA9msLjxQ>gl&?~+Mq~k{_D=QC}C3VmYi&ZQq zFTG1I?Bblu@we7*EZ}b37KfXK*oZM>Uc%ENPJc3Ufs7ydE>gL+wZ~*+FEY9Qu=)8T zTQJM~X~3a)8XGhIrAPn+KvQXEDx!2KA@0XV0N!e0IHiE~m167FlMp z3@;y(aT5o7{`8jTpS~3M$A1N&Rd#iEJcg8XR7P zaa9ryC#;D*>UmC?LJMuCFnU%xQboa+7<~!ourFgVwh4VR;a@hqZl;Fj1*y89c|A{M zmiiiJ(z(W46n3>fp5X~Rx#o(H5!Y+gprx=c4}%8S*V1PTme~8nWf#qepgQEog*SKk z#HPKh>cfW!5VCuuQ;-gd;_Kra%&X@VG~~=YjBhBg{CJz084#28w&}Mx$Mya-WmWt` z*)nda*V=nw)Vf8BfWl?1v+nBKO600(9V1abs6IxXFxRlt_dVma6Jm%coW83~W`{uT zWeI)I+)te85TdOuIhSm#&!=#?_X${mW&&opY5S1TB!hU05wM6vp^^xNQ_N4!1i7}X z20I~n1mwzeFE7D~G@~AA{qif5bf?3qbei*R)z%q~7rZXGKZZMo)PH(EEm%1x(dVTd z!f2o@Jw15*aBja}0McL4xO9SM_L|gjO3_00u!P?<<9nr{AE8m?zl+9+gELvluNmn} zIjj(EISB&nQP`uX{n#}+xfx6~6bt(8?&rlbT+!;$Ihhq2T9`1wZ||Fh;PQE7>0QX< zHK&gIf62fwIlA^@&32hhbNP4YcA15RNekw%mMQGCnJPN*Ns5iv8+_A*xAbh3x;*iL zOoz7A{FaNhk8bT~lN3_t<@T1&>2L z9KK+KhvQ^>>+5iUP|k<>$w_~pr0|4-Ms7M~g6Dpfh30C(c1GpJGa_bH7cqWLb7)!7IIYX`Do9~UL)CZdp8;4!Hx5i9ch zn2Y(%Y3zBFuvK;v1aiBvZwvgzu4&qO8zxrB!^^#kt@t7`dBr3qAae~b zapp@9jUk_E$-alwO;qWxkL4{h%6+SjYa=>~C&MN}iNubzya- z`yoBx*L=n z`BX`U$K%U<{~442;SQxMjwdbChUe#4vV90z^928Wo{CkGfZ;j`d>bq!uoBePSnFDK<$_*v!-iuNhD`KvH-~)DIYbykEPFS5&4?Z7 z*~GMLp5jp@WWiYYwLL=%bEuCOeDeLI%ljK&UO%qf>UnK7hIMy`Sp^>Wm|L|!$6*N7 z;{d{gYO9uhlm~gq-~qxbbRQ2F7N!JKC$3(Z@xy)$e1E^Xfo6mfZC}AUnl%L%If#mI zG(Nr=7yk~?ZskFjzbd#vUKP4`#w;ZwRwPS+RT#5a?P#Ey7K@)T`&|>q#sSrR-*N5( zk36KK7vG7&O^azm3X<1n5_zt^JjD>fPatT%vP6oWqVWXPgFZWWs8mh(c$4m*M|Oo2 zrCbi$0q-+;rzYoZu&{}qJWaXgON9gcoPwa0QDq6v-m7IUU8r^Y{Q-`zHyQm5s3`Qt z@M@j*mx}aa`c`|PKK(?$k|n}4m1($EQRP}bky&H46SHAnN#>p=P8Ons;)AJ!Nst$_F*Z-_Sx&78|zU^B_1u98L!cES*&(YRw(kwcn|?CFk$L+!*-Akb z)2+CD`w431#)oX)qZ~&$S9)Z)5y$YAQG1?`N&eTC5fSd!7>d z`mgIl=ulBY zHa7Z0XuhoM3<*wl*L5MP{HqU#}piKdTvtWp|L||19~%T-=O9 z;wm5rvtHhE8XZzO*}UhgGg6t8ZHPdk5Tpp9(a=!Gg*xvR`Wf@e3!J{xT!OV1JP7l zs@n0mLY}LGZjcf;0oY+5qf#Zl@0i*$C5JaOtfp(i3*)1OJ?2X+cbTWBabl%8jm?E0@Oz(UjC%8Fz+@mn5x;-9wtVOx3 zCYCfN&>_`_rDIzTWBt^x@x;6+LJaFqr}Bz4jzNDB{MhZ4LCu*p2V3}S8zNavai)Oy z;3o21c5J<0`UD0hEDQ!_zKb*Goneg3pnv8oAVkA-*|qTfbQ%K#n?c9ChXUsjCEx+> zrZ-kM8*?dXuxn0<9wD26BMj66l$!W66uX7LQS2vc)@M75&BpP8Qu4~M{lv5vYe z$C1y{T+2kPb1F1@fO*+E{LEuyI$JGAc7)f|?!h)IYPT6_3==yTrM@NaZkhhhYE!bR zCnQ|<-iC15%LzAL%|WLY{?WgoZ+uf9b<@l#HOi^nhjd)Put#^vJQCY4xS@-I8*U57 z6LM~Ku&QI)r)tfYZHpaeL(G&y!^0d#npR7(xyEtrxH~m%18#%Y*x2YjY2Il)b>U*o z1wJ~7Y#!>!gyAcX$K83-;wOgdpkQT}qc(?54_DS7u4KcP z^ZH?(0>@5!rGR!A zu_Mb%kc&J}rKE@y4}JWzYK&J8zPay5d$^mQYQU2>gyCJQSKxs~YEOM5Trz^@jWiYG zk1Oe-pN&g$sue{Mm{(B8{|tdG|AX;Sp(zExRR*tl*GKyulcdHvxh0=G(TpPKcrj1y2eS&Jo!**ehI=Hc z%nL~T+<7&DXaO%U_u#J5EYkz-sc{}#lru=Br}llJ^_wH1;O4l8{T0QQPd6$#6LIK? z^_lTb1qS_fh)XVq9CA@bE-&Np2KAY|0?A1GFYpc%IeSPxt6C?uU=-&*ri&B^Yto!c;kIh5UuYa2 z-dsEqE6nHwpit-O6?#tNO`I|W;922Y)yU@XLB6LIF7`FFs~EO_iS#VfasH^+wvS`0W}6b*aHqiC;PXKB07h{}#faa0QtPG2Us`(4XCPXR^5ZG;`iy_Cq50aJht<3jog^!>N>@m5I=wf=)DzT?Db!T8?8QM| z$j0h4AMjG?$7Fwfta>j(RABM_9Q#Pl_2UnB!H8H05;Ogr+f?%m(W+1KRAVYTJ$%hA z1up(iHn8vQuR-b zs)wfSzF7}Bt~Yav=OgNAv9CpZNCsqC>%35@`q6W=YA-KALcy(PUfYqpj)?qsFO#q% zK5H!|qT{UeBe?mDa_LcD-Yn&Kp5P_WPL*O@{U1TUmt-JuDt=Ii9)|~`4pleI_FGx; zLLTrL3`v}@xdkHWhBqZ)0pjKWn1P9JQonj*N`wYVK~iQRnUZ1gvD9<>iZ;-U<`mM?@oiK9r61js{S;3+h-Nn?~o1A1fC zuo-$KFYVh<@{TOUF|0}VkE}3@ho%vx5m_T<3@rvuC@}2<-C}6Q{rTNrj0g#kKP*<0d7JX>JnSPl67~5BFiO^IKXIy3N(-E74WOCyrH4 z1Y>Lx;~9tFO(QbhY-t-d^O_;I_Ht?{z6$BKf%xWb_Xnf{CL0c9Q;0 zT?9n{vX%FW-S`#)5& zxeHiqA}94(ld06L8IrfvB!fnPkpGy%j4?xiBNVl&u^-hhN32hl0eSh_U0P#|1qpFA zJLBS0m05A)c;b_<)V?X-Q;V;HpBNanUo`61pIgHP7xhiepu8lQY$Vnw11Wo_39puz zQuO%8jogl-e(#FWMfo8;4!O;chvStl+c74dEF?jmL(*JLmPZtBiSatt3j8(eh;E=Ld!P>5^+l4Xc5uMFa<|60o}Sf-)b=RvI>T`3&qy^bJ;-cugLMSb zg}7rz@FSxpwpm=XoFuI;pKsyV=Opm_@JIzIz+u?7?Qf=1Nbha- zr*n<3j^5gaPez_6k2UAS$L<*=w&&{*t)5Mw?^^G#OxTYz?7{9EC$}Gs&i%GKyrlNe zU;9{!9}wfv=~Ewqx0f-Rv>t0b&5q)Xnkp^n@j5RLRN1(?*{t7N99M6Ktz?tSCpNS(mjk+@N4xni%```az%e8OAl-RlJ6 z!-{cvg4*@V1ZR6gN8Cu+177-^=ZJ)$x!^5%BvU*qGLb| z*;3?;W9$a|m=@_tr3RsDp;kmV*wc7IcifH_MPel|Vg;wg$)hlc3V&@l@w%?uZoa;$ zVZ`l08Q`b*FE^rPIg!?hx52;~$Or5bv)Bc~>W%jtNLBNN%A4q}FJPI}A&t|n&WSvI zAE;>_G(gm)`yy6Xv!})vxWU=1aL-+CyrmJffa_EM`;6NGn`0Y>zLS~)<$_=7u=N~n zyMcAglJRsx{j%zVz$y2(@JJLK;EC<1JAziC!vRlhgqZ;T-ShTd4DQ+Y7^p^jX)N}t zd$J;4xmYQ_14Z!US35o^1Tp*+1=kz7;cf^gp8+FRRymDC;!R_&qp~1wuA_7ykbyjl zb)53^8 zK%X_)_%|m+Yl?1utX2IB1LoEGE<~fr2ud~<)5;c~aR;3jZ$?iS60xUBIP2Y?O>iBL zT+&ZLT?={_pZp8KZ8N%j2!bqhxbiLTH>Du8==^;co4Yr|M+BxZ;OHT{3YZ_B4+N$+ zuspx!Ch;Nqg_mvCWlo0p_h;Jrc0I~DO}jy49dF|L%VDOk>3$y%>e*oQG_fs&lf`H$ zn1PdJ;%I@9Wqb(f3WkfafsMhItg*aU?TLtg)aGmDjd_u8XC=YJn9{e7Ju?))HJ z4Bgszye3*M^xE9AZjaGM!AXYwR>sw%y_;tE`0g z=hay;W_EEv_&_;``-lhC!1Xh_Ms($s=>q(}uwf4Ag2}{)GGcmT1~~=fs1r?30tSz5 z5^4o?2Y(`&LHT!aV5fun+X4<5;oy8hfJ!0wClihQH8O;B+29naCG=t`3q3kXL3Z2D!{D4qeD!y?useR>n3dEC2+to0azvmKbJz~dhUw~g7G`V%jm zss&OI61A5xge@iC6yi%I7?t^_W)wnuOb$B}3V$ewt-%#r2tCRKM#unWTSh27T`{OT z0VLdbLU0qom@!&#vTtK>zRmQL5GtMu$CtkRM|m#-QMVS}~fAW;4bh*N=X#)w@|&^z%sWCleQx z%MSS<^Fbd%L&yO}(zNK^hi~_t_2YX|7St8LA&cene~WrJehbh3OOg0Ti}){X;=d%A z!bawLDo(%UmohfiHo)KfCBX!qb?|QqCNsysgpvOi_57A#vH&HQzjbp!q0nCvOxAyi zCs~1-%s&!L7FG`W--Ups{tpsNR(5(eCZG#CP=d)0pl4-b0$Q5`jo<0nf6G3B$AL5d zj~?+qC76F%&Hs@O0TX2Sm^!Tc*O{~^KrUuXZf?&<%32_`2{*~iFC&&Uc?QT~@e zjsxfq|L-gMe-cBnFthUU5&n-L*ERh=1#$syyzz!E3&PN%ehL6=!thc9r;3&zU+HmLLMfS{5ZJV?@2K7NNWTaZ7t(V%+hPO3m z4un1p*Mp8YjOQWxaLHQlm$l=M-}L6P7Y#Y>cdP0c{c7pZcoyPK358Wb(^5Ri_=^3! zeAAmpsHwV~Qo`YoL?|A(Ll?*3z#Pve#YZcR@dyib$oJE4hFEMwF-&a8EnQ;x)=JY1FL8g!n^>n7Sv#trdPVip1zeTjUb z;{uSx2X+0?+y+VXKj%s$lcI_fl1{}a1VBL{Gv%l%?os!nA(iySmqu>Gd(B%^-Eu#}F@C82$@aOp^KpM$ zB(h4UMVdvg6uOE2{?P(*{T<|k!<1`ZYU`DIh?cZfAL~7!B`fQFW(Z)N+nQI}(Q0kr zysq(K%Odx^xwWkZAE5LBae7frdqu(NVP>W?SIo@PlU+$2f7WQ#Gq%4$I14`)dM#WK z`J3_{KatWxeaYpQnI3?*TEdqfdNOWrkRU9VCqz#)PJ3y`ecTtIAJP*0&u;ge5{9r? zTqa#nD)<#Tb85`$Kb?K3?yQEdVJ}%ZkJpbgF^<~Au#&yqv4s`;i z>I3Aa`U{grGMd%pM=NQk^Sz5qdqK=yx&?S5S4iSV1b^6Sm_qtWpA}v@b3ick=((bO^~G=Q<^gzwxh(=X zetP!aGFRNxTuV<}Wq*|GVV-WpLFi6{TNEG{$b)*}N%sTcfE0S+@j+`n^3K!=ij=;U z$epEGVl6RTg1`*=L>qKg)#C##pcNTicivs5kWj6|L6#^oZ0xQtu105xe%JF&tv{-J zAU0#yD)_b9w>->uCYgplplZvqHxPBmFE6?0UKIAIBGBQbP5wigGMz-YGp*l8jg*fj zfVJ3^M}X!d67QP$55$Y3304%0@9E#S5U%$P4J|2bK9ZpeH@&KRoW8{)lhhcoPNyK`WS9hqu&AmD?%~^Z1 z*n2*;x@*+MFb^y$fy?Gq*x$6^pdCkYQE*FO*uB4wi{(?GCRrk1T`F4~czvRmdLtlI z$5|S6z`%GvGsmff)!D^p=&M)ppeq1_qRP+@As~HbWu(_d(*ZwHF5LSR@7>Yy)@4R` zk9db@yj)JDA{WL=Mk?5hywlV9g^P8+%4dVn&9`QO%3};I66z{^l9rJ-r1q)UhB0o6 z<4 zt{D$IinHF=wyjQ1y=9w-VoYp=WRizDPi$ouHS!az>iat87Q+-M5A@?GqjWw5Z#oFr{=?FsT+JjTNX5ltrpe7L; zM)B!8%&2p`c`}N5SFz^n$$GT8a!RVAl8*-EwV#J&9b?Mu)PHHaROt9DXg5fjx<8jT z(cfg1pQism#JyvDX4}^09otF8W`z~owr$(CZCe%Fsn~W>v7L%-cFyj8o?W}o?(^=q zzx0>N8i`gb6)aL6 zkIHrEW~Qy$X%1V$n_-PxRX`dD*+O}j&u&RYg4Az*n7Ef};9Oh}Fr>N9e9_T|-)hpIUl9wGfrr)mc+v$h6s-lZB zu}j`_ZJDyD2~7JJg=i9JVKEc4X6j~|I}dV@*Z`Tapr0!s1}0)9^5Dqt5+Wf4GYm2m zF&r>NGhDUL352)yPzWUBRYWHeU+>;(W{%EPqN1tXZRUFlo8{cj%4&C!8FE^cA ze6Q`aPatr)He?POs7Ghc=zSKyiGDFgtxGRDn7|_c7A>b;;@!aKtc#6q2>XMfWqqx{ z0B6no2SPhrqx%TW!>@;+o0r#_%R;H-kXJeo=<&Fn&;m(msDTZt1AM1I8Pza*!6)99 z@jarH&c_KU?yIP9KU+#`9M#wJUEnl>!-ELXEKJ+9N_G&^pbD!&QZD4o*m7g(Npz4B z2*Hs&LO-TflNsA^!!k@M>6v0rMwhF2rBM+orWS{@g!SGa#A@3Hk_MNtVdW8S`@!J@ku}Ojr28~o`)<8Ci`DM}NGo?ygqW!b0on%26N+bw0zyK{Pbq24@w@mp5Edog z#3;2ZHQmRFfXU;Wqu}~#%}%@(!PZ2ruM zWWrZUOrfr;S$nOCS7w%N_I#@C6+2Dho6Bg+Y*bi}2aPx<;O|oV?UAfD#lx8J@ZhAa z`c&+4z+qSMgL*J6wbY$N(hI)x@muL^Ro!`6c)fM*NLAjoHK)HfhFZ$ZC{O&Y@vKMFlPNrt)ii@0do^!5pz9!@;UPpK{8g5()f@EmPWRv>7~R=KWDH zMfUV&mNGR|`HiA%XzV6@L-|>FC6GZQT*VSMjWlz)JH1 zt0KV8PhbnxAcFV>yENfEchnO-(~)Zh5D=j6DGRD0U(hv$8MN|MI&Il01A)?d!ct4I zm2ARDfm=8Gc6Z__YB@DKj?Tnc{p>leM%B5Zf|QPL-D@SpF`g9>4irjKxW`gd`sXo7 z6gN5BNd9buyMTP%Ft*1jbyaNAnI9_M-glO(0^%$JHf`Yg-K+!6s9A1qlXyv9EZlZM z3Zcm_*GnFcV+2s%N>jt+L$7dAjBy+|PNapjUttT{dZem}s~5^|jyu4rXDqJM87#Tm zrsB45NnMdU#5N48J>*9N!=mMlqf$?5$e_i>^-|_svY3FDP|&%rLHS770C=>YHN}K3 zbzldyVm$3j>$<95vpC8ZX_neRUTnW0`Gs>P9o1fQ&ZScTJNwe5e*8 zH_@*tJ|fB-oNu@Fp}<@QK5rVX>G4$LL?<&-*;J)C!}t`JUWHey)jJTklRO>p0JYk6 z#IC76FGHUan^j4y;Gga*k_Sm+FYFQq{WUbyKZMAU_PGcNJ;dyAHuiPtaMj#Whb>FH z(IBb3cnL|2Yk)m&a}bo>gD_m!?8{nkQy3))b(V=!BrQ*NSmo&MD16dT+Jj5VK%Gr1 z#5IQ35ZHtZs~&P~M32YywX_&_~E z>y=K>$C1z`ZuN(a+v{8197})B1XE1oI?H(VGx+1CSmVv{jiQPIm$MS{{Qb$3f)+Eg z&Q6x~Y- z$H+U3=I`DW)!v06gU=8NdiSb2?Nw7fpk@YMVeSAz#CFt)eNfF<$qH?_n0kl=WA0@N zTcoXv{IMlT)4Yl45CgE@sZeUMFO|jXi`gzZyIY-u+vYD#*^hAZ?xqB0OtMn8XdyeKC~dv}4Ef&KSy-^|(fdO8&y%+mm#{M%qH&ESltY(tXO`YhB zuw7#w?-*3isTgXSH9_PI|D}p8E+}TEbk}@HEN1C_SSahv@H@fEO@A!S=FW2vooZbz zEAna%Kd06H6-@YQ>VXyCW^0_P!k!gmRb=!#-Oy}E(AxC$V|?Yff->TYM7okKOi)S` zs!e|*s11z%d6%UpbI^;LT?(G6Or$;)_S*iiCIOf(t)4I5?NU8E`(WBsyY|2|8pnHM z>~=>;Y2Tc7kT7hNY_Ib0b=JZn{F`NaK%qA1HwSG#%gr#qp3_cZ4Q4cLtr247w1Gxg zKH{KF(iwcmGtsEU-yDZV8P74=dNR&5>P~a3^)x0sn4rCER~=s^ouu80^iAbhA8>H6 zV<%@>4`N%U$*u>euRrBn4N`Nym2t51K`2IaONVCgs`5=RLH#}zq+n)ljwC%&b4^ai zTBrg6;;1j&8f2nMm#+eVSt!GN;|N{!P?x}%PIdHT$RK@gvs0D;*X4`y8?nH zli`bN&IxS`)MD%pt#HQ5-7`7#LN|~#psCju{(mo?O~u+fF%B!Kqctahc8;kUcD`9vP>_bV>*dN8YjzeOILX z^w)x3Vi?8Cj6ThFGPP+@TnmU)|6pREa6k}N!n7_Q*MtR=urwK|)f_*pS_xgAaHA}l zxaJTEmv{%&W&5zxum=Xnj$m!VBqnLJn4^d=rz#RZOr19BT1!gdM_1?8hph9C5AY!# zg5kd_OrKWU|5p3{l$idBeoM`7V`=z*DdIA-{$WJ^zYuX58JR!z+E2muQ^aLsq@iV` z|1?;$FnoH$nOHuZB%SsSNkGx~dy83S|9=ja^KPm!($DOBq&f_SPrrz^6p45(A95IUrvl$gEV8 z9SRG(@ICh#Rg*#NyJ&EWCL9YDD&PDd zBY%-wU{>kEh<^+4!Xe#){P`mb%I$2?YU@?WvkKKUnl;~guR^yr0E8tKxrQCKc>9hZ zGuTh=&4I{y_{vtqJNHmm5#0aeWkKX z*UEWW`%~77F)yRbi>J>f%gsi|!P zYcGjVRWTR>I<8Qgv^L$ROgD#^S9pRQTz({P({!y(bZ^@sjV0}XH==X|UHiI@z=HGs z`YpYBeM+-2ja@Bum+_tWZL!GA7kdlAr6OnquGHx zWL|OHq7PIQ#D;CdNAR}bW0N3i6ZThb!XvPxc1Gy=dpBnm_KVq>ULVTc-gRgM4285} zB_|VXz@6H~xJj##f;?H#vE&JG9936_$?c=tZ>mcOx!~6-lw@KB40+t1bhhaB*ba$u z{GqLE(H6c|#9{|ve4Szrq$a@HLZSl4TLwa{d;lx3^2a;E@fhSy%@jOhj!!ToLP<#Q zgg)twmPvct6LV&Ah;5Id-yF5%RYgDB0WcJRG$Y^`smJs~-D}dL6-tgZ8Q$G{ACvWN zYYov^Pm!wF#v7(Ij4AR{D#)6Hg<*&G0c@Zi1O+?PnPqwAxHCHSJoplPBtS_5pU~pE z*eBP&(H-4p&b~Tl+z9D<4IzFBsu&MfP^YzCX-&c)hIRv4O6o&2W$%o$Li@s2OZ#bL z-#+qU<#++bAzsw(|qDc z(wF_F4f~sd4ANw&uhitYI*igZ*c?S$gERTU2QkBK1RN)ypJY}_KGOFp#vQ}3VNRE! zZxHFvSG~)Y3`oCL&Z`yHOX^Wsc=wLvm{Yui+a;barHVRz) zml}r;QI0Paz^q?B$})1*W!Xyfa$?H#ykaDc^#shyE5aH&43j;;<+M#m%#e3xfz;oB93C>U}^_~gjJuig8$dxl(67fc4*-75xTMu2#5|ANX8RCbfb^2JIdq(-01>BvM3C1p;#N`>7IYNZMeme4u{i;npsS_~r2Sr(QV|3vvH7&T)e%J&y!|H?+wvPVJxj_DEz zgPE%@%Is=^&VnT<2o2O;sCtF=WlLd(4D0eoZZFeUrnNjE8`x$s9_H}x1s)Q{Xd+jp zFHm`$OvP75Z*z_fVUB|-Ena*&d!yKsx=k#j=pyJP@?+0!(^7gNfM*V#X<&J+j`H~r z3y&r*0q>;Mger5>Epm6J>d_Pevu=)+WmTrI@~CBDk2P&wd`YE=#?9cADrvcm;ORyx zPBNz#_dl>+6N(xXcHY18`NzvBLNMvM70g#Y0kwXAJM`#4UHiEbY<-bz)S8wdtU&l4 z7IpSc&IF3d{G5<<-bVfnD-9%}ESx?h--7b^zHepJ8e>5^O}QRRpvuKcX#x%`^~y=8 z=Ui_|rG8Z+w1N)}H1sX@S(qKBMn~^&wzh56l}aJ}j3ch;bOL z_ze0;U=J?MPof6{2M7j1T`NqB2?@d;y%l7PFEh{+1IvLCQF?{_tD>+*LN%ow zG@>k6akgfc&`^&ROdHC#dbk8Pe1)% zN5MB0uxvk^JC8j$7WyA5u2Ab3nU9143Na!vV;6-%iA8(j8%!7PiR3t4(g(D#J8WHt zbbR<+v9Uh(aoz30Uue}io}cLi@cQyPz=IK)x8RI zilSQ%fCZ{b)V<^Vst@av3UCEP3&bb{=1JVm0n|>|T@Uoi@B31PP0J5Z&CE;I4G-jL zM-3(cno87dg-I_CjLK*SIC&pYZ-d}0>dOvDG2II~e4YYogohDVsM4qWT)V%O&Nmx1 zOqY7S8el5iKY=62Kxib`zu*m$7{!P5oW@{oB3R7*;uG*@@H*BY zrVM6>x*}{Or%(gNr~tro0?Y{N`e5;`pd`l+?MJN$O$AWGGfP8F(5Y9Ad_8C}cHa(0 z%#gyUBN#OW5kIlG-a;)%4Zbz{Suy=9&aZ8}zS*jbf|0AM_Rx?af-wI=lCOtqCK3oT zgh7h&k$j|(sDl@c2P?uL_Li|8T#pHox-ocAewnr1Zj(7G$iMJ5ytk*07s-{r%qt`) zlv7d`717(2Wz0z*Byh*#so*K#d7aFrHHvJw-yDtyPs!fT&nOhd84h1%`swKlW+$j+ zO#-+E!Xc4mfk3iC14Dv4B(slRG=^eY`qa!ZLSJ;$j`NBAnefEyYEK?aINHOsr#K(?DizFJ< z%5xv(%8yB37SzAbL4hiZ*7)m!&X^l<8M{r!wE{Hc@Lr%-IwFs6BB*UG4z?#m zv9c!uGfP@MyBY$NQl-uQQs_PjD6kH09J284xo|diQI$h?2N&S34pj8;$iwoslSbpZ zl_djz=F+jr>SDZ`0^1~GRZ<@2vmfA+#I%ak(oEC94__sp@Z*`8UR}E3njNbT-8ZD! zwO6fWA=j@-y{BLnkVak)pb#G9&@hh~<8TwNnZ?s>s~+q$mV;2I7##1#-@VG_3j?U| zg`CK7TA;oY3nwJ*-6zUw+*#9{yPuP5M|*YnsVvQX_N|#!$4+=619hZ$Cc{3^UEzAq zk-?CUjZpynk`THsQ4tLLW6!ZFf0NG*gcceBbxX2Kqqj;OaFl5%h^F930Pr4anuNC) zz$zV!;uOz8-d72T(E_-RX(~uj+VoL_@s%nHP#(igxlfoPg9)x2>?$U5xfnLomS)aW z=+z?d?ZA5jF~@vCb2SEgH3nx+35TKjRyDn8bd+}%^OVeVDbJz~ul-o;lHP=X@2zzT zh~|!Q{+>P3A64@X9Z6(#&$0fqfE6A7%C4J)RqQV(uz(h3Q(dPY%p8HIvL+#x9ImGb z+p4N1YBcsZTj+FJ$e%bg1bbF)7M$f@kz3T1(l*LDaxwH{FWqIha^FhudP~|CYiugt z`jEZ|Js#Bals=6eP4>H1>BP{p@g{f0WApA%8BgY-Mfu~~+re$@xA%cI(hNKKt%Cm2 zv>gYc6NtedNzX(@pn<=BqOwn2^7X)+IB}WqU-J z%YJK_W+jcau3!o@bL$o^8lw)I>74YU-Xa@X+X!eSP3m6yxqh7%?KmhM4eJTeK>_J7 zDq3P&x)u)2LY|*YGp}8bF$n$h%$V2iL{r zMSZCfp+gFbj_;fk+*rrb&n&g8XsqmIi;4JVIgt~>+9yb3!Vp;#CQubH8q_q^h|4)y zKg-Q_xXEUNGn^OH$AF+dSIp+nsqW5*9IQ%J@Q{~t_<}A_zOLE0}todRwYu@uA=4b zekY<^v&pTWsAw_6Tv3k`wp;anQ(9zqxe3hHPV-8{3tZXIr;O*i96vyYp5rdf^^V3N2;9?T(er8?KFaBWHoJ}l_lWM~nWt@s~X&EGi<_D)K<1rO+ zCk-x< z{?_#TAxhMKet)++k*io3b_4>0O@|_K*yDWjm(#(egR{nxK8nQC`x3aJQEhOG`Tj(vlHZ5yc2a@q1&M z;0#>vw}AYMAFreddfi5{U7B@|lR`ro7tG&eJh0^Xx`DOrwa(yFeP&jhldoJlIxS*W zo>0Zbol?Wt8xYaVl7~1VQ9lb^_0=g8ok+*(lY*1v45%9?clS#m%^dC6f~$s>(l?I+ zp+1xRG-hFJ`@R6XZ#`@u@WX88vYz%)gr4JAxb$MOnF9V$rDekW!7O-^!S_cDgRwPx zu{OYNi;eeTo7srJh#e61aq=e_e#u-F1)jSmf2HI2F;4SjZTF36=ZI1NS zw0BkR#+hCl7Zoc6x}Vm0a*~ZWzlGkkU()y2XnLf)~1slBk5 zq%`r~%MDO7127vL$NVEg_o0vC+s&*DPfJTX0awTApv=;jl!Y3~jpm!U5UOv``J-i< zxosul9Z4C3NxRP`vF>gS3?rtuww7fRgYHY?+t&45Eu4on8skU%d^470&!bybYuMK0 zL!@?W*nRo^Fd}Q;CC#ze7zoSSdj)AIhVS0^BVI}S@RE}@$!D=xR>d2lk(DBf5n`41wU?(n{^G!G-Al02I~;Ih^^?)Yg$!f zE+QOO|G}C&3uuCq%Ze`#&$b1l)QdB zyw-m(1@JML}<56}*ASK3n`W zg&zO}t;I8=^20>ek|Iz9xB(_5LN@5;q7qX2yUXFZ199Dh8iMshyr;!Kw`?&h!~)6~ zo9SSq3wtcgYD&A(lE5O#U_~)AB?C4XWq;~A{0m5twcv6WrvN>}*!cyOy=pX>2n#}M zvAb@+sNgx+pNn^K7O`1h=}uXBP2DTRJ>7)QFiP{h2=rrkcAuyA^vGo1=7)6l5JMxa zp@+vN?hi}zo6F{p+X@ITmy0~2u8Z;loD96vlkh`73qdYcv6f7sOw^7IU0c#-sw+iM z$7j|TYRKs{025?hF<()xL;w>cuw`9oz3tpELCMP%2i~LQ45ph1@k%w~FA!%ou?40{ zNyNuSczoZm0@{c*q-%}^^N8TYXj8yJp|N7(cza>xegUMry+3kFdZriOxl2#eWLEDQf!Z- zNn$6M*Ossp48ac*c15;KN3(p2ny`HM9(KrWD_%UKr7^q~YTj^Z-GaRy(^>!6BAF%4 zWd%T4J#_f)UhNLk0sV|lD)v_H-k>))Jv8tB2_#lB$;f%35q@x}*|I9Mu$lXT@nuo5 z7b4xVdrM$kTBM?q&@{C1(pZ1%JFVUT)i`vD&t36svvX(~pM_LS*&QTs!)X#V+A^ig|Urq}(j3xyBsoYfzW zJ#$4}oE&%KwJcpY*D`honS+BGMb#@^mOv<+cRzzg5^Un2_txm{D@NxTSUMh;1R#ZW zfk4%segwW|q-<+yZFkYa-w@3R+a!kchvm^NAdK0?6D2QRrOIxHiJ9Pv7BDVX0&{%W z>q|4JVKUwT-}|oPP3St+I1NlKzSRk{xz^-PvlNZoce5XCuqfU|b;6I5rTriycu-k*_El?EqWY!0!CH(f-&K_zo!->yJLArm|%Aj`CS@5cqBKHoQUOZY}I z6(hn*LB!cT={W|Pgp4B~EMn;u$oOkjN$9l^cZ67}vXRmrgbq=f zLdP)?kNabX1z+lg!00B0<4_R4#zgHX$0Z1%lOBY_AQI$2hFRqio+D3%dsadSHiXs< z--k~NmGaj^d?7Rp3nHu+KSg*5H|eh#CK{%4M;JZ^9jpKzh#u5HXPbZx^j}E}h_+qi z-dTk62BkgZ6^XHT4Nhnfz;=*SnoEj(Z*?oMJ8g^gm$=4byD0SOoWC{mTKX24{lv=?_oh zD!oEYmqEOQ-&5v&D~1&Lz4>#)za*sx87;mkI{t#xPSbOP#7WY_4tXA@OE8c{Ll>Gw z;3wga4oM?^*#R;{%=)#*8um>EsiL@$3gi9 zy^i*73EpfnySsf%_UheAZHFvJBggfwXS)p7wg2JNdKIqR2TU*y=_2#6=fa+}Claf% zf$_sgr_kD=#EXr3Z^fZTLYp^ieZ;vq^k5xn12{)x2)aS0ZrzF{>FrT`pE=`D8c44S zNZ1P<`0E-VHJqufZtpK&LhwCS-BjR9ltPE@O>EnrfE{p;S-{Thy5+#O-Cl5}^FY^z zusn-^a7W)YkaJLYWTo z=GphcL^=*YbEMrMTiIR?8<+mqy^4)cKbs1p?4nkI$j#@i+U84ZFEHfI5A4(^x-M^4 zYzRE<1TIkX-Yleelsl3lS*+U|r~KXM|vqB^(R?+Z71HyPh=gXqz0b>hKmD!S{! zlfPE$l>3OW%ZlK!4HOHO85juc&j+yDS0pcX@)(-O--(0 zGC`0NTEJYALz^H@P*x*uJ9y|?eNMZED1?VK+s&rdL+3-iqA-oQ7BCSw z1e14F!{-BKznK^K6Exr9Hqmx<)MN01e0XUN`L-RF$it57Q$^+Ta1E7Him;Vgt0 zmWO<0vfGihFR;L$)#Mt zY9{7Wj5*7m2mKiDCkonAD#e4YovdlcPp^CEQ(<&NIRsBDC>h$2*z;f(Bv-|K!+_~Ss4k);k+)Q^0P*I~)WODXD1U_^) z4l@;?jAeyH))pS%!kif|y$FYkcvE|6mcFXXo14Ku?j@=Wx{AUxKJZS_-O-ZBv_Ru+wZ?t@CA6Yurp6?7kJAvw2vP2^v z>cX}`b<|Ckdr8AaP0}$pn>4Sq)YuZi;NrJt6fZs!@f~ed+fb&{^I-@H z`c`lt4ya;Ypi1{EcB&7wM>n8d0l;Dp&E{trS2uTsvR~xwIsI)`$eh~g2g|QxRXX%B zNe6D@SX@|XBJ2vBU9PMH2IrTKj4l<&hlg8u?z966oq*%;{;#@`EpzRY_0dmHQ{&ky zIX$5-;ui+Vgcl^PO*`xUF76O(1iAvYG$1|@UO4*c{0K07GLIGQ^nu5g+KLBiis`#z z049x;TNMl7OXfIL5?s-h=0?f!% zOFvChJ-$v%dges7{rT}#h=f-^txbKjRz;&n(`tlHWp^eYQ*>z-cmc;65IQ0=tZ+!v zw2G;k-oe-*xn*t5@|-q@He}+NKQN1~9vx~7vO%m{0N&AAMQUU?buJ%XCcEH}vWT)q zSuC4B$9|tts7aY%ezs`Q5ttL@bvYQez;u|H#6&zwo`slI%&b3LlF~}G7Un2fRIaA5 zvCv6O_|`vJSsg*WLAS6l$Qck6HrI43IeB40842TO{0u++Au z{3QwJ^F;r@oRt3rX2J5wJ7A$>W%)E<{^_LrM=*;|Qx^>z0|V0^PD*APMrOv(OqoxZ z1tSgJC#-?~GYjXlUjHZ9f$o3H!ug{x`)`>Ezg1!Xv)lh}rTn9K`|nvee>(>M53_Lo z25Ir%#DY(}#3wg_p5fDG%J!M7^gn46pJ;;rCOrI$Hu2kEGtuE|{03!UV#U{B`!8<8 zC!^u><)3f;6Z7z&fA-%WkN@X8{`~GwcEi8Cynnu8{V%4*|70>S{PyNQm<<2*>)-nF zcmL?mrv1sS_zfbV^=}4Lw%;tp|0zR-p6xFQDq3=@=7F>bUQ;ULyZ3rmo$?5Lny8+K zK`Y+Ar1@ASbp4N8n=HnLXqch4#*;>wAWjZei46#z>1j=-da>f@ng{c?fw&^2swe@m zYq-NcPjhCdtafeGsKvst43tp5TVqaW7R;ozuy7J!TnVre`dGiYplET4Q^dsg=Ti|2jz^}doyol)E5LPyyf~oOK`4k56o-b( zN$V*}hQ-HUkmT(|(TmxZlC$R%P9zKsfh4wkT)#8McwNt+fyhie-Znpo0+fknRDcN*g$M;p7RI|12NF zpi36zMn7J&)YyDuZ%xOZfkC+=P%<6FlR*`$*gsMf%Kk)}q#M^mAAm(cQS@HKpCg-B zB!yB~A$0V!R7kxC69IhsyeMF>ZS;FXHbUAQYr;F=0;s6-`Xedq=7cW}D00HE?-fL3 zIRN|^od;odyKjr~8rIxYuQU#jCCpHV(~p_s_zw6ZrH1Msk1idbgxi8|MDzSaf79{b zjK2SA4(M3^!opyRkyi!iX8z4gx!jFp#3&l=!(js(_%D^Eva=Nq%=AuUb3ToS`(!z!F$ zl8VyopNefAm!f;$lY!Hi4|^|Ox&6-a24EG;J^eTR{w)*sKlYoM@vjrk2iHgY*>7)9 zyima!z!$F4GTfC9oiY9$WTHqHv^6ri(wXn|2@%sM?pd%naz#3FI)?u2!x%|N=IhGa zEHk9t0s|!>mJoL>vQ^BffB|2s0~|2VDz{FtWI8GZN85Py)J@6e6EWsxepUWL5StqZ zSrmvfuUtWHLDGlxap$Hj1cX__f^%bTFT4Q~b4v(~WeJy@ny)1BUM)NW~?-TlA$|79lXkV`8U1&hiR~^f4PvUquOA*X+JOIqGnJkyQSJb&geYGn-j>z1=`U;qT;!xaWC>(_b#Wjq_E?)fjUH3DibM;8?gAXOF^STiqOki4=24 zE8w>51G_e$=l@OXeoN2%k8?rC{Cn6@M~}ev^Fn}p2+lyN0u`kZ;Z|3?S-x+APPKnk z#KtL;6&zyX=L6$B88Wnd9=Sz32&^|S5*eVT^vG%H(Y$lcO)8^Y947zKItJ=~3Qm58 zFD2nDJA^A!O0rtQYyCz&A&)XW?NX9(mR!ww4PI14boMt*|83d&pPJ4<`K@4;~&)m;%DTMXZNwo{{stV(uxhidjdty%>Km8o% zB?ISYtwv7>=(FM}1bVO&?63nVVuKD>66>kv7Y$yJ9@p~7&&kEpqRiG2HkNdex+{_G z)YCf6mHaleX~#+YCuv0UmDT{mmg6$=VC-X9wFmj(r~-FXQyJpNt**!cHq!iMqfE}P zD|hZ*xvj-pqO>_%fFQZH=@AE0e$E_(``_%q*h?;TcZe?3%jnRO_$F^i&?DRCUHEQC zkv$^rd)Q+q{UnU9S(FPa;VXa`h2(l}$u}#^L!>T$HSZ9AyLG=?4~A+O38vLni2Rwm zV`eI%j5>tmm_q|bEJZbp>Frl5Yk)!GtH4fldz8uVwJE-Q@$v*-Z{p_vH)H?X+W9|? z{U<0ZX zNvg=kh+xzu!a>rmn@rlH@C6TZACUgZb=4vq1JRm6IOkYDvVU>1d^Ie``JCS7v2Z*i44vs~VaM=vObD%Ma znW0I@TT0axOXn^)i?`zYzmE{zA0)MZLi(cr%MD#CUdmdC03zsDl|O9iaL%Z^_N?Rd zxzCEjZD+yJ-nAA&ED>8U%m{(kBspSG7ra&3Wnj`PW0aE|npX?%5=pf)tyL&tJsEeI z9U$NQ5XQeM zH5`ak9+xT`^TQ5T5D_*B-Ex;y8`75sy~36V2i@7=HBaa?avz$6qCaUNcb+?$ov_sP zTU+CD9FSwcF>@&l?g$1WqcAm;bP$f&IyK27ceV-8CW^p?V&+rt_=9ULs^?3UNajST z7yVSgj@nl$l?l#oTgm5WrPk*b`L}X8luf70JrCNQD=IIRU4b+HQhzrW|8QZ)$n=++ zuvUUpG!6kw;6r9Fnk&+KPq&*k>FeN`RM(jR%_r0rGscBx$(6` z#!8|}!B|ewBkHku_X>EhlUq}OUnB82!Er_n`YoT}v|W#?R%dOI;FlYZ zoB}4;x%fT{iN3!Gn7T3c5^&1i15|wivRx+J>=7$|(r36lG3MJgNnuM`Nxbus*WU2z zv)GAX3VerhTm**Jd;dk4eHIOz!M#PZ*Hbmg?`$}LSFW7aP}Us5D10WX?F_SJ2Jyj& zQ{$rze9!H3XYSA6+Al1hTH%H5%EFzbNMKmzgF`9rjDu8E1B*Ie1BrsR#gB?X5d%yM ziGX7S1U7GD9@#^Q?oatG=ned!1iz{8PB+V{hqt0jGscFI2Rn*yh+q$h(iIU-Uzn!G z0<7_+0!)1P@RXX1R{W@^HK86M&}|TeZ$G!&Rwu%$Vka{Y#)q9LWS8POn+nx~GapPh zi>}et_Zbr6SWBSL)HE6;nM4lqJ%kQ447vRU=g4Gy^UUSNoCgl1oB8h|;vcTB>FNHm z22qM*g99dj5%S3CMMHu^Teztmw8N|1=h{@j2(I6=|KB6=$QbX(cJ)c5?TWcY5}{?h{C z>qwr2lA`#&wuRUMqRW#}$`MhM#^~nB2!VDTvV-#IFY{4qBTlQyug0jNS_{c9bju>= znxT0824QM7Dd@NYph&^$3bkh_TN~`$DvF3DCmYPg_2Jt`bf#Yud~ug!`NbDH559Gy?R0Hq9;&pSxNf5d=xp6 z*ly6URYpk3z~E>HV|h^&lgv8=vQQk1YuQLW3Ie_K^7WSZV^)C9D5}LD)WOo0J)JqLa>iT6b@v%?OJydy0nRH@iZcYK&hkUm7SZh=V9 zvlUB1Cdervsp*sY++Odqrc->-#3aVG^;ZHkbs{uzF7m{U{TY+i==Riyu&(fUZ!Rswpb(Qb#=y(3Swx-F-S!b?~1@l6FSTB*)HiKjr2<59Zl!=&I*6|G*7Tv(evo1U->2D^Ia*o|EaPU3LX7nPkVkUK=d0&LVsjoK zLe8RNT_b*Gqd#DGJ__R{gjVEBwg#qqlyhp;OFft6Dv{Fl6}8Sg#SpWDeIdd=2CS(&%FxoL2fttcbC*Z+~zSd|D_@sSAsCel^aAk-x5bvf{(xyVCY&6~``k0TeAr6-1pQi9-z2 z^@?|zVKpNX8^&PWVo7@3XBMOCF_e^8ecjX?!im7b_uhymhimXdfxa^w$Za$V>;@;+ zX&fv96mrPSGV|AoKoY$IyuxyNWR|12+^zp4fd!BnhLRFc45OTr`y7V+oRgbqpmkG! zZ1w)e4muO!hDg zzV1hhljQxcUeM+aZQ**R3pb^cC6thJ01W9W)9hS+G7HP3N_0i|_$8Le5<>ua z@V3$VFdf29fNd}VTG?oGO}U#RD&DXeIw-~M-DCklt%200=; z`6e8BSI%f)V_c%WbQ%(Aei?CHzvTO2{+Ll_yboHb%#5NhYu>$owaG<<`6hPf5aMAB z|FN+^#+xVC4>G@e!^?p{J5-?U0U!&gzUeYQ4_Z<5DkMM}yXZh5Ln#n1B31SoMnELs z=VH;m1yae{!f(S)fc|C|Iu+%cOF001JQq2O8T(JAa|2z0U$_`_qw78lNdzPNQPR^d zeZTGVfyb&qK!s>P&d(w;21=JW&wx?{8y`3WO3gxN4JO1S)KFV@llR`o=fG!n*@DrN zc{ZXH8?+_iIP$IGgEDT2-7d!tHL6Z+uaxOrt}ckG1yG%5Hik~q*QivO@NRi^FliM` z7Sa*D2nBM4QhTZ2b%w0H>l@hSjoZ0#x1fT$RN=Fzj5mV+Vn6;4RCGxNtVMI#3CS;# z-ITW%&LU)87TJ9HYsLW0oW7ked9a1WC-di4A;r3Lrda@l)pCR+3TTgnAZk-$2=eWz z#9E?@KK2KY_WG}CS3TNy75Y0Lo)5qRy^_BX?&xU$p$WihjFjgkk1?K9OA=065NWAJ`h7}a}z56q4F zt^4ny^dD~KKMCi*KO~r9$6$d!mwFe9bg-(|;Iwn~a)|=+yshwC6JfB*?vR9SP25?^wUL-?WLVnm41!G6~k?$UP*Gi zZb1&YDy|8m6qiWICfX}ncAE%0BNvx2N&_j93Cdii;TsGo5vl)!xvv1Ls`>V&yF2yJ z-G}b(25F?bK}nJBMp7E2OS+YmZWKg9TBJc5`8N9c|G&Q1=U(pj-0wagJZGOh`|Le? z&CHs$)~s2-8CBw;WkE~4^Th2QQm35?5QCZju{g8WM4~T80q@Bl$_dPb-OIfX;P-zo zrzlzv2to2JD*zb`iTQfdnj=ke^ZPtxhrtE;V~?$lumNgPzRWgvK8Yj;>nGe9z97zY zLFE{YjD;^YUhD_fqYTbe5$4tTncJUOj}XW4$T*WSNT>4qbBbolY2WY2yy4QiN{&r+ z;2>-tmgvsT&CVogdQz%8AHADI+7P3FoEeW{*c`?a0on>%&1b)%FBmPlfee2r5dNn! z-gBhO#{HYufiq72&V4R%mX*h1gd3KZVX0Qam~iDdwKd%5+gk*?p^wp&7o!x7HYh)| z9R=>(k9$hO$yg+}Oiw0zn4u`Y#Ipi*^3k-Y9Wm;!a*?{6b~IlUD>W?-@e3ZM#Iggg!_&!vxEPk z2I(d}ru2Ta>?WW8rkvKr3-=3Xs3O7AKb88PqdD&17?^{-5tz7P1=p#Jb8-W7IP9FT zCeXn+;>>XbVQE9K*u(zSD58ww>d2JImCa-dM8SyfVYmh09W2na;IxSFAzpvRkN*=f z_Z&I>-U5FS!>;y|7I3`=E7T-ih`te-ICQW+v$(iC0tfss7^>E95+Q_68?6+-3yL_U z8<6#(9pLEolx;mF!94vrQ7)nw|b0|_%wEQ zU}|?foljlZKCfeXi{i9D%O^m|d;%gghA%)Wkv*ZH20y;)(tG=}%eQ(;Q=G z{cRRkFkU_Zm`;&6{BK1)W# z%ym>Pu$S0T8YK*_q;5dIMNSH=K@oW)s>9c{OdvOlG4*2bMJ=|}l>}F^Br=qgNUpz^ zjK%Z4ru3tBJdMU29}H|yFy)FW=%~N+fx!Y5qq@U-4~5{xoJpSshPio(!t85RoCK!z z!g5WF-d>tbUFa1-stx;s5hd7d*u;0MM=w_GF^8igKRftz-LzJoeh}J)=M#VQhiM34 zx#{~!KhEE@6bC0TwJB;qfvgS-Y)b{|?hzyFjT?gK8e9)R-VjL>3Fg&@>qn_J`_Ump z;Lv9O)E4(ukQ~2x-#C@|(ZtD6=3N2HINZnoSVhyo>$V=T4Xyu?-8<2cd~yDC>Cm8@ zw3Xf-+r_yQkN#IX$vsdRRm}=^CQJ{%&S8FqDsp;?R!qYq0R8BD9hk$+9yj`l(bSsw z#%}hUso`n_YS>s;KeYF5_zOzX~BxDX+atfN;Z~0*ng4_n-&xIBW`*dU2K^IyCTHyFsuPjux$FWca zaW@W!pJ>p@g0I|Q?}?B@7dYXqYyXj@P51+ zS$Bjkr&kCrJW=P94RFlSJ_m%}*M@Froh=kP zTFxLY=`qfl>0Ts}V4(_Bn7~ieG0`<>el_R;%P)*>?yAbr68B7?)2!R$m%dPb zS5rv-1?`)d(EtP<@pq#YbsDlQ#1xMU1BkMDc~o>-tafv1ni*4F)GOsoLRHqzt`nIi z^Y+SIBGjHtV$K_4X1w$0&}$D1U(FGsjm^^^N;npI6WTKW*t?NM>yzfUKh@VgEeh~I z40Lt*7^*t~8leveP>@rWO}z!%{`dI?@%Bsx5tDb!q^A9GysxBFGZ0jh9@=lqw`4PA zKSi->9;R4OdT(AESA;wH;x~s zlqT{^WUuF@v86@Ph&ZkNQa@5tN~5Gty(${`1f9wAl#sr~Y<(>UvB;%Itx2f;-luYC2b(HWqlDw>Thc6$*vC8ogB4WJPXHN{BF*TW6XhV^6f&Z%c zTEu?DEY<4lqojwd?uas@5{t*jtf$7jt1^!uLw27;mY=nmy(yr3yH!Dfm~D}Zuj_;Z zCV1$PQ0UJHQrq&>`Z7$+Jwn^X+}$qX%m3I}b%CCdE$yv37lA9H!Kg^i8qOQ5QZ4pE z?ZvpXY;HRX$6&o6Btdh0rD^~7adQ0XR@|P-H-RDEM5l6>g9RH)r|_-0wGDsbiF+D# zfU)$OQK!lu1E`>{u1L(RY9Rl&o)+IuA{MS1ZD}}g@d#dy>Czdv^y5;Pl|;t8cxeB6 zW8emI+aL2A6iup2<3XnSM8_IYnLI2xg1fv0)KMJKgL#W#Gjob0N_@TodBHUstp?e`cS3iry=4MEIu~{F{~e zpUz=}f3HCm`AT5e`%{SvA^IOHe4CbBx@qJzYw3atj6Op%ad|Z~GT@q^JuWXrpu2K% z3o4u~7NBb`9T&v1Wk}Qz(NP~DscpvP&?*`#oU$YUGtWRU=4L*F8iGWsT%@4(Q>BA- zpEKN5JGH1%gc`BceC)y9^+n$eQR!KqE>B*^0JPu~48%xzhL>FD+`}%sTfejFWi`HX z+_Azli!|^#UeE;D=g*br+2}UeUe{U{XC5Eq$yE;_w<>91E(u9l_sB!U`e96tv=eJG zEx!?zJ$~7F5DKb=tB$Kjdeb$|q^oj$y144-16ez*o&2YIyQgW*!SS1xF-RD22xP?w z+4n_yI3*rrpI#S_fh8Zu;4|zI-feH=8gokJ)y9Ou*|b z-@$0Zz%e@1y3GUi8fJ5my`<^OH=p)kb@U2TOgQc#aJS05gPClX=ZXJ&>r><|sa<@aBVUG-9 zMqv(_otWd%k#rCVu{ZrqgEQh|6W~_@Op>t1dYp|27i*I^R!r7SF?=)|0NCm`x127W z;!4_=2!mQ_5o?i1IvZc1H{>V@&2b-?*c24N4bf}N3mcYITv)5sja(s}^m=FbYI_p! zqqa3V-7gEy6^*SOnAFTI zpV%3@{D;kJ{vMXi`fCFmHZU6!i?)opwWXCC2n=TbwFD#JPPn7#F5uyB#__-D_{S1- z96zZ6=y0+20O>KavH}4UKmP7|B`b*OpI7b{RJ3++brZKTb^!s@C>Z~B&d&ZLtj*l4T!AR+-^QIk$DbTLyr8=eD~Ow$2Z&z28|vI0If3wx`+j~tb@%+Q z&#$rVfA{;}@Bi;U`S<&O=JK;5e_g+$?AQ7K^!Hso{qvul`zIg#e*KO|{==>Jxx&SD z*OosU>F@XRaNLu48q2UBx^WmrKhmiPJa z0{4mjb+0(^E%Dd66z~nWErA2u-GTk?z;Sl~-yJyb4qSH!?z;oe-Qg}Lw!5s@#DK$( zNAEIYle|0JWp^KP{wMF@xGT?Hh8%Y!{7>fm-^q*fSB>61#Pz2qx$bK7Pe1(sd<_T_ z|F4PW{ly9YRY^quH>*JW@6?FjG4X=$5}uB|yA)LhA0S6o~gPC34qY zfi;1DUIuzCu-VyP=jE*51tfmG80h1` z^1{D<;Q-}Ot;$H+v0EvH5APHjoF(2~dJyJm87X?6nWdj7w zPYQrO%LWkpGXeA=HbC(FOaOg|4G=(oB><`cLG&{L)Y?yH<6YJO@38@b>E|y1f3X3? z{!9Sv&-TLwbaxxj{=oFuuU~*705Gn!m9Bcr%>Rz;P{vHD=s4kyC3JfvM=$b^d(yDfkhc)OUQ?48-jK}Og+Pnpc zWa*j9pm}a0q_Ii3_csc4G?tUy5?LuAR-E=u3cbmiEmO5wk-!VJ1x&}m*S=JYgaNeApk08GEs)g&|XArv4@4fMV4nAd945+IZS)r6i9;f{kVo4A!lTd|d6Aqz1!&lWP~foP*cK6z?>^zHf? z3At!*kcHg`{|y*Z((!e4G5fu_DtH<}XU5rgk$Cn_P_1S!2_DEduFS~6k{uZngoF_4y@8D39s@lOolh)Wsis8n8jG)*Wwk(F;?^3bVp@hImY^ak4 zw^dWZ_i7VYMfm2E>iTI{$9I8S$a&9M=s%eG9Cvc#KKu>-Z8k?!Lq2Am72(q+PRHBC z;SZ;tlSCtVz$|7-K*6iUpa`}%P;Dzwyu*DojnTMl8ht7HE%-5RvCq*n*m}?*%*6(q zSe!|-56D6o$i#858gno|9SU+OI0pm{=+xq6Y=mt?w>p7W&MxpTy8~c6Ux%2kr@fv|egBc=L`IAhP5Q}3q=?lD zJavRJ!l!X9Xw&kL8s`v+Cw!@DHEHIu?^VibUj~%Ha?u?}Z+*$%GlIIV*1K$hS=BL( zH&WDb%!9o~XYkL$3rCDaXeaQEHP0C!@D^0>`f|A=jRzYHqf==^Z(*kc_EQ^m4M~T% zKGf%X6mrlUEC9kaoJ-PER;l5qvXr&5I6<_ZSWWOw4iQlNLV*dTtA(t-1u<%voE1pYQhg zx#+WsI2LPuf$4HF%eL0Xty zctNVUbYasFZf?y6Ugps&ioF-|DMRQv+}FY;OQ@y~p`eW>G=(Ujme{FCQr^E{O&r2! zXz@FMZD;9@4v(u5vdu_h*KXh6l#Vt(@RwBV^AzohBK`rwfhGxB} ziMTn!Ym}~CsO_|z{TlcH>eKj>W2%y@0-`Vkb|vSdZkUq-*e~mOdo!DZjZjdK$<4ur zu&8vd;y40E;f06iz|uck6GCdUi`C@V^MiCIp%JqEXaz>F&rGg^;v`9fLDNNzWr^SM zHD8)hcGv`oTPnurC|Kd44}V63N^C#7*b&XlR=0iaoFAuvYEE>;qNFw^hef%KoEOnL zRoiqMG4Zly?3{ZGuE}1a(wMg=cXl0`N1W-SWiV0?A5+;bp}B6#m&BFeEF>Uv!Lbt2ohh4e+F7=65=hYc^_1 z-qg;M)KL(of#jqH3l(Sj9hDTkE4YQ1I|K%~hrRvnvj&fIm;DzK6vt0ZlTyl;8Eg?O z-_;n51kHNIJxmB>`e*}=%JjB+lx@C;toK+hAXYsIs#p}cPaBVjO^1QV)?5(>HNat( z45Hf$B69SDw83cA_YnzN0&6Rzyfl^>8_9$&UlSHA5~yR?)_|3XR24xT;?ZGWuR@K7 zBcSNIQuq@jB!?ppcQhN{@O0~BPv_+F*wA|1{2hqiKq!mu!p1&g zJj7K*`fm9ABW~{0pOny@MRuR&{D<#Ut<|}g73HfSEdD{Jh}s*^jGeLhuRLyMwIoBao{YQRS46qNRdhH@--LOp8qj&25kv4|07469fkZ?^<=p4b~~NX}^u?_}4-{ zjmlvL&g`U_{HHlSI?%RLE{j*LmD`=k#@b!N440L=t~dHiAA~8@LK6Pe zHg^W{J=zA$^BXqnZ$_tI+3;BQaT{QCrU6E$=va91-5)2mjl(nBUVC%5HhI<1V7Z}mjlm;eA{t-WQ#FjM5s{D zy811(x&lCtbG~vT4s>WrDFin#bh9L~MB(jmLk2WjSO+FRyks!Nu(sqn7ic&oHs!!n zAMV6e(hX(^4CZ`MhnG#`DTFHjR{ zYeuL+A1M%BrCvq3aTZofCDEW?-fX)Eyk(`PlG_xfLBo@nm)5xjUok}g`9rJAuo~9* zAoLR@UR1P_dH}$JwtgMh!EYg^?w4pj-Je}vK;Sgmi}wxQj0!QA=S!xT%L`1Mf_KCw zoK{w^con{5xG7}_e#D=831+(?2c2*&Na8mk7%5X2og=TYiFNYc45tb+U>5g>vjm8M`wF5{2rmhLlD-X zih<8GpAb)+Af(}|k3l8Mz=Wr%aFHpU=4>Y0;wkS);O;m*VdB=nEY=S6fn2FTm%zL~ z?*k8mWtblDFmsN|2PV9N@my~MbtjT)%bF9?iBttV8umwVt0Mc)2mG;DX%Um7OR{7~ z+`Sr0SHH4z9X{@Jv@xnTt!dA1k~p*|VlYuG#(|GltCjyu!7=h}?qDvD_h1 zdcc4ldHyJhn(w6hb<3) z_N#C3S2|!#g*$kb54xYOvckSv1rfA7FftSs(>h;)v?_s!uy@?@zJ|Yk>?DVBK+}RO z`Em;08r2Tl75#DBP;x&!D6F;K(H^S7K-93~8I=O%MUDcDoTAKBP90rps-6h)ix1QT zYP2K7YM1=-MTe*FofKtB^)aA(Yw5Bd&>N$0g)1!etx_qdrTRS@{Tj_Q%3v9#hDvEY zUMo$+VpP~}S~!d9(q{U;mT22s4xO|5WA-HMs>UEegu$y>Hnc!*HQjelnF1z?NS+T5 zF9zpPReL1EqwXFvk3m;})N}ld!L`;i)C0>q(oh|;ZG+@1(c7ZNb4xU*&AyKxe?Y&W zD*j{dymRK+*wG)o_ea56Izr=iH9`=&;D&Z5=`_0FmXsa1ggjW-9 zUDMj6ESO=MM-ES16rprtGYgHvUFx*;eK^2AA??77DfFtQ<3`C#td>z3#3Krf=xa8f zSP}{@eww7;Tg8OC7ISDZPVk{8^n+;mCEMuC4Nu5MK^YFBn3Y8mspA0idb+CKXoyfW zgm-2uB-fzY`p}uut>tP?_9{A@(2IgU^~!sCqc}K!ldX~ovJMh=Fgl@NmIEq|+1br6 zw1ec$w_KXbN?aqh=Y^@mmJbbH3ERpx<{A_{mr2}pik^6mWa*(Lk?8=(kb!jMG>GRF$0b`hs^-TqWw^9LCCE&BMb(xFL`; z(Sx4gXM*E~zRzx1QyKKcI>$ofKOfDki}c~dGpe|!uxd-Fpfiyldy&k{)hF6hlQl0d zVb>*PI#MH$s*d3V%);i_h%|<{xaA=nbAL*!W&QjSAtrOgz^|OEN_o8Tr90uZoX)Vx zBb0Ftd|YE`2k6>~RZm2Hy^onTvgc1H$ph;2`^uVeo^hkaf*tK{+R;jqxsrH8fS4-6 zx+t4G*PU4OsyPgv49)Xsc^+<(3nRnXHh-~E&bkeXxdO`s+@6U*8b2XuS>$P5!NivHA2_x03q{1!JY`C=fNgbhV<9~TxI1LUB)LfCy^ zOyXC2c5BADF?j=un5WUSrdMC-*XE`yiY&dJlzz6l)pQMOk>7%ik`qMtIF`uZ43m>@ z2L{GSl8}bgiV*?Av^SP!@>=8*9D#c#(}bQA5uWC}!C5<=Bxb-hOc0& zL=sg+t-Kih{joWjDC%Rz5h0A$wy;Rca`*+$npX7~#_pU9*CiBh^Q8C6)-n`WItya& z1REF+6B8F%+0#WI=UY`KB^vPZJ!SlIz}fm}$!;7SbFf!J`+JZy^pm-L!Vdvc5dzOL zO-;0AZf=4w$3hgMLQt()@fHzCc`b%g@LY#$-yxIfUt`vTkGiX;0b)CfqCy zQ6JuweX2MN2kJs~2|zNd1PV`$+qXU2SbaEuk< zyX2ehI?CY69KIn#QryXi=r!+?&Mt9M11{mYiEZk)QKrigV|i;a(yRR{&fWoDcmBd; z5Z%X#GLQVT!!4!lP+n-?`{qvP3UZt;ZM1dLl;JzlEgzqTO}eKvHD=mW&BSb{PDE-< z*Cg;C4H1(nP8p|qVshzkcPG7$BoW`T?WY-}@em>Ps6pj>8MB2GTC+d;mP(C5M3kNc z)9{ta>nmZOy8Y9c?+}ytR;+)j)%!Y+xPJ>o0s3qO&}Sv~BLWan{_3-z`ESe0`W?>M zeJH~9RJS>c6xfmg)tE(BdL$n@Dt^g7osjc6V5vvc;D|Jx>> z%Z{LXN|kAt;aBREJ`_d^R?#I~YR6G+58M{~1~OU& zbOz)OhioPiSp4$nH+nV}R>F_n>lY09L2kOevtM*yygGlS%P3=fJqc3Gx_pzY9}cZr zo!ao3Bmoie^u;GD)yz%Thbzp@n6rjP;?XMH47M$6>8P_&?x;!-9(~W1#Y2#vl+ICM z+N**l-y_)`*}Z&pv|C!Kq@p7cAT*5I3hsVj(nZXq5YimlOg$5l!&@RuLgX`3=xRhD z>9xcl{2l`F8<0am2IM_ z*5XmQ1evN1mY!E9#ZP_GfT|~X9{^$5h_vL-UTU7nh#%^ijXZ9+W6AWjA_M->8y%Al zTT!FrgCn2x-B2y5IgrS@%`=$G`~%YGefx*#E!cf^f8vpQ`kmN+x1J>9;=5T}l6h)fAzU)Ik;@{iJ`?@o=)h4SU;7j=EUq88rkGTC)lY%!B?B?UI0hO*KL zHQyHfa7iM5_3@Em_a?MB5|@eF5Ja%_rc??;JB$-b*A?^#`ls8y+d;=eqlJ97h(O*E zaiKInTN9C3v&udbB{#j#Lq0{_Uo!~0U=!=o!C_ozDnnsKg+Xi^(Ds|OQMMVnPA~<` zg?%RU?m@;PY}l8{1U7IF4;*%G`x0l6oO)<`>C{c zWG#_Wop4hWwO;E@YZvm3;S^HzJMQ(lvS*d3)P%L9x<1m-W;`#Mjo5gom$p7SPtZ!v?dff&7;?aeZuNG-B7DKGduoWayi z^5|8WecY-Iu}v^GH|mE6Y0HeHmejb=sdNE zm{I3mN@;h*u|$ORK1y4X_{4dwtKfj1FFU)>c(cFm<6fZIZ4n|8WlOjjtSuT;^*SYB z!ddHeXu~JegJUb9c!i%yCCT(rf6=oMw4I#fq>?Ljef54zXOieR9=x{b74z7sVA|2F zDH(-#2JNLO+lQ-~?*VS5n44|MZ3i>BS6QP;JFbp4eFGJ($>WLbBBHT6=!RA27lSYTa(N>Wh-@y&K5u5mT!Zw6!0c_@ab z!Xs=m+!T7SuzlkntKYHjIxv+-zw_a~TGxv53%O}OIy6bUS{9JaX3)aB^2gL0LUR~W zG<&+fW4=ht0!;#XGp}ZLVsfqI^06)oo1uW1xA&aNnbNLt{v~-uKJOXhhgcsE* z4rS%(<-(yDW^2bAUvDnJVJWmdOS{Ga-!d+Fp=;z6HC+)aY8+l?i3@41U2W(Eq3p|3 z!HI5v3J;RXC%}Pt_GkoWNY{T=#yEQkK~BYM%vfA=eJlOwElGO}e?PQPN)>sGBfk9-BYAntTajV5LkLjg8_=%cCzhjC;Zf>$Mte zucwC6x>DZEGGIwFevLCH(v^{*fhzMQ`E-UO{NdrF9Q&SS=D;EPK;N9<#wT+A!Q616 zToUODcxs%Ro)hn%Y#J^xXw(T%&A;BEav99e9Ff@~CC&R9LGi?3Ek;J>N zp%zn2s4?4RhWXb36uQ~|70RCk@jabP;NPdh6%!RJf%Qa!0DL^N(ZDsq>aoJf3&p)R zinx2>HH6PibKZ(bKS-<5mkN^I!puC9e>jtn%ey|N?iH?NQ#AJR$P+=&JUB`pD)u$X z2k&kc38s=)mWSs8k0cNLs*}!z*wJooKx&-5%24``WgJ(b#E!%!`uVoUwM96>3L#Cx z`RnZJF(bOMYFx49?53I$dp)WnFuDUFu^&2^-)pCjpR!{d*1&Akh()}5}w+Oa$20(EC^ zSEN3!iP3!&K2dr9czLMai=KavTKf=l3j$pm=bQhUF*y}`lvo~e3%K^5Li2fX|SfC}BkF6)E3idTpy(THPVuU#< zZS9O#CnrX9(IGN%>Z5EoQ$&fieWLUIC9MljUt!^~$G8F2#D8k4ZSX7w6!ea z`5MCf=+Wmcsp{66)ueoFQ!i#d=ZMj2{@YdcNa%%PRCq+$Z0>q8rHONiN zS*qFydkKuR?1=2#M&*-brNtONoyy!xZwu_Vh)Pr}^CBhTTqyX%he-xh203l5kMwUfqt2#aPV z7biWVizj{-%SpWcQt#H$G&Z&tes~*Mk*7_L;T(o9R zH(PARHJNJ?Z{LL4s$W<7TK`MS0JBiDt;FW=I=D1c7~R2o0NBKCJd_6oA_=N=dXl`t zSDXaSNAfVSPie`v)M#s@2|A$qz-P?X-J&no5DG z8gFvruQ$KlUQ3@xEv?#KLqihxY5%Ev-`B6j^ZR@*FmVs~weG+Z%d(#nmplzQxAWR> z8@MD4hI_E#qx{1K3nEJdFqzp>iU(7;kf|>17mo+uCA?F-Ch^p0Y-1{ij-mLB<`g2a z9FI!DE9w=iaN%)+d?1O%Dzjpb_?7;EYYD&5%u0VZ)2s{Dg}&BbABQM$ZO*R}>qf-~ zzd9)$k*461iJec4AdA8UmgH>+zu^c)pN1$!Lv(Xbv8lSb8PQB1M zt*P>K$+oPjwI4r>bTF>KQ|%Ddg$ese9VKQ0N?<yyQ`T9|TX#Lww%hvbJnyi!hXYmoac z#52A%R{JeS(5lfcwD;ZSg#YRT=5!uXiXJ!815d{7%Z;9rODGb_YGYa-NF!nhbN$Rt zvtD*H@j$-ht-g|1jLq5*yVPP_k_#WnO+MuBR7t?gpJaAUGgGd#Dpubh_rqsaOB|eM z6?K7%Fy22meF7_ig^Te_>%q_(0w+xLo)}v~d+d#XE6JLoMWa14Omhz}O-lc~!^%d2 z*mr-o$PJujcW#(dW=Y5Rc7i9Y_}yR5hVfC~jCa|n=)imLCPYGG4IYK`+BDuqg_BeA$o1MuqSPhmfDb2mN^VtyTX4*8y&IHn3pQ$`OS)bzpMC%GvHf7lT1 ztAlFohG*O7RfvNEgdicrYSagc!O-rHi)7u|-#!s){cxDa>sr_gVYguSKA6v5xck(3 zETAemPx5Q=fRNXlYlY&Bstkok3=rguVKQ8E3*fNj&o7x++io+*j;}5}ze7gE&sP3{ zmwsR)?lDcl`Hxjle&eOs=bLGNg*pyo*}0fv&3=Qy1D9X)h=8;q7)=(U_KC<fR*uxK$$saK zbO9CE5&NWCOlJJ}G7plnQ_ZQCfZs|6;%Ph&?mT8x0Lwyj&*JbY>?=@7;9JOGoXmIp zwn)k91$^|LkKuDHcD~vsSP;*D{xZe^vSB_M=8I!>5`5Vo_DJ@0R@!&lFH9v*h>0A_ zQg$=YH){fIo15$VQpmYu0(9%!>rZpAlkrxUylE=JddN`fqYKT{-)==3lo`R@F*_*_|M3 zyU{MwEWQXA+gVN9Ipy=5I?$o6>ShTQ>*RgxV`&VLWhE}xT~i^Bc_UP3u5I+N$W@0{ zNj_H$fp6xJm+o`&Q|Bh0Y*goQ<6~k}+^+_p=c?gx=C@mL^6#9R`NTWan9GYSX=C3% zcuGn>a&8TJgyS%tBaxrE@D}^{;iX85u`E&r{&PCI42ZdCNm0?jX(-inI&vSlw(QMi zpG1jH6#(5Kzq-dQHwicD=Roir24B(K?jU|VHti{f&jLj#siZwW& zO`^VJ)*ASc!}6P^LK%e!_!SV9YcnKZalRU%Zz48!4OCO8pWHT!JeHyy+`$vID8XOa z30}R*gXs}cp&>*%-Yb|DqCdo#wtRroIfE0vOuuNQhg$4lMViQ_616rKiIb*=bIqf^ zwsDdPYR4hel{opx!~OZOQ-8n;I!bP z1L#7HA_|z}lwg})L#5j+5ilH6@0QHfhNGCv>q#f<-#^jbf-{I)oq)kI` z-6hoZPll3VbPtEUkTWZ1*^)#$LXO4AseO$Gnmg{}+tX@yi19*rE{}QT9TRTa)1|$V z+3FF6KBWivrtG#odL>OIXz->?j9b^?*gWeND|>VQ`1l&0bY`IMPmFV4mmkk>Q#l6l zvJSuo4w7d=l1%)Oc=vE7>RbgB=EiGY-=5F;NPlQ4 zuXn*{pHl^I<*4iGX7tS=1>t$W(n$!==(5*5kMJkPi*MGU4i&FxjbG;#IZ;{|n1g+a z&)eYfE>DYLf_|ZU@A#w2!f>C@s^3S^;RqHPS-BfeHh`$ zP@mK+N=0GObi?XadYgHY;KylccB%|LZy%X>x)Q0ETm-MycX&u<#qD)HW4D?RB{A?! zj{oNT`!~k#zrq^2Sux4F8QWQ#-V)@9$p162At$iO%^gheC)SXOgBQdOz%aNuIYCU^tep2k z8*<*UCxChQC)$wnu1bOH{~6lwuCV|7=LP^P+`wKq|Gdr#fDgcT9{}RU2>>m?TwEY9 zu;T@o`);(y0lxFc0LmD|{sW=H1;A0jz`iP+0Nw-)z8kxPxd3D%7aNF^oBhWxz}BLTp7 zz<)99T{W=%@cRGw1t9c?yY@!{pzQ}k-6epkVf(>BKN0|KKimsH5&&)BUlai3vw?q6 z0Fcl2!-D*A8vuI(_8|f&_zl>@c~9r?{|2xJ=YuyqWuzCPdl; zZM$CIX$Q%^+@^Of3LXxa8u``q1dT?gcqmNc*e#tWI6JTGV+p^{i1Pmwwe2BwV$1gl zC!Y8bcA-?Sn<%*v$07MrKiUhTGQ8R#d#WRi0!Y-sgJdAxm1B)|noB-&B^EN~nRUp~@lJS- zLG#g{6vaK=fWXdOe_y6TFz&}nNicvie*8A!0`U3*3(&gU+P{sl(3(}rL33sdGfDUu z@Y?iiA3o}Oj~T`FgEcA)%v4?(`~;Y>9Nc~{M9Dp?vE<@2I7OVsk;)T7QFtMW^0!D0 z(=h&&@j4ck1yx*4owkOxU^~{2sqgtKN@a&PXJsGYUrv8#e4+cih4Peiy0*iBqbz?t z(aV}8gL1Lf0N;|7DKnHc?@Hrl(U;>AniD&Rg=r=)!;A@k}9jl;`v0V8UJ+bp%M7jVhMQFUxlc^#!OF^>!fL+~} zKKLIDOul1%-~?$%?(f@2HS)mQ$8ko}+PoqvRxXkP%{^ZX+zPdx*84ZuU0?#R2Jf$^8X z{|^SnUy}EC1A`k-7QpBKR-xZ1KaM|ZyC3rUPM!l&|A)N%A=`oTAKK}6(f&6_)XxR~ z0N^YuH#^WA)^={@E}*++aWj`NH+3{K2iATtcd&G`0&%hbE;QP85PdXenuRxg&pxF! z*DmnOpPExA4q((KV2GK-VXAVOBN8OYu<{!tA_nz>rE-W&BG}07OEEc*SWU7t($CjbBYc1g{R}0r;fNFn-RGa%zW~C8F86-4ASG({C5b5vc)CzW#HX* zQ}~95eTM^_vt-Kn)ejD(?cRNuu6$Evn|VV?7LQl(#`%eX(4F*9;45E;4FVQC$mRJS*Sr=^;k<&*u21=qoHw`pT#E1 z>QhE)%N2Bmz|GSs!m)`lPa03-<;A#~qrhIlB?Yp@eT{DM%$FcuaUzMXQ58bV=k%0h70~CtVuN#p zr$G%$jAPYr;#^3`DAP0J_2C{0R=7@y$Bru)Kd7{4v-f{h{pck8|F* z90lFW6r^gL_Bit2rVG^f<1Q&vs%05pwI@XSz&-xl9)7K{86O8NCiL>%23hP3k9Ugi zK0#|X4uVhgr#%dwOsYl5sp=}(HtdVVXk|DM@@r74mWhMOZa$*wJ{4U#DPMd?43r6L z(#{Kookp!=VI-d0r%*@MM z8ZG6CmD@1w^nIVVEU+r2#Gt^Gk{b6y3~!~jCze;v*XStZu!b(&UHww)C?CLB@V#oP zbtzqF3Tp>9u}3l0xBF<8Wsc<)rQm{N)4;g>d4)4?Aw?n4lw`|tVSgg zl0Rg##iekkvOQHU66yy}DOgf_pc)EZWe5!~+ErzVcC>BDzl#`R$g0StWDV$}fZ?h7 zQhDJbc@}|*m1D-X2}wUKg1m%Y(H12%G}LnboyL>*nbeT-q^H4&PLGO8juubEBeTqmQ>PN)%u*puo=bLq4j(wwmntp(&&l{G;a?}D<|vku4cWu#)L^j=ahV$x z3)8&w-=P%`{Gw47gkcvaaR?SEQu0~U9}PXn2kR8) zSjSFHFG!y&KU^;gdA#;~(hXShje7bQo=H<}kL{lscgjoDi8Mi;(esw9c%It&}RVBD_IqSTiy+wSR9Bj1_kdW zv}$#swPDI+cBIM}b?R_Y*1y=4XsIw7HsU}2GICVfg?S10#-1fxG&YR?BFeC0Qa(1P zd~(Z^7Vm+?K#L)E7%c`8tRgX%h?+v0knB0`qd|(+KKI?GHX>3g4^Et_1rDAY=>1<-sH?N%Z-ReSdOyHG{8yVC8Y3#b= zsc!#%-KgwMLPm%}XAdJXv!!IEI>wQ`S4i2E%!(8tGb0I!WG0bOMrNq&nNa3)9lvq& zJ@@l^9)F$J+vnP!Yn{*gyf1ccLYYHH%(aeZ!UQxNaf0PoKz9n<;nNYP1m_1E{oWF^ z_a6jJzIn~ocaA2BiOR8E0N%Mz#37BFK9)(4rR>a^0ry_UwD*sVI<<fyQ7&3^0xL5uJW-ZS4(%)#p`v z4SqLw=2F95^6;PJ)t=T7o$9sPANb51PD@Ouo%yR)I{Q+kFY_5q)gA|3yOe3KDdlqm zTVj7@2-j5ZJK`^Y)=lI!%V4-bFJ%meMdJGl9JOjVdQOpOYPW!4&o$E8=FgVC+%{k`qjpDy=$J?tu`est=J_S;RK==YrEwZ+s^B0 z51#hBVtd0m4eM$3tr6uLKuj!d-!4l%7<<-G_W<+b=>4K6TB@me7g)LQlOj`feC$JM z^Rwg9zrU?d`b@-Wf1dRXj81Fv=SVwEe~jX!ny^3heQ((bKch=*#rJ!w=F9;Ie3jJoxT2`Jb=!EL!W6v>^sDGj& zbd$~Y?0vda>(^dPULW~U2Z#JeK1GZ0{YZ6G6pKKdmaZQ3UL(s%WG z^$H$hv=j9zYb{%wO;hAE4AQJP_QHB4E#g)W>pag;Uvb`4@ci<&b#Bv-SL?|wEflw^ zlX;Vm&~GL&Z#EoW%C6TrN4NYli zTz7fHU}obU*PU=;we-cca^6l#eKYdz1d_` z@N$-Qp`)av;YwqdNvXJm`0u=e9IBt3oW4%i4sKhx*Np`<%)XZvu3!o-$qp>C(1U%b zQWEos6)tKxmp^P*Vi$NqCr@E!gjn&t1A}xQ$YZ}TnfCKXgWGmOCr^4T4R1-ka}BXh zqxg#G*7wzCb7J_fdY#Cxa+@&~J-^1Z61!KNCZjkl53tB>E;C-U^H%oO`&2W~q^$fW z%l2r$b2BPl8(;9u*iJ+w_GYr|-IvNu8Y~gM`Q6#7PrIY-yL07H@LR`EoH?NQs__Y> z+mCn4lSSdB^|Wh8PGufEW}}JjP~go;cUR!;Oq{Bn7Mv2CPMb>m!D6h?cq_AKDb3q+ zUSH+9@M6Vu(%s{<+!rg$Ha7U?P0A-W`xM75o7;`lruvM$Y#u*He##mso2_Q8lT}k2 z_b<9F(!;^FJ@@fdu6MFp!EDsH<{8&_S9LZHJA207tKkV3Bfev65Jwgd+9{-C#u35B zckEg0h5POGD(s41i@)g2nGi^j*Q%crByvWK2IO)VDVBYsTJ=f9X0q-)?Ue1_2!6B7t&bg*)8s{>W zmdpJK=W5QeBvGaICv)?VsGLYx)gmvUkKT;oV=LSHjr*P9z03DZvwEmo#kYR=kIPB- z$gNLO$$k08*zD)6)l)-NJmza?u&i{+;_KbfhK7{9fzH}1T)mxAN!!bX=VA`Vov&cD zH*{%J_3O`ZwcOma^xW26I(2?=<8;^yOsan&H8DL}f_Spnu;o=9ZD%#*tuf=Hagp{< zOo%@=22l zn;L=?H77RRYRzgBr0aPgR>$^2!Wdf%3P z?^rGk(5ucjIt9;uYitI@~7rzQ@y zE;X)KvxnaD(abxT_J*!~>v@LMqnlaG`-9+~v;oQwD zdx)8cR5~tt$TPQ8O9uR>S2{Z%oba4a@oyYp z{hDL9{jJtsj5SNVu&P4BZ!~^wWn@*j{Mg%tx;oyCI5hX$Vy}xGgBsh{YTtpNIEPq_m2t%^5LB)ivsYt4r0m8!8`1UiJI>&QM1Qp>k|5jHrOX0)zfTX zIU*038Ou4faVppil!g0~E5(g(vy8KK(u3&SM74$K_ZrE}UHoM%X3)o2@Bz4u)gCZjxAny`N$DvKqsJa zttd?T65PSj%=T(h`jkjiuWfj3-MRQ02Uz{rUlO6mg8g%p&)uEYQ8i#tC8V-FcFAe} zq0niXswNbEVBl6XPpqOCkxI#vj!Cl>6Ym4l|Xi z-RDmRZR@_O#V;@t`3XV+brqK0^Xr%Emw7vHs;|&dA78HFwo?%Z`& zPpLC_e{p<&>iyl*EZ;EV(aa&qmo~@IadrpNsiJHovnU3>S(TnUc(TcW*RDXh>yc>k z*WA39gANUfSF+7w+QV}@=U#MtX+NapD0xl06F#PN%3@$xsgN+wt~c?-@GfzlW0$z ze45zl>EzG(X2Y@0loKwKxL^ReMN>PCU9+d$&sV(U;0hczrrldV0bObEM~>~Cyy$25IQ|q9ZkOAvN2j$ zgaXGH;;xk*l@BPja2j~Ak<(NzC%Sp#*Hkd~&)C+g6_(9eHRIwb{jEPU(&KLT@=V2B zx%=pwQQyY|Tporbob`aw+-tiAvzhsBQ^WT%^_ilU%7)M%noEHX4ivH%a(v;+-lG4Y zk##25bE2&_WFochvTn%gun5-8Vf^w!T*rKKi1E>Uzj5B{4^k|z#Hf!}&P64$EVAX4 ze`?>>;VQKK8d_*i8{rk

p|_-~;2lyYl%Z_cnbkeDYn@TTg4Zg7!75%V&`r+c3}W z689FY`4GBWQuS!0@mE8isjhMqxAWRx>m24Pb}GNWJStA$hP@3e=US?H)^_Jn7fOD6 z<*g>nOsFCjcIPY`OXoIvCY|oXWkuxG zEwZn@3bhz6KNV+jMYRs8-GJ0?bftJaZL&Qv*$?Z9Q}JD*dBL;nDtlLppZ(Re&B?Qk z@!=&dk46MOJGWl>uRo*Fh%AfrDy&cZ zN&hUjy1ei8{b{7EVb6q5bVP`vY%AA~?7vLzy&5uplp5I-24h0}6dpUM8(_X&cG+i{ z+9W`_)%iDjXfeZY;m|1DMjCCa(_tJejviHKEw>>n0m=R7yHh}&GsAZ4 zh$+K%H=W#%_O_A7bYAPQ$}YObA>Sb0Z%#7_zsEWRSH_MljBzYZa8u7*W9Ffca1^SJ zsk5GW-{XX%XK?nCrC7VPV0@hC`@)H;C4KQV6>TcjdJ5#o@%59vI#L9G;f;j4Dg(jZ z(+q`5waq*?Uea71T__AqU2SmcUPo6RX7G_7p*r}>$?HZ`l586xihC=A)kAKaSb>)@ zupqXTr&e$!e+;&IzNjfF^O4YV9?{=0BF6O^C(|?%{?|QOW-2+lTiOhA6G8K?UwWyd z{M$ZwIC^Sbvuli*<*Bj?F0C~&>hD>2PG$Vyw~?)|oh`nl)cKls zc2EgV$bE@XMaH#WMd1ZqUEg-buRorbu$B%hCgEjnHc;?9#1CAd*1EUA%Z)mq`f%hl zLlVyJ`}13MYX`VZQufnh499PlET1ru-an(qC{xdv)bM%b;A-p!n0aJ#$P8b zvPYita9*+xo_b=apZFmccOg@Os;VH3^#gOT3pW1VQKBV}`n&`oBQ(|Rw%5Gu4G%}^ z0dBSj&Y~mF+4?mY>tt_;zB?Xas%sIV@V#i^qG5oO#G>LY8c$cl7Q(rz4;;?#4G03E zR6Jv@30c}!OB^+(Jad(dW3ARiSA2_gNG~R#iyDb<8Fu0ho#b+|b&{%BW;mp+L8zI8 z&E6jltIf=)mY~u65#2aKWGKhqHgq`tT{E%Tg`*~(I{G645t>&>_(XXBJ-UV<80yAg ztwy|04D3`t>&+Nj6f+YbgdC_B=%8Z7QP#6@OaxIf+%Ul{S;@;BPv%k zy82tRnTnZ@>HI!6rZm{=crJPhL5kV*dlIv#$?ZkK?UYmNR+kU^Z7_sE5%775C{yQ z&5&{;K@tcgS`vrE;{b8xyql%{ML;}2NW!o%BpgJV{#N)#qH&TWD`567iq07aD?3XN zbt18D{wBPjUB4Z zc;4N~$h1uzX>5PQ zj#~Z_Tlvgowx}W#rqnMSm0u{PSN7W>JSc4G;BOXYv8})MaknpMjivl?XXyeD0rxFU ze2#oU)#hU#A81`EMZH1CX>S%8FJ- zS^Iq?54&b*+_04E{)_Jj`js*v`f%9P*FPZ_#xHNVF%%a^^EO&v5@1*2(qmzr4X4z* zFK8JrCW_PvV^Bit6)7JqyByW3lP;}!o3Ya}uHl1KySG8iPyzt!(a0_PYs8t`F={Qt#BI=iGleusZyfS-dU3Gwd6 zz-I(0%DNkaV^9bZ+iMSoMIlM@zPmB-89~xI-i^VrcpL^qjQ3zTJc1Ox-Gkxrc#^pK zZVUmKK_orl-5B_cgysh@5~pmB9iSV*pzQ@_7!rwy^!IlkAi$%=dodUc=>9{>1^J<& z{Q?85DlDY`fE|t$>fc=k0uF`(QZ5XR1xx2%JHU$C(Oll07KT8;$m@ax8d`hPf>DE$ z6s32k1^Hpf%0=M8kdWEoN&K+gX<5i$ak|mwWB-Fp_vX1VfP34+~gI&^m+HSD^b0 z9EaP{nctHi4s;c?3^0-;!Tr5?C>xI7TR7s@JVQX zc-YS4A&|5<61!nZ3e=$;HV z8L~A8jz_})=Nr-v^v?S)d)tOalO79zU|15H7=nQ-1Qf&UsPyl(!vLitGCQ!*kYQ-( zIR_3-8|32)T%0UF?9TH7d&|WFCx?~+)^V~rWAS8j0god;U*U1&djK9(g>2mLC_vJN z^cBbuVh47-9Uk`XIs*&=-H!l" ] }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "denominator: $4a^2b+2a^2c+2ab^2+9abc+4ac^2+4b^2c+2bc^2$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "status: 0" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "From weighted AM-GM inequality:" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$18a^2b \\le 10a^3+6ab^2+2b^3$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$18ac^2 \\le 2a^3+6a^2c+10c^3$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$18b^2c \\le 10b^3+6bc^2+2c^3$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$ 0 \\le 0 $$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "The sum of all inequalities gives us a proof of the inequality." - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 3, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "formula=cyclize('(a+b)/(2*b+c)')-2\n", - "prove(formula*6)" + "Latex(r'__________________________')" ] }, { @@ -165,7 +59,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to s-s/(a+1)$" + "Substitute $a\\to s-\\frac{s}{d+1}$" ], "text/plain": [ "" @@ -177,7 +71,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to s-s/(b+1)$" + "Substitute $b\\to s-\\frac{s}{e+1}$" ], "text/plain": [ "" @@ -189,7 +83,7 @@ { "data": { "text/latex": [ - "Substitute $c\\to s-s/(c+1)$" + "Substitute $c\\to s-\\frac{s}{f+1}$" ], "text/plain": [ "" @@ -201,7 +95,7 @@ { "data": { "text/latex": [ - "numerator: $abcs^2+s^2$" + "numerator: $defs^2+s^2$" ], "text/plain": [ "" @@ -213,7 +107,7 @@ { "data": { "text/latex": [ - "denominator: $abc+ab+ac+a+bc+b+c+1$" + "denominator: $def+de+df+d+ef+e+f+1$" ], "text/plain": [ "" @@ -237,7 +131,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le abcs^2+s^2 $$" + "$$ 0 \\le defs^2+s^2 $$" ], "text/plain": [ "" @@ -317,7 +211,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+y$" + "Substitute $x\\to g+y$" ], "text/plain": [ "" @@ -329,7 +223,7 @@ { "data": { "text/latex": [ - "$$x^{2}$$" + "$$g^{2}$$" ], "text/plain": [ "" @@ -372,7 +266,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $y\\to h+x$" ], "text/plain": [ "" @@ -384,7 +278,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} z^{t} - x x^{t} y + x y z^{t} + x y \\left(x + y\\right)^{t} - 2 x z z^{t} + x^{t} y z + y^{2} \\left(x + y\\right)^{t} - y z z^{t} - y z \\left(x + y\\right)^{t} + z^{2} z^{t}$$" + "4 $$h^{2} \\left(h + x\\right)^{t} - h x x^{t} + h x z^{t} + h x \\left(h + x\\right)^{t} + h x^{t} z - h z z^{t} - h z \\left(h + x\\right)^{t} + x^{2} z^{t} - 2 x z z^{t} + z^{2} z^{t}$$" ], "text/plain": [ "" @@ -396,7 +290,7 @@ { "data": { "text/latex": [ - "Substitute $z\\to x+z$" + "Substitute $z\\to i+x$" ], "text/plain": [ "" @@ -408,7 +302,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} y^{t} - x x^{t} z - 2 x y y^{t} + x y^{t} z + x z \\left(x + z\\right)^{t} + x^{t} y z + y^{2} y^{t} - y y^{t} z - y z \\left(x + z\\right)^{t} + z^{2} \\left(x + z\\right)^{t}$$" + "4 $$i^{2} \\left(i + x\\right)^{t} - i x x^{t} + i x y^{t} + i x \\left(i + x\\right)^{t} + i x^{t} y - i y y^{t} - i y \\left(i + x\\right)^{t} + x^{2} y^{t} - 2 x y y^{t} + y^{2} y^{t}$$" ], "text/plain": [ "" @@ -420,7 +314,7 @@ { "data": { "text/latex": [ - "Substitute $z\\to y+z$" + "Substitute $z\\to j+y$" ], "text/plain": [ "" @@ -432,7 +326,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} x^{t} - 2 x x^{t} y - x x^{t} z + x y^{t} z - x z \\left(y + z\\right)^{t} + x^{t} y^{2} + x^{t} y z - y y^{t} z + y z \\left(y + z\\right)^{t} + z^{2} \\left(y + z\\right)^{t}$$" + "4 $$j^{2} \\left(j + y\\right)^{t} - j x x^{t} + j x y^{t} - j x \\left(j + y\\right)^{t} + j x^{t} y - j y y^{t} + j y \\left(j + y\\right)^{t} + x^{2} x^{t} - 2 x x^{t} y + x^{t} y^{2}$$" ], "text/plain": [ "" @@ -444,7 +338,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $y\\to k+x$" ], "text/plain": [ "" @@ -456,7 +350,7 @@ { "data": { "text/latex": [ - "Substitute $z\\to x+z$" + "Substitute $z\\to l+x$" ], "text/plain": [ "" @@ -468,7 +362,7 @@ { "data": { "text/latex": [ - "4 $$x^{t} y z + y^{2} \\left(x + y\\right)^{t} - y z \\left(x + y\\right)^{t} - y z \\left(x + z\\right)^{t} + z^{2} \\left(x + z\\right)^{t}$$" + "4 $$k^{2} \\left(k + x\\right)^{t} + k l x^{t} - k l \\left(k + x\\right)^{t} - k l \\left(l + x\\right)^{t} + l^{2} \\left(l + x\\right)^{t}$$" ], "text/plain": [ "" @@ -480,7 +374,7 @@ { "data": { "text/latex": [ - "Substitute $z\\to y+z$" + "Substitute $l\\to k+m$" ], "text/plain": [ "" @@ -492,7 +386,7 @@ { "data": { "text/latex": [ - "3 $$x^{t} y^{2} + x^{t} y z - y z \\left(x + y\\right)^{t} + y z \\left(x + y + z\\right)^{t} + z^{2} \\left(x + y + z\\right)^{t}$$" + "3 $$k^{2} x^{t} + k m x^{t} - k m \\left(k + x\\right)^{t} + k m \\left(k + m + x\\right)^{t} + m^{2} \\left(k + m + x\\right)^{t}$$" ], "text/plain": [ "" @@ -504,7 +398,7 @@ { "data": { "text/latex": [ - "Substitute $z\\to x+z$" + "Substitute $z\\to n+x$" ], "text/plain": [ "" @@ -516,7 +410,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $y\\to o+x$" ], "text/plain": [ "" @@ -528,7 +422,7 @@ { "data": { "text/latex": [ - "4 $$x^{t} y z + y^{2} \\left(x + y\\right)^{t} - y z \\left(x + y\\right)^{t} - y z \\left(x + z\\right)^{t} + z^{2} \\left(x + z\\right)^{t}$$" + "4 $$n^{2} \\left(n + x\\right)^{t} + n o x^{t} - n o \\left(n + x\\right)^{t} - n o \\left(o + x\\right)^{t} + o^{2} \\left(o + x\\right)^{t}$$" ], "text/plain": [ "" @@ -540,7 +434,7 @@ { "data": { "text/latex": [ - "Substitute $z\\to y+z$" + "Substitute $o\\to n+p$" ], "text/plain": [ "" @@ -552,7 +446,7 @@ { "data": { "text/latex": [ - "3 $$x^{t} y^{2} + x^{t} y z - y z \\left(x + y\\right)^{t} + y z \\left(x + y + z\\right)^{t} + z^{2} \\left(x + y + z\\right)^{t}$$" + "3 $$n^{2} x^{t} + n p x^{t} - n p \\left(n + x\\right)^{t} + n p \\left(n + p + x\\right)^{t} + p^{2} \\left(n + p + x\\right)^{t}$$" ], "text/plain": [ "" @@ -574,7 +468,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+y$" + "Substitute $x\\to q+y$" ], "text/plain": [ "" @@ -586,10 +480,10 @@ { "data": { "text/latex": [ - "$\\displaystyle x^{2} \\left(x + y\\right)^{t} - x y y^{t} + x y z^{t} + x y \\left(x + y\\right)^{t} + x y^{t} z - x z z^{t} - x z \\left(x + y\\right)^{t} + y^{2} z^{t} - 2 y z z^{t} + z^{2} z^{t}$" + "$\\displaystyle q^{2} \\left(q + y\\right)^{t} - q y y^{t} + q y z^{t} + q y \\left(q + y\\right)^{t} + q y^{t} z - q z z^{t} - q z \\left(q + y\\right)^{t} + y^{2} z^{t} - 2 y z z^{t} + z^{2} z^{t}$" ], "text/plain": [ - "x**2*(x + y)**t - x*y*y**t + x*y*z**t + x*y*(x + y)**t + x*y**t*z - x*z*z**t - x*z*(x + y)**t + y**2*z**t - 2*y*z*z**t + z**2*z**t" + "q**2*(q + y)**t - q*y*y**t + q*y*z**t + q*y*(q + y)**t + q*y**t*z - q*z*z**t - q*z*(q + y)**t + y**2*z**t - 2*y*z*z**t + z**2*z**t" ] }, "execution_count": 10, @@ -609,7 +503,7 @@ { "data": { "text/latex": [ - "Substitute $x\\to x+y$" + "Substitute $x\\to r+y$" ], "text/plain": [ "" @@ -621,10 +515,10 @@ { "data": { "text/latex": [ - "$\\displaystyle x^{2} \\left(x + y\\right)^{t} - x y y^{t} + x y z^{t} + x y \\left(x + y\\right)^{t} + x y^{t} z - x z z^{t} - x z \\left(x + y\\right)^{t} + y^{2} z^{t} - 2 y z z^{t} + z^{2} z^{t}$" + "$\\displaystyle r^{2} \\left(r + y\\right)^{t} - r y y^{t} + r y z^{t} + r y \\left(r + y\\right)^{t} + r y^{t} z - r z z^{t} - r z \\left(r + y\\right)^{t} + y^{2} z^{t} - 2 y z z^{t} + z^{2} z^{t}$" ], "text/plain": [ - "x**2*(x + y)**t - x*y*y**t + x*y*z**t + x*y*(x + y)**t + x*y**t*z - x*z*z**t - x*z*(x + y)**t + y**2*z**t - 2*y*z*z**t + z**2*z**t" + "r**2*(r + y)**t - r*y*y**t + r*y*z**t + r*y*(r + y)**t + r*y**t*z - r*z*z**t - r*z*(r + y)**t + y**2*z**t - 2*y*z*z**t + z**2*z**t" ] }, "execution_count": 11, @@ -644,7 +538,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $y\\to u+x$" ], "text/plain": [ "" @@ -656,7 +550,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} z^{t} - x x^{t} y + x y z^{t} + x y \\left(x + y\\right)^{t} - 2 x z z^{t} + x^{t} y z + y^{2} \\left(x + y\\right)^{t} - y z z^{t} - y z \\left(x + y\\right)^{t} + z^{2} z^{t}$$" + "4 $$u^{2} \\left(u + x\\right)^{t} - u x x^{t} + u x z^{t} + u x \\left(u + x\\right)^{t} + u x^{t} z - u z z^{t} - u z \\left(u + x\\right)^{t} + x^{2} z^{t} - 2 x z z^{t} + z^{2} z^{t}$$" ], "text/plain": [ "" @@ -668,7 +562,7 @@ { "data": { "text/latex": [ - "Substitute $z\\to x+z$" + "Substitute $z\\to v+x$" ], "text/plain": [ "" @@ -680,7 +574,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} y^{t} - x x^{t} z - 2 x y y^{t} + x y^{t} z + x z \\left(x + z\\right)^{t} + x^{t} y z + y^{2} y^{t} - y y^{t} z - y z \\left(x + z\\right)^{t} + z^{2} \\left(x + z\\right)^{t}$$" + "4 $$v^{2} \\left(v + x\\right)^{t} - v x x^{t} + v x y^{t} + v x \\left(v + x\\right)^{t} + v x^{t} y - v y y^{t} - v y \\left(v + x\\right)^{t} + x^{2} y^{t} - 2 x y y^{t} + y^{2} y^{t}$$" ], "text/plain": [ "" @@ -692,7 +586,7 @@ { "data": { "text/latex": [ - "Substitute $z\\to y+z$" + "Substitute $z\\to w+y$" ], "text/plain": [ "" @@ -704,7 +598,7 @@ { "data": { "text/latex": [ - "4 $$x^{2} x^{t} - 2 x x^{t} y - x x^{t} z + x y^{t} z - x z \\left(y + z\\right)^{t} + x^{t} y^{2} + x^{t} y z - y y^{t} z + y z \\left(y + z\\right)^{t} + z^{2} \\left(y + z\\right)^{t}$$" + "4 $$w^{2} \\left(w + y\\right)^{t} - w x x^{t} + w x y^{t} - w x \\left(w + y\\right)^{t} + w x^{t} y - w y y^{t} + w y \\left(w + y\\right)^{t} + x^{2} x^{t} - 2 x x^{t} y + x^{t} y^{2}$$" ], "text/plain": [ "" @@ -716,7 +610,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $y\\to a_{1}+x$" ], "text/plain": [ "" @@ -728,7 +622,7 @@ { "data": { "text/latex": [ - "Substitute $z\\to x+z$" + "Substitute $z\\to b_{1}+x$" ], "text/plain": [ "" @@ -740,7 +634,7 @@ { "data": { "text/latex": [ - "4 $$x^{t} y z + y^{2} \\left(x + y\\right)^{t} - y z \\left(x + y\\right)^{t} - y z \\left(x + z\\right)^{t} + z^{2} \\left(x + z\\right)^{t}$$" + "4 $$a_{1}^{2} \\left(a_{1} + x\\right)^{t} + a_{1} b_{1} x^{t} - a_{1} b_{1} \\left(a_{1} + x\\right)^{t} - a_{1} b_{1} \\left(b_{1} + x\\right)^{t} + b_{1}^{2} \\left(b_{1} + x\\right)^{t}$$" ], "text/plain": [ "" @@ -752,7 +646,7 @@ { "data": { "text/latex": [ - "Substitute $z\\to y+z$" + "Substitute $b_{1}\\to a_{1}+c_{1}$" ], "text/plain": [ "" @@ -764,7 +658,7 @@ { "data": { "text/latex": [ - "3 $$x^{t} y^{2} + x^{t} y z - y z \\left(x + y\\right)^{t} + y z \\left(x + y + z\\right)^{t} + z^{2} \\left(x + y + z\\right)^{t}$$" + "3 $$a_{1}^{2} x^{t} + a_{1} c_{1} x^{t} - a_{1} c_{1} \\left(a_{1} + x\\right)^{t} + a_{1} c_{1} \\left(a_{1} + c_{1} + x\\right)^{t} + c_{1}^{2} \\left(a_{1} + c_{1} + x\\right)^{t}$$" ], "text/plain": [ "" @@ -776,7 +670,7 @@ { "data": { "text/latex": [ - "Substitute $z\\to x+z$" + "Substitute $z\\to d_{1}+x$" ], "text/plain": [ "" @@ -788,7 +682,7 @@ { "data": { "text/latex": [ - "Substitute $y\\to x+y$" + "Substitute $y\\to e_{1}+x$" ], "text/plain": [ "" @@ -800,7 +694,7 @@ { "data": { "text/latex": [ - "4 $$x^{t} y z + y^{2} \\left(x + y\\right)^{t} - y z \\left(x + y\\right)^{t} - y z \\left(x + z\\right)^{t} + z^{2} \\left(x + z\\right)^{t}$$" + "4 $$d_{1}^{2} \\left(d_{1} + x\\right)^{t} + d_{1} e_{1} x^{t} - d_{1} e_{1} \\left(d_{1} + x\\right)^{t} - d_{1} e_{1} \\left(e_{1} + x\\right)^{t} + e_{1}^{2} \\left(e_{1} + x\\right)^{t}$$" ], "text/plain": [ "" @@ -812,7 +706,7 @@ { "data": { "text/latex": [ - "Substitute $z\\to y+z$" + "Substitute $e_{1}\\to d_{1}+f_{1}$" ], "text/plain": [ "" @@ -824,7 +718,7 @@ { "data": { "text/latex": [ - "3 $$x^{t} y^{2} + x^{t} y z - y z \\left(x + y\\right)^{t} + y z \\left(x + y + z\\right)^{t} + z^{2} \\left(x + y + z\\right)^{t}$$" + "3 $$d_{1}^{2} x^{t} + d_{1} f_{1} x^{t} - d_{1} f_{1} \\left(d_{1} + x\\right)^{t} + d_{1} f_{1} \\left(d_{1} + f_{1} + x\\right)^{t} + f_{1}^{2} \\left(d_{1} + f_{1} + x\\right)^{t}$$" ], "text/plain": [ "" @@ -953,7 +847,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to 11a/8$" + "Substitute $a\\to 11g_{1}/8$" ], "text/plain": [ "" @@ -965,7 +859,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to 4b/5$" + "Substitute $b\\to 4h_{1}/5$" ], "text/plain": [ "" @@ -977,7 +871,7 @@ { "data": { "text/latex": [ - "Substitute $c\\to 4c/5$" + "Substitute $c\\to 4i_{1}/5$" ], "text/plain": [ "" @@ -989,7 +883,7 @@ { "data": { "text/latex": [ - "Substitute $d\\to 4d/5$" + "Substitute $d\\to 4j_{1}/5$" ], "text/plain": [ "" @@ -1001,7 +895,7 @@ { "data": { "text/latex": [ - "numerator: $3025a^2-1760ab-1760ac-1760ad+1024b^2+1024c^2+1024d^2$" + "numerator: $3025g_{1}^2-1760g_{1}h_{1}-1760g_{1}i_{1}-1760g_{1}j_{1}+1024h_{1}^2+1024i_{1}^2+1024j_{1}^2$" ], "text/plain": [ "" @@ -1049,7 +943,7 @@ { "data": { "text/latex": [ - "$$1760ab \\le 880a^2+880b^2$$" + "$$1760g_{1}h_{1} \\le 880g_{1}^2+880h_{1}^2$$" ], "text/plain": [ "" @@ -1061,7 +955,7 @@ { "data": { "text/latex": [ - "$$1760ac \\le 880a^2+880c^2$$" + "$$1760g_{1}i_{1} \\le 880g_{1}^2+880i_{1}^2$$" ], "text/plain": [ "" @@ -1073,7 +967,7 @@ { "data": { "text/latex": [ - "$$1760ad \\le 880a^2+880d^2$$" + "$$1760g_{1}j_{1} \\le 880g_{1}^2+880j_{1}^2$$" ], "text/plain": [ "" @@ -1085,7 +979,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 385a^2+144b^2+144c^2+144d^2 $$" + "$$ 0 \\le 385g_{1}^2+144h_{1}^2+144i_{1}^2+144j_{1}^2 $$" ], "text/plain": [ "" @@ -1148,76 +1042,29 @@ "outputs": [ { "data": { - "text/latex": [ - "$\\displaystyle - \\frac{2 \\sqrt{2} \\left(a - b\\right)}{c} + \\frac{\\left(a - b\\right)^{2}}{c^{2}} - \\frac{2 \\sqrt{2} \\left(- a + c\\right)}{b} + \\frac{\\left(- a + c\\right)^{2}}{b^{2}} - \\frac{2 \\sqrt{2} \\left(b - c\\right)}{a} + \\frac{\\left(b - c\\right)^{2}}{a^{2}}$" - ], "text/plain": [ - "-2*sqrt(2)*(a - b)/c + (a - b)**2/c**2 - 2*sqrt(2)*(-a + c)/b + (-a + c)**2/b**2 - 2*sqrt(2)*(b - c)/a + (b - c)**2/a**2" + "\"formula=cyclize(Sm('((a-b)/c)^2-8**(1/2)*(a-b)/c'))\\ndisplay(formula)\\nfrom scipy.optimize import fmin\\nimport numpy as np\\ndef f(x):\\n num,den=fraction(cancel(newformula))\\n fs=sorted(newformula.free_symbols,key=str)\\n return float(num.subs(list(zip(fs,x))))\\nnewformula=(makesubs(formula,'[b,oo],[c,oo]'))\\nprint(f([2,1,1]))\\nfmin(f,[2,1,1])\\nprint(fmin(f,np.array([2,1,1])))\\ndisplay(simplify(newformula))\"" ] }, + "execution_count": 20, "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Substitute $a\\to a+b$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Substitute $b\\to b+c$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimization terminated successfully.\n", - " Current function value: 0.000000\n", - " Iterations: 51\n", - " Function evaluations: 97\n", - "[1.17092486 1.170961 1.17093843]\n" - ] - }, - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{a^{4} b^{2} + 2 a^{4} b c + 2 a^{4} c^{2} + 2 a^{3} b^{3} - 2 \\sqrt{2} a^{3} b^{2} c + 6 a^{3} b^{2} c - 2 \\sqrt{2} a^{3} b c^{2} + 10 a^{3} b c^{2} + 4 a^{3} c^{3} + a^{2} b^{4} - 4 \\sqrt{2} a^{2} b^{3} c + 4 a^{2} b^{3} c - 6 \\sqrt{2} a^{2} b^{2} c^{2} + 12 a^{2} b^{2} c^{2} - 2 \\sqrt{2} a^{2} b c^{3} + 10 a^{2} b c^{3} + 2 a^{2} c^{4} - 2 \\sqrt{2} a b^{4} c - 4 \\sqrt{2} a b^{3} c^{2} + 4 a b^{3} c^{2} - 2 \\sqrt{2} a b^{2} c^{3} + 6 a b^{2} c^{3} + 2 a b c^{4} + 2 b^{4} c^{2} + 4 b^{3} c^{3} + 2 b^{2} c^{4}}{c^{2} \\left(a^{2} b^{2} + 2 a^{2} b c + a^{2} c^{2} + 2 a b^{3} + 6 a b^{2} c + 6 a b c^{2} + 2 a c^{3} + b^{4} + 4 b^{3} c + 6 b^{2} c^{2} + 4 b c^{3} + c^{4}\\right)}$" - ], - "text/plain": [ - "(a**4*b**2 + 2*a**4*b*c + 2*a**4*c**2 + 2*a**3*b**3 - 2*sqrt(2)*a**3*b**2*c + 6*a**3*b**2*c - 2*sqrt(2)*a**3*b*c**2 + 10*a**3*b*c**2 + 4*a**3*c**3 + a**2*b**4 - 4*sqrt(2)*a**2*b**3*c + 4*a**2*b**3*c - 6*sqrt(2)*a**2*b**2*c**2 + 12*a**2*b**2*c**2 - 2*sqrt(2)*a**2*b*c**3 + 10*a**2*b*c**3 + 2*a**2*c**4 - 2*sqrt(2)*a*b**4*c - 4*sqrt(2)*a*b**3*c**2 + 4*a*b**3*c**2 - 2*sqrt(2)*a*b**2*c**3 + 6*a*b**2*c**3 + 2*a*b*c**4 + 2*b**4*c**2 + 4*b**3*c**3 + 2*b**2*c**4)/(c**2*(a**2*b**2 + 2*a**2*b*c + a**2*c**2 + 2*a*b**3 + 6*a*b**2*c + 6*a*b*c**2 + 2*a*c**3 + b**4 + 4*b**3*c + 6*b**2*c**2 + 4*b*c**3 + c**4))" - ] - }, - "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ - "formula=cyclize(Sm('((a-b)/c)^2-8**(1/2)*(a-b)/c'))\n", + "\"\"\"formula=cyclize(Sm('((a-b)/c)^2-8**(1/2)*(a-b)/c'))\n", "display(formula)\n", "from scipy.optimize import fmin\n", "import numpy as np\n", "def f(x):\n", - " num,den=fraction(cancel(formula))\n", + " num,den=fraction(cancel(newformula))\n", " fs=sorted(newformula.free_symbols,key=str)\n", - " return num.subs(zip(fs,x))\n", + " return float(num.subs(list(zip(fs,x))))\n", "newformula=(makesubs(formula,'[b,oo],[c,oo]'))\n", + "print(f([2,1,1]))\n", + "fmin(f,[2,1,1])\n", "print(fmin(f,np.array([2,1,1])))\n", - "display(simplify(newformula))\n", + "display(simplify(newformula))\"\"\"\n", "#prove(newformula)\n", "#prove(makesubs(formula,'[b,oo],[a,oo]',variables='c,b,a'))" ] @@ -1332,7 +1179,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to a+b$" + "Substitute $a\\to b+k_{1}$" ], "text/plain": [ "" @@ -1344,7 +1191,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+c$" + "Substitute $b\\to c+l_{1}$" ], "text/plain": [ "" @@ -1394,25 +1241,50 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left( 2, \\ \\frac{31}{3}, \\ \\frac{7}{4}\\right)$" + ], + "text/plain": [ + "(2, 31/3, 7/4)" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "nsimplify((2.1002573656763053, 10.340431462974655, 1.7661001788212371),tolerance=0.3,rational=True)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "1.414211498165453" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "(2.1002573656763053/1.7661001788212371)**2" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -1430,7 +1302,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to a+c$" + "Substitute $a\\to c+r_{1}$" ], "text/plain": [ "" @@ -1442,7 +1314,7 @@ { "data": { "text/latex": [ - "Substitute $c\\to b+c$" + "Substitute $c\\to b+s_{1}$" ], "text/plain": [ "" @@ -1454,7 +1326,7 @@ { "data": { "text/latex": [ - "numerator: $2a^4b^2+2a^4bc+a^4c^2+4a^3b^3+2\\sqrt{2}a^3b^2c+10a^3b^2c+2\\sqrt{2}a^3bc^2+6a^3bc^2+2a^3c^3+2a^2b^4+2\\sqrt{2}a^2b^3c+10a^2b^3c+6\\sqrt{2}a^2b^2c^2+12a^2b^2c^2+4a^2bc^3+4\\sqrt{2}a^2bc^3+a^2c^4+2ab^4c+2\\sqrt{2}ab^3c^2+6ab^3c^2+4ab^2c^3+4\\sqrt{2}ab^2c^3+2\\sqrt{2}abc^4+2b^4c^2+4b^3c^3+2b^2c^4$" + "numerator: $2b^4r_{1}^2+2b^4r_{1}s_{1}+2b^4s_{1}^2+4b^3r_{1}^3+2\\sqrt{2}b^3r_{1}^2s_{1}+10b^3r_{1}^2s_{1}+2\\sqrt{2}b^3r_{1}s_{1}^2+6b^3r_{1}s_{1}^2+4b^3s_{1}^3+2b^2r_{1}^4+2\\sqrt{2}b^2r_{1}^3s_{1}+10b^2r_{1}^3s_{1}+6\\sqrt{2}b^2r_{1}^2s_{1}^2+12b^2r_{1}^2s_{1}^2+4b^2r_{1}s_{1}^3+4\\sqrt{2}b^2r_{1}s_{1}^3+2b^2s_{1}^4+2br_{1}^4s_{1}+2\\sqrt{2}br_{1}^3s_{1}^2+6br_{1}^3s_{1}^2+4br_{1}^2s_{1}^3+4\\sqrt{2}br_{1}^2s_{1}^3+2\\sqrt{2}br_{1}s_{1}^4+r_{1}^4s_{1}^2+2r_{1}^3s_{1}^3+r_{1}^2s_{1}^4$" ], "text/plain": [ "" @@ -1466,7 +1338,7 @@ { "data": { "text/latex": [ - "denominator: $a^2b^4+2a^2b^3c+a^2b^2c^2+2ab^5+6ab^4c+6ab^3c^2+2ab^2c^3+b^6+4b^5c+6b^4c^2+4b^3c^3+b^2c^4$" + "denominator: $b^6+2b^5r_{1}+4b^5s_{1}+b^4r_{1}^2+6b^4r_{1}s_{1}+6b^4s_{1}^2+2b^3r_{1}^2s_{1}+6b^3r_{1}s_{1}^2+4b^3s_{1}^3+b^2r_{1}^2s_{1}^2+2b^2r_{1}s_{1}^3+b^2s_{1}^4$" ], "text/plain": [ "" @@ -1490,7 +1362,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 2a^4b^2+2a^4bc+a^4c^2+4a^3b^3+2\\sqrt{2}a^3b^2c+10a^3b^2c+2\\sqrt{2}a^3bc^2+6a^3bc^2+2a^3c^3+2a^2b^4+2\\sqrt{2}a^2b^3c+10a^2b^3c+6\\sqrt{2}a^2b^2c^2+12a^2b^2c^2+4\\sqrt{2}a^2bc^3+4a^2bc^3+a^2c^4+2ab^4c+2\\sqrt{2}ab^3c^2+6ab^3c^2+4\\sqrt{2}ab^2c^3+4ab^2c^3+2\\sqrt{2}abc^4+2b^4c^2+4b^3c^3+2b^2c^4 $$" + "$$ 0 \\le r_{1}^4s_{1}^2+2br_{1}^4s_{1}+2b^2r_{1}^4+2r_{1}^3s_{1}^3+2\\sqrt{2}br_{1}^3s_{1}^2+6br_{1}^3s_{1}^2+2\\sqrt{2}b^2r_{1}^3s_{1}+10b^2r_{1}^3s_{1}+4b^3r_{1}^3+r_{1}^2s_{1}^4+4\\sqrt{2}br_{1}^2s_{1}^3+4br_{1}^2s_{1}^3+6\\sqrt{2}b^2r_{1}^2s_{1}^2+12b^2r_{1}^2s_{1}^2+2\\sqrt{2}b^3r_{1}^2s_{1}+10b^3r_{1}^2s_{1}+2b^4r_{1}^2+2\\sqrt{2}br_{1}s_{1}^4+4\\sqrt{2}b^2r_{1}s_{1}^3+4b^2r_{1}s_{1}^3+2\\sqrt{2}b^3r_{1}s_{1}^2+6b^3r_{1}s_{1}^2+2b^4r_{1}s_{1}+2b^2s_{1}^4+4b^3s_{1}^3+2b^4s_{1}^2 $$" ], "text/plain": [ "" @@ -1526,7 +1398,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to a+b$" + "Substitute $a\\to b+t_{1}$" ], "text/plain": [ "" @@ -1538,7 +1410,7 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+c$" + "Substitute $b\\to c+u_{1}$" ], "text/plain": [ "" @@ -1550,7 +1422,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to \\sqrt{2}a$" + "Substitute $t_{1}\\to \\sqrt{2}v_{1}$" ], "text/plain": [ "" @@ -1562,7 +1434,7 @@ { "data": { "text/latex": [ - "numerator: $16a^4b^2+32a^4bc+32a^4c^2+16\\sqrt{2}a^3b^3-32a^3b^2c+48\\sqrt{2}a^3b^2c-32a^3bc^2+80\\sqrt{2}a^3bc^2+32\\sqrt{2}a^3c^3+8a^2b^4-32\\sqrt{2}a^2b^3c+32a^2b^3c-48\\sqrt{2}a^2b^2c^2+96a^2b^2c^2-16\\sqrt{2}a^2bc^3+80a^2bc^3+16a^2c^4-16ab^4c-32ab^3c^2+16\\sqrt{2}ab^3c^2-16ab^2c^3+24\\sqrt{2}ab^2c^3+8\\sqrt{2}abc^4+8b^4c^2+16b^3c^3+8b^2c^4$" + "numerator: $8c^4u_{1}^2+8\\sqrt{2}c^4u_{1}v_{1}+16c^4v_{1}^2+16c^3u_{1}^3-16c^3u_{1}^2v_{1}+24\\sqrt{2}c^3u_{1}^2v_{1}-16\\sqrt{2}c^3u_{1}v_{1}^2+80c^3u_{1}v_{1}^2+32\\sqrt{2}c^3v_{1}^3+8c^2u_{1}^4-32c^2u_{1}^3v_{1}+16\\sqrt{2}c^2u_{1}^3v_{1}-48\\sqrt{2}c^2u_{1}^2v_{1}^2+96c^2u_{1}^2v_{1}^2-32c^2u_{1}v_{1}^3+80\\sqrt{2}c^2u_{1}v_{1}^3+32c^2v_{1}^4-16cu_{1}^4v_{1}-32\\sqrt{2}cu_{1}^3v_{1}^2+32cu_{1}^3v_{1}^2-32cu_{1}^2v_{1}^3+48\\sqrt{2}cu_{1}^2v_{1}^3+32cu_{1}v_{1}^4+8u_{1}^4v_{1}^2+16\\sqrt{2}u_{1}^3v_{1}^3+16u_{1}^2v_{1}^4$" ], "text/plain": [ "" @@ -1574,7 +1446,7 @@ { "data": { "text/latex": [ - "denominator: $2a^2b^2c^2+4a^2bc^3+2a^2c^4+2\\sqrt{2}ab^3c^2+6\\sqrt{2}ab^2c^3+6\\sqrt{2}abc^4+2\\sqrt{2}ac^5+b^4c^2+4b^3c^3+6b^2c^4+4bc^5+c^6$" + "denominator: $c^6+4c^5u_{1}+2\\sqrt{2}c^5v_{1}+6c^4u_{1}^2+6\\sqrt{2}c^4u_{1}v_{1}+2c^4v_{1}^2+4c^3u_{1}^3+6\\sqrt{2}c^3u_{1}^2v_{1}+4c^3u_{1}v_{1}^2+c^2u_{1}^4+2\\sqrt{2}c^2u_{1}^3v_{1}+2c^2u_{1}^2v_{1}^2$" ], "text/plain": [ "" @@ -1610,7 +1482,7 @@ { "data": { "text/latex": [ - "$$32a^3b^2c \\le 16a^4b^2+16a^2b^2c^2$$" + "$$16cu_{1}^4v_{1} \\le 8u_{1}^4v_{1}^2+8c^2u_{1}^4$$" ], "text/plain": [ "" @@ -1622,7 +1494,7 @@ { "data": { "text/latex": [ - "$$32\\sqrt{2}a^2b^3c \\le 16\\sqrt{2}a^3b^3+16\\sqrt{2}ab^3c^2$$" + "$$32\\sqrt{2}cu_{1}^3v_{1}^2 \\le 16\\sqrt{2}u_{1}^3v_{1}^3+16\\sqrt{2}c^2u_{1}^3v_{1}$$" ], "text/plain": [ "" @@ -1634,7 +1506,7 @@ { "data": { "text/latex": [ - "$$48\\sqrt{2}a^2b^2c^2 \\le 24\\sqrt{2}a^3b^2c+24\\sqrt{2}ab^2c^3$$" + "$$32c^2u_{1}^3v_{1} \\le 16cu_{1}^3v_{1}^2+16c^3u_{1}^3$$" ], "text/plain": [ "" @@ -1646,7 +1518,7 @@ { "data": { "text/latex": [ - "$$16\\sqrt{2}a^2bc^3 \\le 8\\sqrt{2}a^3bc^2+8\\sqrt{2}abc^4$$" + "$$32cu_{1}^2v_{1}^3 \\le 16cu_{1}^3v_{1}^2+16cu_{1}v_{1}^4$$" ], "text/plain": [ "" @@ -1658,7 +1530,7 @@ { "data": { "text/latex": [ - "$$16ab^4c \\le 8a^2b^4+8b^4c^2$$" + "$$48\\sqrt{2}c^2u_{1}^2v_{1}^2 \\le 24\\sqrt{2}cu_{1}^2v_{1}^3+24\\sqrt{2}c^3u_{1}^2v_{1}$$" ], "text/plain": [ "" @@ -1670,7 +1542,7 @@ { "data": { "text/latex": [ - "$$32ab^3c^2 \\le 16a^2b^3c+16b^3c^3$$" + "$$16c^3u_{1}^2v_{1} \\le 8c^2u_{1}^2v_{1}^2+8c^4u_{1}^2$$" ], "text/plain": [ "" @@ -1682,7 +1554,7 @@ { "data": { "text/latex": [ - "$$32a^3bc^2 \\le 16a^4bc+16a^2bc^3$$" + "$$32c^2u_{1}v_{1}^3 \\le 16u_{1}^2v_{1}^4+16c^4v_{1}^2$$" ], "text/plain": [ "" @@ -1694,7 +1566,7 @@ { "data": { "text/latex": [ - "$$16ab^2c^3 \\le 8a^2b^2c^2+8b^2c^4$$" + "$$16\\sqrt{2}c^3u_{1}v_{1}^2 \\le 8\\sqrt{2}c^2u_{1}v_{1}^3+8\\sqrt{2}c^4u_{1}v_{1}$$" ], "text/plain": [ "" @@ -1706,7 +1578,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le 16a^4bc+32a^4c^2+24\\sqrt{2}a^3b^2c+72\\sqrt{2}a^3bc^2+32\\sqrt{2}a^3c^3+16a^2b^3c+72a^2b^2c^2+64a^2bc^3+16a^2c^4 $$" + "$$ 0 \\le 24\\sqrt{2}cu_{1}^2v_{1}^3+88c^2u_{1}^2v_{1}^2+16cu_{1}v_{1}^4+72\\sqrt{2}c^2u_{1}v_{1}^3+80c^3u_{1}v_{1}^2+32c^2v_{1}^4+32\\sqrt{2}c^3v_{1}^3 $$" ], "text/plain": [ "" @@ -1736,7 +1608,7 @@ "-2*sqrt(2)*(a - b)/c + (a - b)**2/c**2 - 2*sqrt(2)*(-a + c)/b + (-a + c)**2/b**2 - 2*sqrt(2)*(b - c)/a + (b - c)**2/a**2" ] }, - "execution_count": 39, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1748,15 +1620,122 @@ "prove(formula1)\n", "display(Latex('Case $a\\ge b\\ge c$'))\n", "formula2=makesubs(formula,'[b,oo],[c,oo]')\n", - "prove(formula2*4,values='2**(1/2),1,1')\n", + "prove(formula2*4,values='1,sqrt(2),1')\n", "formula" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "Substitute $a\\to b+w_{1}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $b\\to c+x_{1}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $a\\to\\sqrt{2}a$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "numerator: $2c^4w_{1}^2+2c^4w_{1}x_{1}+2c^4x_{1}^2+4c^3w_{1}^3-2\\sqrt{2}c^3w_{1}^2x_{1}+10c^3w_{1}^2x_{1}-2\\sqrt{2}c^3w_{1}x_{1}^2+6c^3w_{1}x_{1}^2+4c^3x_{1}^3+2c^2w_{1}^4-2\\sqrt{2}c^2w_{1}^3x_{1}+10c^2w_{1}^3x_{1}-6\\sqrt{2}c^2w_{1}^2x_{1}^2+12c^2w_{1}^2x_{1}^2-4\\sqrt{2}c^2w_{1}x_{1}^3+4c^2w_{1}x_{1}^3+2c^2x_{1}^4+2cw_{1}^4x_{1}-2\\sqrt{2}cw_{1}^3x_{1}^2+6cw_{1}^3x_{1}^2-4\\sqrt{2}cw_{1}^2x_{1}^3+4cw_{1}^2x_{1}^3-2\\sqrt{2}cw_{1}x_{1}^4+w_{1}^4x_{1}^2+2w_{1}^3x_{1}^3+w_{1}^2x_{1}^4$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $1$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "status: 2" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Program couldn't find any proof." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ 2\\sqrt{2}cw_{1}x_{1}^4+4\\sqrt{2}cw_{1}^2x_{1}^3+4\\sqrt{2}c^2w_{1}x_{1}^3+2\\sqrt{2}cw_{1}^3x_{1}^2+6\\sqrt{2}c^2w_{1}^2x_{1}^2+2\\sqrt{2}c^3w_{1}x_{1}^2+2\\sqrt{2}c^2w_{1}^3x_{1}+2\\sqrt{2}c^3w_{1}^2x_{1} \\le w_{1}^2x_{1}^4+2c^2x_{1}^4+2w_{1}^3x_{1}^3+4cw_{1}^2x_{1}^3+4c^2w_{1}x_{1}^3+4c^3x_{1}^3+w_{1}^4x_{1}^2+6cw_{1}^3x_{1}^2+12c^2w_{1}^2x_{1}^2+6c^3w_{1}x_{1}^2+2c^4x_{1}^2+2cw_{1}^4x_{1}+10c^2w_{1}^3x_{1}+10c^3w_{1}^2x_{1}+2c^4w_{1}x_{1}+2c^2w_{1}^4+4c^3w_{1}^3+2c^4w_{1}^2 $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "formula=cyclize(Sm('((a-b)/c)^2-8**(1/2)*(a-b)/c'))\n", "formula=(makesubs(formula,'[b,oo],[c,oo]'))\n", @@ -1768,54 +1747,120 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(1, (x, y, sqrt(2)))" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "S('2**(1/2)*x*y').as_coeff_mul()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(1, (x, y, sqrt(2)))" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "S('sqrt(2)*x*y').as_coeff_mul()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[(1, 1, 1), (0, 0, 0)]" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "Poly('sqrt(2)*x*y+8').monoms()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 58]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "Poly('sqrt(2)*x*y+58').coeffs()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(x, y, sqrt(2), sqrt(3), sqrt(6))" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "Poly('sqrt(2)*x*y+sqrt(3)+sqrt(2)*sqrt(3)').gens" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "([0], [(0, 0)], [1, 7], [(2, 0), (0, 1)], (x, y))" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "def _formula2list(formula):\n", " neg=pos=0\n", @@ -1831,134 +1876,6 @@ "_formula2list(S('x^2+7*y'))" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "prove(S('sqrt(2)*x^2-sqrt(8)*x*y+sqrt(2)*y^2'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "[Poly('1+2**(1/3)+4**(1/3)+x').monoms(),Poly('1+2**(1/3)+4**(1/3)+x').coeffs()]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x=Symbol('x', positive=True)\n", - "Poly(x+sqrt(x))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "prove?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Poly('x^2-1').abs()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Poly(Poly('x')/Poly('x+y'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Poly('sqrt(2)+x+sqrt(x)+x**(1/4)+x**(1/3)+x**(2/3)',extension=1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Poly('x+sqrt(6)',S('x'),S('sqrt(2)'),S('sqrt(3)')).coeffs()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Poly('x+sqrt(x)',S('sqrt(x)')).coeffs()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "source(Poly)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Poly({1:1,2:1},gens=S('sqrt(x)'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x=symbols('x', positive=True)\n", - "S('sqrt(x^2)-x')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "str(Poly({1:1,2:1,4:1},gens=S('sqrt(x)')))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "str(Poly('x^2+x+sqrt(x)'))" - ] - }, { "cell_type": "code", "execution_count": 36, @@ -1967,7 +1884,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to a+b$" + "numerator: $\\sqrt{2}x^2-2\\sqrt{2}xy+\\sqrt{2}y^2$" ], "text/plain": [ "" @@ -1979,7 +1896,4496 @@ { "data": { "text/latex": [ - "Substitute $b\\to b+c$" + "denominator: $1$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "status: 0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "From weighted AM-GM inequality:" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2\\sqrt{2}xy \\le \\sqrt{2}x^2+\\sqrt{2}y^2$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ 0 \\le 0 $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "The sum of all inequalities gives us a proof of the inequality." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prove(S('sqrt(2)*x^2-sqrt(8)*x*y+sqrt(2)*y^2'))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[(1, 0), (0, 2), (0, 1), (0, 0)], [1, 1, 1, 1]]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[Poly('1+2**(1/3)+4**(1/3)+x').monoms(),Poly('1+2**(1/3)+4**(1/3)+x').coeffs()]" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( x + \\sqrt{x}, x, \\sqrt{x}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(x + (sqrt(x)), x, sqrt(x), domain='ZZ')" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x=Symbol('x', positive=True)\n", + "Poly(x+sqrt(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "prove?" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( x^{2} + 1, x, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(x**2 + 1, x, domain='ZZ')" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly('x^2-1').abs()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( x\\frac{1}{x + y}, x, \\frac{1}{x + y}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(x*(1/(x + y)), x, 1/(x + y), domain='ZZ')" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly(Poly('x')/Poly('x+y'))" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( x + \\sqrt{x} + x^{\\frac{2}{3}} + \\sqrt[3]{x} + \\sqrt[4]{x} + \\sqrt{2}, x, \\sqrt{x}, \\sqrt[3]{x}, \\sqrt[4]{x}, domain=QQ \\right)}$" + ], + "text/plain": [ + "Poly(x + (sqrt(x)) + (x**(1/3))**2 + (x**(1/3)) + (x**(1/4)) + sqrt(2), x, sqrt(x), x**(1/3), x**(1/4), domain='QQ')" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly('sqrt(2)+x+sqrt(x)+x**(1/4)+x**(1/3)+x**(2/3)',extension=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, sqrt(6)]" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly('x+sqrt(6)',S('x'),S('sqrt(2)'),S('sqrt(3)')).coeffs()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, x]" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly('x+sqrt(x)',S('sqrt(x)')).coeffs()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/decorators.py:38: SymPyDeprecationWarning: \n", + "\n", + "source has been deprecated since SymPy 1.3. Use ?? in IPython/Jupyter\n", + "or inspect.getsource instead. See\n", + "https://github.com/sympy/sympy/issues/14905 for more info.\n", + "\n", + " _warn_deprecation(wrapped, 3)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "In file: /home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/polytools.py\n", + "class Poly(Expr):\n", + " \"\"\"\n", + " Generic class for representing and operating on polynomial expressions.\n", + " Subclasses Expr class.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " Create a univariate polynomial:\n", + "\n", + " >>> Poly(x*(x**2 + x - 1)**2)\n", + " Poly(x**5 + 2*x**4 - x**3 - 2*x**2 + x, x, domain='ZZ')\n", + "\n", + " Create a univariate polynomial with specific domain:\n", + "\n", + " >>> from sympy import sqrt\n", + " >>> Poly(x**2 + 2*x + sqrt(3), domain='R')\n", + " Poly(1.0*x**2 + 2.0*x + 1.73205080756888, x, domain='RR')\n", + "\n", + " Create a multivariate polynomial:\n", + "\n", + " >>> Poly(y*x**2 + x*y + 1)\n", + " Poly(x**2*y + x*y + 1, x, y, domain='ZZ')\n", + "\n", + " Create a univariate polynomial, where y is a constant:\n", + "\n", + " >>> Poly(y*x**2 + x*y + 1,x)\n", + " Poly(y*x**2 + y*x + 1, x, domain='ZZ[y]')\n", + "\n", + " You can evaluate the above polynomial as a function of y:\n", + "\n", + " >>> Poly(y*x**2 + x*y + 1,x).eval(2)\n", + " 6*y + 1\n", + "\n", + " See Also\n", + " ========\n", + "\n", + " sympy.core.expr.Expr\n", + "\n", + " \"\"\"\n", + "\n", + " __slots__ = ['rep', 'gens']\n", + "\n", + " is_commutative = True\n", + " is_Poly = True\n", + " _op_priority = 10.001\n", + "\n", + " def __new__(cls, rep, *gens, **args):\n", + " \"\"\"Create a new polynomial instance out of something useful. \"\"\"\n", + " opt = options.build_options(gens, args)\n", + "\n", + " if 'order' in opt:\n", + " raise NotImplementedError(\"'order' keyword is not implemented yet\")\n", + "\n", + " if iterable(rep, exclude=str):\n", + " if isinstance(rep, dict):\n", + " return cls._from_dict(rep, opt)\n", + " else:\n", + " return cls._from_list(list(rep), opt)\n", + " else:\n", + " rep = sympify(rep)\n", + "\n", + " if rep.is_Poly:\n", + " return cls._from_poly(rep, opt)\n", + " else:\n", + " return cls._from_expr(rep, opt)\n", + "\n", + " @classmethod\n", + " def new(cls, rep, *gens):\n", + " \"\"\"Construct :class:`Poly` instance from raw representation. \"\"\"\n", + " if not isinstance(rep, DMP):\n", + " raise PolynomialError(\n", + " \"invalid polynomial representation: %s\" % rep)\n", + " elif rep.lev != len(gens) - 1:\n", + " raise PolynomialError(\"invalid arguments: %s, %s\" % (rep, gens))\n", + "\n", + " obj = Basic.__new__(cls)\n", + "\n", + " obj.rep = rep\n", + " obj.gens = gens\n", + "\n", + " return obj\n", + "\n", + " @classmethod\n", + " def from_dict(cls, rep, *gens, **args):\n", + " \"\"\"Construct a polynomial from a ``dict``. \"\"\"\n", + " opt = options.build_options(gens, args)\n", + " return cls._from_dict(rep, opt)\n", + "\n", + " @classmethod\n", + " def from_list(cls, rep, *gens, **args):\n", + " \"\"\"Construct a polynomial from a ``list``. \"\"\"\n", + " opt = options.build_options(gens, args)\n", + " return cls._from_list(rep, opt)\n", + "\n", + " @classmethod\n", + " def from_poly(cls, rep, *gens, **args):\n", + " \"\"\"Construct a polynomial from a polynomial. \"\"\"\n", + " opt = options.build_options(gens, args)\n", + " return cls._from_poly(rep, opt)\n", + "\n", + " @classmethod\n", + " def from_expr(cls, rep, *gens, **args):\n", + " \"\"\"Construct a polynomial from an expression. \"\"\"\n", + " opt = options.build_options(gens, args)\n", + " return cls._from_expr(rep, opt)\n", + "\n", + " @classmethod\n", + " def _from_dict(cls, rep, opt):\n", + " \"\"\"Construct a polynomial from a ``dict``. \"\"\"\n", + " gens = opt.gens\n", + "\n", + " if not gens:\n", + " raise GeneratorsNeeded(\n", + " \"can't initialize from 'dict' without generators\")\n", + "\n", + " level = len(gens) - 1\n", + " domain = opt.domain\n", + "\n", + " if domain is None:\n", + " domain, rep = construct_domain(rep, opt=opt)\n", + " else:\n", + " for monom, coeff in rep.items():\n", + " rep[monom] = domain.convert(coeff)\n", + "\n", + " return cls.new(DMP.from_dict(rep, level, domain), *gens)\n", + "\n", + " @classmethod\n", + " def _from_list(cls, rep, opt):\n", + " \"\"\"Construct a polynomial from a ``list``. \"\"\"\n", + " gens = opt.gens\n", + "\n", + " if not gens:\n", + " raise GeneratorsNeeded(\n", + " \"can't initialize from 'list' without generators\")\n", + " elif len(gens) != 1:\n", + " raise MultivariatePolynomialError(\n", + " \"'list' representation not supported\")\n", + "\n", + " level = len(gens) - 1\n", + " domain = opt.domain\n", + "\n", + " if domain is None:\n", + " domain, rep = construct_domain(rep, opt=opt)\n", + " else:\n", + " rep = list(map(domain.convert, rep))\n", + "\n", + " return cls.new(DMP.from_list(rep, level, domain), *gens)\n", + "\n", + " @classmethod\n", + " def _from_poly(cls, rep, opt):\n", + " \"\"\"Construct a polynomial from a polynomial. \"\"\"\n", + " if cls != rep.__class__:\n", + " rep = cls.new(rep.rep, *rep.gens)\n", + "\n", + " gens = opt.gens\n", + " field = opt.field\n", + " domain = opt.domain\n", + "\n", + " if gens and rep.gens != gens:\n", + " if set(rep.gens) != set(gens):\n", + " return cls._from_expr(rep.as_expr(), opt)\n", + " else:\n", + " rep = rep.reorder(*gens)\n", + "\n", + " if 'domain' in opt and domain:\n", + " rep = rep.set_domain(domain)\n", + " elif field is True:\n", + " rep = rep.to_field()\n", + "\n", + " return rep\n", + "\n", + " @classmethod\n", + " def _from_expr(cls, rep, opt):\n", + " \"\"\"Construct a polynomial from an expression. \"\"\"\n", + " rep, opt = _dict_from_expr(rep, opt)\n", + " return cls._from_dict(rep, opt)\n", + "\n", + " def _hashable_content(self):\n", + " \"\"\"Allow SymPy to hash Poly instances. \"\"\"\n", + " return (self.rep, self.gens)\n", + "\n", + " def __hash__(self):\n", + " return super(Poly, self).__hash__()\n", + "\n", + " @property\n", + " def free_symbols(self):\n", + " \"\"\"\n", + " Free symbols of a polynomial expression.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y, z\n", + "\n", + " >>> Poly(x**2 + 1).free_symbols\n", + " {x}\n", + " >>> Poly(x**2 + y).free_symbols\n", + " {x, y}\n", + " >>> Poly(x**2 + y, x).free_symbols\n", + " {x, y}\n", + " >>> Poly(x**2 + y, x, z).free_symbols\n", + " {x, y}\n", + "\n", + " \"\"\"\n", + " symbols = set()\n", + " gens = self.gens\n", + " for i in range(len(gens)):\n", + " for monom in self.monoms():\n", + " if monom[i]:\n", + " symbols |= gens[i].free_symbols\n", + " break\n", + "\n", + " return symbols | self.free_symbols_in_domain\n", + "\n", + " @property\n", + " def free_symbols_in_domain(self):\n", + " \"\"\"\n", + " Free symbols of the domain of ``self``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + 1).free_symbols_in_domain\n", + " set()\n", + " >>> Poly(x**2 + y).free_symbols_in_domain\n", + " set()\n", + " >>> Poly(x**2 + y, x).free_symbols_in_domain\n", + " {y}\n", + "\n", + " \"\"\"\n", + " domain, symbols = self.rep.dom, set()\n", + "\n", + " if domain.is_Composite:\n", + " for gen in domain.symbols:\n", + " symbols |= gen.free_symbols\n", + " elif domain.is_EX:\n", + " for coeff in self.coeffs():\n", + " symbols |= coeff.free_symbols\n", + "\n", + " return symbols\n", + "\n", + " @property\n", + " def args(self):\n", + " \"\"\"\n", + " Don't mess up with the core.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x).args\n", + " (x**2 + 1,)\n", + "\n", + " \"\"\"\n", + " return (self.as_expr(),)\n", + "\n", + " @property\n", + " def gen(self):\n", + " \"\"\"\n", + " Return the principal generator.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x).gen\n", + " x\n", + "\n", + " \"\"\"\n", + " return self.gens[0]\n", + "\n", + " @property\n", + " def domain(self):\n", + " \"\"\"Get the ground domain of ``self``. \"\"\"\n", + " return self.get_domain()\n", + "\n", + " @property\n", + " def zero(self):\n", + " \"\"\"Return zero polynomial with ``self``'s properties. \"\"\"\n", + " return self.new(self.rep.zero(self.rep.lev, self.rep.dom), *self.gens)\n", + "\n", + " @property\n", + " def one(self):\n", + " \"\"\"Return one polynomial with ``self``'s properties. \"\"\"\n", + " return self.new(self.rep.one(self.rep.lev, self.rep.dom), *self.gens)\n", + "\n", + " @property\n", + " def unit(self):\n", + " \"\"\"Return unit polynomial with ``self``'s properties. \"\"\"\n", + " return self.new(self.rep.unit(self.rep.lev, self.rep.dom), *self.gens)\n", + "\n", + " def unify(f, g):\n", + " \"\"\"\n", + " Make ``f`` and ``g`` belong to the same domain.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> f, g = Poly(x/2 + 1), Poly(2*x + 1)\n", + "\n", + " >>> f\n", + " Poly(1/2*x + 1, x, domain='QQ')\n", + " >>> g\n", + " Poly(2*x + 1, x, domain='ZZ')\n", + "\n", + " >>> F, G = f.unify(g)\n", + "\n", + " >>> F\n", + " Poly(1/2*x + 1, x, domain='QQ')\n", + " >>> G\n", + " Poly(2*x + 1, x, domain='QQ')\n", + "\n", + " \"\"\"\n", + " _, per, F, G = f._unify(g)\n", + " return per(F), per(G)\n", + "\n", + " def _unify(f, g):\n", + " g = sympify(g)\n", + "\n", + " if not g.is_Poly:\n", + " try:\n", + " return f.rep.dom, f.per, f.rep, f.rep.per(f.rep.dom.from_sympy(g))\n", + " except CoercionFailed:\n", + " raise UnificationFailed(\"can't unify %s with %s\" % (f, g))\n", + "\n", + " if isinstance(f.rep, DMP) and isinstance(g.rep, DMP):\n", + " gens = _unify_gens(f.gens, g.gens)\n", + "\n", + " dom, lev = f.rep.dom.unify(g.rep.dom, gens), len(gens) - 1\n", + "\n", + " if f.gens != gens:\n", + " f_monoms, f_coeffs = _dict_reorder(\n", + " f.rep.to_dict(), f.gens, gens)\n", + "\n", + " if f.rep.dom != dom:\n", + " f_coeffs = [dom.convert(c, f.rep.dom) for c in f_coeffs]\n", + "\n", + " F = DMP(dict(list(zip(f_monoms, f_coeffs))), dom, lev)\n", + " else:\n", + " F = f.rep.convert(dom)\n", + "\n", + " if g.gens != gens:\n", + " g_monoms, g_coeffs = _dict_reorder(\n", + " g.rep.to_dict(), g.gens, gens)\n", + "\n", + " if g.rep.dom != dom:\n", + " g_coeffs = [dom.convert(c, g.rep.dom) for c in g_coeffs]\n", + "\n", + " G = DMP(dict(list(zip(g_monoms, g_coeffs))), dom, lev)\n", + " else:\n", + " G = g.rep.convert(dom)\n", + " else:\n", + " raise UnificationFailed(\"can't unify %s with %s\" % (f, g))\n", + "\n", + " cls = f.__class__\n", + "\n", + " def per(rep, dom=dom, gens=gens, remove=None):\n", + " if remove is not None:\n", + " gens = gens[:remove] + gens[remove + 1:]\n", + "\n", + " if not gens:\n", + " return dom.to_sympy(rep)\n", + "\n", + " return cls.new(rep, *gens)\n", + "\n", + " return dom, per, F, G\n", + "\n", + " def per(f, rep, gens=None, remove=None):\n", + " \"\"\"\n", + " Create a Poly out of the given representation.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, ZZ\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> from sympy.polys.polyclasses import DMP\n", + "\n", + " >>> a = Poly(x**2 + 1)\n", + "\n", + " >>> a.per(DMP([ZZ(1), ZZ(1)], ZZ), gens=[y])\n", + " Poly(y + 1, y, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if gens is None:\n", + " gens = f.gens\n", + "\n", + " if remove is not None:\n", + " gens = gens[:remove] + gens[remove + 1:]\n", + "\n", + " if not gens:\n", + " return f.rep.dom.to_sympy(rep)\n", + "\n", + " return f.__class__.new(rep, *gens)\n", + "\n", + " def set_domain(f, domain):\n", + " \"\"\"Set the ground domain of ``f``. \"\"\"\n", + " opt = options.build_options(f.gens, {'domain': domain})\n", + " return f.per(f.rep.convert(opt.domain))\n", + "\n", + " def get_domain(f):\n", + " \"\"\"Get the ground domain of ``f``. \"\"\"\n", + " return f.rep.dom\n", + "\n", + " def set_modulus(f, modulus):\n", + " \"\"\"\n", + " Set the modulus of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(5*x**2 + 2*x - 1, x).set_modulus(2)\n", + " Poly(x**2 + 1, x, modulus=2)\n", + "\n", + " \"\"\"\n", + " modulus = options.Modulus.preprocess(modulus)\n", + " return f.set_domain(FF(modulus))\n", + "\n", + " def get_modulus(f):\n", + " \"\"\"\n", + " Get the modulus of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, modulus=2).get_modulus()\n", + " 2\n", + "\n", + " \"\"\"\n", + " domain = f.get_domain()\n", + "\n", + " if domain.is_FiniteField:\n", + " return Integer(domain.characteristic())\n", + " else:\n", + " raise PolynomialError(\"not a polynomial over a Galois field\")\n", + "\n", + " def _eval_subs(f, old, new):\n", + " \"\"\"Internal implementation of :func:`subs`. \"\"\"\n", + " if old in f.gens:\n", + " if new.is_number:\n", + " return f.eval(old, new)\n", + " else:\n", + " try:\n", + " return f.replace(old, new)\n", + " except PolynomialError:\n", + " pass\n", + "\n", + " return f.as_expr().subs(old, new)\n", + "\n", + " def exclude(f):\n", + " \"\"\"\n", + " Remove unnecessary generators from ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import a, b, c, d, x\n", + "\n", + " >>> Poly(a + x, a, b, c, d, x).exclude()\n", + " Poly(a + x, a, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " J, new = f.rep.exclude()\n", + " gens = []\n", + "\n", + " for j in range(len(f.gens)):\n", + " if j not in J:\n", + " gens.append(f.gens[j])\n", + "\n", + " return f.per(new, gens=gens)\n", + "\n", + " def replace(f, x, y=None, *_ignore):\n", + " # XXX this does not match Basic's signature\n", + " \"\"\"\n", + " Replace ``x`` with ``y`` in generators list.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + 1, x).replace(x, y)\n", + " Poly(y**2 + 1, y, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if y is None:\n", + " if f.is_univariate:\n", + " x, y = f.gen, x\n", + " else:\n", + " raise PolynomialError(\n", + " \"syntax supported only in univariate case\")\n", + "\n", + " if x == y or x not in f.gens:\n", + " return f\n", + "\n", + " if x in f.gens and y not in f.gens:\n", + " dom = f.get_domain()\n", + "\n", + " if not dom.is_Composite or y not in dom.symbols:\n", + " gens = list(f.gens)\n", + " gens[gens.index(x)] = y\n", + " return f.per(f.rep, gens=gens)\n", + "\n", + " raise PolynomialError(\"can't replace %s with %s in %s\" % (x, y, f))\n", + "\n", + " def reorder(f, *gens, **args):\n", + " \"\"\"\n", + " Efficiently apply new order of generators.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + x*y**2, x, y).reorder(y, x)\n", + " Poly(y**2*x + x**2, y, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " opt = options.Options((), args)\n", + "\n", + " if not gens:\n", + " gens = _sort_gens(f.gens, opt=opt)\n", + " elif set(f.gens) != set(gens):\n", + " raise PolynomialError(\n", + " \"generators list can differ only up to order of elements\")\n", + "\n", + " rep = dict(list(zip(*_dict_reorder(f.rep.to_dict(), f.gens, gens))))\n", + "\n", + " return f.per(DMP(rep, f.rep.dom, len(gens) - 1), gens=gens)\n", + "\n", + " def ltrim(f, gen):\n", + " \"\"\"\n", + " Remove dummy generators from ``f`` that are to the left of\n", + " specified ``gen`` in the generators as ordered. When ``gen``\n", + " is an integer, it refers to the generator located at that\n", + " position within the tuple of generators of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y, z\n", + "\n", + " >>> Poly(y**2 + y*z**2, x, y, z).ltrim(y)\n", + " Poly(y**2 + y*z**2, y, z, domain='ZZ')\n", + " >>> Poly(z, x, y, z).ltrim(-1)\n", + " Poly(z, z, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " rep = f.as_dict(native=True)\n", + " j = f._gen_to_level(gen)\n", + "\n", + " terms = {}\n", + "\n", + " for monom, coeff in rep.items():\n", + "\n", + " if any(i for i in monom[:j]):\n", + " # some generator is used in the portion to be trimmed\n", + " raise PolynomialError(\"can't left trim %s\" % f)\n", + "\n", + " terms[monom[j:]] = coeff\n", + "\n", + " gens = f.gens[j:]\n", + "\n", + " return f.new(DMP.from_dict(terms, len(gens) - 1, f.rep.dom), *gens)\n", + "\n", + " def has_only_gens(f, *gens):\n", + " \"\"\"\n", + " Return ``True`` if ``Poly(f, *gens)`` retains ground domain.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y, z\n", + "\n", + " >>> Poly(x*y + 1, x, y, z).has_only_gens(x, y)\n", + " True\n", + " >>> Poly(x*y + z, x, y, z).has_only_gens(x, y)\n", + " False\n", + "\n", + " \"\"\"\n", + " indices = set()\n", + "\n", + " for gen in gens:\n", + " try:\n", + " index = f.gens.index(gen)\n", + " except ValueError:\n", + " raise GeneratorsError(\n", + " \"%s doesn't have %s as generator\" % (f, gen))\n", + " else:\n", + " indices.add(index)\n", + "\n", + " for monom in f.monoms():\n", + " for i, elt in enumerate(monom):\n", + " if i not in indices and elt:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " def to_ring(f):\n", + " \"\"\"\n", + " Make the ground domain a ring.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, QQ\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, domain=QQ).to_ring()\n", + " Poly(x**2 + 1, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'to_ring'):\n", + " result = f.rep.to_ring()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'to_ring')\n", + "\n", + " return f.per(result)\n", + "\n", + " def to_field(f):\n", + " \"\"\"\n", + " Make the ground domain a field.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, ZZ\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x, domain=ZZ).to_field()\n", + " Poly(x**2 + 1, x, domain='QQ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'to_field'):\n", + " result = f.rep.to_field()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'to_field')\n", + "\n", + " return f.per(result)\n", + "\n", + " def to_exact(f):\n", + " \"\"\"\n", + " Make the ground domain exact.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, RR\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1.0, x, domain=RR).to_exact()\n", + " Poly(x**2 + 1, x, domain='QQ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'to_exact'):\n", + " result = f.rep.to_exact()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'to_exact')\n", + "\n", + " return f.per(result)\n", + "\n", + " def retract(f, field=None):\n", + " \"\"\"\n", + " Recalculate the ground domain of a polynomial.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> f = Poly(x**2 + 1, x, domain='QQ[y]')\n", + " >>> f\n", + " Poly(x**2 + 1, x, domain='QQ[y]')\n", + "\n", + " >>> f.retract()\n", + " Poly(x**2 + 1, x, domain='ZZ')\n", + " >>> f.retract(field=True)\n", + " Poly(x**2 + 1, x, domain='QQ')\n", + "\n", + " \"\"\"\n", + " dom, rep = construct_domain(f.as_dict(zero=True),\n", + " field=field, composite=f.domain.is_Composite or None)\n", + " return f.from_dict(rep, f.gens, domain=dom)\n", + "\n", + " def slice(f, x, m, n=None):\n", + " \"\"\"Take a continuous subsequence of terms of ``f``. \"\"\"\n", + " if n is None:\n", + " j, m, n = 0, x, m\n", + " else:\n", + " j = f._gen_to_level(x)\n", + "\n", + " m, n = int(m), int(n)\n", + "\n", + " if hasattr(f.rep, 'slice'):\n", + " result = f.rep.slice(m, n, j)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'slice')\n", + "\n", + " return f.per(result)\n", + "\n", + " def coeffs(f, order=None):\n", + " \"\"\"\n", + " Returns all non-zero coefficients from ``f`` in lex order.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**3 + 2*x + 3, x).coeffs()\n", + " [1, 2, 3]\n", + "\n", + " See Also\n", + " ========\n", + " all_coeffs\n", + " coeff_monomial\n", + " nth\n", + "\n", + " \"\"\"\n", + " return [f.rep.dom.to_sympy(c) for c in f.rep.coeffs(order=order)]\n", + "\n", + " def monoms(f, order=None):\n", + " \"\"\"\n", + " Returns all non-zero monomials from ``f`` in lex order.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + 2*x*y**2 + x*y + 3*y, x, y).monoms()\n", + " [(2, 0), (1, 2), (1, 1), (0, 1)]\n", + "\n", + " See Also\n", + " ========\n", + " all_monoms\n", + "\n", + " \"\"\"\n", + " return f.rep.monoms(order=order)\n", + "\n", + " def terms(f, order=None):\n", + " \"\"\"\n", + " Returns all non-zero terms from ``f`` in lex order.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + 2*x*y**2 + x*y + 3*y, x, y).terms()\n", + " [((2, 0), 1), ((1, 2), 2), ((1, 1), 1), ((0, 1), 3)]\n", + "\n", + " See Also\n", + " ========\n", + " all_terms\n", + "\n", + " \"\"\"\n", + " return [(m, f.rep.dom.to_sympy(c)) for m, c in f.rep.terms(order=order)]\n", + "\n", + " def all_coeffs(f):\n", + " \"\"\"\n", + " Returns all coefficients from a univariate polynomial ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**3 + 2*x - 1, x).all_coeffs()\n", + " [1, 0, 2, -1]\n", + "\n", + " \"\"\"\n", + " return [f.rep.dom.to_sympy(c) for c in f.rep.all_coeffs()]\n", + "\n", + " def all_monoms(f):\n", + " \"\"\"\n", + " Returns all monomials from a univariate polynomial ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**3 + 2*x - 1, x).all_monoms()\n", + " [(3,), (2,), (1,), (0,)]\n", + "\n", + " See Also\n", + " ========\n", + " all_terms\n", + "\n", + " \"\"\"\n", + " return f.rep.all_monoms()\n", + "\n", + " def all_terms(f):\n", + " \"\"\"\n", + " Returns all terms from a univariate polynomial ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**3 + 2*x - 1, x).all_terms()\n", + " [((3,), 1), ((2,), 0), ((1,), 2), ((0,), -1)]\n", + "\n", + " \"\"\"\n", + " return [(m, f.rep.dom.to_sympy(c)) for m, c in f.rep.all_terms()]\n", + "\n", + " def termwise(f, func, *gens, **args):\n", + " \"\"\"\n", + " Apply a function to all terms of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> def func(k, coeff):\n", + " ... k = k[0]\n", + " ... return coeff//10**(2-k)\n", + "\n", + " >>> Poly(x**2 + 20*x + 400).termwise(func)\n", + " Poly(x**2 + 2*x + 4, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " terms = {}\n", + "\n", + " for monom, coeff in f.terms():\n", + " result = func(monom, coeff)\n", + "\n", + " if isinstance(result, tuple):\n", + " monom, coeff = result\n", + " else:\n", + " coeff = result\n", + "\n", + " if coeff:\n", + " if monom not in terms:\n", + " terms[monom] = coeff\n", + " else:\n", + " raise PolynomialError(\n", + " \"%s monomial was generated twice\" % monom)\n", + "\n", + " return f.from_dict(terms, *(gens or f.gens), **args)\n", + "\n", + " def length(f):\n", + " \"\"\"\n", + " Returns the number of non-zero terms in ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 2*x - 1).length()\n", + " 3\n", + "\n", + " \"\"\"\n", + " return len(f.as_dict())\n", + "\n", + " def as_dict(f, native=False, zero=False):\n", + " \"\"\"\n", + " Switch to a ``dict`` representation.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + 2*x*y**2 - y, x, y).as_dict()\n", + " {(0, 1): -1, (1, 2): 2, (2, 0): 1}\n", + "\n", + " \"\"\"\n", + " if native:\n", + " return f.rep.to_dict(zero=zero)\n", + " else:\n", + " return f.rep.to_sympy_dict(zero=zero)\n", + "\n", + " def as_list(f, native=False):\n", + " \"\"\"Switch to a ``list`` representation. \"\"\"\n", + " if native:\n", + " return f.rep.to_list()\n", + " else:\n", + " return f.rep.to_sympy_list()\n", + "\n", + " def as_expr(f, *gens):\n", + " \"\"\"\n", + " Convert a Poly instance to an Expr instance.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> f = Poly(x**2 + 2*x*y**2 - y, x, y)\n", + "\n", + " >>> f.as_expr()\n", + " x**2 + 2*x*y**2 - y\n", + " >>> f.as_expr({x: 5})\n", + " 10*y**2 - y + 25\n", + " >>> f.as_expr(5, 6)\n", + " 379\n", + "\n", + " \"\"\"\n", + " if not gens:\n", + " gens = f.gens\n", + " elif len(gens) == 1 and isinstance(gens[0], dict):\n", + " mapping = gens[0]\n", + " gens = list(f.gens)\n", + "\n", + " for gen, value in mapping.items():\n", + " try:\n", + " index = gens.index(gen)\n", + " except ValueError:\n", + " raise GeneratorsError(\n", + " \"%s doesn't have %s as generator\" % (f, gen))\n", + " else:\n", + " gens[index] = value\n", + "\n", + " return basic_from_dict(f.rep.to_sympy_dict(), *gens)\n", + "\n", + " def lift(f):\n", + " \"\"\"\n", + " Convert algebraic coefficients to rationals.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, I\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + I*x + 1, x, extension=I).lift()\n", + " Poly(x**4 + 3*x**2 + 1, x, domain='QQ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'lift'):\n", + " result = f.rep.lift()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'lift')\n", + "\n", + " return f.per(result)\n", + "\n", + " def deflate(f):\n", + " \"\"\"\n", + " Reduce degree of ``f`` by mapping ``x_i**m`` to ``y_i``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**6*y**2 + x**3 + 1, x, y).deflate()\n", + " ((3, 2), Poly(x**2*y + x + 1, x, y, domain='ZZ'))\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'deflate'):\n", + " J, result = f.rep.deflate()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'deflate')\n", + "\n", + " return J, f.per(result)\n", + "\n", + " def inject(f, front=False):\n", + " \"\"\"\n", + " Inject ground domain generators into ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> f = Poly(x**2*y + x*y**3 + x*y + 1, x)\n", + "\n", + " >>> f.inject()\n", + " Poly(x**2*y + x*y**3 + x*y + 1, x, y, domain='ZZ')\n", + " >>> f.inject(front=True)\n", + " Poly(y**3*x + y*x**2 + y*x + 1, y, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " dom = f.rep.dom\n", + "\n", + " if dom.is_Numerical:\n", + " return f\n", + " elif not dom.is_Poly:\n", + " raise DomainError(\"can't inject generators over %s\" % dom)\n", + "\n", + " if hasattr(f.rep, 'inject'):\n", + " result = f.rep.inject(front=front)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'inject')\n", + "\n", + " if front:\n", + " gens = dom.symbols + f.gens\n", + " else:\n", + " gens = f.gens + dom.symbols\n", + "\n", + " return f.new(result, *gens)\n", + "\n", + " def eject(f, *gens):\n", + " \"\"\"\n", + " Eject selected generators into the ground domain.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> f = Poly(x**2*y + x*y**3 + x*y + 1, x, y)\n", + "\n", + " >>> f.eject(x)\n", + " Poly(x*y**3 + (x**2 + x)*y + 1, y, domain='ZZ[x]')\n", + " >>> f.eject(y)\n", + " Poly(y*x**2 + (y**3 + y)*x + 1, x, domain='ZZ[y]')\n", + "\n", + " \"\"\"\n", + " dom = f.rep.dom\n", + "\n", + " if not dom.is_Numerical:\n", + " raise DomainError(\"can't eject generators over %s\" % dom)\n", + "\n", + " k = len(gens)\n", + "\n", + " if f.gens[:k] == gens:\n", + " _gens, front = f.gens[k:], True\n", + " elif f.gens[-k:] == gens:\n", + " _gens, front = f.gens[:-k], False\n", + " else:\n", + " raise NotImplementedError(\n", + " \"can only eject front or back generators\")\n", + "\n", + " dom = dom.inject(*gens)\n", + "\n", + " if hasattr(f.rep, 'eject'):\n", + " result = f.rep.eject(dom, front=front)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'eject')\n", + "\n", + " return f.new(result, *_gens)\n", + "\n", + " def terms_gcd(f):\n", + " \"\"\"\n", + " Remove GCD of terms from the polynomial ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**6*y**2 + x**3*y, x, y).terms_gcd()\n", + " ((3, 1), Poly(x**3*y + 1, x, y, domain='ZZ'))\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'terms_gcd'):\n", + " J, result = f.rep.terms_gcd()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'terms_gcd')\n", + "\n", + " return J, f.per(result)\n", + "\n", + " def add_ground(f, coeff):\n", + " \"\"\"\n", + " Add an element of the ground domain to ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x + 1).add_ground(2)\n", + " Poly(x + 3, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'add_ground'):\n", + " result = f.rep.add_ground(coeff)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'add_ground')\n", + "\n", + " return f.per(result)\n", + "\n", + " def sub_ground(f, coeff):\n", + " \"\"\"\n", + " Subtract an element of the ground domain from ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x + 1).sub_ground(2)\n", + " Poly(x - 1, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'sub_ground'):\n", + " result = f.rep.sub_ground(coeff)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'sub_ground')\n", + "\n", + " return f.per(result)\n", + "\n", + " def mul_ground(f, coeff):\n", + " \"\"\"\n", + " Multiply ``f`` by a an element of the ground domain.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x + 1).mul_ground(2)\n", + " Poly(2*x + 2, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'mul_ground'):\n", + " result = f.rep.mul_ground(coeff)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'mul_ground')\n", + "\n", + " return f.per(result)\n", + "\n", + " def quo_ground(f, coeff):\n", + " \"\"\"\n", + " Quotient of ``f`` by a an element of the ground domain.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(2*x + 4).quo_ground(2)\n", + " Poly(x + 2, x, domain='ZZ')\n", + "\n", + " >>> Poly(2*x + 3).quo_ground(2)\n", + " Poly(x + 1, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'quo_ground'):\n", + " result = f.rep.quo_ground(coeff)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'quo_ground')\n", + "\n", + " return f.per(result)\n", + "\n", + " def exquo_ground(f, coeff):\n", + " \"\"\"\n", + " Exact quotient of ``f`` by a an element of the ground domain.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(2*x + 4).exquo_ground(2)\n", + " Poly(x + 2, x, domain='ZZ')\n", + "\n", + " >>> Poly(2*x + 3).exquo_ground(2)\n", + " Traceback (most recent call last):\n", + " ...\n", + " ExactQuotientFailed: 2 does not divide 3 in ZZ\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'exquo_ground'):\n", + " result = f.rep.exquo_ground(coeff)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'exquo_ground')\n", + "\n", + " return f.per(result)\n", + "\n", + " def abs(f):\n", + " \"\"\"\n", + " Make all coefficients in ``f`` positive.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 1, x).abs()\n", + " Poly(x**2 + 1, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'abs'):\n", + " result = f.rep.abs()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'abs')\n", + "\n", + " return f.per(result)\n", + "\n", + " def neg(f):\n", + " \"\"\"\n", + " Negate all coefficients in ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 1, x).neg()\n", + " Poly(-x**2 + 1, x, domain='ZZ')\n", + "\n", + " >>> -Poly(x**2 - 1, x)\n", + " Poly(-x**2 + 1, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'neg'):\n", + " result = f.rep.neg()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'neg')\n", + "\n", + " return f.per(result)\n", + "\n", + " def add(f, g):\n", + " \"\"\"\n", + " Add two polynomials ``f`` and ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x).add(Poly(x - 2, x))\n", + " Poly(x**2 + x - 1, x, domain='ZZ')\n", + "\n", + " >>> Poly(x**2 + 1, x) + Poly(x - 2, x)\n", + " Poly(x**2 + x - 1, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " g = sympify(g)\n", + "\n", + " if not g.is_Poly:\n", + " return f.add_ground(g)\n", + "\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'add'):\n", + " result = F.add(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'add')\n", + "\n", + " return per(result)\n", + "\n", + " def sub(f, g):\n", + " \"\"\"\n", + " Subtract two polynomials ``f`` and ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x).sub(Poly(x - 2, x))\n", + " Poly(x**2 - x + 3, x, domain='ZZ')\n", + "\n", + " >>> Poly(x**2 + 1, x) - Poly(x - 2, x)\n", + " Poly(x**2 - x + 3, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " g = sympify(g)\n", + "\n", + " if not g.is_Poly:\n", + " return f.sub_ground(g)\n", + "\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'sub'):\n", + " result = F.sub(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'sub')\n", + "\n", + " return per(result)\n", + "\n", + " def mul(f, g):\n", + " \"\"\"\n", + " Multiply two polynomials ``f`` and ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x).mul(Poly(x - 2, x))\n", + " Poly(x**3 - 2*x**2 + x - 2, x, domain='ZZ')\n", + "\n", + " >>> Poly(x**2 + 1, x)*Poly(x - 2, x)\n", + " Poly(x**3 - 2*x**2 + x - 2, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " g = sympify(g)\n", + "\n", + " if not g.is_Poly:\n", + " return f.mul_ground(g)\n", + "\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'mul'):\n", + " result = F.mul(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'mul')\n", + "\n", + " return per(result)\n", + "\n", + " def sqr(f):\n", + " \"\"\"\n", + " Square a polynomial ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x - 2, x).sqr()\n", + " Poly(x**2 - 4*x + 4, x, domain='ZZ')\n", + "\n", + " >>> Poly(x - 2, x)**2\n", + " Poly(x**2 - 4*x + 4, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'sqr'):\n", + " result = f.rep.sqr()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'sqr')\n", + "\n", + " return f.per(result)\n", + "\n", + " def pow(f, n):\n", + " \"\"\"\n", + " Raise ``f`` to a non-negative power ``n``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x - 2, x).pow(3)\n", + " Poly(x**3 - 6*x**2 + 12*x - 8, x, domain='ZZ')\n", + "\n", + " >>> Poly(x - 2, x)**3\n", + " Poly(x**3 - 6*x**2 + 12*x - 8, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " n = int(n)\n", + "\n", + " if hasattr(f.rep, 'pow'):\n", + " result = f.rep.pow(n)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'pow')\n", + "\n", + " return f.per(result)\n", + "\n", + " def pdiv(f, g):\n", + " \"\"\"\n", + " Polynomial pseudo-division of ``f`` by ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x).pdiv(Poly(2*x - 4, x))\n", + " (Poly(2*x + 4, x, domain='ZZ'), Poly(20, x, domain='ZZ'))\n", + "\n", + " \"\"\"\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'pdiv'):\n", + " q, r = F.pdiv(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'pdiv')\n", + "\n", + " return per(q), per(r)\n", + "\n", + " def prem(f, g):\n", + " \"\"\"\n", + " Polynomial pseudo-remainder of ``f`` by ``g``.\n", + "\n", + " Caveat: The function prem(f, g, x) can be safely used to compute\n", + " in Z[x] _only_ subresultant polynomial remainder sequences (prs's).\n", + "\n", + " To safely compute Euclidean and Sturmian prs's in Z[x]\n", + " employ anyone of the corresponding functions found in\n", + " the module sympy.polys.subresultants_qq_zz. The functions\n", + " in the module with suffix _pg compute prs's in Z[x] employing\n", + " rem(f, g, x), whereas the functions with suffix _amv\n", + " compute prs's in Z[x] employing rem_z(f, g, x).\n", + "\n", + " The function rem_z(f, g, x) differs from prem(f, g, x) in that\n", + " to compute the remainder polynomials in Z[x] it premultiplies\n", + " the divident times the absolute value of the leading coefficient\n", + " of the divisor raised to the power degree(f, x) - degree(g, x) + 1.\n", + "\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x).prem(Poly(2*x - 4, x))\n", + " Poly(20, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'prem'):\n", + " result = F.prem(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'prem')\n", + "\n", + " return per(result)\n", + "\n", + " def pquo(f, g):\n", + " \"\"\"\n", + " Polynomial pseudo-quotient of ``f`` by ``g``.\n", + "\n", + " See the Caveat note in the function prem(f, g).\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x).pquo(Poly(2*x - 4, x))\n", + " Poly(2*x + 4, x, domain='ZZ')\n", + "\n", + " >>> Poly(x**2 - 1, x).pquo(Poly(2*x - 2, x))\n", + " Poly(2*x + 2, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'pquo'):\n", + " result = F.pquo(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'pquo')\n", + "\n", + " return per(result)\n", + "\n", + " def pexquo(f, g):\n", + " \"\"\"\n", + " Polynomial exact pseudo-quotient of ``f`` by ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 1, x).pexquo(Poly(2*x - 2, x))\n", + " Poly(2*x + 2, x, domain='ZZ')\n", + "\n", + " >>> Poly(x**2 + 1, x).pexquo(Poly(2*x - 4, x))\n", + " Traceback (most recent call last):\n", + " ...\n", + " ExactQuotientFailed: 2*x - 4 does not divide x**2 + 1\n", + "\n", + " \"\"\"\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'pexquo'):\n", + " try:\n", + " result = F.pexquo(G)\n", + " except ExactQuotientFailed as exc:\n", + " raise exc.new(f.as_expr(), g.as_expr())\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'pexquo')\n", + "\n", + " return per(result)\n", + "\n", + " def div(f, g, auto=True):\n", + " \"\"\"\n", + " Polynomial division with remainder of ``f`` by ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x).div(Poly(2*x - 4, x))\n", + " (Poly(1/2*x + 1, x, domain='QQ'), Poly(5, x, domain='QQ'))\n", + "\n", + " >>> Poly(x**2 + 1, x).div(Poly(2*x - 4, x), auto=False)\n", + " (Poly(0, x, domain='ZZ'), Poly(x**2 + 1, x, domain='ZZ'))\n", + "\n", + " \"\"\"\n", + " dom, per, F, G = f._unify(g)\n", + " retract = False\n", + "\n", + " if auto and dom.is_Ring and not dom.is_Field:\n", + " F, G = F.to_field(), G.to_field()\n", + " retract = True\n", + "\n", + " if hasattr(f.rep, 'div'):\n", + " q, r = F.div(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'div')\n", + "\n", + " if retract:\n", + " try:\n", + " Q, R = q.to_ring(), r.to_ring()\n", + " except CoercionFailed:\n", + " pass\n", + " else:\n", + " q, r = Q, R\n", + "\n", + " return per(q), per(r)\n", + "\n", + " def rem(f, g, auto=True):\n", + " \"\"\"\n", + " Computes the polynomial remainder of ``f`` by ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x).rem(Poly(2*x - 4, x))\n", + " Poly(5, x, domain='ZZ')\n", + "\n", + " >>> Poly(x**2 + 1, x).rem(Poly(2*x - 4, x), auto=False)\n", + " Poly(x**2 + 1, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " dom, per, F, G = f._unify(g)\n", + " retract = False\n", + "\n", + " if auto and dom.is_Ring and not dom.is_Field:\n", + " F, G = F.to_field(), G.to_field()\n", + " retract = True\n", + "\n", + " if hasattr(f.rep, 'rem'):\n", + " r = F.rem(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'rem')\n", + "\n", + " if retract:\n", + " try:\n", + " r = r.to_ring()\n", + " except CoercionFailed:\n", + " pass\n", + "\n", + " return per(r)\n", + "\n", + " def quo(f, g, auto=True):\n", + " \"\"\"\n", + " Computes polynomial quotient of ``f`` by ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x).quo(Poly(2*x - 4, x))\n", + " Poly(1/2*x + 1, x, domain='QQ')\n", + "\n", + " >>> Poly(x**2 - 1, x).quo(Poly(x - 1, x))\n", + " Poly(x + 1, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " dom, per, F, G = f._unify(g)\n", + " retract = False\n", + "\n", + " if auto and dom.is_Ring and not dom.is_Field:\n", + " F, G = F.to_field(), G.to_field()\n", + " retract = True\n", + "\n", + " if hasattr(f.rep, 'quo'):\n", + " q = F.quo(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'quo')\n", + "\n", + " if retract:\n", + " try:\n", + " q = q.to_ring()\n", + " except CoercionFailed:\n", + " pass\n", + "\n", + " return per(q)\n", + "\n", + " def exquo(f, g, auto=True):\n", + " \"\"\"\n", + " Computes polynomial exact quotient of ``f`` by ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 1, x).exquo(Poly(x - 1, x))\n", + " Poly(x + 1, x, domain='ZZ')\n", + "\n", + " >>> Poly(x**2 + 1, x).exquo(Poly(2*x - 4, x))\n", + " Traceback (most recent call last):\n", + " ...\n", + " ExactQuotientFailed: 2*x - 4 does not divide x**2 + 1\n", + "\n", + " \"\"\"\n", + " dom, per, F, G = f._unify(g)\n", + " retract = False\n", + "\n", + " if auto and dom.is_Ring and not dom.is_Field:\n", + " F, G = F.to_field(), G.to_field()\n", + " retract = True\n", + "\n", + " if hasattr(f.rep, 'exquo'):\n", + " try:\n", + " q = F.exquo(G)\n", + " except ExactQuotientFailed as exc:\n", + " raise exc.new(f.as_expr(), g.as_expr())\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'exquo')\n", + "\n", + " if retract:\n", + " try:\n", + " q = q.to_ring()\n", + " except CoercionFailed:\n", + " pass\n", + "\n", + " return per(q)\n", + "\n", + " def _gen_to_level(f, gen):\n", + " \"\"\"Returns level associated with the given generator. \"\"\"\n", + " if isinstance(gen, int):\n", + " length = len(f.gens)\n", + "\n", + " if -length <= gen < length:\n", + " if gen < 0:\n", + " return length + gen\n", + " else:\n", + " return gen\n", + " else:\n", + " raise PolynomialError(\"-%s <= gen < %s expected, got %s\" %\n", + " (length, length, gen))\n", + " else:\n", + " try:\n", + " return f.gens.index(sympify(gen))\n", + " except ValueError:\n", + " raise PolynomialError(\n", + " \"a valid generator expected, got %s\" % gen)\n", + "\n", + " def degree(f, gen=0):\n", + " \"\"\"\n", + " Returns degree of ``f`` in ``x_j``.\n", + "\n", + " The degree of 0 is negative infinity.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + y*x + 1, x, y).degree()\n", + " 2\n", + " >>> Poly(x**2 + y*x + y, x, y).degree(y)\n", + " 1\n", + " >>> Poly(0, x).degree()\n", + " -oo\n", + "\n", + " \"\"\"\n", + " j = f._gen_to_level(gen)\n", + "\n", + " if hasattr(f.rep, 'degree'):\n", + " return f.rep.degree(j)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'degree')\n", + "\n", + " def degree_list(f):\n", + " \"\"\"\n", + " Returns a list of degrees of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + y*x + 1, x, y).degree_list()\n", + " (2, 1)\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'degree_list'):\n", + " return f.rep.degree_list()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'degree_list')\n", + "\n", + " def total_degree(f):\n", + " \"\"\"\n", + " Returns the total degree of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + y*x + 1, x, y).total_degree()\n", + " 2\n", + " >>> Poly(x + y**5, x, y).total_degree()\n", + " 5\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'total_degree'):\n", + " return f.rep.total_degree()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'total_degree')\n", + "\n", + " def homogenize(f, s):\n", + " \"\"\"\n", + " Returns the homogeneous polynomial of ``f``.\n", + "\n", + " A homogeneous polynomial is a polynomial whose all monomials with\n", + " non-zero coefficients have the same total degree. If you only\n", + " want to check if a polynomial is homogeneous, then use\n", + " :func:`Poly.is_homogeneous`. If you want not only to check if a\n", + " polynomial is homogeneous but also compute its homogeneous order,\n", + " then use :func:`Poly.homogeneous_order`.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y, z\n", + "\n", + " >>> f = Poly(x**5 + 2*x**2*y**2 + 9*x*y**3)\n", + " >>> f.homogenize(z)\n", + " Poly(x**5 + 2*x**2*y**2*z + 9*x*y**3*z, x, y, z, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if not isinstance(s, Symbol):\n", + " raise TypeError(\"``Symbol`` expected, got %s\" % type(s))\n", + " if s in f.gens:\n", + " i = f.gens.index(s)\n", + " gens = f.gens\n", + " else:\n", + " i = len(f.gens)\n", + " gens = f.gens + (s,)\n", + " if hasattr(f.rep, 'homogenize'):\n", + " return f.per(f.rep.homogenize(i), gens=gens)\n", + " raise OperationNotSupported(f, 'homogeneous_order')\n", + "\n", + " def homogeneous_order(f):\n", + " \"\"\"\n", + " Returns the homogeneous order of ``f``.\n", + "\n", + " A homogeneous polynomial is a polynomial whose all monomials with\n", + " non-zero coefficients have the same total degree. This degree is\n", + " the homogeneous order of ``f``. If you only want to check if a\n", + " polynomial is homogeneous, then use :func:`Poly.is_homogeneous`.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> f = Poly(x**5 + 2*x**3*y**2 + 9*x*y**4)\n", + " >>> f.homogeneous_order()\n", + " 5\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'homogeneous_order'):\n", + " return f.rep.homogeneous_order()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'homogeneous_order')\n", + "\n", + " def LC(f, order=None):\n", + " \"\"\"\n", + " Returns the leading coefficient of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(4*x**3 + 2*x**2 + 3*x, x).LC()\n", + " 4\n", + "\n", + " \"\"\"\n", + " if order is not None:\n", + " return f.coeffs(order)[0]\n", + "\n", + " if hasattr(f.rep, 'LC'):\n", + " result = f.rep.LC()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'LC')\n", + "\n", + " return f.rep.dom.to_sympy(result)\n", + "\n", + " def TC(f):\n", + " \"\"\"\n", + " Returns the trailing coefficient of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**3 + 2*x**2 + 3*x, x).TC()\n", + " 0\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'TC'):\n", + " result = f.rep.TC()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'TC')\n", + "\n", + " return f.rep.dom.to_sympy(result)\n", + "\n", + " def EC(f, order=None):\n", + " \"\"\"\n", + " Returns the last non-zero coefficient of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**3 + 2*x**2 + 3*x, x).EC()\n", + " 3\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'coeffs'):\n", + " return f.coeffs(order)[-1]\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'EC')\n", + "\n", + " def coeff_monomial(f, monom):\n", + " \"\"\"\n", + " Returns the coefficient of ``monom`` in ``f`` if there, else None.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, exp\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> p = Poly(24*x*y*exp(8) + 23*x, x, y)\n", + "\n", + " >>> p.coeff_monomial(x)\n", + " 23\n", + " >>> p.coeff_monomial(y)\n", + " 0\n", + " >>> p.coeff_monomial(x*y)\n", + " 24*exp(8)\n", + "\n", + " Note that ``Expr.coeff()`` behaves differently, collecting terms\n", + " if possible; the Poly must be converted to an Expr to use that\n", + " method, however:\n", + "\n", + " >>> p.as_expr().coeff(x)\n", + " 24*y*exp(8) + 23\n", + " >>> p.as_expr().coeff(y)\n", + " 24*x*exp(8)\n", + " >>> p.as_expr().coeff(x*y)\n", + " 24*exp(8)\n", + "\n", + " See Also\n", + " ========\n", + " nth: more efficient query using exponents of the monomial's generators\n", + "\n", + " \"\"\"\n", + " return f.nth(*Monomial(monom, f.gens).exponents)\n", + "\n", + " def nth(f, *N):\n", + " \"\"\"\n", + " Returns the ``n``-th coefficient of ``f`` where ``N`` are the\n", + " exponents of the generators in the term of interest.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, sqrt\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**3 + 2*x**2 + 3*x, x).nth(2)\n", + " 2\n", + " >>> Poly(x**3 + 2*x*y**2 + y**2, x, y).nth(1, 2)\n", + " 2\n", + " >>> Poly(4*sqrt(x)*y)\n", + " Poly(4*y*(sqrt(x)), y, sqrt(x), domain='ZZ')\n", + " >>> _.nth(1, 1)\n", + " 4\n", + "\n", + " See Also\n", + " ========\n", + " coeff_monomial\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'nth'):\n", + " if len(N) != len(f.gens):\n", + " raise ValueError('exponent of each generator must be specified')\n", + " result = f.rep.nth(*list(map(int, N)))\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'nth')\n", + "\n", + " return f.rep.dom.to_sympy(result)\n", + "\n", + " def coeff(f, x, n=1, right=False):\n", + " # the semantics of coeff_monomial and Expr.coeff are different;\n", + " # if someone is working with a Poly, they should be aware of the\n", + " # differences and chose the method best suited for the query.\n", + " # Alternatively, a pure-polys method could be written here but\n", + " # at this time the ``right`` keyword would be ignored because Poly\n", + " # doesn't work with non-commutatives.\n", + " raise NotImplementedError(\n", + " 'Either convert to Expr with `as_expr` method '\n", + " 'to use Expr\\'s coeff method or else use the '\n", + " '`coeff_monomial` method of Polys.')\n", + "\n", + " def LM(f, order=None):\n", + " \"\"\"\n", + " Returns the leading monomial of ``f``.\n", + "\n", + " The Leading monomial signifies the monomial having\n", + " the highest power of the principal generator in the\n", + " expression f.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(4*x**2 + 2*x*y**2 + x*y + 3*y, x, y).LM()\n", + " x**2*y**0\n", + "\n", + " \"\"\"\n", + " return Monomial(f.monoms(order)[0], f.gens)\n", + "\n", + " def EM(f, order=None):\n", + " \"\"\"\n", + " Returns the last non-zero monomial of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(4*x**2 + 2*x*y**2 + x*y + 3*y, x, y).EM()\n", + " x**0*y**1\n", + "\n", + " \"\"\"\n", + " return Monomial(f.monoms(order)[-1], f.gens)\n", + "\n", + " def LT(f, order=None):\n", + " \"\"\"\n", + " Returns the leading term of ``f``.\n", + "\n", + " The Leading term signifies the term having\n", + " the highest power of the principal generator in the\n", + " expression f along with its coefficient.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(4*x**2 + 2*x*y**2 + x*y + 3*y, x, y).LT()\n", + " (x**2*y**0, 4)\n", + "\n", + " \"\"\"\n", + " monom, coeff = f.terms(order)[0]\n", + " return Monomial(monom, f.gens), coeff\n", + "\n", + " def ET(f, order=None):\n", + " \"\"\"\n", + " Returns the last non-zero term of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(4*x**2 + 2*x*y**2 + x*y + 3*y, x, y).ET()\n", + " (x**0*y**1, 3)\n", + "\n", + " \"\"\"\n", + " monom, coeff = f.terms(order)[-1]\n", + " return Monomial(monom, f.gens), coeff\n", + "\n", + " def max_norm(f):\n", + " \"\"\"\n", + " Returns maximum norm of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(-x**2 + 2*x - 3, x).max_norm()\n", + " 3\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'max_norm'):\n", + " result = f.rep.max_norm()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'max_norm')\n", + "\n", + " return f.rep.dom.to_sympy(result)\n", + "\n", + " def l1_norm(f):\n", + " \"\"\"\n", + " Returns l1 norm of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(-x**2 + 2*x - 3, x).l1_norm()\n", + " 6\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'l1_norm'):\n", + " result = f.rep.l1_norm()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'l1_norm')\n", + "\n", + " return f.rep.dom.to_sympy(result)\n", + "\n", + " def clear_denoms(self, convert=False):\n", + " \"\"\"\n", + " Clear denominators, but keep the ground domain.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, S, QQ\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> f = Poly(x/2 + S(1)/3, x, domain=QQ)\n", + "\n", + " >>> f.clear_denoms()\n", + " (6, Poly(3*x + 2, x, domain='QQ'))\n", + " >>> f.clear_denoms(convert=True)\n", + " (6, Poly(3*x + 2, x, domain='ZZ'))\n", + "\n", + " \"\"\"\n", + " f = self\n", + "\n", + " if not f.rep.dom.is_Field:\n", + " return S.One, f\n", + "\n", + " dom = f.get_domain()\n", + " if dom.has_assoc_Ring:\n", + " dom = f.rep.dom.get_ring()\n", + "\n", + " if hasattr(f.rep, 'clear_denoms'):\n", + " coeff, result = f.rep.clear_denoms()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'clear_denoms')\n", + "\n", + " coeff, f = dom.to_sympy(coeff), f.per(result)\n", + "\n", + " if not convert or not dom.has_assoc_Ring:\n", + " return coeff, f\n", + " else:\n", + " return coeff, f.to_ring()\n", + "\n", + " def rat_clear_denoms(self, g):\n", + " \"\"\"\n", + " Clear denominators in a rational function ``f/g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> f = Poly(x**2/y + 1, x)\n", + " >>> g = Poly(x**3 + y, x)\n", + "\n", + " >>> p, q = f.rat_clear_denoms(g)\n", + "\n", + " >>> p\n", + " Poly(x**2 + y, x, domain='ZZ[y]')\n", + " >>> q\n", + " Poly(y*x**3 + y**2, x, domain='ZZ[y]')\n", + "\n", + " \"\"\"\n", + " f = self\n", + "\n", + " dom, per, f, g = f._unify(g)\n", + "\n", + " f = per(f)\n", + " g = per(g)\n", + "\n", + " if not (dom.is_Field and dom.has_assoc_Ring):\n", + " return f, g\n", + "\n", + " a, f = f.clear_denoms(convert=True)\n", + " b, g = g.clear_denoms(convert=True)\n", + "\n", + " f = f.mul_ground(b)\n", + " g = g.mul_ground(a)\n", + "\n", + " return f, g\n", + "\n", + " def integrate(self, *specs, **args):\n", + " \"\"\"\n", + " Computes indefinite integral of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + 2*x + 1, x).integrate()\n", + " Poly(1/3*x**3 + x**2 + x, x, domain='QQ')\n", + "\n", + " >>> Poly(x*y**2 + x, x, y).integrate((0, 1), (1, 0))\n", + " Poly(1/2*x**2*y**2 + 1/2*x**2, x, y, domain='QQ')\n", + "\n", + " \"\"\"\n", + " f = self\n", + "\n", + " if args.get('auto', True) and f.rep.dom.is_Ring:\n", + " f = f.to_field()\n", + "\n", + " if hasattr(f.rep, 'integrate'):\n", + " if not specs:\n", + " return f.per(f.rep.integrate(m=1))\n", + "\n", + " rep = f.rep\n", + "\n", + " for spec in specs:\n", + " if type(spec) is tuple:\n", + " gen, m = spec\n", + " else:\n", + " gen, m = spec, 1\n", + "\n", + " rep = rep.integrate(int(m), f._gen_to_level(gen))\n", + "\n", + " return f.per(rep)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'integrate')\n", + "\n", + " def diff(f, *specs, **kwargs):\n", + " \"\"\"\n", + " Computes partial derivative of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + 2*x + 1, x).diff()\n", + " Poly(2*x + 2, x, domain='ZZ')\n", + "\n", + " >>> Poly(x*y**2 + x, x, y).diff((0, 0), (1, 1))\n", + " Poly(2*x*y, x, y, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if not kwargs.get('evaluate', True):\n", + " return Derivative(f, *specs, **kwargs)\n", + "\n", + " if hasattr(f.rep, 'diff'):\n", + " if not specs:\n", + " return f.per(f.rep.diff(m=1))\n", + "\n", + " rep = f.rep\n", + "\n", + " for spec in specs:\n", + " if type(spec) is tuple:\n", + " gen, m = spec\n", + " else:\n", + " gen, m = spec, 1\n", + "\n", + " rep = rep.diff(int(m), f._gen_to_level(gen))\n", + "\n", + " return f.per(rep)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'diff')\n", + "\n", + " _eval_derivative = diff\n", + "\n", + " def eval(self, x, a=None, auto=True):\n", + " \"\"\"\n", + " Evaluate ``f`` at ``a`` in the given variable.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y, z\n", + "\n", + " >>> Poly(x**2 + 2*x + 3, x).eval(2)\n", + " 11\n", + "\n", + " >>> Poly(2*x*y + 3*x + y + 2, x, y).eval(x, 2)\n", + " Poly(5*y + 8, y, domain='ZZ')\n", + "\n", + " >>> f = Poly(2*x*y + 3*x + y + 2*z, x, y, z)\n", + "\n", + " >>> f.eval({x: 2})\n", + " Poly(5*y + 2*z + 6, y, z, domain='ZZ')\n", + " >>> f.eval({x: 2, y: 5})\n", + " Poly(2*z + 31, z, domain='ZZ')\n", + " >>> f.eval({x: 2, y: 5, z: 7})\n", + " 45\n", + "\n", + " >>> f.eval((2, 5))\n", + " Poly(2*z + 31, z, domain='ZZ')\n", + " >>> f(2, 5)\n", + " Poly(2*z + 31, z, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " f = self\n", + "\n", + " if a is None:\n", + " if isinstance(x, dict):\n", + " mapping = x\n", + "\n", + " for gen, value in mapping.items():\n", + " f = f.eval(gen, value)\n", + "\n", + " return f\n", + " elif isinstance(x, (tuple, list)):\n", + " values = x\n", + "\n", + " if len(values) > len(f.gens):\n", + " raise ValueError(\"too many values provided\")\n", + "\n", + " for gen, value in zip(f.gens, values):\n", + " f = f.eval(gen, value)\n", + "\n", + " return f\n", + " else:\n", + " j, a = 0, x\n", + " else:\n", + " j = f._gen_to_level(x)\n", + "\n", + " if not hasattr(f.rep, 'eval'): # pragma: no cover\n", + " raise OperationNotSupported(f, 'eval')\n", + "\n", + " try:\n", + " result = f.rep.eval(a, j)\n", + " except CoercionFailed:\n", + " if not auto:\n", + " raise DomainError(\"can't evaluate at %s in %s\" % (a, f.rep.dom))\n", + " else:\n", + " a_domain, [a] = construct_domain([a])\n", + " new_domain = f.get_domain().unify_with_symbols(a_domain, f.gens)\n", + "\n", + " f = f.set_domain(new_domain)\n", + " a = new_domain.convert(a, a_domain)\n", + "\n", + " result = f.rep.eval(a, j)\n", + "\n", + " return f.per(result, remove=j)\n", + "\n", + " def __call__(f, *values):\n", + " \"\"\"\n", + " Evaluate ``f`` at the give values.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y, z\n", + "\n", + " >>> f = Poly(2*x*y + 3*x + y + 2*z, x, y, z)\n", + "\n", + " >>> f(2)\n", + " Poly(5*y + 2*z + 6, y, z, domain='ZZ')\n", + " >>> f(2, 5)\n", + " Poly(2*z + 31, z, domain='ZZ')\n", + " >>> f(2, 5, 7)\n", + " 45\n", + "\n", + " \"\"\"\n", + " return f.eval(values)\n", + "\n", + " def half_gcdex(f, g, auto=True):\n", + " \"\"\"\n", + " Half extended Euclidean algorithm of ``f`` and ``g``.\n", + "\n", + " Returns ``(s, h)`` such that ``h = gcd(f, g)`` and ``s*f = h (mod g)``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> f = x**4 - 2*x**3 - 6*x**2 + 12*x + 15\n", + " >>> g = x**3 + x**2 - 4*x - 4\n", + "\n", + " >>> Poly(f).half_gcdex(Poly(g))\n", + " (Poly(-1/5*x + 3/5, x, domain='QQ'), Poly(x + 1, x, domain='QQ'))\n", + "\n", + " \"\"\"\n", + " dom, per, F, G = f._unify(g)\n", + "\n", + " if auto and dom.is_Ring:\n", + " F, G = F.to_field(), G.to_field()\n", + "\n", + " if hasattr(f.rep, 'half_gcdex'):\n", + " s, h = F.half_gcdex(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'half_gcdex')\n", + "\n", + " return per(s), per(h)\n", + "\n", + " def gcdex(f, g, auto=True):\n", + " \"\"\"\n", + " Extended Euclidean algorithm of ``f`` and ``g``.\n", + "\n", + " Returns ``(s, t, h)`` such that ``h = gcd(f, g)`` and ``s*f + t*g = h``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> f = x**4 - 2*x**3 - 6*x**2 + 12*x + 15\n", + " >>> g = x**3 + x**2 - 4*x - 4\n", + "\n", + " >>> Poly(f).gcdex(Poly(g))\n", + " (Poly(-1/5*x + 3/5, x, domain='QQ'),\n", + " Poly(1/5*x**2 - 6/5*x + 2, x, domain='QQ'),\n", + " Poly(x + 1, x, domain='QQ'))\n", + "\n", + " \"\"\"\n", + " dom, per, F, G = f._unify(g)\n", + "\n", + " if auto and dom.is_Ring:\n", + " F, G = F.to_field(), G.to_field()\n", + "\n", + " if hasattr(f.rep, 'gcdex'):\n", + " s, t, h = F.gcdex(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'gcdex')\n", + "\n", + " return per(s), per(t), per(h)\n", + "\n", + " def invert(f, g, auto=True):\n", + " \"\"\"\n", + " Invert ``f`` modulo ``g`` when possible.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 1, x).invert(Poly(2*x - 1, x))\n", + " Poly(-4/3, x, domain='QQ')\n", + "\n", + " >>> Poly(x**2 - 1, x).invert(Poly(x - 1, x))\n", + " Traceback (most recent call last):\n", + " ...\n", + " NotInvertible: zero divisor\n", + "\n", + " \"\"\"\n", + " dom, per, F, G = f._unify(g)\n", + "\n", + " if auto and dom.is_Ring:\n", + " F, G = F.to_field(), G.to_field()\n", + "\n", + " if hasattr(f.rep, 'invert'):\n", + " result = F.invert(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'invert')\n", + "\n", + " return per(result)\n", + "\n", + " def revert(f, n):\n", + " \"\"\"\n", + " Compute ``f**(-1)`` mod ``x**n``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(1, x).revert(2)\n", + " Poly(1, x, domain='ZZ')\n", + "\n", + " >>> Poly(1 + x, x).revert(1)\n", + " Poly(1, x, domain='ZZ')\n", + "\n", + " >>> Poly(x**2 - 1, x).revert(1)\n", + " Traceback (most recent call last):\n", + " ...\n", + " NotReversible: only unity is reversible in a ring\n", + "\n", + " >>> Poly(1/x, x).revert(1)\n", + " Traceback (most recent call last):\n", + " ...\n", + " PolynomialError: 1/x contains an element of the generators set\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'revert'):\n", + " result = f.rep.revert(int(n))\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'revert')\n", + "\n", + " return f.per(result)\n", + "\n", + " def subresultants(f, g):\n", + " \"\"\"\n", + " Computes the subresultant PRS of ``f`` and ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 1, x).subresultants(Poly(x**2 - 1, x))\n", + " [Poly(x**2 + 1, x, domain='ZZ'),\n", + " Poly(x**2 - 1, x, domain='ZZ'),\n", + " Poly(-2, x, domain='ZZ')]\n", + "\n", + " \"\"\"\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'subresultants'):\n", + " result = F.subresultants(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'subresultants')\n", + "\n", + " return list(map(per, result))\n", + "\n", + " def resultant(f, g, includePRS=False):\n", + " \"\"\"\n", + " Computes the resultant of ``f`` and ``g`` via PRS.\n", + "\n", + " If includePRS=True, it includes the subresultant PRS in the result.\n", + " Because the PRS is used to calculate the resultant, this is more\n", + " efficient than calling :func:`subresultants` separately.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> f = Poly(x**2 + 1, x)\n", + "\n", + " >>> f.resultant(Poly(x**2 - 1, x))\n", + " 4\n", + " >>> f.resultant(Poly(x**2 - 1, x), includePRS=True)\n", + " (4, [Poly(x**2 + 1, x, domain='ZZ'), Poly(x**2 - 1, x, domain='ZZ'),\n", + " Poly(-2, x, domain='ZZ')])\n", + "\n", + " \"\"\"\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'resultant'):\n", + " if includePRS:\n", + " result, R = F.resultant(G, includePRS=includePRS)\n", + " else:\n", + " result = F.resultant(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'resultant')\n", + "\n", + " if includePRS:\n", + " return (per(result, remove=0), list(map(per, R)))\n", + " return per(result, remove=0)\n", + "\n", + " def discriminant(f):\n", + " \"\"\"\n", + " Computes the discriminant of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + 2*x + 3, x).discriminant()\n", + " -8\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'discriminant'):\n", + " result = f.rep.discriminant()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'discriminant')\n", + "\n", + " return f.per(result, remove=0)\n", + "\n", + " def dispersionset(f, g=None):\n", + " r\"\"\"Compute the *dispersion set* of two polynomials.\n", + "\n", + " For two polynomials `f(x)` and `g(x)` with `\\deg f > 0`\n", + " and `\\deg g > 0` the dispersion set `\\operatorname{J}(f, g)` is defined as:\n", + "\n", + " .. math::\n", + " \\operatorname{J}(f, g)\n", + " & := \\{a \\in \\mathbb{N}_0 | \\gcd(f(x), g(x+a)) \\neq 1\\} \\\\\n", + " & = \\{a \\in \\mathbb{N}_0 | \\deg \\gcd(f(x), g(x+a)) \\geq 1\\}\n", + "\n", + " For a single polynomial one defines `\\operatorname{J}(f) := \\operatorname{J}(f, f)`.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import poly\n", + " >>> from sympy.polys.dispersion import dispersion, dispersionset\n", + " >>> from sympy.abc import x\n", + "\n", + " Dispersion set and dispersion of a simple polynomial:\n", + "\n", + " >>> fp = poly((x - 3)*(x + 3), x)\n", + " >>> sorted(dispersionset(fp))\n", + " [0, 6]\n", + " >>> dispersion(fp)\n", + " 6\n", + "\n", + " Note that the definition of the dispersion is not symmetric:\n", + "\n", + " >>> fp = poly(x**4 - 3*x**2 + 1, x)\n", + " >>> gp = fp.shift(-3)\n", + " >>> sorted(dispersionset(fp, gp))\n", + " [2, 3, 4]\n", + " >>> dispersion(fp, gp)\n", + " 4\n", + " >>> sorted(dispersionset(gp, fp))\n", + " []\n", + " >>> dispersion(gp, fp)\n", + " -oo\n", + "\n", + " Computing the dispersion also works over field extensions:\n", + "\n", + " >>> from sympy import sqrt\n", + " >>> fp = poly(x**2 + sqrt(5)*x - 1, x, domain='QQ')\n", + " >>> gp = poly(x**2 + (2 + sqrt(5))*x + sqrt(5), x, domain='QQ')\n", + " >>> sorted(dispersionset(fp, gp))\n", + " [2]\n", + " >>> sorted(dispersionset(gp, fp))\n", + " [1, 4]\n", + "\n", + " We can even perform the computations for polynomials\n", + " having symbolic coefficients:\n", + "\n", + " >>> from sympy.abc import a\n", + " >>> fp = poly(4*x**4 + (4*a + 8)*x**3 + (a**2 + 6*a + 4)*x**2 + (a**2 + 2*a)*x, x)\n", + " >>> sorted(dispersionset(fp))\n", + " [0, 1]\n", + "\n", + " See Also\n", + " ========\n", + "\n", + " dispersion\n", + "\n", + " References\n", + " ==========\n", + "\n", + " 1. [ManWright94]_\n", + " 2. [Koepf98]_\n", + " 3. [Abramov71]_\n", + " 4. [Man93]_\n", + " \"\"\"\n", + " from sympy.polys.dispersion import dispersionset\n", + " return dispersionset(f, g)\n", + "\n", + " def dispersion(f, g=None):\n", + " r\"\"\"Compute the *dispersion* of polynomials.\n", + "\n", + " For two polynomials `f(x)` and `g(x)` with `\\deg f > 0`\n", + " and `\\deg g > 0` the dispersion `\\operatorname{dis}(f, g)` is defined as:\n", + "\n", + " .. math::\n", + " \\operatorname{dis}(f, g)\n", + " & := \\max\\{ J(f,g) \\cup \\{0\\} \\} \\\\\n", + " & = \\max\\{ \\{a \\in \\mathbb{N} | \\gcd(f(x), g(x+a)) \\neq 1\\} \\cup \\{0\\} \\}\n", + "\n", + " and for a single polynomial `\\operatorname{dis}(f) := \\operatorname{dis}(f, f)`.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import poly\n", + " >>> from sympy.polys.dispersion import dispersion, dispersionset\n", + " >>> from sympy.abc import x\n", + "\n", + " Dispersion set and dispersion of a simple polynomial:\n", + "\n", + " >>> fp = poly((x - 3)*(x + 3), x)\n", + " >>> sorted(dispersionset(fp))\n", + " [0, 6]\n", + " >>> dispersion(fp)\n", + " 6\n", + "\n", + " Note that the definition of the dispersion is not symmetric:\n", + "\n", + " >>> fp = poly(x**4 - 3*x**2 + 1, x)\n", + " >>> gp = fp.shift(-3)\n", + " >>> sorted(dispersionset(fp, gp))\n", + " [2, 3, 4]\n", + " >>> dispersion(fp, gp)\n", + " 4\n", + " >>> sorted(dispersionset(gp, fp))\n", + " []\n", + " >>> dispersion(gp, fp)\n", + " -oo\n", + "\n", + " Computing the dispersion also works over field extensions:\n", + "\n", + " >>> from sympy import sqrt\n", + " >>> fp = poly(x**2 + sqrt(5)*x - 1, x, domain='QQ')\n", + " >>> gp = poly(x**2 + (2 + sqrt(5))*x + sqrt(5), x, domain='QQ')\n", + " >>> sorted(dispersionset(fp, gp))\n", + " [2]\n", + " >>> sorted(dispersionset(gp, fp))\n", + " [1, 4]\n", + "\n", + " We can even perform the computations for polynomials\n", + " having symbolic coefficients:\n", + "\n", + " >>> from sympy.abc import a\n", + " >>> fp = poly(4*x**4 + (4*a + 8)*x**3 + (a**2 + 6*a + 4)*x**2 + (a**2 + 2*a)*x, x)\n", + " >>> sorted(dispersionset(fp))\n", + " [0, 1]\n", + "\n", + " See Also\n", + " ========\n", + "\n", + " dispersionset\n", + "\n", + " References\n", + " ==========\n", + "\n", + " 1. [ManWright94]_\n", + " 2. [Koepf98]_\n", + " 3. [Abramov71]_\n", + " 4. [Man93]_\n", + " \"\"\"\n", + " from sympy.polys.dispersion import dispersion\n", + " return dispersion(f, g)\n", + "\n", + " def cofactors(f, g):\n", + " \"\"\"\n", + " Returns the GCD of ``f`` and ``g`` and their cofactors.\n", + "\n", + " Returns polynomials ``(h, cff, cfg)`` such that ``h = gcd(f, g)``, and\n", + " ``cff = quo(f, h)`` and ``cfg = quo(g, h)`` are, so called, cofactors\n", + " of ``f`` and ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 1, x).cofactors(Poly(x**2 - 3*x + 2, x))\n", + " (Poly(x - 1, x, domain='ZZ'),\n", + " Poly(x + 1, x, domain='ZZ'),\n", + " Poly(x - 2, x, domain='ZZ'))\n", + "\n", + " \"\"\"\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'cofactors'):\n", + " h, cff, cfg = F.cofactors(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'cofactors')\n", + "\n", + " return per(h), per(cff), per(cfg)\n", + "\n", + " def gcd(f, g):\n", + " \"\"\"\n", + " Returns the polynomial GCD of ``f`` and ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 1, x).gcd(Poly(x**2 - 3*x + 2, x))\n", + " Poly(x - 1, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'gcd'):\n", + " result = F.gcd(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'gcd')\n", + "\n", + " return per(result)\n", + "\n", + " def lcm(f, g):\n", + " \"\"\"\n", + " Returns polynomial LCM of ``f`` and ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 1, x).lcm(Poly(x**2 - 3*x + 2, x))\n", + " Poly(x**3 - 2*x**2 - x + 2, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'lcm'):\n", + " result = F.lcm(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'lcm')\n", + "\n", + " return per(result)\n", + "\n", + " def trunc(f, p):\n", + " \"\"\"\n", + " Reduce ``f`` modulo a constant ``p``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(2*x**3 + 3*x**2 + 5*x + 7, x).trunc(3)\n", + " Poly(-x**3 - x + 1, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " p = f.rep.dom.convert(p)\n", + "\n", + " if hasattr(f.rep, 'trunc'):\n", + " result = f.rep.trunc(p)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'trunc')\n", + "\n", + " return f.per(result)\n", + "\n", + " def monic(self, auto=True):\n", + " \"\"\"\n", + " Divides all coefficients by ``LC(f)``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, ZZ\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(3*x**2 + 6*x + 9, x, domain=ZZ).monic()\n", + " Poly(x**2 + 2*x + 3, x, domain='QQ')\n", + "\n", + " >>> Poly(3*x**2 + 4*x + 2, x, domain=ZZ).monic()\n", + " Poly(x**2 + 4/3*x + 2/3, x, domain='QQ')\n", + "\n", + " \"\"\"\n", + " f = self\n", + "\n", + " if auto and f.rep.dom.is_Ring:\n", + " f = f.to_field()\n", + "\n", + " if hasattr(f.rep, 'monic'):\n", + " result = f.rep.monic()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'monic')\n", + "\n", + " return f.per(result)\n", + "\n", + " def content(f):\n", + " \"\"\"\n", + " Returns the GCD of polynomial coefficients.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(6*x**2 + 8*x + 12, x).content()\n", + " 2\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'content'):\n", + " result = f.rep.content()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'content')\n", + "\n", + " return f.rep.dom.to_sympy(result)\n", + "\n", + " def primitive(f):\n", + " \"\"\"\n", + " Returns the content and a primitive form of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(2*x**2 + 8*x + 12, x).primitive()\n", + " (2, Poly(x**2 + 4*x + 6, x, domain='ZZ'))\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'primitive'):\n", + " cont, result = f.rep.primitive()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'primitive')\n", + "\n", + " return f.rep.dom.to_sympy(cont), f.per(result)\n", + "\n", + " def compose(f, g):\n", + " \"\"\"\n", + " Computes the functional composition of ``f`` and ``g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + x, x).compose(Poly(x - 1, x))\n", + " Poly(x**2 - x, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " _, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(f.rep, 'compose'):\n", + " result = F.compose(G)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'compose')\n", + "\n", + " return per(result)\n", + "\n", + " def decompose(f):\n", + " \"\"\"\n", + " Computes a functional decomposition of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**4 + 2*x**3 - x - 1, x, domain='ZZ').decompose()\n", + " [Poly(x**2 - x - 1, x, domain='ZZ'), Poly(x**2 + x, x, domain='ZZ')]\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'decompose'):\n", + " result = f.rep.decompose()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'decompose')\n", + "\n", + " return list(map(f.per, result))\n", + "\n", + " def shift(f, a):\n", + " \"\"\"\n", + " Efficiently compute Taylor shift ``f(x + a)``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 2*x + 1, x).shift(2)\n", + " Poly(x**2 + 2*x + 1, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'shift'):\n", + " result = f.rep.shift(a)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'shift')\n", + "\n", + " return f.per(result)\n", + "\n", + " def transform(f, p, q):\n", + " \"\"\"\n", + " Efficiently evaluate the functional transformation ``q**n * f(p/q)``.\n", + "\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 2*x + 1, x).transform(Poly(x + 1, x), Poly(x - 1, x))\n", + " Poly(4, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " P, Q = p.unify(q)\n", + " F, P = f.unify(P)\n", + " F, Q = F.unify(Q)\n", + "\n", + " if hasattr(F.rep, 'transform'):\n", + " result = F.rep.transform(P.rep, Q.rep)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(F, 'transform')\n", + "\n", + " return F.per(result)\n", + "\n", + " def sturm(self, auto=True):\n", + " \"\"\"\n", + " Computes the Sturm sequence of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**3 - 2*x**2 + x - 3, x).sturm()\n", + " [Poly(x**3 - 2*x**2 + x - 3, x, domain='QQ'),\n", + " Poly(3*x**2 - 4*x + 1, x, domain='QQ'),\n", + " Poly(2/9*x + 25/9, x, domain='QQ'),\n", + " Poly(-2079/4, x, domain='QQ')]\n", + "\n", + " \"\"\"\n", + " f = self\n", + "\n", + " if auto and f.rep.dom.is_Ring:\n", + " f = f.to_field()\n", + "\n", + " if hasattr(f.rep, 'sturm'):\n", + " result = f.rep.sturm()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'sturm')\n", + "\n", + " return list(map(f.per, result))\n", + "\n", + " def gff_list(f):\n", + " \"\"\"\n", + " Computes greatest factorial factorization of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> f = x**5 + 2*x**4 - x**3 - 2*x**2\n", + "\n", + " >>> Poly(f).gff_list()\n", + " [(Poly(x, x, domain='ZZ'), 1), (Poly(x + 2, x, domain='ZZ'), 4)]\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'gff_list'):\n", + " result = f.rep.gff_list()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'gff_list')\n", + "\n", + " return [(f.per(g), k) for g, k in result]\n", + "\n", + " def norm(f):\n", + " \"\"\"\n", + " Computes the product, ``Norm(f)``, of the conjugates of\n", + " a polynomial ``f`` defined over a number field ``K``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, sqrt\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> a, b = sqrt(2), sqrt(3)\n", + "\n", + " A polynomial over a quadratic extension.\n", + " Two conjugates x - a and x + a.\n", + "\n", + " >>> f = Poly(x - a, x, extension=a)\n", + " >>> f.norm()\n", + " Poly(x**2 - 2, x, domain='QQ')\n", + "\n", + " A polynomial over a quartic extension.\n", + " Four conjugates x - a, x - a, x + a and x + a.\n", + "\n", + " >>> f = Poly(x - a, x, extension=(a, b))\n", + " >>> f.norm()\n", + " Poly(x**4 - 4*x**2 + 4, x, domain='QQ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'norm'):\n", + " r = f.rep.norm()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'norm')\n", + "\n", + " return f.per(r)\n", + "\n", + " def sqf_norm(f):\n", + " \"\"\"\n", + " Computes square-free norm of ``f``.\n", + "\n", + " Returns ``s``, ``f``, ``r``, such that ``g(x) = f(x-sa)`` and\n", + " ``r(x) = Norm(g(x))`` is a square-free polynomial over ``K``,\n", + " where ``a`` is the algebraic extension of the ground domain.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, sqrt\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> s, f, r = Poly(x**2 + 1, x, extension=[sqrt(3)]).sqf_norm()\n", + "\n", + " >>> s\n", + " 1\n", + " >>> f\n", + " Poly(x**2 - 2*sqrt(3)*x + 4, x, domain='QQ')\n", + " >>> r\n", + " Poly(x**4 - 4*x**2 + 16, x, domain='QQ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'sqf_norm'):\n", + " s, g, r = f.rep.sqf_norm()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'sqf_norm')\n", + "\n", + " return s, f.per(g), f.per(r)\n", + "\n", + " def sqf_part(f):\n", + " \"\"\"\n", + " Computes square-free part of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**3 - 3*x - 2, x).sqf_part()\n", + " Poly(x**2 - x - 2, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'sqf_part'):\n", + " result = f.rep.sqf_part()\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'sqf_part')\n", + "\n", + " return f.per(result)\n", + "\n", + " def sqf_list(f, all=False):\n", + " \"\"\"\n", + " Returns a list of square-free factors of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> f = 2*x**5 + 16*x**4 + 50*x**3 + 76*x**2 + 56*x + 16\n", + "\n", + " >>> Poly(f).sqf_list()\n", + " (2, [(Poly(x + 1, x, domain='ZZ'), 2),\n", + " (Poly(x + 2, x, domain='ZZ'), 3)])\n", + "\n", + " >>> Poly(f).sqf_list(all=True)\n", + " (2, [(Poly(1, x, domain='ZZ'), 1),\n", + " (Poly(x + 1, x, domain='ZZ'), 2),\n", + " (Poly(x + 2, x, domain='ZZ'), 3)])\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'sqf_list'):\n", + " coeff, factors = f.rep.sqf_list(all)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'sqf_list')\n", + "\n", + " return f.rep.dom.to_sympy(coeff), [(f.per(g), k) for g, k in factors]\n", + "\n", + " def sqf_list_include(f, all=False):\n", + " \"\"\"\n", + " Returns a list of square-free factors of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, expand\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> f = expand(2*(x + 1)**3*x**4)\n", + " >>> f\n", + " 2*x**7 + 6*x**6 + 6*x**5 + 2*x**4\n", + "\n", + " >>> Poly(f).sqf_list_include()\n", + " [(Poly(2, x, domain='ZZ'), 1),\n", + " (Poly(x + 1, x, domain='ZZ'), 3),\n", + " (Poly(x, x, domain='ZZ'), 4)]\n", + "\n", + " >>> Poly(f).sqf_list_include(all=True)\n", + " [(Poly(2, x, domain='ZZ'), 1),\n", + " (Poly(1, x, domain='ZZ'), 2),\n", + " (Poly(x + 1, x, domain='ZZ'), 3),\n", + " (Poly(x, x, domain='ZZ'), 4)]\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'sqf_list_include'):\n", + " factors = f.rep.sqf_list_include(all)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'sqf_list_include')\n", + "\n", + " return [(f.per(g), k) for g, k in factors]\n", + "\n", + " def factor_list(f):\n", + " \"\"\"\n", + " Returns a list of irreducible factors of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> f = 2*x**5 + 2*x**4*y + 4*x**3 + 4*x**2*y + 2*x + 2*y\n", + "\n", + " >>> Poly(f).factor_list()\n", + " (2, [(Poly(x + y, x, y, domain='ZZ'), 1),\n", + " (Poly(x**2 + 1, x, y, domain='ZZ'), 2)])\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'factor_list'):\n", + " try:\n", + " coeff, factors = f.rep.factor_list()\n", + " except DomainError:\n", + " return S.One, [(f, 1)]\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'factor_list')\n", + "\n", + " return f.rep.dom.to_sympy(coeff), [(f.per(g), k) for g, k in factors]\n", + "\n", + " def factor_list_include(f):\n", + " \"\"\"\n", + " Returns a list of irreducible factors of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> f = 2*x**5 + 2*x**4*y + 4*x**3 + 4*x**2*y + 2*x + 2*y\n", + "\n", + " >>> Poly(f).factor_list_include()\n", + " [(Poly(2*x + 2*y, x, y, domain='ZZ'), 1),\n", + " (Poly(x**2 + 1, x, y, domain='ZZ'), 2)]\n", + "\n", + " \"\"\"\n", + " if hasattr(f.rep, 'factor_list_include'):\n", + " try:\n", + " factors = f.rep.factor_list_include()\n", + " except DomainError:\n", + " return [(f, 1)]\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'factor_list_include')\n", + "\n", + " return [(f.per(g), k) for g, k in factors]\n", + "\n", + " def intervals(f, all=False, eps=None, inf=None, sup=None, fast=False, sqf=False):\n", + " \"\"\"\n", + " Compute isolating intervals for roots of ``f``.\n", + "\n", + " For real roots the Vincent-Akritas-Strzebonski (VAS) continued fractions method is used.\n", + "\n", + " References\n", + " ==========\n", + " .. [#] Alkiviadis G. Akritas and Adam W. Strzebonski: A Comparative Study of Two Real Root\n", + " Isolation Methods . Nonlinear Analysis: Modelling and Control, Vol. 10, No. 4, 297-304, 2005.\n", + " .. [#] Alkiviadis G. Akritas, Adam W. Strzebonski and Panagiotis S. Vigklas: Improving the\n", + " Performance of the Continued Fractions Method Using new Bounds of Positive Roots. Nonlinear\n", + " Analysis: Modelling and Control, Vol. 13, No. 3, 265-279, 2008.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 3, x).intervals()\n", + " [((-2, -1), 1), ((1, 2), 1)]\n", + " >>> Poly(x**2 - 3, x).intervals(eps=1e-2)\n", + " [((-26/15, -19/11), 1), ((19/11, 26/15), 1)]\n", + "\n", + " \"\"\"\n", + " if eps is not None:\n", + " eps = QQ.convert(eps)\n", + "\n", + " if eps <= 0:\n", + " raise ValueError(\"'eps' must be a positive rational\")\n", + "\n", + " if inf is not None:\n", + " inf = QQ.convert(inf)\n", + " if sup is not None:\n", + " sup = QQ.convert(sup)\n", + "\n", + " if hasattr(f.rep, 'intervals'):\n", + " result = f.rep.intervals(\n", + " all=all, eps=eps, inf=inf, sup=sup, fast=fast, sqf=sqf)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'intervals')\n", + "\n", + " if sqf:\n", + " def _real(interval):\n", + " s, t = interval\n", + " return (QQ.to_sympy(s), QQ.to_sympy(t))\n", + "\n", + " if not all:\n", + " return list(map(_real, result))\n", + "\n", + " def _complex(rectangle):\n", + " (u, v), (s, t) = rectangle\n", + " return (QQ.to_sympy(u) + I*QQ.to_sympy(v),\n", + " QQ.to_sympy(s) + I*QQ.to_sympy(t))\n", + "\n", + " real_part, complex_part = result\n", + "\n", + " return list(map(_real, real_part)), list(map(_complex, complex_part))\n", + " else:\n", + " def _real(interval):\n", + " (s, t), k = interval\n", + " return ((QQ.to_sympy(s), QQ.to_sympy(t)), k)\n", + "\n", + " if not all:\n", + " return list(map(_real, result))\n", + "\n", + " def _complex(rectangle):\n", + " ((u, v), (s, t)), k = rectangle\n", + " return ((QQ.to_sympy(u) + I*QQ.to_sympy(v),\n", + " QQ.to_sympy(s) + I*QQ.to_sympy(t)), k)\n", + "\n", + " real_part, complex_part = result\n", + "\n", + " return list(map(_real, real_part)), list(map(_complex, complex_part))\n", + "\n", + " def refine_root(f, s, t, eps=None, steps=None, fast=False, check_sqf=False):\n", + " \"\"\"\n", + " Refine an isolating interval of a root to the given precision.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 3, x).refine_root(1, 2, eps=1e-2)\n", + " (19/11, 26/15)\n", + "\n", + " \"\"\"\n", + " if check_sqf and not f.is_sqf:\n", + " raise PolynomialError(\"only square-free polynomials supported\")\n", + "\n", + " s, t = QQ.convert(s), QQ.convert(t)\n", + "\n", + " if eps is not None:\n", + " eps = QQ.convert(eps)\n", + "\n", + " if eps <= 0:\n", + " raise ValueError(\"'eps' must be a positive rational\")\n", + "\n", + " if steps is not None:\n", + " steps = int(steps)\n", + " elif eps is None:\n", + " steps = 1\n", + "\n", + " if hasattr(f.rep, 'refine_root'):\n", + " S, T = f.rep.refine_root(s, t, eps=eps, steps=steps, fast=fast)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'refine_root')\n", + "\n", + " return QQ.to_sympy(S), QQ.to_sympy(T)\n", + "\n", + " def count_roots(f, inf=None, sup=None):\n", + " \"\"\"\n", + " Return the number of roots of ``f`` in ``[inf, sup]`` interval.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly, I\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**4 - 4, x).count_roots(-3, 3)\n", + " 2\n", + " >>> Poly(x**4 - 4, x).count_roots(0, 1 + 3*I)\n", + " 1\n", + "\n", + " \"\"\"\n", + " inf_real, sup_real = True, True\n", + "\n", + " if inf is not None:\n", + " inf = sympify(inf)\n", + "\n", + " if inf is S.NegativeInfinity:\n", + " inf = None\n", + " else:\n", + " re, im = inf.as_real_imag()\n", + "\n", + " if not im:\n", + " inf = QQ.convert(inf)\n", + " else:\n", + " inf, inf_real = list(map(QQ.convert, (re, im))), False\n", + "\n", + " if sup is not None:\n", + " sup = sympify(sup)\n", + "\n", + " if sup is S.Infinity:\n", + " sup = None\n", + " else:\n", + " re, im = sup.as_real_imag()\n", + "\n", + " if not im:\n", + " sup = QQ.convert(sup)\n", + " else:\n", + " sup, sup_real = list(map(QQ.convert, (re, im))), False\n", + "\n", + " if inf_real and sup_real:\n", + " if hasattr(f.rep, 'count_real_roots'):\n", + " count = f.rep.count_real_roots(inf=inf, sup=sup)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'count_real_roots')\n", + " else:\n", + " if inf_real and inf is not None:\n", + " inf = (inf, QQ.zero)\n", + "\n", + " if sup_real and sup is not None:\n", + " sup = (sup, QQ.zero)\n", + "\n", + " if hasattr(f.rep, 'count_complex_roots'):\n", + " count = f.rep.count_complex_roots(inf=inf, sup=sup)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'count_complex_roots')\n", + "\n", + " return Integer(count)\n", + "\n", + " def root(f, index, radicals=True):\n", + " \"\"\"\n", + " Get an indexed root of a polynomial.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> f = Poly(2*x**3 - 7*x**2 + 4*x + 4)\n", + "\n", + " >>> f.root(0)\n", + " -1/2\n", + " >>> f.root(1)\n", + " 2\n", + " >>> f.root(2)\n", + " 2\n", + " >>> f.root(3)\n", + " Traceback (most recent call last):\n", + " ...\n", + " IndexError: root index out of [-3, 2] range, got 3\n", + "\n", + " >>> Poly(x**5 + x + 1).root(0)\n", + " CRootOf(x**3 - x**2 + 1, 0)\n", + "\n", + " \"\"\"\n", + " return sympy.polys.rootoftools.rootof(f, index, radicals=radicals)\n", + "\n", + " def real_roots(f, multiple=True, radicals=True):\n", + " \"\"\"\n", + " Return a list of real roots with multiplicities.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(2*x**3 - 7*x**2 + 4*x + 4).real_roots()\n", + " [-1/2, 2, 2]\n", + " >>> Poly(x**3 + x + 1).real_roots()\n", + " [CRootOf(x**3 + x + 1, 0)]\n", + "\n", + " \"\"\"\n", + " reals = sympy.polys.rootoftools.CRootOf.real_roots(f, radicals=radicals)\n", + "\n", + " if multiple:\n", + " return reals\n", + " else:\n", + " return group(reals, multiple=False)\n", + "\n", + " def all_roots(f, multiple=True, radicals=True):\n", + " \"\"\"\n", + " Return a list of real and complex roots with multiplicities.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(2*x**3 - 7*x**2 + 4*x + 4).all_roots()\n", + " [-1/2, 2, 2]\n", + " >>> Poly(x**3 + x + 1).all_roots()\n", + " [CRootOf(x**3 + x + 1, 0),\n", + " CRootOf(x**3 + x + 1, 1),\n", + " CRootOf(x**3 + x + 1, 2)]\n", + "\n", + " \"\"\"\n", + " roots = sympy.polys.rootoftools.CRootOf.all_roots(f, radicals=radicals)\n", + "\n", + " if multiple:\n", + " return roots\n", + " else:\n", + " return group(roots, multiple=False)\n", + "\n", + " def nroots(f, n=15, maxsteps=50, cleanup=True):\n", + " \"\"\"\n", + " Compute numerical approximations of roots of ``f``.\n", + "\n", + " Parameters\n", + " ==========\n", + "\n", + " n ... the number of digits to calculate\n", + " maxsteps ... the maximum number of iterations to do\n", + "\n", + " If the accuracy `n` cannot be reached in `maxsteps`, it will raise an\n", + " exception. You need to rerun with higher maxsteps.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 3).nroots(n=15)\n", + " [-1.73205080756888, 1.73205080756888]\n", + " >>> Poly(x**2 - 3).nroots(n=30)\n", + " [-1.73205080756887729352744634151, 1.73205080756887729352744634151]\n", + "\n", + " \"\"\"\n", + " from sympy.functions.elementary.complexes import sign\n", + " if f.is_multivariate:\n", + " raise MultivariatePolynomialError(\n", + " \"can't compute numerical roots of %s\" % f)\n", + "\n", + " if f.degree() <= 0:\n", + " return []\n", + "\n", + " # For integer and rational coefficients, convert them to integers only\n", + " # (for accuracy). Otherwise just try to convert the coefficients to\n", + " # mpmath.mpc and raise an exception if the conversion fails.\n", + " if f.rep.dom is ZZ:\n", + " coeffs = [int(coeff) for coeff in f.all_coeffs()]\n", + " elif f.rep.dom is QQ:\n", + " denoms = [coeff.q for coeff in f.all_coeffs()]\n", + " from sympy.core.numbers import ilcm\n", + " fac = ilcm(*denoms)\n", + " coeffs = [int(coeff*fac) for coeff in f.all_coeffs()]\n", + " else:\n", + " coeffs = [coeff.evalf(n=n).as_real_imag()\n", + " for coeff in f.all_coeffs()]\n", + " try:\n", + " coeffs = [mpmath.mpc(*coeff) for coeff in coeffs]\n", + " except TypeError:\n", + " raise DomainError(\"Numerical domain expected, got %s\" % \\\n", + " f.rep.dom)\n", + "\n", + " dps = mpmath.mp.dps\n", + " mpmath.mp.dps = n\n", + "\n", + " try:\n", + " # We need to add extra precision to guard against losing accuracy.\n", + " # 10 times the degree of the polynomial seems to work well.\n", + " roots = mpmath.polyroots(coeffs, maxsteps=maxsteps,\n", + " cleanup=cleanup, error=False, extraprec=f.degree()*10)\n", + "\n", + " # Mpmath puts real roots first, then complex ones (as does all_roots)\n", + " # so we make sure this convention holds here, too.\n", + " roots = list(map(sympify,\n", + " sorted(roots, key=lambda r: (1 if r.imag else 0, r.real, abs(r.imag), sign(r.imag)))))\n", + " except NoConvergence:\n", + " raise NoConvergence(\n", + " 'convergence to root failed; try n < %s or maxsteps > %s' % (\n", + " n, maxsteps))\n", + " finally:\n", + " mpmath.mp.dps = dps\n", + "\n", + " return roots\n", + "\n", + " def ground_roots(f):\n", + " \"\"\"\n", + " Compute roots of ``f`` by factorization in the ground domain.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**6 - 4*x**4 + 4*x**3 - x**2).ground_roots()\n", + " {0: 2, 1: 2}\n", + "\n", + " \"\"\"\n", + " if f.is_multivariate:\n", + " raise MultivariatePolynomialError(\n", + " \"can't compute ground roots of %s\" % f)\n", + "\n", + " roots = {}\n", + "\n", + " for factor, k in f.factor_list()[1]:\n", + " if factor.is_linear:\n", + " a, b = factor.all_coeffs()\n", + " roots[-b/a] = k\n", + "\n", + " return roots\n", + "\n", + " def nth_power_roots_poly(f, n):\n", + " \"\"\"\n", + " Construct a polynomial with n-th powers of roots of ``f``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> f = Poly(x**4 - x**2 + 1)\n", + "\n", + " >>> f.nth_power_roots_poly(2)\n", + " Poly(x**4 - 2*x**3 + 3*x**2 - 2*x + 1, x, domain='ZZ')\n", + " >>> f.nth_power_roots_poly(3)\n", + " Poly(x**4 + 2*x**2 + 1, x, domain='ZZ')\n", + " >>> f.nth_power_roots_poly(4)\n", + " Poly(x**4 + 2*x**3 + 3*x**2 + 2*x + 1, x, domain='ZZ')\n", + " >>> f.nth_power_roots_poly(12)\n", + " Poly(x**4 - 4*x**3 + 6*x**2 - 4*x + 1, x, domain='ZZ')\n", + "\n", + " \"\"\"\n", + " if f.is_multivariate:\n", + " raise MultivariatePolynomialError(\n", + " \"must be a univariate polynomial\")\n", + "\n", + " N = sympify(n)\n", + "\n", + " if N.is_Integer and N >= 1:\n", + " n = int(N)\n", + " else:\n", + " raise ValueError(\"'n' must an integer and n >= 1, got %s\" % n)\n", + "\n", + " x = f.gen\n", + " t = Dummy('t')\n", + "\n", + " r = f.resultant(f.__class__.from_expr(x**n - t, x, t))\n", + "\n", + " return r.replace(t, x)\n", + "\n", + " def cancel(f, g, include=False):\n", + " \"\"\"\n", + " Cancel common factors in a rational function ``f/g``.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(2*x**2 - 2, x).cancel(Poly(x**2 - 2*x + 1, x))\n", + " (1, Poly(2*x + 2, x, domain='ZZ'), Poly(x - 1, x, domain='ZZ'))\n", + "\n", + " >>> Poly(2*x**2 - 2, x).cancel(Poly(x**2 - 2*x + 1, x), include=True)\n", + " (Poly(2*x + 2, x, domain='ZZ'), Poly(x - 1, x, domain='ZZ'))\n", + "\n", + " \"\"\"\n", + " dom, per, F, G = f._unify(g)\n", + "\n", + " if hasattr(F, 'cancel'):\n", + " result = F.cancel(G, include=include)\n", + " else: # pragma: no cover\n", + " raise OperationNotSupported(f, 'cancel')\n", + "\n", + " if not include:\n", + " if dom.has_assoc_Ring:\n", + " dom = dom.get_ring()\n", + "\n", + " cp, cq, p, q = result\n", + "\n", + " cp = dom.to_sympy(cp)\n", + " cq = dom.to_sympy(cq)\n", + "\n", + " return cp/cq, per(p), per(q)\n", + " else:\n", + " return tuple(map(per, result))\n", + "\n", + " @property\n", + " def is_zero(f):\n", + " \"\"\"\n", + " Returns ``True`` if ``f`` is a zero polynomial.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(0, x).is_zero\n", + " True\n", + " >>> Poly(1, x).is_zero\n", + " False\n", + "\n", + " \"\"\"\n", + " return f.rep.is_zero\n", + "\n", + " @property\n", + " def is_one(f):\n", + " \"\"\"\n", + " Returns ``True`` if ``f`` is a unit polynomial.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(0, x).is_one\n", + " False\n", + " >>> Poly(1, x).is_one\n", + " True\n", + "\n", + " \"\"\"\n", + " return f.rep.is_one\n", + "\n", + " @property\n", + " def is_sqf(f):\n", + " \"\"\"\n", + " Returns ``True`` if ``f`` is a square-free polynomial.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 - 2*x + 1, x).is_sqf\n", + " False\n", + " >>> Poly(x**2 - 1, x).is_sqf\n", + " True\n", + "\n", + " \"\"\"\n", + " return f.rep.is_sqf\n", + "\n", + " @property\n", + " def is_monic(f):\n", + " \"\"\"\n", + " Returns ``True`` if the leading coefficient of ``f`` is one.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x + 2, x).is_monic\n", + " True\n", + " >>> Poly(2*x + 2, x).is_monic\n", + " False\n", + "\n", + " \"\"\"\n", + " return f.rep.is_monic\n", + "\n", + " @property\n", + " def is_primitive(f):\n", + " \"\"\"\n", + " Returns ``True`` if GCD of the coefficients of ``f`` is one.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(2*x**2 + 6*x + 12, x).is_primitive\n", + " False\n", + " >>> Poly(x**2 + 3*x + 6, x).is_primitive\n", + " True\n", + "\n", + " \"\"\"\n", + " return f.rep.is_primitive\n", + "\n", + " @property\n", + " def is_ground(f):\n", + " \"\"\"\n", + " Returns ``True`` if ``f`` is an element of the ground domain.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x, x).is_ground\n", + " False\n", + " >>> Poly(2, x).is_ground\n", + " True\n", + " >>> Poly(y, x).is_ground\n", + " True\n", + "\n", + " \"\"\"\n", + " return f.rep.is_ground\n", + "\n", + " @property\n", + " def is_linear(f):\n", + " \"\"\"\n", + " Returns ``True`` if ``f`` is linear in all its variables.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x + y + 2, x, y).is_linear\n", + " True\n", + " >>> Poly(x*y + 2, x, y).is_linear\n", + " False\n", + "\n", + " \"\"\"\n", + " return f.rep.is_linear\n", + "\n", + " @property\n", + " def is_quadratic(f):\n", + " \"\"\"\n", + " Returns ``True`` if ``f`` is quadratic in all its variables.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x*y + 2, x, y).is_quadratic\n", + " True\n", + " >>> Poly(x*y**2 + 2, x, y).is_quadratic\n", + " False\n", + "\n", + " \"\"\"\n", + " return f.rep.is_quadratic\n", + "\n", + " @property\n", + " def is_monomial(f):\n", + " \"\"\"\n", + " Returns ``True`` if ``f`` is zero or has only one term.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(3*x**2, x).is_monomial\n", + " True\n", + " >>> Poly(3*x**2 + 1, x).is_monomial\n", + " False\n", + "\n", + " \"\"\"\n", + " return f.rep.is_monomial\n", + "\n", + " @property\n", + " def is_homogeneous(f):\n", + " \"\"\"\n", + " Returns ``True`` if ``f`` is a homogeneous polynomial.\n", + "\n", + " A homogeneous polynomial is a polynomial whose all monomials with\n", + " non-zero coefficients have the same total degree. If you want not\n", + " only to check if a polynomial is homogeneous but also compute its\n", + " homogeneous order, then use :func:`Poly.homogeneous_order`.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + x*y, x, y).is_homogeneous\n", + " True\n", + " >>> Poly(x**3 + x*y, x, y).is_homogeneous\n", + " False\n", + "\n", + " \"\"\"\n", + " return f.rep.is_homogeneous\n", + "\n", + " @property\n", + " def is_irreducible(f):\n", + " \"\"\"\n", + " Returns ``True`` if ``f`` has no factors over its domain.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> Poly(x**2 + x + 1, x, modulus=2).is_irreducible\n", + " True\n", + " >>> Poly(x**2 + 1, x, modulus=2).is_irreducible\n", + " False\n", + "\n", + " \"\"\"\n", + " return f.rep.is_irreducible\n", + "\n", + " @property\n", + " def is_univariate(f):\n", + " \"\"\"\n", + " Returns ``True`` if ``f`` is a univariate polynomial.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + x + 1, x).is_univariate\n", + " True\n", + " >>> Poly(x*y**2 + x*y + 1, x, y).is_univariate\n", + " False\n", + " >>> Poly(x*y**2 + x*y + 1, x).is_univariate\n", + " True\n", + " >>> Poly(x**2 + x + 1, x, y).is_univariate\n", + " False\n", + "\n", + " \"\"\"\n", + " return len(f.gens) == 1\n", + "\n", + " @property\n", + " def is_multivariate(f):\n", + " \"\"\"\n", + " Returns ``True`` if ``f`` is a multivariate polynomial.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x, y\n", + "\n", + " >>> Poly(x**2 + x + 1, x).is_multivariate\n", + " False\n", + " >>> Poly(x*y**2 + x*y + 1, x, y).is_multivariate\n", + " True\n", + " >>> Poly(x*y**2 + x*y + 1, x).is_multivariate\n", + " False\n", + " >>> Poly(x**2 + x + 1, x, y).is_multivariate\n", + " True\n", + "\n", + " \"\"\"\n", + " return len(f.gens) != 1\n", + "\n", + " @property\n", + " def is_cyclotomic(f):\n", + " \"\"\"\n", + " Returns ``True`` if ``f`` is a cyclotomic polnomial.\n", + "\n", + " Examples\n", + " ========\n", + "\n", + " >>> from sympy import Poly\n", + " >>> from sympy.abc import x\n", + "\n", + " >>> f = x**16 + x**14 - x**10 + x**8 - x**6 + x**2 + 1\n", + "\n", + " >>> Poly(f).is_cyclotomic\n", + " False\n", + "\n", + " >>> g = x**16 + x**14 - x**10 - x**8 - x**6 + x**2 + 1\n", + "\n", + " >>> Poly(g).is_cyclotomic\n", + " True\n", + "\n", + " \"\"\"\n", + " return f.rep.is_cyclotomic\n", + "\n", + " def __abs__(f):\n", + " return f.abs()\n", + "\n", + " def __neg__(f):\n", + " return f.neg()\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __add__(f, g):\n", + " if not g.is_Poly:\n", + " try:\n", + " g = f.__class__(g, *f.gens)\n", + " except PolynomialError:\n", + " return f.as_expr() + g\n", + "\n", + " return f.add(g)\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __radd__(f, g):\n", + " if not g.is_Poly:\n", + " try:\n", + " g = f.__class__(g, *f.gens)\n", + " except PolynomialError:\n", + " return g + f.as_expr()\n", + "\n", + " return g.add(f)\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __sub__(f, g):\n", + " if not g.is_Poly:\n", + " try:\n", + " g = f.__class__(g, *f.gens)\n", + " except PolynomialError:\n", + " return f.as_expr() - g\n", + "\n", + " return f.sub(g)\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __rsub__(f, g):\n", + " if not g.is_Poly:\n", + " try:\n", + " g = f.__class__(g, *f.gens)\n", + " except PolynomialError:\n", + " return g - f.as_expr()\n", + "\n", + " return g.sub(f)\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __mul__(f, g):\n", + " if not g.is_Poly:\n", + " try:\n", + " g = f.__class__(g, *f.gens)\n", + " except PolynomialError:\n", + " return f.as_expr()*g\n", + "\n", + " return f.mul(g)\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __rmul__(f, g):\n", + " if not g.is_Poly:\n", + " try:\n", + " g = f.__class__(g, *f.gens)\n", + " except PolynomialError:\n", + " return g*f.as_expr()\n", + "\n", + " return g.mul(f)\n", + "\n", + " @_sympifyit('n', NotImplemented)\n", + " def __pow__(f, n):\n", + " if n.is_Integer and n >= 0:\n", + " return f.pow(n)\n", + " else:\n", + " return f.as_expr()**n\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __divmod__(f, g):\n", + " if not g.is_Poly:\n", + " g = f.__class__(g, *f.gens)\n", + "\n", + " return f.div(g)\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __rdivmod__(f, g):\n", + " if not g.is_Poly:\n", + " g = f.__class__(g, *f.gens)\n", + "\n", + " return g.div(f)\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __mod__(f, g):\n", + " if not g.is_Poly:\n", + " g = f.__class__(g, *f.gens)\n", + "\n", + " return f.rem(g)\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __rmod__(f, g):\n", + " if not g.is_Poly:\n", + " g = f.__class__(g, *f.gens)\n", + "\n", + " return g.rem(f)\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __floordiv__(f, g):\n", + " if not g.is_Poly:\n", + " g = f.__class__(g, *f.gens)\n", + "\n", + " return f.quo(g)\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __rfloordiv__(f, g):\n", + " if not g.is_Poly:\n", + " g = f.__class__(g, *f.gens)\n", + "\n", + " return g.quo(f)\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __div__(f, g):\n", + " return f.as_expr()/g.as_expr()\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __rdiv__(f, g):\n", + " return g.as_expr()/f.as_expr()\n", + "\n", + " __truediv__ = __div__\n", + " __rtruediv__ = __rdiv__\n", + "\n", + " @_sympifyit('other', NotImplemented)\n", + " def __eq__(self, other):\n", + " f, g = self, other\n", + "\n", + " if not g.is_Poly:\n", + " try:\n", + " g = f.__class__(g, f.gens, domain=f.get_domain())\n", + " except (PolynomialError, DomainError, CoercionFailed):\n", + " return False\n", + "\n", + " if f.gens != g.gens:\n", + " return False\n", + "\n", + " if f.rep.dom != g.rep.dom:\n", + " try:\n", + " dom = f.rep.dom.unify(g.rep.dom, f.gens)\n", + " except UnificationFailed:\n", + " return False\n", + "\n", + " f = f.set_domain(dom)\n", + " g = g.set_domain(dom)\n", + "\n", + " return f.rep == g.rep\n", + "\n", + " @_sympifyit('g', NotImplemented)\n", + " def __ne__(f, g):\n", + " return not f == g\n", + "\n", + " def __nonzero__(f):\n", + " return not f.is_zero\n", + "\n", + " __bool__ = __nonzero__\n", + "\n", + " def eq(f, g, strict=False):\n", + " if not strict:\n", + " return f == g\n", + " else:\n", + " return f._strict_eq(sympify(g))\n", + "\n", + " def ne(f, g, strict=False):\n", + " return not f.eq(g, strict=strict)\n", + "\n", + " def _strict_eq(f, g):\n", + " return isinstance(g, f.__class__) and f.gens == g.gens and f.rep.eq(g.rep, strict=True)\n", + "\n" + ] + } + ], + "source": [ + "source(Poly)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( x + \\sqrt{x}, \\sqrt{x}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly((sqrt(x))**2 + (sqrt(x)), sqrt(x), domain='ZZ')" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly({1:1,2:1},gens=S('sqrt(x)'))" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - x + \\sqrt{x^{2}}$" + ], + "text/plain": [ + "-x + sqrt(x**2)" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x=symbols('x', positive=True)\n", + "S('sqrt(x^2)-x')" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"Poly((sqrt(x))**4 + (sqrt(x))**2 + (sqrt(x)), sqrt(x), domain='ZZ')\"" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "str(Poly({1:1,2:1,4:1},gens=S('sqrt(x)')))" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"Poly(x**2 + x + (sqrt(x)), x, sqrt(x), domain='ZZ')\"" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "str(Poly('x^2+x+sqrt(x)'))" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "Substitute $a\\to b+y_{1}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $b\\to c+z_{1}$" ], "text/plain": [ "" @@ -2001,7 +6407,7 @@ { "data": { "text/plain": [ - "(2.5326984818340415e-10, 7.129450063690368, 1.7908873553542452e-10)" + "(1.7908873553542452e-10, 2.5326984818340415e-10, 7.129450063690368)" ] }, "metadata": {}, @@ -2010,10 +6416,10 @@ { "data": { "text/plain": [ - "1.4142142855953455" + "2.5119572187973787e-11" ] }, - "execution_count": 36, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -2043,9 +6449,53 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "Substitute $a\\to b+e_{2}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "Substitute $b\\to c+f_{2}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ok\n", + "100 loops, best of 5: 8.66 ms per loop\n", + "1000 loops, best of 5: 1.31 ms per loop\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from random import random\n", "formula=cyclize(Sm('((a-b)/c)^2-8**(1/2)*(a-b)/c'))\n", @@ -2060,7 +6510,7 @@ "def evaluate(x):\n", " return newformula.evalf(subs=dict(zip(fs,(1,1,1))))\n", "def evaluate2(x):\n", - " return num1.evalf(dict(zip(fs,x)))/num2.eval(dict(zip(fs,x)))\n", + " return num1.eval(dict(zip(fs,x)))/num2.eval(dict(zip(fs,x)))\n", "#display(num2.eval(dict(zip(fs,(1,1,1)))))\n", "print('ok')\n", "%timeit evaluate((random(),random(),random()))\n", @@ -2095,18 +6545,43 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 52, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\sqrt{x} + x$" + ], + "text/plain": [ + "sqrt(x) + x" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "(Poly({1:1,2:1,4:1},gens=S('sqrt(x)'))-Poly('x^2')).as_expr()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 55, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(x*(1 - x), [])" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from sympy.solvers.solvers import unrad\n", "unrad('sqrt(x)+x')" @@ -2114,9 +6589,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 56, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "formula=('x^(2/3)+x^(3/4)+sqrt(x+y)')\n", "type((Poly(formula).gens[1]).args[0])==Symbol" @@ -2124,18 +6610,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 57, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(x, 1/2)" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "S('sqrt(x)').args" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 58, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 12)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m12\u001b[0m\n\u001b[0;31m newgens[gen[0]]=\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], "source": [ "def _powr(formula):\n", "\tif formula.func==Pow:\n", @@ -2155,27 +6661,63 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 59, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "isinstance(S('1'),Rational)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 60, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "6 in {3:4,5:6}" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 61, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle 1$" + ], + "text/plain": [ + "1" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from math import *\n", "from sympy import *\n", @@ -2184,36 +6726,88 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 62, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( x^{2 \\pi}, x^{\\pi}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly((x**pi)**2, x**pi, domain='ZZ')" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "Poly('x^(2*pi)')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 63, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{1}{8}$" + ], + "text/plain": [ + "1/8" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "gcd(S('1/8'),S('1/4'))" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 64, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(3, (x, sqrt(2)))" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "S('sqrt(2)*3*x').as_coeff_mul()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 65, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Poly((sqrt(x))**4 + (sqrt(x))**2 + (sqrt(x)), sqrt(x), domain='ZZ')\n", + "Poly((x**(1/6))**12 + (x**(1/6))**3 + (x**(1/6))**2 + y**2, x**(1/6), y, domain='ZZ')\n", + "Poly((sqrt(x)) + (sqrt(x*z)) + (sqrt(z)), sqrt(x), sqrt(x*z), sqrt(z), domain='ZZ')\n", + "Poly((sqrt(x))*(sqrt(z)) + (sqrt(x)) + (sqrt(z)), sqrt(x), sqrt(z), domain='ZZ')\n", + "Poly((sqrt(t + z)) + (sqrt(t*x + t*y + x*z + y*z)) + (sqrt(x + y)), sqrt(t + z), sqrt(t*x + t*y + x*z + y*z), sqrt(x + y), domain='ZZ')\n", + "Poly((sqrt(2)) + (sqrt(3)) + (sqrt(6)), sqrt(2), sqrt(3), sqrt(6), domain='ZZ')\n" + ] + } + ], "source": [ "def _powr(formula):\n", "\tif formula.func==Pow:\n", @@ -2355,13 +6949,419 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from shiroindev import *\n", + "formula=S('(a+b-c)^2')\n", + "prove(makesubs(formula,'[c,oo]'))\n", + "prove(makesubs(formula,'[a,oo]',variables='c'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "formula=S('(a+b-d)^2+(a+b-c)^2')\n", + "prove(makesubs(formula,'[a+b,oo],[a+b,oo]',variables='c,d'))\n", + "prove(makesubs(formula,'[0,a+b],[a+b,oo]',variables='c,d'))\n", + "prove(makesubs(formula,'[0,a+b],[0,a+b]',variables='c,d'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "findvalues(formula)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "display(cyclize('((a-b)/c)^2'))\n", + "display(S('sqrt(8)')*cyclize('(a-b)/c'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "formula=cyclize('((a-b)/c)^2-8**(1/2)*(a-b)/c')\n", + "display(Latex('Case $a\\ge c\\ge b$'))\n", + "formula1=makesubs(formula,'[c,oo],[b,oo]',variables='a,c,b')\n", + "prove(formula1)\n", + "display(Latex('Case $a\\ge b\\ge c$'))\n", + "formula2=makesubs(formula,'[b,oo],[c,oo]')\n", + "prove(formula2*4,values='2**(1/2),1,1')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "formula=cyclize('((a-b)/c)^2-8**(1/2)*(a-b)/c')\n", + "formula2=makesubs(formula,'[c,oo],[c,oo]')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "findvalues(formula2,values=[5,2,7])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x,y=symbols('x,y')\n", + "ask(Q.positive(x**2+1),Q.real(x))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "formula=Sm('(a^2+b^2+c^2)^2- 3(a^3b+b^3c+c^3a)')\n", + "formula1=makesubs(formula,'[b,oo],[c,oo]',variables='a,b')\n", + "formula2=makesubs(formula,'[c,oo],[b,oo]',variables='a,c')\n", + "prove(formula2)\n", + "print(findvalues(formula1))\n", + "#prove(formula1,values='4*b*(1-b)-1,4*c*(1-c)-1,1')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "makesubs(Sm('a^2-2ab+bc-c^2+ca'),'[c,oo],[a,oo]',variables='b,c')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "Substitute $a\\to a+c$" + "$\\displaystyle - \\sqrt{x} \\sqrt{y} + \\sqrt{x y}$" + ], + "text/plain": [ + "-sqrt(x)*sqrt(y) + sqrt(x*y)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle 0$" + ], + "text/plain": [ + "0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "formula=S('sqrt(x*y)-sqrt(x)*sqrt(y)')\n", + "display(formula)\n", + "def assumeall(formula,**kwargs):\n", + " formula=S(formula)\n", + " fs=formula.free_symbols\n", + " for x in fs:\n", + " y=Symbol(str(x),**kwargs)\n", + " formula=formula.subs(x,y)\n", + " return formula\n", + "display(assumeall(formula,positive=True))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Poly(assumeall('x+sqrt(x)',positive=True))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "str(type(S('f1(x,y,z)')))=='f1'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ReprPrinter?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "srepr(S('x^2+f(x)+f(x,y)+f()+sqrt(y)'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import Function,srepr,S\n", + "import re\n", + "f=Function('f')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def allsymbols(formula):\n", + " formula=S(formula)\n", + " funcsymbols=[x[10:-2] for x in re.findall(r\"Function\\(\\'.*?\\'\\)\",srepr(formula))]\n", + " return set(funcsymbols)|set(map(str,formula.free_symbols))\n", + "def vargen(n):\n", + " x='abcdefghijklmnopqrstuvwxyz'[n%26]\n", + " if n>=26:\n", + " x+=str(n//26)\n", + " return x\n", + "allsymbols(S('f(5,7)+f(5)+g(8)+sqrt(x*y)'))\n", + "vargen(36)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import *\n", + "from sympy.printing.repr import *\n", + "ReprPrinter??" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "{5,7} | {8,7}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "[x[10:-2] for x in re.findall(r\"Function\\(\\'.*?\\'\\)\",srepr(S('x^2')))]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "S('f(5,7)+f(5)+g(8)+sqrt(x*y)')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "srepr(S('f(5,7)+f(5)+g(8)+sqrt(x*y)'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "display(Latex('$'+str(S('z12345'))+'$'))" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "invalid literal for int() with base 10: ''", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;34m'xyz'\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mValueError\u001b[0m: invalid literal for int() with base 10: ''" + ] + } + ], + "source": [ + "'xyz'[-2::]" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "def sortkey(x):\n", + " x=str(x)\n", + " i=len(x)-1\n", + " while i>=0:\n", + " if x[i] not in '0123456789':\n", + " break\n", + " i-=1\n", + " if i==len(x)-1:\n", + " return (-1,x)\n", + " return (int(x[i+1:]),x[:i+1])" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[x, y, x0, qq1, z1, t2]" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted(S('x,y,z1,t2,qq1,x0'),key=sortkey)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimization terminated successfully.\n", + " Current function value: 1.154701\n", + " Iterations: 85\n", + " Function evaluations: 152\n" + ] + }, + { + "data": { + "text/plain": [ + "[1.0,\n", + " 3.000209557356011,\n", + " 3.9998018341331227,\n", + " 2.9997236704279775,\n", + " 0.999903278712487]" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "S('x_1^2+x_2^2+x_3^2+x_4^2+x_5^2')\n", + "formula=S('x_1^2+x_2^2+x_3^2+x_4^2+x_5^2- (x_1*x_2+x_2*x_3+x_3*x_4+x_4*x_5)')\n", + "values=findvalues(formula)\n", + "values=[value/values[0] for value in values]\n", + "[value**2 for value in values]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{2 \\sqrt{3}}{3}$" + ], + "text/plain": [ + "2*sqrt(3)/3" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "formula1=S('(x_1^2+x_2^2+x_3^2+x_4^2+x_5^2)/(x_1*x_2+x_2*x_3+x_3*x_4+x_4*x_5)')\n", + "formula1.subs(S('[[x_1,1],[x_2,sqrt(3)],[x_3,2],[x_4,sqrt(3)],[x_5,1]]'))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "formula2=S('x_1^2+x_2^2+x_3^2+x_4^2+x_5^2- (2/sqrt(3))*(x_1*x_2+x_2*x_3+x_3*x_4+x_4*x_5)')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "Substitute $x_{2}\\to \\sqrt{3} g$" ], "text/plain": [ "" @@ -2373,7 +7373,7 @@ { "data": { "text/latex": [ - "numerator: $a^2+2ab+b^2$" + "Substitute $x_{3}\\to 2 h$" ], "text/plain": [ "" @@ -2385,7 +7385,7 @@ { "data": { "text/latex": [ - "denominator: $1$" + "Substitute $x_{4}\\to \\sqrt{3} i$" ], "text/plain": [ "" @@ -2397,55 +7397,7 @@ { "data": { "text/latex": [ - "status: 0" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$ 0 \\le a^2+2ab+b^2 $$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "The sum of all inequalities gives us a proof of the inequality." - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Substitute $c\\to a+c$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "numerator: $b^2-2bc+c^2$" + "numerator: $3 g^{2} - 4 g h - 2 g x_{1} + 4 h^{2} - 4 h i + 3 i^{2} - 2 i x_{5} + x_{1}^{2} + x_{5}^{2}$" ], "text/plain": [ "" @@ -2493,7 +7445,43 @@ { "data": { "text/latex": [ - "$$2bc \\le b^2+c^2$$" + "$$4 g h \\le 2 g^{2}+2 h^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 g x_{1} \\le g^{2}+x_{1}^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$4 h i \\le 2 h^{2}+2 i^{2}$$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$2 i x_{5} \\le i^{2}+x_{5}^{2}$$" ], "text/plain": [ "" @@ -2532,51 +7520,108 @@ "0" ] }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prove(formula2,values='1,sqrt(3),2,sqrt(3),1')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{k}a^{n}, a^{k}, a^{n}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly((a**k)*(a**n), a**k, a**n, domain='ZZ')" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly('a^(n+k)')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'FiniteSet' object has no attribute 'as_coeff_Mul'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mS\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'a^{n+k}/{b^n}+{b^{n+k}}/{c^n}+{c^{n+k}}/{a^n}-( a^k+b^k+c^k)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/sympify.py\u001b[0m in \u001b[0;36msympify\u001b[0;34m(a, locals, convert_xor, strict, rational, evaluate)\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 383\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'\\n'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 384\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mparse_expr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlocal_dict\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlocals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtransformations\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtransformations\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mevaluate\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 385\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mTokenError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSyntaxError\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mexc\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 386\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mSympifyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'could not parse %r'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/parsing/sympy_parser.py\u001b[0m in \u001b[0;36mparse_expr\u001b[0;34m(s, local_dict, transformations, global_dict, evaluate)\u001b[0m\n\u001b[1;32m 964\u001b[0m \u001b[0mcode\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevaluateFalse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcode\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'eval'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 965\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 966\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0meval_expr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlocal_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mglobal_dict\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 967\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 968\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/parsing/sympy_parser.py\u001b[0m in \u001b[0;36meval_expr\u001b[0;34m(code, local_dict, global_dict)\u001b[0m\n\u001b[1;32m 877\u001b[0m \"\"\"\n\u001b[1;32m 878\u001b[0m expr = eval(\n\u001b[0;32m--> 879\u001b[0;31m code, global_dict, local_dict) # take local objects in preference\n\u001b[0m\u001b[1;32m 880\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 881\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/expr.py\u001b[0m in \u001b[0;36m__pow__\u001b[0;34m(self, other, mod)\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__pow__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmod\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 165\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_pow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 166\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m \u001b[0m_self\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmod\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mas_int\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mas_int\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mas_int\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmod\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/decorators.py\u001b[0m in \u001b[0;36m__sympifyit_wrapper\u001b[0;34m(a, b)\u001b[0m\n\u001b[1;32m 89\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'_op_priority'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msympify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstrict\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 91\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 92\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mSympifyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mretval\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/decorators.py\u001b[0m in \u001b[0;36mbinary_op_wrapper\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 127\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mf\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 128\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 129\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 130\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mbinary_op_wrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 131\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mpriority_decorator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/expr.py\u001b[0m in \u001b[0;36m_pow\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 159\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mcall_highest_priority\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'__rpow__'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 160\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_pow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 161\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mPow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 162\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__pow__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/cache.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 92\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 94\u001b[0;31m \u001b[0mretval\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 95\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[0mretval\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/core/power.py\u001b[0m in \u001b[0;36m__new__\u001b[0;34m(cls, b, e, evaluate)\u001b[0m\n\u001b[1;32m 274\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Atom\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mb\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mExp1\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexp_polar\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 275\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0msympy\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdenom\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlog\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msign\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mim\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfactor_terms\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 276\u001b[0;31m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfactor_terms\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msign\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_coeff_Mul\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 277\u001b[0m \u001b[0mden\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdenom\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 278\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mden\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlog\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mden\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAttributeError\u001b[0m: 'FiniteSet' object has no attribute 'as_coeff_Mul'" + ] + } + ], + "source": [ + "S('a^{n+k}/{b^n}+{b^(n+k)/(c^n)+c^(n+k)/{a^n}-( a^k+b^k+c^k)')" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'767980716'" + ] + }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from shiroindev import *\n", - "formula=S('(a+b-c)^2')\n", - "prove(makesubs(formula,'[c,oo]'))\n", - "prove(makesubs(formula,'[a,oo]',variables='c'))" + "import re\n", + "s=r\"\"\"99-my-name-is-John-Smith-6376827-%^-1-2-767980716\"\"\"\n", + "re.compile(r\"^(.*?)-\").search(str(s[::-1])).group(1)[::-1]" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 3, "metadata": {}, "outputs": [ { - "data": { - "text/latex": [ - "Substitute $c\\to a+b+c$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stdout", + "output_type": "stream", + "text": [ + "ANTLR runtime and generated code versions disagree: 4.8!=4.7.1\n", + "ANTLR runtime and generated code versions disagree: 4.8!=4.7.1\n" + ] }, { "data": { "text/latex": [ - "Substitute $d\\to a+b+d$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "numerator: $c^2+d^2$" + "numerator: $a^{k} a^{2 n} c^{n} - a^{k} a^{n} b^{n} c^{n} + a^{n} b^{k} b^{2 n} - a^{n} b^{k} b^{n} c^{n} - a^{n} b^{n} c^{k} c^{n} + b^{n} c^{k} c^{2 n}$" ], "text/plain": [ "" @@ -2600,7 +7645,7 @@ { "data": { "text/latex": [ - "status: 0" + "status: 2" ], "text/plain": [ "" @@ -2612,7 +7657,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le c^2+d^2 $$" + "Program couldn't find any proof." ], "text/plain": [ "" @@ -2624,7 +7669,7 @@ { "data": { "text/latex": [ - "The sum of all inequalities gives us a proof of the inequality." + "$$ a^{k} a^{n} b^{n} c^{n}+a^{n} b^{k} b^{n} c^{n}+a^{n} b^{n} c^{k} c^{n} \\le a^{k} a^{2 n} c^{n}+a^{n} b^{k} b^{2 n}+b^{n} c^{k} c^{2 n} $$" ], "text/plain": [ "" @@ -2636,7 +7681,7 @@ { "data": { "text/latex": [ - "Substitute $c\\to a+b+(-a-b)/(c+1)$" + "Substitute $n\\to d + k$" ], "text/plain": [ "" @@ -2648,7 +7693,7 @@ { "data": { "text/latex": [ - "Substitute $d\\to a+b+d$" + "numerator: $a^{2 d} a^{3 k} c^{d} c^{k} - a^{d} a^{2 k} b^{d} b^{k} c^{d} c^{k} + a^{d} a^{k} b^{2 d} b^{3 k} - a^{d} a^{k} b^{d} b^{2 k} c^{d} c^{k} - a^{d} a^{k} b^{d} b^{k} c^{d} c^{2 k} + b^{d} b^{k} c^{2 d} c^{3 k}$" ], "text/plain": [ "" @@ -2660,7 +7705,7 @@ { "data": { "text/latex": [ - "numerator: $a^2+2ab+b^2+c^2d^2+2cd^2+d^2$" + "denominator: $1$" ], "text/plain": [ "" @@ -2672,7 +7717,7 @@ { "data": { "text/latex": [ - "denominator: $c^2+2c+1$" + "status: 2" ], "text/plain": [ "" @@ -2681,6 +7726,230 @@ "metadata": {}, "output_type": "display_data" }, + { + "data": { + "text/latex": [ + "Program couldn't find any proof." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$$ a^{d} a^{2 k} b^{d} b^{k} c^{d} c^{k}+a^{d} a^{k} b^{d} b^{2 k} c^{d} c^{k}+a^{d} a^{k} b^{d} b^{k} c^{d} c^{2 k} \\le a^{2 d} a^{3 k} c^{d} c^{k}+a^{d} a^{k} b^{2 d} b^{3 k}+b^{d} b^{k} c^{2 d} c^{3 k} $$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sympy import *\n", + "from sympy.parsing.latex import parse_latex\n", + "from shiroindev import *\n", + "shiro.seed=1\n", + "from IPython.display import Latex\n", + "shiro.display=lambda x:display(Latex(x))\n", + "formula=expand(parse_latex(r'(\\frac{a^{n+k}}{b^n}+\\frac{b^{n+k}}{c^n}+\\frac{c^{n+k}}{a^n}-( a^k+b^k+c^k))*a^nb^nc^n'))\n", + "newproof()\n", + "prove(formula)\n", + "prove(makesubs(formula,['k',oo],variables='n'))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 6 x^{3}y^{9} + 5 x^{2}y^{7} + 4 xy^{8}, x, y, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(6*x**3*y**9 + 5*x**2*y**7 + 4*x*y**8, x, y, domain='ZZ')" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly(dict(zip([(1,8),(2,7),(3,9)],[4,5,6])),gens=S('x,y'))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\sqrt{x} + x^{2} + x$" + ], + "text/plain": [ + "sqrt(x) + x**2 + x" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly({1:1,2:1,4:1},gens=S('sqrt(x)')).as_expr()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "def _writ2(coef,fun,variables):\n", + "\treturn latex(Poly(dict(zip(fun,coef)),gens=variables).as_expr())" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'8 x^{3} y^{4} + 7 x y^{2}'" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "_writ2([7,8],[(1,2),(3,4)],S('x,y'))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ANTLR runtime and generated code versions disagree: 4.8!=4.7.1\n", + "ANTLR runtime and generated code versions disagree: 4.8!=4.7.1\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle 2 a b$" + ], + "text/plain": [ + "2*(a*b)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "parse_latex(r' a^2+b^2\\geq 2ab').rhs" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ANTLR runtime and generated code versions disagree: 4.8!=4.7.1\n", + "ANTLR runtime and generated code versions disagree: 4.8!=4.7.1\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle a^{2} + b^{2}$" + ], + "text/plain": [ + "a**2 + b**2" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "parse_latex(r'2ab \\geq a^2+b^2').rhs" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "numerator: $a d + a f + b c + b e + c f + d e - 2 \\sqrt{a b} \\sqrt{c d} - 2 \\sqrt{a b} \\sqrt{e f} - 2 \\sqrt{c d} \\sqrt{e f}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "denominator: $1$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Poly((sqrt(a))**2*(sqrt(d))**2 + (sqrt(a))**2*(sqrt(f))**2 - 2*(sqrt(a))*(sqrt(b))*(sqrt(c))*(sqrt(d)) - 2*(sqrt(a))*(sqrt(b))*(sqrt(e))*(sqrt(f)) + (sqrt(b))**2*(sqrt(c))**2 + (sqrt(b))**2*(sqrt(e))**2 + (sqrt(c))**2*(sqrt(f))**2 - 2*(sqrt(c))*(sqrt(d))*(sqrt(e))*(sqrt(f)) + (sqrt(d))**2*(sqrt(e))**2, sqrt(a), sqrt(b), sqrt(c), sqrt(d), sqrt(e), sqrt(f), domain='ZZ')\n", + "Poly((sqrt(a))**2*(sqrt(d))**2 + (sqrt(a))**2*(sqrt(f))**2 + (sqrt(b))**2*(sqrt(c))**2 + (sqrt(b))**2*(sqrt(e))**2 + (sqrt(c))**2*(sqrt(f))**2 + (sqrt(d))**2*(sqrt(e))**2, sqrt(a), sqrt(b), sqrt(c), sqrt(d), sqrt(e), sqrt(f), domain='QQ')\n", + "Poly(2*(sqrt(a))*(sqrt(b))*(sqrt(c))*(sqrt(d)) + 2*(sqrt(a))*(sqrt(b))*(sqrt(e))*(sqrt(f)) + 2*(sqrt(c))*(sqrt(d))*(sqrt(e))*(sqrt(f)), sqrt(a), sqrt(b), sqrt(c), sqrt(d), sqrt(e), sqrt(f), domain='QQ')\n" + ] + }, { "data": { "text/latex": [ @@ -2696,7 +7965,7 @@ { "data": { "text/latex": [ - "$$ 0 \\le a^2+2ab+b^2+c^2d^2+2cd^2+d^2 $$" + "From weighted AM-GM inequality:" ], "text/plain": [ "" @@ -2708,7 +7977,7 @@ { "data": { "text/latex": [ - "The sum of all inequalities gives us a proof of the inequality." + "$$2 \\sqrt{a} \\sqrt{b} \\sqrt{c} \\sqrt{d} \\le a d+b c$$" ], "text/plain": [ "" @@ -2720,7 +7989,7 @@ { "data": { "text/latex": [ - "Substitute $c\\to a+b+(-a-b)/(c+1)$" + "$$2 \\sqrt{a} \\sqrt{b} \\sqrt{e} \\sqrt{f} \\le a f+b e$$" ], "text/plain": [ "" @@ -2732,7 +8001,7 @@ { "data": { "text/latex": [ - "Substitute $d\\to a+b+(-a-b)/(d+1)$" + "$$2 \\sqrt{c} \\sqrt{d} \\sqrt{e} \\sqrt{f} \\le c f+d e$$" ], "text/plain": [ "" @@ -2744,43 +8013,7 @@ { "data": { "text/latex": [ - "numerator: $a^2c^2+2a^2c+a^2d^2+2a^2d+2a^2+2abc^2+4abc+2abd^2+4abd+4ab+b^2c^2+2b^2c+b^2d^2+2b^2d+2b^2$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "denominator: $c^2d^2+2c^2d+c^2+2cd^2+4cd+2c+d^2+2d+1$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "status: 0" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$ 0 \\le a^2c^2+2a^2c+a^2d^2+2a^2d+2a^2+2abc^2+4abc+2abd^2+4abd+4ab+b^2c^2+2b^2c+b^2d^2+2b^2d+2b^2 $$" + "$$ 0 \\le 0 $$" ], "text/plain": [ "" @@ -2807,95 +8040,355 @@ "0" ] }, - "execution_count": 34, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "formula=S('(a+b-d)^2+(a+b-c)^2')\n", - "prove(makesubs(formula,'[a+b,oo],[a+b,oo]',variables='c,d'))\n", - "prove(makesubs(formula,'[0,a+b],[a+b,oo]',variables='c,d'))\n", - "prove(makesubs(formula,'[0,a+b],[0,a+b]',variables='c,d'))" + "fr=parse_latex(r'\\sqrt{ab}+\\sqrt{cd}+\\sqrt{ef}\\leq\\sqrt{(a+c+e)(b+d+f)}')\n", + "prove(fr.rhs**2-fr.lhs**2)" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle 0$" + ], + "text/plain": [ + "0" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "assumeall(S('sqrt(x*y)-sqrt(x)*sqrt(y)'),positive=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "ename": "GeneratorsError", + "evalue": "duplicated generators: [sqrt(x), sqrt(x)]", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mGeneratorsError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mreducegens\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'x+sqrt(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mq\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mS\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'x+sqrt(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mPoly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mS\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sqrt(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mS\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sqrt(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mPoly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mS\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sqrt(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/polytools.py\u001b[0m in \u001b[0;36m__new__\u001b[0;34m(cls, rep, *gens, **args)\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__new__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0;34m\"\"\"Create a new polynomial instance out of something useful. \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m \u001b[0mopt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuild_options\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 110\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 111\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'order'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mopt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/polyoptions.py\u001b[0m in \u001b[0;36mbuild_options\u001b[0;34m(gens, args)\u001b[0m\n\u001b[1;32m 729\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 730\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m'opt'\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mgens\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 731\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mOptions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 732\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 733\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'opt'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/polyoptions.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, gens, args, flags, strict)\u001b[0m\n\u001b[1;32m 152\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0moption\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpreprocess\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 153\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 154\u001b[0;31m \u001b[0mpreprocess_options\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 155\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 156\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdefaults\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/polyoptions.py\u001b[0m in \u001b[0;36mpreprocess_options\u001b[0;34m(args)\u001b[0m\n\u001b[1;32m 150\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 151\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 152\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0moption\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpreprocess\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 153\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[0mpreprocess_options\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/grzegorz/Pobrane/SageMath/local/lib/python3.7/site-packages/sympy/polys/polyoptions.py\u001b[0m in \u001b[0;36mpreprocess\u001b[0;34m(cls, gens)\u001b[0m\n\u001b[1;32m 289\u001b[0m \u001b[0mgens\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 290\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mhas_dups\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 291\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mGeneratorsError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"duplicated generators: %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 292\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_commutative\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mFalse\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mgen\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mgens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 293\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mGeneratorsError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"non-commutative generators: %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mGeneratorsError\u001b[0m: duplicated generators: [sqrt(x), sqrt(x)]" + ] + } + ], + "source": [ + "p=reducegens('x+sqrt(x)')\n", + "q=S('x+sqrt(x)')\n", + "print(Poly(p,gens=[S('sqrt(x)'),S('sqrt(x)')]))\n", + "print(Poly(q,gens=S('sqrt(x)')))" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "from importlib import reload\n", + "from sympy import *\n", + "import shiroindev\n", + "reload(shiroindev)\n", + "from shiroindev import *\n", + "from sympy.parsing.latex import parse_latex\n", + "from itertools import permutations, combinations\n", + "shiro.seed=1\n", + "from IPython.display import Latex\n", + "shiro.display=lambda x:display(Latex(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( x, \\sqrt{x}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly((sqrt(x))**2, sqrt(x), domain='ZZ')" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly('sqrt(x)')*Poly('sqrt(x)')" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 0, x, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(0, x, domain='ZZ')" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Poly('x')-Poly('x').abs()" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( x, x, y, domain=\\mathbb{Q} \\right)}$" + ], + "text/plain": [ + "Poly(x, x, y, domain='QQ')" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fr=Poly('x-y')\n", + "(fr+fr.abs())*(S('1/2'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from itertools import permutations \n", + "t5=[]\n", + "for ineq in ineqs2:\n", + " u=0\n", + " for vars in permutations(ineq.free_symbols):\n", + " ineqp=makesubs(ineq,list(zip(vars[1:],[oo]*len(vars[1:]))),variables=vars[:-1])\n", + " u=max(u,prove(ineqp))\n", + " print(u,end=',')\n", + " t5+=[u]\n", + "Counter(t5)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Optimization terminated successfully.\n", - " Current function value: 1.000000\n", - " Iterations: 65\n", - " Function evaluations: 124\n" + "pvalue 4.43444926375551e-06\n", + "statistic 59.0\n" ] - }, + } + ], + "source": [ + "from statsmodels.stats.contingency_tables import mcnemar\n", + "print(mcnemar([[101,121],[59,33]]))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "nsimplify?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "shiro.display=lambda x:display(Latex(x))\n", + "newproof()\n", + "fr=makesubs(ineqs2[15],'[c,oo],[a,oo]',variables='b,c')\n", + "display(fr)\n", + "fr2=fractioncancel(fr.subs(S('[[e,(sqrt(5)-1)/2*f]]')))[0]\n", + "display(fr2)\n", + "prove(makesubs(fr2,'11/5,9/4',variables=[S('sqrt(5)')]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def makesubs(formula,intervals,values=None,variables=None,numden=False):\n", + "#This function generates a new formula which satisfies this condition:\n", + "#for all positive variables new formula is nonnegative iff\n", + "#for all variables in corresponding intervals old formula is nonnegative\n", + "\tformula=S(formula)\n", + "\taddsymbols(formula)\n", + "\tintervals=_smakeiterable2(intervals)\n", + "\tif variables: variables=_smakeiterable(variables)\n", + "\telse: variables=sorted(formula.free_symbols,key=str)\n", + "\tif values!=None:\n", + "\t\tvalues=_smakeiterable(values)\n", + "\t\tequations=[var-value for var,value in zip(variables,values)]\n", + "\telse:\n", + "\t\tequations=[]\n", + "\tnewvars=[]\n", + "\tusedvars=set()\n", + "\tfor var,interval in zip(variables,intervals):\n", + "\t\tend1,end2=interval\n", + "\t\tz=newvar()\n", + "\t\tnewvars+=[z]\n", + "\t\tusedvars|={z}\n", + "\t\tif (end1.free_symbols|end2.free_symbols)&usedvars:\n", + "\t\t\tshiro.warning(shiro.translation[\n", + "\t\t\t'Warning: intervals contain backwards dependencies. Consider changing order of variables'])\n", + "\t\tif end1 in {S('-oo'),S('oo')}:\n", + "\t\t\tend1,end2=end2,end1\n", + "\t\tif {end1,end2}=={S('-oo'),S('oo')}:\n", + "\t\t\tsub1=sub2=(z-1/z)\n", + "\t\telif end2==S('oo'):\n", + "\t\t\tsub1=sub2=(end1+z)\n", + "\t\telif end2==S('-oo'):\n", + "\t\t\tsub1=sub2=end1-z\n", + "\t\telse:\n", + "\t\t\tsub1=end2+(end1-end2)/z\n", + "\t\t\tsub2=end2+(end1-end2)/(1+z)\n", + "\t\tformula=formula.subs(var,sub1)\n", + "\t\tshiro.display(shiro.translation['Substitute']+\" $\"+latex(var)+'\\\\to '+latex(sub2)+'$')\n", + "\t\tequations=[equation.subs(var,sub1) for equation in equations]\n", + "\tnum,den=fractioncancel(formula)\n", + "\tfor var,interval in zip(newvars,intervals):\n", + "\t\tif {interval[0],interval[1]} & {S('oo'),S('-oo')}==set():\n", + "\t\t\tnum=num.subs(var,var+1)\n", + "\t\t\tden=den.subs(var,var+1)\n", + "\t\t\tequations=[equation.subs(var,var+1) for equation in equations]\n", + "\tif values:\n", + "\t\tvalues=ssolve(equations,newvars)\n", + "\t\tif len(values):\n", + "\t\t\tvalues=values[0]\n", + "\tnum,den=expand(num),expand(den)\n", + "\t#shiro.display(shiro.translation[\"Formula after substitution:\"],\"$$\",latex(num/den),'$$')\n", + "\tif values and numden:\n", + "\t\treturn num,den,values\n", + "\telif values:\n", + "\t\treturn num/den,values\n", + "\telif numden:\n", + "\t\treturn num,den\n", + "\telse:\n", + "\t\treturn num/den" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ { "data": { "text/plain": [ - "(0.8742272651582828,\n", - " 0.45912361618095604,\n", - " 1.3333325089656345,\n", - " 1.3333771594633597)" + "{3, 5, 7, 8}" ] }, - "execution_count": 27, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "findvalues(formula)" + "x={5,7,8}\n", + "x|={3}\n", + "x" ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { - "text/latex": [ - "$\\displaystyle \\frac{\\left(a - b\\right)^{2}}{c^{2}} + \\frac{\\left(- a + c\\right)^{2}}{b^{2}} + \\frac{\\left(b - c\\right)^{2}}{a^{2}}$" - ], "text/plain": [ - "(a - b)**2/c**2 + (-a + c)**2/b**2 + (b - c)**2/a**2" + "{x}" ] }, + "execution_count": 12, "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$\\displaystyle 2 \\sqrt{2} \\left(\\frac{a - b}{c} + \\frac{- a + c}{b} + \\frac{b - c}{a}\\right)$" - ], - "text/plain": [ - "2*sqrt(2)*((a - b)/c + (-a + c)/b + (b - c)/a)" - ] - }, - "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ - "display(cyclize('((a-b)/c)^2'))\n", - "display(S('sqrt(8)')*cyclize('(a-b)/c'))" + "from shiroindev import *\n", + "S('x+7').free_symbols" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool(set())" + ] + }, + { + "cell_type": "code", + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "Case $a\\ge c\\ge b$" + "Substitute $x\\to - y + 1 + \\frac{y - 1}{a + 1}$" ], "text/plain": [ "" @@ -2907,7 +8400,7 @@ { "data": { "text/latex": [ - "Substitute $a\\to a+c$" + "Substitute $y\\to 1 - \\frac{1}{b + 1}$" ], "text/plain": [ "" @@ -2919,7 +8412,7 @@ { "data": { "text/latex": [ - "Substitute $c\\to b+c$" + "Substitute $b\\to \\frac{c}{2}$" ], "text/plain": [ "" @@ -2931,7 +8424,7 @@ { "data": { "text/latex": [ - "numerator: $2a^4b^2+2a^4bc+a^4c^2+4a^3b^3+2\\sqrt{2}a^3b^2c+10a^3b^2c+2\\sqrt{2}a^3bc^2+6a^3bc^2+2a^3c^3+2a^2b^4+2\\sqrt{2}a^2b^3c+10a^2b^3c+6\\sqrt{2}a^2b^2c^2+12a^2b^2c^2+4a^2bc^3+4\\sqrt{2}a^2bc^3+a^2c^4+2ab^4c+2\\sqrt{2}ab^3c^2+6ab^3c^2+4ab^2c^3+4\\sqrt{2}ab^2c^3+2\\sqrt{2}abc^4+2b^4c^2+4b^3c^3+2b^2c^4$" + "numerator: $a^{4} c^{2} + a^{3} c^{2} - 2 a^{3} c - 4 a^{2} c + 4 a^{2} + a c^{2} - 2 a c + c^{2}$" ], "text/plain": [ "" @@ -2943,115 +8436,7 @@ { "data": { "text/latex": [ - "denominator: $a^2b^4+2a^2b^3c+a^2b^2c^2+2ab^5+6ab^4c+6ab^3c^2+2ab^2c^3+b^6+4b^5c+6b^4c^2+4b^3c^3+b^2c^4$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "status: 0" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$ 0 \\le 2a^4b^2+2a^4bc+a^4c^2+4a^3b^3+2\\sqrt{2}a^3b^2c+10a^3b^2c+2\\sqrt{2}a^3bc^2+6a^3bc^2+2a^3c^3+2a^2b^4+2\\sqrt{2}a^2b^3c+10a^2b^3c+6\\sqrt{2}a^2b^2c^2+12a^2b^2c^2+4\\sqrt{2}a^2bc^3+4a^2bc^3+a^2c^4+2ab^4c+2\\sqrt{2}ab^3c^2+6ab^3c^2+4\\sqrt{2}ab^2c^3+4ab^2c^3+2\\sqrt{2}abc^4+2b^4c^2+4b^3c^3+2b^2c^4 $$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "The sum of all inequalities gives us a proof of the inequality." - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Case $a\\ge b\\ge c$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Substitute $a\\to a+b$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Substitute $b\\to b+c$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Substitute $a\\to \\sqrt{2}a$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "numerator: $16a^4b^2+32a^4bc+32a^4c^2+16\\sqrt{2}a^3b^3-32a^3b^2c+48\\sqrt{2}a^3b^2c-32a^3bc^2+80\\sqrt{2}a^3bc^2+32\\sqrt{2}a^3c^3+8a^2b^4-32\\sqrt{2}a^2b^3c+32a^2b^3c-48\\sqrt{2}a^2b^2c^2+96a^2b^2c^2-16\\sqrt{2}a^2bc^3+80a^2bc^3+16a^2c^4-16ab^4c-32ab^3c^2+16\\sqrt{2}ab^3c^2-16ab^2c^3+24\\sqrt{2}ab^2c^3+8\\sqrt{2}abc^4+8b^4c^2+16b^3c^3+8b^2c^4$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "denominator: $2a^2b^2c^2+4a^2bc^3+2a^2c^4+2\\sqrt{2}ab^3c^2+6\\sqrt{2}ab^2c^3+6\\sqrt{2}abc^4+2\\sqrt{2}ac^5+b^4c^2+4b^3c^3+6b^2c^4+4bc^5+c^6$" + "denominator: $a^{3} c^{2} + 2 a^{3} c + 2 a^{2} c^{2} + 4 a^{2} c + a c^{2} + 2 a c$" ], "text/plain": [ "" @@ -3087,7 +8472,7 @@ { "data": { "text/latex": [ - "$$32a^3b^2c \\le 16a^4b^2+16a^2b^2c^2$$" + "$$2 a^{3} c \\le a^{4} c^{2}+a^{2}$$" ], "text/plain": [ "" @@ -3099,7 +8484,7 @@ { "data": { "text/latex": [ - "$$32\\sqrt{2}a^2b^3c \\le 16\\sqrt{2}a^3b^3+16\\sqrt{2}ab^3c^2$$" + "$$4 a^{2} c \\le a^{3} c^{2}+2 a^{2}+a c^{2}$$" ], "text/plain": [ "" @@ -3111,7 +8496,7 @@ { "data": { "text/latex": [ - "$$48\\sqrt{2}a^2b^2c^2 \\le 24\\sqrt{2}a^3b^2c+24\\sqrt{2}ab^2c^3$$" + "$$2 a c \\le a^{2}+c^{2}$$" ], "text/plain": [ "" @@ -3123,67 +8508,7 @@ { "data": { "text/latex": [ - "$$16\\sqrt{2}a^2bc^3 \\le 8\\sqrt{2}a^3bc^2+8\\sqrt{2}abc^4$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$16ab^4c \\le 8a^2b^4+8b^4c^2$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$32ab^3c^2 \\le 16a^2b^3c+16b^3c^3$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$32a^3bc^2 \\le 16a^4bc+16a^2bc^3$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$16ab^2c^3 \\le 8a^2b^2c^2+8b^2c^4$$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$$ 0 \\le 16a^4bc+32a^4c^2+24\\sqrt{2}a^3b^2c+72\\sqrt{2}a^3bc^2+32\\sqrt{2}a^3c^3+16a^2b^3c+72a^2b^2c^2+64a^2bc^3+16a^2c^4 $$" + "$$ 0 \\le 0 $$" ], "text/plain": [ "" @@ -3206,102 +8531,8 @@ }, { "data": { - "text/latex": [ - "$\\displaystyle - \\frac{2 \\sqrt{2} \\left(a - b\\right)}{c} + \\frac{\\left(a - b\\right)^{2}}{c^{2}} - \\frac{2 \\sqrt{2} \\left(- a + c\\right)}{b} + \\frac{\\left(- a + c\\right)^{2}}{b^{2}} - \\frac{2 \\sqrt{2} \\left(b - c\\right)}{a} + \\frac{\\left(b - c\\right)^{2}}{a^{2}}$" - ], "text/plain": [ - "-2*sqrt(2)*(a - b)/c + (a - b)**2/c**2 - 2*sqrt(2)*(-a + c)/b + (-a + c)**2/b**2 - 2*sqrt(2)*(b - c)/a + (b - c)**2/a**2" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "formula=cyclize('((a-b)/c)^2-8**(1/2)*(a-b)/c')\n", - "display(Latex('Case $a\\ge c\\ge b$'))\n", - "formula1=makesubs(formula,'[c,oo],[b,oo]',variables='a,c,b')\n", - "prove(formula1)\n", - "display(Latex('Case $a\\ge b\\ge c$'))\n", - "formula2=makesubs(formula,'[b,oo],[c,oo]')\n", - "prove(formula2*4,values='2**(1/2),1,1')" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "Substitute $a\\to a+c$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "Substitute $b\\to b+c$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "formula=cyclize('((a-b)/c)^2-8**(1/2)*(a-b)/c')\n", - "formula2=makesubs(formula,'[c,oo],[c,oo]')" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimization terminated successfully.\n", - " Current function value: 1.000000\n", - " Iterations: 271\n", - " Function evaluations: 485\n" - ] - }, - { - "data": { - "text/plain": [ - "(12.42960536989153, 12.429310393555546, 0.00020878153950706037)" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "findvalues(formula2,values=[5,2,7])" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" + "0" ] }, "execution_count": 16, @@ -3310,81 +8541,92 @@ } ], "source": [ - "x,y=symbols('x,y')\n", - "ask(Q.positive(x**2+1),Q.real(x))" + "from importlib import reload\n", + "newproof()\n", + "import shiroindev\n", + "reload(shiroindev)\n", + "from shiroindev import *\n", + "shiro.display=lambda x:display(Latex(x))\n", + "formula=Sm('xy/z+yz/x+zx/y-1').subs('z',S('1-x-y'))\n", + "newformula,values=makesubs(formula,'[0,1-y],[0,1]','1/3,1/3')\n", + "prove(newformula,values)" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 33, "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'Sm' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mformula\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mSm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'(a^2+b^2+c^2)^2- 3(a^3b+b^3c+c^3a)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mformula1\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmakesubs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mformula\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'[b,oo],[c,oo]'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mvariables\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'a,b'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mformula2\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmakesubs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mformula\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'[c,oo],[b,oo]'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mvariables\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'a,c'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mformula2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfindvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mformula1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'Sm' is not defined" - ] - } - ], + "outputs": [], "source": [ - "formula=Sm('(a^2+b^2+c^2)^2- 3(a^3b+b^3c+c^3a)')\n", - "formula1=makesubs(formula,'[b,oo],[c,oo]',variables='a,b')\n", - "formula2=makesubs(formula,'[c,oo],[b,oo]',variables='a,c')\n", - "prove(formula2)\n", - "print(findvalues(formula1))\n", - "#prove(formula1,values='4*b*(1-b)-1,4*c*(1-c)-1,1')" + "def findvalues(formula,values=None,variables=None,**kwargs):\n", + "\t\"\"\"finds a candidate for parameter \"values\" in \"prove\" function\n", + "\tblabla\"\"\"\n", + "\tformula=S(formula)\n", + "\taddsymbols(formula)\n", + "\tnum,den=fractioncancel(formula)\n", + "\tif variables==None:\n", + "\t\tvariables=sorted(formula.free_symbols,key=str)\n", + "\tnum=num.subs(zip(variables,list(map(lambda x:x**2,variables))))\n", + "\tnum=Poly(num)\n", + "\tnewformula=S((num.abs()+num)/(num.abs()-num))\n", + "\tf=lambdify(variables,newformula)\n", + "\tf2=lambda x:f(*x)\n", + "\tif values==None:\n", + "\t\tvalues=[1.0]*len(variables)\n", + "\telse:\n", + "\t\tvalues=S(values)\n", + "\ttup=tuple(fmin(f2,values,**kwargs))\n", + "\treturn tuple([x*x for x in tup])" ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 34, "metadata": {}, "outputs": [ { - "data": { - "text/latex": [ - "Substitute $b\\to b+c$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimization terminated successfully.\n", + " Current function value: 1.000000\n", + " Iterations: 51\n", + " Function evaluations: 109\n" + ] }, { "data": { - "text/latex": [ - "Substitute $c\\to a+c$" - ], "text/plain": [ - "" + "(1.9999999989778676, 0.6689493176765962)" ] }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$\\displaystyle - a b - a c + b c$" - ], - "text/plain": [ - "-a*b - a*c + b*c" - ] - }, - "execution_count": 28, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "makesubs(Sm('a^2-2ab+bc-c^2+ca'),'[c,oo],[a,oo]',variables='b,c')" + "findvalues(Sm('(x^2-4x+4)/y'))" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "shiroindev._remzero?" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "import shiroindev\n", + "reload(shiroindev)\n", + "from shiroindev import *" ] }, { diff --git a/shiroindev.py b/shiroindev.py index 106ed66..0a4dddb 100644 --- a/shiroindev.py +++ b/shiroindev.py @@ -2,14 +2,28 @@ from __future__ import (absolute_import, division, print_function, unicode_literals) import warnings,operator warnings.filterwarnings("ignore") -#Seed is needed to select the weights in linprog function. -#None means that the seed is random. +def vargen(n): + """default function generating names for variables""" + q=len(shiro.alphabet) + x=shiro.alphabet[n%q] + if n>=q: + x+=str(n//q) + return x class Vars: pass -sVars=Vars() -sVars.display=print -sVars.seed=None -sVars.translation={} +shiro=Vars() +shiro.display=shiro.warning=print +shiro.seed=None +"""Seed is needed to select the weights in linprog function. +None means that the seed is random""" +shiro.translation={} +shiro.varind=0 +shiro.varset=set() +"""set of used symbols in the proof""" +shiro.vargen=vargen +"""function generating names for variables""" +shiro.alphabet='abcdefghijklmnopqrstuvwxyz' +"""list of names for variables""" translationList=['numerator:','denominator:','status:', 'Substitute',"Formula after substitution:", "Numerator after substitutions:","From weighted AM-GM inequality:", @@ -19,22 +33,38 @@ translationList=['numerator:','denominator:','status:', "Program couldn't find any proof.", "Try to set higher linprogiter parameter.", "It looks like the formula is symmetric. You can assume without loss of"+ -" generality that ","Try", 'From Jensen inequality:' +" generality that ","Try", 'From Jensen inequality:', +'Warning: intervals contain backwards dependencies. Consider changing order of variables and intervals.' ] #Initialize english-english dictionary. for phrase in translationList: - sVars.translation[phrase]=phrase + shiro.translation[phrase]=phrase from scipy.optimize import linprog,fmin import random -from sympy import S,cancel,fraction,Pow,expand,solve,latex,oo,Poly,lambdify +from sympy import S,cancel,fraction,Pow,expand,solve,latex,oo,Poly,lambdify,srepr,gcd,Symbol +from sympy.parsing.sympy_parser import parse_expr, standard_transformations,\ +implicit_multiplication_application, convert_xor from collections import Counter import re +def addsymbols(formula): + formula=S(formula) + funcsymbols=[x[10:-2] for x in re.findall(r"Function\(\'.*?\'\)",srepr(formula))] + shiro.varset|=set(funcsymbols)|set(map(str,formula.free_symbols)) +def newvar(): + while 1: + x=shiro.vargen(shiro.varind) + shiro.varind+=1 + if x not in shiro.varset: + return S(x) +def newproof(): + shiro.varset=set() + shiro.varind=0 def _remzero(coef,fun): -#coef, fun represents an expression. -#For example, if expression=5f(2,3)+0f(4,6)+8f(1,4) -#then coef=[5,0,8], fun=[[2,3],[4,6],[1,4]] -#_remzero removes addends with coefficient equal to zero. -#In this example ncoef=[5,8], nfun=[[2,3],[1,4]] + """coef, fun represents an expression. + For example, if expression=5f(2,3)+0f(4,6)+8f(1,4) + then coef=[5,0,8], fun=[[2,3],[4,6],[1,4]] + _remzero removes addends with coefficient equal to zero. + In this example ncoef=[5,8], nfun=[[2,3],[1,4]]""" ncoef=[] nfun=[] for c,f in zip(coef,fun): @@ -42,11 +72,11 @@ def _remzero(coef,fun): ncoef+=[c] nfun+=[f] return ncoef,nfun -def slatex(formula): #fancy function which makes latex code more readable, but still correct - formula=re.sub(r'\^{(.)}',r'^\1',latex(formula,fold_short_frac=True).replace(' ','').replace('\\left(','(').replace('\\right)',')')) - return re.sub(r'\{(\(.+?\))\}',r'\1',formula) +# ~ def slatex(formula): #fancy function which makes latex code more readable, but still correct + # ~ formula=re.sub(r'\^{(.)}',r'^\1',latex(formula,fold_short_frac=True).replace(' ','').replace('\\left(','(').replace('\\right)',')')) + # ~ return re.sub(r'\{(\(.+?\))\}',r'\1',formula) def _writ2(coef,fun,variables): - return slatex(S((str(coef)+'*'+'*'.join([str(x)+'^'+str(y) for x,y in zip(variables,fun)])))) + return latex(Poly({fun:coef},gens=variables).as_expr()) def _writ(coef,fun,nullvar): return str(coef)+'f('+str(fun)[1:-1-(len(fun)==1)]+')' def _check(coef,fun,res,rfun): @@ -61,19 +91,35 @@ def _powr(formula): else: return [formula,S('1')] def fractioncancel(formula): -#workaround for buggy cancel function + """workaround for buggy cancel function""" num,den=fraction(cancel(formula/S('tmp'))) den=den.subs(S('tmp'),S('1')) return num,den def ssolve(formula,variables): -#workaround for inconsistent solve function + """workaround for inconsistent solve function""" result=solve(formula,variables) if type(result)==dict: result=[[result[var] for var in variables]] return result -def sstr(formula): - return str(formula).replace('**','^').replace('*','').replace(' ','') +#def sstr(formula): +# return str(formula).replace('**','^').replace('*','').replace(' ','') +def assumeall(formula,**kwargs): + """Adds assumptions to all free symbols in formula. + >>> assumeall('sqrt(x*y)-sqrt(x)*sqrt(y)',positive=True) + 0 + """ + formula=S(formula) + fs=formula.free_symbols + for x in fs: + y=Symbol(str(x),**kwargs) + formula=formula.subs(x,y) + return formula def reducegens(formula): + """Reduces size of the generator of the polynomial + >>>Poly('x+sqrt(x)') + Poly(x + (sqrt(x)), x, sqrt(x), domain='ZZ') + >>>reducegens('x+sqrt(x)') + Poly((sqrt(x))**2 + (sqrt(x)), sqrt(x), domain='ZZ') """ pol=Poly(formula) newgens={} ind={} @@ -96,82 +142,90 @@ def reducegens(formula): newpol=newpol.replace(ind[gen],gen**newgens[gen]) return newpol def Sm(formula): -#Adds multiplication signs and sympifies a formula. -#For example, Sm('(2x+y)(7+5xz)') -> S('(2*x+y)*(7+5*x*z)') - if type(formula)==str: - formula=formula.replace(' ','') - for i in range(2): - formula=re.sub(r'([0-9a-zA-Z)])([(a-zA-Z])',r'\1*\2',formula) - formula=S(formula) - return formula + """Adds multiplication signs and sympifies a formula. + For example, Sm('(2x+y)(7+5xz)') -> S('(2*x+y)*(7+5*x*z)')""" + if type(formula)!=str: + if _isiterable(formula): return type(formula)(map(Sm,formula)) + else: return S(formula) + formula=formula.translate({ord('{'):None,ord('}'):' '}) + transformations = (standard_transformations +(implicit_multiplication_application,convert_xor)) + return parse_expr(formula, transformations=transformations) +# ~ def Sm(formula): +# ~ #Adds multiplication signs and sympifies a formula. +# ~ #For example, Sm('(2x+y)(7+5xz)') -> S('(2*x+y)*(7+5*x*z)') + # ~ if type(formula)==str: + # ~ formula=formula.replace(' ','') + # ~ for i in range(2): + # ~ formula=re.sub(r'([0-9a-zA-Z)])([(a-zA-Z])',r'\1*\2',formula) + # ~ formula=S(formula) + # ~ return formula def _input2fraction(formula,variables,values): -#makes some substitutions and converts formula to a fraction -#with expanded numerator and denominator + """makes some substitutions and converts formula to a fraction + with expanded numerator and denominator""" formula=S(formula) subst=[] for x,y in zip(variables,values): if y!=1: - sVars.display(sVars.translation['Substitute']+' $'+str(x)+'\\to '+slatex(S(y)*S(x))+'$') - subst+=[(x,x*y)] + z=newvar() + shiro.display(shiro.translation['Substitute']+' $'+latex(x)+'\\to '+latex(S(y)*S(z))+'$') + subst+=[(x,z*y)] formula=formula.subs(subst) numerator,denominator=fractioncancel(formula) - sVars.display(sVars.translation['numerator:']+' $'+slatex(numerator)+'$') - sVars.display(sVars.translation['denominator:']+' $'+slatex(denominator)+'$') + shiro.display(shiro.translation['numerator:']+' $'+latex(numerator)+'$') + shiro.display(shiro.translation['denominator:']+' $'+latex(denominator)+'$') return (numerator,denominator) def _formula2list(formula): -#Splits a polynomial to a difference of two polynomials with positive -#coefficients and extracts coefficients and powers of both polynomials. -#'variables' is used to set order of powers -#For example, If formula=5x^2-4xy+8y^3, variables=[x,y], then -#the program tries to prove that -#0<=5x^2-4xy+8y^3 -#4xy<=5x^2+8y^3 -#returns [4],[(1,1)], [5,8],[(2,0),(0,3)], (x,y) - formula=reducegens(formula) - neg=(formula.abs()-formula)/2 - pos=(formula.abs()+formula)/2 - neg=Poly(neg,gens=formula.gens) - pos=Poly(pos,gens=formula.gens) + """Splits a polynomial to a difference of two polynomials with positive + coefficients and extracts coefficients and powers of both polynomials. + 'variables' is used to set order of powers + For example, If formula=5x^2-4xy+8y^3, variables=[x,y], then + the program tries to prove that + 0<=5x^2-4xy+8y^3 + 4xy<=5x^2+8y^3 + returns [4],[(1,1)], [5,8],[(2,0),(0,3)], (x,y)""" + formula=reducegens(assumeall(formula,positive=True)) + neg=(formula.abs()-formula)*S('1/2') + pos=(formula.abs()+formula)*S('1/2') return neg.coeffs(),neg.monoms(),pos.coeffs(),pos.monoms(),Poly(formula).gens def _list2proof(lcoef,lfun,rcoef,rfun,variables,itermax,linprogiter,_writ2=_writ2,theorem="From weighted AM-GM inequality:"): -#Now the formula is splitted on two polynomials with positive coefficients. -#we will call them LHS and RHS and our inequality to prove would -#be LHS<=RHS (instead of 0<=RHS-LHS). + """Now the formula is splitted on two polynomials with positive coefficients. + we will call them LHS and RHS and our inequality to prove would + be LHS<=RHS (instead of 0<=RHS-LHS). + + Suppose we are trying to prove that + 30x^2y^2+60xy^4<=48x^3+56y^6 (assuming x,y>0). + Program will try to find some a,b,c,d such that + 30x^2y^2<=ax^3+by^6 + 60xy^4<=cx^3+dy^6 + where a+c<=48 and b+d<=56 (assumption 1). + We need some additional equalities to meet assumptions + of the weighted AM-GM inequality. + a+b=30 and c+d=60 (assumption 2) + 3a+0b=30*2, 0a+6b=30*2, 3c+0d=60*1, 0c+6d=60*4 (assumption 3) -#suppose we are trying to prove that -#30x^2y^2+60xy^4<=48x^3+56y^6 (assuming x,y>0) -#program will try to find some a,b,c,d such that -#30x^2y^2<=ax^3+by^6 -#60xy^4<=cx^3+dy^6 -#where a+c<=48 and b+d<=56 (assumption 1) -#We need some additional equalities to meet assumptions -#of the weighted AM-GM inequality. -#a+b=30 and c+d=60 (assumption 2) -#3a+0b=30*2, 0a+6b=30*2, 3c+0d=60*1, 0c+6d=60*4 (assumption 3) - -#The sketch of the algorithm. -# for i in range(itermax): - #1. Create a vector of random numbers (weights). - #2. Try to find real solution of the problem (with linprog). - #3. If there is no solution (status: 2) - #3a. If the solution was never found, break. - #3b. Else, step back (to the bigger inequality) - #4. If the soltuion was found (status: 0) - #Check out which of variables (in example: a,b,c,d) looks like integer. - #If there are some inequalities with all integer coefficients, subtract - #them from the original one. - #If LHS is empty, then break. - localseed=sVars.seed + The sketch of the algorithm. + for i in range(itermax): + 1. Create a vector of random numbers (weights). + 2. Try to find real solution of the problem (with linprog). + 3. If there is no solution (status: 2) + 3a. If the solution was never found, break. + 3b. Else, step back (to the bigger inequality) + 4. If the soltuion was found (status: 0) + Check out which of variables (in example: a,b,c,d) looks like integer. + If there are some inequalities with all integer coefficients, subtract + them from the original one. + If LHS is empty, then break.""" + localseed=shiro.seed bufer=[] lcoef,lfun=_remzero(lcoef,lfun) rcoef,rfun=_remzero(rcoef,rfun) itern=0 if len(lcoef)==0: #if LHS is empty - sVars.display(sVars.translation['status:']+' 0') + shiro.display(shiro.translation['status:']+' 0') status=0 elif len(rcoef)==0: #if RHS is empty, but LHS is not - sVars.display(sVars.translation['status:']+' 2') + shiro.display(shiro.translation['status:']+' 2') status=2 itermax=0 foundreal=0 @@ -208,9 +262,9 @@ def _list2proof(lcoef,lfun,rcoef,rfun,variables,itermax,linprogiter,_writ2=_writ res=linprog(vecc,A_eq=A,b_eq=b,A_ub=A_ub,b_ub=b_ub,options={'maxiter':linprogiter}) status=res.status if itern==1: - sVars.display(sVars.translation['status:']+' '+str(status)) + shiro.display(shiro.translation['status:']+' '+str(status)) if status==0: - sVars.display(sVars.translation[theorem]) + shiro.display(shiro.translation[theorem]) if status==2: #if real solution of current inequality doesn't exist if foundreal==0: #if this is the first inequality, then break break @@ -222,7 +276,7 @@ def _list2proof(lcoef,lfun,rcoef,rfun,variables,itermax,linprogiter,_writ2=_writ continue if status==0:#if found a solution with real coefficients for ineq in bufer: - sVars.display(ineq) + shiro.display(ineq) foundreal=1 bufer=[] oldlfun,oldrfun=lfun,rfun @@ -254,25 +308,25 @@ def _list2proof(lcoef,lfun,rcoef,rfun,variables,itermax,linprogiter,_writ2=_writ lcoef,lfun=_remzero(lcoef,lfun) rcoef,rfun=_remzero(rcoef,rfun) for ineq in bufer: - sVars.display(ineq) + shiro.display(ineq) lhs='+'.join([_writ2(c,f,variables) for c,f in zip(lcoef,lfun)]) if lhs=='': lhs='0' elif status==0: - sVars.display(sVars.translation[ + shiro.display(shiro.translation[ "Program couldn't find a solution with integer coefficients. Try "+ "to multiple the formula by some integer and run this function again."]) elif(status==2): - sVars.display(sVars.translation["Program couldn't find any proof."]) + shiro.display(shiro.translation["Program couldn't find any proof."]) #return res.status elif status==1: - sVars.display(sVars.translation["Try to set higher linprogiter parameter."]) + shiro.display(shiro.translation["Try to set higher linprogiter parameter."]) rhs='+'.join([_writ2(c,f,variables) for c,f in zip(rcoef,rfun)]) if rhs=='': rhs='0' - sVars.display('$$ '+slatex(lhs)+' \\le '+slatex(rhs)+' $$') + shiro.display('$$ '+latex(lhs)+' \\le '+latex(rhs)+' $$') if lhs=='0': - sVars.display(sVars.translation['The sum of all inequalities gives us a proof of the inequality.']) + shiro.display(shiro.translation['The sum of all inequalities gives us a proof of the inequality.']) return status def _isiterable(obj): try: @@ -281,18 +335,25 @@ def _isiterable(obj): except TypeError: return False def _smakeiterable(x): + if x=='': + return [] x=S(x) if _isiterable(x): return x return (x,) def _smakeiterable2(x): + if x=='': + return [] x=S(x) + if len(x)==0: + return [] if _isiterable(x[0]): return x return (x,) def prove(formula,values=None,variables=None,niter=200,linprogiter=10000): -#tries to prove that formula>=0 assuming all variables are positive + """tries to prove that formula>=0 assuming all variables are positive""" formula=S(formula) + addsymbols(formula) if variables: variables=_smakeiterable(variables) else: variables=sorted(formula.free_symbols,key=str) if values: values=_smakeiterable(values) @@ -301,46 +362,50 @@ def prove(formula,values=None,variables=None,niter=200,linprogiter=10000): st=_list2proof(*(_formula2list(num)+(niter,linprogiter))) if st==2 and issymetric(num): fs=sorted([str(x) for x in num.free_symbols]) - sVars.display(sVars.translation["It looks like the formula is symmetric. "+ + shiro.display(shiro.translation["It looks like the formula is symmetric. "+ "You can assume without loss of generality that "]+ - ' >= '.join([str(x) for x in fs])+'. '+sVars.translation['Try']) - sVars.display('prove(makesubs(S("'+str(num)+'"),'+ + ' >= '.join([str(x) for x in fs])+'. '+shiro.translation['Try']) + shiro.display('prove(makesubs(S("'+str(num)+'"),'+ str([(str(x),'oo') for x in variables[1:]])+')') return st def powerprove(formula,values=None,variables=None,niter=200,linprogiter=10000): -#This is a bruteforce and ineffective function for proving inequalities. -#It can be used as the last resort. + """This is a bruteforce and ineffective function for proving inequalities. + It can be used as the last resort.""" formula=S(formula) + addsymbols(formula) if variables: variables=_smakeiterable(variables) else: variables=sorted(formula.free_symbols,key=str) if values: values=_smakeiterable(values) else: values=[1]*len(variables) num,den=_input2fraction(formula,variables,values) - subst2=[] statusses=[] - for j in range(len(variables)): - subst2+=[(variables[j],1+variables[j])] + for i in range(1<R instead of a polynomial. provef checks if a formula -#is nonnegative for any nonnegative and convex function f. If so, it -#provides a proof of nonnegativity. + """This function is similar to prove, formula is a linear combination of + values of f:R^k->R instead of a polynomial. provef checks if a formula + is nonnegative for any nonnegative and convex function f. If so, it + provides a proof of nonnegativity.""" formula=S(formula) + addsymbols(formula) num,den=_input2fraction(formula,[],[]) return _list2proof(*(_formula2listf(num)+(niter,linprogiter,_writ,'From Jensen inequality:'))) -def issymetric(formula): #checks if formula is symmetric -#and has at least two variables +def issymetric(formula): + """checks if formula is symmetric + and has at least two variables""" + formula=S(formula) + addsymbols(formula) if len(formula.free_symbols)<2: return False ls=list(formula.free_symbols) @@ -425,9 +501,10 @@ def issymetric(formula): #checks if formula is symmetric return False return True def cyclize(formula,oper=operator.add,variables=None,init=None): -#cyclize('a^2*b')=S('a^2*b+b^2*a') -#cyclize('a^2*b',variables='a,b,c')=S('a^2*b+b^2*c+c^2*a') + """cyclize('a^2*b')=S('a^2*b+b^2*a') + cyclize('a^2*b',variables='a,b,c')=S('a^2*b+b^2*c+c^2*a')""" formula=S(formula) + addsymbols(formula) if variables==None: variables=sorted(formula.free_symbols,key=str) else: @@ -446,10 +523,11 @@ def cyclize(formula,oper=operator.add,variables=None,init=None): init=oper(init,formula) return init def symmetrize(formula,oper=operator.add,variables=None,init=None): -#symmetrize('a^2*b')=S('a^2*b+b^2*a') -#symmetrize('a^2*b',variables='a,b,c')= -#=S('a^2*b+a^2*c+b^2*a+b^2*c+c^2*a+c^2*b') + """symmetrize('a^2*b')=S('a^2*b+b^2*a') + symmetrize('a^2*b',variables='a,b,c')= + =S('a^2*b+a^2*c+b^2*a+b^2*c+c^2*a+c^2*b')""" formula=S(formula) + addsymbols(formula) if variables==None: variables=sorted(formula.free_symbols,key=str) else: @@ -457,8 +535,10 @@ def symmetrize(formula,oper=operator.add,variables=None,init=None): for i in range(1,len(variables)): formula=cyclize(formula,oper,variables[:i+1]) return formula -def findvalues(formula,values=None,variables=None): +def findvalues(formula,values=None,variables=None,**kwargs): + """finds a candidate for parameter "values" in "prove" function""" formula=S(formula) + addsymbols(formula) num,den=fractioncancel(formula) if variables==None: variables=sorted(num.free_symbols,key=str) @@ -471,5 +551,5 @@ def findvalues(formula,values=None,variables=None): values=[1.0]*len(variables) else: values=S(values) - tup=tuple(fmin(f2,values)) + tup=tuple(fmin(f2,values,**kwargs)) return tuple([x*x for x in tup]) diff --git a/statistics.ipynb b/statistics.ipynb new file mode 100644 index 0000000..fe47221 --- /dev/null +++ b/statistics.ipynb @@ -0,0 +1,1563 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this notebook several methods for proving inequalities have been compared.\n", + "\n", + "First of all we need a dataset. 35 inequalities were selected from https://www.imomath.com/index.php?options=592&lmm=0. Each inequality is represented by a tuple: inequality (in LaTeX), inequality constraints (for example: $a\\in [0,1]$, equality constraints (for example: $abc=1$) and a function which converts inequality to a formula which we want to prove it's nonnegativity. In most cases when this function is simply a difference between left and right-hand side, but sometimes it's better to use difference between squares of sides (to get rid of square roots). These tuples are used as parameters in `parser` function which converts them to equivalent inequalities with default constraints (i.e. all variables are positive).\n", + "\n", + "Some tuples have less than 4 elements. In this case `parser` use default arguments." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from importlib import reload\n", + "from sympy import *\n", + "import shiroindev\n", + "from shiroindev import *\n", + "from sympy.parsing.latex import parse_latex\n", + "shiro.seed=1\n", + "from IPython.display import Latex\n", + "shiro.display=lambda x:display(Latex(x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`sympy` has a `parse_latex` function which converts LaTeX formula to a `sympy` one. Unfortunately it doesn't deal with missing braces in the way that LaTeX do. For example `\\frac12` generates $\\frac12$ which is the same as `\\frac{1}{2}`, but `parse_latex` accepts only the second version. So here there is a boring function which adds missing braces." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\frac{ \\sqrt {3}}{2}\n", + "a^2+b^2+c^2\\geq ab+bc+ca\n" + ] + } + ], + "source": [ + "def addbraces(s):\n", + " arg={r'\\frac':2,r'\\sqrt':1}\n", + " s2=''\n", + " p=0\n", + " while 1:\n", + " m=re.search(r\"\\\\[a-zA-Z]+\", s[p:])\n", + " if not m:\n", + " break\n", + " s2+=s[p:p+m.end()]\n", + " #print('a',s[p:m.end()],p)\n", + " p+=m.end()\n", + " if m.group() in arg:\n", + " for i in range(arg[m.group()]):\n", + " sp=re.search('^ *',s[p:])\n", + " s2+=sp.group()\n", + " #print('b',sp.group(),p)\n", + " p+=sp.end()\n", + " if s[p]=='{':\n", + " cb=re.search(r'^\\{.*?\\}',s[p:])\n", + " ab=addbraces(cb.group())\n", + " s2+=ab\n", + " #print('c',ab,p)\n", + " p+=cb.end()\n", + " else:\n", + " s2+='{'+s[p]+'}'\n", + " #print('d','{'+s[p]+'}',p)\n", + " p+=1\n", + " #print('e',p)\n", + " s2+=s[p:]\n", + " return s2\n", + "print(addbraces(r'\\frac{ \\sqrt 3}2'))\n", + "print(addbraces(r'a^2+b^2+c^2\\geq ab+bc+ca'))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "#(formula,intervals,subs,function)\n", + "dif=lambda b,s:b-s\n", + "dif2=lambda b,s:b*b-s*s\n", + "ineqs=[\n", + " (r'a^2+b^2+c^2\\geq ab+bc+ca',),\n", + " (r'a^2+b^2+c^2+d^2\\geq a(b+c+d)',),\n", + " (r'1\\leq\\frac{a^2b^2}{c^2}+\\frac{b^2c^2}{a^2}+\\frac{c^2a^2}{b^2}',\n", + " '[0,1-f],[0,1]','[a,sqrt(1-e-f)],[b,sqrt(e)],[c,sqrt(f)]',),\n", + " (r'\\frac1{1-x^2}+\\frac1{1-y^2}\\geq \\frac2{1-xy}','[0,1],[0,1]'),\n", + " (r'a^3+b^3\\geq a^2b+ab^2',),\n", + " (r'\\frac a{b+c}+\\frac b{c+a}+\\frac c{a+b}\\geq \\frac32',),\n", + " (r'2a^3+b^3\\geq 3a^2b',),\n", + " (r'a^3+b^3+c^3\\geq a^2b+b^2c+c^2a',),\n", + " (r'\\frac a{b+c}+\\frac b{c+d}+ \\frac c{d+a}+ \\frac d{a+b}\\geq 2',),\n", + " (r'\\frac{a^3}{a^2+ab+b^2}+ \\frac{b^3}{b^2+bc+c^2}+ \\frac{c^3}{c^2+ca+a^2} \\geq \\frac{a+b+c}3',),\n", + " (r'\\sqrt{ab}+\\sqrt{cd}+\\sqrt{ef}\\leq\\sqrt{(a+c+e)(b+d+f)}','','',dif2),\n", + " (r'\\frac{5a^3-ab^2}{a+b}+\\frac{5b^3-bc^2}{b+c}+\\frac{5c^3-ca^2}{c+a}\\geq 2(a^2+b^2+c^2)',),\n", + " #(r'\\frac{a^2}{(1+b)(1-c)}+\\frac{b^3}{(1+c)(1-d)}+\\frac{c^3}{(1+d)(1-a)}+\\frac{d^3}{(1+a)(1-b)}\\geq\\frac1{15}',\n", + " # '[0,1-c-d],[0,1-d],[0,1]','[a,1-b-c-d]'),\n", + " (r'\\frac{x^3}{(1+y)(1+z)}+\\frac{y^3}{(1+z)(1+x)}+\\frac{z^3}{(1+x)(1+y)}\\geq\\frac{3}{4}','','[z,1/(x*y)]'),\n", + " (r'\\frac ab+\\frac bc+\\frac ca\\geq \\frac{(a+b+c)^2}{ab+bc+ca}',),\n", + " (r'\\frac{a^2}b+\\frac{b^2}c+\\frac{c^2}a\\geq \\frac{a^2+b^2+c^2}{a+b+c}',),\n", + " (r'\\frac{a^2}b+\\frac{b^2}c+\\frac{c^2}a\\geq a+b+c+\\frac{4(a-b)^2}{a+b+c}',),\n", + " (r'\\frac1{a^3+b^3+abc}+ \\frac1{b^3+c^3+abc} +\\frac1{c^3+a^3+ abc} \\leq \\frac1{abc}',),\n", + " (r'\\frac1{a^3(b+c)}+ \\frac1{b^3(c+a)}+ \\frac1{c^3(a+b)} \\geq \\frac32','','[c,1/(a*b)]'),\n", + " (r'\\frac{a^3}{b^2-bc+c^2}+\\frac{b^3}{c^2-ca+a^2} + \\frac{c^3}{a^2-ab+b^2} \\geq 3 \\cdot\\frac{ab+bc+ca}{a+b+c}',),\n", + " (r'\\frac{x^5-x^2}{x^5+y^2+z^2}+\\frac{y^5-y^2}{y^5+z^2+x^2}+\\frac{z^5-z^2}{z^5+x^2+y^2}\\geq0','','[x,1/(y*z)]'),\n", + " (r'(a+b-c)(b+c-a)(c+a-b)\\leq abc',),\n", + " (r'\\frac1{1+xy}+\\frac1{1+yz}+\\frac1{1+zx}\\leq \\frac34','','[x,(y+z)/(y*z-1)]'),\n", + " (r'\\frac{x\\sqrt x}{y+z}+\\frac{y\\sqrt y}{z+x}+\\frac{z\\sqrt z}{x+y}\\geq\\frac{ \\sqrt 3}2',\n", + " '[0,1-z],[0,1]','[x,1-y-z]'),\n", + " (r'a^4+b^4+c^4+d^4\\geq 4abcd',),\n", + " (r'\\frac{ab}{a+b}+\\frac{bc}{b+c}+\\frac{ca}{c+a}\\leq\\frac{3(ab+bc+ca)}{2(a+b+c)}',),\n", + " (r'\\sqrt{a-1}+\\sqrt{b-1}+ \\sqrt{c-1} \\leq \\sqrt{c(ab+1)}','[1,oo],[1,oo],[1,oo]','',dif2),\n", + " (r'(x-1)(y-1)(z-1)\\geq 8','[0,1-b-c],[0,1-c],[0,1]','[x,1/a],[y,1/b],[z,1/c]'),\n", + " (r'ay+bz+cx\\leq s^2','[0,s],[0,s],[0,s]','[x,s-a],[y,s-b],[z,s-c]'),\n", + " (r'x_1^2+x_2^2+x_3^2+x_4^2+x_5^2\\geq 2 (x_1x_2+x_2x_3+x_3x_4+x_4x_5)/\\sqrt{3}',),\n", + " (r' xy+yz+zx - 2xyz \\leq \\frac7{27}', '[0,1-z],[0,1]','[x,1-y-z]'),\n", + " (r'0 \\leq xy+yz+zx - 2xyz', '[0,1-z],[0,1]','[x,1-y-z]'),\n", + " (r'\\sqrt{3+a+b+c}\\geq\\sqrt a+\\sqrt b+\\sqrt c','[1-z,1],[0,1]','[a,1/x-1],[b,1/y-1],[c,1/z-1],[x,2-y-z]',\n", + " dif2),\n", + " (r'\\frac{2a^3}{a^2+b^2}+\\frac{2b^3}{b^2+c^2}+\\frac{2c^3}{c^2+a^2}\\geq a+b+c',),\n", + " (r'\\frac{a^2}{b+c}+\\frac{b^2}{c+a}+\\frac{c^2}{a+b}\\geq \\frac12','[0,1-c],[0,1]','[a,1-b-c]'),\n", + " (r'\\frac{a+b}{2b+c}+\\frac{b+c}{2c+a}+\\frac{c+a}{2a+b}\\geq 2',),\n", + " #(r'\\frac x{5-y^2}+\\frac y{5-z^2}+\\frac z{5-x^2}\\geq \\frac34','[0,sqrt(5)],[0,sqrt(5)]','[x,1/(y*z)]')\n", + "]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def parser(formula,intervals='[]',subs='[]',func=dif):\n", + " newproof()\n", + " shiro.display=lambda x:None\n", + " #display=lambda x:None\n", + " if intervals=='':\n", + " intervals='[]'\n", + " if subs=='':\n", + " subs='[]'\n", + " formula=addbraces(formula)\n", + " formula=Sm(str(parse_latex(formula)))\n", + " formula,_=fractioncancel(formula)\n", + " formula=formula.subs(shiroindev._smakeiterable2(subs))\n", + " formula=makesubs(formula,intervals)\n", + " b,s=formula.lhs,formula.rhs\n", + " if type(formula)==LessThan:\n", + " b,s=s,b\n", + " formula=func(b,s)\n", + " formula=simplify(formula)\n", + " num,den=fractioncancel(formula)\n", + " return num" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 35/35 [00:46<00:00, 1.32s/it]\n" + ] + } + ], + "source": [ + "from tqdm import tqdm\n", + "ineqs2=[]\n", + "for ineq in tqdm(ineqs):\n", + " ineqs2+=[parser(*ineq)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's look at the formulas when converted to polynomials." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{2} - ab - ac + b^{2} - bc + c^{2}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**2 - a*b - a*c + b**2 - b*c + c**2, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{2} - ab - ac - ad + b^{2} + c^{2} + d^{2}, a, b, c, d, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**2 - a*b - a*c - a*d + b**2 + c**2 + d**2, a, b, c, d, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{4}b^{2} + a^{3}b^{2} - a^{3}b - 2 a^{2}b + a^{2} + ab^{2} - ab + b^{2}, a, b, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**4*b**2 + a**3*b**2 - a**3*b - 2*a**2*b + a**2 + a*b**2 - a*b + b**2, a, b, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 2 a^{3}b + a^{3} - 4 a^{2}b^{2} - a^{2}b + a^{2} + 2 ab^{3} - ab^{2} - 2 ab + b^{3} + b^{2}, a, b, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(2*a**3*b + a**3 - 4*a**2*b**2 - a**2*b + a**2 + 2*a*b**3 - a*b**2 - 2*a*b + b**3 + b**2, a, b, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{3} - a^{2}b - ab^{2} + b^{3}, a, b, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**3 - a**2*b - a*b**2 + b**3, a, b, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 2 a^{3} - a^{2}b - a^{2}c - ab^{2} - ac^{2} + 2 b^{3} - b^{2}c - bc^{2} + 2 c^{3}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(2*a**3 - a**2*b - a**2*c - a*b**2 - a*c**2 + 2*b**3 - b**2*c - b*c**2 + 2*c**3, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 2 a^{3} - 3 a^{2}b + b^{3}, a, b, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(2*a**3 - 3*a**2*b + b**3, a, b, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{3} - a^{2}b - ac^{2} + b^{3} - b^{2}c + c^{3}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**3 - a**2*b - a*c**2 + b**3 - b**2*c + c**3, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{3}c + a^{3}d + a^{2}b^{2} - a^{2}bd - 2 a^{2}c^{2} - a^{2}cd + a^{2}d^{2} + ab^{3} - ab^{2}c - ab^{2}d - abc^{2} + ac^{3} - acd^{2} + b^{3}d + b^{2}c^{2} - 2 b^{2}d^{2} + bc^{3} - bc^{2}d - bcd^{2} + bd^{3} + c^{2}d^{2} + cd^{3}, a, b, c, d, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**3*c + a**3*d + a**2*b**2 - a**2*b*d - 2*a**2*c**2 - a**2*c*d + a**2*d**2 + a*b**3 - a*b**2*c - a*b**2*d - a*b*c**2 + a*c**3 - a*c*d**2 + b**3*d + b**2*c**2 - 2*b**2*d**2 + b*c**3 - b*c**2*d - b*c*d**2 + b*d**3 + c**2*d**2 + c*d**3, a, b, c, d, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 2 a^{5}b^{2} + 2 a^{5}bc + 2 a^{5}c^{2} + a^{4}b^{3} - a^{4}b^{2}c - a^{4}bc^{2} + a^{4}c^{3} + a^{3}b^{4} - 2 a^{3}b^{3}c - 4 a^{3}b^{2}c^{2} - 2 a^{3}bc^{3} + a^{3}c^{4} + 2 a^{2}b^{5} - a^{2}b^{4}c - 4 a^{2}b^{3}c^{2} - 4 a^{2}b^{2}c^{3} - a^{2}bc^{4} + 2 a^{2}c^{5} + 2 ab^{5}c - ab^{4}c^{2} - 2 ab^{3}c^{3} - ab^{2}c^{4} + 2 abc^{5} + 2 b^{5}c^{2} + b^{4}c^{3} + b^{3}c^{4} + 2 b^{2}c^{5}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(2*a**5*b**2 + 2*a**5*b*c + 2*a**5*c**2 + a**4*b**3 - a**4*b**2*c - a**4*b*c**2 + a**4*c**3 + a**3*b**4 - 2*a**3*b**3*c - 4*a**3*b**2*c**2 - 2*a**3*b*c**3 + a**3*c**4 + 2*a**2*b**5 - a**2*b**4*c - 4*a**2*b**3*c**2 - 4*a**2*b**2*c**3 - a**2*b*c**4 + 2*a**2*c**5 + 2*a*b**5*c - a*b**4*c**2 - 2*a*b**3*c**3 - a*b**2*c**4 + 2*a*b*c**5 + 2*b**5*c**2 + b**4*c**3 + b**3*c**4 + 2*b**2*c**5, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( ad + af - 2 \\sqrt{a}\\sqrt{b}\\sqrt{c}\\sqrt{d} - 2 \\sqrt{a}\\sqrt{b}\\sqrt{e}\\sqrt{f} + bc + be + cf - 2 \\sqrt{c}\\sqrt{d}\\sqrt{e}\\sqrt{f} + de, \\sqrt{a}, \\sqrt{b}, \\sqrt{c}, \\sqrt{d}, \\sqrt{e}, \\sqrt{f}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly((sqrt(a))**2*(sqrt(d))**2 + (sqrt(a))**2*(sqrt(f))**2 - 2*(sqrt(a))*(sqrt(b))*(sqrt(c))*(sqrt(d)) - 2*(sqrt(a))*(sqrt(b))*(sqrt(e))*(sqrt(f)) + (sqrt(b))**2*(sqrt(c))**2 + (sqrt(b))**2*(sqrt(e))**2 + (sqrt(c))**2*(sqrt(f))**2 - 2*(sqrt(c))*(sqrt(d))*(sqrt(e))*(sqrt(f)) + (sqrt(d))**2*(sqrt(e))**2, sqrt(a), sqrt(b), sqrt(c), sqrt(d), sqrt(e), sqrt(f), domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 3 a^{4}b + 3 a^{4}c - 2 a^{3}b^{2} + 2 a^{3}c^{2} + 2 a^{2}b^{3} - 6 a^{2}b^{2}c - 6 a^{2}bc^{2} - 2 a^{2}c^{3} + 3 ab^{4} - 6 ab^{2}c^{2} + 3 ac^{4} + 3 b^{4}c - 2 b^{3}c^{2} + 2 b^{2}c^{3} + 3 bc^{4}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(3*a**4*b + 3*a**4*c - 2*a**3*b**2 + 2*a**3*c**2 + 2*a**2*b**3 - 6*a**2*b**2*c - 6*a**2*b*c**2 - 2*a**2*c**3 + 3*a*b**4 - 6*a*b**2*c**2 + 3*a*c**4 + 3*b**4*c - 2*b**3*c**2 + 2*b**2*c**3 + 3*b*c**4, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 4 x^{8}y^{4} + 4 x^{7}y^{4} - 3 x^{5}y^{5} - 3 x^{5}y^{4} + 4 x^{4}y^{8} + 4 x^{4}y^{7} - 3 x^{4}y^{5} - 6 x^{4}y^{4} - 3 x^{4}y^{3} - 3 x^{3}y^{4} - 3 x^{3}y^{3} + 4 xy + 4, x, y, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(4*x**8*y**4 + 4*x**7*y**4 - 3*x**5*y**5 - 3*x**5*y**4 + 4*x**4*y**8 + 4*x**4*y**7 - 3*x**4*y**5 - 6*x**4*y**4 - 3*x**4*y**3 - 3*x**3*y**4 - 3*x**3*y**3 + 4*x*y + 4, x, y, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "13\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{3}c^{2} + a^{2}b^{3} - a^{2}b^{2}c - a^{2}bc^{2} - ab^{2}c^{2} + b^{2}c^{3}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**3*c**2 + a**2*b**3 - a**2*b**2*c - a**2*b*c**2 - a*b**2*c**2 + b**2*c**3, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "14\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{4}c + a^{3}c^{2} + a^{2}b^{3} + ab^{4} + b^{2}c^{3} + bc^{4}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**4*c + a**3*c**2 + a**2*b**3 + a*b**4 + b**2*c**3 + b*c**4, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "15\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{4}c - 4 a^{3}bc + a^{3}c^{2} + a^{2}b^{3} + 6 a^{2}b^{2}c - 2 a^{2}bc^{2} + ab^{4} - 4 ab^{3}c - 2 ab^{2}c^{2} + b^{2}c^{3} + bc^{4}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**4*c - 4*a**3*b*c + a**3*c**2 + a**2*b**3 + 6*a**2*b**2*c - 2*a**2*b*c**2 + a*b**4 - 4*a*b**3*c - 2*a*b**2*c**2 + b**2*c**3 + b*c**4, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "16\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{6}b^{3} + a^{6}c^{3} - 2 a^{5}b^{2}c^{2} + a^{3}b^{6} + a^{3}c^{6} - 2 a^{2}b^{5}c^{2} - 2 a^{2}b^{2}c^{5} + b^{6}c^{3} + b^{3}c^{6}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**6*b**3 + a**6*c**3 - 2*a**5*b**2*c**2 + a**3*b**6 + a**3*c**6 - 2*a**2*b**5*c**2 - 2*a**2*b**2*c**5 + b**6*c**3 + b**3*c**6, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "17\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 2 a^{8}b^{8} + 2 a^{7}b^{6} + 2 a^{6}b^{7} - 3 a^{6}b^{5} - 3 a^{5}b^{6} + 2 a^{5}b^{5} - 3 a^{5}b^{3} + 2 a^{5}b^{2} - 6 a^{4}b^{4} + 2 a^{4}b^{3} + 2 a^{4} - 3 a^{3}b^{5} + 2 a^{3}b^{4} - 3 a^{3}b^{2} + 2 a^{3}b + 2 a^{2}b^{5} - 3 a^{2}b^{3} + 2 ab^{3} + 2 b^{4}, a, b, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(2*a**8*b**8 + 2*a**7*b**6 + 2*a**6*b**7 - 3*a**6*b**5 - 3*a**5*b**6 + 2*a**5*b**5 - 3*a**5*b**3 + 2*a**5*b**2 - 6*a**4*b**4 + 2*a**4*b**3 + 2*a**4 - 3*a**3*b**5 + 2*a**3*b**4 - 3*a**3*b**2 + 2*a**3*b + 2*a**2*b**5 - 3*a**2*b**3 + 2*a*b**3 + 2*b**4, a, b, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "18\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{8} - a^{6}bc - 2 a^{5}b^{3} + a^{5}b^{2}c + a^{5}bc^{2} - 2 a^{5}c^{3} + 3 a^{4}b^{4} - a^{4}b^{3}c + 2 a^{4}b^{2}c^{2} - a^{4}bc^{3} + 3 a^{4}c^{4} - 2 a^{3}b^{5} - a^{3}b^{4}c - a^{3}b^{3}c^{2} - a^{3}b^{2}c^{3} - a^{3}bc^{4} - 2 a^{3}c^{5} + a^{2}b^{5}c + 2 a^{2}b^{4}c^{2} - a^{2}b^{3}c^{3} + 2 a^{2}b^{2}c^{4} + a^{2}bc^{5} - ab^{6}c + ab^{5}c^{2} - ab^{4}c^{3} - ab^{3}c^{4} + ab^{2}c^{5} - abc^{6} + b^{8} - 2 b^{5}c^{3} + 3 b^{4}c^{4} - 2 b^{3}c^{5} + c^{8}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**8 - a**6*b*c - 2*a**5*b**3 + a**5*b**2*c + a**5*b*c**2 - 2*a**5*c**3 + 3*a**4*b**4 - a**4*b**3*c + 2*a**4*b**2*c**2 - a**4*b*c**3 + 3*a**4*c**4 - 2*a**3*b**5 - a**3*b**4*c - a**3*b**3*c**2 - a**3*b**2*c**3 - a**3*b*c**4 - 2*a**3*c**5 + a**2*b**5*c + 2*a**2*b**4*c**2 - a**2*b**3*c**3 + 2*a**2*b**2*c**4 + a**2*b*c**5 - a*b**6*c + a*b**5*c**2 - a*b**4*c**3 - a*b**3*c**4 + a*b**2*c**5 - a*b*c**6 + b**8 - 2*b**5*c**3 + 3*b**4*c**4 - 2*b**3*c**5 + c**8, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "19\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( y^{18}z^{9} + 2 y^{16}z^{14} - y^{15}z^{9} + 2 y^{14}z^{16} - y^{14}z^{13} - y^{13}z^{14} - y^{13}z^{11} - y^{12}z^{12} + y^{12}z^{9} - y^{11}z^{13} - y^{11}z^{7} + 2 y^{11}z^{4} - y^{10}z^{5} + y^{9}z^{18} - y^{9}z^{15} + y^{9}z^{12} - y^{9}z^{6} - y^{8}z^{4} - y^{7}z^{11} - y^{7}z^{5} + 2 y^{7}z^{2} - y^{6}z^{9} + y^{6}z^{6} - y^{5}z^{10} - y^{5}z^{7} + 2 y^{4}z^{11} - y^{4}z^{8} - y^{3}z^{3} + 2 y^{2}z^{7} + 1, y, z, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(y**18*z**9 + 2*y**16*z**14 - y**15*z**9 + 2*y**14*z**16 - y**14*z**13 - y**13*z**14 - y**13*z**11 - y**12*z**12 + y**12*z**9 - y**11*z**13 - y**11*z**7 + 2*y**11*z**4 - y**10*z**5 + y**9*z**18 - y**9*z**15 + y**9*z**12 - y**9*z**6 - y**8*z**4 - y**7*z**11 - y**7*z**5 + 2*y**7*z**2 - y**6*z**9 + y**6*z**6 - y**5*z**10 - y**5*z**7 + 2*y**4*z**11 - y**4*z**8 - y**3*z**3 + 2*y**2*z**7 + 1, y, z, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{3} - a^{2}b - a^{2}c - ab^{2} + 3 abc - ac^{2} + b^{3} - b^{2}c - bc^{2} + c^{3}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**3 - a**2*b - a**2*c - a*b**2 + 3*a*b*c - a*c**2 + b**3 - b**2*c - b*c**2 + c**3, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "21\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 2 y^{4}z^{2} - y^{3}z^{3} - 5 y^{3}z + 2 y^{2}z^{4} - 9 y^{2}z^{2} + 5 y^{2} - 5 yz^{3} + 23 yz + 5 z^{2} - 9, y, z, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(2*y**4*z**2 - y**3*z**3 - 5*y**3*z + 2*y**2*z**4 - 9*y**2*z**2 + 5*y**2 - 5*y*z**3 + 23*y*z + 5*z**2 - 9, y, z, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 2 a^{\\frac{5}{2}}b\\frac{1}{\\sqrt{a b + a + b + 1}} + 2 a^{\\frac{5}{2}}\\frac{1}{\\sqrt{a b + a + b + 1}} + 2 a^{2}b^{\\frac{7}{2}}\\frac{1}{\\sqrt{b + 1}} + 2 a^{2}b^{\\frac{5}{2}}\\frac{1}{\\sqrt{b + 1}} + 2 a^{2}b^{2}\\frac{1}{a b \\sqrt{a b + a + b + 1} + a \\sqrt{a b + a + b + 1} + b \\sqrt{a b + a + b + 1} + \\sqrt{a b + a + b + 1}} - a^{2}b^{2}\\sqrt{3} + 2 a^{2}b\\frac{1}{a b \\sqrt{a b + a + b + 1} + a \\sqrt{a b + a + b + 1} + b \\sqrt{a b + a + b + 1} + \\sqrt{a b + a + b + 1}} - a^{2}b\\sqrt{3} + 2 a^{\\frac{3}{2}}b\\frac{1}{\\sqrt{a b + a + b + 1}} + 4 ab^{\\frac{7}{2}}\\frac{1}{\\sqrt{b + 1}} + 4 ab^{\\frac{5}{2}}\\frac{1}{\\sqrt{b + 1}} + 4 ab^{2}\\frac{1}{a b \\sqrt{a b + a + b + 1} + a \\sqrt{a b + a + b + 1} + b \\sqrt{a b + a + b + 1} + \\sqrt{a b + a + b + 1}} - 2 ab^{2}\\sqrt{3} + 2 ab^{\\frac{3}{2}}\\frac{1}{\\sqrt{b + 1}} + 6 ab\\frac{1}{a b \\sqrt{a b + a + b + 1} + a \\sqrt{a b + a + b + 1} + b \\sqrt{a b + a + b + 1} + \\sqrt{a b + a + b + 1}} - 2 ab\\sqrt{3} + 2 a\\frac{1}{a b \\sqrt{a b + a + b + 1} + a \\sqrt{a b + a + b + 1} + b \\sqrt{a b + a + b + 1} + \\sqrt{a b + a + b + 1}} - a\\sqrt{3} + 2 b^{\\frac{7}{2}}\\frac{1}{\\sqrt{b + 1}} + 2 b^{\\frac{5}{2}}\\frac{1}{\\sqrt{b + 1}} + 2 b^{2}\\frac{1}{a b \\sqrt{a b + a + b + 1} + a \\sqrt{a b + a + b + 1} + b \\sqrt{a b + a + b + 1} + \\sqrt{a b + a + b + 1}} - b^{2}\\sqrt{3} + 4 b\\frac{1}{a b \\sqrt{a b + a + b + 1} + a \\sqrt{a b + a + b + 1} + b \\sqrt{a b + a + b + 1} + \\sqrt{a b + a + b + 1}} - b\\sqrt{3} + 2 \\frac{1}{a b \\sqrt{a b + a + b + 1} + a \\sqrt{a b + a + b + 1} + b \\sqrt{a b + a + b + 1} + \\sqrt{a b + a + b + 1}}, \\sqrt{a}, \\sqrt{b}, \\frac{1}{a b \\sqrt{a b + a + b + 1} + a \\sqrt{a b + a + b + 1} + b \\sqrt{a b + a + b + 1} + \\sqrt{a b + a + b + 1}}, \\frac{1}{\\sqrt{a b + a + b + 1}}, \\frac{1}{\\sqrt{b + 1}}, \\sqrt{3}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(2*(sqrt(a))**5*(sqrt(b))**2*(1/sqrt(a*b + a + b + 1)) + 2*(sqrt(a))**5*(1/sqrt(a*b + a + b + 1)) + 2*(sqrt(a))**4*(sqrt(b))**7*(1/sqrt(b + 1)) + 2*(sqrt(a))**4*(sqrt(b))**5*(1/sqrt(b + 1)) + 2*(sqrt(a))**4*(sqrt(b))**4*(1/(a*b*sqrt(a*b + a + b + 1) + a*sqrt(a*b + a + b + 1) + b*sqrt(a*b + a + b + 1) + sqrt(a*b + a + b + 1))) - (sqrt(a))**4*(sqrt(b))**4*(sqrt(3)) + 2*(sqrt(a))**4*(sqrt(b))**2*(1/(a*b*sqrt(a*b + a + b + 1) + a*sqrt(a*b + a + b + 1) + b*sqrt(a*b + a + b + 1) + sqrt(a*b + a + b + 1))) - (sqrt(a))**4*(sqrt(b))**2*(sqrt(3)) + 2*(sqrt(a))**3*(sqrt(b))**2*(1/sqrt(a*b + a + b + 1)) + 4*(sqrt(a))**2*(sqrt(b))**7*(1/sqrt(b + 1)) + 4*(sqrt(a))**2*(sqrt(b))**5*(1/sqrt(b + 1)) + 4*(sqrt(a))**2*(sqrt(b))**4*(1/(a*b*sqrt(a*b + a + b + 1) + a*sqrt(a*b + a + b + 1) + b*sqrt(a*b + a + b + 1) + sqrt(a*b + a + b + 1))) - 2*(sqrt(a))**2*(sqrt(b))**4*(sqrt(3)) + 2*(sqrt(a))**2*(sqrt(b))**3*(1/sqrt(b + 1)) + 6*(sqrt(a))**2*(sqrt(b))**2*(1/(a*b*sqrt(a*b + a + b + 1) + a*sqrt(a*b + a + b + 1) + b*sqrt(a*b + a + b + 1) + sqrt(a*b + a + b + 1))) - 2*(sqrt(a))**2*(sqrt(b))**2*(sqrt(3)) + 2*(sqrt(a))**2*(1/(a*b*sqrt(a*b + a + b + 1) + a*sqrt(a*b + a + b + 1) + b*sqrt(a*b + a + b + 1) + sqrt(a*b + a + b + 1))) - (sqrt(a))**2*(sqrt(3)) + 2*(sqrt(b))**7*(1/sqrt(b + 1)) + 2*(sqrt(b))**5*(1/sqrt(b + 1)) + 2*(sqrt(b))**4*(1/(a*b*sqrt(a*b + a + b + 1) + a*sqrt(a*b + a + b + 1) + b*sqrt(a*b + a + b + 1) + sqrt(a*b + a + b + 1))) - (sqrt(b))**4*(sqrt(3)) + 4*(sqrt(b))**2*(1/(a*b*sqrt(a*b + a + b + 1) + a*sqrt(a*b + a + b + 1) + b*sqrt(a*b + a + b + 1) + sqrt(a*b + a + b + 1))) - (sqrt(b))**2*(sqrt(3)) + 2*(1/(a*b*sqrt(a*b + a + b + 1) + a*sqrt(a*b + a + b + 1) + b*sqrt(a*b + a + b + 1) + sqrt(a*b + a + b + 1))), sqrt(a), sqrt(b), 1/(a*b*sqrt(a*b + a + b + 1) + a*sqrt(a*b + a + b + 1) + b*sqrt(a*b + a + b + 1) + sqrt(a*b + a + b + 1)), 1/sqrt(a*b + a + b + 1), 1/sqrt(b + 1), sqrt(3), domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "23\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{4} - 4 abcd + b^{4} + c^{4} + d^{4}, a, b, c, d, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**4 - 4*a*b*c*d + b**4 + c**4 + d**4, a, b, c, d, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{3}b^{2} + a^{3}c^{2} + a^{2}b^{3} - 2 a^{2}b^{2}c - 2 a^{2}bc^{2} + a^{2}c^{3} - 2 ab^{2}c^{2} + b^{3}c^{2} + b^{2}c^{3}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**3*b**2 + a**3*c**2 + a**2*b**3 - 2*a**2*b**2*c - 2*a**2*b*c**2 + a**2*c**3 - 2*a*b**2*c**2 + b**3*c**2 + b**2*c**3, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "25\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( def + de + df - 2 \\sqrt{d}\\sqrt{e} - 2 \\sqrt{d}\\sqrt{f} + ef - 2 \\sqrt{e}\\sqrt{f} + f + 2, \\sqrt{d}, \\sqrt{e}, \\sqrt{f}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly((sqrt(d))**2*(sqrt(e))**2*(sqrt(f))**2 + (sqrt(d))**2*(sqrt(e))**2 + (sqrt(d))**2*(sqrt(f))**2 - 2*(sqrt(d))*(sqrt(e)) - 2*(sqrt(d))*(sqrt(f)) + (sqrt(e))**2*(sqrt(f))**2 - 2*(sqrt(e))*(sqrt(f)) + (sqrt(f))**2 + 2, sqrt(d), sqrt(e), sqrt(f), domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "26\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( de^{2}f^{2} + de^{2}f + 2 def^{2} - 6 def + de + df^{2} + df + e^{2}f^{2} + e^{2}f + 2 ef^{2} + 3 ef + e + f^{2} + 2 f + 1, d, e, f, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(d*e**2*f**2 + d*e**2*f + 2*d*e*f**2 - 6*d*e*f + d*e + d*f**2 + d*f + e**2*f**2 + e**2*f + 2*e*f**2 + 3*e*f + e + f**2 + 2*f + 1, d, e, f, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "27\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( s^{2}def + s^{2}, s, d, e, f, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(s**2*d*e*f + s**2, s, d, e, f, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "28\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( -2 \\sqrt{3}x_{1}x_{2} - 2 \\sqrt{3}x_{2}x_{3} - 2 \\sqrt{3}x_{3}x_{4} - 2 \\sqrt{3}x_{4}x_{5} + 3 x_{1}^{2} + 3 x_{2}^{2} + 3 x_{3}^{2} + 3 x_{4}^{2} + 3 x_{5}^{2}, \\sqrt{3}, x_{1}, x_{2}, x_{3}, x_{4}, x_{5}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(-2*(sqrt(3))*x_1*x_2 - 2*(sqrt(3))*x_2*x_3 - 2*(sqrt(3))*x_3*x_4 - 2*(sqrt(3))*x_4*x_5 + 3*x_1**2 + 3*x_2**2 + 3*x_3**2 + 3*x_4**2 + 3*x_5**2, sqrt(3), x_1, x_2, x_3, x_4, x_5, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "29\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 7 a^{2}b^{3} - 6 a^{2}b^{2} - 6 a^{2}b + 7 a^{2} + 14 ab^{3} - 12 ab^{2} + 15 ab - 13 a + 7 b^{3} - 6 b^{2} - 6 b + 7, a, b, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(7*a**2*b**3 - 6*a**2*b**2 - 6*a**2*b + 7*a**2 + 14*a*b**3 - 12*a*b**2 + 15*a*b - 13*a + 7*b**3 - 6*b**2 - 6*b + 7, a, b, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "30\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{2}b^{2} + a^{2}b + 2 ab^{2} + ab + a + b^{2} + b, a, b, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**2*b**2 + a**2*b + 2*a*b**2 + a*b + a + b**2 + b, a, b, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "31\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( -2 \\frac{1}{\\sqrt{b}}\\sqrt{\\frac{a^{2} b^{2}}{a^{2} b + a^{2} + a b^{2} + 3 a b + 2 a + b^{2} + 2 b + 1} + \\frac{a^{2} b}{a^{2} b + a^{2} + a b^{2} + 3 a b + 2 a + b^{2} + 2 b + 1} + \\frac{a b^{2}}{a^{2} b + a^{2} + a b^{2} + 3 a b + 2 a + b^{2} + 2 b + 1} + \\frac{a b}{a^{2} b + a^{2} + a b^{2} + 3 a b + 2 a + b^{2} + 2 b + 1}} - 2 \\frac{1}{\\sqrt{b}}\\sqrt{\\frac{a b}{a^{2} b + a^{2} + a b + 2 a + 1} + \\frac{b}{a^{2} b + a^{2} + a b + 2 a + 1}} - 2 \\sqrt{\\frac{a^{2} b^{2}}{a^{2} b + a^{2} + a b^{2} + 3 a b + 2 a + b^{2} + 2 b + 1} + \\frac{a^{2} b}{a^{2} b + a^{2} + a b^{2} + 3 a b + 2 a + b^{2} + 2 b + 1} + \\frac{a b^{2}}{a^{2} b + a^{2} + a b^{2} + 3 a b + 2 a + b^{2} + 2 b + 1} + \\frac{a b}{a^{2} b + a^{2} + a b^{2} + 3 a b + 2 a + b^{2} + 2 b + 1}}\\sqrt{\\frac{a b}{a^{2} b + a^{2} + a b + 2 a + 1} + \\frac{b}{a^{2} b + a^{2} + a b + 2 a + 1}} + 3, \\frac{1}{\\sqrt{b}}, \\sqrt{\\frac{a^{2} b^{2}}{a^{2} b + a^{2} + a b^{2} + 3 a b + 2 a + b^{2} + 2 b + 1} + \\frac{a^{2} b}{a^{2} b + a^{2} + a b^{2} + 3 a b + 2 a + b^{2} + 2 b + 1} + \\frac{a b^{2}}{a^{2} b + a^{2} + a b^{2} + 3 a b + 2 a + b^{2} + 2 b + 1} + \\frac{a b}{a^{2} b + a^{2} + a b^{2} + 3 a b + 2 a + b^{2} + 2 b + 1}}, \\sqrt{\\frac{a b}{a^{2} b + a^{2} + a b + 2 a + 1} + \\frac{b}{a^{2} b + a^{2} + a b + 2 a + 1}}, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(-2*(1/sqrt(b))*(sqrt(a**2*b**2/(a**2*b + a**2 + a*b**2 + 3*a*b + 2*a + b**2 + 2*b + 1) + a**2*b/(a**2*b + a**2 + a*b**2 + 3*a*b + 2*a + b**2 + 2*b + 1) + a*b**2/(a**2*b + a**2 + a*b**2 + 3*a*b + 2*a + b**2 + 2*b + 1) + a*b/(a**2*b + a**2 + a*b**2 + 3*a*b + 2*a + b**2 + 2*b + 1))) - 2*(1/sqrt(b))*(sqrt(a*b/(a**2*b + a**2 + a*b + 2*a + 1) + b/(a**2*b + a**2 + a*b + 2*a + 1))) - 2*(sqrt(a**2*b**2/(a**2*b + a**2 + a*b**2 + 3*a*b + 2*a + b**2 + 2*b + 1) + a**2*b/(a**2*b + a**2 + a*b**2 + 3*a*b + 2*a + b**2 + 2*b + 1) + a*b**2/(a**2*b + a**2 + a*b**2 + 3*a*b + 2*a + b**2 + 2*b + 1) + a*b/(a**2*b + a**2 + a*b**2 + 3*a*b + 2*a + b**2 + 2*b + 1)))*(sqrt(a*b/(a**2*b + a**2 + a*b + 2*a + 1) + b/(a**2*b + a**2 + a*b + 2*a + 1))) + 3, 1/sqrt(b), sqrt(a**2*b**2/(a**2*b + a**2 + a*b**2 + 3*a*b + 2*a + b**2 + 2*b + 1) + a**2*b/(a**2*b + a**2 + a*b**2 + 3*a*b + 2*a + b**2 + 2*b + 1) + a*b**2/(a**2*b + a**2 + a*b**2 + 3*a*b + 2*a + b**2 + 2*b + 1) + a*b/(a**2*b + a**2 + a*b**2 + 3*a*b + 2*a + b**2 + 2*b + 1)), sqrt(a*b/(a**2*b + a**2 + a*b + 2*a + 1) + b/(a**2*b + a**2 + a*b + 2*a + 1)), domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "32\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( a^{5}b^{2} + a^{5}c^{2} + a^{4}b^{3} - a^{4}b^{2}c - a^{4}bc^{2} - a^{4}c^{3} - a^{3}b^{4} + a^{3}c^{4} + a^{2}b^{5} - a^{2}b^{4}c - a^{2}bc^{4} + a^{2}c^{5} - ab^{4}c^{2} - ab^{2}c^{4} + b^{5}c^{2} + b^{4}c^{3} - b^{3}c^{4} + b^{2}c^{5}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(a**5*b**2 + a**5*c**2 + a**4*b**3 - a**4*b**2*c - a**4*b*c**2 - a**4*c**3 - a**3*b**4 + a**3*c**4 + a**2*b**5 - a**2*b**4*c - a**2*b*c**4 + a**2*c**5 - a*b**4*c**2 - a*b**2*c**4 + b**5*c**2 + b**4*c**3 - b**3*c**4 + b**2*c**5, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "33\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 2 a^{2}d^{3} - a^{2}d^{2} - a^{2}d + 2 a^{2} + 4 ad^{3} - 2 ad^{2} - 3 a + 2 d^{3} - d^{2} - d + 2, a, d, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(2*a**2*d**3 - a**2*d**2 - a**2*d + 2*a**2 + 4*a*d**3 - 2*a*d**2 - 3*a + 2*d**3 - d**2 - d + 2, a, d, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "34\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\operatorname{Poly}{\\left( 2 a^{3} - 3 a^{2}b + a^{2}c + ab^{2} - 3 ac^{2} + 2 b^{3} - 3 b^{2}c + bc^{2} + 2 c^{3}, a, b, c, domain=\\mathbb{Z} \\right)}$" + ], + "text/plain": [ + "Poly(2*a**3 - 3*a**2*b + a**2*c + a*b**2 - 3*a*c**2 + 2*b**3 - 3*b**2*c + b*c**2 + 2*c**3, a, b, c, domain='ZZ')" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for i,ineq in zip(range(len(ineqs2)),ineqs2):\n", + " print(i)\n", + " display(reducegens(assumeall(ineq,positive=True)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Most formulas was converted to polynomials of independent variables. However formulas No. 22 and No. 31 were not. For this reason it's very unlikely that any method of proving these ones will succeed.\n", + "\n", + "Now let's try some methods of proving these inequalities. The first one would be the simple `prove`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "tm=[0]*4" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,2,2,0,2,2,0,2,0,2,0,\n", + "20.714609994000057\n" + ] + }, + { + "data": { + "text/plain": [ + "Counter({0: 21, 2: 14})" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from collections import Counter\n", + "from timeit import default_timer as timer\n", + "start=timer()\n", + "t=[]\n", + "for ineq in ineqs2:\n", + " t+=[prove(ineq)]\n", + " print(t[-1],end=',')\n", + "tm[0]=timer()-start\n", + "print('\\n',tm[0],sep='')\n", + "Counter(t)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Code 0 means that the proof was found, all other codes means that proof wasn't found. So this method has proved 21 inequalities.\n", + "\n", + "The second method uses `findvalues` function, rationalizes the result numbers and gives them as additional parameter to `prove` function." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,2,0,0,2,2,0,2,0,2,0,\n", + "21.832711064998875\n" + ] + }, + { + "data": { + "text/plain": [ + "Counter({0: 24, 2: 11})" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def cut(a):\n", + " if a<=0 or a>=100 or (a is None):\n", + " return 1\n", + " return a\n", + "start=timer()\n", + "t2=[]\n", + "for ineq in ineqs2:\n", + " numvalues=findvalues(ineq,disp=0)\n", + " values=nsimplify(numvalues,tolerance=0.1,rational=True)\n", + " values=list(map(cut,values))\n", + " t2+=[prove(ineq,values=values)]\n", + " print(t2[-1],end=',')\n", + "tm[1]=timer()-start\n", + "print('\\n',tm[1],sep='')\n", + "Counter(t2)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The third method is similar to the second one, but instead of rationalize values it squares, rationalizes and makes square roots of these values." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,2,0,0,2,2,0,2,0,2,0,\n", + "21.697120987002563\n" + ] + }, + { + "data": { + "text/plain": [ + "Counter({0: 23, 2: 12})" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def cut(a):\n", + " if a<=0 or a>=1000 or (a is None):\n", + " return S(1)\n", + " return a\n", + " \n", + "start=timer()\n", + "t3=[]\n", + "for ineq in ineqs2:\n", + " numvalues=findvalues(ineq,disp=0)\n", + " numvalues=tuple([x**2 for x in numvalues])\n", + " values=nsimplify(numvalues,tolerance=0.1,rational=True)\n", + " values=[sqrt(x) for x in values]\n", + " values=list(map(cut,values))\n", + " t3+=[prove(ineq,values=values)]\n", + " print(t3[-1],end=',')\n", + "tm[2]=timer()-start\n", + "print('\\n',tm[2],sep='')\n", + "Counter(t3)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, the fourth method is a slight modification to the third method. It does the same \"findvalues, square, rationalize and make square roots\" thing, but then it scales the values and runs it again. It can sometimes help with uniform formulas." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,2,0,0,0,2,0,2,0,2,0,\n", + "23.187820409999404\n" + ] + }, + { + "data": { + "text/plain": [ + "Counter({0: 24, 2: 11})" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def betw(a):\n", + " return a>0.001 and a<1000 and a!=None\n", + "def cut(a):\n", + " if betw(a):\n", + " return a\n", + " return S(1)\n", + "\n", + "start=timer()\n", + "t4=[]\n", + "for ineq in ineqs2:\n", + " numvalues=findvalues(ineq,disp=0)\n", + " n=1\n", + " numvalues2=[]\n", + " for i in numvalues:\n", + " if betw(i):\n", + " n=1/i\n", + " break\n", + " for i in numvalues:\n", + " if betw(i):\n", + " numvalues2+=[i*n]\n", + " else:\n", + " numvalues2+=[1]\n", + " numvalues3=findvalues(ineq,values=numvalues2,disp=0)\n", + " numvalues4=tuple([x**2 for x in numvalues3])\n", + " values=nsimplify(numvalues4,tolerance=0.1,rational=True)\n", + " values=[sqrt(x) for x in values]\n", + " values=list(map(cut,values))\n", + " t4+=[prove(ineq,values=values)]\n", + " print(t4[-1],end=',')\n", + "tm[3]=timer()-start\n", + "print('\\n',tm[3],sep='')\n", + "Counter(t4)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "

" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.bar(['1','2','3','4'],tm)\n", + "plt.ylabel('time [seconds]')\n", + "plt.xlabel('method')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "u=pd.DataFrame(zip(['']*len(ineqs),t,t2,t3,t4))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.bar(['1','2','3','4'],[sum(u[i]==0)/len(ineqs2)*100 for i in range(1,5)])\n", + "plt.ylabel('inequalities proven [%]')\n", + "plt.xlabel('method')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Down below there are contingency tables and McNemar test for every pair of methods." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
2FalseTrue
1
False113
True021
\n", + "
" + ], + "text/plain": [ + "2 False True \n", + "1 \n", + "False 11 3\n", + "True 0 21" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
3FalseTrue
1
False122
True021
\n", + "
" + ], + "text/plain": [ + "3 False True \n", + "1 \n", + "False 12 2\n", + "True 0 21" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
4FalseTrue
1
False113
True021
\n", + "
" + ], + "text/plain": [ + "4 False True \n", + "1 \n", + "False 11 3\n", + "True 0 21" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
3FalseTrue
2
False110
True123
\n", + "
" + ], + "text/plain": [ + "3 False True \n", + "2 \n", + "False 11 0\n", + "True 1 23" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
4FalseTrue
2
False101
True123
\n", + "
" + ], + "text/plain": [ + "4 False True \n", + "2 \n", + "False 10 1\n", + "True 1 23" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
4FalseTrue
3
False111
True023
\n", + "
" + ], + "text/plain": [ + "4 False True \n", + "3 \n", + "False 11 1\n", + "True 0 23" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " for j in range(i+1,4):\n", + " display(pd.crosstab(u[i+1]==0, u[j+1]==0))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pvalue 0.25\n", + "statistic 0.0\n", + "pvalue 0.5\n", + "statistic 0.0\n", + "pvalue 0.25\n", + "statistic 0.0\n", + "pvalue 1.0\n", + "statistic 0.0\n", + "pvalue 1.0\n", + "statistic 1.0\n", + "pvalue 1.0\n", + "statistic 0.0\n" + ] + } + ], + "source": [ + "from statsmodels.stats.contingency_tables import mcnemar\n", + "for i in range(4):\n", + " for j in range(i+1,4):\n", + " print(mcnemar(pd.crosstab(u[i+1]==0, u[j+1]==0)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In all cases p-value is greater than 0.05, so there is no statistical difference between the methods." + ] + } + ], + "metadata": { + "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 +} diff --git a/statistics.pdf b/statistics.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5d30eec2fcbcf58b5ba85cb5f95d94225f6e4e95 GIT binary patch literal 71326 zcma%iQ;;q&v+W-2v2EM7ZQHgzv&S=gY}>YN+qV6U&AacZ`*2R3`|v*`ol3eY4_)c3 z)mb4`5D}wgq+^95J-P+FLNPKEFc8=qSwZpe(2H5xxR^T8i`f{un2MMh+nbou%b41k zyI2q~v9UAr@j*GeIGGySLV0X7YyFAcY(xC%%^he1j@}xAkyNbxjV21M6G2_mr`z~D zVkA^6x=hcfP;S;CiEeJJeS-?XdgaP1m}BUoGAAb zV0Qlvl35q#fEG4BZ8bniOcYMuC=ka0Nya`YueV(!tH!=wkh8P%IjF#p01Bjz!Yp=> zW*JB!!_v>cSb81>zGOVl&AgYi$je9yDVs(Z!wHGn{ws}P<%l0Oq-@=!857l%_-5js z-C2DST(el)IdRfVnGVpQs+rzjlhH6njo)Adi%fLaAmrO4->R7?+3A+ZC&Ap2xX|OM zc+#noI6*r9sbnxu9-ufBT2+yG9(BiXH<656v{{YIE5#euEi_U5$EtR+Nz!^9LxIkl zs11G(Y8n12gDw_r!J*KeIL@0IT^72BN$CX3Wkgu&lYkKhx)C|EWPMrvW|yCjPY(Gc zo`(LRX&nLK(MOHu7`RahLql)I@l3?F&fbE5KmD)tPB;pv3ISd71vJ;L-Y_e}*;F$t$y z_t&g!vYDtdw~_HLh9vz3o!()L>^`wmXF*{8mJ4}6f&gYSzF3bIQX<4mkY*ns5Q5%6 zKdfE%u6(x1XW(#%E{^~RS~&Je=r@T(ny%*uR?>nf440o8@&?)`14;NT_lEn1WFUGo zGFfm)l`32o^o`t4@0lqdVU(ELlPms1RAO+b+wV(lL~ktGuW`@yt{x0R z2Lsue)y!+nP2ma*)?n%@WtL8KbMaki zpU^&QX~k4bH9$|sZcpPaT?MYUG?bqzucgK*-Ix(ue=#u0m9rhfp+Yn?Ej}{_hoP_# zQvZR+o78ZPs>Z@$F$4$#XJE0+xwjb)1ak|1_`HZ(=U?FdVP2iGGqDq2k@LYq%pJjf z+ov#rKUcHLyp9ft)of%eEY>N0*&O*Rc%=aXNDfzNfg!6t%+BzZsHExMXZFseU!yi}|b@+!n7R!#=IP=v2fku}TFmV&j8$4xmU2QfWRucJhit2J z1T~0(VA^&YKq+HtJ=B$emD~u*sxb0Lv>W$rsF>OO8H|G*Xd! zzrARII{%v1>5HpKwBZMZw*8F7gj~-k1M_w2EIWP5;NeIgdd3JxV+~QgW1?Elv>V#! z`G_oWP&j$TGQgE940e49@hr57E4tSgMECf%iRR+30m-cX^vCYNxV?R3=HLL(G$~U9+ zq-l94-*miUl&1#u%ACPN7D;KS@a8&ZrFt7{Vr*{>ar=H1w6TFJWNMDDf{-KDZwf~> z@P3|JYNm`a&&Nn954p=TXi~tA~-0-Y!%0H=`_KU5gtH@Tk!WtSf$sLGJC(fG3|91)Tin79j zkDw&?Z&IrkSyhwW7s(}NRagF5bo1cQn0mv6l)n|EL1|t;bbGSXUsEe}alzE4H(!5% zh$=!tXT9mImsC9_l~#r`M`Y-VFF-0Sl_x6Nc`999mKWVsJLXKgg(#+QRA$W%7=4_W z%YP3=D7+RQBq`klS!I_Ox45p9LIdSwF_RyA_XN5#@07v;Au+XzT5D?jh5+Iog^zfJ za;dZL5=X!TsK4#*Pwb$P z5=V00B*+~&6s*X1CyDaz6@OV?{v2nwIV84erBK?ATkM+q{ww@d7vN*M+jDQ<&30Yr zYcb@SSkbx{+F*B9AK(*=IyfM~At22h;;b@=sJtCE_rkXk10yel z#O3S;cx}n9%^;C|Sz)DD`cN&Xnp%Z^(ly?NgV|87TBX}Aja|85t!{Z|)P)2RMdoj( z4k&xQ)P-z%|EvK8)}C1IYuh!Xj*|WPMHrw}edxg}(kAhD>{O387i-)MC}G zX|3*zN{eHF9B=9P?9*hIb1nMvJ?h=I=^T-}_g!TmHn zSJJyT@vA-QhI=jdlFb+X!#Nr=Sl92``Za0+s?;Uws~L5Q^eVOz9~Wm0AG;4EGUnLntL}-nUrz`Bsdkv;-B2#8>Gh5r!sIKu3 z0U(4xfs1X|VpuhLmcnVhrW$nSVrk7kG#-4-6?>W?Tb8TusQGBD=AmBu(8vejSMF?c zsU8yaysDGSt>Yc)V0`{L=FP$~Q#D#;AG>o|aiW z2Xoo=Hbmf`KlRrfVz>uOTHOZweJ*Z?iB_5Uy%f99;~XW}fWu83+(Ov9nrdhfmj;a) zUI+3&W_|um_3LP$J@(2-E9Sz4(GaI(<{yVO6A>d^wgh|IE7R;6&Os}w2)_j+~*>YCnCRt;RjVM>r+5LrGp{g)7)yBJ}jHo zn{$sCPkuF8J2T6yW^7kmM|ONOTrMyzO2HE6MZ@=4eZGh80u4_ogF~6xnfyQO`ET@p z(JCYRe*#;XIT={~2W-{dw8Lpf^qEzMi3?5MD%?4#rU#4q1(ZPGDZR%Y4f^;Pg#)5j zO}icd=>Pn)hMusD{`6cXZ@8LLg*aOm8Cs>RN@D(CO3W7iC2zxI`6JJ^Y@gZNv-|n} z;!T{;CIMCN`BR5T71=zWnfY#Bvew1FrN`^n)AQ%2c6xWmK0)Jy|L0BoCRZN6WX?s; zZ&&!wX+Im9A@lmw8HcK6?fT-~a<;@`+jmOAFf>wCpC%0M8)0+e#clmvjPlx@u6JCpZgnq{H2v?j93}Gl`I1$e z5ATmR!1i^ArLDfgwgBZvX7=#0)wLvUCW-xAK|LfLsOuC-o-{-@S-q5M?Rtdfahl{D z8X}i9xIfFs?c+!5Y-gn%Xhx5O@sHIHOE%%pvo}JbbjZZvkO}N{Ei2T-?(E9taa+*{W92C?4X12rXrM^}AD^xc#L|4V zuya*@(#{vL%l$?mvSut2k6}zVOo+WPSSVM)mq=3Vuwh7^#FAT8qOr9)Xs*PWr=MTt zW4Y2IWmMA$Z5EGxqG%n;RtcV3P>acVD=yxwc7^n<$hb5%ged6Y8x)(=(*;Yq(vtF# z7h>bl(48B_jty%N8G=g{P*qsv^?;7xk<%ni7Akw+v@8Mo5oM%LcvzH1zAF+NVZ(wC z7SZg;ThdCDe5p>dscjj0yMP+bLJc4KrL2jY>rSmE!Cwz?8~D2-ouw#zRd>efuj?C? z@c1V}iRMilMO>2;TXC862$6dAxCQq_*yM6EG;T13k*REC$||amUh2o+f(`!Ygy&GF z;tIPab9@+v#~20Brvyuh&FVPvx4nM4c(A5zEmhhps=R26dOlu!dQ6jrrep_5@0C(W zuMzh!j^pc;V3q)>mk!Lqg1Y3)d80$t+$a(mR(}xyFV+oSQUW^Nvw<4)tS3Hd% zsX;t!Kp2e+NQ6cU#?;oMpoj;Bu;BKIxJbcSIJ%KDhu3qWZnOymV<^k~_z5lEy~6shx8{j+)Hn zqBN0gQMPB#qr77-mz|c2xUh7qq*+}fMXzO1%9&27J`PFGP|c)97z#weOKHHbL984Q zd`SVopOufq0=*4uvz8iA-=D|l*1BM<>K8QgoYR^i-AU?-L8ZNVD21}KHj`;Om+I3t z3rVJC$ljk*WP7*ivUQVxFadzv3%!DhN25==I+2P^V1a&qoZhBK`j`2hhzcZDaGe!5 zH<}Ws$_85OXPQ0b;G^TUR}trKh@6dSm`>fad2(02+#^q-eue7A}~=})hn7=o{-&emUmb2S*K&(rPY z!5jHrpAQu~z=EUqyZ+m`=f|h*PnXZ@vxd*t>&GDy?O8nFz$}67)S19^4cb*(mJ*6J zJjL&iCW<`AL(vS3QtmhvqC?``)7SlrB4mHJ|vnoAtBOw2eIt z_EV24l8&|KfeF;Q9#DO6mql&aIrF#^40Jnt_oK5I)CP)NlU#k#b?@_pssrI1o;3qhQTlx(C) z)cka)WX_XBvSuNLWDyYH#wiLFePB=sq>BHMSWFPICl}%Ps54e{jQ1PdtTXGP@Rq!; zv~bPst6_2#Q{(XXtX(=@(Wdhthgbn>z*7!x#N%aRFwHG{Xmji4t#B=c3N?z>w--zJ zMzvtXS|Hq5COZyeS{cPSDY`=(8Fe&`i^!<4GkQhLtu=|#uxehC>sdN)$C_~TvajN} zo*uM`DH|vtBCJ@88RcT1SVing`3aQ#@Mh zfy(aLrw$jckUeuea@huj*<1m1H>yp&>Jl#!bA~h0;dH+R`h-hf^{xw@{NOipj<%<_ zFs5we@&OVJYo<#W6X=$B*3%*)fzf0{0U?#rf!iiDS``H0ay$FMC!GB|;;3?l9dU{M z_kulgX?lqp{1WB|)A(e3{WS$hDci2(`W#dEELS8C)J;St487bWvh|Y|eqxcbV3**{ zl6{6m{3M>79oMc`{v1%p3aVtIBbo(Cjr}@=?HMCGGRdo3?{`9X9?F5y&n2K*My}cJ z(nquo8+6#2+t%Ewk=#eB42>WR>bJyzuoCR6y+Fk}1~lb+g*bykN{KvfFfr7qzdcqm zJHLDQBLZKDqdJZ>ZfXJm3HPqk?Lg`6Wx*}PNigQ?`%Ns8+JYx}q{Co~2||U3FcH(p z=5y`>qnId}#4~$!-fbMV1COs9LH(b6GkI&OF8;%qbSQfaz4GSr%)P*)z&I!F;`S8J zK7h`nRa(D*3F5 zV07cjgtT#3s!*mlCOJ=}I8dx=XkaECG*FAZ9GTYKq`cfdRcByZ)KAQ=^rZa5Z#wl2 zN6h4CgV38vlf0kg#B&Y_5e1IN$V{byjD8K=c|L5l_^-HM?FrRVJM7`XinjwUMM}*#46g+ zxk2FM-4ewLkovr%yDmNrp9p;CCG$JaKo)TZXN*8b^)~ngJgK1ffkTj)JH`3H=;Hv+ zYnom>Gf&BEf$nqKwFIiq)H@$$f}ixZ=<4fdW^zNiQGz-sc6BWTi;e-JO$-iBKq&b> zL<{B3vMeMI7Qjw-&*PUnKJajj@(1GUJ3HLY>*cOT7;=P@M`vgT4(ZGel6fpQDee~Q zH&9?N*;-#<)9&GjAdX*NP$&oC?x=x#D|4-Q)&x>1uvtr&@G!r?Z3k%QP6Kox``a4$ zK!Z~`R^q~LJ%#(D6#g152if#@U!gonBaQUN>))ma$--41p2$wxSquJbN^8_J z=CQpUqtQn%K!sAszK9J+RAR42`@fn`SZ1t@V5%&yi;d!zjX!^hRx0^Yy9)_rkq zTd(jbm$U8@?Rj(I*=qOE!HZ$ZiB8u(b@$XRf<(13QIWL*F|3u*# z6z|`}vwO%pm+-33cayjs;+KV5-=ngske2eQ|=hf?^kAU=TAfyFadCg20!B>NHiLL#Ml~2>14hZLH;kYxtaa#Kvgr z6iUnam=s3U@hMw&bd#S_D6{+>H-9j4^4_WvcaY#w>1%E|E?dm4BARp&=xvF_AHvXW zeXM4j>4}ELBGG|i(dj`m51DBw`0oF8HJxR(TZ1jyAH@DREia+J(xUL0o;(gebcIkl zJ4x#?{aXqU18yP?Fu?rCX%`uSyV!j(K2y9RwqXLk4yFE}PKd8F+Vc_)Qdkg=3d3+~ zV`ZU;uXdAbOXN*H2a*i0U6iU8a;;_L-PhZuTqQbWs#tJ$r1$vL`Wh;^ToX(lbZyey z&|`nR;Vd~e>_v*pSQlvvdmE&FeA426%Rd0)rU2tj3^`%RjFydT({iIq0Cd2c2S z0)u2ndLog+o^{IBBVo7@4z@4(iS6qv&Q0r~v(FzmVOF83^8?S3oA3~!w_BC7Dx4^Z zJy00Nwz4BN} zCb6FeM=u+dIZQFWct}gPfCZe5P9?0w1)f+HcdJ(&fIU80QSDete`#u8h{v%Ua@hIE z!CQ`m&oMhKLZPdRVG0C(LzOsz zYB|%*4H2s>VM(ius;*#79Y<%;s`p=r4M;>vXdglm)27VVpGB#J-$8iHPio+W;}+8^ zbtWGQin?n3Gx19iOxmb|`A^4IXp^rplYoO;vK5bp$2nsgq+FauF{%LM9bQ6jz**DmPEj5ju+H zaCqgF$b_St^O-y+G_Wu36jC~B$X9@i0O3-y7Qr_@NRufBE;P7RzW!&H3B|NN=lyeu zUFChs;~}WcnI6F>$jd|H zb8jkX;f?EW27bgrAaRA-C6jsVsLQ5`SmLgCPVOqH0yoVISB6rDNCmGmoxv8355)tZ z+*u1{43^^%Bdx(K-hV|MRZv=&aEDz~7vXW57H}L;R?SW^xa`)Q|I3-9+Fd4I(44A7 z!hw|^UXfB%8nx5x3JyymBU*NjEZ;&Cj0!$G*wUKla&WS#9?$ytY;>vrtez{7BY`kd z7Po6h)${CY7F-8!qkb!3VJb7|PsY)RLJYRG9Xc5ePO3lr&Ndq8Z;Alj<)AU73US zFi)3wfgsm-g2F>u;Aurap}qJga!@tUPTs0}63FSRQ340_5k|=^wAMXRy1_bAZlX1O zgMGuIDbQI0*K#4|`3DJIGSA6p{r-J(;fqjQDgl_n6axcl0zN)>}lt0rD-QDn?7l18`P0!Cc0% zbqu~mjD6d;%&$thfqtauW>h@*hFT6vWJs9vE0)Ys!zrPEU@1)x(S)U&Xb$GwCNM_M z9Qh14u8lEFOJv~eA3gBh>`Gf!Uh+OyI)-7AUtDppVh1i%XKOQw>xQP&eB445?wZ1- zFJc0(b#oZwP9cBN(Y^NbkL<%Vv9s=jd?Z}Uf83(=WEk6ymqX)?JxG&2shJC(z|lD! zBD9}Olz)F5gui7%(7UeL2%jkgnvkG=9wBfm)?K|*iP)qvm^|U+vYR~ByjrByi(XEQ zr&b`0b#@LI7!N0XC!9}y(3R;iR*YrA#>U)m5QVQ=svS!!h*5*McjZ8B92~WLi--Uh zt%@3O=M@wWOk}~PmQGz8f?kZbqngf6InkR$Zgwz?>grO{+L+MfV*JX>Y&LPIE#Gka3)8T5)4H_uvRa?B`QmP!Ere8rV zZH2!f+&o!?x-oyd@dfTW#ri??KIIrp{#{RGI)RKS(5LiL$Uxq&mDz~B4$tNs6mUwC z3NPC#8yvcXV9QuVwBV>EUQ>+#?aUG1pNIBB=}d#fcxveE;vBkez>#rspNbK@)?7;Y zKq7Z!0ww^FScg~ofAsGEO`7oeweH$~h%aI)8{NZ@ms zi15YZF%|98?cfqFuCO&!JhgB^ft`0Vrk#5r?6UIU5~-_H?LM|KU3t2qp6F~(hzn?V zN{7m`@d*K@*H%BDkF#ypubD&IzFaN#Fvr{?k7qLB!;YJ<^;;-_j-UYBg9-+BL6!<>4+KFncOIod;wE7Z^h>pbg4tC&h#R%Zc$eOmor}wD-L$LOBT%f4(@M_=gG;7> zZwORs34x%CWqV~Sgr%Rg_ByyCAc5sGKBMC_DB&{hF5fl&E7Cn*?vTiPT*kMqsoVBPiC45d<4}B;lzb@O zLif*Oc^qB$sCcfiU#?K$=20+Mhm^!Xp~WR%8Svt(xY)c(ZUGf4&ye{0tU#boD5 z8P_6U-qTVE(}h`-Xas9#8vX)<#z2A7h|mZg9y9`Vj>_4wzcD(ljer7aJ79t@j~Z2*IaYNWwki3PevqA2a^_e`6<`m=+)XjnZHH@Wrng%hE^q1M%;{h2Pk%K< z>*MK7KdnXn-PAPsZtpQWZ&PkjJACmo;+Y$kz%*~bkTBn zB3tHfimlcbjlFB4dcvEi#Jj*;MKr1j%G}B#7o_k#YijWQv+zDJUWGHq!_JQM^);Th z(>%=C{MFNgo64e$>!-KMF~|S&Dm~c{y}qPrjC7zBm#&*?BsB_!4U5_4C-U^Qp#T(_N@=U3riEJ$emFIqVl(b6v8B zZm=L)U&~)0Z+v~_DZY@>l4;jVKZ{TB$AEJ3*E$dF=&yAa+Sy;KOY*Sz1f7=Ui~{bv zxoW3yag`KTIC(K9wu6IPyR~Z108_6`hxZ^r(RFK7tSlP zM2Tcq&y$A}VVr-*`A_fHyTa8hAR;o3^5nyrw>>hPazps8t&8?OYusVULEJ3KH}@vS ztAwGKkH31e#DQ%*5{Xg%f@f8}`Ehr3)0o}9n_l(;Qc^00jjHnpqw!{>bcQ>k!! zjdBuqS5R@cP^VxOEzmchr@Iij>+l_Jqs9%{%_a;VgWky8KV3{6iR;`068RR|K@fj9 zM3&3$N5p*=94i^hbxOPOf>2C!GujY?XbQ$W-=E`8!?;QWTx03I)wtYVjPYNK&W#k6 zwGJBNBoo^NEl6BhiU8I^sk#P8U!bmr#DfEwF|L~#yKh9EPqy2Wb=NN?5y{xPoy2rf;V7p(mgjvCkt%%>(KpibL+BEX907o;L-|j zd28~a`R?plm8sC+t2!QdoUvgy4J2P**B!o1ui)%*mT zzqxS2ZHDnbF^2}B)fP83mKZ|E&syZt`j9sF8v zgimsM_~qsk*KD(~ys44*%FQMym&coc!}T}$%=}`1t|$(?TjUk&~vJOMVed;TwbyrNN zHk&*WZrTue(D6Nn=Rg>c1v)cz<8xK&hqT?)sW$r9Z+TQ%Mx{0Y{&^-e0sm*%b-JB zKZLBXdG}u**7Rtg|=IsOKSLuo8w$aZf($V%e>#=ly%+ul)GS4l?!jaz}fsJ~*(4sdT488&%ckS3T|XR4cAW zl|@Bah}>2J@AcWe3#OXfJIqsv#i;RmMY;4`Q>X2h67F`lN-xb&o#VR-bn?m^)=(wY zzy?12dpsWDOpg)$f(Eqav7C(=$2HN-bDViJjijF~5?pE8j!cVz2in9cV|UAR;A}0Q zx3Kk+uQ;u*(I@k21b1fFiskXcYB?RX%Fe4s*inot##5U?`p1}()&VnfD>zrP4`Yjo zCvO4fF1XzUujRFZYyF5jNIDrv2*sBIL7v$92PE?Xx8n`&tn^*cjJuPUj_5UE9P49R zx{^sT*n|+?_29NnI~yU(YUc*TfRzgZU8lY`iWqefVeG{YKNpD6yUY(guBqQ!HZHw# zy>XrKSiBLG(P?OMu?f2xu@!U>&r2_e(X&tToS(XL2x?El#CJhDa$Ae8N>qK3vX$p^kpu zul=-EMce;Bd6nZo$*WAPtp7t%2GEtS-C~35eNldW4Ft5MNL#0v7SXez!Xl%2IAu7gS;96_h_&9HA#bXl5L-A%`ir zjS)foEV+wSYpQBI2AHD|-zq>eR?B5&GOecQ0ydjZfUy0I@a9z>@K#LrYn8|N&05wo z>}qC!VsBQ8mC@hv9SRam0g-{uF}Rci(y#(a+#_c37D^qG z7}VnR_2k#%?fx`SXPp=2%Psd$0seQ?G~L=t8guw=4kdbc z9L!uGkkSB^lq8r02nY?T$+6?IKF-K|1QE9rlU1H4luDu*5gQ^q*xyn?2j6uW^_;)I zbAyF64J%w%lB%Oii(WI_`m+#iEP4I8=y8f4%Kh`*@F34ikTcPE z7s7-z1Q&6;|0NQLQu15!pDu}EYJ6@>(OJ0g2M4>`$L8BgOT_L$->zC~v%Rm-I$Y%; zz|W{f_okFTBR2zI{_QWZ+ki=Eh#+GU{@O?w0v?Nt>WZvV0jB<=;zrBz1elcnzc=vr zMH14jRZQlhqgD>mzA!F&B$Id#tT0g6!XQ}$$d{+QkYJH*c^iNv^{I$Z$ub8@_&&Tw zA_3AhbWBK+Oitm4tjn}JttAe`3Nkhu8AQrQhp|4S?jmkt}AZTf=|4~G|m~QF0>Er1|i{1LD(oX$mGxiiYUeWl_?Wx-}^%M?M)I~QXXGTcxo;g zCFHG*fyDSn8+3d;{}Ml)CLgiRSg!{BWpu$eqI3NdiboLr}f%L23*D3IaYV>ASeUmw{ox3frNVy~FUp$5jOf1SkAueyFF+dL$Z z0UusULSkU^cEo?KJb$o#Ix~uf-ddQ|R>I`kac>GX#u7K9zoz4nK(jJYc>}pBY~&xu z1P*Kh&xG|)RdE(lbuJhiY^dI*dO|39j<*DaIOHyW% z=*E^pew4QcYK{JiN-ZZSXqs1Ja!`y>bG?ItlRkD6v2tcos+TP>7Q?*@k^ZHniDY?v z^a3UbLHb*t5(7jc;esXr!6jy~365a&X8|h(C^(Ro3l%&Lu^8;B`rOcJ^Rdn_2`v_R z{Nd<;Q-;U%hmsYOEaQ;@k-T7N{If3ICvD0Jb*cgm>)4W5$q5Rzip!XR5_?B%j{^Zz zI)LEsRu<@UQSf%dv20yMSGiKjk<^ia&)>duMq&d7EiDlH#;&TkVH=Ko&tVYYe?JB? zmXeOV$E3=0N2CxqADAV_of^QJIvTD|kP4zra+Kmis3o;D_Lb!gNm4uz%AThS(XAAt zL~DjFCtCc|V78?yc?Ri4dE?V2uM`s!k(@C{K|=>~eW!}ijp?#+oR3$IWK8>Y-8jF| zo9UUyy4)$j&vMNo4@}_Z3<+E911i7sTV=WUW(}=G*%p-MJnQ34dnBUhJD_`xTo~v> zK~@`sm1x=rXpRm3VkoQ8jl-`D{$8;D#hNE=!(~Q>cH-I-gqo z7shF_PrK8xX>|Yaly&#PO!D}YHA;7g;V^F@fzG_%&XRitTnaVAEM0r2xP*?Zv!3Eb z>P6}{BFFG_Xbj?V)Ry;q7J-K@5yG`g?T9N?M`Amw*850QrzY1{^(sX2gzEZ}TrltA zVFZ{qw+9HYb`wQHRl`@eOv2N5uJT^T-LzS4YeNY(%ry?xYC4o6z}JR?gn^?%iA_j# z!j#Qqn(y+73V-m*?ObAgIc4ZXXt(f^!u>M8{1R*eg)_55MR6vY+))+9;n+o%eH`FI zyGoTiq0;)$d>rj_GWo4Z+d4{;Wso;tT5 zdi0W%;pAy1U;sT?etKgRp8Y8e4dAZqs7Xt5{+NYD5LA>c4YZiBCMnLiIN&7%?aoC< zUm2*8njZ9Mq#P7w?cE0ql~ZC>j~?C9dfx>oM_qMLY35W+w=RjKe?Evv_DOX^RRoKf%xtScA;eKGQMIKiwpkf8f9_|f}Aur*=s6DZePgg+d zuN-76p%9jQbdqAGNJiPiu zVdbwqQU)(IM>bYCR~Iqueh$@tz^&0ij{Y}(WM=$N@FNQgC+C0HLI89nYjIi;|MBuE z#lSBv6Iva(c2Eg8&fze*aOXHuXb6L0MsJ5J{oIOc%`x9AvOgir_DSpx1f#@gof@B3 z$1NY0=I&zO_1y6H{EZ*Cp8sTYox4ArS5=q=;chS2iJxDI-{_;;ov}Y2#)q4JJs*)x z^_JL|Az^ke!Hx`3#)G}zuYGFo`tTW^G3 z%q<6k9EAa}@}GZ|)D0c(U*t>8dQrU!2t$fW2L--nHh{86dF4$OV|u6}2I0sOB;>RO z!t>*;8@VVlV=v7w7ezP0NIi4dhVu4H)(UmO`F4(f1ZU|?xprm{+x5zNtE2bz(6+Y- z8ash^zjIuYy<|tCVacBceA_6W>(Mtoc z>i>*9HGu5nCDvQ&@V&hHgS&QnnOtWOJ)CIfO`7jB)Oo0bRK6jta_DY3t5idIA#z(y z`B9JB@4NyZ(4!*m1?n=2^S@nU0HHLCM_IXSRq?3;>GbQ>7<@;{NC2Qoin?;*klOnt zN|=rdeKW{3HUXjxdA6H?VUX+2q#JZ@*a3>jApYiHFD0k5(BI}rw$T_3_kJQSNhxSQ zk9IGMa%r%JFOxIjXkK@e1fR}*+o##cWZUPV_-=liKFomN$qv4SHy}gSKzOz>g<#cI z9HRu>z@d%>^)>W&BsEA}$jY6GRYm@Duq1%Ei$Jl>*K4Ffe?gR`=1aWmL8pmYqhZ)*7%ss~Q01wn@fV;C1AaFXt&?k$?bc zM)-vEhSy=N6XXS`lYSVoHrFZPC=g63#@H|rj~Zh=%k+vkapIXwro$|6Biwr_XdtIC z`hh6AP|eo{1F*{y)a)sQP!ux?yyS6p!<0BTe@w6H#ZDA666MH5fL>_&Lc=K63~*#4 zB;`zky@~@_69<((^vw0>KMgR)Wa?f^(jRBvAZ&_vTnU!8U|^$wh}kIFIz3=Bsse&j z6^r>r=hM;SVPrzoKLjhr@DsoWW762z%6)Yv)M(f+i3{)XZt>ZbL(#3b!);)C^n)SO zhhrsTw*d_UResGE-(?#r+pk9Fq9B#mI+(IH2rj zQ3+yRQs-W@h%7?J+Ymh z%2X*;s!XM%6Nev3A+AyB#)-{sp%Tr^S*qc%>pQ$UeJ_JCU%U`YN-h?;dhYbM8MxX3 z6Vk9OvfZo~_~SQBS;P8f5Nz;X*s@4uur?hEUlbo>HH{09M>O-)8Ll6Jb$JGA7y4o# zR`1(=t@v3#6HC(~Fe#2>St}nyb7;xXrUuDZMcB>S6&j?W?Pr!f)IQFkc;s-#wXqdD zBoW3Sl=#HgqV^y)QABYYjNj^t9s5ltpR2gfV<$d})57;r4Kd;+&_*am8jYM6RuzL- z&=)a5(W}BZ-&C1tX$AA(Milz`9Kivju{$!Z&?Llm8VXUmi*q3zl*-$8=xp&=NM(jq z0CM8m5*TrhBg%V(zG79 zlyP;WY3kt$9{IyzNh7j@xph!>2^7vEz3?$4* z%GnUgfS4cdbTji1n9#PpKM2LIC|MCiJ}X*xPvHc>t2Hi&uyYXSY20B9DOw%vFmah5 z>?pz;5+r<6Yitjev{^JJ&%0m*(K%)>&!4s5^C~B7%;6+Z7ogZR0Qm;2JlcUinY_C` zJZ^}O4L0OGAK+Ej`%A)#VvSDwBx}9BYSh-O&c(S|pCLQ|T#;mgJq7B}unsRFN}(LzZ9@x?z#0`d zUQtX$h@xsAp(lQN%yCH{$WW-|1({C{f<0==@(so!03Umrj(H^Hcclj% z$B_V!F^nN0mjTjRUYc68;jud-dn-|zgr)jxYpRDFLM^*x21Qo^nsE+Bj58k`R%R>Y z)HB7spZ7x;_GY2QSarJ}D?1*`^sb-Clf87w#Xq_4t7xSZX3h090mJ=@GNw{xminn) zDk;@FAK8d=;)8Sh9x+Q=)H1?&rSZ!h9c%R}-xnj3sy-^4^+hyD7sywd2pE7a%2-yLwVViAA;C@(Etu3$`^M zjORjN(mq2Ued?1nAEe32W!oQ=i|sM%LFuj{<^tFYTgL@PIBKdsa8^AX}uAJw() zNH_M5IHQW7$i94@3%I56vA?(y+mJ%5J&`hwPRdk-zCzRFUX#yHLLY~E^!8Vn9pAtw zBmm=p?nA~42aK2$89DaW?Z%^*nSkW!p~B&-WCcaQZ%((AAQ@%UGldhRNEc%1}BQuwMw{CE~x zTj-2Rs7v-|L|1>y3*G?h`z%eca-lfSY&P5U@pnXeTq_ma#e(>XVif?u45892=j-`brdRUuK8lr+?FR=^pDXtc4zRSDRc7cC+%v z7GXY|^sBwFqp0c&3?8<4*`8^4xqW@#tE&XAM`FUXHj$`lV z^-utdW#_Mc$Bop&o9%M5IjJ4b*mRJz@lKyt_z%nC~UA9_?wg1ox^uF z?d(p(2b)lP5@_yj8E;}Oq~wekC6w?fESyC4*4(aYiv^9Tvl{J=3KV@AG>6mM#0Xe8%b2I*!65@GTk{(a+a*>a-h!t|OiZFnk7`?NAc+ z=T$$Y#@}U*Jdp}_EA>5&M~$ANE$2cB-q8z%<)>8=NLH;-r7*6z6xv`0&2O?LN;vd= z7~YM1vckn;)b~nM+*i$-^>lU>JU^}ORmu?}bJVx;b5Y^ws*zkO(rK6D35zO5iC+O= z!*eP5q}#o6sv|htNeQ~NVDz~}Ojmnj%d0@}K(1ArprD+vJ9tzy!F4eAbfS|;1iFk4 zjr5cn%tgm0lGbY82(K;JK2ST&sO_oBQRzsmxxG?u&msm=0Cj_8BTnmd^ zoV7a)8qJUaQzFq^ze|FyV19pZsRt{?65)%1{636zde)r}SBG5~yS-joISI>aD%Vt6 zxq#Q(t7C&f9M3SGRBt2emL*&I6kwdQtA?j_!sA;~RiA@W7QD>YvuV)|xPuv>Qm7 zNiKi^+hpsx?T!Xs<8SN?*J^B5a;XzG_-2U?DSx3jZuc<@XAUE;Ww<1~w-?~qa3^yy zKQ*BNYdZ$1n4!Kcrn!r0mJq(LvfEuG*xqZB6tHAtfzf((;$HR4bYoAcuqJ-|a|YRC z;g{3|4q*B+3zAD=>ABOOwp$0YJhQluDASaqJF3Nw57B4RHUWf2^pL~{&vN6r`nnDK{WO#xQLPCNM*mBR}k}p5$FJnFG2mEAy z>QbKIVlU@UDhaH{L^We1=HlpTS!yL$@^!AbCRB-G2dgbw_4CcJM=Ui(xYMT=_#nn) zc=e~II{X=K6sFjz^*=12-XXQMhu#}P*&N7P1mfAGss^b(1ElK>h?8sd2ISgjl@qTb zn^S$vmAHllP3{JxK>wCcu0)F4%1$fil=ex(eH2Z%zaDfQ*&(gL?Xk5m4CUH^=}Sq9 zfADtm`gi&{+oavTA%H_mAbFjxC=qHA{J>J+Z|>)n_c>MQ@w! zhT(KRE2ESeO_nYzK(yeFoE-ST5OcTqoV@ygY+{^}`X2^%SpSuQ9TsNx|1vRn_Rk`h z&&?j;t;Lfe+O0SM?0uk~H@MdQs?R9}WoP7r(R^J)T|?i;BmR#BvDGB8(I0nZ4(?pq zhj8Ho&tDR9K;&-fDy$SFL4!7ZQeDc zA?F;iz@2EeL1Tu&>~S_>eM8pZyfNnGOkmAijNzAf3SiapjMi8YHwhu4KyQd4i;jNE z%J>bzx?HPdv%*S$1K2B&+mj~15a_Foh>VeWW~LeRT$n?w>PN8DKFyPA92fSG#j+5t zTajidCgIK%>|?}T{N55YV+_7Wb$VJxH=|f4i2RQW!3w<`G;MxQ8J|*#_Qg;9W(h-T z&CJ?LUTaoi_a2&v2% z-pe)=%#^4Y1g9#deAIhxG%mP$X|wHK7hxGsfwK=_oe4%(4hF9WY3U6Wd8tC0s|MqU z70@-&XK_eQFjq)Via^2wpFvT=N!T#W=#8Fz86$aBe`wIA49my!3v(3VfhTo*RN9$yzvN79vV4QS)L<8mVNq>!P!Yb1 zbwY;-kj6+eQd`nC&R#<7 z>IgPqz&f_1T3XBYs@I9(H-MLBF$MW4K)h;s0`pDg!X{iyCBPS^SCth+UNbN{Nek(l0;qp7z#luWr_d4{q~*-Q5)dE*Pm~7@ z($Z+UdH(^j$=693bro3f3U!4syiB;c3%sVlB1M3$McU@Y$Uo#yaIq5*xiq{36IslrRGcbF>5*J7dW%H!vo{O9fHFu_k(5}JxyZz~ToFxDfs&(x zEdggR-zZ(T7ijt|h)YO1GUOJ#fd-4M+CW~J_V_$8$JmvQszA%rA_fb+PdG3+TurP< zRU}9ieLf@F?62FTG#>M>B5!AldG~fnaVDk8@^;yXy3C~28irtHh#DQv>1F_nDh{+5 z!}Q%j0N>W z$D$`fno3pjG=!RZ2oKOn6GV}uNY(5uNBlQ^v$5t`&P`38)XN*H zCU&tHC{;%-Q}w%lnx~}#%(A=#HcK*uiL0|myd1>ageQeU$fj`3eHq4zLhcL$x0Z}? zp?}Nxu7j&{6oQVbGF) zTPQ++^_t=_h~P3wrky)T%Id)%V=bn|#Nqd%qg4g&k}TQcuziUTq$QZJU&=&w<;7UU z{K7u#%s6(VS7W1O#aXgVpogrz475CGD1I^J$UP}qN?ezaF|R^zI2WA#hym{j%zjUrsj69aWqJlu}ylpi!rVG3LJa+KE zt&{isc1x;Kre?ma6BCr6&hh!GePUz|KU6iX$R&Px6{;<4L+PKbNNkSclQ}sJUlp21 zGMdFK^Mm!X!VUdo;hu1m9K8wMb6Eo;MQ zysI0V>VuKa!-MO`4av3aS+`qs$h5xW(>Y%B*O_fVA$-zfm2dKdHW$J4Iao_kCcm*1 zzQ_bxB4YX_H+Ok@_*XtHg(+qeAIlj*8ias&9bZakkj3gr(Wp8~x>t5ASDL~K*G9tH z5$dU${Z9PESt}IAfc;+Dq=O}nfVr}x*1Y=0Y%8yMB0jfyg9grBku&=RS1#*cTd+oL zF&-R3(;sx>PIg9lwH0M+jcxE;-`SaKm+2T#x}oEr90pJ5 za^iR;%$3aLo>*Fy;!uR{Nz>bG)h4U8J|4JxvvVrRsV)aA<>^68r8oU*goBw-FLUi( z5=wS~`zF~sTyb8mYe10{bmtVe@n+k!84#c&+g(X;Nr2hV^iJ_j;SvmM-|Cspe|ewd z^2O}n!ymEEp{+f08pE_>0rPRd$1`#3=-Rx^5wm-e;ILsj$|q*3q`z!bUrm9_Vf|!& zjHk+o-cZuv@%+!0y5Mi2x}+e#rksfswVBoV9>!gIUQp!%injL>it&Y#CtZ0z9X`(4 z$qS#0jP|gGzg8zW(;S3j`hxXW)qnS#m_F^hpDwHI?aVW!18!$^yW4a(TBF?VA69+) zJpbBuzYRHVt{U}8~r-Fr|xi7_)wb{LMc^mfERG-v`*iu z^AqKW>3lS5E}b4nBUL~2M!?DPbsYLeRU6Y8?rP#1hJ08U4kK8&+FB=dS!&5&4Csms znrW$W)Z(IWA8(vJEuFRfG^VdEF+EwIf5=|F51eWfu&9m9k^QO-ui!B{r@>}ISrPc` ze1E!@c^is;z=qQO{s~N^CF1w5XgzO%6vXoWCMQ>f!0J}u8B^n@4QoLj6*(B{%_Sw* z)V8KX-2Fa{F!_pupA(RrYQ$d?cL5j)*jC=^E_N$bTP-hwd-;wzd{*4+AFbF&vM z*L?SC`JAF1x;($*OF0Sq*4ueuCn_;_H|o-H^E~-DIV}|-;}{i}+)81V#NWbz_^V_2 zT8hmBh`&$B?F3#=7C8q*R(zZ$WS##+CADcL4cY0snNzw6V?CXrJ&v5 z+Ce$roocL3SN%#gRPTeUgfF<5na6r%8OQqi&?1OD7Oj!kSS1I1yQbq#G>qG;V`*8R|I3yE=M zt%6i2SZI@~A7pDESVuaN!QH}D6~;NJV@oGJpftYq!b8EUdZ>0M%QVYe=BbkV!{)3W z>-|9U2i2hYd_W6jL(4OBUzbg(os0+9%DuecDfC8tCc!TwVMpi`I)wxSt%v9AjNMbb z6uvHrCf7b~Kf*@|Q++LSCZ#v3We9cZDPVZAZ0D~}#4gQnVVTHtiMYGx@4_@n+&O0X zq=1#98sW7vUS`80Uh$3KXWdU$tb3|D-{4hH!L`XM|_TO%y`T>d`|2 zbPkFTf8eK!Ok}}cpG?Jpq_DumX#(n-mmf~5r3Tdk}xy$j^Wp1b!F1ry2UGMGP)i0 z#NcyrxjY-~}Cb^K$lheE2l{ zwbUaneIMuUNcnF2`-?HQH3JXeBzeX%>$-^L<;J;Y7r?3wM@43mHQPw~Fu9|`Hspx^ zF2moWEk!{pp8C-5CphGP#smMc;*K^@B^bkMdaeAMH4(#JdA$lt8JS7oK}>Jq!W4&X z+S8cdCI|LzX8b0$;@Dxixkc(;-7efts0#kLk2C6aV@eWV@Z5qvcbmzr%s=235v#w7 z-ww&er)4)ptOq~KK=TZ{+5*M=VvNLm8FTW^5DZKVgU=eAdI{>;z2Lb2JxTvujL`Os*T#>RMr-w`yE5(ze}-5$6+KPx zPs%Nl(JtL~*&!XbC3yx+T7~YFq{DQ#=UZb0mc_%6wL?Z;-L&9FWe=`?BSg8RxwLO@ zMg=!qSdzFU+*%h0)^*aw5t`nRoB}FUS5cHiMs*qwAMry2uT0jgWNNy;C-akGB-n+v zKQ2J<$W(aTxq0u%V$hX!%Sx5+K5P=kJ^+=4KEB~*=TL{%6;#Gl2%a~o@_^=g?&TfJ|S+LU3ackoU)F*`$Fx`rFd>|VLIDty}6v z9ejGwDMbyYeG(@H+kS+i={DAwF{E!Z*~%=~!V}MSgDEj@q5W9BCb0f-FPzTCKFCRq zCG{fnwH6^HdI;+(yk8-_!sD|tP12}@o;5w*%qOJuJF~1WH^$_N#^eJSA*i_tw`;x+ z^8}C;VQC(346fW2kIaVGpm^y+C;f~ zF9F?75DBNDZKa9yL=2>Uja$LNXz+~kiU{?>35%xNkpR*Yi_)e~)Ode&8`ne~3@ z73ipg)kADmzYAB3!W5+hnUgS?>76XbCU=RWCRoGISTy=~$&&jH9W3%KFuyQM0$FPc) zlo%vT@z%juFuPqxnboffEC8Kb>Pr473FOJ;w2^M#jvUp-dfOY_KH2U@GG?$ZZdEFo zY^!+slau(!H^f2CeKu+*zN+vbZOfW*tb8Q+cq0@#NN{xN&A1%li->V{>1`%PDXa_5 zKCV&HfeJUFTK#^6hqmt`TYVc9A*#riec0s}iF|CW_>Dea43i6&S_9v9X(1+P>gdAS zO5ZZJcHK$b0J~Jspb&*6!CPl>X#8z38p%F44NS+x=eFqG1B$6gp?$f_=hkId`e^^; zxjn4S@S`^0bmyGkNeZIu&)Fa)G>N!jMi!N{6iGd;TymCVG>jmM6nhZ%5DF+SECGKQ z?vNAMepxG-ge4MJMpmRiHS1PcWOGcL>pG!L%_^$eJGM>gxUL^7Av@&j94O~u?fdn2 z^t_}zvX}SyH2qZ74Yan`_r*8S%3N$yZ?n7Q-*1&$Sx)1i^!lcv3{L|oTXPe6WVMCQ z4Yg?Hq0$BY(RE2S#$v1-Yfk>tV!CNEg@4d4uup74u`<|1|Y~y9dRdo*IWjkvq_ktirsy0x^(nn!bn;k@y+HJhs*oqH0^LY1o zfOihAF^%yE)nM2(L z8`g?WK{C==x|9xaVR=&L&NS{d2Keh>DzO`$oK^W|5#OuIO1fIAo^F20|@8A%jL z%ajch6(Cc;#EWm)0L8xwki5+IbGBKW>A3MN7cd-hSlfQYsGGkZ+(E?>hLy&%8x8@t zJ*@Q{=n?Vq?uc|TJGoD3l>GAJT8{aNnt81ktc?zd{2(99u=LRfcE!><$GJ)eKOdq1 z@Z@c>M}GOFxf_@G1nZFPi2U!y3hTcVmx!5(mGM6rD_?8m*4UA{AJxm+ROHDa5CKFi zu80?`+4q0swYO;Tv7(x}eo{&l-CC4>b`jld_ZOHVnNZZpDZTO21#BR~8kiHBd4%l? z@S=)-NHk<_oR|Ju`Nc5`S4b&Fm7}{cC5kshn?si=L7S~>TYbdVrJ?`M{(4{)R z_V<^wck3CkjE3_`ysv$mS%QHZM;glza_Ra`r_aPnFbeX)ypXN{-UH#?LMP=NVpQD9 zLz;U21sPQKeMYz<@CNGJU?7!<8s-^7ED41_huiVE9_~c%PfjCB%QgZ8F--w`2ys>` zdSVxHiFfWs9>yJn6{qtw;~%6#AtFEcaKwkCaw{=C+o0{Rj=u4^daiN`9WYe-H+4>- zip2aJpmRvt9^Cn$Pg`Ttj))kV$k&rKbrU8f0Y9i*;iDigKeNZAGb;~^X2YB{sS@Zg zP}q;W#mx|nh)jv$wa8Y4P z`1{?_NP{cyZ5)}9M84z`#EI>yooK{d?g}tfNDNe6^ zKR$Y|tHf<9EB71^A^M7Rwf8{RNCXS~_`C7*Av}Pm=xRbiCJt|iVs=EuAZS*UNE8ba z+r$_+n_y_~72diNZQ5YExfuW9SXs67u&*RqngJ3xGj}zoK@n2-`tkDj4$QC}dDq7N zGfGdN7TeHS81qF~pm$$@4{4T|XiEvFA9tXywUcVhrsLfykSXD=@r^8d>Cw~q=Y;*^ zu!wIB!R76XUytH+l=S=Lyu?CtYe&sO;f9}b%}28ugZ+c&SH)_n*A7kxFelZMGK(Li2#Re}Hn~E_Y%(9nZ1j9N%`P4fUi$Lc z=+`hlS$%}ri)>_(>yuYrb#z_x4)rG1&fdGL^(Z53L_ABMH}S2(6G~D}E6NtE7v!34 zaY-&_gI8h^vo?=IaB0of&tc`!ik54?ZyngFu zxSQ!m`KCCLD3t{MeFKkAjm8WdB#^W?G!e>hNM#+N7GxVo6|SM*CKH*s0hK-sI%~rh zbep!7FoCr{4N{sGX{t1|m=(nYMe?kPuS= zW^`95ULMLklXJ>4)CES~*eq=>a@m6&yqCXi?SEyH{w@qb-9kQVjs>}FrsVJn*0$}i z|3U2m**j%pP6wN@LqvL;W}MDx`%5=FGnohP=L{(QJ`I+_oC)qn02<;7d9mV{t^#Rc zODf3OK|mWsZ`fI|?a!{qkMjk{{-`nly2?qAw1n$;8L%;y#kSMdnM9swq0N^0G2x#odof#WP z8YA5zHW{Rz9kk(ry0q z^?pO=LvW2T*YjCZZmm;_62*^6OwPUTzf1Zm@zM*sVi!n;bQJaQ@E zj;5;T1kFPispwF%VqIH@;gy}E!ECHM)R3Ikdj@Kxbn&VP)!|0@D#KWU^b<_hwba`0 zylc|a5yvX%wYvDR1R0`jD-nlkD0au#yu77vF*Bs^w!KYrKOi|a8 z-=QFoM`EDTW3#K)>*xgqhE_+^GqRykj9V?W?Ei{R&O?ry`gNZsjrIN496`NXP+_$+?cJ|eT^1(#V~&lzg8wE8n_ zJrOe?m+dXGeDtQH8^wWL6`V6wNnYu%-2A5lSiksEfJi;)a6J;c96F~7o)QFtW8rBp z7qTJ>Bzlm@u}SiFyvwYT!|>{fb>H-=F9lCft5iiFF)=>L6bOeLAE!x{UKZaQSu2Up zu|bAv^PaIU+YWc>*^mA`d4VJ$c{h^$AL=+MWYj!Tldt}McLEoF!F~UOh4LTLZmD=W zm@;T67+IMbyD%ub8oB&)E@f+IZpxr;Y4VkQi-nV&LDJOH+`{E65f?jyh`o)yld^-M zu_=S7shg#-sf3fECxfu1i}QC=ClPyF2YWkHI~N$vuV4Sk;q~3n$=3NRyVrj$K*agK zFgX)3{R6n#+ByFlrSDFrCYHu7_D)31{QUp#Il*9)xgG5G!N ztgk|p7b_U#fc4aYzh85Nu~g-lg9F{-Z5Qji$oB4>udQQW zS7bo93hjMP#1}2c>W*mCsNhpIw`Z4D{KGv%+UG_z(1k-`-2!qCz5{}E-?TJa02?tt&>ws;>8BAf|j;|{!Z*$LNcJAw*pTHq6u{adjz`$ zI`QH1BgK=(A1M>NVDllzQ!v`D=TtJOZl4P<0! zvCDpd6BgW5hMvY#aLmU9%mSzG$4`v!AOW{PjE)!asns@UP)~KEE#!G-Wp>bC zXqV-jn^6irP8y#l30{@6sv(m|ztD~!i z{3|*@@C=>O^SbCaEND7F&lC>~s?jR&7y56y8z@P%W0!GaK1$_lGsJY~{OgLpcwnBN`L0EJwbn7-Y7*J0@N~*7Y zR<=sSmxO`tkPa~;M}9#!h5X3MU6@}znaE&YInYn2|IG}sr9k}!l{<;5V~EbSv-+XN z2g7S<%9HAq!^U=R!PM3BX|f>^cG-9qICzXTZi{@*6bbk&Y`ck;5WQVJbRX6oy=f=o zS^Par&7qe$!BP1TM%5OYa%A_?B@Yn!m4J@^=girr;T;woSHW1>G#lMVx{pq0f8nDE z1!)Sxy*Qi~DYbgv!QO0=r)u3IJCOvV$>kq4_zIK5TEDf@snS=qhHKf;8VdW5CRBA1 z?C=%BM8}=5zxT<-pf|9Uj8gMJ9r)0zS=RWeY`xm30B_R=$SAr+A|Gz>*I9W;WrH9O z_nC|h)aA#w3x6+L_Xv(VTKaJij)q&Ko=_|{COs1b9`W^&{L9OYZ}rANbL#DvozZ}; z2aELmdGS?J?Xxq)95 z|6nTo2miDG_UKoV5N1%8Gjz5lV*SUWP-6JMFeYIBF(&>8tKeTX8(98lvjK*Q?f+yq z5HYc_{AW+OjTy&G4YYur^=RqqhTmd;hS-x(++d|K-4H$1kt<1lyJPiYjp`sA`)!F( z+zd_`@cK^)2}|3qeSk#V&9#8U6AOlcm_Wr7gJ1(ppuS*i!15y1^_HKfr>C#4E5i0k zS5MFMdM$E#zIE{C=4KYLhZhyO40f$PGjIfnNCf1cLjW8oGmuC`&{w`2ytZpezbDQQ z%Kzhim=&lo_Fs_yJ3UUK$E1t-nJX@>n=n!nC=+!zI@2#K{~2R#^#HH$%-mWp>lgBX zVjCst^3UOB+hM|+7>FMVB5iDKLZ@IhN%;@r?g6#MHcmX_hB&kq?>%n(x!E8FO>lqR z>m0o(mRd?Ivp@{8twr|Egf=7&y@9pzVLFKrZgoj9=7fbvwTfYILW0*y5MMO@YYqNy zFZpLv2xKT_JZClA`tE_uAzjbU{h1hH5ugOEWPzWo)MaNjD73V2x}G8WI!d|+=*o%& z6ZpERQu=pVFK*XBV_#Rn9h9tln`-$6pr_PlB|Mi%8tXk$62fMW zFghY;k+;oC#w2JGwyq2@s30;6mUOtNX0SCE|EdzWZ3#u>gv0y_(uaL3iETgycA66g zu@|S!8V~>{h4^(&ofD=L4-r(F@51uI*Xt&;(yu-QNtsMsV*-)%@E89901S~62^O2s zg8#!B$aRYqFoLEq=fzr5 zD)7DE4BHz0Q`QWJ`o_u}WGg#NCl{hQGYk!KdGFtZ`d=3~2gXui{V%5lVLbyvsF8S( zFCv0rcE8deeZl*glQ`;yB4@+L4|ahd#ntex@a-SmIblvY86}Q@0Ft@yn?p7xg8ND- zxcfKE24}^x|0a3=vFrXTlK;Q^`TwDCXf}-RMv~Hp?^<*BOmE5D_a31=0f0?oQWHn_ zkf25wND8Ozr^17Kqt`>zy}qu1M(h&t6}QOi`h2xerB$d)XKc$4%aLSDgGiF4FbHh7 zd>p8>up&r}cCHif>kt`i!8awhqQL7tB`@;eo$dVKQi0Re*vANgg_3;fgWM@;f@1Rvj9vvdp`@J-s<;M=?O-U=_XWUA0qiJCd7epRJUN28>kRFwD)FL=0uYQNh zJ`v|yW2|LA_PPjcvN87%9aBs#o<7C-KF!q@3b`SB2eRqLzFsIO3dv_u+#1{uIS59O zqT0?05RY|}yg!J^V~459^@fBDAhavz?%|D)-@Pq7-PRE?b_KuB0Mf>j*HV)mwgZ*abgK5 zf?zylB69pMd?G|2P0oOhS-E~eBkxzRx*pv%LIa)_f!@u*lempB)rlp`=d1_c^oFrk z!D@ET4d>PvPu;tS4_WO@u)4jtjp?DHbe9~y3K!__%tfAi()B?^@i}~&>_Ml9rlP25 z6*elqPpv|m9odg7W`aiTOXTZb!a+u9dIUeW@0O+|kuF|{p$jewFDl$Uu-Jd7RAGhS zaYW5`$;)&sTx*7$1(kj$cE>qe)xo%d?;~J1BjP3zw3h*|APTeqGm^s=?NE;>bmd?kmY`*28k7mL z2{}(QNu21w?I&n}?iEv>t4NCthLYGzWPC{2j*;YVb z`ybXnc1xHKaEoGN#KEq%PSXau-8dFUzhGq`RM*r~KGvIEEu}TUoOx{_=J|!;3mGU% zJ(=4JP&d`~Ze~oDP!zwDHqHbTM*i6b&f9B~yEL6b{2f^44?Ui0!u>szlZ2FL^?C6_z@Lghv1hH)99WPTZnUxOJ))zaZpj6#93X zvD5{WvXbQsln55xys;km+7p++w6h_GLAS1_;APEvF0nH*xm{zXiF3q`o?Y7;+_$z& z1q!(I(w7bNW=4er8_#U@9_NzdUum=V6=Q*!Rn6Lvhr9-onmmk1&RuO`%TxGR23uy% zzG|;5nbwp`9c^w8<1p0>!ggQ7af`Y-m?4d?QmP+2ahDCrN~S9{K>p7M0k;!er2j#Y z{)c#W{}(R>|9=``WM*ahPl;nLHf+DEEMY@lo3EfF_d~Fw^ifEvF{59OA%Q#0ZA#26qfpabo$v^M03AXBv8?8+xDykhVv0v*eo-UQM-C zIEb1FQUC~$2m};L5CrfAdcgyb1iwy!|Lq`4Ymitm3&D}^mZ3mYNVc%<#A8*u0^D~U z^X7}K5aS1JNfKYGs8v(BtcUhUnPgBng%SJ9of+Vpj>?D01y+c(^|N(9C1}Y(9<99=ZCt+hfE1GHQAAz zptv4yX}W16uK6e5wJhK-{o&D3{Du7hJYl2D7WTDDo|_hHU}AD2-Xf0wpIy&HN`j`j z0_e2YN6d|9M9_KpsBZ?J8@~1#JdNQ>4ok*2zzV)gZ z@ctMZcNpTtOiN&eMy89ls*Tpf|FA3Rne5dV?viKnTL3yXkU$9Z1Pyye6{;3G#L8}+ zyb2b$45ato>Zcr}cJP`30cwEHX7wDCN(X>s28e&QqXMEE6o2VO3ugiDW(k~Ke0hKX z8^8fgT!(Tn48RAl$#$u71Ov(*xE^AXOP2$RWPqBMb+0^HUaS2D)>@NRj%a{?Ec)Ef z$wN6*Lv{jEIL!RvK!2lS%gJldgnkiuI|7}%bFLujrTFuvIpv8L$pucPWo?TH!~$2* zgppcnhxn@No9nRU?Q5^Qhql&A#fM{a0r#;!5|V_Vzx2p)=l9l9o$SO^-`Y!3s0h+{ z{cN$ooN@R}1=GP02HOV0G|US`P)DGRJAK}6cGx%@CC8%I+Dkq5{k;@AP!u`-_xq}c zau?a4{aV=FBT)XB!9nbz@#HbEr_-Vn9hcRBc=~aelB}S2Gkw@A@>ZPxdaZ>2!SbQ+ z1?;N^M7mq!eTBfJl^+?s{9n|sdj)$30b^u@7td9bUmT!Z`-BD$@e&D;%hOqUHs$}i z6md4O*v;)I(Dc=r4344lRE0sDiT_UdUkg zi9&~pU~qUC-#%Kka_mv$2YqEjCy(_@N7~MWmCJlKm$Bsdx|^G;Woi6(+rnRLoA*lY zm=nW;d;+?t-;P!|nj`WDK20r&h~Rwnak<{}n4yGz6*}P4p)ev0P?kEr;iaHE+!1dZ z#i5m7?sLh(Y^uPcfL1;D)Rjphe*-xTQ+_c0T3@ zMJ<)+vpdO|b6^-^kt)l>6?VCv#6@E{I6+HH4B06=y=vWPoHSvz-Y~y`6{u&b@aIyR z;GHi}oOlKZGe4;nsn`^+>wi?F+_9AJm2E3_m_W=nz7l%sdIJn21PMgPPV7C&*YiUL z7@MF4fdmIwHG?DjeLF<`^EAnS<8&hZ)m$ByD#z@EcC;@E#q6xmJGS$H_yQrDA>S%W z-N1mHN5b;AUK62Dz?`KXjIUd=tssh_r>gPurg|hN)*l{F2}tmopSXcOpG!#BmLdA$ zlqoa% z7=Zir$3r|n9d9129#rS4(EWt9G*~7W*=K{(@rI*f>?sA4)h#(GB|KLv%?;2m(UdQ_ za!6jlnv&+^RMA$a)8G1Ede;$1eYn`FTy^vF>2BYo=M2F-iLeGaNO3H%j ze_N3pN+B!!f2e!MAYB3_O}Kg5wyo2)ZQHhO>$Gj#wolu(ZQI_yGqExE?%vs$@8=is zMn?Urx2h7AmHFh8-juW1n)Y$wu0QAGTY6aIEZk&hY|1^@(_Yib-gk3W<^&l)c(Hf_ zZbt_qMP+L~j+-{Jl4+M;-iTG6)wLJXI;ziN8hV8LJ2zXa(%QBK!Xt zU;i`SC-mq)@+vcxJ7EItL2_*;l;yka&zXaVazV1Al!~BH3;6NtDecmLxPi)bM$4bX zA)_mEzyR8V^4w;43ErpKpE7~e5(fT1UK{`QE*TgAq9qYm+{f=B!~gV{Z9%DF7VwkS z(`n@W3^pL>A+5bDVx<`IWc<;W%Ih}L4J3*8WuxP~;3rgqE#!ODu%_qy1+E9O$B2># zaSOv`3`;&iBX=a$^WSxbB1MAE?yc5=V&TY~foW z^=gq3TkOqlGOkovSmXYq?OHj$o`nDSRm$(PEw$#nx?95xsH+O6_ntkp%8U!`=ohgu;K^vW z@p3qUoRRfC1w`qQ?cBu9zv4tFRE|PDJwX!)%Z_Kmh4Mj!54mG#0}9AnF<( zfT)9sZj)@W2>kHD1OD^(vHXGc7?8~UZ<0#(|C)vVf7PP@k$e9Cq881@%<|6=z{|~D z`#ll#UwSuk0iUY-gbTu$5)k72r+rrhS@1)cmdI7`5%BNg7xy2nZFZTo0@=&gEkKvI zUOadJdw<;_0O&zN3H}e^S1;rL{q+9+etcZw2ta%N{_c4Mj1@=kG@4seLu(4Ivvupn zln6-6oj7^C5hObeG;J+-tUCu58b)vm3<77&sPFX3jI;VC`X80BMT3(gNO_HvwPt4^ zzod|Q9)otJv1w91Xuu2hU{cMP-yjESrq*Uo&J%<6!`@%7)79VK-=F7jWV5f#iGa*7 z#sCK3@PhwatYjpl_)*{RU|NI!oWbC~7dxj*uYW#2bof}#03e$P)_;tMo~csc7*9tf z_d$*&O?0#7$p&<6P|oD!VcI;M^gE)16E8Gx9fN5s-LhCrPW-V!$ z1#OzWKSZ;0g{B^lo1M4PgFCp&U0ji*uFS&M3l<2w3v+5Ok63YQ< zB=D1NCa?|uMYtZDgoED&W6sBCgax!BgyleM!G{H8VJ-NX6`Y8VPZ}J&pV~nS)GL?< z0Ayew_686qsLmVVjz$TY~`4m{`Wk zX9q1UV+v3d!q5aB8kx6SY}f}LiZONvHG6Z`m7xY~32PkTDD(yp)13FgPt{2Y-UDfU zf=~{BBZt*~&SUy~rN7NvWsXS(;HFtI9?4)v8b8&|!^88_ZwS)Xd>_895(Wq<*|HTw z2ZU?N19e;tM0)|GcPbbMN7FME#OM*UK8f9UornNUjLsXiyb)pSk^8kU8{CNdbBhD; ze&|3tTTv~vu)O#tP2k{Wf?G5oLPN3Bp@6;gOdDzal%NC9#^vxo7BL3~9!(I4UYnFB z#R$}AVCIxy?l(ujQ1qkVy$}Y!WBUR)Jx_Y4v_8^jOe873S(ZfFO=Wt=9AUrygSDBP z0;A3hUGmOKQg1&2Yq1Rg%Hf#+*~YD=*ahCUf85-NwcveH$@~1o%2~J4Ka_WqjKRT< zVCX5V*M#0aej9QEsDd@tuHbmxcYgzvrUZl=o@aS$Pn|k9tj!4=4r>e`i!lb!XK=FS zM4IiFFPH{ug3tC3?ePR(dDt@bywMZ;`2pE%d)Gk`6=2A51dAw_c90Y-Ly>bN0$Lf6 zbE*;lSVZm+OCccOx`p6UiT|9n*cAX4&e#Cbj~W3JZ3IIO(mQcMeh#2msDRZPU?A}E z8G?gdU+JO&0qGNMUL2_-=R617J*i@Cn<$M7umZ*Keh7Nc91o6uJ&n7lfv_1}O~kdy zaeHatNu6$A;+g-Wmm=dDBsn!tT3}jl)MR}Q0$|J9PiRUbxg2O^2*-sf_?k76&UBNQ zXT={UZmWCw2%0=B=hG`6;D;!P!6$_!QPT@-Cdh|lE%pr9XHeSFukMj0Ne38YFakE< z7hehU6EglQnEW?KpqaSehy~tbBF~bJ+l2VVFyeT*TF~OydXCm3)<*tbC3oLO-ERNk zW?Uq})t8s_n0x<-ZUAT({+}&*U60V`(@noYYJH&9!+${=|5y~f;QuGl^NZVZd1?0- zfAbZ9L`&W*sqqsPut9MBJsd6lkKqBZ%N%}>ay+NPue!rf^l>1e3;cTsvt2jQ%BlD}1Nd zPcgr>X8w1uQS9k^lI$&w!Ll4_U^&~?c<)jhdUr$vRqzlm>)C6Xx-#yfI)JOAOC}0_ zaudNnhwaYQ8IiAb{)(#i6$#6%AX3SJo9L-RFaO*7Hv_-&Ove>hze5^qwS& zktj6}`f5DAt0WR~+$+7X1#rwA#2Wl6yBQg~k)Y3MHUW?C6or0yWB|T0L5S6GkV@tK zIqV+B?B6_n@^jvCpVQO-J6~Y_9|7@M8UCfrv#261yUqvS`K)>|D?eJ#`K}!%DO^^% zAfeQT0846*PaZ}9EBx^u-5H@iJi{U5Sn5~Xk?o$wYRkoW;BVJ=6M_W%GCpD?jvHE= z&S05Yn(aT7Wio~^TB;Zf{V8tl>D6^`z(j_2a36}DW8XLXhh0X5v5(nVAR%ujSz_jA zDX5gpeaWI8csR-ODxvS)_@s3+u3dsrYZ8t4{v@%k^-)EJ6|+0+(CH%~Rp7Tb2VBVO#J8?V#=4irOz+|e)+<9f8)Ny%bj_oK_x|f@ zDxRQ)f?SmO@3Jf+dQgTouU>OcfW+})EY<6EDDj|V>GulR8vA6xtv~SUp)DF+1Lp=z zgJtpMVJaqOP}MlWaZ2S?bVp5Ci@$hVdoX_!g*MxY=qq!A-7mssV&>VCnzdQ=R4G!W zcF*qxC;}Isa?0q0jlR_oKDB#uBI~c2$K&+zIojw`M)DIovbtL)CFbGhb^M*uOA0IA z*Vc7sZ&+|x7g`t8osllBUi&THv~q_ttlUx1YCK$VM%DMeV$eiczI$nO3wsd>QR8sn zx{#59f(*?x+m2lAtoaHf%;|)k5JQWKhF)BeEqy%rN$8DB_B_93zm$$CBJCdB+9;Tr z9t0HgL3;j|{DuaDEGDJ10;ngbJT&&X8nUPPx`I&PQVzv$xuGU}{D>x`EosZr8_0sbw$}>`Pay=%zj2O#!hnjHTR9m!(27{;I~o5c{(@G@ z*v9k+{K>}p1E+v=baF7(w}y0EYf{~|U895d+18C4&V^Y%)~%y_G@j$Iw#{%0w2&Z} zQHrf4-faB#k+BNc{2@am%$2_An10^On(o?h1pr*a11HSyW>dQgm~PlP()r~V*9RG} zsxd8l&RQL?YJs~oyv~p&6^2g*lFBvFWvL!+p}qmWV`Aljo(UwJiLt4E8_(1bprKzY z_J?I(*W~jYDvCg?pcj)rI18mp+%JuThQ5jL>a8%XcPn)m?D@u@@&-@@VOAmqG2a#; zKoVjXHjhJ}Zm)N`=F+h4v_u@7U!wNci6%>$0}K=IWvT`yr7p~Xx%(LWqCxgY|K;q| zT2B-+f~IH2aA4<{@P6)Qk9VVU+_lHeLvYn3$-FD4ypAFK(l@~-|sjiNjQ=1&LMaz+F zrGmoq&rJqN7yDhS$a};n$bnvDe`lS))t_3%d61S8jlk#R48?X+miccot?>9D+f-i#qHYo+fr6_3tNo-&gdVX)Hjr zO?v@ctS=oOc%qJ$7I^mxV8pe`bY5NM=AMqTyUZcz=-vq@e-{ zjEM>ZQ^`-DB8u9o9~ALy;G*r0dpWHw`k5$lj-Zv`AdIPCgE{l9A!r*&UAjEria5@v zpfm{MG3biP+JX@fP2+LD~(}wMkxn53CDb6J%&xy~7E$&er$abSUU*%-2h#w5#qR z%=fjH5OBb322N~)zF4pXCgJ)|$N~^W?lQS_^X{C9Y;OemUJ)sqvMGb#8wx@|_PKRb z;fb|IN^asX8NQd%7h%Xs-uo&_;X@|0N`!j=ge)p%rcreMUSLx>~93l2~qfX1DE)}{gvgP7~cOkO#2_56?(z{9wm*>!uqdYm__aoYKqIv-(jhl^D1>D zxSn$s@fMa%9yl77HOl9exuI;iKr+yPgnt0^ar>|ZR1ksmgVFhp)cK7ZvddK(Wtu!R z7uIwvADde)FL^fl-@k0Z2G>fSJKwjyp|)T9Ry}KOTb6VzgG3{-#c$lWX4@yRSZnNZ zj+*r&DpciSQ);wMKT2REf>Nw+4WFa~aHb8(A_>)Q!Bq@~!$lnM9I3x2zK$8bKmyQj z@oHAH#SN`wuT^go+^~2_ryTHKh`@1skB#qnj=jgi zkMZRKMm!E)VyKryP<7N&DZwLs$PP)6zA0nM3g2`!J9cR`Oj;C4VDBKpFKa9N&pu;2 zcIINKh&7Zqkfev@No4U8ZtCR^{hZ!OJP0h-+0{Xw zqk+nEcIr;8Q86u2XOyZzAnt>DU8zc9sa|4#z>~OEzFn{8i}V?MYv{J|(=0-(Cx3UJ zlX;6+*2Koq5LJr365A$x9FF=!P`avnf3vpk4v>; z-Si=-3so~Y9&yCom9WCDOS;Ji8ixN9P)j5hK&V5gLn?ywG=RRRyvN+<507XFk&Z6< zSBCCSs9T_00z8t!p7kD%0mCf~eUe+u3le=`s`v!y5j-BEW0?DZf&oTdrW$`Gu?j-; zAEdf;JJKaYngNc!BsEzpd=|tEa8?7xx}X(_RwUd%WOXCKQwRgrTbe{$*teshe-J`M zKa2->FNRjcF9j~DBem%7B)>?%xO++Y(b~eTh`I|z6zUcpQ{r`Dy$=KBA4*SV4^Aqc zdJSI;C3HSd7WZr1yPgsPbNUJLx^Ir_ewf<5-8b^>OLWk>zK{}zGLa~@b~+K>e?1?) zvEoI-WzyLQRJnz@<#4~dT5E?UX&ZdPtOjY@y@>Kc3cFlCK*5~61JZKLWtu4o;)4u` z{Hby^2ym@%^+P%ou7=(djZLY4(Sm}QT4QoQa-lB352Ey80#X7bv08&-Zl`4|<8X+O zx0yNm8TYW@2VyuTXXOa=%@8uupA@%eR-1bgK{aALA+jOKif>>va15|a7h9ERHZEcp zXIs1TY9*bEtkWHe_F0ubPHg@`} zQP~#Y13{gzGA<55e%1hHb;SCx;Br5B`5~X%jhc{w<7_njvnRV039F_-7uWfuwd30H zK?09(3IeXdaaQoHv6#4lPcu^<9$;%H2mRvu^~<$-nZ?I7cT2&l3HPGeg%8bnuG_wf z4TNysU{9sWaBq>q->t#5+IH2XB{wv6W(VLp^>RnXp6Gf?v?jEsuk3Dom|{0tk+T}? z$q)1ndR5(Zn*KB?{11pURVWvq3RBDTL(m;A8`xm`M&#c38pq|AQz?^%gJs*KxfHoj zK!-mf?vcXB$yAJI7DA5W3hGJ94)DTz&PF?JFO>%GWghHyVS#KRvmm2$Yh`g&9fKO_ zuWLS6*X;*r0O?=GF=t>ZYVO^&9j6JZ&yUQT@@Nb{u%fl9+tYhxnd}^7GRCKqsWeWP z6ZDoe9T(b0vWN8%%2C}O>lcpeyX@)muIj5U56<@RG^T#f1S^Zu0uOd7AoIh6?A6I= zm@ZxK0QL?3^Q#q{BcM~soJE$UXP>uPKzTorUYN(j8J<
-~hT7+B+KAGOXZhiqr( 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 MBme@jb+iNg3)7%C8vp