Math Fermat和#x27;s小定理与SICP实现?

Math Fermat和#x27;s小定理与SICP实现?,math,scheme,sicp,Math,Scheme,Sicp,程序的结构和解释定义了Fermat的小定理: 如果n是素数,a是小于n的正整数,那么 升到n次方的a与模n全等 (如果两个数都具有相同的值,则称它们为模n全等。) 被n除时的余数相同。被n除时a的余数 也被称为模n的余数,或简称为模 n 基于该描述,我编写了以下代码: (define (fermat-test a n) (congruent? (expt a n) a n)) (define (congruent? x y n) (= (modulo x n) (mod

程序的结构和解释定义了Fermat的小定理:

如果n是素数,a是小于n的正整数,那么 升到n次方的a与模n全等

(如果两个数都具有相同的值,则称它们为模n全等。) 被n除时的余数相同。被n除时a的余数 也被称为模n的余数,或简称为模 n

基于该描述,我编写了以下代码:

(define (fermat-test a n) 
  (congruent? (expt a n) a n))

(define (congruent? x y n) 
  (= (modulo x n) 
     (modulo y n)))
(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))))
后来,SICP说:

这导致以下测试素性的算法:给定 数字n,选择一个随机数a 并给出了以下代码:

(define (fermat-test a n) 
  (congruent? (expt a n) a n))

(define (congruent? x y n) 
  (= (modulo x n) 
     (modulo y n)))
(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
是“计算一个数与另一个数的指数的过程”

我不理解这个代码和费马定理的第一个定义之间的对应关系,我理解“升到n次方的a与模n全等”as:
a^n模n=a模n
。但是SICP的代码似乎暗示了
a^n模n=a
fermat测试过程中的条件不包括
a模n
。当然,它们的实现是有效的,所以我一定是误解了

请注意,这并不是关于递归和迭代过程的混淆。

(expt a n)将计算一个非常大的数字

(expmod a n)将计算0到n范围内的数字

这两个值将是全等的(模n)


使用expmod的原因是,使用它可以使费马测试更快。费马测试函数将给出相同的结果。

测试中的条件是
a
而不是
a模n
,因为如果
a
模n
a
,因此
模n
这是多余的


他们真正测试的是
n
是否是a。它不能作为一个完整的素性测试(SICP也没有声称它是这样的)但是测试中涉及的想法最终会导致完全实用。

谢谢你的解释!你知道为什么定义会包括一致性,如果它还规定a