Pi on a Pi for Pi Day

Calculating Pi on a Pi

Here’s a quick and dirty post for Pi Day which uses Python code by David Bau (http://davidbau.com/archives/2010/03/14/python_pipy_spigot.html) to compute pi to an arbitrary number of digits. The code implements a “spigot algorithm” developed by Jeremy Gibbons (http://www.cs.ox.ac.uk/people/jeremy.gibbons/publications/spigot.pdf). This algorithm can generate the nth digit of pi independently from the preceding digits and runs O(n) in time.

In honor of Pi Day, I ran the code on a Raspberry Pi 3. I slightly modified the calling function to write the generated digits to files in batches of 10000. The computations get slower as the decimal place gets larger. I didn’t time the code exactly, but the time stamps on the files written indicate the first 10000 digits took less than 1 minute, the next 10000 took approximately 2 minutes, then 4 minutes, 6 minutes, 8 minutes, 12 minutes, etc…

Sure you could find and download pi from some online source, but it’s much more fun to do it yourself. I’m running it on my Raspberry Pi 3 right now, and plan to write a another quick and dirty project by tomorrow display them in some way for Pi Day.

Modified source code is below (original code on David Bau’s blog)

#Pi digit generator function
def pi_decimal_digits():
  q, r, t, j = 1, 180, 60, 2
  while True:
    u, y = 3*(3*j+1)*(3*j+2), (q*(27*j-12)+5*r)//(5*t)
    yield y
    q, r, t, j = 10*q*j*(2*j-1), 10*u*(q*(5*j-2)+r-y*t), t*u, j+1

#Caller program writes digits to disk in batches of 10000
count, digits = 0, pi_decimal_digits()
n_per_file = 10000
while 1:
  fn = "pidigits_" + str(count+1) + "_to_" + str(count + n_per_file) + ".txt"
  f = open(fn, 'w')
  print "at " + str(count)
  with open(fn, 'w') as f:
    for j in xrange(n_per_file):
      f.write(str(digits.next()))
    f.close()
  count += n_per_file

 

Leave a Comment