SICP 1.24 习题答案

这算法,太猛了,Dr Scheme貌似不是微妙级的。
另外,random貌似不支持比整型还大的数,所以偷懒搞一个最大数的随机数得了,反正费马定律顶着。
(define (square x)
  (* x x))

(define (expmod base exp m)
  (cond ((= exp 0) 1)
        ((even? exp)
         (remainder (square (expmod base (/ exp 2) m))
                    m))
        (else
         (remainder (* base (expmod base (- exp 1) m))
                    m))))

(define (fermat-test n)
  (define (try-it a)
    (= (expmod a n n) a))
  (try-it (+ 1 (random 4294967087))))

(define (fast-prime? n times)
  (cond ((= times 0) true)
        ((fermat-test n) (fast-prime? n (- times 1)))
        (else false)))

(define (timed-prime-test n)
  (newline)
  (display n)
  (start-prime-test n (runtime)))
(define (start-prime-test n start-time)
  (if (fast-prime? n 1)
      (report-prime (- (runtime) start-time))))
(define (report-prime elapsed-time)
  (display " *** ")
  (display elapsed-time))

(define (search-for-primes n)
  (timed-prime-test n)
  (cond ((even? n) (search-for-primes (+ n 1)))
        ((not (fast-prime? n 1)) (search-for-primes (+ n 2)))))

(search-for-primes 10000000000000000000000)

你可能感兴趣的:(算法,Scheme)