■
問題 1.22
(define (search-for-primes n) (if (even? n) (search-for-primes-iter (+ n 1) 3) (search-for-primes-iter n 3))) (define (search-for-primes-iter x count) (if (> count 0) (begin (timed-prime-test x) (search-for-primes-iter (+ x 2) (if (prime? x) (- count 1) count))))) (define (timed-prime-test n) (newline) (display n) (start-prime-test n (get-internal-run-time))) (define (start-prime-test n start-time) (if (prime? n) (report-prime (- (get-internal-run-time) start-time)))) (define (report-prime elapsed-time) (display " *** ") (display elapsed-time)) (define (prime? n) (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 (square x) (* x x)) (define (divides? a b) (= (remainder b a) 0)) (= n (smallest-divisor n)))
記載通りの100000と1000000でやると値が小さすぎて比較にならなかったので「1000000000」とその10倍の「10000000000」で比較したらそれぞれ17と57(get-internal-run-time値の差であり、秒数ではない)となった。17*√10は53.75だから誤差率は5.6%くらい。まぁ表示系統に時間が掛かってるし、そこまで悪い誤差じゃないかな?