私はKaratsubaの乗算をしようとしています。桁数が16を超えたときはいつでも、例えば10Pythonは乗算時に末尾にガベージ値を追加します
の力を掛ける場合、Pythonは端部にごみ値を満たす:
5789640666777942 * POW(10、16)= 57896406667779421501721023610880
OR
10023051467610476 * pow(10,8)= 1002305146761047575625728
私はこれを解決するために賢明です。私は1ヶ月(この間の他の部分もある)からこのコードについて作業してきました。どんな助けもありがとう。
EDIT:全体のコードを投稿する:
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
問題は、出力が浮動小数点として出力されます。組み込み**でより良い作品。
いずれの例も再現できません。問題を示す完全な例を投稿してください。 (私の推測では、中間浮動小数点値を持っていると思います)。 – molbdnilo
質問が更新されました。今すぐチェックできますか? –
お待ちください、あなたのKaratsuba関数は間違った出力をしていますか?または比喩の倍数? –