Karatsuba算法溢出

时间:2017-12-18 17:23:36

标签: algorithm computer-science karatsuba programmers-notepad

我一直在研究Karatsuba's algorithm on Wikipedia 我在这一段停下来让我很困惑。为什么这个算法有溢出,我不明白他为解决这个问题所采取的步骤。我的问题截图是

screenshot

1 个答案:

答案 0 :(得分:2)

以免仅考虑首发的正数。让我们有8位数字/数字x0,x1,y0,y1

当我们应用8位乘法时:

x0*y0 -> 8bit * 8bit -> 16 bit

最多可产生16位结果。最高值是:

FFh*FFh = FE01h
255*255 = 65025

现在,如果我们回到Karatsuba,请

X = x0 + x1<<8
Y = y0 + y1<<8
Z = X*Y = z0 + z1<<8 + z2<<16

现在让我们看一下zi

的位宽
z2 = x1*y1         -> 16 bit
z1 = x1*y0 + x0*y1 -> 17 bit
z0 = x0*y0         -> 16 bit

请注意,z1为17位,因为最高值为

65025+65025 = 130050

所以每个zi溢出8位。要处理这个问题,你只需要最低8位,其余的则加上更高的数字(比如Carry的传播)。所以:

z1 += z0>>8;   z0 &= 255;
z2 += z1>>8;   z1 &= 255;
z3  = z2>>8;
Z = z0 + z1<<8 + z2<<16 + z3<<24

但通常乘法的HW实现会自行处理,并将结果作为两个单词而不是一个单词。见Cant make value propagate through carry

因此16位乘法的结果是32位。请注意,为了添加8位子结果,您需要至少10位,因为我们将3个数字加在一起,或者以9位(或8位+ 1个进位)逐个添加和传播它们。

如果您为此添加签名值,则需要另外一位用于签名。为了避免它记住操作数的迹象并使用abs值...并根据原始符号设置结果的符号。

有关详细信息,请参阅以下内容: