首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Karatsuba算法-实现中的错误

Karatsuba算法-实现中的错误
EN

Stack Overflow用户
提问于 2015-02-25 08:12:38
回答 1查看 174关注 0票数 1

我很难在python中实现karatsuba算法。我正在处理基2中的列表( MSB在列表的末尾)。我得到的实施如下:

代码语言:javascript
复制
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实现:

代码语言:javascript
复制
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是最右边的):

代码语言:javascript
复制
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都在工作,我已经分别测试了它们。如果有帮助的话,下面是print语句的完整输出:

代码语言:javascript
复制
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] 

我已经找了好几个小时了,我不知道我的错误在哪里。有人能帮我吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-25 17:44:18

错误是这个:

代码语言:javascript
复制
f1 = Multiply(s1, pow2(n))

它应该是:

代码语言:javascript
复制
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,那么你做的事情是错误的.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28714134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档