【问题标题】:Karatsuba algorithm - Error in my implementationKaratsuba 算法 - 我的实现中的错误
【发布时间】:2015-02-25 08:12:38
【问题描述】:

我在 python 中实现 karatsuba 算法时遇到了麻烦。我正在使用 base 2 中的列表(MSB 在列表的末尾)。给我的实现是这样的:

Input: 2 bit-numbers of bit length n
Output: their product a*b

function Karatsuba(a, b) 
     if(n == 1) return a*b
     else 
          a1, a0, leftmost(n/2)(rounded up), rightmost(n/2)(rounded down) bits of a
          b1, b0, leftmost(n/2)(rounded up), rightmost(n/2)(rounded down) bits of b

     s1 = Karatsuba(a1, b1)
     s2 = Karatsuba(a0, b0)
     s3 = Karatsuba(a1 + a0, b1 + b0)

     return s1 * 2^n + (s3 - s1 - s2) * 2^(n/2) + s2

这是我的python实现:

def karatsuba(A, B):
    if(len(A) == 1 or len(B) == 1):
        return Multiply(A, B)

    n = max(len(A), len(B))
    m = n / 2

    print "Karatsuba call"

    print "A", A, "\n"
    print "B", B, "\n"

    lowA = A[:m]
    highA = A[m:]

    lowB = B[:m]
    highB = B[m:]

    print "highA", highA, "\n"
    print "lowA", lowA, "\n"

    print "highB", highB, "\n"
    print "lowB", lowB, "\n"

    s1 = karatsuba(highA, highB)
    s2 = karatsuba(lowA, lowB)
    s3 = karatsuba(Add(highA, lowA), Add(highB, lowB))

    f1 = Multiply(s1, pow2(n))
    f2 = Multiply(Sub(Sub(s3, s1), s2), pow2(m))
    return Add(f1, Add(f2, s2))

但是使用输入运行(记住 MSB 是最右边的位):

A [0, 1, 1] 
B [0, 1, 1] 

我得到 Product Karatsuba [0, 0, 0, 1, 0, 0, 1, 0] 72 但它应该输出 [0, 0, 1, 0, 0, 1] 36 。函数 Add、Substract、pow2 和 Multiply 正在工作,我已经分别测试了它们。如果它有帮助,这里是打印语句的完整输出:

Karatsuba call
A [0, 1, 1] 

B [0, 1, 1] 

highA [1, 1] 

lowA [0] 

highB [1, 1] 

lowB [0] 

Karatsuba call
A [1, 1] 

B [1, 1] 

highA [1] 

lowA [1] 

highB [1] 

lowB [1] 

Karatsuba call
A [0, 1] 

B [0, 1] 

highA [1] 

lowA [0] 

highB [1] 

lowB [0] 

Karatsuba call
A [1, 1] 

B [1, 1] 

highA [1] 

lowA [1] 

highB [1] 

lowB [1] 

Karatsuba call
A [0, 1] 

B [0, 1] 

highA [1] 

lowA [0] 

highB [1] 

lowB [0] 

我正在寻找几个小时,但我不知道我的错误在哪里。有人可以帮助我吗?谢谢

【问题讨论】:

  • @greybeard 抱歉,我不确定我明白你的意思?
  • 你确定你的算术函数给出了正确的结果吗?如果是这样,那么最终结果的 MSB 中怎么会有零?它不应该总是 1(除非值为零)?
  • @samgak 是的,他们给了我;我只是添加来实现正确的 pow2n(如果你愿意,我可以展示它)。我不知道为什么会有这个额外的 0。
  • 是的,请张贴。您的打印语句输出对我来说看起来是正确的,所以我怀疑它不是您发布的代码。另外,如果您将 Add(f1, Add(f2, s2)) 分配给变量并在从函数返回之前将其打印出来,您会得到什么日志?
  • @samgak 我试着用钢笔和铅笔计算这个,用算法描述。我得到的最终结果是 9*2^3,这确实是 72。所以要么我误解了算法,要么是我给出的描述有误(这很奇怪,因为这是我的课程幻灯片)。有可能吗?

标签: python algorithm multiplication


【解决方案1】:

错误是这个:

f1 = Multiply(s1, pow2(n))

应该是:

f1 = Multiply(s1, pow2(2*m))

确实,(a1*2^m+a0)*(b1*2^m+b0)=(a1*b1)*2^(2m) + (a0*b1+a1*b0)*2^m + (a0*b0)

如果n > (2*m),那是一个奇数n,那么你做错了……

【讨论】:

  • 哦!非常感谢!我想我在我的论文上执行算法时犯了同样的错误!现在它可以工作了:)
  • 所以澄清一下;伪代码有点误导吗?它说它应该是 s1 * 2^n 但实际上它是 s1 ^ 2*(n/2) 并且由于整数除法它不会产生相同的结果,对吗?我虽然可以做出同样的假设,但显然我错了......
  • 事后思考,这听起来类似于stackoverflow.com/questions/17531042/…
猜你喜欢
  • 2023-03-27
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2021-07-14
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
相关资源
最近更新 更多