{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# A Funny Triangle Question" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "by Kunal Marwaha" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Question" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How many triangles are in a triangle composed of smaller triangles?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![triangles!](http://mathworld.wolfram.com/images/eps-gif/TriangleTilings_551.gif)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### First Thoughts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Suppose there are $n$ smaller triangles per side. Obviously, when $n=1$, then the answer is $1$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To compose a large triangle from smaller triangles, you can interleave rows of face-up triangles with rows of face-down triangles. \n", "\n", "You can build rows of $1,2,...,n$ face-up triangles interleaved with rows of $1,2,...,n-1$ face-down triangles. \n", "\n", "These stacked rows of triangles inspire the series $1, 1+2, 1+2+3, ...$. These numbers are known as the \"triangle numbers\". Thus, the $j^{th}$ triangle number is $T_j = 1+2+...+j = (j+1)(j/2)$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are a total of $(1+2+...+n)+(1+2+...+n-1) = ((n+1)n/2) + (n(n-1)/2) = n^2$ of the smaller triangles in the large triangle. This is perfectly sensible, since an $n$-fold increase in linear proportion magnifies the area by $n^2$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Intermediate Triangles: Face-Up" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also count all the intermediate-sized triangles. (This is only relevant for $n\\ge 3$.)\n", "\n", "Let's inspect triangles with $k$ smaller triangles per side. You can certainly build rows of $1,2,...,n-k+1$ face-up triangles. So, we can immediately count the total number of face-up triangles by taking a partial sum of the triangle number series." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Analytic Solution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Number of face-up triangles = $\\sum_{k=1}^{n} \\sum_{i=1}^{n-k+1} i = \\sum_{k=1}^{n} \\sum_{i=1}^{k} i = \\sum_{k=1}^n T_k = \\sum_{k=1}^n (k+1)(k/2) =\\sum_{k=1}^n k^2/2 + k/2$ .\n", "\n", "This simplifies to $(2n+1)(n+1)(n/12) + (n+1)(n/4)$ since both $\\sum_{i=1}^n i = T_n$ and $\\sum_{i=1}^n i^2$ have a closed-form expression. Thus, there are $(n/12)(n+1)(2n+1+3) = n(n+1)(n+2)/6$ face-up triangles in the large triangle." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Code and Verification" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from __future__ import division" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def tr(n):\n", " return int(n*(n+1)/2)\n", "def num_faceup(n):\n", " return int(n*(n+1)*(n+2)/6)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "n_max = 100\n", "assert [sum(map(tr, range(1,n+1))) for n in range(1,n_max+1)] == \\\n", " [num_faceup(n) for n in range(1,n_max+1)], \"num_faceup function isn't correct\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above ```assert``` checks that the ```num_faceup``` closed-form expression exactly matches the partial sum of the triangle number series." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Result" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of face-up triangles when n=1..20:\n", "[1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 286, 364, 455, 560, 680, 816, 969, 1140, 1330, 1540]\n" ] } ], "source": [ "n_max=20\n", "print(\"Number of face-up triangles when n=1..\"+str(n_max)+\":\")\n", "print([num_faceup(n) for n in range(1,n_max+1)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Intermediate Triangles: Face-Down" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Counting the face-down triangles is trickier. When $k=1$, as discussed earlier, there are $T_{n-1} = n(n-1)/2$ face-down triangles. The biggest face-down triangle that fits in the large triangle is the largest integer no more than $n/2$ (let's call this $m$). If $n$ is even, it fits right in the middle.\n", "\n", "Inspecting triangles of $k$ smaller triangles per side, you can build overlapping rows of $1,2,...,n+1-2k$ face-down triangles (supposing $n\\ge 2k$). Now, we can count the total number of face-down triangles by taking a partial sum of odd or even terms in the triangle number series." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Number of face-down triangles = $\\sum_{k=1}^{m} \\sum_{i=1}^{n+1-2k} i = \\sum_{k=1}^{m} T_{n+1-2k} = T_{n-1} + T_{n-3} + ...$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Analytic Solution (even $n$)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This summation can be done analytically. First, note that $T_n - T_{n-1} = \\sum_{i=1}^n i - \\sum_{i=1}^{n-1} i = n$. Also, recall that $\\sum_{k=1}^n T_k = n(n+1)(n+2)/6$ is the number of face-up triangles in a large triangle of size $n$.\n", "\n", "Suppose $n$ is even. We can split up the triangle series into even and odd parts; that is, $\\sum_{k=1}^n T_k = \\sum_{k=1}^{n/2} (T_{2k} + T_{2k-1})$. By the above note, $\\sum_{k=1}^{n/2} (T_{2k} - T_{2k-1}) = \\sum_{k=1}^{n/2} (2k) = (n/2)(n+2)/2$. \n", "\n", "We can then determine the partial sum of odd terms in the triangle series, as $0.5[\\sum_{k=1}^{n/2} (T_{2k} + T_{2k-1}) - \\sum_{k=1}^{n/2} (T_{2k} - T_{2k-1})] = \\sum_{k=1}^{n/2} T_{2k-1} = \\sum_{k=1}^{n/2} T_{n+1-2k}$.\n", "\n", "Plugging all expressions in, the number of face-down triangles for even $n$ is $0.5[n(n+1)(n+2)/6 - n(n+2)/4] = n(n+2)(2n+2)/24 -3n(n+2)/24 = n(2n-1)(n+2)/24 = (2n^3 + 3n^2 - 2n)/24$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Analytic Solution (odd $n$)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To be exact, the above expression is a summation for the first $n/2$ odd terms in the triangle series, assuming $n$ is even. We can easily find the sum of the first $n/2$ even terms, since $\\sum_{k=1}^{n} T_k - \\sum_{k=1}^{n/2} T_{2k-1} = \\sum_{k=1}^{n/2} T_{2k}$. Plugging in: $n(n+1)(n+2)/6 - n(2n-1)(n+2)/24 = n(2n+5)(n+2)/24$.\n", "\n", "When $n$ is odd, the number of face-down triangles is the sum of even terms in the triangle series, from $2$ to $n-1$. That is exactly the summation above, except with $n$ relabeled to $n-1$. \n", "\n", "Precisely, let $x=n-1$ be odd. (Then, $n$ is even.) Then, $\\sum_{k=1}^{n/2} T_{2k} = \\sum_{k=1}^{(x-1)/2} T_{2k} = \\sum_{k=1}^{(x-1)/2} T_{x+1-2k}$ describes the number of face-down triangles in a large triangle of size $x$ (since in this case, $m=(x-1)/2$). This quantity is $n(2n+5)(n+2)/24 = (x-1)(2x+3)(x+1)/24 = (2x^3 + 3x^2 - 2x - 3)/24$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are other solutions for the odd $n$ case, but you will arrive at the same answer. I encourage you to try a method similar to the even $n$ case with a pencil and paper. It is so rewarding to 'figure it out' yourself." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Code and Verification" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def num_facedown_even(n):\n", " return (2*n-1)*n*(n+2)/24\n", "def num_facedown_odd(n):\n", " return (2*n+3)*(n*n-1)/24\n", "def num_facedown(n):\n", " return int(num_facedown_even(n)) if n%2==0 else int(num_facedown_odd(n))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "n_max = 100\n", "assert [sum(map(tr,range(n-1,0,-2))) for n in range(1,n_max+1)] == \\\n", " [num_facedown(n) for n in range(1,n_max+1)], \"num_facedown function isn't correct\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above ```assert``` checks that the ```num_facedown``` closed-form expressions exactly match the subset sums of the triangle number series (from $T_{n-1}$, to zero, counting backwards by twos)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Result" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of face-down triangles when n=1..20:\n", "[0, 1, 3, 7, 13, 22, 34, 50, 70, 95, 125, 161, 203, 252, 308, 372, 444, 525, 615, 715]\n" ] } ], "source": [ "n_max=20\n", "print(\"Number of face-down triangles when n=1..\"+str(n_max)+\":\")\n", "print([num_facedown(n) for n in range(1,n_max+1)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### A fun fact" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the solutions for even-sized and odd-sized triangles differ by $3/24=1/8$. The math works out. Strange!" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0.0, 0.875, 3.0, 6.875, 13.0, 21.875, 34.0, 49.875, 70.0, 94.875]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[num_facedown_odd(i) for i in range(1,10+1)]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0.125, 1.0, 3.125, 7.0, 13.125, 22.0, 34.125, 50.0, 70.125, 95.0]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[num_facedown_even(i) for i in range(1,10+1)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Total Number of Triangles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By the symmetry of the drawing, all triangles are either face-up or face-down. So, the total number of triangles in a large triangle (with $n$ smaller triangles per side) can be calculated analytically:\n", "\n", "There are $n(n+1)(n+2)/6$ face-up triangles, and $n(2n-1)(n+2)/24$ face-down triangles (when $n$ is even). Thus, there are $n(6n+3)(n+2)/24 = n(2n+1)(n+2)/8 = (2n^3+5n^2+2n)/8$ triangles in a large triangle of even size $n$. (If $n$ is odd, subtract $1/8$ from this expression.)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Result" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of triangles when n=1..20:\n", "[1, 5, 13, 27, 48, 78, 118, 170, 235, 315, 411, 525, 658, 812, 988, 1188, 1413, 1665, 1945, 2255]\n" ] } ], "source": [ "n_max=20\n", "print(\"Total number of triangles when n=1..\"+str(n_max)+\":\")\n", "print([num_faceup(n) + num_facedown(n) for n in range(1,n_max+1)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Another fun thought" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A cheap way to calculate the number of triangles given $n$ is to round the expression for even $n$ (since $1/8 < 1/2$). The following ```assert``` checks that claim." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def num_total(n):\n", " return round((2*n+1)*(n+2)*n/8)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [], "source": [ "n_max=100\n", "assert [num_faceup(n) + num_facedown(n) for n in range(1,n_max+1)] == \\\n", " [num_total(n) for n in range(1,n_max+1)], 'num_total rounding doesn\\'t work'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see that this number grows very fast with $n$." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEdCAYAAAAikTHKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XucVXW9//HXe7yNeGMo8QI4YHkDL4gFpXQc7NfFKPSn\n53g6pQmYXbQErY7aOT08XU5lmYp1tDIFU/qZEl4j04JRkzIFr+BRS0EghRTwRpgwn98f3++GNdPe\nM2vvWWv2ZT7Px2M/Zq/vWnutz/7uNfu71/f7Xd+vzAznnHOuXE3VDsA551x98gLEOedcRbwAcc45\nVxEvQJxzzlXECxDnnHMV8QLEOedcRbwA6YakYZJekaQ+OFaHpH0z3uerkoZnuc/e6Kt4JD0r6Zi8\nj1PPepNHkr4h6a+S/pJ1XGXEMFPS1+LzoyWtqEIMj0v6pz44zgJJU/M+TiX6bQGS5h/IzFaY2a7W\nNzfLZH4MM9vFzJZlvd+u0p7gfRWPy4+kYcA5wIFmtne140nI7P8nWTh1e0Czg83snqyOW4/6bQHS\nE0nb9PUh+/h4faYKeeny0wq8aGYvVTuQLFRybvr5vFW/LEAk/RTYB7gtVlF9UVJrrEaaKmk58NtE\nWlN83WRJS+Nr/iTpU4l9Hi1phaRzJK2WtErS5MT6QZJuk/SypPslfV3SvSXi217SRZKWS3pe0uWS\ndojr3hL3s07SS5Lu7uZ9bqkWi7+qfiDp9hj/7yWN6Oa1N8Rjr5PULmlkie2+AbwH+EHc72WJY58h\n6SngqSLxfEjS4pgfyyVdkNhnId8/EdetkfTlxPpmSddIWitpiaQvlarCUHBe/Lz+Kul6SQO7ed/H\nSXooxvW0pPfH9L0k3RLz/ClJn0y85oKYX9fGPHhE0n7xuKvje3hfYvsFkr4Zz4OXJd2UjEnSJIXq\nkbWS5ks6MLHuXEkr43GekDQhzfuUdIqkZXHdlrwskQe7SvppzPdnJf1HTH8vcCewdzz+1UVeW/L8\njPv6YsyfVyVdKWmwpHlxf3dK2i2xfapzsEgMe0maE+P/s6TPd/msboyf1Xrg1C6vPR34OPDvMaZb\nErH/u6RHgNckbaNELYakd0paGGNdJen7krZN7LdD0qfjubNW0g8S65okfS9+Nn+WdKYS3ztF3t9U\nhe+hlyT9StI+iXWXxHPu5ZjPqfKsYmbWLx/As8CExHIr0AHMAnYEdohpm4GmuM2xwPD4/D3A68Do\nuHw08CZwAbBN3PZ1YLe4/nrgZ3G/BwHPAfckjt8B7BufXwLcDOwG7ATcAvx3XPdN4HJC4b8NcFQ3\n73FzYp8zgb8CR8TXXgf8rJvXTgYGANsBFwMPdbPtAmBql7QO4NfAQGCHIvH8EzAqPj8YeB6Y1OWz\n+BGwPXAosBE4IK7/djzmrsDewCPAc10+22Pi82nAQmCv+F6uKPW+gbHA+sRr9wL2j8/vAb4f93EY\nsAZoi+suADYA/yfm7TXAM8D58TP6JPBMl/xaEc+DHYE5wLVx3f7Aa8Ax8bVfAp4Gto3rngP2iNvu\nA4zo6X0CI4FXgaPiuu8Bfy+8zyL58FPgpvj5twJPAlMS5/lzxV7X0/kZP5eFwFtjnKuBB+Pnuz3w\nW+Arac5Bwvn8ta4xEa7kHwT+Ix5/OPAn4H2Jz+oN4CNxeYci72HLvrvEvphwvu2QSCucK2Pi+aP4\nuSwBzury/3ArsAswLJ4/74/rPgM8HvNkN+AuOn/vbPn/Ao4j/CDbP+bxl4H74rr3Aw8Au8TlAwrn\nSm7fo3nuvJYfyQ8/LhcKi9YiaU0l9nET8PnESfx6ctv4DzI2ftB/B96eWPd1ShcgrxG/GOLyu4lf\nQMBX43HfluI9Jvc5E/hxYt2xwNKUeTUw7muXEutLFSBHl4qnyD4uAb7XJd/3Sqy/HzgpPv8z8H8S\n606jdAGylM4/FPaKn8U/fKbADwsxdEkfSvhxMCCR9k3g6vj8AuDXiXUfBl4BFJd3ju9910R+fTOx\n/UGEAlLAfwLXJ9YJWEkocN8GvAC8F9i2S4wl3yfwFRKFJuFL+Q2KFCBx+zeIhXVM+xQwP3Ged1eA\nlDw/4+fyb4nlOcD/JJY/B8xNcw5SugAZByzr8trzgKsSn1V7D+d7qQLk1CJppQrhacAvupz7704s\n/xz49/j8t8DpiXXvpXQBMo9YmCc+r9cJhdIE4H9jHijN/3ZvH/2yCqsHK0utkHSsQtXPS5LWEb6E\n35rY5CUz60gsbyB8eexO+DWU3HepKpfdCf/gi+Kl7lrgV8Bb4ibfJXyB3hmrK84t4729UCS2YjE0\nSfp23P96wj+K0fm9ptFdXo6L1TNr4jE+XWT/q0vEuzcp8jJqBW5K5OVSQmGwR5FthxHytqu9gbVm\ntiGRthwYUiLWvxHaCSyxDJ3zOxnzcsKv7LfGYy0vrIj7WAEMMbM/A9OB/wJWS/qZpD1TvM+9k8eL\n76NUG8ZbCVc7z3XzXrvzHbo/P7vmU9flnaFX5+A+wJBCPsT/0/OBwYltKu2x1d35vF+suns+xvvf\nRWLt7nxOxtTT+Twj8Tm/RMiXIWa2APgB8D+E8+OHkor+j2elPxcgVk66pO0Jv5i+A+xuZi2EL/Y0\njd9/BTYRfskWDCux7YuEk2uUmQ2Kj4FmthuAmb1mZl80s7cBk4BzFOvBM/Qx4COEX1cDCdUAovR7\nLSsvo9mEaroh8Rg/6mb/XT1P57zcp9SGhC/CYxN52WJmO5nZ80W2XUH4ld/VX4BBknbqcsxVKeMt\nJvn5txK+7F+Mx2otsu0qADO73szek9jmwvi3u/f5fPJ4kgaw9QdJVy/GWJIxtJLyvZrZ6xmdnx+n\nvHOwYAXhaj2ZD7uZ2UeSYfb0NspMh1Bl+AThymsgoQotj/N5BfDpLu9vZzP7A4CZ/cDM3kGotjyA\nUAWam/5cgLwAdL3votgHXkjbPj5eNLMOSccS6hx7FK9K5gL/JWlHhUbRT5TY1oArgUvj1QiShmhr\nY+5ESYUvuVcJBVNHsX31wi6Eaox18UvzW3T/z7Oaf8zLnuwMrDOzNyWNJRRaSd39890AnC9poKQh\nwJndbPsj4JuFhkZJu0uaVGLbq4ApkiYo2FvSAWa2klB3/y1JO0g6lFBtdm3Pb7OkkyUdGL/Mvwrc\nGD/7G4CJMYZtJX2RUL21UNL+MX17QvXU39j62Xf3PucAH5Z0pKTtgK9RIn/juXoD8N+SdpbUCpyd\n9r2WOD83p8+WLXamvHOw4I/Aq7HBuzk2do+S9I4yjl3J+bwL8IqZbYj/358t47U3ANPi+TYQ+Pdu\ntv0h8OVC47ik3ST9c3z+DkljY+P93wjnTdbfDZ305wLk28BX4qXgOTGt2AlqEH75A2cBN8ZLx48S\nGre7k9zf5wn1uM8TGll/RvgHKbbtuYSGvz/Ey+E7CY1mAPsBv5H0KnAfoQ65VE+sNP9wxfyU8It2\nFaFxb2EP288A/iVW7V3azbGTaWcAX5f0MqHe/+fdbNt1+WsxtmcJeXMjpfNyBuFzujMeayGhXeof\ngzN7AJgCXAq8DLSz9dfgx4ARhCuEXxAaexcU208JXd/PtYTz4C+EHybTYgxPAScTqiL+CkwkNPhu\nInTA+HZM/wuhavT8nt6nmS0lFLL/L77uJbqpjiGc5xsIHQHuAa4zs5kp32ex87Nwr0R3n2lX5Z6D\nYYehAPwwMJpwfqwh/CDbNWX8EH5IjIrfDXO7iTWZ9kXg45JeIRTm13ezbdflKwnn8aPAIuCXwKZE\ndfiWbc3sZsI5cH38bngU+GBcvWvc11rCe3+RUOWdm0IjXz47l4YSToQ9CCXhj83s+wpdNk8nfLgA\nXzazO+JrzgemEn65TDOzO2P6GEIPqWZgnplNzy3wPiDp24QeElOqHUu9k/QZ4F/NLOuqvFxIWkDo\ndfUP3WCdk/RB4AozK9nNvlbkfQWyCTjHzEYRehJ9Tlv7tF9sZmPio1B4HAScROiVcixwubRlGJEr\ngNPMbH9gf0kfyDn2TEk6QNIh8flYQhXI3O5f5YqRtGesjpGkA4Av4Hnp6lSsajs2VrcNIfQUq4vz\nOdcCxMxeMLOH4/PXCI1Mhd4cxepgjyN0YdxkYciLp4GxsafJLrGKAcJVzfF5xp6DXYC5kl4jVCV8\n18xuq3JM9Wp7QjXBK8BvCN1Gr6hqROXJ77Lf1SMR2sHWEqqwlhAKkZq3bc+bZENhEL3RhP784wlX\nI6cQbvr5gpm9TChcfp942aqYtonOdbYrSd+tsCaY2YOE+mHXS2b2HHBIteOolJn5QI9uCzP7GyXa\n5WpdnzSix77IcwhtGq8R7lTd18xGE3pDfa8v4nDOOZed3K9AYpeywlANtwCY2V8Tm1wJFKpyVtG5\nf/zQmFYqvdjxvHrAOecqYGZlDeraF1cgVxOGzJhRSNDWu2cBTiB004MwVsxHFQYTHAG8Hfijmb0A\nvBz7OItwD0XJLrR9cQt/f3hccMEFVY+hkR6en56ftfyoRK5XIJKOItxR+pikhwiNh18GPiZpNKFr\n7zLCMBaY2VJJN7B1GIYzbOs7O5PO3XjvyDN2B8uWLat2CA3F8zNbnp/Vl2sBYmb3EcaA6qrkl7+Z\nfYtw12nX9EXUccOpc841mv58J7rrweTJk6sdQkPx/MyW52f15XonejVIskZ7T845lzdJWA02ors6\n1d7eXu0QGornZ7Y8P6vPCxDnnHMV8Sos55xzXoXlnHOu73gB4kryOuZseX5my/Oz+rwAcc45V5Ee\n20DilJtfAPYxs9Ml7QccYGa390WA5fI2EOecK19ebSAzCdOFvjsurwK+UWZszjnnGkyaAuRtZvYd\nwthUmNkGik8G5RqM1zFny/MzW56f1ZemAPm7pB2Js6hJehvhisQ551w/lqYN5H3AfwIjgTuBo4DJ\nZtaee3QV8DYQ55xLZ/NmmDsXZs2CefPKbwNJdSOhpLcA7yJUXf3BzF6sKNo+4AWIc871bM0amDQJ\nHnkENm4EyLARXdKYwgNoBZ4H/gLsE9Ncg/M65mx5fmbL87NyHR2h8Lj//lB4tLC2ov10Nx9Id/OU\nG3BMRUd0zjlXVXPnhisPgOlcwlnMYN8K9uNjYTnnXD8zcSLMmxeuPBYxhhEsR5Q/J3qPMxJKOqFI\n8svAY2a2ppyDOeecq74NG8LfUSxhGCsq3k+abrynAT8hzG3+ceBK4FzgPkmnVHxkV/O8jjlbnp/Z\n8vys3IAB4e/jHMwKhlW8nzQFyLbAQWZ2opmdSOjOa8A4QkHinHOujkyZAs3NsJ4WLmMay2itaD9p\n7gNZamYjE8sClpjZSEkPmdnhFR05J94G4pxz3evogCOPDL2wILSFrOMtuYyF1S7pdkmnSjoVuCWm\n7QSsLzdw55xz1dXUBLfeCuPGhSuRdQyqbD8ptjkTmAWMjo+fAmea2etmNqGio7q64HXM2fL8zJbn\nZ+8MHgwLF8J114VeWZXosRdWrA+aEx/OOecaRFMTnHhieKiCIXLTtIGcAFwIDCYMZRK7C9uu5R8u\nf94G4pxz5atkPpA0BcifgI+Y2RO9Ca6veAHinHPly2tCqdX1Uni4bHkdc7Y8P7Pl+Vl9PbaBAA9K\n+jlwM4l5QMxsbm5ROeecq3lpqrBmFkk2M5uaT0i941VYzjlXvlzaQOqNFyDOOVe+XNpAJDVLOlPS\n5ZKuLjwqD9PVC69jzpbnZ7Y8P6svTSP6tcCewAeAu4GhwKt5BuWcc672pWkDecjMDpf0qJkdKmk7\n4F4ze1ffhFger8Jyzrny5dWN9834d72kg4HdCDcVOuec68fSFCA/ltQCfAW4FVgKfCfXqFxN8Drm\nbHl+Zsvzs/rSjIX1k/j0bqho2lznnHMNqGQbiKSTzew6SecUW29mF/e4c2koYfTePYAO4Eozuyxe\n0fwcaAWWASeZ2cvxNecDU4FNwDQzuzOmjyGMCtwMzDOz6SWO6W0gzjlXpqzbQHaKf3cp8UhjE3CO\nmY0C3g2cKelA4DzgN2Z2ADAfOD++gZHAScBBwLHA5XECK4ArgNPMbH9gf0kfSBmDc865HJQsQMzs\nR5K2AV4xs692faTZuZm9YGYPx+evAU8QugEfB1wTN7sGOD4+nwRcb2abzGwZ8DQwVtKewC5m9kDc\n7qeJ17iceB1ztjw/s+X5WX3dNqKb2Wbg37I4kKThhAmp/gDsYWar4zFeYGuvriHAisTLVsW0IcDK\nRPrKmOacc65K0gymeJ+kHxDaLF4vJJrZ4rQHkbQzYUKqaWb2mqSujRSZNlpMnjyZ4cOHAzBw4EBG\njx5NW1sbsPVXiy/3vNzW1lZT8dT7suen52eWy5s3w9e/3s4dd8COO7YxYACMHdvOe94DxxzT8+vb\n29uZNWsWwJbvy3KluZFwQZFkM7NjUh1A2ha4HfiVmc2IaU8AbWa2OlZPLTCzgySdF/d9YdzuDuAC\nYHlhm5j+UeBoM/tskeN5I7pzrqGtWQOTJsEjj8DGjVvTm5vhsMPCfOeDy7xbL68bCU8zswnJB/DJ\nMo5xNbC0UHhEtwKT4/NTgVsS6R+VtL2kEcDbgT/Gaq6XJY2NjeqfSLzG5aTwa8Vlw/MzW/01Pzs6\nQuFx//2h8GhhLeO5l4GsY+PGkD5pUtgub2kKkGJzod+YZueSjgI+Dhwj6SFJiyV9kDBF7vskPQm8\nF/g2gJktBW4g3Kw4DzgjcTlxJnAV8BTwtJndkSYG55xrJHPnhisPgOlcwiLGsIA2FnM407kECOtv\nvjn/WLq7D+RAYBThrvMvJVbtCnwpds2tOV6F5ZxrZBMnwrx54cpjEWMYwfIt65bRyhgWs45BTJwI\nt9+efr+VVGF114h+APBhYCDwkUT6q8Dp5RzEOedcNjZsCH9HsYRhnTqtwlBWMJKl3Mf4Ldvlqbv7\nQG4xsynAh81sSuJxlpktzD80V239tY45L56f2eqv+TlgQPj7OAezgmGd1q1kGEsY1Wm7PPXYBmJm\nv88/DOecc2lMmRJ6W62nhcuYxjJa2UQTy2hlBtNYTwvNzTC1DyYd9yltnXOujnR0wJFHht5WENpC\nRrKUJYxiPS0AjBsHCxdCU5puUpHPiY4XIM65xlc394FI2kPSVZJ+FZdHSjqtvNBcPeqvdcx58fzM\nVn/Oz8GDwxXGddeFXlkTJoS/s2eH9HILj0qlGcpkFjAT+I+4/BRhWJOrcorJOedcD5qa4MQTw6Na\n0gxl8oCZvbMwN3pMe9jMRvdJhGXyKiznnCtfXkOZvC7pLcQBDyW9C3i5gvicc841kDQFyDmEMare\nJuk+wlwcn881KlcT+nMdcx48P7Pl+Vl9aeZEXyzpaMKd6QKeNLM3c4/MOedcTUvTBnJCkeSXgcfM\nbE0uUfWCt4E451z5crkPRNIvCfOZF+YFaQMWASOAr5nZteWHmh8vQJxzrnx5NaJvCxxkZiea2YnA\nSEKD+jjg3PLDdPXC65iz5fmZLc/P6ktTgAwrzF8erYlpawFvC3HOuX4qTRXW5cA+bJ1E6kRgJWGO\nkNvjDIU1w6uwnHOufHm1gQg4ARgfk+4DflGr39JegDjnXPkybwORtA0w38x+YWZnx8cc/4buH7yO\nOVuen9ny/Ky+bgsQM9sMdEjarY/icc45VyfSVGHdAhwO3AW8Xkg3s7PyDa0yXoXlnHPly3pO9IK5\n8eGccy4DmzfD3Lkwa1aY43zAgDDT4AknlDcJVLX5hFKupPb2dtra2qodRsPw/MxWveZnHpNBZSGv\nCaX2kzRH0lJJzxQelYfpnHP9U0dHKDzuvz8UHi2sZTz3MpB1bNwY0idNCtvVgzQXSzOBK4BNwATC\naLzX5RmUqw31+Ouulnl+Zqse83Pu3HDlATCdS1jEGBbQxmIOZzqXAGH9zTdXMcgypGlEX2RmR0h6\nzMwOSab1SYRl8ios51ytmjgR5s0LVx6LGMMIlm9Zt4xWxrCYdQxi4kS4/fa+jS2vsbDekNQEPC3p\nc5L+L7BzRRG6uuL97LPl+ZmteszPDRvC31EsYRgrOq0bygpGsrTTdrUuTQEyDRgAnAUcAZwCnJpn\nUM4514gGDAh/H+dgVjCs07qVDGMJozptV+u8F5ZzzvWROXPglFNCA/p0LmEaMxjKClYyjBlM41LO\nprkZZs8OXXr7UqZjYUm6jTgPejFmNqm88PqGFyDOuVrV0QFHHhl6W0FoCxnJUpYwivW0ADBuHCxc\n2Pf3g2RdgBzd3QvN7O5yDtRXvADJTr32s69Vnp/Zqtf8bKT7QEreiV6rBYRzztWzwYPDFcZNN8HM\nmVvvRJ86FY4/3u9Eryq/AnHOufLl1Y3XOeec+wepCxBJddKxzGWlHvvZ1zLPz2x5flZfmrGwjpS0\nFPjfuHxYnObWOedcP5ZmKJP7gX8GbjWzw2Pa42Z2cI87l64CPgysNrNDY9oFwOnAmrjZl83sjrju\nfGAqYdytaWZ2Z0wfA8wCmoF5Zja9m2N6G4hzzpUptzYQM1vRJWlzyv3PBD5QJP1iMxsTH4XC4yDg\nJOAg4Fjg8jgfO4TBHE8zs/2B/SUV26dzzrk+lKYAWSHpSMAkbSfpi8ATaXZuZr8D1hVZVayUOw64\n3sw2mdky4GlgrKQ9gV3M7IG43U+B49Mc3/WO1zFny/MzW56f1ZemAPkMcCYwBFgFjI7LvfE5SQ9L\n+klivvUh0Gl0sVUxbQiwMpG+MqY555yroh4LEDN70cw+bmZ7mNlgMzvZzF7qxTEvB/Y1s9HAC8D3\nerEvl6N6vMu3lnl+Zsvzs/p6nBNd0u6ERu/hye3NbGolBzSzvyYWrwRui89XQafhKYfGtFLpJU2e\nPJnhw4cDMHDgQEaPHr3lZCtc9vqyL/uyL/fn5fb2dmbNmgWw5fuyXGl6YS0E7gUWkWg8N7NfpDqA\nNBy4LTEZ1Z5m9kJ8fjbwTjP7mKSRwGxgHKGK6i5gPzMzSX8gDCf/APBL4LJC43uR43kvrIy01+lY\nQ7XK8zNbnp/ZynQsrIQBZnZuhQH9DGgD3iLpOeACYIKk0UAHsAz4NICZLZV0A7AUeBM4I1ESnEnn\nbrxFCw/nnHN9J80VyDeAhWY2r29C6h2/AnHO5Wnz5jC3+axZWwdCnDIlzN/RVMeDQ2U9nPurhPlA\nBOwEvEG4MhBgZrZr78LNhxcgzrm81OpQ7FnI9EZCM9vFzHaNf5vMbMfEck0WHi5bhQY3lw3Pz2z1\ndX52dITC4/77Q+HRwlrGcy8DWcfGjSF90qSwXX+RZiys36ZJc865RjZ3brjygDAd7SLGsIA2FnM4\n07kECOtvvrmKQfax7qqwmglVV/MJDeGFS5tdgTvM7MC+CLBcXoXlnMvDxIkwb1648ljEGEawfMu6\nZbQyhsWsYxATJ8Ltt1cx0Apl3Qvr08B0YG9CF97Cjl8BflBRhM45V6c2bAh/R7GEYXQeHnAoKxjJ\nUu5j/Jbt+oPu2kBmmNkI4Itmtq+ZjYiPw8zMC5B+wOvss+X5ma2+zs8BcUakxzmYFZ3ubYaVDGMJ\nozpt1x+kGcrk+30RiHPO1bIpU0Jvq/W0cBnTWEYrm2hiGa3MYBrraaG5Ocxt3l/4nOjOOZdCRwcc\neWTobQWhLWQkS1nCKNbTAsC4cbBwYX3eD5LpfSD1ygsQ51xe/D6QzlKVk5KGxKlt/6nwqCxEV0+8\nzj5bnp/ZqkZ+Dh4crjCuuy70ypowIfydPTuk12vhUak0o/FeCPwrYYyqwmCKBtyTY1zOOVeTmprg\nxBPDo79LMxbWk8ChZvZG34TUO16F5Zxz5curCusZYLvKQnLOOdeo0hQgG4CHJf1I0mWFR96Buerz\nOvtseX5my/Oz+tLMB3JrfDjnnHNbeDde55xz2Y6FJekGMztJ0mOEXledmNmhFcTonHOuQXTXBjIt\n/v0w8JEiD9fgvI45W56f2fL8rL6SVyBm9nz8u7zUNs455/ovbwNxzvUrjTqneW/5WFh4AeKcK62R\nx7LqrdzGwkocoEWSN573E17HnC3Pz2yVm58+p3n20syJ3i5pV0mDgMXAlZIuzj8055zLjs9pnr00\nY2E9ZGaHS/okMMzMLpD0aK124/UqLOdcMY0+p3lv5VWFta2kvYCTgH6Yrc65RpBmTvPkdq5naQqQ\nrwG/Bv5sZg9I2hd4Ot+wXC3wOvtseX5mq9z89DnNs5dmTvQbzexQM/tsXH7GzHwkfOdcXfE5zbOX\npg1kf+AKYA8zOzj2wppkZt/oiwDL5W0gzrliGn1O897K5T4QSXcDXwJ+ZGaHx7THzezgiiPNkRcg\nzrlS/D6Q0vJqRB9gZn/skrapnIO4+uR19tny/MxWJfnpc5pnK818IC9KehtxRF5J/ww8n2tUzjmX\nE5/TPDtpqrD2BX4MHAmsA54FTjazZblHVwGvwnLOufLlOhaWpJ2AJjN7tZLg+ooXIM45V76sJ5Q6\np9RBAMzMhzNpcO3t7bS1tVU7jIbh+Zktz8/q664NZJc+i8I551zd8eHcnXPOZVuFldjpZUWSXwYe\nNLNbenjtVYQpcVcXBl+U1AL8HGgFlgEnmdnLcd35wFRCN+FpZnZnTB8DzAKagXlmNj3Nm3POOZef\nNPeBNAOjCeNfPQ0cCgwFTpN0aQ+vnQl8oEvaecBvzOwAYD5wPoCkkYQBGw8CjgUuV6HBJdwJf5qZ\n7Q/sL6nrPl0O/L6FbHl+9t7mzXDjjeHejdGj25k4EebM8Tk8qiXNfSCHAkeZ2WYASVcA9wLjgce6\ne6GZ/U5Sa5fk44Cj4/NrgHZCoTIJuN7MNgHLJD0NjJW0HNjFzB6Ir/kpcDxhgEfnXD9R7C7yRx6B\n+fPhoov6913k1ZLmCqQF2DmxvBMwKBYob1RwzMFmthrAzF4ACh/5EOg0xvKqmDYEWJlIXxnTXM68\nh0u2PD8rV3w2wW18NsEqS1OAfAd4WNJMSbOAh4DvxvtCfpNBDN7i7Zzrls8mWJt6rMIys6skzQPG\nxqQvm9lf4vMvVXDM1ZL2MLPVkvYE1sT0VdBpkP6hMa1UekmTJ09m+PDhAAwcOJDRo0dv+fVXqIf2\n5Z6Xk3X2tRBPvS97fla+PHNmGxs3ws7cylguZASrCWuWM44LaeFU1m0cxHe/286gQdWPtx6W29vb\nmTVrFsC31XjMAAAWK0lEQVSW78typerGK2kIodfUlgLHzO5JdQBpOHCbmR0Sly8E1prZhZLOBVrM\n7LzYiD4bGEeooroL2M/MTNIfgLOAB4BfApeZ2R0ljufdeDPS7jdqZcrzs3ITJkB7O4znXhbQxrZ0\n0A60AZtooo27uY/xTJgQ2kRc+fLqxnsh8K/AEqBQw2hAjwWIpJ8RPuO3SHoOuAD4NnCjpKnAckLP\nK8xsqaQbgKXAm8AZiZLgTDp34y1aeLhs+Zddtjw/K9d1NsERLKctrvPZBKsnzWCKTwKHmlklDeZ9\nzq9AnGs8c+bAKaeEBvTpXMI0ZjCUFaxkGDOYxqWcTXNzGJb9hBOqHW19ymtCqV8B/2Jmr/UmuL7i\nBUh2vMolW56flSs2m+AQZrOSk302wYzkUoUFbCD0wvotiW67ZnZWmfE551xFmprCfR6F+0DWbRzE\nOg6BOI95YTZBLzz6VporkFOLpZvZNblE1Et+BeJc4+rogJtugpkzYcOG0OYxdSocf7wXHr2V63wg\n9cILEOecK18uc6JL2k/SHElLJT1TeFQepqsXyfsWXO95fmbL87P60lz0zSQMZrgJmEAYi+q6PINy\nzjlX+9K0gSwysyMkPZa4GXCRmR3RJxGWyauwnHOufHn1wnpDUhPwtKTPEYYR2bmH1zjnXCebN4cx\nrWbN2toAPmVKuG/DG8DrU5qPbRowgDCUyBHAKUDRnlmusXgdc7b6c36uWQNHHQWf+ATMmxeGJZk3\nL9wceOSRYX25+nN+1oo0gykW5uF4DZiSbzjOuUaTHIodwk2Ao1jC4xzM+o0tW4Zi95sA60/JNhBJ\nl5rZdEm3UWTIdTOblHdwlfA2EOdqS9dhSM5iBsNYwQqGcZkPQ1IzMr0PRNIRZrZI0tHF1pvZ3RXE\nmDsvQJyrLRMnhuqqFtayiDGMYPmWdctoZQyLWccgJk6E22+vYqD9XKb3gcTCYxvgU2Z2d9dHr6N1\nNc/rmLPVX/Nzw4bwdxRLGNZp0lEYygpGsrTTdmn11/ysJd3WOMZpa1slbd9H8TjnGkzXodiTfCj2\n+pbmPpCfAgcBtwKvF9LN7OJ8Q6uMV2E5V1t8KPb6kNdw7hcUSTYz+1o5B+orXoA4V1uKDcU+kqUs\nYZQPxV5DchkLC1hqZl9NPoAnKgvR1ROvY85Wf83PwlDs48ZBczOsYxD3MZ71cSj2ceMqG4q9v+Zn\nLUlzJ/r5wI0p0pxzrqjBg8MVhg/F3li668Z7LPAhwpzlP0+s2hUYaWZj8w+vfF6F5Zxz5ct6LKy/\nAA8Ck4BFifRXgbPLD88551wj6e4+kEfirINvN7NrEo+5ZrauD2N0VeJ1zNny/MyW52f1pRkL682+\nCMQ5V7t8JF1XjE9p65zr1po1YbDDRx4J93IUNDfDYYeFHlSDB1cvPpeNTLvxSro2/p3W28Ccc/Up\nOZLuxo3hHo7x3MtA1rFxI1tG0u3oqHakrhq6u/g8QtLewFRJLZIGJR99FaCrHq9jzlY95ufcueHK\nA8Jd5IsYwwLaWMzhTOcSIKy/+ea+j60e87PRdFeA/BD4LXAgoRdW8vFg/qE556pt5sytVx5nMYMR\nLGdbOhjBcqYxgxbWsnEjXH11tSN11ZBmKJMrzOyzfRRPr3kbiHPZmTAhzB44nntZQBvbsrWuahNN\ntHE39zGeCRNg/vzqxel6L5c50c3ss5IOA94Tk+4xs0crCdA5V1+6jqSbnMvDR9J1PXbAk3QWMBsY\nHB+zJX0+78Bc9Xkdc7bqMT+nTAm9rdbTwmVMYxmtbKKJZbQyg2lbxrOaOrXvY6vH/Gw0acbC+iQw\nzsxeB5B0IfB74Pt5Buacq74TToCLLgq9rS7lbK7h1H8YSfeww8J4Vq7/SdMG8hjwTjPbGJebgQfM\n7JA+iK9s3gbiXLb8PpD+IZc2EGAmcL+km+Ly8cBV5QbnnKtPPpKuKyXVneiSxgDj4+K9ZvZQrlH1\ngl+BZKe9vZ22trZqh9EwPD+z5fmZrbyuQDCzxcDiiqJyzlWdj2Xl8uBjYTnX4LwNw6WRy5zo9cYL\nEOe2KjYf+SiW8DgH+3zkrpPM50SXtI2kBb0Lq+S+l0l6RNJDkv4Y01ok3SnpSUm/lrRbYvvzJT0t\n6QlJ788jJteZ97PPVjXys5bHsuotPz+rr9sCxMw2Ax3JL/IMdQBtZnZ4Ynrc84DfmNkBwHzC3OtI\nGkmYWvcg4FjgcklllZTO9Uc+lpXLU5qL1teAxyRdJemywiODY6vI8Y8DronPryF0GYYwre71ZrbJ\nzJYBTwM1OSd7I/EeLtmqRn5u2BD+jmIJw1jRad1QVjCSpZ22qyd+flZfml5Yc+MjawbcJWkz8CMz\n+wmwh5mtBjCzFyQVmvaGEO5+L1gV05xz3fCxrFye0gymeI2kHYF9zOzJDI99lJk9L2l34E5JTxIK\nlU6Hr2THkydPZvjw4QAMHDiQ0aNHb/m1Uqg39eWel5N1zLUQT70vVyM/x45t5667YP2bbVzGNMZx\nIbuzhrexTxzL6hG22w6mTq1+/pS77Odn7/Nv1qxZAFu+L8uVZiiTjwAXAdub2QhJo4Gvmdmkio5Y\n/BgXEKrKPkloF1ktaU9ggZkdJOk8wMzswrj9HcAFZnZ/kX15L6yMtPuNWpmqRn4W64XVdSyreu2F\n5edntnLpxitpEXAM0G5mh8e0x83s4F4EOgBoMrPXJO0E3Al8FXgvsNbMLpR0LtBiZufFRvTZwDhC\n1dVdwH7FSgovQJzrzO8DcWnkdSf6m2b2cpdOT72dAXkP4CZJFmOYbWZ3SnoQuEHSVGA5oecVZrZU\n0g3AUuBN4AwvJVx/0du7yH0sK5eXNFcgVxGmtj0POBE4C9jOzD6Tf3jl8yuQ7HgVQbYqyU+/eijN\nz89sZX4jYfR5YBTwBvD/gFeA6eWH55wrR0dHKDzuv3/rvRzjuZeBrGPjxpA+aVLYzrlqSD2UiaRd\nCQ3Zr+YbUu/4FYhrFHPmwCmnhMJjOpdwFjMYxgpWMIzLmMalnE1zM8yeHaqznOuNvBrR3wlcDewS\nk14GpprZooqizJkXIK5RTJwI8+aFK49FjOl0D8cyWhnDYtYxiIkT4fbbqxioawh5VWFdRWi0Hm5m\nw4EzCZNMuQaX7Gfveq/c/Gzku8iz4Odn9aUpQDab2b2FBTP7HbApv5Ccc/CPd5En+V3krhaUrMKK\nsxACfALYkdCAbsC/AhvN7Jw+ibBMXoXlGkXXNpBpzGAoK1jJMGZ4G4jLWKZtID0M425mdkw5B+or\nXoC4RtHId5G72uMTSuEFSJa8n33vJW8CXLWqnSFD2sq6CdDvAynNz89s5XInuqSBhGqs4cntzeys\ncgN0rj8p9uX/yCMwfz5cdFG6L3+/i9zVsjTdeBcCfwAeIzGEiZldU/JFVeRXIK4W+FSyrt7kNRZW\nc602mDtXq7pOJVvsJsDCVLLeAO7qVZrfPtdKOl3SXpIGFR65R+aqzvvZV67YVLK/86lkM+XnZ/Wl\nKUD+DnyXMCPgovh4MM+gnKt3fhOg6w/SVGF9AXi7mb2YdzCutngPl8oVm0q2La7zmwCz4edn9aW5\nAvkT4L+TXL+zeTPceGMYk2rChPB3zpx0o99OmRK62q6nhcuYxjJa2UQTy2iNU8m20NwcelM5V6/S\n9MK6iTCc+wLCkO5A7Xbj9V5Y2enP/ex7e/9FsV5YQ5jNSk72XlgZ6c/nZx7y6oV1c3w41y8k5+GA\nLl1wN7ZsmYejuy//pqZQyBQKoXUbB7GOQyBeeRQKIS88XD3zO9Gd6yLLeTg6OvwmQFcf8poP5FnC\nIIqdmNm+5YXXN7wAcb3l83C4/iiv+UDeAbwzPt4DXAZcV354rt701372eXXB7a/5mRfPz+rrsQAx\ns5cSj1VmdikwsQ9ic65XKu1F5fNwOJdOmiqsMYnFJsIVyWfN7LA8A6uUV2E56F0vKp+Hw/VHebWB\nJOcF2QQsAy4ysyfLjrAPeAHiejuQoc/D4fqjXNpAzGxC4vE+Mzu9VgsPl616rWPuOpDhIsawgDYW\nczjTuQRgy0CGxRS64I4bF65Y1jGI+xi/5ea/ceMq64Jbr/lZqzw/qy/NfCA7ACfyj/OBfC2/sFx/\nl5yIqdD9Ne1ETMUGMgS2DGR4DaeybuMgrr66dBWUz8PhXM/SVGHdAbxMGERxcyHdzL6Xb2iV8Sqs\n+tfbu8AnTID2dhjPvSygjW23TmPDJppo427uYzwTJoTJnZxz+d2JPtTMPlhhTM6VJYu7wIsNZFjg\nvaicy06aC/GFkg7JPRJXc6pRx9zb9guo3YEMvc4+W56f1ZemABkPLJL0pKRHJT0m6dG8A3P1qzej\n2BZrv9i2zImYTjghVHUBXMrZjGExbdzN4TzEpZwNhPXHH5/Bm3WuH0vTBtJaLN3MlhdLrzZvA6mu\nWmm/6G0czvU3ubSB1GpB4WpPLbVfeC8q5/Ln/0auk2T10+jR7WVVP9Va+0VTE5x4YhjwcP788DdN\nN+C8eJ19tjw/a4CZNdQjvKX+a9MmsxtuMPvQh8za2sLfG28027y559euXm02bpxZc7MZmMECg7A8\nblxY350PfSi8roWX7BlaCzsxA3uWVmvhJQOziRNL72Pz5nCswktbeMmO4l4byNotaePGpXs/tWbB\nggXVDqGheH5mK353lvV96/OBNJDe1Pv3dvgP8PYL5+pZXsO5uxR60/Moi30k2x8KvZjGcy8DWcfG\njWxpfyi1ryyqn7IaxbbQfnHddZ3zYvbskO6Fh3M1otxLlmo+gA8C/ws8BZxbYpuyL916U+1jVqzq\nx8qq+sliHzfeuPW107nYnqHV3qTJnqHVpnPxln394hfFX1+s+mlBmdVPXWN4NsbwbMoYGp1XuWTL\n8zNbVFCFVfVCIXWg4WrpT0ArsB3wMHBgke3KyrTefnEXq7Mfzz1l1dlnsY/etj+0tYXNx3OPvUmT\nGdgl8fVv0mRHca+B2YQJ5b2PRmm/yMIll1xS7RAaiudntiopQOqpCmss8LSZLTezN4HrgeN6s8Pe\nVvtANlU/Weyjt7PoFat+Wh/Xpa1+ymsU20axfv36njdyqXl+Vl89/SsPgU7fjCtjWsWy+OLO4s7p\nLPbR2/aHYt1nO6Ds7rPefuFc/1FPBUjmsvjizmL+7Cz20dv7J4oN//FDPljR8B+1dv9FrVi2bFm1\nQ2gonp/VVzfdeCW9C/gviyMDSzqPUGd3YZft6uMNOedcjbGsp7StFZK2AZ4E3gs8D/wR+Dcze6Kq\ngTnnXD+VZj6QmmBmmyV9DriTUPV2lRcezjlXPXVzBeKcc662NEyzpqQPSvpfSU9JOrfa8dQ7Scsk\nPSLpIUl/rHY89UbSVZJWJ+fOkdQi6c44t86vJe1WzRjrSYn8vEDSSkmL48NnTk1B0lBJ8yUtifM7\nnRXTyz4/G6IAkdQE/AD4ADAK+DdJB1Y3qrrXAbSZ2eFmNrbawdShmYTzMek84DdmdgAwHzi/z6Oq\nX8XyE+BiMxsTH3f0dVB1ahNwjpmNAt4NnBm/L8s+PxuiACGHmwwdonHOjz5nZr8D1nVJPg64Jj6/\nBvA5EVMqkZ8QzlNXBjN7wcwejs9fA54AhlLB+dkoXxCZ32ToMOAuSQ9IOr3awTSIwWa2GsI/MeC3\nVfbe5yQ9LOknXiVYPknDgdHAH4A9yj0/G6UAcdk7yszGAB8iXOKOr3ZADch7sPTO5cC+ZjYaeAG4\nuMrx1BVJOwNzgGnxSqTr+djj+dkoBcgqYJ/E8tCY5ipkZs/Hv38FbiJUE7reWS1pDwBJewJrqhxP\nXTOzv9rWbqRXAu+sZjz1RNK2hMLjWjO7JSaXfX42SgHyAPB2Sa2Stgc+Ctxa5ZjqlqQB8dcJknYC\n3g88Xt2o6pLoXEd/KzA5Pj8VuKXrC1y3OuVn/JIrOAE/R8txNbDUzGYk0so+PxvmPpDYhW8GW28y\n/HaVQ6pbkkYQrjqMcLPpbM/P8kj6GdAGvAVYDVwA3AzcCAwDlgMnmZkPKZtCifycQKi/D+N+wqcL\ndfiuNElHAfcAjxH+xw34MmF0jxso4/xsmALEOedc32qUKiznnHN9zAsQ55xzFfECxDnnXEW8AHHO\nOVcRL0Ccc85VxAsQ55xzFfECxDnnXEW8AHHOOVcRL0BcTZL0uxz3fZakpZKuLbLu1byOWyKW3SR9\ntodtMs+Lct+npGZJ7ZJKDp8uaTtJd8f5eVw/4Heiu35H0hPAe83sL0XWvWJmu5axL1kv/onicNq3\nmdkheey/m+OW+z7PALYxs+/3sN1XgD+b2c96G6Orff5LwVVVHLjx9jh17qOS/iWmvyrpUzF9saRn\nJP028bqPS7o/rrui2C9jSefEKTsfTUzbeQWwL/ArSdN6iO2mOB/KY5I+GdNa49TJ10h6DBgq6Ssx\n7R5JP5N0TtoYgW8B+8ZtLiyy/2GFq4Vi8SRiWirpx5Iel3SHpB3iuqKx0XlQwjRxfpx0gz/eErd1\n/YGZ+cMfVXsQRlH9UWJ5l/j3lUTatsDdwIfi8oGEkUO3icv/A5zcZb9jgEeAZmAnwkith8V1zwAt\nJeJJHndg/NtMGHiuBWglTAn6zrjuHcBiYDtgZ+Ap4Jw0Mcb0VuDRLstb9p+MqVg8idf8HTgkLv8c\n+Fip2OI2r5aRl9sBf0ksHwVcSpix7v8C/5lY1wSsqfZ55Y++eWzbbeniXP4eAy6S9C3glxamLu3q\nMmC+mc2Ly+8lFBAPxF/LzYQRWpPGAzeZ2UYASXOB9xAKla7DrJcyXVJhWs+hwH7xOMvN7IGYfhRw\ni4WplN+UdFsixiN6iLGU5P57iuePcflZM3ssPl8EDAd2LxEbbJ0sKE1evhUoNirrKjN7QNKW6aPN\nrEPSG5J2MrPX07xZV7+8AHFVZWZPSyrMfPgNSb8xs28U1kuaDAwzszMSLxNwjZn9R15xSToaOAYY\nZ2ZvSFpA+HIFSPvFOKvCGP9h/zGe95aIB+CNxPPNcZ3Rc0GZJi//ljyWmd0n6fxYeOwKbOiy/Q7A\nxh6O6xqAt4G4qpK0F/A3C42u3yX8Go6rNAb4AnByl5f9FvhnSbvHDVsk7dNlm3uB42PvoZ0IVS33\npAkp/t0NWBe/rA8E3lVkG4D7gI9I2kFhEq4Px/T5KWIEeBXYpUQMyeVdgbUl4in2GoCFJWJLbt9j\nXlqYE2IbhcnakLQjWwuNDwHzFOaYQNIg4EUz21wkHtdg/ArEVdshwHcldRDq8T8T0w04k9DusCC2\n6z5oZp8ysyck/Sdwp0KX0b/HbZ8r7NTMHpI0izBbpQE/NrNHE/supbDuDuAzkpYATwK/L7INZvag\npFsJVWOrgUeBl9PEGF+/VtJ9kh4FfkWY57vY3NR3AJ8tEU/R9xRju6VrbMnt08YJ3EmoFpwPjGJr\nYfwaoQ1mSVyeAPyyayyuMXk3Xud6qVDfH3+Z3wOcbmYPVzsuyC42SYcD083s1B62+wVwrpn9qbKI\nXT3xKxDneu/HkkYS6v5n1UrhEWUSW7yiWyCVvi9F0naEjgteePQTfgXinHOuIt6I7pxzriJegDjn\nnKuIFyDOOecq4gWIc865ingB4pxzriJegDjnnKuIFyDOOecq4gWIc865ivx/Bd/JzUDckLMAAAAA\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n_max=20\n", "plt.plot(range(1,n_max+1), [num_faceup(n) + num_facedown(n) for n in range(1,n_max+1)], 'b.', markersize=20)\n", "plt.plot(range(1,n_max+1), [num_total(n) for n in range(1,n_max+1)], 'r.', markersize=10)\n", "plt.xlabel(\"size of large triangle ($n$)\")\n", "plt.ylabel(\"number of triangles in the large triangle\")\n", "plt.title(\"triangles in a triangle composed of smaller triangles\")\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is not exponential, by the way. (Why? Think about it, then read on.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Scaling" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remember that the expression for the solution (for even $n$) is $(2n^3+5n^2+2n)/8$. A-ha! So the asymptotic scaling for this question is $n^3$. This means that when $n$ is very large, there are about $n^3$ triangles contained in the large triangle. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can visualize this with the slope of the log-log plot (it should be about 3 as $n$ gets large)." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n_max=2000\n", "plt.loglog(range(1,n_max+1), [num_faceup(n) + num_facedown(n) for n in range(1,n_max+1)], 'b.', markersize=2)\n", "plt.xlabel(\"size of large triangle ($n$)\")\n", "plt.ylabel(\"number of triangles in the large triangle\")\n", "plt.title(\"triangles in a triangle composed of smaller triangles\")\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### The end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But now you know the answer. Go ahead, draw a small example and ask your friends: \"How many triangles?\" (I've found that $n=4$ is a great example.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![triangles!](http://mathworld.wolfram.com/images/eps-gif/TriangleTilings_551.gif)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "I hope you enjoyed reading this bit on triangles." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's the WolframAlpha page on [Tiling Triangles](http://mathworld.wolfram.com/TriangleTiling.html). Triangle image ($n=1,2,3,4$) belongs to WolframAlpha." ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.11" } }, "nbformat": 4, "nbformat_minor": 0 }