【发布时间】:2019-03-27 06:26:03
【问题描述】:
我试图在SICP中解决练习1.28,关于Miller-Rabin算法,之后我在网上找到了答案,但我认为答案是错误的。我来问问有没有错。
他在执行 expmod 循环时检查 (remainder (square base) m)=1 是否。然而,在做循环时,base 和 m 会保持不变,这意味着他正在做同样的检查,这不是 Miller-Rabin 测试想要做的。
(define (expmod base exp m)
(cond ((= exp 0)
1)
((nontrivial-square-root? base m)
0)
((even? exp)
(remainder (square (expmod base (/ exp 2) m))
m))
(else
(remainder (* base (expmod base (- exp 1) m))
m))))
(define (nontrivial-square-root? a n)
(and (not (= a 1))
(not (= a (- n 1)))
(= 1 (remainder (square a) n))))
如果n=k*2^c,我想我们应该检查一下(remainder (a^(k*2*(c-1))) n)=1。
【问题讨论】: