28 lines
999 B
Text
28 lines
999 B
Text
; triples generator based on Euclid's formula, creates lazy list
|
|
(define (euclid-formula max)
|
|
(let loop ((a 3) (b 4) (c 5) (tail #null))
|
|
(if (<= (+ a b c) max)
|
|
(cons (tuple a b c) (lambda ()
|
|
(let ((d (- b)) (z (- a)))
|
|
(loop (+ a d d c c) (+ a a d c c) (+ a a d d c c c) (lambda ()
|
|
(loop (+ a b b c c) (+ a a b c c) (+ a a b b c c c) (lambda ()
|
|
(loop (+ z b b c c) (+ z z b c c) (+ z z b b c c c) tail))))))))
|
|
tail)))
|
|
|
|
; let's do calculations
|
|
(define (calculate max)
|
|
(let loop ((p 0) (t 0) (ll (euclid-formula max)))
|
|
(cond
|
|
((null? ll)
|
|
(cons p t))
|
|
((function? ll)
|
|
(loop p t (ll)))
|
|
(else
|
|
(let ((triple (car ll)))
|
|
(loop (+ p 1) (+ t (div max (apply + triple)))
|
|
(cdr ll)))))))
|
|
|
|
; print values for 10..100000
|
|
(for-each (lambda (max)
|
|
(print max ": " (calculate max)))
|
|
(map (lambda (n) (expt 10 n)) (iota 6 1)))
|