Math Fermat和#x27;s小定理与SICP实现?
程序的结构和解释定义了Fermat的小定理: 如果n是素数,a是小于n的正整数,那么 升到n次方的a与模n全等 (如果两个数都具有相同的值,则称它们为模n全等。) 被n除时的余数相同。被n除时a的余数 也被称为模n的余数,或简称为模 n 基于该描述,我编写了以下代码: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
(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