SICP 练习1.28
2016-06-03 21:50
274 查看
Miller-Rabin检查
k2=pn+1
(k−1)(k+1)=pn
如果n为质数,则n=k−1或者n=k+1
n=k+1即k=n−1
n=k−1即k=n+1这是不可能的,因为k<n
用let定义局部变量的时候出错了,就是首先让a=一个数值,然后让a去定义b,这样是不行,lisp中不允许这样干。于是去网上找了找,发现一个函数版的,于是先用函数实现了一遍,发现可以,然后把自己原先的代码用let实现了。
函数调用
(define (expmod base exp m) (define check (lambda (a1) (let ((a2 (remainder (square a1) m))) (if (and (= a2 1) (> a1 1) (< a1 (- m 1))) 0 a2)))) (cond ((= exp 0) 1) ((even? exp) (check (expmod base (/ exp 2) m))) (else (remainder (* base (expmod base (- exp 1) m)) m)))) (define (Miller-Rabin-test n) (define (try-it a) (= (expmod a (- n 1) n) 1)) ; a ^ (n-1) % n == 1 (try-it (+ 1 (random (- n 1))))) (define (fast-prime? n times) (cond ((= times 0) #t) ((Miller-Rabin-test n) (fast-prime? n (- times 1))) (else #f))) (define (even? x) (= (remainder x 2) 0)) (define (square x) (* x x)) (fast-prime? 11 3)
两个let
(define (expmod base exp m) (cond ((= exp 0) 1) ((even? exp) (let ((a1 (expmod base (/ exp 2) m))) (let ((a2 (remainder (square a1) m))) (if (and (= a2 1) (> a1 1) (< a1 (- m 1))) 0 a2)))) (else (remainder (* base (expmod base (- exp 1) m)) m)))) (define (Miller-Rabin-test n) (define (try-it a) (= (expmod a (- n 1) n) 1)) ; a ^ (n-1) % n == 1 (try-it (+ 1 (random (- n 1))))) (define (fast-prime? n times) (cond ((= times 0) #t) ((Miller-Rabin-test n) (fast-prime? n (- times 1))) (else #f))) (define (even? x) (= (remainder x 2) 0)) (define (square x) (* x x)) (fast-prime? 11 3)
相关文章推荐
- LeetCode Majority Element
- MyBatis XML 映射配置文件
- 为什么要重写hashcode() 方法
- LDA模型学习笔记
- 欢迎使用CSDN-markdown编辑器
- 快速学习者的高效学习策略
- HTTP请求报文和响应报文
- c++11 内存模型解读
- 开机提示grub可咋办啊
- PPTP服务器配置选项详解
- url中的#、?、&
- /usr/bin/ld: cannot find -l*
- android:cacheColorHint=“#00000000”
- 获取ListView点击的Item
- Openlayers3结合百度地图API实现定位与展示
- Openlayers3结合百度地图API实现定位与展示
- 对学术诚信与职业道德的感悟
- android custom view
- java实现 计算字符串最后一个单词的长度,单词以空格隔开。
- SQLite和listview