【发布时间】:2019-05-02 10:13:34
【问题描述】:
程序的结构和解释这样定义了费马小定理:
如果 n 是一个素数并且 a 是任何小于 n 的正整数,那么 a 的 n 次方等于模 n。
(如果两个数都具有 除以 n 的余数相同。 a除以n的余数 也称为模 n 的余数,或简称为模 n.
根据那个描述,我写了这段代码:
(define (fermat-test a n)
(congruent? (expt a n) a n))
(define (congruent? x y n)
(= (modulo x n)
(modulo y n)))
后来,SICP 是这样说的:
这导致了以下用于测试素数的算法:给定一个 数字 n,选择一个随机数 a
并给出以下代码:
(define (fermat-test)
(define (try-it)
(= (expmod a n n) a))
(try-it (+ 1 (random (- n 1)))))
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
(remainder (expmod base (/ exp 2) m) m))
(else
(remainder (* base (expmod base (- exp 1) m)) m))))
其中expmod 是“计算一个数模另一个数的指数的过程”。
我不明白这段代码和费马定理的第一个定义之间的对应关系。我将“a 的 n 次幂与模 n 一致”理解为:a^n modulo n = a modulo n。但是 SICP 的代码似乎暗示了a^n modulo n = a。 fermat-test 过程中的条件不包括a modulo n。当然,它们的实现是有效的,所以我一定是误解了。
请注意,这不是递归与迭代过程的混淆。
【问题讨论】: