【问题标题】:Karatsuba Multiplication for unequal size, non-power-of-2 operands不等大小、非 2 次幂操作数的 Karatsuba 乘法
【发布时间】:2013-05-12 00:23:54
【问题描述】:

实现Karatsuba 大数乘法的最有效方法是什么?输入操作数大小不相等且大小不是 2 的幂,甚至可能不是偶数?填充操作数意味着额外的内存,我想尝试使其内存-高效。

我在非偶数大小的 Karatsuba 中注意到的一件事是,如果我们尝试将数字分成尽可能接近偶数的“两半”,那么一半将有 m+1 个元素,而另一半将有 m 个元素,其中 m = floor(n/2),n 是拆分数中的元素数。如果两个数的奇数大小相同,那么我们需要计算大小为 m+1 的两个数的乘积,需要 n+1 存储,而不是 n 为偶数时的 n。所以我猜测奇数尺寸的 Karatsuba 可能比偶数尺寸需要更多的内存吗?

【问题讨论】:

标签: algorithm multiplication largenumber


【解决方案1】:

大多数情况下,操作数的长度不是 2 的幂。我认为这种情况很少见。大多数时候会有不同长度的操作数。但这对于 Karatsuba 算法来说不是问题。

实际上,我认为这里没有任何问题。这个开销(奇怪的长度)非常轻,绝对不是什么大问题。关于不同长度的问题 - 假设 X = 1234 和 Y = 45

所以,a = 12,b = 34,c = 0,d = 45 所以,在那之后X * Y = 10 ^ 4 * ac + 10 ^ 2 (ad + bc) + bd

ac = 0;
bd = 34 * 45;
ad + bc = (a + b) * (c + d) - ac - bd = 540;

而且,如果我们假设,我们可以轻松地将 2 位数字相乘 - 你可以得到答案 = 55530。同样,只要在任何计算器中乘以 1234 * 45 :) 所以,我看不出有任何内存问题不同长度的数字。

【讨论】:

  • 如果 x = 123 那么如何将数字分成两部分?
  • a = 1,b = 23,我猜。
  • 不,我认为如果n位数是奇数,这个算法将不起作用
  • @Mastan 你能检查我的解决方案吗
【解决方案2】:

您可以将数字乘以 10 的幂,这样每个数字的位数都是偶数。应用 karatsuba 算法,他们将答案除以您将原始 2 个数字相乘以使它们相等的 10 次幂。

例如:123*12

计算 1230*1200 并将答案除以 1000。

【讨论】:

    【解决方案3】:

    在上面的 cmets 中回答您的疑问。诀窍是在小数计算的情况下按照公式计算 10 的幂。

    10^2m(A.C) + 10^m((A+B).(C+D)-A.C-B.D) + B.D
    
    m = n/2 + n%2
    
    n is length of number
    

    请参阅它详细解释的 wiki。

    【讨论】:

    • n is length of number - 两个相乘的数字中的哪一个?
    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多