-1

我正在尝试在 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上读到,我应该根据最大字符串的大小来填充(参见几行),应该有另一种解决方案。

4

1 回答 1

2

Karatsuba 算法是执行乘法的好方法。
如果你想让它工作,b并且d必须是相同的长度。

以下是计算 123x12 的两种可能性:

a= 1;b=23;c=0;d=12;
a=12;b= 3;c=1;d= 2;

让我们解释一下它在第二种情况下是如何工作的:

123=12×10+3
 12= 1×10+2
123×12=(12×10+3)×(1×10+2)
123×12=12×1×100+             (12×2+3×1)×10+3×2
123×12=12×1×100+((12+3)×(1+2)-12×1-3×2)×10+3×2

让我们解释一下它在第一种情况下是如何工作的:

123=1×100+23
 12=0×100+12
123×12=(1×100+23)×(0×100+12)
123×12=1×0×10000+              (1×12+23×0)×100+23×12
123×12=1×0×10000+((1+23)×(0+12)-1×0-23×12)×100+23×12

它也适用于10^k, 2^korn代替10or 100

于 2014-11-07T20:05:58.227 回答