我正在通過SICP工作。關於米勒 - 拉賓測試的練習1.28。我有這個代碼,我知道是錯誤的,因爲它沒有遵循這個練習的結果。爲什麼Miller-Rabin Procedure在Scheme中工作時代碼看起來是錯的?
(define (fast-prime? n times)
(define (even? x)
(= (remainder x 2) 0))
(define (miller-rabin-test n)
(try-it (+ 1 (random (- n 1)))))
(define (try-it a)
(= (expmod a (- n 1) n) 1))
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
(if (and (not (= exp (- m 1))) (= (remainder (square exp) m) 1))
0
(remainder (square (expmod base (/ exp 2) m)) m)))
(else
(remainder (* base (expmod base (- exp 1) m)) m))))
(cond ((= times 0) true)
((miller-rabin-test n) (fast-prime? n (- times 1)))
(else false)))
其中我測試指數的平方是否與1 mod n一致。根據我已閱讀的 ,以及我看到的其他正確實現,這是錯誤的。我應該測試 整個號碼爲:
...
(square
(trivial-test (expmod base (/ exp 2) m) m))
...
的事情是,我已經測試了這一點,有許多素數和大僞素數, 它似乎給出正確的答案,雖然有點慢。我不明白爲什麼這個 似乎工作。
「trivial-test」是什麼意思? – maxbublis