目录
[a.请证明等式编辑 5.4节使用了这个等式。](#a.请证明等式编辑 5.4节使用了这个等式。)
[b. 作为M(n)的闭合公式来说, 为什么要比好?](#b. 作为M(n)的闭合公式来说, 为什么要比好?)
a.在大整数乘法算法的乘法次数M(n)中,为什么不把乘以10^n时所做的乘法包括进去?
b.为了简单起见,我们假设n是2的乘方,其实,在建立M(n)的递推关系时,我们做出了另一个微妙的假设,它并不总是成立的(然而,它并不会改变最后的答案)。你能指出这个假设吗?
5.在用笔算算法计算两个n位数乘法时,需要做多少次一位数的加法?可以忽略进位导致的加法。
[6.验证 Strassen算法在计算2×2矩阵的乘法时所用到的公式。](#6.验证 Strassen算法在计算2×2矩阵的乘法时所用到的公式。)
[7. 应用 Strassen算法来计算](#7. 应用 Strassen算法来计算)
[8.对 Strassen算法用到的加法次数的递推关系式求解。假设n是2的乘方。](#8.对 Strassen算法用到的加法次数的递推关系式求解。假设n是2的乘方。)
[9.潘(V. Pan)发明了一种矩阵乘法的分治算法([Pan78]),它的理论根据是两个 70 阶的矩阵相乘需要143640 次乘法运算。求潘的算法的渐近效率(可以忽略加法)并将它和 Strassen算法进行比较。](#9.潘(V. Pan)发明了一种矩阵乘法的分治算法([Pan78]),它的理论根据是两个 70 阶的矩阵相乘需要143640 次乘法运算。求潘的算法的渐近效率(可以忽略加法)并将它和 Strassen算法进行比较。)
1.两个十进制n位数的积最少能拥有多少位数?最多呢?
最小 n 位数:
最大的n位数:
因此最小的的积是,2n-1位数
最大的积是,2n位数
2.用课文中介绍的分治算法来计算2101×1130。
分治公式:

将2101分为21、01,1130分为11、30
则
其中又对于21*11有
其余式子同理
最终有原式
其中01*30=30,21*11=231,21*30=630
3.
a.请证明等式
5.4节使用了这个等式。
对两边取log_b,有

b. 作为M(n)的闭合公式来说, 为什么
要比
好?
log_2 3 ≈1.58,处于n^1和n^2,而后者是指数与对数混合形式,形式混乱,不适合作为闭合公式
4.
a.在大整数乘法算法的乘法次数M(n)中,为什么不把乘以10^n时所做的乘法包括进去?
因为乘以 10ᵏ (10 的整数次幂)在二进制 / 十进制表示中只是移位操作 ,只需要把数字左移、后面补 0 ,不涉及真正的乘法运算,所以不计入乘法次数 M(n)。
b.为了简单起见,我们假设n是2的乘方,其实,在建立M(n)的递推关系时,我们做出了另一个微妙的假设,它并不总是成立的(然而,它并不会改变最后的答案)。你能指出这个假设吗?
大整数递推式为:M(n)=3M(n/2),默认了:把 n 位数拆成两个 n/2 位数后,得到的数仍然是 n/2 位。
但实际并不一定成立:
- 比如 1000 拆成 10 和 00,后者只有 1 位,不是 2 位
- 高位可能为 0,导致子问题的实际位数 < n/2
但最终结果上来看
- 位数变少 → 乘法次数只会更少
- 最坏情况仍然是 每边都是满 n/2 位
- 所以渐近复杂度 仍然是 Θ(n^{log₂3})
5.在用笔算算法计算两个n位数乘法时,需要做多少次一位数的加法?可以忽略进位导致的加法。
-
用第二个数的每一位去乘第一个数,一共得到n 行中间结果,每行 n 位。
-
最后要把这 n 行对齐相加。
-
每一列上有 n 个数字 ,把 n 个数加起来,需要 n−1 次一位加法。
-
一共有 n 列。
而第一列和最后一列没有加法操作,因此只有(n-1)^2次
6.验证 Strassen算法在计算2×2矩阵的乘法时所用到的公式。
设矩阵为:


其中,


单独验证即可
7. 应用 Strassen算法来计算

当n=2时停止递归,也就是说,是用蛮力法来计算2×2矩阵的积。
结果为:

8.对 Strassen算法用到的加法次数的递推关系式求解。假设n是2的乘方。
递推式:

由分治法主定理:a=7,b=2,c=2,a<b^d,所以
效率为Θ()≈Θ(
)
9.潘(V. Pan)发明了一种矩阵乘法的分治算法([Pan78]),它的理论根据是两个 70 阶的矩阵相乘需要143640 次乘法运算。求潘的算法的渐近效率(可以忽略加法)并将它和 Strassen算法进行比较。
可得公式

其中k=143640,所以M(n) ∈Θ()大约为
,效率大于Strassen算法