(define (ramanujan n) (let lp ((w 0) (b0 1) (n n)) (if (> n 0) (let ((w (+ w 1))) (let lp2 ((b0 b0)) (if (< (+ 1 (* b0 b0 b0)) w) (lp2 (+ b0 1)) (let lp3 ((a 1) (a3 1) (b b0) (b3 (* b0 b0 b0)) (count 0)) (if (<= a b) (let ((s (+ a3 b3))) (cond ((< s w) (let ((aa (+ a 1))) (lp3 aa (* aa aa aa) b b3 count))) ((= s w) (let ((count (+ count 1))) (if (> count 1) (lp w b0 (- n 1)) (let* ((b (- b 1)) (b3 (* b b b))) (lp3 a a3 b b3 count))))) (else (let* ((b (- b 1)) (b3 (* b b b))) (lp3 a a3 b b3 count))))) (lp w b0 n)))))) w))) (pk (ramanujan 20))