练习1.23-练习1.30

15 篇文章 0 订阅

1.练习1.23

改后的代码如下:

(define (find-divisor-better n a)
  (cond ((> (square a) n) n)
	((divides?-better n a) a)
	(else (find-divisor-better n (next-2 a)))))

(define (next-2 n)
  (if (= 2 n)
      (+ 1 n)
      (+ 2 n)))
(define (find-min-prime-since-better n start-time number)
  (cond ((= number 0) (display-info start-time (real-time-clock)))
	((prime? n) (begin
		      (format #t "~S~%" n)
		      (find-min-prime-since-better (+ n (next-plus n)) start-time (- number 1))))
	(else (find-min-prime-since-better (+ n (next-plus n)) start-time number)))
  #f)
(define (next-plus n)
  (if (even? n)
      1
      2))

电脑跑这些代码的时候,没有固定的运行时间,一直在变。不过结果是改后的基本是没改前的0.5,也可能0.6左右。

2.练习1.24

代码就不贴出来了,只是将上一题中的判断是否为素数的方法改为费马方法。

在检测接近1000000的素数和接近1000的素数时,接近1000000的素数在时间上应该为(log1000000)=6应该大于接近1000的3的素数检查,比值为2:1,实验中计算从1000和1000000开始的1000个素数,1000开始的时间为695,而从1000000开始的时间为1470,比值接近于1:2, 与假设基本相同。

但是在帖子,那我猜,可能是64位和32位的不同了。

3.练习1.25

先求次方的结果会导致一个很大的数求余数,这样的时间消耗会很大。

4.练习1.26

不使用square的结果是每次减半的expmod操作没有了简版的效果,所以时间复杂度会变回O(n) 。

5.练习1.27

(define (try-it a n)
    (= (expmod a n n) a))

(define (carmichael-test n number)
  (cond ((= number 0) true)
	((try-it number n) (carmichael-test n (- number 1)))
	(else false)))

(define (car-prime? n)
  (carmichael-text n (- n 1)))

6.练习1.28

(define (new-expmod base exp m)
  (define tmpbase 100)
  (cond ((= exp 0) 1)
	((even? exp) (begin
		      (set! tmpbase (new-expmod base (/ exp 2) m))
		      (if (and (not (= tmpbase (- m 1)))
			       (not (= tmpbase 1))
			       (= (remainder (square tmpbase)
					       m) 1))
			   0
			   (remainder (square tmpbase)
					 m))))
	(else (remainder (* base (new-expmod base (- exp 1) m))
			 m))))
(define (new-try-it n a)
  (new-expmod a (- n 1) n))


(define (new-fermat-test n start)
  (cond ((= start 1) true)
	((= (new-try-it n start) 0) false)
	(else (new-fermat-test n (- start 1)))))

(define (really-prime? n)
 (new-fermat-test n (if (even? n)
			(/ n 2)
			(/ (- n 1) 2))))

没有进行优化,但本身也有可能会有更好的方法吧。。。

7.练习1.29

(define (xps f a b n)
  (define h
    (/ (- b a) n))
  (define (f1 k)
    (f (+ a (* k h))))
  (define (f2 k)
    (if (or (= k 0) (= k n))
	(f1 k)
	(if (even? k)
	    (* 2 (f1 k))
	    (* 4 (f1 k)))))
  (define (add-h x)
    (+ x 1))
  (* (/ h 3)
     (sum f2 0 add-h n)))

8.练习1.30

(define (sum term a next b)
  (define (iter a result)
    (if (> a b)
	result
	(iter (next a) (+ (term a) result))))
  (iter a 0))


“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

_海阔天空

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值