## The Digits of Pi, Again

### June 14, 2013

Here is our version of the algorithm, adapted from work of Brad Lucier and Bakul Shah:

```(define ch-A 13591409) (define ch-B 545140134) (define ch-C 640320) (define ch-C^3 (expt 640320 3)) (define ch-D 12)```

```(define (ch-split a b)   (if (= 1 (- b a))       (let ((g (* (- (* 6 b) 5) (- (* 2 b) 1) (- (* 6 b) 1))))         (list g (quotient (* ch-C^3 (expt b 3)) 24)                 (* (expt -1 b) g (+ (* b ch-B) ch-A))))       (let* ((mid (quotient (+ a b) 2))              (gpq1 (ch-split a mid)) (gpq2 (ch-split mid b))              (g1 (car gpq1)) (p1 (cadr gpq1)) (q1 (caddr gpq1))              (g2 (car gpq2)) (p2 (cadr gpq2)) (q2 (caddr gpq2)))         (list (* g1 g2) (* p1 p2) (+ (* q1 p2) (* q2 g1))))))```

```(define (pi digits)   (let* ((num-terms (inexact->exact (floor (+ 2 (/ digits 14.181647462)))))          (sqrt-C (isqrt (* ch-C (expt 100 digits)))))     (let* ((gpq (ch-split 0 num-terms))            (g (car gpq)) (p (cadr gpq)) (q (caddr gpq)))       (quotient (* p ch-C sqrt-C) (* ch-D (+ q (* p ch-A)))))))```

And here’s a short example:

```> (pi 50) 314159265358979323846264338327950288419716939937510```

We used `isqrt` from the Standard Prelude. You can run the program at http://programmingpraxis.codepad.org/XKfVY5Ua.

The version of the program shown at codepad.org shows the dance of the a and b variables through the calculation. There is something mesmerizing in the way that a and b intertwine around each other, which is one of the reasons I so much enjoy this kind of computational mathematics.

Pages: 1 2