我们将这个测试函数称之为 carmichael-test
,对于给定参数 \(n\) ,它要检验所有少于 \(n\) 的数 \(a\) , \(a^n\) 是否都与 \(a\) 模 \(n\) 同余:
;;; 27-carmichael-test.scm
(load "p34-expmod.scm")
(define (carmichael-test n)
(test-iter 1 n))
(define (test-iter a n)
(cond ((= a n)
#t)
((congruent? a n)
(test-iter (+ a 1) n))
(else
#f)))
(define (congruent? a n) ; 同余检测
(= (expmod a n n) a))
然后,按照书本 35 页脚注 47 里的 Carmichael 数一个个进行测试:
1 ]=> (load "27-carmichael-test.scm")
;Loading "27-carmichael-test.scm"...
; Loading "p34-expmod.scm"... done
;... done
;Value: congruent?
1 ]=> (carmichael-test 561)
;Value: #t
1 ]=> (carmichael-test 1105)
;Value: #t
1 ]=> (carmichael-test 1729)
;Value: #t
1 ]=> (carmichael-test 2465)
;Value: #t
1 ]=> (carmichael-test 2821)
;Value: #t
1 ]=> (carmichael-test 6601)
;Value: #t