题目给出的过程如下
(define (timed-prime-test n)
(newline )
(display n )
(start-prime-test n (runtime)))
(define (start-prime-test n start-time)
(if (prime? n)
(report-prime(- (runtime) start-time))))
(define(report-prime elapsed-time)
(display "***")
(display elapsed-time))
我们需要构造一个完整的search-for-primes过程
#lang racket
(define (square x) (* x x))
(define (runtime) ( current-inexact-milliseconds ))
(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 (timed-prime-test n)
(start-prime-test n (runtime)))
(define (start-prime-test n start-time)
(if (prime? n)
(begin (report-prime n (- (runtime) start-time)) #t) #f))
(define(report-prime n elapsed-time)
(newline)
(display n)
(display " usetime ")
(display elapsed-time))
(define (search-for-primes n count)
(cond((= count 0) n )
((timed-prime-test n) (search-for-primes (+ n 1) (- count 1)))
(else (search-for-primes (+ n 1) count))))
(search-for-primes 1000 3)
(search-for-primes 10000 3)
(search-for-primes 100000 3)
(search-for-primes 1000000 3)
(search-for-primes 10000000 3)
现在的机器运行效率都太高了,运行结果不是很明显。
以下为运行结果:
1009 usetime 0.0
1013 usetime 0.0
1019 usetime 0.01020
10007 usetime 0.0
10009 usetime 0.0
10037 usetime 0.010038
100003 usetime 0.0
100019 usetime 0.0
100043 usetime 0.0100044
1000003 usetime 0.0
1000033 usetime 0.0
1000037 usetime 0.01000038
10000019 usetime 0.0
10000079 usetime 0.0
10000103 usetime 0.010000104
按照这个结果不是很好能体现结果之间的时间差为√10,也不是很好能说明运行的时间正比于计算所需的步数。所以我加大了计算的次数,用以下数做实验
(search-for-primes 1000000000 3)
(search-for-primes 10000000000 3)
(search-for-primes 100000000000 3)
(search-for-primes 1000000000000 3)
(search-for-primes 10000000000000 3)
结果
1000000007 usetime 1.99853515625
1000000009 usetime 2.99755859375
1000000021 usetime 1.9982910156251000000022
10000000019 usetime 8.99462890625
10000000033 usetime 6.995361328125
10000000061 usetime 5.99584960937510000000062
100000000003 usetime 25.984130859375
100000000019 usetime 74.956787109375
100000000057 usetime 27.984130859375100000000058
1000000000039 usetime 88.948974609375
1000000000061 usetime 88.94873046875
1000000000063 usetime 70.95996093751000000000064
10000000000037 usetime 254.852783203125
10000000000051 usetime 248.857177734375
10000000000099 usetime 242.87036132812510000000000100
这样的计算结果基本符合每增加10倍的n值,计算时长也会增加√10≈3.16倍。
关于运行时间正比于计算所需步数的说法也进行了验证,几乎每次都会出现后面的数反而比前面数计算时间要短的情况,还不知道具体的原因,
但是就目前的情况来看,我得到的结果不符合这种说法。