我需要理解为什么我的代码给出了错误的答案。任务是用分而治之的方法创建二进制乘法。我找到了一些描述这类问题的论文:
wikibooks algorithmsUTSC paper (page 4)
这是我的Python代码(3.5.2)def add(A, B):
a_str = "".join([str(a) for a in A])
b_str = "".join([str(b) for b in B])
bin_a = int(a_str, 2)
bin_b = int(b_str, 2)
return [int(a) for a in str(bin(bin_a + bin_b))[2:]]
def add_n(*args):
if len(args) <= 1:
return args[0]
bin_sum = [0]
for num in args:
bin_sum = add(bin_sum, num)
return bin_sum
def shift(A, n):
if n <= 0:
return A
a_str = "".join([str(a) for a in A])
bin_a = int(a_str, 2)
bin_a = bin(bin_a << n)
return [int(a) for a in str(bin_a)[2:]]
def lfill(A, n):
return [0] * (n - len(A)) + A
def multiply(A, B):
n = len(A)
half = n // 2
if n <= 1:
return [A[0] * B[0]]
xl, xh = A[:half], A[half:]
yl, yh = B[:half], B[half:]
a = multiply(xh, yh)
b = multiply(xh, yl)
c = multiply(xl, yh)
d = multiply(xl, yl)
b = add(b, c)
a = shift(a, n)
b = shift(b, half)
return add_n(a, b, d)
问题测试1:
^{pr2}$
问题测试2:A = [1, 1, 1, 1]
B = [0, 0, 0, 1]
result: [1, 1, 1, 1, 0, 0, 0]
real result: [1, 1, 1, 1]
测试2的值跟踪:n half
Before Shift [2, 1]: a: [1] b:[1]
After Shift: a: [1, 0, 0] b:[1, 0]
Before Shift [2, 1]: a: [0] b:[0]
After Shift: a: [0] b:[0]
Before Shift [2, 1]: a: [1] b:[1]
After Shift: a: [1, 0, 0] b:[1, 0]
Before Shift [2, 1]: a: [0] b:[0]
After Shift: a: [0] b:[0]
Before Shift [4, 2]: a: [1, 1, 0] b:[1, 1, 0]
After Shift: a: [1, 1, 0, 0, 0, 0, 0] b:[1, 1, 0, 0, 0]
所以,正如你所看到的,问题出在零的计数上,但不同的情况不同。这段代码不适用于所有长度不成对的二进制文件,但这不是问题,因为它可以很容易地规范化。在