SICP ex1-17 ex-18 ex1-19
2016-05-02 15:32
495 查看
这道题的题目背景:用寻找最小divisor判断素性的方法O(n^(1/2))编写一个能给出给定范围素数的程序,并能够计算程序进行的时间
首先我们创建能够判断素数的函数
然后我们用给定范围内的奇数去判断
(define (test n)
(define starttime (runtime))
(define (smallest-divisor n)
(define (reminder x y) (if (< x y) x (reminder (- x y) y)))
(define (is-divisor? a)
(cond ((= (reminder n a) 0) a)
((> (* a a) n) n)
(else (is-divisor? (+ a 1)))
)
)
(is-divisor? 2)
)
(define (is-prime? n) (= (smallest-divisor n) n))
(define flag (is-prime? n))
(cond (flag (display "\n") (display n)))
flag
(define endtime (runtime))
(- endtime starttime)
)
(define (prime-create minum maxnum)
(define starttime (runtime))
(define (reminder x y) (if (< x y) x (reminder (- x y) y)))
(define (is-even? n) (= (reminder n 2 ) 0) )
(cond ((is-even? minum) (prime-create (+ minum 1) maxnum))
(else
(cond ((< minum maxnum ) (test minum) (prime-create (+ minum 2) maxnum))
((= minum maxnum ) (test minum))
)
)
)
(define endtime (runtime))
(- endtime starttime)
)
这个结果好像和我们的设想不太一样,那么我们来分析一下过程 test 997 test 10007 997处理a 2- 33 10007 处理a 2-100 大约3倍多一点这时我们如果假设每步求余都为1那么结果就是符合O的但是,我们这里的reminder是由减法迭代创建的,也就是reminder这个的时间也是会根据参数的改变而改变,由于参数相差较大,所以reminder在这里的差异也较大,所以结果不符合O
ex1-18要求在17的前提下修改test将检测的divisor为>2的偶数除去 (define (test n)
(define starttime (runtime))
(define (next-divisor n) (cond ((= n 2) 3) (else (+ n 2))))
(define (smallest-divisor n)
(define (reminder x y) (if (< x y) x (reminder (- x y) y)))
(define (is-divisor? a)
(cond ((= (reminder n a) 0) a)
((> (* a a) n) n)
(else (is-divisor? (next-divisor a)))
)
)
(is-divisor? 2)
)
(define (is-prime? n) (= (smallest-divisor n) n))
(define flag (is-prime? n))
(cond (flag (display "\n") (display n)))
flag
(define endtime (runtime))
(- endtime starttime)
)
(define (prime-create minum maxnum)
(define starttime (runtime))
(define (reminder x y) (if (< x y) x (reminder (- x y) y)))
(define (is-even? n) (= (reminder n 2 ) 0) )
(cond ((is-even? minum) (prime-create (+ minum 1) maxnum))
(else
(cond ((< minum maxnum ) (test minum) (prime-create (+ minum 2) maxnum))
((= minum maxnum ) (test minum))
)
)
)
(define endtime (runtime))
(- endtime starttime)
)
基本同ex1-17的结果的一半,符合题意的2倍猜测
解释,由于它是将偶数项除去(2不算)因此同相邻奇数项reminder的时间基本一致所以符合2倍关系
ex1-19
要求修改1-17中的test 利用费马测试来加快test观察结果是否为O(logn)并若不是作出解释
先给代码
(define (is-prime? n times)
(define starttime (runtime))
(define (fermat n)
(define a (+ 2 (random (- n 2) ) ) )
(define (expmod base Exp div)
(define (reminder x y) (if (< x y) x (reminder (- x y) y)))
(define (square x) (* x x) )
(define (is-even? x) (= (reminder x 2) 0))
(cond ((= Exp 0) 1)
((is-even? Exp) (reminder (square (expmod base (/ Exp 2) div) ) div ) )
(else (reminder (* base (expmod base (- Exp 1) div) ) div ) ) )
)
(= (expmod a n n) a)
)
(cond ((= times 0) #t)
((fermat n) (is-prime? n (- times 1)))
(else #f))
(- (runtime) starttime)
)
(define (test n) (is-prime? n 1))
同1-17分析,依然存在reminder的时间差异,所以基本是O(n)
以上仅个人分析,如有错误,请纠正,感谢~~~
首先我们创建能够判断素数的函数
然后我们用给定范围内的奇数去判断
(define (test n)
(define starttime (runtime))
(define (smallest-divisor n)
(define (reminder x y) (if (< x y) x (reminder (- x y) y)))
(define (is-divisor? a)
(cond ((= (reminder n a) 0) a)
((> (* a a) n) n)
(else (is-divisor? (+ a 1)))
)
)
(is-divisor? 2)
)
(define (is-prime? n) (= (smallest-divisor n) n))
(define flag (is-prime? n))
(cond (flag (display "\n") (display n)))
flag
(define endtime (runtime))
(- endtime starttime)
)
(define (prime-create minum maxnum)
(define starttime (runtime))
(define (reminder x y) (if (< x y) x (reminder (- x y) y)))
(define (is-even? n) (= (reminder n 2 ) 0) )
(cond ((is-even? minum) (prime-create (+ minum 1) maxnum))
(else
(cond ((< minum maxnum ) (test minum) (prime-create (+ minum 2) maxnum))
((= minum maxnum ) (test minum))
)
)
)
(define endtime (runtime))
(- endtime starttime)
)
这个结果好像和我们的设想不太一样,那么我们来分析一下过程 test 997 test 10007 997处理a 2- 33 10007 处理a 2-100 大约3倍多一点这时我们如果假设每步求余都为1那么结果就是符合O的但是,我们这里的reminder是由减法迭代创建的,也就是reminder这个的时间也是会根据参数的改变而改变,由于参数相差较大,所以reminder在这里的差异也较大,所以结果不符合O
ex1-18要求在17的前提下修改test将检测的divisor为>2的偶数除去 (define (test n)
(define starttime (runtime))
(define (next-divisor n) (cond ((= n 2) 3) (else (+ n 2))))
(define (smallest-divisor n)
(define (reminder x y) (if (< x y) x (reminder (- x y) y)))
(define (is-divisor? a)
(cond ((= (reminder n a) 0) a)
((> (* a a) n) n)
(else (is-divisor? (next-divisor a)))
)
)
(is-divisor? 2)
)
(define (is-prime? n) (= (smallest-divisor n) n))
(define flag (is-prime? n))
(cond (flag (display "\n") (display n)))
flag
(define endtime (runtime))
(- endtime starttime)
)
(define (prime-create minum maxnum)
(define starttime (runtime))
(define (reminder x y) (if (< x y) x (reminder (- x y) y)))
(define (is-even? n) (= (reminder n 2 ) 0) )
(cond ((is-even? minum) (prime-create (+ minum 1) maxnum))
(else
(cond ((< minum maxnum ) (test minum) (prime-create (+ minum 2) maxnum))
((= minum maxnum ) (test minum))
)
)
)
(define endtime (runtime))
(- endtime starttime)
)
基本同ex1-17的结果的一半,符合题意的2倍猜测
解释,由于它是将偶数项除去(2不算)因此同相邻奇数项reminder的时间基本一致所以符合2倍关系
ex1-19
要求修改1-17中的test 利用费马测试来加快test观察结果是否为O(logn)并若不是作出解释
先给代码
(define (is-prime? n times)
(define starttime (runtime))
(define (fermat n)
(define a (+ 2 (random (- n 2) ) ) )
(define (expmod base Exp div)
(define (reminder x y) (if (< x y) x (reminder (- x y) y)))
(define (square x) (* x x) )
(define (is-even? x) (= (reminder x 2) 0))
(cond ((= Exp 0) 1)
((is-even? Exp) (reminder (square (expmod base (/ Exp 2) div) ) div ) )
(else (reminder (* base (expmod base (- Exp 1) div) ) div ) ) )
)
(= (expmod a n n) a)
)
(cond ((= times 0) #t)
((fermat n) (is-prime? n (- times 1)))
(else #f))
(- (runtime) starttime)
)
(define (test n) (is-prime? n 1))
同1-17分析,依然存在reminder的时间差异,所以基本是O(n)
以上仅个人分析,如有错误,请纠正,感谢~~~
相关文章推荐
- Intent实现简易文件浏览查看器
- 时间序列 R 09 ARIMA
- 时间序列 R 10 其他进阶预测方法 Advanced forecasting methods
- redis安装
- 命令行创建maven模块工程
- EntityFramework之迁移操作(五)
- 冒泡排序
- 70. Climbing Stairs
- 网上名人推荐的好书
- eclipse中要让一个 Java 源文件打开时编码格式为 UTF-8
- MDK 不同版本编译的问题
- EL表达式之常用标签
- CodeForcesGym 100753B Bounty Hunter II 二分图最小路径覆盖
- ansible之shell和script模块
- Python基本概念--Python学习笔记
- 常用八大排序算法
- JAVA技术发展——你不知道的J2SE(四)
- 学习
- CF 345 C 模拟
- 《More Effective C++》读书笔记-技术(二)