【问题标题】:The order of growth of the Fermat test in SICPSICP中费马检验的增长顺序
【发布时间】:2016-11-29 02:25:28
【问题描述】:

Structure and Interpretation of Computer Programs提出的fermat-test过程有一个theta-of-log(n)的增长顺序,我和很多人的实验已经验证了这一点。

让我感到困惑的是其定义中的random 原始过程。这是否意味着random 的增长顺序最多是 log(n) 的 theta?经过一番搜索,我仍然不确定是否可以编写一个增长顺序不超过 log(n) 的 theta 的伪随机数生成器。

代码如下:

(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) 增长顺序。

【问题讨论】:

    标签: algorithm random scheme time-complexity sicp


    【解决方案1】:

    费马小定理如下:

    如果 n 是质数且 a 是任何小于 n 的正整数,则 a 被提升nth 次方等于 an

    所以这里的想法是给定一个数字 n,我们选择任意数字 a 使得 a 然后我们计算表达式 an % 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. 1991年第3期

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

    顺便说一句,如果您真的有兴趣了解更多关于特别是伪随机数生成器的信息,Scheme 文档指出,除了当前的通用算法之外,可能还有更好、更高效的生成器——因此您可能还想查看其他生成器算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-02
      • 2013-03-03
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多