SICP 练习1.28

来源:互联网 发布:matlab2015 mac破解版 编辑:程序博客网 时间:2024/05/22 13:33

Miller-Rabin检查

k2=pn+1

(k1)(k+1)=pn

如果n为质数,则n=k1或者n=k+1

n=k+1k=n1

n=k1k=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