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