(defun ! (n) (reduce #'* (loop for i from 1 to n collect i))) (defun C () (* 426880 (rationalize (sqrt 10005)))) (defun M (k) (/ (! (* 6 k)) (! (* 3 k)) (expt (! k) 3))) (defun L (k) (+ (* 545140134 k) 13591409)) (defun X (k) (expt -262537412640768000 k)) (defun pi-fraction (k) (* (C) (/ 1 (loop for i from 0 to k sum (/ (* (M i) (L i)) (X i)))))) (defun power-of-2 (n) (loop for i from 1 when (/= (denominator (/ n (expt 2 i))) 1) return (1- i))) (defun power-of-5 (n) (loop for i from 1 when (/= (denominator (/ n (expt 5 i))) 1) return (1- i))) (defun fract2digits (fract) (let ((p2 (power-of-2 (denominator fract))) (p5 (power-of-5 (denominator fract)))) (round (* fract (expt 10 (+ (max p2 p5) (loop for i from 1 when (zerop (mod (1- (expt 10 i)) (/ (denominator fract) (expt 2 p2) (expt 5 p5)))) return i))))))) (defun 3- (n) (1- (1- (1- n)))) (format t "~a~%" (fract2digits (3- (pi-fraction 10))))