Skip to content

Instantly share code, notes, and snippets.

@jtb
Created July 25, 2020 21:41
Show Gist options
  • Save jtb/4bdb0e544840409de2c4d071ab2acb36 to your computer and use it in GitHub Desktop.
Save jtb/4bdb0e544840409de2c4d071ab2acb36 to your computer and use it in GitHub Desktop.
A = B Notebook.ipynb
Display the source blob
Display the rendered blob
Raw
{
"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