我正在尝试在 C 中实现 Karatsuba 算法。我使用 char 字符串(它们是某个基数中的数字),虽然我认为我已经理解了 Karatsuba 算法的大部分内容,但我不知道应该将字符串拆分到哪里乘。
例如,我应该在哪里切123 * 123,我应该在哪里切123 * 12?
我无法找到适用于这两种计算的解决方案。
我试着把它切成两半,当数字为奇数时把结果放在地板上,但它不起作用,天花板也不起作用。
有什么线索吗?
设 a、b、c 和 d 为字符串的部分。
让我们试试 123 * 12
第一次尝试(a = 1, b = 23, c = 1, d = 2) (失败)
z0 = a * c = 1 z1 = b * d = 46 z2 = (a + b) * (c + d) - z0 - z1 = 24 * 3 - 1 - 46 = 72 - 1 - 46 = 25 z0_padded = 100 z2_padded = 250 z0_padded + z1 + z2_padded = 100 + 46 + 250 = 396 != 123 * 12
第二次尝试(a = 12,b = 3,c = 12,d = 0)(失败)
z0 = 144 z1 = 0 z2 = 15 * 12 - z1 - z0 = 180 - 144 = 36 z0_padded = 14400 z2_padded = 360 z0_padded + z1 + z2_padded = 14760 != 1476
第三次尝试(a = 12,b = 3,c = 0,d = 12)(成功)
z0 = 0 z1 = 36 z2 = 15 * 12 - z0 - z1 = 144 z0_padded = 0 z2_padded = 1440 z0_padded + z1 + z2_padded = 1476 == 1476
让我们试试 123 * 123
第一次尝试(a = 1, b = 23, c = 1, d = 23) (失败)
z0 = 1 z1 = 23 * 23 = 529 z2 = 24 * 24 - z0 - z1 = 46 z0_padded = 100 z2_padded = 460 z0_padded + z1 + z2_padded = 561 != 15129
第二次尝试(a = 12, b = 3, c = 12, d = 3)(成功)
z0 = 12 * 12 = 144 z1 = 3 * 3 = 9 z2 = 15 * 15 - z0 - z1 = 72 z0_padded = 14400 z2_padded = 720 z0_padded + z1 + z2_padded = 15129 == 15129
第三次尝试(a = 12,b = 3,c = 1,d = 23)(失败)
z0 = 12 z1 = 3 * 23 = 69 z2 = 15 * 24 - z0 - z1 = 279 z0_padded = 1200 z2_padded = 2799 z0_padded + z1 = z2_padded = 4068 != 15129
在这里,我不明白我在哪里搞砸了。请注意,我的填充方法在数字末尾添加n 个零,其中n = m * 2并且m等于最长字符串的大小除以 2。
编辑
既然我已经理解b
并且d
必须具有相同的长度,它几乎每次都有效,但仍然有例外:例如1234*12
a = 123
b = 4
c = 1
d = 2
z0 = 123
z1 = 8
z2 = 127 * 3 - 123 - 8 = 250
z0_padded = 1230000
z2_padded = 25000
z0_padded + z1 + z2_padded = 1255008 != 14808
在这里,假设我正确拆分了字符串,问题是填充,但我不知道应该如何填充。我在Wikipedia上读到,我应该根据最大字符串的大小来填充(参见几行),应该有另一种解决方案。