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