39 lines
1.1 KiB
Scheme
39 lines
1.1 KiB
Scheme
#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?))
|