2

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

看来,在步骤D.6中,qhat预计最多偏离 1。

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

两者u和都已经按照D.1v中的描述进行了标准化(并且是零填充的)。v[1] > b / 2u

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

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

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

我认为算法中存在错误是正确的,还是我的推理存在谬误?

附录

在此处输入图像描述 在此处输入图像描述

4

1 回答 1

0

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

D3

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

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

于 2020-03-02T08:06:01.350 回答