使用 Strassen 算法将 2 个数字与 n 位相乘的算法
Posted
技术标签:
【中文标题】使用 Strassen 算法将 2 个数字与 n 位相乘的算法【英文标题】:Algorithm to multiply 2 numbers with n bits using Strassen's algorithm 【发布时间】:2016-02-17 20:35:24 【问题描述】:设计并分析一种算法,将 2 个数字 A 和 B 相乘,每个 n 位长,但使用 Strassen 算法将它们分成 3 个大小相等的部分。您可以获得的最佳运行时间是多少?
我有两个长度为 n 的数字,并将它们分成三个相等的部分。例如,123 分为 1、2 和 3。根据我的理解,我必须使用矩阵。但是,Strassen 的算法对我来说没有任何意义。
我观看了视频并阅读了讲座,但仍然不知道如何进行。任何帮助将不胜感激,谢谢!
【问题讨论】:
您尝试使用哪些来源?您究竟需要帮助理解什么? 我在 YouTube 上查看了有关 stassens 算法及其解释的视频,但我不确定我是否正确地处理了这个问题。我有两个长度为 N 的数字,我需要将它们分成 3 个相等的部分。这是否意味着我将制作三个不同的矩阵。这个数字最终将如何等于结果以及(如果我认为正确的话)这三个部分是如何分开的 Schonhage-Strassen 整数乘法算法不会将输入分成块。也许你被要求实现 Tom-Cook? en.m.wikipedia.org/wiki/Toom–Cook_multiplication 这里写着 Strassen:i.imgur.com/20yLNJi.png. 我想我现在看到了。您应该使用 Strassen 的矩阵乘法算法背后的思想来实现整数乘法:找出一种使用少于 9 个 n/3 位数字的乘积来计算乘积的方法。与矩阵无关。 【参考方案1】:由于这是作业,我先给个提示:
将两个 n 位数字分成三个块意味着将它们表示为 X = x_0 + x_1 b + x_2 b^2
和 Y = y_0 + y_1 b + y_2 b^2
,其中 b
是基数,例如 b = 2^(n/3)
。计算他们的产品XY
。它将是一个以b
为基数的 4 次多项式。
这个多项式的系数可以通过这 6 个乘积的加减法计算得出:
x_0 y_0
x_1 y_1
x_2 y_2
(x_0 + x_1)(y_0 + y_1)
(x_0 + x_2)(y_0 + y_2)
(x_1 + x_2)(y_1 + y_2)
这样计算 XY 的乘积的工作已经从计算 n/3 位数的 9 个乘积减少到只有 6 个,比学校教授的 O(n^2) 方法更快。
【讨论】:
以上是关于使用 Strassen 算法将 2 个数字与 n 位相乘的算法的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 numpy 矩阵的 Strassen 算法的输出矩阵不正确