; 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)