SICP中Fermat测试的增长顺序

时间:2016-11-29 02:25:28

标签: algorithm random scheme time-complexity sicp

计算机程序的结构和解释所呈现的fermat-test程序具有log-of-log(n)增长顺序,已经过我和许多其他人的实验验证

令我困惑的是它的定义中的random原始过程。这是否意味着random的增长顺序最多为log(n)的θ?经过一些搜索工作后,我仍然不确定是否可以编写伪随机数生成器,其增长顺序不超过log(n)的θ。

以下是代码:

(define (fermat-test n)
  (define (try-it a)
    (= (expmod a n n) a))
  ; Wait a second! What's the order of growth of `random`?
  (try-it (+ 1 (random (- n 1)))))

,其中expmod具有theta-of-log(n)增长顺序:

(define (expmod base exp m)
  (cond ((= exp 0) 1)
        ((even? exp)
         (remainder (square (expmod base (/ exp 2) m))
                    m))
        (else
         (remainder (* base (expmod base (- exp 1) m))
                    m)))) 

你能解释一下吗?

  • 如果确实存在这样的伪随机数生成器,请告诉我它是如何工作的。
  • 如果这样的伪随机数生成器不存在,请告诉我fermat-test如何仍然具有theta-of-log(n)增长顺序。

1 个答案:

答案 0 :(得分:5)

Fermat的Little Theorem内容如下:

  

如果 n 是素数且 a 是任何小于 n 的正整数,则 a 会被提升第n 次幂与 a n 一致。

所以这里的想法是,给定一些数字 n ,我们选择任意数字 a ,以便 a< n 然后我们计算表达式 a n %n == a 。如果此表达式返回false,那么我们知道 n 不是素数。但是,如果此表达式返回true,那么很有可能 n 是素数。

根据这个定理,我们能够推导出你在上面列出的函数:

(define (fermat-test n)
  (define (try-it a)
    (= (expmod a n n) a))
  (try-it (+ 1 (random (- n 1)))))

在你的帖子中,你已经明确表示你理解Θ(lg n)增长&渐近时间复杂度来自expmod函数,因此我们只需要了解random如何在Scheme中工作,以了解它的增长顺序是否恒定。

在Scheme中,您可以generate pseudorandom numbers using the random function。从Scheme文档中,我们知道

  

当前的实现是基于来自A New Class of Random Number Generators,George Marsaglia和Arif Zaman,The Annals of Applied Probability,Vol.24,No.2,pp.1998的算法的“带有减法”随机数发生器。 1991年第1期,第3期

如果您有兴趣阅读有关此特定实现的更多信息you're more than welcome to read more about them,但这里的重要部分是了解我们能够在恒定时间内以恒定空间生成伪随机数,从而生成顺序这个函数调用没有改变增长。

快速地说,如果你真的有兴趣更多地了解伪随机数生成器,那么Scheme文档提出了一个建议,除了目前的通用算法之外,可能还有更好,更高效的生成器 - 所以你可能也想查看其他的生成器算法。