Created
July 25, 2020 21:41
-
-
Save jtb/4bdb0e544840409de2c4d071ab2acb36 to your computer and use it in GitHub Desktop.
A = B Notebook.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "A = B Notebook.ipynb", | |
"provenance": [], | |
"collapsed_sections": [], | |
"toc_visible": true, | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/jtb/4bdb0e544840409de2c4d071ab2acb36/a-b-notebook.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "g_72ZF06TLlW", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"# Introduction\n", | |
"\n", | |
"The book *A=B* by Petkovsek, Wilf, and Zeilberger explores computational approaches to proving identities in general and hypergeometric identities in particular.\n", | |
"\n", | |
"Typically, a combinatoric identity is proven true using some clever counting argument that varies from problem to problem. This book presents systematic ways to computationally derive these identities. The book is freely available [here](https://www.math.upenn.edu/~wilf/AeqB.html).\n", | |
"\n", | |
"*A=B* was published in 1997 and uses the software *Mathematica* and *Maple* for the examples. While these are still valid choices today, they are both fairly expensive pieces of software, especially if you are only wanting to try out the examples from the book.\n", | |
"\n", | |
"In the years following, the Python language has really taken off as a go-to tool for scientific computing. And is free! In addition, Google has recently come out with the cloud notebook *Colaboratory* (congrats, you are in a Colab right now), which allows you to play around with Python code in your web browser and runs in the cloud, which greatly reduces the barrier to getting up and runnning.\n", | |
"\n", | |
"The goal of this Colab is to go through the software examples from the book and implement them in Python, largely using the symbolic mathematics library *SymPy*. The hope is to make the wonderful ideas from this book easily and freely accessible. I hope you enjoy!\n", | |
"\n", | |
"~ Justin Brown,\n", | |
"May 24 2018" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "hrf_MSySXXpF", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"# Getting Started\n", | |
"The following code block contains some useful imports and helper functions and should be run before running the other code blocks. Each chapter also starts with a code block that should be run first. After that, you should be able to run any of the other code blocks in the chapter as stand alone entities." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "mCozjlmBdfSG", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Notebook Prerequisite Code\n", | |
"Run this code block before running any other code in the notebook. This sets up some common imports that will be useful throughout." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "lPk5VW13TAaP", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"# The Sympy Package\n", | |
"from sympy import *\n", | |
"\n", | |
"# Throughout this Colab, unless otherwise indicated, n is a non-negative,\n", | |
"# integer and k is an integer. We define it here so we don't have to keep\n", | |
"# defining it each time.\n", | |
"n = Symbol('n', integer=True, nonnegative=True)\n", | |
"k = Symbol('k', integer=True)\n", | |
"\n", | |
"# Solve systems of linear equations.\n", | |
"from sympy.solvers.solveset import linsolve\n", | |
"\n", | |
"# This is a hack to display latex in pretty print form.\n", | |
"# Use display instead of print and put \"display_latex()\"\n", | |
"# at the BOTTOM of your code block.\n", | |
"from IPython.display import HTML, Math\n", | |
"def display_latex():\n", | |
" display(HTML(\"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/\"\n", | |
" \"latest.js?config=default'></script>\"))\n", | |
"init_printing()\n" | |
], | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "vU1v_mB-l7zM", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"# Chapter 1: Proof Machines\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "oWrMAg_DdXhW", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Chapter 1 Prerequisite Code\n", | |
"Run this before running other blocks in Chapter 1." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "aMlcbQown54O", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"# Run This Code block before trying other code blocks in Chapter 1.\n", | |
"\n", | |
"# Fits a polynomial of degree n to a list of (n+1) points.\n", | |
"# Inputs:\n", | |
"# points: list of points (x,y)\n", | |
"# variable: the variable used for the polynomial expression\n", | |
"# Output:\n", | |
"# The polynomial containing the points in terms of the variable.\n", | |
"def fit_poly(points, variable):\n", | |
" assert points, 'Point set is empty. There should be at least one point.'\n", | |
" degree = len(points) - 1\n", | |
" a = Function('a')\n", | |
" syms = [a(i) for i in range(degree + 1)]\n", | |
" f = Poly(syms, variable)\n", | |
" \n", | |
" # Substitue each point (p0, p1) into\n", | |
" # f = a0 + a1*p0 + a2*p0^2 + . . + aDeg*p0^Deg - p1 = 0\n", | |
" # to get linear equations in terms of a0..aDeg.\n", | |
" linear_equations = []\n", | |
" for p in points:\n", | |
" linear_equations.append(f.eval(p[0]) - p[1])\n", | |
" \n", | |
" # Solve for the coefficients a(n) and return as polynomial.\n", | |
" soln = list(linsolve(linear_equations, syms))[0]\n", | |
" return Poly(soln, variable)\n", | |
"\n", | |
"\n", | |
"# Usage\n", | |
"# Fit quadratic to points (-1,1), (0,0), (1,1). Answer is P(x) = x^2\n", | |
"x = symbols('x')\n", | |
"assert simplify(fit_poly([(-1, 1), (0, 0), (1, 1)], x).as_expr() - x**2) == 0\n", | |
"\n", | |
"# Fits an n-degree polynomial to the sequence of (n+1) integers (a0 . . an)\n", | |
"# Input:\n", | |
"# seq: A zero-based integer sequence\n", | |
"# variable: the variable used for the polynomial expression\n", | |
"# Output:\n", | |
"# The polynomial fit to the sequence.\n", | |
"def fit_newton(seq, variable):\n", | |
" assert seq, 'Seq is empty. There should be at least one element in the sequence.'\n", | |
" n = len(seq) - 1\n", | |
" a = seq\n", | |
" f = a[0]\n", | |
" for k in range(1, n+1):\n", | |
" a = [t - s for s, t in zip(a, a[1:])]\n", | |
" f = f + combsimp(binomial(variable, k)*a[0])\n", | |
" return simplify(f).as_poly();\n", | |
" \n", | |
"assert simplify(fit_newton([0, 1, 8, 27], x).as_expr() - x**3) == 0\n", | |
"seq = [0, 1, 5, 12, 22, 35, 51, 70, 92]\n", | |
"assert simplify(fit_newton(seq, x).as_expr() - x*(3*x-1)/2) == 0\n" | |
], | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "wQLrruiIbo66", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Theorem 1.4.1\n", | |
"\n", | |
"For all integers $n\\geq0$, prove that\n", | |
"\n", | |
"$$ \\sum_{i=1}^{n} i^{3} = \\left( \\frac{n (n+1)}{2}\\right)^2 $$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "TLhZe2CMcIk6", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 238 | |
}, | |
"outputId": "315fea74-8a6e-44c2-c504-ea9ff7820ae8" | |
}, | |
"source": [ | |
"# In practice, the most straight-forward way to find the closed-form solution\n", | |
"# for the summation is to use \".doit()\" from SymPy.\n", | |
"i = Symbol('i', integer=True, nonnegative=True)\n", | |
"def sum_of_cubes(n):\n", | |
" return Sum(i**3, (i, 1, n))\n", | |
"\n", | |
"display(\"Using Sympy built-in functionality\", factor(sum_of_cubes(n).doit()))\n", | |
"\n", | |
"# But let's also do it as decribed in the book.\n", | |
"# 1. Make an educated guess that the answer is a fourth-degree polynomial.\n", | |
"# Find the polynomial by plugging in some points (5 are needed for\n", | |
"# 4th degree polynomial).\n", | |
"p = fit_poly([(i, sum_of_cubes(i).doit()) for i in range(5)], n).as_expr()\n", | |
"display(\"Fitting a 4th degree polynomial:\", factor(p))\n", | |
"\n", | |
"# Verify using induction.\n", | |
"print(\"Verify using induction\")\n", | |
"# 2. Check base case that p(0) = 0.\n", | |
"print(\"Base step: p(0) =\", p.subs({n:0}))\n", | |
"\n", | |
"# 3. Check induction step that p(n) − p(n−1)= n^3\n", | |
"print(\"Induction step: p(n) - p(n-1) - n^3 =\",\n", | |
" simplify(p - p.subs({n:(n-1)}) - n**3))\n", | |
"\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"'Using Sympy built-in functionality'" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAHcAAAAYCAYAAADAm2IFAAAABHNCSVQICAgIfAhkiAAABBFJREFU\naIHt2VuoVVUUBuDv6MEUjxn10I2ulGIUpGIWlKh0eyi6vgQ9HCMignyIXgwqnyqIypAeioKMCLuI\nmZR0QyrLLlZSD6ebpS9ZJt0sNKnsYcydq+Vae62999n7HOP8sFh7zzHWGP8ac84xx1yTMYyhBEvw\nAX7FD1iL00eU0ejFQRerl7FIkDwDq/EdDh9JUqMUB32sBvAXLm2iswI7MLknjHqH2diH62vq14nV\nqMLR4gXPLZHPwd+4pWeMOsPVWI63RDrdhyeb6K/GdtFxVaiKFRwpBsDyEvm1yUYrg6ptPIOPMb5E\n/gp+xqRuExkmbBaB24Uh1Z17VtK5rYbtqljBDcneggLZcSKWu/Sgc+/Htzi5RD5NzNpHukkih0Hx\n4vPbfH4BTkVfslHVucQg2IZxTXSqYtXAOux04ADow2vYgnuVdG6ewAVJ8W6x8D+F7/Eb3sHcEhIP\n4BosxNclOtclUk8XyNr1222sx5eJW12sxPHinYpQJ1ZwaNJZK1JzFouTbBF+LzOQ79yZ6T5NlO0D\nogB6A+fgBUzJPfNghuxnTcien0i+WyBrx+9oxdvpXtS5dWMFl2CCWMezmIF7kq03WyG2UozSHZiV\nk61KsvMybQ+JQmMhjspc+YJiMv7Ep8Pkty4GdZaWs5ivXlqemvTez7XXjVUDz4rMNTHT1o9N+Nz+\numWpmmm5MYMW4aOcbCjds85uEjPqdVElNq5bc88eK9aN7SUv0qrf0YxfsEek5izqxop414vFmrsn\n036HiNUgdlcR6c/8HhDFwza8VKDbWPy3ZNr6qhwkHJHuPxXI2vFbhK04oUS2vqBthQhSN/Cj2MZk\nUTdWREof8N+UPFdU4fdhYx0j2c49MxF4VXEBMUuMym9aINlAY5QVzb7h8rsMhxXYvkx05NacbHOF\nvU4wSY2Z1QRXYi9eTP/78QS+wO3tGFwsgntjgWyK2MYUzYA6OCbZ3tBjv4N6v+aOE5yrMk0Zxovt\nz7pM22H2f6youpY1HsrO3Ma6t6nA4Uwxuz5sk/B28bF8eontbvkdCUwXnNvNDPPEMpZNyX/gsRL9\nWSJOG0Sh9W/K7s8p7cUnBQZmp3u+2KmLfaJsvwqn4Kse+R0JnJ3u7WabK8TMX5Np2638C9RS0bkr\n8GhW0OjcQ3CaCPDeAgONIHcyg1aJzr3I/s7thd9OcHm6iG0Lse9+PP3e6cBq90Kxn1+jdfQlfxvF\nR5xhQeNE4+ES+ZD4htlKxZfHBEH4vR76HdTZmrtU8/Vta05/qphlz7fpb06y28rBSoNj1w8OqrAk\nEZlZpXiQ4mbVJz3NcFd6/qRhY9RDTBT72bUjTaQLmCQOA57rwMaQ7m7Ruo55uNP/77B+hkiRJ44s\njTGMYQxjGMMoxT/ttCHKz196MgAAAABJRU5ErkJggg==\n", | |
"text/latex": "$$\\frac{n^{2}}{4} \\left(n + 1\\right)^{2}$$", | |
"text/plain": [ | |
" 2 2\n", | |
"n ⋅(n + 1) \n", | |
"───────────\n", | |
" 4 " | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"'Fitting a 4th degree polynomial:'" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAHcAAAAYCAYAAADAm2IFAAAABHNCSVQICAgIfAhkiAAABBFJREFU\naIHt2VuoVVUUBuDv6MEUjxn10I2ulGIUpGIWlKh0eyi6vgQ9HCMignyIXgwqnyqIypAeioKMCLuI\nmZR0QyrLLlZSD6ebpS9ZJt0sNKnsYcydq+Vae62999n7HOP8sFh7zzHWGP8ac84xx1yTMYyhBEvw\nAX7FD1iL00eU0ejFQRerl7FIkDwDq/EdDh9JUqMUB32sBvAXLm2iswI7MLknjHqH2diH62vq14nV\nqMLR4gXPLZHPwd+4pWeMOsPVWI63RDrdhyeb6K/GdtFxVaiKFRwpBsDyEvm1yUYrg6ptPIOPMb5E\n/gp+xqRuExkmbBaB24Uh1Z17VtK5rYbtqljBDcneggLZcSKWu/Sgc+/Htzi5RD5NzNpHukkih0Hx\n4vPbfH4BTkVfslHVucQg2IZxTXSqYtXAOux04ADow2vYgnuVdG6ewAVJ8W6x8D+F7/Eb3sHcEhIP\n4BosxNclOtclUk8XyNr1222sx5eJW12sxPHinYpQJ1ZwaNJZK1JzFouTbBF+LzOQ79yZ6T5NlO0D\nogB6A+fgBUzJPfNghuxnTcien0i+WyBrx+9oxdvpXtS5dWMFl2CCWMezmIF7kq03WyG2UozSHZiV\nk61KsvMybQ+JQmMhjspc+YJiMv7Ep8Pkty4GdZaWs5ivXlqemvTez7XXjVUDz4rMNTHT1o9N+Nz+\numWpmmm5MYMW4aOcbCjds85uEjPqdVElNq5bc88eK9aN7SUv0qrf0YxfsEek5izqxop414vFmrsn\n036HiNUgdlcR6c/8HhDFwza8VKDbWPy3ZNr6qhwkHJHuPxXI2vFbhK04oUS2vqBthQhSN/Cj2MZk\nUTdWREof8N+UPFdU4fdhYx0j2c49MxF4VXEBMUuMym9aINlAY5QVzb7h8rsMhxXYvkx05NacbHOF\nvU4wSY2Z1QRXYi9eTP/78QS+wO3tGFwsgntjgWyK2MYUzYA6OCbZ3tBjv4N6v+aOE5yrMk0Zxovt\nz7pM22H2f6youpY1HsrO3Ma6t6nA4Uwxuz5sk/B28bF8eontbvkdCUwXnNvNDPPEMpZNyX/gsRL9\nWSJOG0Sh9W/K7s8p7cUnBQZmp3u+2KmLfaJsvwqn4Kse+R0JnJ3u7WabK8TMX5Np2638C9RS0bkr\n8GhW0OjcQ3CaCPDeAgONIHcyg1aJzr3I/s7thd9OcHm6iG0Lse9+PP3e6cBq90Kxn1+jdfQlfxvF\nR5xhQeNE4+ES+ZD4htlKxZfHBEH4vR76HdTZmrtU8/Vta05/qphlz7fpb06y28rBSoNj1w8OqrAk\nEZlZpXiQ4mbVJz3NcFd6/qRhY9RDTBT72bUjTaQLmCQOA57rwMaQ7m7Ruo55uNP/77B+hkiRJ44s\njTGMYQxjGMMoxT/ttCHKz196MgAAAABJRU5ErkJggg==\n", | |
"text/latex": "$$\\frac{n^{2}}{4} \\left(n + 1\\right)^{2}$$", | |
"text/plain": [ | |
" 2 2\n", | |
"n ⋅(n + 1) \n", | |
"───────────\n", | |
" 4 " | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Verify using induction\n", | |
"Base step: p(0) = 0\n", | |
"Induction step: p(n) - p(n-1) - n^3 = 0\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "EEWzZxGk3_QG", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Theorem 1.4.2\n", | |
"For every triangle ABC, the angle bisectors intersect at one point.\n", | |
"\n", | |
"Note:\n", | |
"http://sites.math.rutgers.edu/~zeilberg/PG/IncenterExists.html" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "XoKTOpG74HkP", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 68 | |
}, | |
"outputId": "3dc5f659-3a27-45cb-d945-0d65fd2cfc51" | |
}, | |
"source": [ | |
"# Let ta = tan(a) and tb = tan(b)\n", | |
"ta, tb = symbols('ta, tb')\n", | |
"\n", | |
"# Tangent Sum\n", | |
"# tan(a1+a2)= (tan(a1)+tan(a2)) / (1-tan(a1)*tan(a2)) \n", | |
"def f(ta, tb):\n", | |
" return (ta+tb)/(1-ta*tb)\n", | |
"\n", | |
"# tan(2*a) as expression in terms of tan(a)\n", | |
"def f2(ta):\n", | |
" return f(ta, ta)\n", | |
"\n", | |
"def anglebis(ta, tb):\n", | |
" x, y = symbols('x, y')\n", | |
" \n", | |
" # Without loss of generality, assume point A is at (0,0),\n", | |
" # point B is at (1,0), and point C is (Cx, Cy).\n", | |
" # Let angle A be 2*a and angle B be 2*b.\n", | |
"\n", | |
" # Equation of the line at point A(0,0) with slope tan(a).\n", | |
" # This is the angle bisector of A.\n", | |
" # Note that we could have also written this as\n", | |
" # eq1 = y - x*ta.\n", | |
" # The Sympy solver will assume eq1 = 0. \n", | |
" eq1 = Eq(y, x*ta)\n", | |
" # Equation of a line at point B(1,0) with slope -tan(b).\n", | |
" # This is the angle bisector of B.\n", | |
" eq2 = Eq(y, (x-1)*(-tb))\n", | |
" \n", | |
" # Solve for the point C, by finding where\n", | |
" # sides A and B intersect.\n", | |
" Eq1 = Eq(y, x*f2(ta))\n", | |
" Eq2 = Eq(y, (x-1)*(-f2(tb)))\n", | |
" sol = nonlinsolve([Eq1, Eq2], (x,y))\n", | |
" (Cx, Cy) = next(iter(sol))\n", | |
" \n", | |
" # Solve for the intersection of the angle bisectors\n", | |
" # of A and B.\n", | |
" sol2 = nonlinsolve([eq1, eq2],(x,y))\n", | |
" (ABx, ABy) = next(iter(sol2))\n", | |
" \n", | |
" # Equation of angle bisector of C.\n", | |
" # The slope of this line is perpendicular to the slope with\n", | |
" # angle -(b-a), which means slope is -1/tan(a-b).\n", | |
" eq3 = Eq(y - Cy, (x-Cx)*(-1/f(ta, -tb)))\n", | |
" \n", | |
" # Solve for the intersection of the angle bisectors\n", | |
" # of A and C.\n", | |
" sol3 = nonlinsolve([eq1, eq3],(x,y))\n", | |
" (ACx, ACy) = next(iter(sol3))\n", | |
" \n", | |
" # Print x and y coordinates of interections\n", | |
" # between A and C, and A and B.\n", | |
" print(ACx, \",\", ABx)\n", | |
" print(ACy, \",\", ABy)\n", | |
" \n", | |
" # If the angle bisectors are concurrent,\n", | |
" # then the difference between the points of intersection\n", | |
" # is zero.\n", | |
" return (ACx - ABx, ACy - ABy)\n", | |
" \n", | |
"print(anglebis(ta, tb))\n" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"tb/(ta + tb) , tb/(ta + tb)\n", | |
"ta*tb/(ta + tb) , ta*tb/(ta + tb)\n", | |
"(0, 0)\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "k4_ZITXieuKJ", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 1.5.1\n", | |
"Prove the identity\n", | |
"\n", | |
"$$\\sin(a+b) = \\sin(a)\\cos(b)+\\sin(b)\\cos(a)$$\n", | |
"\n", | |
"by setting $\\sin(a) = x$ and $\\sin(b)=y$ and proving the equivalent identity\n", | |
"\n", | |
"$$\\arcsin(x) + \\arcsin(y) = \\arcsin\\left(x*\\sqrt{1-y^2} + y*\\sqrt{1-x^2}\\right)$$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "EGsUcS6Sfn7S", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 166 | |
}, | |
"outputId": "ad33c286-595c-40ba-d1f7-cbb7c22749af" | |
}, | |
"source": [ | |
"x,y = symbols('x,y')\n", | |
"f = asin(x) + asin(y)\n", | |
"g = asin(x*sqrt(1-y**2) + y*sqrt(1-x**2));\n", | |
"# Show that f(0, y) is equal to g(0, y)\n", | |
"print(\"Setting x = 0 in both f and g:\")\n", | |
"initial_condition = r'f(0, y) - g(0,y) =' +\\\n", | |
" str(simplify(f.subs({x:0}) - g.subs({x:0})))\n", | |
"\n", | |
"display(Math(initial_condition))\n", | |
"\n", | |
"f1 = diff(f,x)\n", | |
"g1 = diff(g,x)\n", | |
"# Show that (d/dx f(x, y))^2 - (d/dx g(x,y))^2\n", | |
"print(\"Comparing derivatives of f and g:\")\n", | |
"derivative_expression = r'\\frac{\\partial f(x, y)}{\\partial x}^2 -' +\\\n", | |
" r'\\frac{\\partial g(x, y)}{\\partial x}^2 =' +\\\n", | |
" str(simplify(g1**2 - f1**2))\n", | |
"\n", | |
"display(Math(derivative_expression))\n", | |
"\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Setting x = 0 in both f and g:\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$$f(0, y) - g(0,y) =0$$", | |
"text/plain": [ | |
"<IPython.core.display.Math object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Comparing derivatives of f and g:\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$$\\frac{\\partial f(x, y)}{\\partial x}^2 -\\frac{\\partial g(x, y)}{\\partial x}^2 =0$$", | |
"text/plain": [ | |
"<IPython.core.display.Math object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "DnQGKzjqhTyx", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 1.6\n", | |
"All Fibonacci number identities such as Cassini’s $F_{n+1}F_{n-1} - F_{n}^2 = (-1)^n$ (and much more complicated ones), are routinely provable using Binet’s formula:\n", | |
"\n", | |
"$$F_{n} = \\frac{1}{\\sqrt{5}}\\left(\\frac{(1+\\sqrt{5})^n}{2} - \\frac{(1-\\sqrt{5})^n}{2}\\right)$$\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "H9Zo62HgicAS", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 65 | |
}, | |
"outputId": "4e0b1e5d-6b1d-457b-f982-b7492103b6de" | |
}, | |
"source": [ | |
"F = (((1+sqrt(5))/2)**n-((1-sqrt(5))/2)**n)/sqrt(5)\n", | |
"\n", | |
"Cas = F.subs({n:(n+1)})*F.subs({n:(n-1)}) - F**2\n", | |
"# Notice the use of \"cancel\". This is a SymPy method that cancels terms from\n", | |
"# the numerator and denomiator and helps with simplification when the\n", | |
"# expression is a fraction.\n", | |
"cas_expression = r'F_{n+1}F_{n-1}- F_{n}^2 - (-1)^n =' +\\\n", | |
" str(simplify(cancel(Cas) - (-1)**n))\n", | |
"\n", | |
"display(Math(cas_expression))\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$$F_{n+1}F_{n-1}- F_{n}^2 - (-1)^n =0$$", | |
"text/plain": [ | |
"<IPython.core.display.Math object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "DJOwegXo994Q", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 1.8" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "Mb99b4SE-paG", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 34 | |
}, | |
"outputId": "7c2ce316-d266-4c57-8866-0da7d5d4dc02" | |
}, | |
"source": [ | |
"# F(x) + F(y) = F(g(x, y)),\n", | |
"# where F'(z) and g(x,y) are known functions\n", | |
"# Differentiate both sides with respect to x\n", | |
"# LHS: F'(x)\n", | |
"# RHS: F'(g(x,y)) * g'(x,y)\n", | |
"# Verify that (LHS / RHS)^2 == 1\n", | |
"\n", | |
"x, y, z = symbols('x, y, z')\n", | |
"F_prime = 1 / (sqrt(1-z**2)* sqrt(1-k**2*z**2))\n", | |
"g = (x * sqrt(1-y**2) * sqrt(1-k**2*y**2) +\n", | |
" y * sqrt(1-x**2) * sqrt(1-k**2*x**2)) / (1-k**2*x**2*y**2)\n", | |
"\n", | |
"lhs = F_prime.subs({z:x}) # F'(x)\n", | |
"rhs = F_prime.subs({z:g}) * g.diff(x) # F'(g(x, y)) * g'(x,y)\n", | |
"\n", | |
"print(simplify((rhs / lhs) ** 2))" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"1\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "Xec-ZSQu9N5y", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"# Chapter 2: Tightening the Target" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "4hsO2FzY3xtq", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Chapter 2 Prerequisite Code" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "_LceJkCT9LBk", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"# Standardized WZ Proof Algorithm (P. 25)\n", | |
"# Prove the identity Sum_k t(n,k) = rhs(n) using the proof certificate R(n,k).\n", | |
"# Inputs:\n", | |
"# t: summand in terms of n and k\n", | |
"# rhs: rhs expression in terms of n\n", | |
"# R: rational function proof certificate in terms of n and k\n", | |
"# Outputs:\n", | |
"# recurr: F(n + 1, k) − F(n, k) - G(n, k + 1) + G(n, k)\n", | |
"# This should evaluate to 0, but you may need to do some further\n", | |
"# simplication to show this.\n", | |
"# initial: Sum_k F(0, k)\n", | |
"# This should evaulate to 1, but you may need to do some further\n", | |
"# simplication to show this.\n", | |
"def WZ_verify(t, rhs, R):\n", | |
" # 2. Define F(n,k) = t(n,k) / rhs(n),\n", | |
" # or F(n,k) = t(n,k) if rhs(n) equals 0.\n", | |
" F = t;\n", | |
" constant = 0\n", | |
" if simplify(rhs) != 0:\n", | |
" F = F/rhs\n", | |
" constant = 1\n", | |
" # 3. Define G(n,k) = R(n,k)*F(n,k)\n", | |
" G = R*F\n", | |
" # 4. Show that F(n + 1, k) − F(n, k) = G(n, k + 1) − G(n, k)\n", | |
" recurr = combsimp(F.subs({n:(n+1)}) - F - G.subs({k:(k+1)}) + G)\n", | |
" # 5. Verify Sum_k F(0, k) = 1.\n", | |
" initial = combsimp(Sum(F.subs({n:0}), (k, 0, oo)).doit())\n", | |
" if (recurr == 0 and initial == constant):\n", | |
" return True\n", | |
" else:\n", | |
" return {'recurr':recurr, 'f_0':initial }\n" | |
], | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "6bOnq024jhok", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 2.3 Human and computer proofs; an example\n", | |
"Prove\n", | |
"$$\\sum_{k} \\binom{n}{k}^2 = \\binom{2n}{n}$$\n", | |
"\n", | |
"using proof certificate\n", | |
"\n", | |
"$$R(n,k)=− \\frac{k^2(3n+3−2k)}{2(n + 1 − k)^2(2n + 1)}$$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "ktlCUsATx-NE", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 34 | |
}, | |
"outputId": "aedaea40-95b8-4053-e7ca-dfd5b5521339" | |
}, | |
"source": [ | |
"R = -k**2 * (3*n+3-2*k) / (2*(n+1-k)**2 * (2*n+1))\n", | |
"t = binomial(n,k)**2\n", | |
"rhs = binomial(2*n,n)\n", | |
"print(WZ_verify(t, rhs, R))" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"True\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "YKGaswBckebA", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 2.3.1\n", | |
"Prove\n", | |
"$$\\sum_{k} \\binom{n}{k} = 2^n$$\n", | |
"\n", | |
"using proof certificate\n", | |
"$$R(n,k) = \\frac{k}{2(k − n − 1)}$$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "-gy1llFioPIf", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 34 | |
}, | |
"outputId": "acc97e0c-13c6-4e88-b08e-a195ebb46f62" | |
}, | |
"source": [ | |
"R = k / (2*(k-n-1))\n", | |
"t = binomial(n,k)\n", | |
"rhs = 2**n\n", | |
"print(WZ_verify(t, rhs, R))" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"True\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "iASODlHtdTHO", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 2.3.2\n", | |
"American Mathematical Monthly 101 (1994), p. 356\n", | |
"\n", | |
"Prove $\\sum_{k} F(n,k) = 1$, where\n", | |
"\n", | |
"\n", | |
"$$F(n,k)=\\frac{(n - i)! (n - j)! (i - 1)! (j - 1)!}{(n - 1)! (k - 1)! (n - i - j + k)! (i - k)! (j - k)!}$$\n", | |
"\n", | |
"using proof certificate\n", | |
"\n", | |
"$$R(n,k) = \\frac{k-1}{n}$$\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "RMLzckM8eU4j", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 51 | |
}, | |
"outputId": "667b88b1-3352-4e57-b6d3-cf4c4a1added" | |
}, | |
"source": [ | |
"i, j = symbols('i, j', integer=True)\n", | |
"# In this example, k >= 1, n >= 1, 1 <= i,j <= n (see the AMM article).\n", | |
"# First, we shift F and R so that k >=0, n >=0, 0 <= i,j <= n-1.\n", | |
"R = k / (n+1)\n", | |
"numer = factorial(n-i)*factorial(n-j)*factorial(i)*factorial(j)\n", | |
"denom = factorial(n)*factorial(k)*factorial(n-i-j+k)*factorial(i-k)*factorial(j-k)\n", | |
"\n", | |
"t = numer / denom\n", | |
"# Note that F(n,k) can also be written in terms of binomials:\n", | |
"# t = binomial(n-i, j-k)*binomial(i, k) / binomial(n, j)\n", | |
"\n", | |
"rhs = 1\n", | |
"\n", | |
"print(WZ_verify(t, rhs, R))\n", | |
"\n", | |
"# The recurrence equals 0 as expected, but the sum of F(0,k) cannot be simplified.\n", | |
"# However, we know that i,j <=n and n=0, so we plug in i,j=0\n", | |
"# and get a sum of 1, as expected.\n", | |
"print(Sum(t.subs({n:0, i:0, j:0}), (k, 0, oo)).doit())\n" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"True\n", | |
"1\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "6SKXwfCpyvEn", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Exercises 2.7 #2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "-3nSIeWBy0Dm", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 85 | |
}, | |
"outputId": "c0204ac1-54d0-4e0b-a800-861cf266f6c2" | |
}, | |
"source": [ | |
"x, r = symbols('x, r')\n", | |
"\n", | |
"# Problem 2a\n", | |
"R = k*(k+x) / ((n+1)*(k-n-1))\n", | |
"t = (-1)**k * binomial(n,k) * x / (k+x)\n", | |
"rhs = 1 / binomial(x+n,n)\n", | |
"\n", | |
"print(WZ_verify(t, rhs, R))\n", | |
"\n", | |
"# Problem 2b\n", | |
"R = k*(k+r) / ((n+x+1)*(k-n-1))\n", | |
"t = binomial(n,k) * binomial(x, k+r)\n", | |
"rhs = binomial(n+x,n+r)\n", | |
"\n", | |
"print(WZ_verify(t, rhs, R))\n", | |
"\n", | |
"# Problem 2c\n", | |
"R = k*(2*k+1)*(x-2*n-1) / ((k-n-1)*(2*n-2*x-1)*(n-x))\n", | |
"t = binomial(x+1, 2*k+1)*binomial(x-2*k, n-k)*2**(2*k+1)\n", | |
"rhs = binomial(2*x+2, 2*n+1)\n", | |
"\n", | |
"print(WZ_verify(t, rhs, R))\n", | |
"\n", | |
"# Problem 2d\n", | |
"R = k*(2*k-1)/((2*n-1)*(k-n-1))\n", | |
"t = (-1)**k * binomial(n,k) * 4**k / binomial(2*k, k)\n", | |
"rhs = 1/(1-2*n)\n", | |
"\n", | |
"print(WZ_verify(t, rhs, R))\n" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"True\n", | |
"True\n", | |
"True\n", | |
"True\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "FJw3e3qw-KA5", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"# Chapter 3: The Hypergeometric Database" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "qimZ616NVlnC", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Chapter 3 Prerequisite Code" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "ob9AkTk-RhMR", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"# http://mathworld.wolfram.com/HypergeometricSeries.html\n", | |
"# Write a hypergeometric series in terms of the\n", | |
"# hypergeometric function pFq.\n", | |
"def hyperfunc(tk, k):\n", | |
" t0 = simplify(tk.subs(k, 0).doit())\n", | |
" h = hypersimp(tk.doit(), k).as_numer_denom()\n", | |
" numer = factor_list(h[0])\n", | |
" denom = factor_list(h[1])\n", | |
" \n", | |
" c0 = numer[0]\n", | |
" c1 = denom[0]\n", | |
" a = []\n", | |
" b = []\n", | |
" c = c0 / c1\n", | |
"\n", | |
" has_k_plus_1_term = false\n", | |
" for term in denom[1]:\n", | |
" if k not in term[0].free_symbols:\n", | |
" c = c/(term[0]**term[1])\n", | |
" else:\n", | |
" # term = (k1*k + k0)^p\n", | |
" k0 = term[0].coeff(k, 0)\n", | |
" k1 = term[0].coeff(k, 1)\n", | |
" p = term[1]\n", | |
" if simplify(term[0] - (k+1)) == 0:\n", | |
" has_k_plus_1_term = true\n", | |
" p = p - 1\n", | |
"\n", | |
" c = c/(k1**p)\n", | |
" b.extend([simplify(k0/k1)]*p)\n", | |
"\n", | |
" # if denominator doesn't have (k+1) term, then\n", | |
" # multiply (k+1) to top and bottom\n", | |
" if not has_k_plus_1_term:\n", | |
" a.append(1)\n", | |
" \n", | |
" for term in numer[1]:\n", | |
" if k not in term[0].free_symbols:\n", | |
" c = c*(term[0]**term[1])\n", | |
" else:\n", | |
" # term = (k1*k + k0)^p\n", | |
" k0 = term[0].coeff(k, 0)\n", | |
" k1 = term[0].coeff(k, 1)\n", | |
" p = term[1]\n", | |
" c = c*(k1**p)\n", | |
" a.extend([simplify(k0/k1)]*p)\n", | |
" \n", | |
" return t0*hyper(a, b, c)" | |
], | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "rt-87kQIKzCA", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 3.3 How to identify a series as hypergeometric" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "m4zwGVaHK6yu", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 85 | |
}, | |
"outputId": "9d96ea4b-624c-47cf-8ca8-f77eaaa1bfc2" | |
}, | |
"source": [ | |
"x = symbols('x')\n", | |
"tk = x**k / factorial(k)\n", | |
"print(\"e^x is equal to they hypergeometric function:\") \n", | |
"display(hyperfunc(tk, k))\n", | |
"\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"e^x is equal to they hypergeometric function:\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$${{}_{0}F_{0}\\left(\\begin{matrix} \\\\ \\end{matrix}\\middle| {x} \\right)}$$", | |
"text/plain": [ | |
" ┌─ ⎛ │ ⎞\n", | |
" ├─ ⎜ │ x⎟\n", | |
"0╵ 0 ⎝ │ ⎠" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "Fh-Vrxvz4k37", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 3.3.1\n", | |
"\n", | |
"Express the series with terms\n", | |
"\n", | |
"$$t_k = 2^k/k!^2$$\n", | |
"\n", | |
"as a hypergeometric function $_pF_q[...]$." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "4ghdVgd65k6n", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 89 | |
}, | |
"outputId": "d32c4d7e-d073-4baf-b424-fbfe4d2356c0" | |
}, | |
"source": [ | |
"display_latex()\n", | |
"tk = 2**k / factorial(k)**2\n", | |
"display(hyperfunc(tk, k))" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$${{}_{0}F_{1}\\left(\\begin{matrix} \\\\ 1 \\end{matrix}\\middle| {2} \\right)}$$", | |
"text/plain": [ | |
" ┌─ ⎛ │ ⎞\n", | |
" ├─ ⎜ │ 2⎟\n", | |
"0╵ 1 ⎝1 │ ⎠" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "gwC9EGXN-QGJ", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 3.3.2\n", | |
"\n", | |
"Consider the series\n", | |
"$$\\sum_{k} \\frac{1}{(2k+1)(2k+3)!}$$\n", | |
"\n", | |
"Is this a hypergeometric series, and if so which one is it?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "8IIpkPUc-Qjj", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 178 | |
}, | |
"outputId": "b0748df8-c6b1-4cab-fedd-84e45d16de3d" | |
}, | |
"source": [ | |
"display_latex()\n", | |
"\n", | |
"tk = 1 / ((2*k+1)*factorial(2*k+3))\n", | |
"\n", | |
"# Notice that k is nonzero for k >= -1. We first shift\n", | |
"# k so that the support is on k >= 0.\n", | |
"# Shift original sum such that k is nonzero for k >=0\n", | |
"tk = tk.subs(k, k-1)\n", | |
"print(\"Is series hypergeometric?\", tk.is_hypergeometric(k))\n", | |
"\n", | |
"# Display the rational function for the ration\n", | |
"# of two consecutive terms.\n", | |
"display(hypersimp(tk, k))\n", | |
"\n", | |
"# Write the series in terms of the\n", | |
"# generalized hypergeometric function.\n", | |
"display(hyperfunc(tk, k))" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Is series hypergeometric? True\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAJwAAAAjCAYAAABhJGPtAAAABHNCSVQICAgIfAhkiAAABHRJREFU\neJzt23moVVUUx/HP0yb1RVREUWDRQAMqr0mksF7+UxCFDVBYQlRQ4B8VQdMfEhRkBKVBExFdKEgM\nooEgG/8okgw1yqhAoknLtCfZRFrYH+tcPPe8c+87eod38+0vHN49a++792+9u886e++zDolEoqMs\nwVvjLSIRTBpvAT1gCJ90sf3z8Co2Yheua1H3SSzF3fgY27EFr2FGFzX2DRNlwK3rYvuDWI9b8FeL\negO4FC9jGI/jHMzDP3gbh3VRZ6IHHCWizmnZ+TQsx1oc14X+ftc8ws3GL9ivpGwQ/+KSLmjqK/b1\nCDckos5XOBmrRTQ5F9/0WMt8vJ71X+Rg8Vts66miRMe5Cx/hChFdbu1yf60i3Oe4vEnZCnHbn9wF\nTYkeshwj+BXnt6h3v7j1tjqGK/TXbMCdKCLttJKyh7EJx1do/39P2XxiX2IIL2GB1hPypXh+jLa+\na0PHfLyDPwr2R3A1LsDXbbSf6AOmion42bhGRJ8zutxnswj3Pm4s2JbhJ5zaZU2JHjFHTNCnZOf3\nib2yYzrcz6CIpEP4E4uzz9Oz8iOwE0fmvvOY2IObJ1bS9WOww9oSPeRmfJE7HxCT8zUi+nWKYeVz\nvlpWfj0+LHyn2Tzx3g7qSkxQXsEd4y2iX0jL8O4zHS+IW2gikUgkEolEJxjI/u4aVxWJRCLRCw7F\nZpyQs/VDxuyLuL1JWZnmKiS/ukcrvxp4CM8WbG9k9m5RJWN2pngIf0hJWVFz1Wza5NfesQifZjq2\nYxUuLtRp6lc+H26qeN73TKHO3mbM1lTbOa+SMfuZeLh9bcFepnlYtWza5FcjNdX8+gF3iufSZ+Fd\nkcU8K1enmV8NXClG5UDO1k7GbM2eP6pplU+2GB8UbGWai5Rl0ya/RlOz94/WRnBTwVbmV0OEmyue\nM+ZXrP2UMbtapGlPydnKNBcpy6ZNfnWGySK9atDo58VlfjUMuGNFImCeIREe52cNPi3CZKuXRbrF\nJuyPo3O2Ms1Flom3tlblbMmv9pgpovbf4k20y7J+85T51cBKPFWwVc2YhXsyEfVjJ3YUbHPHaKPV\nreckccXnJ8plmvM0y6ZNfrXn1wEii/lMPICtRi9gyvxqyPjdKpbieapmzBIjfUXu/EGxQns0Z9s4\nRhutqPe/JWcr01ynVTZt8qs9v3ZgQ/Z5jUhyvQ035OqU+dUw4NZpvAqnilG6EO/hObHUX9tExEh2\n1PktO99QXn2PmSH+AZtztqLmOstwlfhRviyUJb+CTvo1CQcWbGV+NQy4lWKUHy7ecJolQuJ6sf9z\nitj7ma29K7rIoAjPdeHTxZU6ovE9grmZxjxFzUQ27UIxj9kmVm7svk0kv9pjiXjd8XuxcFkgtmyK\ne3Flfo1ildjYo/2M2Zpqy+xhrTNm4SAxL5kzhmZN2spn0ya/yqmp5lcN34oFw89iL/DCQp1WfjVw\nkVhS91ti5iK82aSsXzVXYcL5VXRmgwj/P4oR2i+cjifsvr3k6VfNVZiIfiUSiUQikWif/wDxotcK\nUV3kwAAAAABJRU5ErkJggg==\n", | |
"text/latex": "$$\\frac{k - \\frac{1}{2}}{\\left(k + 1\\right) \\left(2 k + 1\\right) \\left(2 k + 3\\right)}$$", | |
"text/plain": [ | |
" k - 1/2 \n", | |
"───────────────────────────\n", | |
"(k + 1)⋅(2⋅k + 1)⋅(2⋅k + 3)" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$$- {{}_{1}F_{2}\\left(\\begin{matrix} - \\frac{1}{2} \\\\ \\frac{1}{2}, \\frac{3}{2} \\end{matrix}\\middle| {\\frac{1}{4}} \\right)}$$", | |
"text/plain": [ | |
" ┌─ ⎛ -1/2 │ ⎞\n", | |
"- ├─ ⎜ │ 1/4⎟\n", | |
" 1╵ 2 ⎝1/2, 3/2 │ ⎠" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "e_lLO9SSNUnN", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 3.3.3" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "uCqw9Bjd_nmt", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 117 | |
}, | |
"outputId": "30c941c8-bc61-4209-815d-06218a299bc5" | |
}, | |
"source": [ | |
"x, y, j, d = symbols('x, y, j, d')\n", | |
"f = Product(x-j*d, (j, 0, n-1))\n", | |
"tk = binomial(n,k)*f.subs({n:k})*f.subs({x:y, n:(n-k)})\n", | |
"print(\"Is series hypergeometric?\", tk.doit().is_hypergeometric(k))\n", | |
"display(hyperfunc(tk, k))\n", | |
"\n", | |
"display_latex()\n", | |
"\n", | |
"\n" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Is series hypergeometric? True\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$$\\left(- d\\right)^{n} {\\left(- \\frac{y}{d}\\right)}^{\\left(n\\right)} {{}_{2}F_{1}\\left(\\begin{matrix} - n, - \\frac{x}{d} \\\\ - n + 1 + \\frac{y}{d} \\end{matrix}\\middle| {1} \\right)}$$", | |
"text/plain": [ | |
" ⎛ -x │ ⎞\n", | |
" ⎜ -n, ─── │ ⎟\n", | |
" n ⎛-y ⎞ ┌─ ⎜ d │ ⎟\n", | |
"(-d) ⋅RisingFactorial⎜───, n⎟⋅ ├─ ⎜ │ 1⎟\n", | |
" ⎝ d ⎠ 2╵ 1 ⎜ y │ ⎟\n", | |
" ⎜-n + 1 + ─ │ ⎟\n", | |
" ⎝ d │ ⎠" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "C1x2iv84DIEZ", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 3.3.4\n", | |
"Consider the series\n", | |
"$$\\sum_{k=0}^{n} \\binom{n}{k}\\frac{\\left(-1\\right)^k}{k!}$$\n", | |
"\n", | |
"Is this a hypergeometric series, and if so which one is it?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "gnfL-ljnOm-q", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 106 | |
}, | |
"outputId": "8151f9f3-c381-45d7-edbb-a417e9285ae2" | |
}, | |
"source": [ | |
"tk = binomial(n,k)*(-1)**k/factorial(k)\n", | |
"print(\"Is series hypergeometric?\", tk.is_hypergeometric(k))\n", | |
"display(hyperfunc(tk, k))\n", | |
"\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Is series hypergeometric? True\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$${{}_{1}F_{1}\\left(\\begin{matrix} - n \\\\ 1 \\end{matrix}\\middle| {1} \\right)}$$", | |
"text/plain": [ | |
" ┌─ ⎛-n │ ⎞\n", | |
" ├─ ⎜ │ 1⎟\n", | |
"1╵ 1 ⎝1 │ ⎠" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "lPp3g_e9M9YO", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 3.3.5" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "YADA_v3DDIPA", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 112 | |
}, | |
"outputId": "5bcb88a1-9ec8-4933-8e12-2041ec47ee42" | |
}, | |
"source": [ | |
"x, p = symbols('x, p')\n", | |
"\n", | |
"tk = (-1)**k *(x/2)**(2*k+p) / (factorial(k) * factorial(k+p))\n", | |
"print(\"Is series hypergeometric?\", tk.is_hypergeometric(k))\n", | |
"display(hyperfunc(tk, k))\n", | |
"\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Is series hypergeometric? True\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$$\\frac{\\left(\\frac{x}{2}\\right)^{p}}{p!} {{}_{0}F_{1}\\left(\\begin{matrix} \\\\ p + 1 \\end{matrix}\\middle| {- \\frac{x^{2}}{4}} \\right)}$$", | |
"text/plain": [ | |
" p ⎛ │ 2 ⎞\n", | |
"⎛x⎞ ┌─ ⎜ │ -x ⎟\n", | |
"⎜─⎟ ⋅ ├─ ⎜ │ ────⎟\n", | |
"⎝2⎠ 0╵ 1 ⎝p + 1 │ 4 ⎠\n", | |
"────────────────────────\n", | |
" p! " | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "b5wY_Y9LPKBH", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 3.5 Some enteries in the hypergeometric database\n", | |
"\n", | |
"Examples of how to call hypergeometric functions in SymPy." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "SmppCSLZPbf3", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 408 | |
}, | |
"outputId": "ff681e27-1111-4f3c-ea5c-ca7683ab2610" | |
}, | |
"source": [ | |
"# Hyperexpand won't always\n", | |
"\n", | |
"a,b,c,z = symbols('a,b,c,z')\n", | |
"\n", | |
"print(\"(I) Gauss's 2F1 Identity\")\n", | |
"F = hyper((a, b), [c], 1)\n", | |
"display(F)\n", | |
"display(hyperexpand(F))\n", | |
"\n", | |
"# Here is an example where\n", | |
"# hyperexpand was not able to convert\n", | |
"# the function to more standard functions.\n", | |
"print(\"(II) Kummer's 2F1 Identity\")\n", | |
"F = hyper((a,b), [c], -1)\n", | |
"display(F)\n", | |
"display(hyperexpand(F))\n", | |
"\n", | |
"print(\"More identities\")\n", | |
"F = hyper([a], [], z)\n", | |
"display(F)\n", | |
"display(hyperexpand(F))\n", | |
"\n", | |
"display_latex()\n" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"(I) Gauss's 2F1 Identity\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$${{}_{2}F_{1}\\left(\\begin{matrix} a, b \\\\ c \\end{matrix}\\middle| {1} \\right)}$$", | |
"text/plain": [ | |
" ┌─ ⎛a, b │ ⎞\n", | |
" ├─ ⎜ │ 1⎟\n", | |
"2╵ 1 ⎝ c │ ⎠" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAIMAAAAkCAYAAACqhIkwAAAABHNCSVQICAgIfAhkiAAABHZJREFU\neJzt2kmIHUUcx/FPNEISFDcQ9xxciBh15qIBDXhRRBFUhCiCC3hQgiBEPLhgkBwUBSUgRjz4xHhx\nO4gKKiKIW1wwJhEUImgwMTGLS4JbjHr49zAvne6Zru6eeTOZ/kLR73V31b///676V9V7Pzo6WuRo\nbMNpFe9/EcsmydYgWYF3B2i/SZxL6eG/gvJSdv0RPJPQ3jnYhSMT7dSxNUhex2MDtF8W50b08DaO\nz5WjMA8/46LENj/D0gQ7GtgaFJtxY416PSxv6RmK4lzKIRXv+wtbc+UXXC5G7wcFdU4So3gr/sQG\nXJpdexXXJ9gxjq0U7sM67MF2Efy5DdvMcxxOxD68g9+xFue3bId6cS6kamcoYzE+Fy+pn5OxRszx\n12ChSPG/Zdc/EYFJeQlltlKZjdtxtgjUJbizYZt5hrLjMjyIYfwg5vHZLdppNc5NH2w+thScfwpf\n4mqjL29j3/UtOEyMnm8b2kpled/n78XcvqCFdvsZwl7xgr7Lzt2Nr8Ti95uW7LQa56aZYa5ITf3M\nFyn9AeWj+I+++k1srVC86OwvF/fdfwpWYr1YXO3BLWLU5kltu59hvGK0IxDrHTg0d+892XOMlBsK\nzi0usNF6nJtmhh0iRfUzhH9ESi/jmOy4vaGtx7F6nHqbsuOx+BTv4S7RAfZl59YW1EtpO8+QA3c9\ni8SL3Zg7vwov9H1/WCw+V/ad21xio9U4N+0MX+Dm3Lm9WbtHGJ278iwUDm5raGtHVqpwBeZgidGR\ndBMOV9wZUtruZx7OtH8GmCXWD6vxd+7+XVkZYXf2Pd9p8rQe56bTxJs4S4y6EdaIlLhKLNIW4Fac\n13fP4qxuU1sp7BQv/iqcjjvwkAj+eIFP4Vz8K7aVizJbz+FU3N+inYmK85j08NoY1z9y4F72QrEF\n3C22hiO/HxCj81cRqBQ7ZbaqMgtPiFH0k0jDj+L9mu2VcRu+FovHTWJb+TJOqFi/p/rvDHXiPKFc\nJlbH+YVRGUvx1iTZmskkx7mNoG4U082PoieOxzCeFGl7om3NZJrEuaOjo6OjI8+s7Nj09/6Ojo6Z\nynRSGY1FXQVQG/4PWv1ERf972lU0TVWKFEA9k6OyGrT6iYoKqJ72FU1t0jNxCqCeyVFZ1VU/MQkK\nqPx/E3UUTSlMhsqIsdU/FCuAJlplNVXUT5QooKr+UTWdVEbjqX9IV1q14f9UUT9R4n/Vh5hOKqPx\n1D+kK63a8H+qqJ8o8b9qZihSGZGmBkpRGVFPAVRF/UO60qoN/1PUTwzA/6qZoUhlRHU1UKrKiHoK\noCrqH9KVVk39H3m2quonBuB/1c5QpDKiuhroWmkqI+opgKqof0hXWjX1P1X9xAD8rzpNTBeVURX1\nD+kKoKb+TyX1EyX+V+0M68UK9LqaD/mGWNg8iw9xBp4X28w2/xfZiSvF3PlxVpbYfwTMEYurpxPa\nber/kFio3StS/zoxX1+gns6yjIny/wAOFpVRXaXVQe9/imMHi8qorgJopvvf0dHR0dHR0QH+BzFD\nAOMeK5cxAAAAAElFTkSuQmCC\n", | |
"text/latex": "$$\\frac{\\Gamma{\\left(c \\right)} \\Gamma{\\left(- a - b + c \\right)}}{\\Gamma{\\left(- a + c \\right)} \\Gamma{\\left(- b + c \\right)}}$$", | |
"text/plain": [ | |
" Γ(c)⋅Γ(-a - b + c)\n", | |
"───────────────────\n", | |
"Γ(-a + c)⋅Γ(-b + c)" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"(II) Kummer's 2F1 Identity\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$${{}_{2}F_{1}\\left(\\begin{matrix} a, b \\\\ c \\end{matrix}\\middle| {-1} \\right)}$$", | |
"text/plain": [ | |
" ┌─ ⎛a, b │ ⎞\n", | |
" ├─ ⎜ │ -1⎟\n", | |
"2╵ 1 ⎝ c │ ⎠" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$${{}_{2}F_{1}\\left(\\begin{matrix} a, b \\\\ c \\end{matrix}\\middle| {e^{i \\pi}} \\right)}$$", | |
"text/plain": [ | |
" ┌─ ⎛a, b │ ⅈ⋅π⎞\n", | |
" ├─ ⎜ │ ℯ ⎟\n", | |
"2╵ 1 ⎝ c │ ⎠" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"More identities\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/latex": "$${{}_{1}F_{0}\\left(\\begin{matrix} a \\\\ \\end{matrix}\\middle| {z} \\right)}$$", | |
"text/plain": [ | |
" ┌─ ⎛a │ ⎞\n", | |
" ├─ ⎜ │ z⎟\n", | |
"1╵ 0 ⎝ │ ⎠" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGYAAAAWCAYAAAAy/emjAAAABHNCSVQICAgIfAhkiAAAAvNJREFU\naIHt2U+I1VUUwPGPM6YzTDCBLsTIQFK3RSRaYhNYLVxkJLh0+rMK3GQbRVDEiMKFKBa5CIOUBCVN\nCYpI8B/2hxhq0SZhilQsifwDKprT4lzw52/mvffrvd9v3jPeFy4X7pzfOWfuufeee+6jyz3FR/gD\nA+12pIN4HGN4rUSdG/AjruJP7EZ/LeEncBtvlOhAJ7ISO3Acl8Wkf9zgm09xHveX5MMmPIWHsQxn\nsa6W8Jf4W53I/U8YEcG4gp8VC8zCJLe+Ip92idNqHPPFbtlVkeEyGRaTNNTk989gHqYkHUUCQwTx\nV/TkxrckHfVa1teHsB0/4S9xnN3EWzA1p/yV5Oi+Ag42wwmxdWtxHEsrsp3naJPffSKOoGfxRWZ8\nm8aB/S31M/AdjuFN/I5/0tgI4wOzLAmcbtLpRhzEVxOMv4w5+Loiu2VyMvX5wFxMrQjL0YdVYifB\napG7RvLCA7glttZkslU496Hxx0M9hrV2lGUZUvwoG0yy37Zgb7mY6xfxCNaIS8VlcWLdNREPojcJ\nTAZT8B7WYideFfmt07mE62KHN8vn+EAk+lMi1+0RV+exvPDiNFgrv4xqnNyyrd7q601OjeGdAv/I\nf7W9u4DOLEMFfM5yVqz4ysjmmGup76she0aslKKcqzF+H/aKOmIjNhfQtQ0P5MYexQsiwKO5v407\np0um3535qpzZYtWcqNBGH44kO2tb1DWsPTmmRxy5Z0qwW5PsjjkvngUWVGRrAJ+J+uF1vF+RnapZ\nIPJjpbsym/zHxL16prgplMmgeFF4Wqz0ezUosCj1zdZBhcjXMQfwEp7HLyXa2YsnxRVzrijQ8ryN\nGyXabMSK1GBW6he7c3G4KIq/PM+JWu9Qlc7lmYYL+KZEnT3iPareLepCE3qHtZZjNjXwaXSCbwZF\n0j/YpM2WWCcce6wdxjucNWJulrTDeJ94pDvcDuMdTL8oAfZPhrHeCcZu4QdMx/fixbNLVOc38K74\nWaRLly5dutTnX5/EzXwh44E7AAAAAElFTkSuQmCC\n", | |
"text/latex": "$$\\left(- z + 1\\right)^{- a}$$", | |
"text/plain": [ | |
" -a\n", | |
"(-z + 1) " | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "8AdtKsMTl671", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"# Chapter 4 Sister Celine’s Method" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "4hVaR-zRVfFu", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Chapter 4 Prerequisite Code" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "DyZRG-lImCF4", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"def celine(f, x0_y0, I, J):\n", | |
" x0,y0 = x0_y0\n", | |
" F = Function('F')\n", | |
" a = numbered_symbols('a')\n", | |
" Fs = [F(n-j) for i in range(I + 1) for j in range(J+1)]\n", | |
" fs = [f.subs({n:(n-j), k:(k-i)}) for i in range(I + 1) for j in range(J+1)]\n", | |
" syms = [next(a) for i in range(I + 1) for j in range(J+1)] \n", | |
" y = sum(a*b for a,b in zip(syms, fs))\n", | |
" t = cancel(combsimp(y/f))\n", | |
" numer = t.as_numer_denom()[0]\n", | |
" coeffs = collect(numer, k).as_poly(k).all_coeffs()\n", | |
" soln = list(linsolve(coeffs, syms))[0]\n", | |
" recur = sum(a*b for a,b in zip(soln, Fs))\n", | |
" if recur == 0:\n", | |
" return {\"recurr\": recur, \"closedform\": None}\n", | |
"\n", | |
" return {\"recurr\": recur, \"closedform\": rsolve(recur, F(n), {F(x0): y0})}\n", | |
"\n", | |
"\n", | |
"# Test\n", | |
"soln = celine(binomial(n, k), (0,1), 1, 1)\n", | |
"assert simplify(soln[\"closedform\"] - 2**n) == 0\n" | |
], | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "x5bQukH-WUsI", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 4.1.1\n", | |
"\n", | |
"Find recurrence and close form of\n", | |
"\n", | |
"$$f(n) = \\sum_{k} k\\binom{n}{k}$$\n", | |
"for $n = 0, 1, 2, ...$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "Txfa4NfTW4ZO", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 130 | |
}, | |
"outputId": "f46f6279-aa84-4c06-bf4a-932c13909981" | |
}, | |
"source": [ | |
"# Use initial condition f(1) = 1,\n", | |
"# and J = I = 1\n", | |
"soln = celine(k*binomial(n,k), (1,1), 1, 1)\n", | |
"display(soln[\"recurr\"])\n", | |
"display(soln[\"closedform\"])\n", | |
"\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"2*a3*F(n - 1) + (-a3 + a3/n)*F(n)\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\nrkJggg==\n", | |
"text/latex": "$$2 a_{3} F{\\left (n - 1 \\right )} + \\left(- a_{3} + \\frac{a_{3}}{n}\\right) F{\\left (n \\right )}$$", | |
"text/plain": [ | |
" ⎛ a₃⎞ \n", | |
"2⋅a₃⋅F(n - 1) + ⎜-a₃ + ──⎟⋅F(n)\n", | |
" ⎝ n ⎠ " | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAD4AAAAWCAYAAACYPi8fAAAABHNCSVQICAgIfAhkiAAAAkFJREFU\nWIXt1k+IjVEYx/EPTRRjY6RZyIJJwmLGKCmmoZmUSRZ2ShSLWfi7UkRIzWYWykrKn4VJ8idTSlkY\nkQ2aGJohahKKLMi//Lc45+qde98798q9Zuh+6+28nec5z/k955z3PC8VRi1N6MYz/MD6UgQdW4og\nZaYa97AVH0dYC5gm7MAqXMJ7PMbSMs75Tol2PEkNNuI8Hgmr+wbXsUHu6WgTEr+KFtThAnpLLSxB\nWRJvFxJ5jpPowFG8jv1nMCbhv0tYmNpE31o8LbWwBGVJfBlWyt3ZWjwRkl+d6D+NrizffejJE/9A\njDHc01xAY1kSH46dgrBDib6H2Jzl142DeWJMwewCz4QCOgol3hp1dmCesDEv4rgbWJhxrCowUYYv\nsf0a24mYKfd7bsC5PDFexaecNMR2Fm7iMk5gLlYIG1OHt8UEq0KfsJLLY98ifBNKTYaa6FP/Z9pz\nqI4x6/EBe+L79BTfU1HDS8zPsp2NtiXFTtwZB1xM9LVjIMuvBZ8xrtjARdIs/T44nuL7INraUmyZ\nO6a1mEm3ROd+TP5NwX+banzHoKHVJ0OXkMuMQoE2Rcf7hpas0cpiQe+RPPYBoTSnLcovtsUgfZha\nSnVlJHM621Nsk4TTcGW4ADtigF6hBP0rHBN0L0ixNUVbZ77Bu6PDLaP/m87mDj5Jv1y3C3mtyXQk\n6/g67BfK1DXh6GQzKP02HWnGYw7uCpUlm8bY3k4bvFfhX8qeUqotIY2CvsN57P3CT8uwF1uFChX+\nH34CDDmTFOKCtqQAAAAASUVORK5CYII=\n", | |
"text/latex": "$$2^{n - 1} n$$", | |
"text/plain": [ | |
" n - 1 \n", | |
"2 ⋅n" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "I2jwHb11X9-C", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 4.3.1\n", | |
"\n", | |
"Find recurrence and close form of\n", | |
"\n", | |
"$$f(n) = \\sum_{k}\\binom{n}{k}^2$$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "GwwjT8KQYZKC", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 6848 | |
}, | |
"outputId": "b0bd4dfc-55ec-4cfe-b35f-ac25d65c3f2f" | |
}, | |
"source": [ | |
"F = binomial(n,k)**2\n", | |
"\n", | |
"# Notice that I=J=1 returns 0 for the recurrence,\n", | |
"# so we need to try larger values for I and J\n", | |
"soln = celine(F, (0,1), 1, 1)\n", | |
"print(soln)\n", | |
"\n", | |
"# Note: This will finish but take a loooong time.\n", | |
"# Maybe go get some coffee. See Zeilberger's algorithm\n", | |
"# in Chapter 6 for a more efficient implementation.\n", | |
"soln = celine(F, (0,1), 2, 2)\n", | |
"display(soln[\"recurr\"])\n", | |
"display(soln[\"closedform\"])\n", | |
"\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"{'recurr': 0, 'closedform': None}\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "error", | |
"ename": "KeyboardInterrupt", | |
"evalue": "ignored", | |
"traceback": [ | |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/assumptions.py\u001b[0m in \u001b[0;36mgetit\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 242\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 243\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_assumptions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfact\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 244\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;31mKeyError\u001b[0m: 'zero'", | |
"\nDuring handling of the above exception, another exception occurred:\n", | |
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/assumptions.py\u001b[0m in \u001b[0;36mgetit\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 242\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 243\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_assumptions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfact\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 244\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;31mKeyError\u001b[0m: 'odd'", | |
"\nDuring handling of the above exception, another exception occurred:\n", | |
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/evalf.py\u001b[0m in \u001b[0;36mevalf\u001b[0;34m(x, prec, options)\u001b[0m\n\u001b[1;32m 1284\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1285\u001b[0;31m \u001b[0mrf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mevalf_table\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1286\u001b[0m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;31mKeyError\u001b[0m: <class 'sympy.polys.rootoftools.ComplexRootOf'>", | |
"\nDuring handling of the above exception, another exception occurred:\n", | |
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m<ipython-input-107-751c7faee147>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;31m# Maybe go get some coffee. See Zeilberger's algorithm\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;31m# in Chapter 6 for a more efficient implementation.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0msoln\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mceline\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0mdisplay\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msoln\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"recurr\"\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[0mdisplay\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msoln\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"closedform\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m<ipython-input-106-67680ebdca5e>\u001b[0m in \u001b[0;36mceline\u001b[0;34m(f, x0_y0, I, J)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mnumer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_numer_denom\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\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[1;32m 11\u001b[0m \u001b[0mcoeffs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcollect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_poly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mall_coeffs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0msoln\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlinsolve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcoeffs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msyms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\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[0m\u001b[1;32m 13\u001b[0m \u001b[0mrecur\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mb\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mb\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msoln\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[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrecur\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;32m/usr/local/lib/python3.6/dist-packages/sympy/solvers/solveset.py\u001b[0m in \u001b[0;36mlinsolve\u001b[0;34m(system, *symbols)\u001b[0m\n\u001b[1;32m 1301\u001b[0m \u001b[0;31m# Solve using Gauss-Jordan elimination\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1302\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1303\u001b[0;31m \u001b[0msol\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfree_syms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgauss_jordan_solve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfreevar\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1304\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1305\u001b[0m \u001b[0;31m# No solution\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/matrices/matrices.py\u001b[0m in \u001b[0;36mgauss_jordan_solve\u001b[0;34m(self, b, freevar)\u001b[0m\n\u001b[1;32m 2568\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2569\u001b[0m \u001b[0;31m# solve by reduced row echelon form\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2570\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpivots\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maug\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrref\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msimplify\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2571\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mA\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;36m1\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[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[0m\n\u001b[1;32m 2572\u001b[0m \u001b[0mpivots\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mp\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mcol\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpivots\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/matrices/matrices.py\u001b[0m in \u001b[0;36mrref\u001b[0;34m(self, iszerofunc, simplify, pivots, normalize_last)\u001b[0m\n\u001b[1;32m 878\u001b[0m ret, pivot_cols = self._eval_rref(iszerofunc=iszerofunc,\n\u001b[1;32m 879\u001b[0m \u001b[0msimpfunc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msimpfunc\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 880\u001b[0;31m normalize_last=normalize_last)\n\u001b[0m\u001b[1;32m 881\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpivots\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 882\u001b[0m \u001b[0mret\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mret\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpivot_cols\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/matrices/matrices.py\u001b[0m in \u001b[0;36m_eval_rref\u001b[0;34m(self, iszerofunc, simpfunc, normalize_last)\u001b[0m\n\u001b[1;32m 533\u001b[0m reduced, pivot_cols, swaps = self._row_reduce(iszerofunc, simpfunc,\n\u001b[1;32m 534\u001b[0m \u001b[0mnormalize_last\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnormalize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 535\u001b[0;31m zero_above=True)\n\u001b[0m\u001b[1;32m 536\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mreduced\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpivot_cols\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 537\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/matrices/matrices.py\u001b[0m in \u001b[0;36m_row_reduce\u001b[0;34m(self, iszerofunc, simpfunc, normalize_last, normalize, zero_above)\u001b[0m\n\u001b[1;32m 649\u001b[0m \u001b[0mpivot_offset\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpivot_val\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 650\u001b[0m assumed_nonzero, newly_determined = _find_reasonable_pivot(\n\u001b[0;32m--> 651\u001b[0;31m get_col(piv_col)[piv_row:], iszerofunc, simpfunc)\n\u001b[0m\u001b[1;32m 652\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 653\u001b[0m \u001b[0;31m# _find_reasonable_pivot may have simplified some things\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/matrices/matrices.py\u001b[0m in \u001b[0;36m_find_reasonable_pivot\u001b[0;34m(col, iszerofunc, simpfunc)\u001b[0m\n\u001b[1;32m 4083\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpossible_zeros\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\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[0m\n\u001b[1;32m 4084\u001b[0m \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4085\u001b[0;31m \u001b[0msimped\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msimpfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4086\u001b[0m \u001b[0mis_zero\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0miszerofunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msimped\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4087\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_zero\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;32mTrue\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mis_zero\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/simplify.py\u001b[0m in \u001b[0;36msimplify\u001b[0;34m(expr, ratio, measure, fu)\u001b[0m\n\u001b[1;32m 543\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 544\u001b[0m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbottom_up\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnormal\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--> 545\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMul\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mpowsimp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_content_primitive\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 546\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[0m\n\u001b[1;32m 547\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mpowsimp\u001b[0;34m(expr, deep, combine, force, measure)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdeep\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Mul\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0m_y\u001b[0m \u001b[0;32mnot\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[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrecurse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\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[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;32mif\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdeep\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Mul\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0m_y\u001b[0m \u001b[0;32mnot\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[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrecurse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\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[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;32mif\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mrecurse\u001b[0;34m(arg, **kwargs)\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0m_force\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'force'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mforce\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0m_measure\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'measure'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeasure\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mpowsimp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_deep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_combine\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_force\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_measure\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[0mexpr\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mpowsimp\u001b[0;34m(expr, deep, combine, force, measure)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdeep\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Mul\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0m_y\u001b[0m \u001b[0;32mnot\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[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrecurse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\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[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;32mif\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdeep\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Mul\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0m_y\u001b[0m \u001b[0;32mnot\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[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrecurse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\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[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;32mif\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mrecurse\u001b[0;34m(arg, **kwargs)\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0m_force\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'force'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mforce\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0m_measure\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'measure'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeasure\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mpowsimp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_deep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_combine\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_force\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_measure\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[0mexpr\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mpowsimp\u001b[0;34m(expr, deep, combine, force, measure)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdeep\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Mul\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0m_y\u001b[0m \u001b[0;32mnot\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[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrecurse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\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[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;32mif\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdeep\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Mul\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0m_y\u001b[0m \u001b[0;32mnot\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[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrecurse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\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[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;32mif\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mrecurse\u001b[0;34m(arg, **kwargs)\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0m_force\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'force'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mforce\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0m_measure\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'measure'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeasure\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mpowsimp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_deep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_combine\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_force\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_measure\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[0mexpr\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mpowsimp\u001b[0;34m(expr, deep, combine, force, measure)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdeep\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Mul\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0m_y\u001b[0m \u001b[0;32mnot\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[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrecurse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\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[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;32mif\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdeep\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Mul\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0m_y\u001b[0m \u001b[0;32mnot\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[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrecurse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\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[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;32mif\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mrecurse\u001b[0;34m(arg, **kwargs)\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0m_force\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'force'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mforce\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0m_measure\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'measure'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeasure\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mpowsimp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_deep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_combine\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_force\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_measure\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[0mexpr\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mpowsimp\u001b[0;34m(expr, deep, combine, force, measure)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdeep\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Mul\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0m_y\u001b[0m \u001b[0;32mnot\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[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrecurse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\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[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;32mif\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdeep\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Mul\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0m_y\u001b[0m \u001b[0;32mnot\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[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mexpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrecurse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\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[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;32mif\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mrecurse\u001b[0;34m(arg, **kwargs)\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0m_force\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'force'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mforce\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0m_measure\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'measure'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeasure\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mpowsimp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_deep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_combine\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_force\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_measure\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[0mexpr\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mpowsimp\u001b[0;34m(expr, deep, combine, force, measure)\u001b[0m\n\u001b[1;32m 370\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 371\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrecurse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mnc_part\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcombine\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'base'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 372\u001b[0;31m \u001b[0mrecurse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnewexpr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcombine\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'base'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 373\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 374\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mcombine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'base'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mrecurse\u001b[0;34m(arg, **kwargs)\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0m_force\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'force'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mforce\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0m_measure\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'measure'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeasure\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mpowsimp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_deep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_combine\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_force\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_measure\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[0mexpr\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/simplify/powsimp.py\u001b[0m in \u001b[0;36mpowsimp\u001b[0;34m(expr, deep, combine, force, measure)\u001b[0m\n\u001b[1;32m 478\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 479\u001b[0m \u001b[0;31m# we're done\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 480\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc_part\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mnc_part\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 481\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 482\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/cache.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 91\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[0m\n\u001b[1;32m 92\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 93\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[0m\n\u001b[0m\u001b[1;32m 94\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 95\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/operations.py\u001b[0m in \u001b[0;36m__new__\u001b[0;34m(cls, *args, **options)\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0;32mreturn\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[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m \u001b[0mc_part\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnc_part\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder_symbols\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mflatten\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 42\u001b[0m \u001b[0mis_commutative\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mnc_part\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_from_args\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc_part\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mnc_part\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_commutative\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/mul.py\u001b[0m in \u001b[0;36mflatten\u001b[0;34m(cls, seq)\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 181\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOne\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 182\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_zero\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Rational\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 183\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mb\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[0m\n\u001b[1;32m 184\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Add\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/assumptions.py\u001b[0m in \u001b[0;36mgetit\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 245\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_assumptions\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdefault_assumptions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 246\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_assumptions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdefault_assumptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 247\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_ask\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfact\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 248\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 249\u001b[0m \u001b[0mgetit\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mas_property\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfact\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/assumptions.py\u001b[0m in \u001b[0;36m_ask\u001b[0;34m(fact, obj)\u001b[0m\n\u001b[1;32m 300\u001b[0m \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 301\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mhandler_map\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 302\u001b[0;31m \u001b[0m_ask\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 303\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 304\u001b[0m \u001b[0;31m# we might have found the value of fact\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/assumptions.py\u001b[0m in \u001b[0;36m_ask\u001b[0;34m(fact, obj)\u001b[0m\n\u001b[1;32m 288\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 289\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 290\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 291\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0ma\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[0m\n\u001b[1;32m 292\u001b[0m \u001b[0massumptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdeduce_all_facts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfact\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\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/usr/local/lib/python3.6/dist-packages/sympy/core/mul.py\u001b[0m in \u001b[0;36m_eval_is_odd\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1298\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mr\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1299\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1300\u001b[0;31m \u001b[0;32melif\u001b[0m \u001b[0macc\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0macc\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_odd\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1301\u001b[0m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1302\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_odd\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/assumptions.py\u001b[0m in \u001b[0;36mgetit\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 245\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_assumptions\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdefault_assumptions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 246\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_assumptions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdefault_assumptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 247\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_ask\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfact\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 248\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 249\u001b[0m \u001b[0mgetit\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mas_property\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfact\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/assumptions.py\u001b[0m in \u001b[0;36m_ask\u001b[0;34m(fact, obj)\u001b[0m\n\u001b[1;32m 300\u001b[0m \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 301\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mhandler_map\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 302\u001b[0;31m \u001b[0m_ask\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 303\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 304\u001b[0m \u001b[0;31m# we might have found the value of fact\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/assumptions.py\u001b[0m in \u001b[0;36m_ask\u001b[0;34m(fact, obj)\u001b[0m\n\u001b[1;32m 300\u001b[0m \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 301\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mhandler_map\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 302\u001b[0;31m \u001b[0m_ask\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 303\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 304\u001b[0m \u001b[0;31m# we might have found the value of fact\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/assumptions.py\u001b[0m in \u001b[0;36m_ask\u001b[0;34m(fact, obj)\u001b[0m\n\u001b[1;32m 300\u001b[0m \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 301\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mhandler_map\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 302\u001b[0;31m \u001b[0m_ask\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 303\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 304\u001b[0m \u001b[0;31m# we might have found the value of fact\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/assumptions.py\u001b[0m in \u001b[0;36m_ask\u001b[0;34m(fact, obj)\u001b[0m\n\u001b[1;32m 300\u001b[0m \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 301\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mhandler_map\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 302\u001b[0;31m \u001b[0m_ask\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 303\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 304\u001b[0m \u001b[0;31m# we might have found the value of fact\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/assumptions.py\u001b[0m in \u001b[0;36m_ask\u001b[0;34m(fact, obj)\u001b[0m\n\u001b[1;32m 288\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 289\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 290\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 291\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0ma\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[0m\n\u001b[1;32m 292\u001b[0m \u001b[0massumptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdeduce_all_facts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfact\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\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/usr/local/lib/python3.6/dist-packages/sympy/core/add.py\u001b[0m in \u001b[0;36m_eval_is_negative\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 662\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_coeff_Add\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 663\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_zero\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 664\u001b[0;31m \u001b[0mv\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_monotonic_sign\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 665\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mv\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[0m\n\u001b[1;32m 666\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mv\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/exprtools.py\u001b[0m in \u001b[0;36m_monotonic_sign\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[0mroots\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mr\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mroots\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_real\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 121\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_nonnegative\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mx0\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mroots\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 122\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_nonnegative\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_positive\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/exprtools.py\u001b[0m in \u001b[0;36m<genexpr>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[0mroots\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mr\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mroots\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_real\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 121\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_nonnegative\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mx0\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mroots\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 122\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_nonnegative\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_positive\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/expr.py\u001b[0m in \u001b[0;36m__le__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 278\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mme\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mNaN\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 279\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Invalid NaN comparison\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 280\u001b[0;31m \u001b[0mn2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_n2\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[0m\n\u001b[0m\u001b[1;32m 281\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mn2\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[0m\n\u001b[1;32m 282\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0m_sympify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn2\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;32m/usr/local/lib/python3.6/dist-packages/sympy/core/expr.py\u001b[0m in \u001b[0;36m_n2\u001b[0;34m(a, b)\u001b[0m\n\u001b[1;32m 3368\u001b[0m \u001b[0;31m# /!\\ if is very important (see issue 8245) not to\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3369\u001b[0m \u001b[0;31m# use a re-evaluated number in the calculation of dif\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3370\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_comparable\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_comparable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3371\u001b[0m \u001b[0mdif\u001b[0m \u001b[0;34m=\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[0mevalf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3372\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdif\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_comparable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/basic.py\u001b[0m in \u001b[0;36mis_comparable\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 605\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 606\u001b[0m n, i = [p.evalf(2) if not p.is_Number else p\n\u001b[0;32m--> 607\u001b[0;31m for p in self.as_real_imag()]\n\u001b[0m\u001b[1;32m 608\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Number\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Number\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 609\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/basic.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 605\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 606\u001b[0m n, i = [p.evalf(2) if not p.is_Number else p\n\u001b[0;32m--> 607\u001b[0;31m for p in self.as_real_imag()]\n\u001b[0m\u001b[1;32m 608\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Number\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Number\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 609\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-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 1392\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'quad'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mquad\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1393\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1394\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mevalf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprec\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1395\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mNotImplementedError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1396\u001b[0m \u001b[0;31m# Fall back to the ordinary evalf\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/core/evalf.py\u001b[0m in \u001b[0;36mevalf\u001b[0;34m(x, prec, options)\u001b[0m\n\u001b[1;32m 1290\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'subs'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1291\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevalf_subs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'subs'\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-> 1292\u001b[0;31m \u001b[0mxe\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_eval_evalf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1293\u001b[0m \u001b[0mre\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mim\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mxe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_real_imag\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1294\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mre\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mre_\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mim\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mim_\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/rootoftools.py\u001b[0m in \u001b[0;36m_eval_evalf\u001b[0;34m(self, prec)\u001b[0m\n\u001b[1;32m 601\u001b[0m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlambdify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 602\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 603\u001b[0;31m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlambdify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 604\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 605\u001b[0m \u001b[0minterval\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_interval\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/utilities/lambdify.py\u001b[0m in \u001b[0;36mlambdify\u001b[0;34m(args, expr, modules, printer, use_imps, dummify)\u001b[0m\n\u001b[1;32m 352\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 353\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 354\u001b[0;31m \u001b[0m_import\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"numpy\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 355\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mImportError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 356\u001b[0m \u001b[0;31m# Use either numpy (if available) or python.math where possible.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/utilities/lambdify.py\u001b[0m in \u001b[0;36m_import\u001b[0;34m(module, reload)\u001b[0m\n\u001b[1;32m 148\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 149\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmodule\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[0m\n\u001b[0;32m--> 150\u001b[0;31m \u001b[0mnamespace\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodule\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__dict__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 151\u001b[0m \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 152\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;31mKeyboardInterrupt\u001b[0m: " | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "h7TkI7gMmwac", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"# Chapter 5 Gosper's Algorithm" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "if8WWQXfnH90", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Chatper 5 Prerequisite Code" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "com7dhxAnMzw", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"from sympy.concrete.gosper import *" | |
], | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "5tKK6g20oURk", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 5.2.1\n", | |
"\n", | |
"Find closed form solution for\n", | |
"\n", | |
"$$S(n) = \\sum_{k=0}^n{(4k+1)\\frac{k!}{(2k+1)!}}$$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "Zq52bEJBpMiH", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 136 | |
}, | |
"outputId": "50285c02-ce3d-448d-af41-f81d30e79ec8" | |
}, | |
"source": [ | |
"t_k = (4*k+1)*factorial(k)/factorial(2*k+1)\n", | |
"\n", | |
"# a(k), b(k), and c(k) can be found using gosper_normal\n", | |
"# This is different than what is given on pg 78,\n", | |
"# but only differs by a constant factor of 4.\n", | |
"r = hypersimp(t_n, n).as_numer_denom()\n", | |
"(a, b, c) = gosper_normal(r[0], r[1], k, polys=False)\n", | |
"print(\"Z*a(k) =\", a)\n", | |
"print(\"b(k) =\", b)\n", | |
"print(\"c(k) =\", c)\n", | |
"\n", | |
"display(gosper_sum(t_k, (k, 0, n)))\n", | |
"\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Z*a(k) = (4*n + 5)/(16*n**2 + 28*n + 6)\n", | |
"b(k) = 1\n", | |
"c(k) = 1\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAHkAAAAkCAYAAACt6pVgAAAABHNCSVQICAgIfAhkiAAAA0dJREFU\neJzt2z+IHVUUx/GPGsWYFdEgiEgstBGi2W1EJBs2YmEjFgpKtFC0CEQQ1CYWYpEmKNE1RG3EKaxU\nLBRBRTshYJAIplCIIWgSDdGI/1BE0eLOg2Gct/vu3fmzm3e/MMyb8865c8/9N3fe/pZM5hzicpzG\ndUNXJJE38cTQlWjiCJ7p+B67cQi/4AzexeYGv2fxWkJcH2zDOziJf/Fgg8+NOIvLavZl2/j8FVev\nGwqTD44FvIRbcRv+xke4ouJzCR7Bq5FxK6UwWR4zQmc9hj/G+HyBY3igjYpNwjXCiLsL7+N3fI3t\nNb/UmVwkxhEa7B/cWbHdI8yC8yLjJs1zHIX4PH7TPJPhaXxSs3U2k7eU58fxXHl9BPsSy2uTS4W8\nfqrY5vGZ0GExcastz09xM9bHBKV28qzwLLtXWOKO4i1cmVhemyzicxys2K7FqYS41ZbnKVyIq2OC\nqp28RxjpSx0Lpe8WvIfvK/HXC42QwlPCMjU67m+wzU9Qzj5sxd3C0jtiPf5MiIvNs608xjF6XkfN\n5HWVzy/g9WX8vynPs9hf+25OmAkpvII3Ktd7hZ3mixXbyWXKeB73Cc/LY7XvfhBeoWLjYvNsI4+l\nGG0Kz6ygjInYIIz2rTX7t8ZvGGIpxG1YFoXZdsOY758UnqUxcW3kWWh34/UwTkSWl/RMvqk8V0fz\nRmEnWh/hH+PRhHvEcAAPYYewabqqPGYqPh8IHbkxIi4mz5UyI6was0KfbCo/b6r5zQu5VOmkjXfi\ny5rtdvyFi2r247p/hRq3f6jHH8SuiLiYPMdRNNSjiYUxdSkqPhfjZ9xSiz0+4T2mgjvwFS4YuiKJ\n7MKHKYFrNeEUjgpL4XfCjFhrzOFl/Dh0RTKZTCbTCaMf7Jf6TTeTyWSWJqs1poCpVWv0yZDKkCHU\nGoXJG39VqjXWGkOoNQppM6x1tUafDDmTp1qt0SdDdvJUqzX6ZMhO7kOt0bVSg0S1Rp+sW96lM/pQ\na3St1KBHtUYqQ3byYc2bmUVhKd7u/3/P3SC8Ux+u2efwdkNZZ8tjxK/ldaoWrYnNwkA5XbOtGoZc\nrrNaY0roW61RiPvPjKzWaIGpVWv0ydCNm9UamUwmk8lkpob/ABrQP1VLlTWyAAAAAElFTkSuQmCC\n", | |
"text/latex": "$$\\frac{- n! + 2 \\left(2 n + 1\\right)!}{\\left(2 n + 1\\right)!}$$", | |
"text/plain": [ | |
"-n! + 2⋅(2⋅n + 1)!\n", | |
"──────────────────\n", | |
" (2⋅n + 1)! " | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "jU4ghJA9uTWH", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 5.5.1\n", | |
"\n", | |
"Does the sum of factorials\n", | |
"\n", | |
"$$S_n = \\sum_{k=0}^n k!$$\n", | |
"\n", | |
"have a closed form (hypergeometric terms plus a constant)?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "7KBHkcvLusoY", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 34 | |
}, | |
"outputId": "84156c3d-d0d5-493b-dcb2-96b3303c3305" | |
}, | |
"source": [ | |
"print(gosper_sum(factorial(k), (k, 0, n)))" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"None\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "kU76pYb4u0qi", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 5.5.2\n", | |
"\n", | |
"Does the sum of factorials\n", | |
"\n", | |
"$$S_n = \\sum_{k=1}^n kk!$$\n", | |
"\n", | |
"have a closed form?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "t3GkfgLQu_xD", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 62 | |
}, | |
"outputId": "0ebcb22b-3c09-4d04-fe7e-1768dd2a5a1c" | |
}, | |
"source": [ | |
"display(gosper_sum(k*factorial(k), (k, 1, n)))\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAHwAAAASCAYAAACZ4LqUAAAABHNCSVQICAgIfAhkiAAAAfNJREFU\naIHt2LGL1EAYxuFHEbS4E0tLueI45MC9tZArhAWx1sLetbQULO1tD/wHTpDDxsbWQg/BRk/ERlAO\nI4ig2ChXyBVqMQkbQjZsstndXMgPhllm3p3Mm28m8yV0dMyBKC5HmUhzPNzAA7zEb/zDozzhiTlO\nqmN23MMFHOAr1sYJj89rRjNmKKzqwWKnsTDuYBWncbtImA34VeHG3cc6dvBdWDmvcGlKfRNpg4fn\n+CT4KCQb8I24XsVrLOEhdrGJp1ieQt9E2uChMo+FVfID/Uzfk7jv8hT6hEi9Cc9Q9Ud6UzzUxUBB\n0jZuh9/C20zfh7g+NYW+ibTBQyWW8FdYtcdy+neElbNSUZ8mUn13RPG4k5btgrGOiofc3TqGQdF/\n0q9lPcH0M/mHfx+/8Lmivi62cCbT1sM14eyNMn3vCsZalId9/Cmh/1bXhdMBT86vvRzdspDU7Brd\nmLL6utjKaRsKAd/GixJjLcrDlZrHm5h0wJOz7E2ObkPYCXuZtjL6NOcmn+JMaYOHUqSTtj4O8T5H\ndzGu00lNWX2aNQVfg+ZIGzyUItnhJ3FeMH6Yo0vM71XUZ0my37xEaV60wUPC9bjA2bjeNEpYf+Iu\no4Cvx7/zHm0E8wf4WFHfRNrgIaGHm5m2FaO3iy/igHd0dHR0tIb/h3a2LIdNn+0AAAAASUVORK5C\nYII=\n", | |
"text/latex": "$$n n! + n! - 1$$", | |
"text/plain": [ | |
"n⋅n! + n! - 1" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "NP1geh5iwWYT", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"# Chapter 6 Zeilberger's Algorithm" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "E4PRsIEmwv4H", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Chapter 6 Prerequisite Code" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "J81k-erEwyI6", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"from sympy.concrete.gosper import *\n", | |
"\n", | |
"def rationalize(F, k):\n", | |
" t = hypersimp(F, k)\n", | |
" r = t.as_numer_denom()\n", | |
" return (r[0], r[1])\n", | |
"\n", | |
"def find_b_deg(p_2, p_3, p):\n", | |
" \"\"\"\n", | |
" Given polynomials p_2, p_3, p in k, finds a bound on the degree of a\n", | |
" polynomial b in k such that p_2(k)b(k+1)-p_3(k)b(k) = p(k).\n", | |
" \"\"\"\n", | |
" d_2 = p_2.degree()\n", | |
" d_3 = p_3.degree()\n", | |
" d = p.degree()\n", | |
"\n", | |
" if d_2 == 0 and d_3 == 0:\n", | |
" return d + 1\n", | |
" if d_2 != d_3 or p_2.LC() != p_3.LC():\n", | |
" return d - max(d_2, d_3)\n", | |
"\n", | |
" A = p_2.nth(d_2 - 1)\n", | |
" B = p_3.nth(d_3 - 1)\n", | |
"\n", | |
" if (B - A) % p_2.LC() == 0 and (B - A).free_symbols == set():\n", | |
" return max((B - A) // p_2.LC(), d - d_2 + 1)\n", | |
" return d - d_2 + 1\n", | |
"\n", | |
"def zeil_sum2(F, x0_y0, J=1):\n", | |
" x0,y0 = x0_y0\n", | |
" r1, r2 = rationalize(F, k) # F(n, k+1) / F(n-1, k)\n", | |
" s1, s2 = rationalize(F.subs({n:(n-1)}), n) # F(n,k) / F(n-1, k)\n", | |
"\n", | |
" a_syms = symbols('a0:%d'% (J+1))\n", | |
" p0_terms = list(a_syms)\n", | |
" r = r1\n", | |
" s = r2\n", | |
" for i in range(1, J+1):\n", | |
" s2_term = s2.subs({n:(n+i)})\n", | |
" s1_term = s1.subs({n:(n+i)})\n", | |
" r = r*s2_term\n", | |
" for j in range(i):\n", | |
" p0_terms[j] = p0_terms[j]*s2_term\n", | |
" for j in range(i, J+1):\n", | |
" p0_terms[j] = p0_terms[j]*s1_term\n", | |
" \n", | |
" s2_term = s2.subs({k:(k+1)})\n", | |
" for i in range(1, J+1): \n", | |
" s = s*s2_term.subs({n:(n+i)})\n", | |
" \n", | |
" p0 = Poly(sum(p0_terms), k)\n", | |
" (p2, p3, p1) = gosper_normal(r, s, k)\n", | |
" \n", | |
" p = p0*p1\n", | |
" p3 = p3.shift(-1)\n", | |
" \n", | |
" delta = find_b_deg(p2, p3, p)\n", | |
" # delta = 2\n", | |
" if delta < 0:\n", | |
" return {\"recurr\": 0, \"closedform\": None}\n", | |
" \n", | |
" b_syms = symbols('b0:%d'% (delta+1))\n", | |
" B = Poly(tuple(reversed(b_syms)), k)\n", | |
" \n", | |
" eq = p2*B.shift(1) - p3*B - p\n", | |
" soln = list(linsolve(eq.all_coeffs(), a_syms + b_syms))[0]\n", | |
" y = Function('y')\n", | |
" recur = sum(a*y(n + i) for a,i in zip(soln, range(J+1)))\n", | |
"\n", | |
" if recur == 0:\n", | |
" return {\"recurr\": recur, \"closedform\": None}\n", | |
"\n", | |
" return {\"recurr\": recur, \"closedform\": rsolve(recur, y(n), {y(x0): y0})}\n" | |
], | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "He7teBFlcNtQ", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 6.4.1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "iZRueuSEcQaN", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 128 | |
}, | |
"outputId": "78ca594b-5835-4531-b811-3acd3de8e8db" | |
}, | |
"source": [ | |
"t_k = binomial(n,k)**2\n", | |
"soln = zeil_sum2(t_k, (0,1), 1)\n", | |
"print(soln[\"recurr\"])\n", | |
"display(soln[\"closedform\"])\n", | |
"\n", | |
"# Confirm that the closed form solution equals Choose(2n, n)\n", | |
"print(simplify(\n", | |
" (soln[\"closedform\"] - binomial(2*n, n))\n", | |
" .rewrite(gamma))\n", | |
" == 0)\n", | |
"\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"b1*(n + 1)*y(n + 1)/2 - b1*(2*n + 1)*y(n)\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\n", | |
"text/latex": "$$\\frac{4^{n} \\left(n - \\frac{1}{2}\\right)!}{\\sqrt{\\pi} n!}$$", | |
"text/plain": [ | |
" n \n", | |
"4 ⋅(n - 1/2)!\n", | |
"─────────────\n", | |
" √π⋅n! " | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"True\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "ihTw2MgOfxuE", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 6.4.2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "TEa1livRf0nw", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 71 | |
}, | |
"outputId": "1acef560-572c-43d7-b053-89028207a109" | |
}, | |
"source": [ | |
"x = symbols('x')\n", | |
"b0, b1 = symbols('b0, b1')\n", | |
"t_k = (-1)**k * binomial(n, k) / binomial(x + k, k)\n", | |
"soln = zeil_sum2(t_k, (0,1), 1)\n", | |
"print(soln)\n", | |
"# rsolve was unable to solve the recursion with the arbitrary\n", | |
"# coefficients b0 and b1.\n", | |
"# Simplifying these to b0 = 0 and b1 = 1 helps to solve in closed form.\n", | |
"print(rsolve(soln[\"recurr\"].subs({b0:0, b1:1}), y(n), {0:1}))" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"{'recurr': -b1*(n + x)*y(n) + (b0*(n + x + 1) + b1*(n + (n + 1)*(n + x) + 1))*y(n + 1)/(n + 1), 'closedform': None}\n", | |
"x/(n + x)\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "8ZJFmbbNgb02", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 6.4.3" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "-a23QUaCgc_3", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 34 | |
}, | |
"outputId": "05d0e723-ad4f-4bbb-f41f-2487cfeddbb4" | |
}, | |
"source": [ | |
"t_k = (-1)**k * binomial(n+1, k) * binomial(2*n - 2*k + 1, n)\n", | |
"print(zeil_sum2(t_k, (0,1), 1))" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"{'recurr': -b1*(n + 2)*y(n)/8 + b1*(n + 2)*y(n + 1)/8, 'closedform': 1}\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "llLAJABtgqdy", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 6.4.4" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "SBLxHBn8gtkj", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 51 | |
}, | |
"outputId": "08209f32-c294-4a82-9b53-fda990197b45" | |
}, | |
"source": [ | |
"t_k = (-1)**k * binomial(2*n, k)**3 \n", | |
"soln = zeil_sum2(t_k, (0, 1), 1)\n", | |
"print(soln)\n", | |
"\n", | |
"# Here we show that the recurrence we find simplifies\n", | |
"# to the one given in the book.\n", | |
"b4 = symbols('b4')\n", | |
"F = soln[\"recurr\"]\n", | |
"# Since F = 0, we can multiple through by\n", | |
"# 3 * (3n+2) / 2. We also let b4 = 1.\n", | |
"# Unfortunately, still can't seem to get\n", | |
"# it in closed form.\n", | |
"print(simplify((3*(3*n+2)/2)*F.subs({b4:1})))\n" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"{'recurr': -2*b4*(3*n + 1)*y(n) - 2*b4*(n**2 + 2*n + 1)*y(n + 1)/(9*n + 6), 'closedform': None}\n", | |
"-3*(3*n + 1)*(3*n + 2)*y(n) - (n**2 + 2*n + 1)*y(n + 1)\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "JHE66Ld1f-n3", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 51 | |
}, | |
"outputId": "ea248faf-753b-445d-bdef-092094c9ef5d" | |
}, | |
"source": [ | |
"f = Function('f')\n", | |
"F = (n+1)**2*f(n+1) + 3*(3*n+2)*(3*n+1)*f(n)\n", | |
"print(1**2*(-6) + 3*(2)*(1)*1)\n", | |
"print(rsolve(F, f(n), [1, -6]))" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"0\n", | |
"None\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "IdckYxO9j9HS", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 6.5" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "Ws9z7L1Cj_ZJ", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 71 | |
}, | |
"outputId": "588aa421-5cd8-4e92-c084-a9ca265b4095" | |
}, | |
"source": [ | |
"t_k = binomial(n, 2*k) * binomial(2*k, k) * 4**(-k)\n", | |
"soln = zeil_sum2(t_k, (0,1), 1)\n", | |
"print(soln)\n", | |
"# Confirm that the closed form solution equals\n", | |
"# what is given in the book.\n", | |
"print(simplify(\n", | |
" (soln[\"closedform\"] - 2**(-(n-1))*binomial(2*n-1, n-1))\n", | |
" .rewrite(gamma))\n", | |
" == 0)" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"{'recurr': b0*(n + 1)*y(n + 1)/4 - b0*(2*n + 1)*y(n)/4, 'closedform': 2**n*factorial(n - 1/2)/(sqrt(pi)*factorial(n))}\n", | |
"True\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "g8ikD-mFk6dz", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 6.5.1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "GpDz95Rwk7ma", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 34 | |
}, | |
"outputId": "82fcfe69-f0aa-4a65-f045-de1da7b06c7b" | |
}, | |
"source": [ | |
"t_k = binomial(n,k) * binomial(2*k, k) / (-2)**k\n", | |
"print(zeil_sum2(t_k, (0, 1), 2))" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"{'recurr': b0*y(n) - b0*(n + 2)*y(n + 2)/(n + 1), 'closedform': None}\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "Vd5hXeKDlHUI", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 6.5.2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "EkpzOTiIlIlX", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 51 | |
}, | |
"outputId": "36146c26-65fb-4a5d-aeae-965e298b2744" | |
}, | |
"source": [ | |
"t_k = binomial(n+k, 2*k) * binomial(2*k, k) * (-1)**k / (k+1)\n", | |
"soln = zeil_sum2(t_k, (1, 0), 1)\n", | |
"print(soln)\n", | |
"\n", | |
"# Here we show that the recurrence we find simplifies\n", | |
"# to the one given in the book.\n", | |
"b0, b1 = symbols('b0, b1')\n", | |
"print(simplify(2*soln[\"recurr\"].subs({b0:0, b1:-1})))\n" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"{'recurr': n*(b0 - b1*n - b1)*y(n)/2 + (b0*n/2 + b0 + b1*n**2/2 + 3*b1*n/2 + b1)*y(n + 1), 'closedform': None}\n", | |
"n*(n + 1)*y(n) - (n**2 + 3*n + 2)*y(n + 1)\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "3ygI0xXamFHq", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"# Chapter 7 The WZ Phenomenom" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "wiIQUlm-mRYi", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Chapter 7 Prerequisite Code" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "xNZaE0tamPBP", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"def WZ_verify(t, rhs, R):\n", | |
" F = t;\n", | |
" constant = 0\n", | |
" if simplify(rhs) != 0:\n", | |
" F = F/rhs\n", | |
" constant = 1\n", | |
" G = R*F\n", | |
" recurr = combsimp(F.subs({n:(n+1)}) - F - G.subs({k:(k+1)}) + G)\n", | |
" initial = combsimp(Sum(F.subs({n:0}), (k, 0, oo)).doit())\n", | |
" if (recurr == 0 and initial == constant):\n", | |
" return True\n", | |
" else:\n", | |
" return {'recurr':recurr, 'f_0':initial }\n", | |
"\n", | |
"def WZ_find(t, rhs):\n", | |
" F = t;\n", | |
" if (simplify(rhs) != 0):\n", | |
" F = F / rhs\n", | |
" f_k = combsimp(F.subs({n:(n+1)}) - F)\n", | |
" g = gosper_term(f_k, k)\n", | |
" if g == None:\n", | |
" return None\n", | |
" return simplify(g * f_k / F)\n", | |
"\n", | |
"# Test Code\n", | |
"t = binomial(n,k)\n", | |
"rhs = 2**n\n", | |
"assert WZ_verify(t, rhs, WZ_find(t, rhs))\n", | |
"\n", | |
"t = binomial(n,k)**2\n", | |
"rhs = binomial(2*n, n)\n", | |
"assert WZ_verify(t, rhs, WZ_find(t, rhs))\n", | |
"\n", | |
"x = symbols('x')\n", | |
"t = (-1)**k*binomial(n,k)*x/(k+x)\n", | |
"rhs = 1/binomial(x+n, n)\n", | |
"assert WZ_verify(t, rhs, WZ_find(t, rhs))\n", | |
"\n", | |
"\n" | |
], | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "xlGRQkpR1KyM", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 7.2 (I) Proof of Gauss’s $_2F_1$ identity" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "q0DLo-z_rY9y", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 85 | |
}, | |
"outputId": "c1ef4530-39e1-4d08-9c67-e6c4e1966f96" | |
}, | |
"source": [ | |
"a, b, c = symbols('a,b,c')\n", | |
"numer = factorial(n+k)*factorial(b+k)*factorial(c-n-1)*factorial(c-b-1)\n", | |
"denom = factorial(c+k)*factorial(n-1)*factorial(c-n-b-1)*factorial(k+1)*factorial(b-1)\n", | |
"t = numer / denom\n", | |
"rhs = 1\n", | |
"display(WZ_find(t, rhs))\n", | |
"\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAF4AAAAkCAYAAAAAa43JAAAABHNCSVQICAgIfAhkiAAABB1JREFU\naIHt2UmIHUUcx/FP3DCLiOZg0JAIKirGOAMiQoyOICJeXBDEDXLwEMhB0FsuehAXFBU9GBFxRIWg\n4iGiGD14ckkwiZKAChMRITHBGJfEBSPGQ3VPOmVXLzP9Xp7YX2jeq/+rrvpVdVV1vfrRMzKchr04\nZ8j1PoL3E7+9jvtK4imtVWUNi5TmJI/hxcFoqeTdrO4yLsZ+nBrFU1qryuqCK7EBu3AYq0rypDSX\nMg8/4ooOxE3igRb59+D2it8/xZpCukprXVkpJjXTfD0ewi34TXnH82/N0xxXUuBhfBjFzxJG1h78\ngR24toHApizCGfgsS8/HemzF2VlsA25roLVJWbPlHazFG/i7Il+seZq441dii9CgnMXYJKynN2OZ\nMI1/mZHkcsbwO77C+diMv7AC32R5NuMyzK3Q2rSsYRFrnibu+KXYHcWew+e4CR9hCi/hkw4FjmE7\nbszqeB53Ch2Ysxsn4swKrU3LGhax5iQbhY7OWSqMqEsbVLIWBwvXIfwZxVYm7l0vvIh+xlWJPOdl\nWpYltLYpqwvNOQel1/hY8zQnROl9wpKSMyZM0y01lcM6vFZIPyq89Z8uxHYl7h3Dm8IL8fREnjz+\nfUJrm7K60NyEWPM0ccdvc/TTO5TlOUX9mr4/u3IOZOmpmvvmCSPjLnyAl4Xt2tYo3zKhE/YmtLYp\na7aamxJrniZe4zfiQizM0puELds6XIQLcDcu6UgYLBem4w68iifxlrCTKrIy05fS2qas2bJAmFlj\nQh8uyb4vqdFcyceO3nuuELZsB/CT8I9wUYNyJjXbE6/GF4X0HGH6bxFGMJwsrNmX12htUlYXmieE\nBxxfk4U8Kc1JrhO2Ysc3vWEIrMF7JfFR1JqT0oxywVPC9PlOeGKjwDiexQ9RfBS15qQ09/T09AyL\nOdlnfN7R09PDsXOn/qu0dqFSHCt3alSpc6KSLlR8ZFDFPOG44IUZSZw9k9o5WsOoZ4FwPHGP8mPn\n7fhaOJY+imLHLxae2g2CZ/krduLq7PeU4zMTBulo1bWjS5o4UaUuVLHj84Ove/F4lt6BJ7J4yvFp\ny6Adrbp2DJtSF6p4LDwmNP5WYSQSnuTD2feU49OWoqOVP8SujmGpb8ewKbpQO/NgPOLfdkQsnOtI\np8wVloWYB5Wf1BWviSzvUmHJul/9zIndoTtKYmXuUF07uqqnKfnaXznin4luGnfErU85Pk/hlZrK\nvy3UMWhHq64dXdXTlFIXKu/4+cLefFt007hgo1Hu+BAeyL6GIgbtaDVpRxf1tKHUhcqXmuXZZ3FU\nLBRehHmszPFpy6AdrSbt6JImTlSlC7UaX0axawTH/aRCLHZ8ZsIgHa2m7ZhtPTkTqp2o1i5UilF2\nfEaRpAvVtgNH2fEZRXoXqqenp+d/yD+B3XO03j1JqAAAAABJRU5ErkJggg==\n", | |
"text/latex": "$$\\frac{\\left(c + k\\right) \\left(k + 1\\right)}{n \\left(- c + n + 1\\right)}$$", | |
"text/plain": [ | |
"(c + k)⋅(k + 1)\n", | |
"───────────────\n", | |
" n⋅(-c + n + 1)" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "5QLwbWm92H6t", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 7.2 (II) Proof of Kummer's $_2F_1$ identity" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "Yl0haL8P2SHR", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 128 | |
}, | |
"outputId": "d5b0e1aa-b4fe-4236-88d7-df2a1ded1ec6" | |
}, | |
"source": [ | |
"c = symbols('c', integer=True)\n", | |
"numer = (-1)**(n+k)*factorial(2*n+c-1)*factorial(n)*factorial(n+c-1)\n", | |
"denom = factorial(2*n+c-1-k)*factorial(2*n-k)*factorial(c+k-1)*factorial(k)\n", | |
"t = numer / denom\n", | |
"rhs = 1\n", | |
"\n", | |
"display(WZ_find(t, rhs))\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"-(-1)**k*(-1)**n*(c**3*n + c**3 + c**2*k**2 - 4*c**2*k*n - 3*c**2*k + 9*c**2*n**2 + 12*c**2*n + 3*c**2 - 2*c*k**3 + 12*c*k**2*n + 7*c*k**2 - 24*c*k*n**2 - 28*c*k*n - 7*c*k + 24*c*n**3 + 39*c*n**2 + 17*c*n + 2*c + k**4 - 8*k**3*n - 4*k**3 + 24*k**2*n**2 + 24*k**2*n + 5*k**2 - 32*k*n**3 - 48*k*n**2 - 20*k*n - 2*k + 20*n**4 + 38*n**3 + 22*n**2 + 4*n)*factorial(n)*factorial(c + n - 1)*factorial(c + 2*n - 1)/(factorial(k)*factorial(c + k - 1)*factorial(-k + 2*n + 2)*factorial(c - k + 2*n + 1))\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\nYII=\n", | |
"text/latex": "$$\\frac{k \\left(c + k - 1\\right) \\left(c^{2} - 2 c k + 7 c n + 4 c + k^{2} - 6 k n - 3 k + 10 n^{2} + 10 n + 2\\right)}{2 \\left(c - k + 2 n\\right) \\left(k - 2 n - 2\\right) \\left(k - 2 n - 1\\right) \\left(c - k + 2 n + 1\\right)}$$", | |
"text/plain": [ | |
" ⎛ 2 2 2 ⎞\n", | |
"k⋅(c + k - 1)⋅⎝c - 2⋅c⋅k + 7⋅c⋅n + 4⋅c + k - 6⋅k⋅n - 3⋅k + 10⋅n + 10⋅n + 2⎠\n", | |
"──────────────────────────────────────────────────────────────────────────────\n", | |
" 2⋅(c - k + 2⋅n)⋅(k - 2⋅n - 2)⋅(k - 2⋅n - 1)⋅(c - k + 2⋅n + 1) " | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "diYeXM_8B8FW", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 7.2 (III) Proof of Saalschutz’s's $_3F_2$ identity" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "tHNLl9_mCJtC", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"" | |
], | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "0KNZPrJSB8fv", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## 7.2 (IV) Proof of Dixon's identity" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "IvgB9cj0CJNB", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 2952 | |
}, | |
"outputId": "0323f0bf-7a24-47f1-efd7-82968c513f81" | |
}, | |
"source": [ | |
"b, c = symbols('b, c', integer=True)\n", | |
"t = (-1)**k*binomial(n+b, n+k)*binomial(n+c, c+k)*binomial(b+c, b+k)\n", | |
"rhs = factorial(n+b+c)/(factorial(n)*factorial(b)*factorial(c))\n", | |
"\n", | |
"display(WZ_find(t, rhs))\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "error", | |
"ename": "KeyboardInterrupt", | |
"evalue": "ignored", | |
"traceback": [ | |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m<ipython-input-75-9958f73dfac1>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mrhs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfactorial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfactorial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mfactorial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mfactorial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\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[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mdisplay\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mWZ_find\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrhs\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 6\u001b[0m \u001b[0mdisplay_latex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m<ipython-input-74-f6be4e834279>\u001b[0m in \u001b[0;36mWZ_find\u001b[0;34m(t, rhs)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0mF\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mF\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mrhs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0mf_k\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcombsimp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mF\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\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[0mF\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 20\u001b[0;31m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgosper_term\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf_k\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 21\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/concrete/gosper.py\u001b[0m in \u001b[0;36mgosper_term\u001b[0;34m(f, n)\u001b[0m\n\u001b[1;32m 111\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mq\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_numer_denom\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 112\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 113\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mB\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mC\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgosper_normal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 114\u001b[0m \u001b[0mB\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mB\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshift\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[0m\n\u001b[1;32m 115\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/concrete/gosper.py\u001b[0m in \u001b[0;36mgosper_normal\u001b[0;34m(f, g, n, polys)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0mD\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPoly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mh\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mh\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mopt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdomain\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 56\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 57\u001b[0;31m \u001b[0mR\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresultant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mB\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mD\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 58\u001b[0m \u001b[0mroots\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mR\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mground_roots\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\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 59\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/polytools.py\u001b[0m in \u001b[0;36mresultant\u001b[0;34m(f, g, includePRS)\u001b[0m\n\u001b[1;32m 2572\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mR\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresultant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mincludePRS\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mincludePRS\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2573\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2574\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresultant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2575\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# pragma: no cover\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2576\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mOperationNotSupported\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'resultant'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/polyclasses.py\u001b[0m in \u001b[0;36mresultant\u001b[0;34m(f, g, includePRS)\u001b[0m\n\u001b[1;32m 649\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mR\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdmp_resultant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlev\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdom\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mincludePRS\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mincludePRS\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 650\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mres\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkill\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\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[0mper\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mR\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 651\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdmp_resultant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlev\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdom\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkill\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 652\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 653\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdiscriminant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/euclidtools.py\u001b[0m in \u001b[0;36mdmp_resultant\u001b[0;34m(f, g, u, K, includePRS)\u001b[0m\n\u001b[1;32m 804\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdmp_zz_collins_resultant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 805\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 806\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mdmp_prs_resultant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\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[0m\u001b[1;32m 807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 808\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/euclidtools.py\u001b[0m in \u001b[0;36mdmp_prs_resultant\u001b[0;34m(f, g, u, K)\u001b[0m\n\u001b[1;32m 590\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mdmp_zero\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mu\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 591\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 592\u001b[0;31m \u001b[0mR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mS\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdmp_inner_subresultants\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 593\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 594\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdmp_degree\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mR\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[0mu\u001b[0m\u001b[0;34m)\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;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/euclidtools.py\u001b[0m in \u001b[0;36mdmp_inner_subresultants\u001b[0;34m(f, g, u, K)\u001b[0m\n\u001b[1;32m 518\u001b[0m dmp_pow(c, d, v, K), v, K)\n\u001b[1;32m 519\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 520\u001b[0;31m \u001b[0mh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdmp_prem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 521\u001b[0m \u001b[0mh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m \u001b[0mdmp_quo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mch\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mh\u001b[0m \u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 522\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/densearith.py\u001b[0m in \u001b[0;36mdmp_prem\u001b[0;34m(f, g, u, K)\u001b[0m\n\u001b[1;32m 1238\u001b[0m \u001b[0mj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mN\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdr\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mdg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mN\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1239\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1240\u001b[0;31m \u001b[0mR\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdmp_mul_term\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlc_g\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1241\u001b[0m \u001b[0mG\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdmp_mul_term\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlc_r\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1242\u001b[0m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdmp_sub\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/densearith.py\u001b[0m in \u001b[0;36mdmp_mul_term\u001b[0;34m(f, c, i, u, K)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdmp_zero\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m \u001b[0mdmp_mul\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mcf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mdmp_zeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/densearith.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdmp_zero\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m \u001b[0mdmp_mul\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mcf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mdmp_zeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/densearith.py\u001b[0m in \u001b[0;36mdmp_mul\u001b[0;34m(f, g, u, K)\u001b[0m\n\u001b[1;32m 808\u001b[0m \"\"\"\n\u001b[1;32m 809\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 810\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mdup_mul\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 811\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 812\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/densearith.py\u001b[0m in \u001b[0;36mdup_mul\u001b[0;34m(f, g, K)\u001b[0m\n\u001b[1;32m 768\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 769\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mdg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\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;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 770\u001b[0;31m \u001b[0mcoeff\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 771\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 772\u001b[0m \u001b[0mh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcoeff\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/fields.py\u001b[0m in \u001b[0;36m__mul__\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 458\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mfield\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzero\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 459\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfield\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 460\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnew\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumer\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdenom\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdenom\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 461\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfield\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mring\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 462\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnew\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumer\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdenom\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/fields.py\u001b[0m in \u001b[0;36mnew\u001b[0;34m(f, numer, denom)\u001b[0m\n\u001b[1;32m 260\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\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[0m\n\u001b[1;32m 261\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mnew\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\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--> 262\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mraw_new\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mnumer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcancel\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 263\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 264\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mto_poly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/rings.py\u001b[0m in \u001b[0;36mcancel\u001b[0;34m(self, g)\u001b[0m\n\u001b[1;32m 2212\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2213\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mdomain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_Field\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhas_assoc_Ring\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2214\u001b[0;31m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mq\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcofactors\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2215\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2216\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_negative\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/rings.py\u001b[0m in \u001b[0;36mcofactors\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 2128\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2129\u001b[0m \u001b[0mJ\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdeflate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2130\u001b[0;31m \u001b[0mh\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcff\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcfg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_gcd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2131\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2132\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minflate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mJ\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcff\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minflate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mJ\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcfg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minflate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mJ\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/rings.py\u001b[0m in \u001b[0;36m_gcd\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 2161\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_gcd_QQ\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2162\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mring\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdomain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_ZZ\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2163\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_gcd_ZZ\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2164\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# TODO: don't use dense representation (port PRS algorithms)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2165\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mring\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdmp_inner_gcd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/rings.py\u001b[0m in \u001b[0;36m_gcd_ZZ\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 2166\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2167\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_gcd_ZZ\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2168\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mheugcd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2169\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2170\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_gcd_QQ\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/heuristicgcd.py\u001b[0m in \u001b[0;36mheugcd\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[0mh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprimitive\u001b[0m\u001b[0;34m(\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[0m\n\u001b[1;32m 86\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 87\u001b[0;31m \u001b[0mcff_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdiv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mh\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 88\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 89\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/rings.py\u001b[0m in \u001b[0;36mdiv\u001b[0;34m(self, fv)\u001b[0m\n\u001b[1;32m 1440\u001b[0m \u001b[0mdivoccurred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1441\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0ms\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mdivoccurred\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;32m-> 1442\u001b[0;31m \u001b[0mexpv\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleading_expv\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 1443\u001b[0m \u001b[0mterm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mterm_div\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mexpv\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mexpvs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfv\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mexpvs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\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 1444\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mterm\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[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/rings.py\u001b[0m in \u001b[0;36mleading_expv\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1673\u001b[0m \"\"\"\n\u001b[1;32m 1674\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1675\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mring\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleading_expv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1676\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1677\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/sympy/polys/rings.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(f)\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 240\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0morder\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mlex\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 241\u001b[0;31m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleading_expv\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 242\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 243\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleading_expv\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;31mKeyboardInterrupt\u001b[0m: " | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "ZtN3LFoEA6ht", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 102 | |
}, | |
"outputId": "e99b0f2d-f653-4251-bc2a-ba3a1eb5b2b1" | |
}, | |
"source": [ | |
"q = Function('q')\n", | |
"n, k = symbols('n, k', integer=True, nonnegative=True)\n", | |
"#k, n, p = symbols('k n p') #, integer=True, nonnegative=True)\n", | |
"#f = n*q(n)/(n - 1) - 2*(2*n - 1)*q(n - 1)/(n - 1)\n", | |
"f = n*q(n) - 2*(2*n - 1)*q(n - 1)\n", | |
"g = rsolve(f, q(n), {q(0):1})\n", | |
"print(combsimp(g))\n", | |
"print(cancel(g))\n", | |
"z = factorial(2*n) / factorial(n)**2\n", | |
"print(simplify(g - z))\n", | |
"#print(combsimp(g))\n", | |
"print(simplify(g.subs({n:10})))\n", | |
"\n", | |
"h = Sum(binomial(n, k)**2, (k, 0, n))\n", | |
"print(h.subs({n:10}).doit())\n", | |
"#print(g.subs({n:1}).doit())" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"4**n*factorial(n - 1/2)/(sqrt(pi)*factorial(n))\n", | |
"4**n*factorial(n - 1/2)/(sqrt(pi)*factorial(n))\n", | |
"0\n", | |
"184756\n", | |
"184756\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "MQczctk_8P5c", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"4**n*factorial(n - 1/2)/(sqrt(pi)*factorial(n))\n", | |
"\n", | |
"4^n*(n-1/2)! / (sqrt(pi)*n!)\n", | |
"\n", | |
"a8*n*q(n)/(n - 1) - 2*a8*(2*n - 1)*q(n - 1)/(n - 1)\n", | |
"\n", | |
"nf(n)−(2n−1){f(n−1)+f(n−1)}+(n−1){f(n−2)−2f(n−2)+f(n−2)} = 0\n", | |
"\n", | |
"nf(n)−2*(2n−1)f(n−1) = 0\n", | |
"\n", | |
"https://math.stackexchange.com/questions/396889/how-to-find-the-factorial-of-a-fraction?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa\n", | |
"\n", | |
"Γ(12+n)=(2n)!4nn!π‾‾√" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "fd0jPvshZwfy", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"# Chapter 8 Algorithm Hyper" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "I9tb3yViaMxc", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 8.1.1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "IPpm1ZRGZ2DU", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 189 | |
}, | |
"outputId": "42a3c11e-f01e-45f9-fddd-5f91966afe80" | |
}, | |
"source": [ | |
"# Note: to run this, you'll first need to run\n", | |
"# the Chapter 6 Prerequisite Code first.\n", | |
"\n", | |
"#F = binomial(3*k+1, k)*binomial(3*n - 3*k, n-k) / (3*k + 1)\n", | |
"#soln = zeil_sum2(F, (0, 1), 2)\n", | |
"#print(\"Recurrence: \", soln[\"recurr\"])\n", | |
"#display(\"Closed Form:\")\n", | |
"#display(soln[\"closedform\"])\n", | |
"#print(soln[\"closedform\"].subs({n:0}))\n", | |
"#print(soln[\"closedform\"].subs({n:1}))\n", | |
"#print(soln[\"closedform\"].subs({n:2}))\n", | |
"#display_latex()\n", | |
"a = factor(rsolve_hyper([-(9*n**3 + 27*n**2 + 26*n + 8)/72, (18*n**3 + 81*n**2 + 125*n + 66)/486, -(4*n**3 + 24*n**2 + 47*n + 30)/1458], 0, n))\n", | |
"print(\"Dot:\", Matrix([4, 21, 120]).dot([-(9*n**3 + 27*n**2 + 26*n + 8)/72, (18*n**3 + 81*n**2 + 125*n + 66)/486, -(4*n**3 + 24*n**2 + 47*n + 30)/1458]).subs(n, 1))\n", | |
"display(a)\n", | |
"\n", | |
"print(a.subs({n:0}))\n", | |
"print(a.subs({n:1}))\n", | |
"print(a.subs({n:2}))\n", | |
"print(a.subs({n:3}))\n", | |
"\n", | |
"display_latex()\n", | |
"\n" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Dot: 0\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\nvgAAAABJRU5ErkJggg==\n", | |
"text/latex": "$$\\frac{\\left(\\frac{27}{4}\\right)^{n} C_{0}}{{\\left(\\frac{3}{2}\\right)}^{\\left(n\\right)}} n!$$", | |
"text/plain": [ | |
" n \n", | |
" 27/4 ⋅C₀⋅n! \n", | |
"───────────────────────\n", | |
"RisingFactorial(3/2, n)" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"C0\n", | |
"9*C0/2\n", | |
"243*C0/10\n", | |
"19683*C0/140\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "sLjRKG9jbhha", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 8.3.1\n", | |
"\n", | |
"Find polynomial solutions of\n", | |
"\n", | |
"$$3y(n+2) - ny(n+1) + (n-1)y(n) = 0$$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "hl0dMl2ubyZ5", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 68 | |
}, | |
"outputId": "e090cbca-d32d-4bbf-e7fe-852e120f9cb3" | |
}, | |
"source": [ | |
"# List terms in ascending order of y:\n", | |
"# (n−1)y(n) − ny(n+1) + 3y(n+2)−ny(n+1) = 0\n", | |
"display(factor(rsolve_poly([n-1, -n, 3], 0, n)))\n", | |
"\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAK8AAAAaCAYAAADBlQyzAAAABHNCSVQICAgIfAhkiAAABV1JREFU\neJztmmtsFUUUx3/FRlppg4oaUNHECBUVhRIf9ZFUfBBNVKJC4gfjRY0hRI0hJqYYY6MxVD+IlaDR\nxGd8EkhVDCra+CiIL7QRpcZIvIpQrQiCRoS21A//2Xbdu3t39vau92rnl2wm2TPn7Mzs7JlzZhYc\nDse/ThPwCbAb+AVYBZxc0hY5HJa8CcxDE3Yq0Ab8BBxaykY5/t88DfQAY4pstwboBy4tsl1HaZkB\nDAA3JFGaBCwGNqBludeUbwMLgIMKaMhpwH5gYQG6cUxAnTwnBdtxXAUsBTpQGDMAPJuCTrkxDk2q\nNuBbYA+wC1gLXA+MCtHJoL7mu/oDOm1AN3JQeakA7gH2GUPrgEeAFuAF4Fdzv8O2hz7WAL8B1QXo\nxrEc+Bw4IAXbcXSiMfkd6MJuIhaiU27MR+3eBjyHnN0T6B0PACvQfPIzDWiOuNqN3msBndPN/UVx\nDXrSVPwKODVEXg3cYeolYTLyuo8l1LPhATSAx6Vg24bz0EpVATRiNxEL0UmDjHl2YwG6M1GYFvSw\n44EfjN0rE9hbb3QuC5F1Ad+HPGuQhUZ5E1Ab86Ck3rPF2D4/Qn6hkS9GSdjzwM/AH8AHwBkRekvQ\nknJCwvakRSPJJ6KtTqFjlI8MhU/efCwydpda1p9q6v9I+Op5l5HP8m74Z/EE4F6gD5iLlrN87LFs\nlMcFKJb5MEI+3ZST0RZYDUru3gMagFfJ/aBagauRB/g6YXv+ixQyRqWi15R9lvVvNOXj5Ma8oPAV\n9AHncB+a2UnDARvGoE5szFPnRfP8HqA+IFtpZOf67i1Dic5MtEx5V2xQnzKNpOd5k46RDRmK73kr\n0bv+h6fMQzWwE82RiRF1xhp7H3s3/J53timfSdpSC45CS0F3njqeV5kHfBaQdZmyyndvAfIy7cau\nd9023MaWMUnHqFS0oLBmNdqPj2MucDDwBrAlos4u4C/gmKCgBs3q/RS2BRZHg7H/UoS8xjw7S252\nCortBiheQpYlfrvGf6XhRZPqFGOMsiTr91O2HfBxi9Htwv7AaJ3Riduj34ovDKk05eGm3A38ad1M\nHdFeAdQBe1E82wR8GajnxcdRXmEaeiFvoU4EqUdf3ncJ2paPzegrtmVbkZ47HIoxRg8iDxe0ezmK\nnbMBWWfCNt6E8pBNKDHfYaFzEnAWStRWx9StJiTXOgINyF6S7ZPaHtEeaeyvjbDjfa3zQ2S1yOO8\nk6BdpaSRdDxvWmOUoTgx763GzkY0n2xpNXrNMfVGoT5u9m54nrcH7aEdizrRbmEEcoPxa9DXfzb6\nUcajG53O1UXY9GK5TyNkFeikbyRTzmN0O4pzO9FuwHZLvSo0Z/rRLkM+6lAfB1cDf8K2xJQPE75n\nWgFcjDLeKGqNzZ2B+wPA+8BhwPEhevXoRO+LENkMUwYTlJFGuY7RnWjibkChgu3EBZgDHAK8TnSi\n5nGmKQdXl0qf8CHgFOA65PrXAN+g/bqJ6J+Bo1FiEEUr+jLWh8hWotOWWegc3GM0cCJ6KftC9LwX\nU86edzZDuzXjTdnAUMKzndxdkCQ65TpG1wJ3I8/ZgUKbIFmiEz9vb9fm1PUi85xX8lW6BMWuW9FA\n7UBHxctNY8dF6MUd0R6IToM+Ctz3/hp6NEKvCx2YhGXY5UIz+bP27DB10hyjDIXHvM3E71i8G6E7\nxci3EJ9njUWJ2ssFtDEW2yPaJtTg6TH1HA4/N5PSH4OtaIdhikXdKpQYroqr6HAYqtGKviIoGO7v\ng8tQKDEHuf8aho5nw2KzPpRUjEZZc29IHYfDzyS0hXs/+tWyaETFOc3FfIjD4XA4HA6Hw+FwjET+\nBlWyrSYvGSSZAAAAAElFTkSuQmCC\n", | |
"text/latex": "$$C_{2} \\left(n^{2} - 11 n + 27\\right)$$", | |
"text/plain": [ | |
" ⎛ 2 ⎞\n", | |
"C₂⋅⎝n - 11⋅n + 27⎠" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "jrj9QHwMdUKf", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 8.4.1\n", | |
"\n", | |
"Find hypergeometric solutions of\n", | |
"\n", | |
"$$(n-1)y(n+2) - (n^2 + 3n - 2)y(n+1) + 2n(n+1)y(n) = 0$$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "MYwhITiudvsg", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 62 | |
}, | |
"outputId": "d1cb2f61-8137-4d44-b93a-c46955ebf772" | |
}, | |
"source": [ | |
"# Remember to list the coefficients in ascending order of y.\n", | |
"display(factor(rsolve_hyper([2*n*(n+1), -(n**2 + 3*n - 2), n-1], 0, n)))\n", | |
"\n", | |
"display_latex()" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAHIAAAAYCAYAAAAmsqlBAAAABHNCSVQICAgIfAhkiAAAA/FJREFU\naIHt2H+o3XMYB/DXtTXGXclGIz/ys9GyX6KJ25glJMqP/SUXU2uhJVJEITalbIQ/lG3KSJYIcSnW\n/EjMZG2rjZwkml/5cVnbxfXH8zk6+97vued8z7nn3Htz3nX63J7P53me9/c+n+fzeT4PHfzvcTQG\ncRnewB/4EueNJqkOmIoleAlfYA9+xXu4AQdk1l8iArkRF+AkvIwtNfycjBXYjB8wkMa3sQwHN/8p\nLcVY4V9KvyFYKgLzLZ4VZJ/GL0n+Iroq1t8lAj29QnYNvqniuAv3Y1+y9z6exEo8h5+SfFPRL2oT\nxhr/kiqBPB+XGpp50/G1IHlFhfwFrM+svRfvVnG8JtnYhlk585PF5lhTRb8Z9CbfC5qwMZr881BS\nJZDD4U7xEY9VyHbi5sy6V7AqR//WpL8dU2r4mlyUXB3o1VwgW8l/UbK9AjNFcuxGPz7AWVX0SioC\nmc2+ahhI419pPAQnGnofzsFnGdmReCDpXo3fa/jaUyendqHV/Oek8RR8jG6sE7XHfJEctTZPXZiI\nrWLXXJhk8/F3clrG1LRmdkb/oSRv15GTh16NZ2Sr+T+f7H+PuZm5DWnu3By9koIZuVKk/Ot4M8lm\nYZdI/zLmiMzdntG/PI3P1OFrLKLV/MsZeR0+zcztSONBzTq5ReyIHTisAf3upP+P9pblgwV+a4ex\n1Wr+3cl2yf4vgjLWJ/8n5MyVVGTkxGGc3ITVIsMW4ucGiB6ext/wZwP6y3C7uKe2Ybna5f0qHJqR\nzRaNi3WGVnrZO70SzfDvwW2Yh6NExq3N4dWFt0TAspgrnnhfFfT9H5Ynw1txRKNGku4g9mJCQd3F\n4qi+EaeKirkfxzbAo1djd2Qz/C/Gg7hSbILenDXlE29pztwUka3vVLFfUuP5cUcyvgXTavOtiVKy\nt7DGuux9/RGeysh2iTK9KHo1XuyUNMa/Ev3yA1l+m56RM9eT5h6uyTDH+d2iuNksiP9Yj5EaeCSN\nT2BGznwXLhLVWxmTxJHUl1nbh7NHgFMRNMK/XswVnaLPc+bmpTFbAJUxo5JP5R15Le4Tz4pNIu2z\nKBm+OMjDozgd14ujuk80EwZwDM4RDfjKLtE0cZTtztjaLfq67UQj/OvBgThNBHFfznw5kJur6Jcr\n2i72D+TxaZwg7sg8bFQ8kIOi6b5B3Hdnim5GP77Dh3gNrxa02y60iv9M8f//pMr8vORjZ3HKYweT\nRCflqoz8cbGZxhuq3ZEjhnpbdO3GPnGkLMrIF4n+YwfjCItFQJeI58dqsbOPG01SBdAt3omzxfPj\nnvR3I8+ncY9losDaKzK0Z1TZFMMCxTtJHXTQQQcddNDBCONfjKIcKyezDYwAAAAASUVORK5CYII=\n", | |
"text/latex": "$$2^{n} C_{0} + C_{1} n!$$", | |
"text/plain": [ | |
" n \n", | |
"2 ⋅C₀ + C₁⋅n!" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default'></script>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "5qIOeGfAfXvp", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example 8.4.2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "tuVsiPnofatg", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 34 | |
}, | |
"outputId": "97e00b1c-6bab-4ee6-fa39-e96ecf723b60" | |
}, | |
"source": [ | |
"print(rsolve_hyper([(n+1)**3, -(2*n+3)*(17*n**2 + 51*n + 39), (n+2)**3] ,0, n))" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"None\n" | |
], | |
"name": "stdout" | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment