{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Pi Day Fun\n", "March 14, 2016\n", "Updated since." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/jpeg": "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xrG2wuhOY2xYY8Ad+rpD5HY3m899Ywd+rpD5HY3m899YwB73ckmlOofLbZebQ4226UJLqG3S2p1tDhF5KFKaaJSM9UiviiI7SfRSz7QCEz8jJzobJLYm5ZmYDZNKlGtQq4TQZbo8M9+rpD5HY3m899Ywd+rpD5HY3m899YwB74kJNtltDLLaGmm0pQ200hLbbaEiiUIQgBKEgYUELx4A79XSHyOxvN576xg79XSHyOxvN576xgD3/BHgDv1dIfI7G83nvrGDv1dIfI7G83nvrGAPf8EeAO/V0h8jsbzee+sYO/V0h8jsbzee+sYA9/wR4A79XSHyOxvN576xg79XSHyOxvN576xgD3/BHgDv1dIfI7G83nvrGDv1dIfI7G83nvrGAPf8Rn2kZ7s+2FFd0dzdyVvG7qdbr6XMr1/bHhPv1dIfI7G83nvrGDv1dIfI7G83nvrGAPf8EeAO/V0h8jsbzee+sYO/V0h8jsbzee+sYA9/wR4A79XSHyOxvN576xg79XSHyOxvN576xgDzNBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBAH/2Q==", "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo(\"HrRMnzANHHs\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Reference Pi: \n", "
\n",
    "3.14159265358979323846264338327950288419716939937510\n",
    "  58209749445923078164062862089986280348253421170679\n",
    "  82148086513282306647093844609550582231725359408128\n",
    "  48111745028410270193852110555964462294895493038196\n",
    "  44288109756659334461284756482337867831652712019091\n",
    "  45648566923460348610454326648213393607260249141273\n",
    "  72458700660631558817488152092096282925409171536436\n",
    "  78925903600113305305488204665213841469519415116094\n",
    "  33057270365759591953092186117381932611793105118548\n",
    "  07446237996274956735188575272489122793818301194912\n",
    "  98336733624406566430860213949463952247371907021798\n",
    "  60943702770539217176293176752384674818467669405132\n",
    "  00056812714526356082778577134275778960917363717872\n",
    "  14684409012249534301465495853710507922796892589235\n",
    "  42019956112129021960864034418159813629774771309960\n",
    "  51870721134999999837297804995105973173281609631859\n",
    "  50244594553469083026425223082533446850352619311881\n",
    "  71010003137838752886587533208381420617177669147303\n",
    "  59825349042875546873115956286388235378759375195778\n",
    "  18577805321712268066130019278766111959092164201989\n",
    "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The sequence of odd fractions, as a running total, converges to pi/4, albeit slowly...\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.14209240\n" ] } ], "source": [ "from fractions import Fraction\n", "from itertools import count, islice\n", "from decimal import Decimal, localcontext\n", "\n", "def convert(f):\n", " \"\"\"get a Decimal from a Fraction (and multiply by 4)\"\"\"\n", " return (Decimal(f.numerator) / Decimal(f.denominator)) * Decimal(4)\n", "\n", "def pi_series():\n", " \"...converges very slowly\"\n", " denoms = count(1,2) # odd numbers from 1\n", " total = Fraction(1,next(denoms)) # 1/1\n", " while True:\n", " yield total\n", " total -= Fraction(1, next(denoms)) # - 1/3\n", " total += Fraction(1, next(denoms)) # + 1/5 and so on\n", "\n", "def nth(iterable, n, default=None):\n", " \"Returns the nth item or a default value\"\n", " return next(islice(iterable, n, None), default)\n", "\n", "with localcontext() as ctx: # <-- context manager object\n", " ctx.prec = 3000\n", " pi = pi_series()\n", " print(\"{0}\".format(convert(nth(pi, 1000)))[:10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Youtube above describes how to use successive primes in successive terms to build a running product that converges to 2/pi." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541]\n" ] } ], "source": [ "def Primes():\n", " \"\"\"generate successive prime numbers (trial by division)\"\"\"\n", " candidate = 1\n", " _primes_so_far = [2] # first prime, only even prime\n", " yield _primes_so_far[-1]\n", " while True:\n", " candidate += 2 # check odds only from now on\n", " for prev in _primes_so_far:\n", " if prev**2 > candidate:\n", " yield candidate\n", " _primes_so_far.append(candidate)\n", " break\n", " if not divmod(candidate, prev)[1]: # no remainder!\n", " break # done looping\n", "\n", "\n", "p = Primes()\n", "print([next(p) for _ in range(100)]) # next 30 primes please! " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.13702930\n" ] } ], "source": [ "def convert(f):\n", " \"\"\"get a Decimal from a Fraction (and multiply by 4)\"\"\"\n", " return (Decimal(f.denominator) / Decimal(f.numerator))\n", "\n", "def Pi():\n", " primes = Primes()\n", " result = Fraction(1,1)\n", " while True:\n", " p = next(primes)\n", " if divmod(p, 4)[1] == 1:\n", " term = (1 + Fraction(1,p))\n", " else:\n", " term = (1 - Fraction(1,p))\n", " result *= term\n", " yield result\n", " \n", "\n", "with localcontext() as ctx: # <-- context manager object\n", " ctx.prec = 300 # feel free to boost\n", " pi = Pi()\n", " print(\"{0}\".format(convert(nth(pi, 333)))[:10])\n", " # print(\"{0}\".format(convert(nth(pi, 3000)))[:20])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Ramanujan](http://mathforum.org/kb/thread.jspa?threadID=2246748&tstart=0)
\n", "[Pi Contest](http://mathforum.org/kb/thread.jspa?threadID=2246748&tstart=0)\n", "\n", "Below is a famous one from Ramanujan. Why it works I'm not sure anyone knows exactly.\n", "\n", "\n", "\n", "Thanks to [a change in Python 3.8](https://bugs.python.org/issue33083), factorial no longer accepts the Decimal type. I've had to update the code for forward compatibility.\n", "\n", "![formula](ramanujan_formula.jpeg)\n", "\n", "Here's [a corresponding script](https://repl.it/@kurner/computepi) on repl.it." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706\n" ] } ], "source": [ "from math import factorial as fact\n", "def pieinsky():\n", " \"\"\"Ramanujan's: converges relatively quickly\"\"\"\n", " c1 = Decimal(4)\n", " c2 = Decimal(1103)\n", " c3 = Decimal(26390)\n", " c4 = Decimal(396)\n", " c5 = Decimal(9801)\n", " # code formatted for readability (make it be one line)\n", " root8 = Decimal('8').sqrt()\n", " i = Decimal(0)\n", " thesum = Decimal(0)\n", " \n", " while True:\n", " # explicit casts to int create forward compatibility\n", " term = (fact(int(c1*i))*(c2 + c3*i))/(pow(fact(int(i)),4)*pow(c4,4*i))\n", " thesum = thesum + term\n", " yield 1/((root8/c5)*thesum)\n", " i += 1\n", "\n", "with localcontext() as ctx: # <-- context manager object\n", " ctx.prec = 1000\n", " pi = pieinsky()\n", " print(\"{0}\".format(nth(pi, 100))[:100])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The generator below gives successive digits of Pi." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067\n" ] } ], "source": [ "\"\"\"\n", "Another generator example: converging to Pi\n", "\n", "https://mail.python.org/pipermail/edu-sig/2015-September/date.html\n", "\n", "\"\"\"\n", "\n", "def pi():\n", "\n", " k, a, b, a1, b1 = 2, 4, 1, 12, 4\n", " while True:\n", " p, q, k = k*k, 2*k+1, k+1\n", " a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1\n", " d, d1 = a/b, a1/b1\n", " while d == d1:\n", " yield int(d)\n", " a, a1 = 10*(a%b), 10*(a1%b1)\n", " d, d1 = a/b, a1/b1\n", "\n", "if __name__ == \"__main__\": \n", " the_gen = pi()\n", " for _ in range(100):\n", " print(next(the_gen),end=\"\")\n", " print()\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "gen = pi()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "generator" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(gen)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "next(gen)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "next(gen)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![giphy pi day](https://media.giphy.com/media/yLmlkXeMCrrW0/giphy.gif)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This I-Python Notebook is by Kirby Urner, copyleft MIT License, March 2016." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.3" } }, "nbformat": 4, "nbformat_minor": 4 }