(load "1.22.txt") ; for prime? ; predicate selects which values in the range [a, b] to calculate terms for ; combiner combines terms with accumulated result (define (filtered-accumulate combiner null-value term a next b predicate) (define (iter a result) (if (> a b) result (iter (next a) (if (predicate a) (combiner (term a) result) result)))) (iter a null-value)) (define (gcd a b) (if (= b 0) a (gcd b (remainder a b)))) (define (square x) (* x x)) (define (identity x) x) (define (inc x) (+ x 1)) ; sum of the squares of primes in [a, b] (define (sum-of-squares-of-primes a b) (filtered-accumulate + 0 square a inc b prime?)) (define (relatively-prime? a b) (= (gcd a b) 1)) ; product of intergers < n which are relatively prime to n (define (product-of-coprimes n) (define (coprime? i) (relatively-prime? i n)) (filtered-accumulate * 1 identity 1 inc (- n 1) coprime?))