46 lines
1.2 KiB
Scheme
46 lines
1.2 KiB
Scheme
;;; -*-Scheme-*-
|
|
|
|
(define (sqrt-of a base)
|
|
(do ((old 0) (xn (* a base base)) (an (* a base base)))
|
|
((equal? old xn) xn)
|
|
(begin
|
|
(set! old xn)
|
|
(set! xn (quotient (+ xn (quotient an xn)) 2)))))
|
|
|
|
; pi = 9801/(sqrt(8) * sum(...))
|
|
(define (rama base)
|
|
(define (step n)
|
|
(quotient (* base (* (fact (* 4 n)) (+ 1103 (* 26390 n))))
|
|
(* (expt (fact n) 4) (expt 396 (* 4 n)))))
|
|
(do ((i 0 (+ i 1))
|
|
(sum 0 (+ sum delta))
|
|
(delta 1 (step i)))
|
|
((zero? delta)
|
|
sum)))
|
|
|
|
(define (calc-pi-ramanujan base)
|
|
(quotient (* base base base 9801) (* (sqrt-of 8 base) (rama base))))
|
|
|
|
(define (fact n)
|
|
(let f ((i n) (a 1))
|
|
(if (zero? i)
|
|
a
|
|
(f (- i 1) (* a i)))))
|
|
|
|
(define (square x) (* x x))
|
|
|
|
(define base
|
|
(let ((d (format #t "How many decimals of pi do you want (0 to exit): "))
|
|
(num (read)))
|
|
(if (and (not (eof-object? num)) (positive? num))
|
|
(let* ((extra (+ 5 (truncate (log num)))))
|
|
(cons (expt 10 (+ num extra)) extra))
|
|
#f)))
|
|
|
|
(define (print-pi pi base)
|
|
(format #t "~a.~a~%"
|
|
(quotient pi (car base))
|
|
(quotient (remainder pi (car base)) (expt 10 (cdr base)))))
|
|
|
|
(if base (print-pi (calc-pi-ramanujan (car base)) base))
|