; taxicab numbers
(define (root3 n)
(let loop ((u n))
(let* ((s u)
(t (+ (+ s s) (quotient n (* s s))))
(u (quotient t 3)))
(if (< u s) (loop u) s))))
(define (cubes n)
(let loop ((x 0) (y (root3 n)) (zs (list)))
(let ((s (+ (* x x x) (* y y y))))
(cond ((< y x) (reverse zs))
((< s n) (loop (+ x 1) y zs))
((< n s) (loop x (- y 1) zs))
(else (loop (+ x 1) (- y 1)
(cons (list x y) zs)))))))
(let loop ((n 1))
(if (< 1 (length (cubes n)))
(begin (display n) (display ": ")
(display (cubes n)) (newline))
(loop (+ n 1))))