【问题标题】:SICP exercise 1.28: false negatives in the Miller-Rabin testSICP 练习 1.28:Miller-Rabin 测试中的假阴性
【发布时间】:2016-11-24 11:25:55
【问题描述】:

练习 1.28。 费马检验的一种变体是无法被愚弄的,称为 Miller-Rabin 检验(Miller 1976;Rabin 1980)。这 从费马小定理的另一种形式开始,它指出 如果 n 是一个素数并且 a 是任何小于 n 的正整数, 那么 a 的 (n - 1) 次幂等于 1 模 n。到 用 Miller-Rabin 检验检验数 n 的素性,我们选择一个 随机数 a

(define (fast-prime? n)
  (define (fast-prime-iter n counter)
    (cond ((= counter 1) #t) ; There is no need to check 1
          ((miller-rabin-test n counter)
           (fast-prime-iter n (- counter 1)))
          (else 
            (newline)
            (display counter)
            #f)))
  (fast-prime-iter n (- n 2)))

(define (miller-rabin-test n a)
  (define (expmod base exp m)
    (cond ((= exp 0) 1)
          ((even? exp)
           (nontrivial-square-root?
             (remainder (square (expmod base (/ exp 2) m))
                        m)))
          (else
            (remainder (* base (expmod base (- exp 1) m))
                       m))))
  (= (expmod a (- n 1) n) 1))

(define (nontrivial-square-root? val)
  (if (= val 1)
    0
    val))

我的想法是使用过程nontrivial-square-root? 过滤掉那些所谓的“1 模 n 的非平凡平方根”。如果(remainder (square (expmod base (/ exp 2) m)) m) 为1,则返回0,在这种情况下(expmod base (/ exp 2) m) 的平方必须等于1 模n(这是因为m 始终等于n),使其成为非平凡的平方根。

虽然nontrivial-square-root? 会过滤掉 561、1105、1729、2465、2821 和 6601 等卡迈克尔数,但据报道,7 和 13 等素数也是合数。

导致这些假阴性的原因是什么?

【问题讨论】:

    标签: algorithm scheme lisp primes sicp


    【解决方案1】:

    引用的重要部分用粗体标记:

    但是,每当我们在 expmod 中执行平方步骤时,我们都会检查是否发现了“1 模 n 的非平凡平方根”,即一个不等于 1 或 n 的数字 - 1 其平方等于 1 模 n

    因此,在平方并取余数之前,您必须检查参数是否不是 1 或 n - 1。例如,如果您调用 (miller-rabin-test 5 3),就会发生这种情况。执行递归,您会注意到有一个调用(nontrivial-square-root? (remainder (square 4) 5)),其计算结果为(nontrivial-square-root? 1)。但是,5 仍然可以是素数,因为 4 是 5 - 1。

    所以在平方部分你可以,例如,调用以下函数:

    (define (sqrmod-with-check val n)
      (let ((sqrmod (remainder (square val) n)))
        (cond ((or (= val (- n 1)) (= val 1)) sqrmod)
              ((= sqrmod 1) 0)
              (else sqrmod))))
    

    其中参数是expmod 调用和m。这会为您计算平方和余数,除非我们找到了一个模 n 的非平凡平方根,当它返回 0 时。我将它划分为三个条件,而不是两个,只是因为可读性。

    【讨论】:

    • "其平方等于 1 模 n"... 为什么这个检查是:(= 1 (remainder (square val) n)) 而不是:(= (square val) (remainder 1 n)
    • @randbw 句子平方等于 1 模 n,有点神秘,但它基本上意味着你取 n^2 和 1 的模,并比较它们。但是,如果 n>1,则(余数 1 n)始终为 1。
    • 感谢您的解释!
    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 2019-09-21
    • 2013-06-09
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多