首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Karatsuba算法,稍有不准确

Karatsuba算法,稍有不准确
EN

Stack Overflow用户
提问于 2022-02-05 00:48:30
回答 1查看 85关注 0票数 1

我花了一段时间用Python实现Karatsuba的算法,但是当我试图将两个较大的数字(超过10^15)相乘时,我的结果开始变得不准确。我搞不懂为什么。

附带问题:我的基本情况是否有一种方法:“(而不是两者之一)x和y都严格地小于10”。

代码语言:javascript
复制
def karatsuba(x, y):
    # 1. Split ints

    if x <= 10 or y <= 10:
        #Base case
        return x * y

    n_x = ceil(log(x, 10))  # Nb of digits in x
    n_y = ceil(log(y, 10))

    n = max(n_x, n_y)

    b = int(x % (10 ** (n // 2)))
    a = int(x / (10 ** (n // 2)))
    d = int(y % (10 ** (n // 2)))
    c = int(y / (10 ** (n // 2)))

    # 2. Recursive calls

    ac = karatsuba(a, c)
    bd = karatsuba(b, d)
    kara = karatsuba((a + b), (c + d))

    res = ac * (10 ** (2*(n//2))) + (kara - ac - bd) * (10 ** (n//2)) + bd

    return res

例子:

代码语言:javascript
复制
x = 151222321858446622145369417738339374
y = 875336699541236667457869597252254524
karatsuba(x, y)

返回:

代码语言:javascript
复制
132370448112535269852891372864998437604548273605778561898354233338827976

而不是:

代码语言:javascript
复制
132370448112535277024334963430875927265604725663292579898354233338827976
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-05 01:13:15

由于您的float部门,您通过/就失去了精度。使用//代替。然后,您也不需要转换回int。更好的是,使用divmod

代码语言:javascript
复制
    N = 10 ** (n // 2)
    a, b = divmod(x, N)
    c, d = divmod(y, N)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70994440

复制
相关文章

相似问题

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