#lang sicp (define (filtered-accumulate combiner null-value term a next b pred?) (define (iter a result) (cond ((> a b) result) ((pred? a) (iter (next a) (combiner result (term a)))) (else (iter (next a) result)))) (iter a null-value)) (define (square x) (* x x)) (define (smallest-divisor n) (find-divisor n 2)) (define (find-divisor n test-divisor) (cond ((> (square test-divisor) n) n) ((divides? test-divisor n) test-divisor) (else (find-divisor n (+ test-divisor 1))))) (define (divides? a b) (= (remainder b a) 0)) (define (prime? n) (= n (smallest-divisor n))) (define (prime-square-sum a b) (filtered-accumulate + 0 square a inc b prime?)) (define (gcd a b) (if (= b 0) a (gcd b (remainder a b)))) (define (rel-prime-product n) (define (rel-prime-n? i) (= (gcd i n) 1)) (filtered-accumulate * 1 identity 1 inc n rel-prime-n?))