問題1.23

変更点

(define (next-tester n)
  (if (= n 2)
	  3
	  (+ n 2)))
(define (find-divisor n test-divisor)
  (cond ((> (square test-divisor) n) n)
		((divides? test-divisor n) test-divisor)
		(else (find-divisor n (next-tester test-divisor)))))

テスト。

  • 1,000

1009 *** 1.8835067749023437e-5
1013 *** 1.8835067749023437e-5
1019 *** 1.9073486328125e-5

  • 10,000

10007 *** 5.0067901611328125e-5
10009 *** 4.982948303222656e-5
10037 *** 4.982948303222656e-5

  • 100,000

100043 *** 1.8596649169921875e-4
100019 *** 1.499652862548828e-4
100003 *** 1.4901161193847656e-4

  • 1,000,000

1000003 *** 4.6706199645996094e-4
1000033 *** 4.570484161376953e-4
1000037 *** 5.970001220703125e-4

前問との比較。

n Conv Improved Ratio
1,000 2.74e-5 1.89e-5 1.45
10,000 5.30e-5 4.99e-5 1.06
100,000 2.40e-4 1.62e-4 1.48
1,000,000 8.44e-4 4.85e-4 1.74

確かに、2倍にはならない。とすると、誤差って何だろう? テスト数は確かにほぼ半分になってるはずなのだが。