python - 修改按位 Karatsuba 算法以处理负数的最佳方法是什么?

标签 python algorithm multiplication karatsuba

我写了这个按位 Karatsuba 乘法算法。它不使用字符串或 math.pow。就是分而治之递归,按位运算和加法:

def karatsuba(x,y):
  n = max(x.bit_length(), y.bit_length())

  if n < 2:
    return x&y

  # split in O(1)
  n = (n + 1) >> 1

  b = x >> n;
  a = x - (b << n);
  d = y >> n;
  c = y - (d << n);

  ac = karatsuba(a, c);
  bd = karatsuba(b, d);
  abcd = karatsuba(a+b, c+d);

  return ac + ((abcd - ac - bd) << n) + (bd << (n << 1));

print(karatsuba(23,24))
print(karatsuba(-29,31))

# 552
# 381

它对正数绝对没问题,但显然 -29*31 不等于 381。

解决问题最简单的方法是什么?

我的第一个想法是使用 (~(-29)+1) = 29 使数字为正数,将是否为负数存储在 bool 值中,并在我的返回语句中处理该 bool 值, 但是否有更好的(可能是按位的)解决方案?

提前致谢

最佳答案

问题出在您的退出案例上,特别是 x&y 为负数返回了错误的值:

-1 & 1 == 1   # Needs to return -1

所以你可以通过测试或返回来解决这个问题:

if n < 2:
    return x*y

例如:

In []:
print(karatsuba(-29,31))

Out[]:
-899

关于python - 修改按位 Karatsuba 算法以处理负数的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50553976/

相关文章:

python - 通过代理IP将python应用程序连接到互联网?

matlab - 将二维矩阵与向量相乘以跨越第三维 - MATLAB

java - 乘法发生溢出

python - 如何确定列表中的循环?

python - 按首字母查找列表项并将其存储在两个不同的列表中并合并到字典中

python - 如何正确评估Python正则表达式?

javascript - 如何提高字典的性能?

algorithm - 无序二叉树的用例是什么?

algorithm - 滑动窗口算法实现

c - 使用按位运算符在 C 中模拟浮点乘法