10

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

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

4

3 回答 3

7

大多数情况下,操作数的长度不会是 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 :) 所以,我看不到任何长度不同的内存问题数字。

于 2013-08-12T08:41:14.807 回答
2

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

例如:123*12

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

于 2018-05-04T15:01:19.043 回答
1

在上面的评论中回答您的疑问。诀窍是在小数计算的情况下按照公式计算 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 它详细解释。

于 2017-01-26T02:49:58.720 回答