【问题标题】:Is there a bug in Algorithm 4.3.1D of Knuth's TAOCP?Knuth 的 TAOCP 的算法 4.3.1D 中是否存在错误?
【发布时间】:2020-06-14 04:50:20
【问题描述】:

你可以找到算法 4.3.1D 的解释,它出现在计算机编程艺术卷。 2(第 272-273 页)由 D. Knuth 在本问题的附录中撰写。

看来,在步骤 D.6 中,qhat 预计最多减一。

让我们假设基数是2^32(即我们正在使用无符号的 32 位数字)。让u = [238157824, 2354839552, 2143027200, 0]v = [3321757696, 2254962688]。该部门的预期输出为4081766756Link

uv 都已经按照 D.1 中的说明进行了标准化(v[1] > b / 2u 是零填充的)。

循环 D.3D.7 的第一次迭代是无操作的,因为 qhat = floor((0 * b + 2143027200) / (2254962688)) = 0 在第一次迭代中。

在循环的第二次迭代中,qhat = floor((2143027200 * b + 2354839552) / (2254962688)) = 4081766758Link

我们不需要计算步骤 D.4D.5 来了解为什么会出现问题。由于qhatD.6中会减1,所以算法的结果会是4081766758 - 1 = 4081766757,但是结果应该是4081766756Link

我是否认为算法中存在错误,或者我的推理存在谬误?

附录

【问题讨论】:

  • 对不起,以下内容无助于回答问题,而只是一个注释:如第 1 卷第 2 页所述,在 TAOCP 书籍中,算法被赋予字母名称并在本地由该字母引用在该部分内,但除此之外,它们的“正确”名称包括该部分名称。因此,在这种情况下,您的意思是“算法 4.3.1D”(第 2 卷第 272-273 页)(第 4 章算术,第 4.3 节多精度算术,第 4.3.1 节经典算法)。
  • 关于"看来,在步骤D.6中,qhat预计最多减一" --请注意给出算法之前的段落,它说“该算法在步骤 D3 中使用了稍微改进的 q̂ 选择,这保证了 q = q̂ 或 q̂ − 1”
  • 您似乎遗漏了 D3 的最后一部分,其中涉及“如果 r̂
  • 坦率地说,我认为我没有时间写答案。但简短的版本是 D3 中有一个循环,您执行了 0 次而不是正确的次数。
  • (顺便说一句,为一个明确的问题+1。我不知道为什么有人投票以“需要详细信息或澄清”来结束这个问题!)

标签: algorithm division off-by-one


【解决方案1】:

没有错误;您忽略了步骤 D3 中的循环:

在您的示例中,作为该测试的结果,最初设置为 4081766758 的 q̂ 的值减少了两次,首先是 4081766757,然后是 4081766756,然后继续执行步骤 D4。

(对不起,我没有时间做出更详细/“正确”的答案。)

【讨论】:

  • 感谢您的回答。出于某种原因,我忽略了那部分。如果您以后有时间,请随时编辑和扩展答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
相关资源
最近更新 更多