SICP 习题 1.27要求我们证明书中指出的Carmichael数可以骗过费马检测。
要证明这一点其实很简单,对于一个Carmichael数,找比这个数小同时大于1的所有数,逐个进行费马检测,如果有90%以上的数可以通过费马检测,那么这个数就有很大的几率骗过费马检测了。
事实上,我测试发现,Carmichael数(561,1105,1729,2465,2821,6601 这些)可以100%通过费马检测,以1729为例,就是说从2到1728都有(a的1728次方)对1728求模))等于a.
真是,有这么厉害的费马,想出这么奇妙的方法,就有这么奇妙的数,可以骗过这么奇妙的方法!
程序的具体实现比较简单,就是遍历比n小,比1大的数,进行费马检测而已,我的代码如下:
(define (full-fermat-test n) (if (fermat-try-all 2 n) #t #f)) (define (fermat-try-all current n) (if (< current n) (if (fermat-try n current) (fermat-try-all (+ current 1) n) #f) #t))
通过(full-fermat-test n)测试的数是完全通过费马检测的。
结果是561,1105,1729,2465,2821,6601 全部通过(full-fermat-test n)检测。
最后,注意,(full-fermat-test)在现实计算中是没有意义的,因为它比使用smallest-divisor方法还复杂,定义(full-fermat-test)只是为了检测Carmichael数。
SICP 习题 (1.27) 解题总结,布布扣,bubuko.com
原文:http://blog.csdn.net/keyboardota/article/details/11553879