; ======================================================================
;
; Structure and Interpretation of Computer Programs
; (trial answer to excercises)
;
; 计算机程序的构造和解释(习题试解)
;
; created: code17 02/28/05
; modified:
; (保持内容完整不变前提下,可以任意转载)
; ======================================================================
;; SICP No.1.28
;; 修改expmod中remaider和square为带有额外检查的remainder-check
(define (expmod base exp m)
(define (remainder-check x)
(define result (remainder (square x) m))
(if (and (= result 1)
(not (or (= x 1) (= x (- m 1)))))
0
result))
(cond ((= exp 0) 1)
((even? exp) (remainder-check (expmod base (/ exp 2) m)))
(else (remainder (* base (expmod base (- exp 1) m)) m))))
;; miller-rabin测试主函数,使用题1.27中的测试模式,即测试所有可能的a
(define (miller-rabin-test n)
(define (try-it a)
(cond ((= a 0) #t)
((= (expmod a (- n 1) n) 1) (try-it (- a 1)))
(else #f)))
(try-it (- n 1)))
;; Test-it
;; Welcome to MzScheme version 209, Copyright (c) 2004 PLT Scheme, Inc.
;; > (miller-rabin-test 17)
;; #t
;; > (miller-rabin-test 1013)
;; #t
;; > (miller-rabin-test 1017)
;; #f
;; > (miller-rabin-test 6691)
;; #t
;; > (miller-rabin-test 561) ;; 以下为Carmichael数的测试,符合预期
;; #f
;; > (miller-rabin-test 1105)
;; #f
;; > (miller-rabin-test 1729)
;; #f
;; > (miller-rabin-test 2465)
;; #f
;; > (miller-rabin-test 2821)
;; #f
;; > (miller-rabin-test 6601)
;; #f
;; >