4.2-1
就是代入书中的式子计算一下,令
A = [ 1 3 7 5 ] B = [ 6 8 4 2 ] A= \begin{bmatrix} 1&3 \\ 7&5 \end{bmatrix} B= \begin{bmatrix} 6&8 \\ 4&2 \end{bmatrix} A=[1735]B=[6482]
S 1 = B 12 − B 22 = 8 − 2 = 6 S_1=B_{12}-B_{22}=8-2=6 S1=B12−B22=8−2=6
同理,S2=4,S3=12,S4=-2,S5=6,S6=8,S7=-2,S8=6,S9=-6,S10=14
再代入P的计算公式:
P 1 = A 11 ∗ S 1 = 1 ∗ 6 = 6 P_1=A_{11}*S_1=1*6=6 P1=A11∗S1=1∗6=6
同理可得P2=8,P3=72,P4,=-10,P5=48,P6=-12,P7=-84
代入计算C的公式:
C 11 = P 5 + P 4 − P 2 + P 6 = 18 C_{11}=P_5+P_4-P_2+P_6=18 C11=P5+P4−P2+P6=18
C 12 = 14 , C 21 = 62 , C 22 = 66 C_{12}=14,C_{21}=62,C_{22}=66 C12=14,C21=62,C22=66
这就是结果了。
4.2-2
伪代码如下所示:
Strassen(A,B):
n=A.rows
let C be a new n*n matrix
let P be a new 1*7 matrix
let S be a new 1*10 matrix
if n==1:
return A[1,1]*B[1,1]
else:
partion A,B and C as in equations(4.9)
S[1]=B[1,2]-B[2,2]
...
S[10]=B[1,1]+B[1,2]
P[1]=Strassen(A[1,1],S[1])
...
P[7]=Strassen(S[9],S[10])
C11=P5+P4-P2+P6
C12=P1+P2
C21=P3+P4
C22=P5+P1-P3-P7
return C
4.2-3
通过补0的方式将其扩展为n*n即可,strassen的算法时间复杂度就是 Θ ( n l g 7 ) \Theta(n^{lg7}) Θ(nlg7)。
4.2-4
题目意思是(4.9)不再按 n / 2 ∗ n / 2 n/2*n/2 n/2∗n/2这样来分矩阵,而是按照 n = 3 m n=3^m n=3m次幂,分成的子矩阵为 n / 3 ∗ n / 3 n/3*n/3 n/3∗n/3,按照式(4.17)可以写出这样分的递归式为:
T ( n ) = k ∗ T ( n / 3 ) + Θ ( n 2 ) T(n)=k*T(n/3)+\Theta(n^2) T(n)=k∗T(n/3)+Θ(n2)
用主方法解上述递归式为: Θ ( n log 3 k ) \Theta(n^{\log_3k}) Θ(nlog3k),接下来解出满足如下方程的k即可:
log 3 k < log 2 7 \log_3k<\log_27 log3k<log27
解得k=21
4.2-5
由4.2-4中的递归式可知,时间复杂度为 Θ ( n log x y ) \Theta(n^{\log_xy}) Θ(nlogxy)其中x是矩阵的维度,y是运算乘法次数,那么对于每种方法代入x和y可以计算他们的时间复杂:
log 68 132464 , log 70 143640 , log 72 155424 \log_{68}132464,\log_{70}143640,\log_{72}155424 log68132464,log70143640,log72155424
4.2-6
原本两个复数的乘法计算需要四次实数乘法,通过类似strassen算法的思想,通过线性组合的方式可以减少一次乘法:
令 A = ( a + b ) ( c + d ) = a c + a d + b c + b d A=(a+b)(c+d)=ac+ad+bc+bd A=(a+b)(c+d)=ac+ad+bc+bd
A式中只有中间那项带括号的乘法是真正需要计算的,右边的那项只是说明A式与原始数据的关系。
B = a c , C = b d B=ac,C=bd B=ac,C=bd 均只需要一次乘法计算
最后的结果为:
( B − C ) + ( A − B − C ) i (B-C)+(A-B-C)i (B−C)+(A−B−C)i