Skip to content

Instantly share code, notes, and snippets.

@deeplook
Created February 13, 2013 20:16
Show Gist options
  • Save deeplook/4947835 to your computer and use it in GitHub Desktop.
Save deeplook/4947835 to your computer and use it in GitHub Desktop.

Revisions

  1. deeplook created this gist Feb 13, 2013.
    22 changes: 22 additions & 0 deletions pi_digits.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,22 @@
    """
    Run the algorithm below using CPython, Cython, PyPy and Numba and compare
    their performance. (This is implementing a spigot algorithm by A. Sale,
    D. Saada, S. Rabinowitz, mentioned on
    http://mail.python.org/pipermail/edu-sig/2012-December/010721.html).
    """

    def pi_digits(n):
    "Generate n digits of Pi."
    k, a, b, a1, b1 = 2, 4, 1, 12, 4
    while n > 0:
    p, q, k = k * k, 2 * k + 1, k + 1
    a, b, a1, b1 = a1, b1, p * a + q * a1, p * b + q * b1
    d, d1 = a / b, a1 / b1
    while d == d1 and n > 0:
    yield int(d)
    n -= 1
    a, a1 = 10 * (a % b), 10 * (a1 % b1)
    d, d1 = a / b, a1 / b1

    # >>> list(pi_digits(20))
    # [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3, 8, 4]