首页 > 其他 > 详细

SICP 习题 (1.27) 解题总结

时间:2014-02-28 22:31:22      阅读:596      评论:0      收藏:0      [点我收藏+]

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

SICP 习题 (1.27) 解题总结

原文:http://blog.csdn.net/keyboardota/article/details/11553879

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!