我正在为在线课程在 Scala(我的选择)中实现Karatsuba 乘法。考虑到该算法旨在将大数相乘,我选择了BigInt
由 Java BigInteger支持的类型。我想有效地实现该算法,该算法使用以 10 为底的算法从 Wikipedia 复制如下:
procedure karatsuba(num1, num2)
if (num1 < 10) or (num2 < 10)
return num1*num2
/* calculates the size of the numbers */
m = max(size_base10(num1), size_base10(num2))
m2 = floor(m/2)
/* split the digit sequences in the middle */
high1, low1 = split_at(num1, m2)
high2, low2 = split_at(num2, m2)
/* 3 calls made to numbers approximately half the size */
z0 = karatsuba(low1, low2)
z1 = karatsuba((low1 + high1), (low2 + high2))
z2 = karatsuba(high1, high2)
return (z2 * 10 ^ (m2 * 2)) + ((z1 - z2 - z0) * 10 ^ m2) + z0
鉴于它BigInteger
在内部表示为int[]
,如果我可以根据m2
进行计算int[]
,我可以使用位移来提取数字的下半部分和上半部分。同样,最后一步也可以通过位移来实现。
然而,说起来容易做起来难,因为我似乎无法理解逻辑。例如,如果最大数为999
,则二进制表示为1111100111
,下半部分为99 = 1100011
,上半部分为9 = 1001
。如何获得上述拆分?
注意:有一个现有问题显示了如何在 上使用算术BigInteger
而不是位移来实现。因此,我的问题不是重复的。