修改按位 Karatsuba 算法以处理负数的最佳方法是什么?
What's the best way to modify a bitwise Karatsuba-Algorithm to work with negative numbers?
我写了这个按位 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
使数字为正数,将它是否为负数存储在布尔值中,并在我的 return 语句中处理该布尔值,但是有没有更好的 (也许按位)解决方案?
提前致谢
问题出在您的退出案例上,特别是 x&y
returns 负数的错误值:
-1 & 1 == 1 # Needs to return -1
因此您可以通过测试或直接返回来解决此问题:
if n < 2:
return x*y
例如:
In []:
print(karatsuba(-29,31))
Out[]:
-899
我写了这个按位 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
使数字为正数,将它是否为负数存储在布尔值中,并在我的 return 语句中处理该布尔值,但是有没有更好的 (也许按位)解决方案?
提前致谢
问题出在您的退出案例上,特别是 x&y
returns 负数的错误值:
-1 & 1 == 1 # Needs to return -1
因此您可以通过测试或直接返回来解决此问题:
if n < 2:
return x*y
例如:
In []:
print(karatsuba(-29,31))
Out[]:
-899