; euler's sum of products conjecture
(define (euler n) ; brute force
(do ((e 5 (+ e 1))) ((= e n))
(do ((d (- e 1) (- d 1))) ((zero? d))
(do ((c (- d 1) (- c 1))) ((zero? c))
(do ((b (- c 1) (- b 1))) ((zero? b))
(do ((a (- b 1) (- a 1))) ((zero? a))
(when (= (+ (expt a 5) (expt b 5)
(expt c 5) (expt d 5))
(expt e 5))
(display a) (display "^5 + ")
(display b) (display "^5 + ")
(display c) (display "^5 + ")
(display d) (display "^5 = ")
(display e) (display "^5")
(newline))))))))
(euler 145)
(define (euler n) ; cache powers
(let ((cache (make-vector n)))
(do ((i 1 (+ i 1))) ((= i n))
(vector-set! cache i (expt i 5)))
(do ((e 5 (+ e 1))) ((= e n))
(do ((d (- e 1) (- d 1))) ((zero? d))
(do ((c (- d 1) (- c 1))) ((zero? c))
(do ((b (- c 1) (- b 1))) ((zero? b))
(do ((a (- b 1) (- a 1))) ((zero? a))
(when (= (+ (vector-ref cache a)
(vector-ref cache b)
(vector-ref cache c)
(vector-ref cache d))
(vector-ref cache e))
(display a) (display "^5 + ")
(display b) (display "^5 + ")
(display c) (display "^5 + ")
(display d) (display "^5 = ")
(display e) (display "^5")
(newline)))))))))
(euler 145)
(define (euler n) ; short-circuit loops
(let ((cache (make-vector n)))
(do ((i 1 (+ i 1))) ((= i n))
(vector-set! cache i (expt i 5)))
(do ((e 5 (+ e 1))) ((= e n))
(list-of (list a b c d e)
(d range (- e 1) 0)
(c range (- d 1) 0)
(c-sum is
(+ (vector-ref cache c)
(vector-ref cache d)))
(< c-sum (vector-ref cache e))
(b range (- c 1) 0)
(b-sum is
(+ c-sum
(vector-ref cache b)))
(< b-sum (vector-ref cache e))
(a range (- b 1) 0)
(= (+ b-sum (vector-ref cache a))
(vector-ref cache e))
(display a) (display "^5 + ")
(display b) (display "^5 + ")
(display c) (display "^5 + ")
(display d) (display "^5 = ")
(display e) (display "^5")
(newline)))))
(euler 145)