Python中的Karatsuba算法

时间:2012-05-01 01:30:53

标签: python algorithm multiplication

所以我在python中实现Karatsuba的乘法算法。现在我有无限的递归,无法弄明白。有任何想法吗?如果需要,我会提供更多代码。

  def multiply(self, other):


  # helper function
    def split(largeInt, n):
     least = largeInt._least_significant_digits(n/2)
     most = largeInt._right_shift(n/2)
     if debug: assert least.to_int() + (most.to_int() << (LargeInt.base_bits*(n/2))) == largeInt.to_int()
     return least, most
  n = max(len(str(self)),len(str(other)))
  if (n==1):
     return self.to_int() * other.to_int()
  else:
     aR, aL = split(self,n)
     bR , bL = split(other, n)
     x1 = aL.multiply(bL)
     x2 =aR.multiply(bR)
     a = aL.add(bL)
     b = aR.add(bR)
     x3=a.multiply(b)
  # code for recursive step here
  #return 1 # change this line with your implementation
  return  x1 * 10**n + (x3-x1-x2) * 10**(n/2) + x2

2 个答案:

答案 0 :(得分:1)

一些提示:

  • 我认为ab的值不是what you want them to be
  • 常见错误通常是拆分不会返回严格较小的数字:请提供_least_significant_digits_right_shift的来源。
  • 当你的一个输入长度为1而另一个输入长度不是时,会发生什么?在这种情况下,分割返回1位数字是什么?

答案 1 :(得分:0)

我正在计算传入的数字的最大长度,这样修复它。

   n = max(len(self.digits),len(other.digits))