Code Review

Compare your solutions

    #| BEGIN (Введите свое решение) |#
(define (runtime) (current-milliseconds))

(define (square x) (* x x))

(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 (next test-divisor)))))

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

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

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

(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))
#| END |#
    #| BEGIN (Введите свое решение) |#
; !Важное уточнение! В связи с низкой точностью возвращаемого результата у runtime в реализации LISP'а от MIT, для получения видимого результата будет повторение 1000 раз. Изменена процедура start-prime-test

(define (square x) (* x x))

(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 (next test-divisor)))))

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

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

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

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

(define (start-prime-test n start-time)
  (define (loop i k)
    (if (= i k)
        (report-prime (- (runtime) start-time))
        (begin
          (prime? n)
          (loop (+ i 1) k))))
  (if (prime? n)
      (loop 1 1000)
      #f))

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

; Тесты
(define (assert condition message)
  (if (not condition)
      (error message)))

(assert (= (next 2) 3) "1 test failed")
(assert (= (next 4) 6) "2 test failed")
(assert (= (smallest-divisor 4) 2) "3 test failed")
(assert (= (smallest-divisor 5) 5) "4 test failed")
(display "Tests passed")
(newline)

; Ожидаемое изменение времени выполнения: уменьшение в 2 раза

; (timed-prime-test 1009) 1009 *** 3.9999999999999994e-2
; (timed-prime-test 1013) 1013 *** .03
; (timed-prime-test 1019) 1019 *** .03
#|
Старое среднее: 0.05
Новое среднее: 0.0(3)
Отношение: 1.5
Вывод: Отклонение от ожидаемого значения
|#

; (timed-prime-test 10007) 10007 *** .11000000000000001
; (timed-prime-test 10009) 10009 *** .1
; (timed-prime-test 10037) 10037 *** .09999999999999998
#|
Старое среднее: 0.16(3)
Новое среднее: 0.10(3)
Отношение: 1.5806...
Вывод: Аналогично предыдущему выводу
|#

; (timed-prime-test 100003) 100003 *** .31
; (timed-prime-test 100019) 100019 *** .31000000000000005
; (timed-prime-test 100043) 100043 *** .31000000000000005
#|
Старое среднее: 0.52
Новое среднее: 0.31
Отношение: 1.6774...
Вывод: Отклонение незначительно уменьшилось относительно предыдущих, но все еще существенно
|#

; (timed-prime-test 1000003) 1000003 *** 1.01
; (timed-prime-test 1000033) 1000033 *** .98
; (timed-prime-test 1000037) 1000037 *** .9899999999999998
#|
Старое среднее: 1.57
Новое среднее: 0.99(3)
Отношение: 1.5805...
Вывод: Относительно предыдущих вычислений отклонение не сильно изменилось
|#

#|
Вывод: Ожидания не подтвердились, новые измерения стали в среднем в 1.5846... раз меньше по времени. Это объясняется тем, что:

  1.  оптимизация уменьшает число проверок делителей примерно вдвое, но не устраняет накладные расходы, не зависящие от количества делителей (вызовы, проверки условий, арифметика, измерение времени);
  2.  добавляется стоимость вычисления next;
  3.  есть шум измерения и особенности runtime.
|#

#| END |#
    #| BEGIN (Введите свое решение) |#
(define (runtime) (current-milliseconds))

(define (square x) (* x x))

(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 (next test-divisor)))))

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

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

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

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

(define (report-prime elapsed-time)
  (display " *** ")
  (display elapsed-time))
#| END |#
    #| BEGIN (Введите свое решение) |#
; !Важное уточнение! В связи с низкой точностью возвращаемого результата у runtime в реализации LISP'а от MIT, для получения видимого результата будет повторение 1000 раз. Изменена процедура start-prime-test

(define (square x) (* x x))

(define (runtime) (current-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 (next test-divisor)))))

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

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

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

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

(define (start-prime-test n start-time)
  (define (loop i k)
    (if (= i k)
        (report-prime (- (runtime) start-time))
        (begin
          (prime? n)
          (loop (+ i 1) k))))
  (if (prime? n)
      (loop 1 1000)
      #f))

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

; Тесты
(define (assert condition message)
  (if (not condition)
      (error message)))

(assert (= (next 2) 3) "1 test failed")
(assert (= (next 4) 6) "2 test failed")
(assert (= (smallest-divisor 4) 2) "3 test failed")
(assert (= (smallest-divisor 5) 5) "4 test failed")
(display "Tests passed")
(newline)

; Ожидаемое изменение времени выполнения: уменьшение в 2 раза

; (timed-prime-test 1009) 1009 *** 3.9999999999999994e-2
; (timed-prime-test 1013) 1013 *** .03
; (timed-prime-test 1019) 1019 *** .03
#|
Старое среднее: 0.05
Новое среднее: 0.0(3)
Отношение: 1.5
Вывод: Отклонение от ожидаемого значения
|#

; (timed-prime-test 10007) 10007 *** .11000000000000001
; (timed-prime-test 10009) 10009 *** .1
; (timed-prime-test 10037) 10037 *** .09999999999999998
#|
Старое среднее: 0.16(3)
Новое среднее: 0.10(3)
Отношение: 1.5806...
Вывод: Аналогично предыдущему выводу
|#

; (timed-prime-test 100003) 100003 *** .31
; (timed-prime-test 100019) 100019 *** .31000000000000005
; (timed-prime-test 100043) 100043 *** .31000000000000005
#|
Старое среднее: 0.52
Новое среднее: 0.31
Отношение: 1.6774...
Вывод: Отклонение незначительно уменьшилось относительно предыдущих, но все еще существенно
|#

; (timed-prime-test 1000003) 1000003 *** 1.01
; (timed-prime-test 1000033) 1000033 *** .98
; (timed-prime-test 1000037) 1000037 *** .9899999999999998
#|
Старое среднее: 1.57
Новое среднее: 0.99(3)
Отношение: 1.5805...
Вывод: Относительно предыдущих вычислений отклонение не сильно изменилось
|#

#|
Вывод: Ожидания не подтвердились, новые измерения стали в среднем в 1.5846... раз меньше по времени. Это объясняется тем, что:

  1.  оптимизация уменьшает число проверок делителей примерно вдвое, но не устраняет накладные расходы, не зависящие от количества делителей (вызовы, проверки условий, арифметика, измерение времени);
  2.  добавляется стоимость вычисления next;
  3.  есть шум измерения и особенности runtime.
|#

#| END |#
    #| BEGIN (Введите свое решение) |#
; !Важное уточнение! В связи с низкой точностью возвращаемого результата у runtime в реализации LISP'а от MIT, для получения видимого результата будет повторение 1000 раз. Изменена процедура start-prime-test

(define (square x) (* x x))

(define (runtime) (current-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 (next test-divisor)))))

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

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

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

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

(define (start-prime-test n start-time)
  (define (loop i k)
    (if (= i k)
        (report-prime (- (runtime) start-time))
        (begin
          (prime? n)
          (loop (+ i 1) k))))
  (if (prime? n)
      (loop 1 1000)
      #f))

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

; Ожидаемое изменение времени выполнения: уменьшение в 2 раза

; (timed-prime-test 1009) 1009 *** 3.9999999999999994e-2
; (timed-prime-test 1013) 1013 *** .03
; (timed-prime-test 1019) 1019 *** .03
#|
Старое среднее: 0.05
Новое среднее: 0.0(3)
Отношение: 1.5
Вывод: Отклонение от ожидаемого значения
|#

; (timed-prime-test 10007) 10007 *** .11000000000000001
; (timed-prime-test 10009) 10009 *** .1
; (timed-prime-test 10037) 10037 *** .09999999999999998
#|
Старое среднее: 0.16(3)
Новое среднее: 0.10(3)
Отношение: 1.5806...
Вывод: Аналогично предыдущему выводу
|#

; (timed-prime-test 100003) 100003 *** .31
; (timed-prime-test 100019) 100019 *** .31000000000000005
; (timed-prime-test 100043) 100043 *** .31000000000000005
#|
Старое среднее: 0.52
Новое среднее: 0.31
Отношение: 1.6774...
Вывод: Отклонение незначительно уменьшилось относительно предыдущих, но все еще существенно
|#

; (timed-prime-test 1000003) 1000003 *** 1.01
; (timed-prime-test 1000033) 1000033 *** .98
; (timed-prime-test 1000037) 1000037 *** .9899999999999998
#|
Старое среднее: 1.57
Новое среднее: 0.99(3)
Отношение: 1.5805...
Вывод: Относительно предыдущих вычислений отклонение не сильно изменилось
|#

#|
Вывод: Ожидания не подтвердились, новые измерения стали в среднем в 1.5846... раз меньше по времени. Это объясняется тем, что:

  1.  оптимизация уменьшает число проверок делителей примерно вдвое, но не устраняет накладные расходы, не зависящие от количества делителей (вызовы, проверки условий, арифметика, измерение времени);
  2.  добавляется стоимость вычисления next;
  3.  есть шум измерения и особенности runtime.
|#

#| END |#
    #| BEGIN (Введите свое решение) |#
(define (runtime) (current-milliseconds))

(define (square x) (* x x))

(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 (next test-divisor)))))

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

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

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

(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))
#| END |#
    #| BEGIN (Введите свое решение) |#
; !Важное уточнение! В связи с низкой точностью возвращаемого результата у runtime в реализации LISP'а от MIT, для получения видимого результата будет повторение 1000 раз. Изменена процедура start-prime-test

(define (square x) (* x x))

(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 (next test-divisor)))))

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

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

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

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

(define (start-prime-test n start-time)
  (define (loop i k)
    (if (= i k)
        (report-prime (- (runtime) start-time))
        (begin
          (prime? n)
          (loop (+ i 1) k))))
  (if (prime? n)
      (loop 1 1000)
      #f))

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

; Тесты
(define (assert condition message)
  (if (not condition)
      (error message)))

(assert (= (next 2) 3) "1 test failed")
(assert (= (next 4) 6) "2 test failed")
(assert (= (smallest-divisor 4) 2) "3 test failed")
(assert (= (smallest-divisor 5) 5) "4 test failed")
(display "Tests passed")
(newline)

; Ожидаемое изменение времени выполнения: уменьшение в 2 раза

; (timed-prime-test 1009) 1009 *** 3.9999999999999994e-2
; (timed-prime-test 1013) 1013 *** .03
; (timed-prime-test 1019) 1019 *** .03
#|
Старое среднее: 0.05
Новое среднее: 0.0(3)
Отношение: 1.5
Вывод: Отклонение от ожидаемого значения
|#

; (timed-prime-test 10007) 10007 *** .11000000000000001
; (timed-prime-test 10009) 10009 *** .1
; (timed-prime-test 10037) 10037 *** .09999999999999998
#|
Старое среднее: 0.16(3)
Новое среднее: 0.10(3)
Отношение: 1.5806...
Вывод: Аналогично предыдущему выводу
|#

; (timed-prime-test 100003) 100003 *** .31
; (timed-prime-test 100019) 100019 *** .31000000000000005
; (timed-prime-test 100043) 100043 *** .31000000000000005
#|
Старое среднее: 0.52
Новое среднее: 0.31
Отношение: 1.6774...
Вывод: Отклонение незначительно уменьшилось относительно предыдущих, но все еще существенно
|#

; (timed-prime-test 1000003) 1000003 *** 1.01
; (timed-prime-test 1000033) 1000033 *** .98
; (timed-prime-test 1000037) 1000037 *** .9899999999999998
#|
Старое среднее: 1.57
Новое среднее: 0.99(3)
Отношение: 1.5805...
Вывод: Относительно предыдущих вычислений отклонение не сильно изменилось
|#

#|
Вывод: Ожидания не подтвердились, новые измерения стали в среднем в 1.5846... раз меньше по времени. Это объясняется тем, что:

  1.  оптимизация уменьшает число проверок делителей примерно вдвое, но не устраняет накладные расходы, не зависящие от количества делителей (вызовы, проверки условий, арифметика, измерение времени);
  2.  добавляется стоимость вычисления next;
  3.  есть шум измерения и особенности runtime.
|#

#| END |#
    #| BEGIN (Введите свое решение) |#
(define (runtime) (current-milliseconds))

(define (square x) (* x x))

(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 (next test-divisor)))))

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

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

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

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

(define (report-prime elapsed-time)
  (display " *** ")
  (display elapsed-time))
#| END |#
    #| BEGIN (Введите свое решение) |#
; !Важное уточнение! В связи с низкой точностью возвращаемого результата у runtime в реализации LISP'а от MIT, для получения видимого результата будет повторение 1000 раз. Изменена процедура start-prime-test

(define (square x) (* x x))

(define (runtime) (current-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 (next test-divisor)))))

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

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

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

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

(define (start-prime-test n start-time)
  (define (loop i k)
    (if (= i k)
        (report-prime (- (runtime) start-time))
        (begin
          (prime? n)
          (loop (+ i 1) k))))
  (if (prime? n)
      (loop 1 1000)
      #f))

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

; Тесты
(define (assert condition message)
  (if (not condition)
      (error message)))

(assert (= (next 2) 3) "1 test failed")
(assert (= (next 4) 6) "2 test failed")
(assert (= (smallest-divisor 4) 2) "3 test failed")
(assert (= (smallest-divisor 5) 5) "4 test failed")
(display "Tests passed")
(newline)

; Ожидаемое изменение времени выполнения: уменьшение в 2 раза

; (timed-prime-test 1009) 1009 *** 3.9999999999999994e-2
; (timed-prime-test 1013) 1013 *** .03
; (timed-prime-test 1019) 1019 *** .03
#|
Старое среднее: 0.05
Новое среднее: 0.0(3)
Отношение: 1.5
Вывод: Отклонение от ожидаемого значения
|#

; (timed-prime-test 10007) 10007 *** .11000000000000001
; (timed-prime-test 10009) 10009 *** .1
; (timed-prime-test 10037) 10037 *** .09999999999999998
#|
Старое среднее: 0.16(3)
Новое среднее: 0.10(3)
Отношение: 1.5806...
Вывод: Аналогично предыдущему выводу
|#

; (timed-prime-test 100003) 100003 *** .31
; (timed-prime-test 100019) 100019 *** .31000000000000005
; (timed-prime-test 100043) 100043 *** .31000000000000005
#|
Старое среднее: 0.52
Новое среднее: 0.31
Отношение: 1.6774...
Вывод: Отклонение незначительно уменьшилось относительно предыдущих, но все еще существенно
|#

; (timed-prime-test 1000003) 1000003 *** 1.01
; (timed-prime-test 1000033) 1000033 *** .98
; (timed-prime-test 1000037) 1000037 *** .9899999999999998
#|
Старое среднее: 1.57
Новое среднее: 0.99(3)
Отношение: 1.5805...
Вывод: Относительно предыдущих вычислений отклонение не сильно изменилось
|#

#|
Вывод: Ожидания не подтвердились, новые измерения стали в среднем в 1.5846... раз меньше по времени. Это объясняется тем, что:

  1.  оптимизация уменьшает число проверок делителей примерно вдвое, но не устраняет накладные расходы, не зависящие от количества делителей (вызовы, проверки условий, арифметика, измерение времени);
  2.  добавляется стоимость вычисления next;
  3.  есть шум измерения и особенности runtime.
|#

#| END |#
    #| BEGIN (Введите свое решение) |#
; !Важное уточнение! В связи с низкой точностью возвращаемого результата у runtime в реализации LISP'а от MIT, для получения видимого результата будет повторение 1000 раз. Изменена процедура start-prime-test

(define (square x) (* x x))

(define (runtime) (current-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 (next test-divisor)))))

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

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

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

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

(define (start-prime-test n start-time)
  (define (loop i k)
    (if (= i k)
        (report-prime (- (runtime) start-time))
        (begin
          (prime? n)
          (loop (+ i 1) k))))
  (if (prime? n)
      (loop 1 1000)
      #f))

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

; Ожидаемое изменение времени выполнения: уменьшение в 2 раза

; (timed-prime-test 1009) 1009 *** 3.9999999999999994e-2
; (timed-prime-test 1013) 1013 *** .03
; (timed-prime-test 1019) 1019 *** .03
#|
Старое среднее: 0.05
Новое среднее: 0.0(3)
Отношение: 1.5
Вывод: Отклонение от ожидаемого значения
|#

; (timed-prime-test 10007) 10007 *** .11000000000000001
; (timed-prime-test 10009) 10009 *** .1
; (timed-prime-test 10037) 10037 *** .09999999999999998
#|
Старое среднее: 0.16(3)
Новое среднее: 0.10(3)
Отношение: 1.5806...
Вывод: Аналогично предыдущему выводу
|#

; (timed-prime-test 100003) 100003 *** .31
; (timed-prime-test 100019) 100019 *** .31000000000000005
; (timed-prime-test 100043) 100043 *** .31000000000000005
#|
Старое среднее: 0.52
Новое среднее: 0.31
Отношение: 1.6774...
Вывод: Отклонение незначительно уменьшилось относительно предыдущих, но все еще существенно
|#

; (timed-prime-test 1000003) 1000003 *** 1.01
; (timed-prime-test 1000033) 1000033 *** .98
; (timed-prime-test 1000037) 1000037 *** .9899999999999998
#|
Старое среднее: 1.57
Новое среднее: 0.99(3)
Отношение: 1.5805...
Вывод: Относительно предыдущих вычислений отклонение не сильно изменилось
|#

#|
Вывод: Ожидания не подтвердились, новые измерения стали в среднем в 1.5846... раз меньше по времени. Это объясняется тем, что:

  1.  оптимизация уменьшает число проверок делителей примерно вдвое, но не устраняет накладные расходы, не зависящие от количества делителей (вызовы, проверки условий, арифметика, измерение времени);
  2.  добавляется стоимость вычисления next;
  3.  есть шум измерения и особенности runtime.
|#

#| END |#