【发布时间】:2016-11-24 11:25:55
【问题描述】:
练习 1.28。 费马检验的一种变体是无法被愚弄的,称为 Miller-Rabin 检验(Miller 1976;Rabin 1980)。这 从费马小定理的另一种形式开始,它指出 如果 n 是一个素数并且 a 是任何小于 n 的正整数, 那么 a 的 (n - 1) 次幂等于 1 模 n。到 用 Miller-Rabin 检验检验数 n 的素性,我们选择一个 随机数 a
(define (fast-prime? n)
(define (fast-prime-iter n counter)
(cond ((= counter 1) #t) ; There is no need to check 1
((miller-rabin-test n counter)
(fast-prime-iter n (- counter 1)))
(else
(newline)
(display counter)
#f)))
(fast-prime-iter n (- n 2)))
(define (miller-rabin-test n a)
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
(nontrivial-square-root?
(remainder (square (expmod base (/ exp 2) m))
m)))
(else
(remainder (* base (expmod base (- exp 1) m))
m))))
(= (expmod a (- n 1) n) 1))
(define (nontrivial-square-root? val)
(if (= val 1)
0
val))
我的想法是使用过程nontrivial-square-root? 过滤掉那些所谓的“1 模 n 的非平凡平方根”。如果(remainder (square (expmod base (/ exp 2) m)) m) 为1,则返回0,在这种情况下(expmod base (/ exp 2) m) 的平方必须等于1 模n(这是因为m 始终等于n),使其成为非平凡的平方根。
虽然nontrivial-square-root? 会过滤掉 561、1105、1729、2465、2821 和 6601 等卡迈克尔数,但据报道,7 和 13 等素数也是合数。
导致这些假阴性的原因是什么?
【问题讨论】:
标签: algorithm scheme lisp primes sicp