【发布时间】:2014-10-06 01:46:25
【问题描述】:
两个数相乘
x*y ----> x =(x0*10^(n/3)+x1*10^(n/3)+x2) and y=(y0*10^(n/3)+y1*10^(n/3)+y2)
它是 10^n/3 个数的 9 次乘法,所以 9T(n/3) 但可以通过以下方法减少到 5。
x*y= x0*y0+x1*y1+x2*y2+x0*y1+x0*y2+x1*y0+x1*y3+x2*y0+x2*y1
我可以通过类似 Karatsuba 算法的技巧将两个数字的乘法减少到 5T(n/3)
(x0+x1+x2)(y0+y1+y2)-x0*y0-x1*y1-x2*y2= x0*y1+x0*y2+x1*y0+x1*y3+x2*y0+x2*y1
n/3 位数字的全部和全部 5 次乘法,所以 5T(n/3)+O(n) 但我怎么能像 6T(n/3)+O(n) 那样进行 6 次乘法运算
Q1 可以减少到 6 而不是 5 吗?
[edit1]从 Spektre 重新提出的问题中复制的更正
x 和 y 有 n 位
x=x0*(10^2n/3)+x1*10^n/3+x2
y=y0*(10^2n/3)+y1*10^n/3+y2
x*y=x2y2+(x2y1+x1y2)10^n/3+(x2y0+x1y1+x0y2)10^2n/3+(x1y0+x0y1)10^n+x0y0*10^4n/3
- 现在 n/3 位数字的 9 次乘法运行时间为 9T(n/3),即 O(n^2)
像 Karatsuba 的乘法这样的小技巧:
- 首先计算 x0y0、x1y1 和 x2y2 这是 n/3 位数字的 3 次乘法
- 然后使用 x0y0、x1y1 和 x2y2 计算其他如下:
-
x2y1+x1y2=(x1+x2)(y1+y2)-x1y1-x2y2->> n/3 位数的 1 次乘法 -
x2y1+x1y1+x0y2=(x0+x2)(y0+y2)-x0y0-x2y2+x1y1->> n/3 位数的 1 次乘法 -
x1y0+x0y1=(x0+x1)(y0+y1)-x0y0-x1y1->> n/3 位数的 1 次乘法
递归解决6个子问题
- 并将它们与 O(n) 位数字上的 7 个加法相结合。
- 现在总共需要 n/3 位数字的 6 次乘法运行时间 6T(n/3)
Q2 如何将其减少到 5 次而不是 6 次?
- 由于 OP 中的错误,Q1 现已过时
【问题讨论】:
-
您的第二个公式显示了九个部分产品,但似乎缺乏缩放。您声称五个((n / 3)+ c)乘法和第三个等式(左边四个乘积,右边六个)让我迷失了:有什么联系?六个而不是五个(n/3 乘法?)有什么优势? (第一个等式可能应该是
x=(x0*10^(2n/3)+x1*10^(n/3)+x2) ...,从这里的十进制数字切换到更远的位没有帮助。) -
仅供参考,他在stackoverflow.com/q/26218011/2336725 重新提出了这个问题。但这是更进一步的,所以我想说我们忽略重新询问,把注意力集中在这里。
-
@Teepeemm 已将重新提出的问题正文 + 重新格式化和样式复制到此问题中。
-
1.现在我有点困惑,首先你想要 5 muls,现在 6 是什么? 2.您是否验证了您的解决方案? 3. 顺便说一句,这个三重递归的意义通常比减半要慢,因为堆/堆栈垃圾更少(即使三元组的复杂性要好一些)
标签: algorithm math multiplication