#
General accumulation
^{
}

You can obtain an even more general version of
`accumulate`

(exercise
1.32
) by introducing the notion of a filter on the terms to be combined. That is, combine only those terms derived from values in the range that satisfy a specified condition. The resulting
`filtered-accumulate`

abstraction takes the same arguments as
`accumulate`

, together with an additional predicate of one argument that specifies the filter. Write
`filtered-accumulate`

as a procedure. Show how to express the following using
`filtered-accumulate`

:

a. the sum of the squares of the prime numbers in the interval
`a`

to
`b`

(assuming that you have a
`prime?`

predicate already written)

b. the product of all the positive integers less than
`n`

that are relatively prime to
`n`

(i.e., all positive integers
`i < n`

such that GCD
`(i, n) = 1`

).

```
(define (inc n) (+ n 1))
(define (square x) (* x x))
(define (identity x) x)
(check-equal? (filtered-accumulate * 1 square 1 inc 3 odd?) 9)
(check-equal? (filtered-accumulate * 1 identity 3 inc 5 odd?) 15)
(check-equal? (filtered-accumulate + 0 identity 1 inc 10 odd?) 25)
```