Code Review

Compare your solutions

    #| Для этого упражнения нет проверок.
Любое решение будет считаться успешным ответом. |#
(define (square x)
  (* x x))

(define (divides? a b)
  (= (remainder b a) 0))

(define (next d)
  (if (= d 2) 3
      (+ d 2)))

(define (smallest-divisor n)
  (define (find-divisor test-divisor)
    (cond ((> (square test-divisor) n) n)
          ((divides? test-divisor n) test-divisor)
          (else (find-divisor (next test-divisor)))))
  (find-divisor 2))

(define (prime-0? n)
  (= n (smallest-divisor n)))


(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))))

(require math/base)

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

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

(define (prime? n)
  (if (even? n)
      (= n 2)
      (fast-prime? n 50)))

(require rackunit)
(check-true (prime? 2))
(check-true (prime? 3))
(check-false (prime? 4))
(check-true (prime? 5))
(check-false (prime? 6))
(check-true (prime? 7))
;(check-false (prime? 561))
;(check-false (prime? 1105))
;(check-false (prime? 1729))


(define runtime current-milliseconds)

(define (timed-prime-test n)
  ;(newline)
  ;(display n)
  (start-prime-test n (runtime)))

(define (start-prime-test n start-time)
  (if (fast-prime? n 50)
      (report-prime n (- (runtime) start-time))
      #f))

(define (report-prime n elapsed-time)
  (display n)
  (display " *** ")
  (display elapsed-time)
  (newline))

(define (search-for-primes from count)
  (timed-prime-test from)
  (if (= count 0)
      "done"
      (search-for-primes (+ from 2) (- count 1))))