2017-08-19 78 views
1

我想要做Karatsuba乘法運算。Python在乘法運算的末尾添加垃圾值

5789640666777942 * POW(10,16)= 57896406667779421501721023610880

OR

:每當的位數超過16,蟒在端部通過的10

例如功率乘以當填充無用值

10023051467610476 * pow(10,8)= 1002305146761047575625728

我在我的智慧結尾解決這個問題。自從一個月以來我一直在處理代碼(其他部分介於兩者之間)。任何幫助將不勝感激。

編輯:發佈整個代碼:

def Karatsuba(X, Y, n): 
    m = long(ceil(1.0*long(long(n)/2))) 
    n = long(2*long(m)) 
    dem = pow(10, long(m)) 
    a = long(long(X)/dem) 
    b = long(long(X)%dem) 
    c = long(long(Y)/dem) 
    d = long(long(Y)%dem) 
    print "X %d Y %d" % (X, Y) 
    print "a b c d n m = %d %d %d %d %d %d" %(a, b, c, d, n, m) 

    if n > 2: 
     print "n > 2 hence m n %d %d" % (m, n) 
     p = long(Karatsuba(long(a), long(c), long(m))) 
     print "p = %d" % p 
     q = long(Karatsuba(long(b), long(d), long(m))) 
     print "q = %d" % q 
     r = long(Karatsuba(long(long(a)+long(b)), long(long(c)+long(d)), long(m))) 
     print "r = %d" % r 
     r = long(long(r) - long(p) - long(q)) 
     print "p = %d" % p 
     print "q = %d" % q 
     print "r = %d" % r 
    else: 
     print "n <= 2 hence m n %d %d" % (m, n) 
     p = a*c 
     print "P, A, C = %d %d %d" % (p, a, c) 
     q = b*d 
     print "Q, B, D = %d %d %d" % (q, b, d) 
     r = (a+b) * (c+d) - p - q 
     print "P = %d" % p 
     print "Q = %d" % q 
     print "R = %d" % r 


    result = long(add(add(long(q), long(long(r) * pow(10, long(m)))), long(long(p) * pow(10, long(n))))) 
    print "result %d p %d n %d p*pow(10, n) %d r %d m %d r*pow(10, m) %d q %d" %(long(result), long(p), long(n), long(long(p)*pow(10, long(n))), long(r), long(m), long(long(r)*pow(10, long(m))), long(q)) 
    return str(result) 


X = long(argv[1]) 
Y = long(argv[2]) 

print Karatsuba(X, Y, len(argv[1])) 

我試圖乘:7878064237045606和7349065192669285

我使用的64位計算機。而python是2.7.12。 64位。

完成問題。發現解決方案在這裏:
Karatsuba algorithm working for small numbers but not for big ones, can't see why

問題是功率函數給出輸出爲浮動。內置**效果更好。

+1

我無法重現您的任何示例。發佈一個展示該問題的完整示例。 (我的猜測是你有一箇中間浮點值。) – molbdnilo

+0

更新了問題。你現在可以檢查嗎? –

+0

等一下,你的Karatsuba功能給出了錯誤的輸出?或蟒增殖? –

回答

0

使用Decimal包,但一定要替換所有值,否則可能無法使用。

+0

這個答案可以通過解釋爲什麼Decimal包會有所幫助,以及如何使用它的簡短演示以及指向API的鏈接來改進。 – SethMMorton

+0

非常真實,但在等待公共汽車的小型電話上接聽時很難實現! – djspoulter