使用 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^2Y = 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 位相乘的算法的主要内容,如果未能解决你的问题,请参考以下文章

Strassen算法

strassen算法

strassen算法

使用带有 numpy 矩阵的 Strassen 算法的输出矩阵不正确

关于strassen矩阵乘法的矩阵大小不是2^k的形式时,时间复杂度是否还是比朴素算法好的看法

Strassen优化矩阵乘法(复杂度O(n^lg7))