SICP 练习1.28
来源:互联网 发布:matlab2015 mac破解版 编辑:程序博客网 时间:2024/05/22 13:33
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)
0 0
- SICP 练习1.28
- 【SICP练习】22 练习1.28
- SICP 练习1.11
- SICP-练习2.1
- SICP-练习2.17
- SICP-练习2.34
- SICP 练习1.7
- SICP 练习1.9
- SICP 练习1.16
- SICP 练习1.17
- SICP 练习1.18
- SICP 练习1.19
- SICP 练习1.32
- SICP 练习1.43 repeated
- sicp 练习2.4
- sicp练习2.6
- 【SICP练习】2 练习1.6
- 【SICP练习】3 练习1.7
- 欢迎使用CSDN-markdown编辑器
- LDA模型学习笔记
- MyBatis XML 映射配置文件
- Hdu oj 2553 N皇后问题(回溯加预处理)
- LeetCode Majority Element
- SICP 练习1.28
- c++11 内存模型解读
- C# 窗体间传值方法大汇总(转)
- EditText左右抖动,内容变化监听和手机震动
- 文本挖掘
- Linux中的线程锁与条件变量
- 【BZOJ4057】【Cerc2012】Kingdoms 状压DP
- Linux下php+nginx环境的搭建
- 新手 Python-机器学习 四部曲资源汇总