Karatsuba乘法的基本案例

时间:2016-11-18 23:59:50

标签: algorithm recursion karatsuba

只是想知道为什么Karatsuba乘法的基本情况(此处显示为http://www.sanfoundry.com/java-program-karatsuba-multiplication-algorithm/)被选为" N< = 10"?我发现" N< = 4,3,2,1"不会给我一个正确的结果。谁能解释一下?

3 个答案:

答案 0 :(得分:1)

少于10位的数字可以本地乘以(x*y),因为结果将始终适合带符号的64位整数。

使用long数据类型没有多大意义,因为大多数不会溢出的数字组合只会被本地评估。你必须改为BitInteger或类似的东西,并使用更大的数字来从算法中获得任何收益。

至于N的下限失败的原因,我不确定。该算法必须能够将两个数字分成两个大小相似的部分。我想在某些情况下会以零或负数结束。

答案 1 :(得分:1)

Karatsuba的算法将适用于任何“足够大”的基本情况,其中“足够大”意味着“足够大,当它被分成更小的子问题时,那些子问题确实更小并产生正确的答案。”从这个意义上讲,对于Karatsuba而言,没有“基本”案例与基本案例的基本案例一样多。

老实说,您链接的代码似乎不是一个非常合理的算法实现。它适用于long s,它可以在任何合理的系统上在O(1)时间内相乘,它们的基本情况是当数字小于10 10 时停止,意思是对于64位数字,递归总是在一步之后终止。更好的实现可能会使用类似BigInteger类型的东西来支持任意精度乘法。此时,选择最佳基本情况是性能调整的问题。使基本案例具有太多的数字,并且处理较小数字的递归将比花费更多的时间花费更多的时间。使基数太高,你会开始看到减速,因为递归步骤可以更好地处理这些情况,而不是花时间使用天真的乘法。

答案 2 :(得分:1)

如果您在帖子中包含了源代码,那么您很快就会得到一个点到点的答案。
如果您使用类似BigInteger.divideAndRemainder(dividend, divisor)之类的内容来“分割”您的数字,则不会冒险编写类似

的代码
long d = y / m;
long c = y - (d * N);

(使用与除数不同的乘数) 请注意,两个10位数的乘积并不总是适合Java的long