【问题标题】:What is the correspondence between Fermat's Little Theorem and the SICP implementation?费马小定理与 SICP 实现有什么对应关系?
【发布时间】: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 = afermat-test 过程中的条件不包括a modulo n。当然,它们的实现是有效的,所以我一定是误解了。

请注意,这不是递归与迭代过程的混淆。

【问题讨论】:

    标签: math scheme sicp


    【解决方案1】:

    测试中的条件是a而不是a modulo n,因为如果a < n那么a modulo na,所以modulo n是多余的。

    他们真正测试的是n 是否为Fermat pseudoprime。它不能作为一个完整的素数测试(SICP 并没有声称它确实如此),但测试中涉及的想法最终导致了完全实用的Miller-Rabin test

    【讨论】:

    • 感谢您的解释!如果定义还规定 a
    【解决方案2】:

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

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

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

    使用 expmod 的原因是使用它可以使 fermat-test 变得更快。无论哪种方式,fermat-test 函数都会给出相同的结果。

    【讨论】:

    • 感谢您的回复。问题是为什么 SICP 代码不测试一致性。
    猜你喜欢
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多