ウォンツテック

そでやまのーと

問題 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%くらい。まぁ表示系統に時間が掛かってるし、そこまで悪い誤差じゃないかな?