1.27¶
; Demonstrate that the Carmichael numbers listed in ; Footnote 1.47 really do fool the Fermat test. That is, ; write a procedure that takes an integer n and tests ; whether an is congruent to a modulo n for every a < n, ; and try your procedure on the given Carmichael numbers. (define (even? x) (= (remainder x 2) 0)) (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)))) (define (fermat-test-all n) (define (fermat-test-all-iter a) (if (= a n) #t (if (= (expmod a n n) a) (fermat-test-all-iter (+ a 1)) #f))) (fermat-test-all-iter 1) ) ; Testing with actual prime numbers (fermat-test-all 2) ;Value: #t (fermat-test-all 17) ;Value: #t ; Testing with Carmichael numbers (should be false, but returns true) (fermat-test-all 561) (fermat-test-all 1105) (fermat-test-all 1729) (fermat-test-all 2465) (fermat-test-all 2821) (fermat-test-all 6601)