python-3.x - python中的karatsuba算法实现
问题描述
下面是我对 Karatsuba 乘法算法的 python 实现。此代码似乎适用于大多数输入,但在数字变得太大后开始失败。例如,对于 64 位输入
x = 3141592653589793238462643383279502884197169399375105820974944592
y = 2718281828459045235360287471352662497757247093699959574966967627
,算法会失败。但是当我只使用前 35 位数字时,该算法有效。谁能解释这个实现的不足之处?
from math import floor, ceil
def karatsuba(x, y):
sx = str(x)
sy = str(y)
n = max(len(sx), len(sy))
if len(sx) == 1 and len(sy) == 1:
return x*y
m = ceil(n/2)
a = int(x / (10**m))
b = int(x % (10**m))
c = int(y / (10**m))
d = int(y % (10**m))
ac = karatsuba(int(a), int(c))
bd = karatsuba(int(b), int(d))
adbc = karatsuba(int(a) + int(b), int(c) + int(d)) - ac - bd
return int(str(ac) + '0' * 2 * m) + int(str(adbc) + '0' * m) + bd
解决方案
a = int(x / (10**m))
c = int(y / (10**m))
这两行容易出现舍入错误。在python3中,/
运算符是浮点除法运算符。只需更改/
为//
整数除法即可。
试试这段代码看看问题
x = 2222222222222222222222222222222222
p = 10**17
print(int(x/p))
print(int(x//p))
推荐阅读
- java - 有没有办法“刷新” Springframework Repository?
- dictionary - SASS 地图必须在一条线上吗?
- apache-spark - 如何在pyspark中读取二进制数据
- java - 链接多个 GLES 2.0 程序
- r - 检查一个 data.table 列中的所有元素以查看另一个 data.table 列中每个值出现的最快方法
- neo4j - Neo4j 我可以对关系进行排序吗?
- ios - 是否可以使用 Swift 或 Objective-c 从 iOS 上的本机应用程序将语音流式传输到 Directline API
- python - 没有子类化的最基本的日志处理程序
- assembly - 如何使用 nasm 编译 x86 汇编代码?我收到一个错误
- angular - Angular Material:突出显示文本框中的单词