슈트라센 알고리즘 증명
📂행렬대수슈트라센 알고리즘 증명
알고리즘
k∈N 에 대해 n=2k 이라고 하자. A,B∈Rn×n 에 대해 조던 블록 행렬 표현을 사용해 다음과 같은 8개의 2n×2n 행렬 Ai, Bi 들을 생각해보자.
AB=[A1A3A2A4][B1B3B2B4]=[C1C3C2C4]=C
C=AB 를 구하기 위해 다음을 계산한다.
P1=A1(B2−B4)P2=(A1+A2)B4P3=(A3+A4)B1P4=A4(B3−B1)P5=(A1+A4)(B1+B4)P6=(A2−A4)(B3+B4)P7=(A3−A1)(B1+B2)
C1=−P2+P4+P5+P6C2=P1+P2C3=P3+P4C4=P1−P3+P5+P7
AiBj 를 계산할 때도 같은 방법을 반복하면 그 시간복잡도는 Θ(n2.807) 이다.
- 물론 n=2k 라고 해서 쓸 수 없는 것은 아니고, 사이즈를 조정해서 그대로 적용시켜도 된다.
설명
상식적이고 곧바로 떠올릴 수 있는 행렬의 곱셈은
C1=A1B1+A2B3C2=A1B2+A2B4C3=A3B1+A4B3C4=A3B2+A4B4
이 계산을 계속 반복하면 되는데, 여기에 걸리는 시간이 Θ(n3) 라는 것은 의심의 여지가 없었다. 슈트라센이 태어나기 전까진 말이다.
이 알고리즘은 아주 아주 획기적인데, 본디 한 개의 Ci 을 계산하는데는 반드시 두 번의 행렬 곱셈이 필요하기 때문이다. 합쳐서 한번 계산할 때마다 8번을 계산해야하는데, 슈트라센은 이것을 7번으로 줄였다. 저 방법 외에 달리 방법이 있을까 고민한 것부터가 비범한 센스고, 정말 찾아낸 것은 불가사의하다고까지 말할 수 있을 정도다. 이 알고리즘의 개발로 인해서 행렬 계산에 쓰였을 자원들을 조금이나마, 아니 엄청나게 많이 아낄 수 있다.
증명
Part 1. 계산가능성
그냥 직접 계산해보는 수밖에 없다.
Part 1-1. C1=A1B1+A2B3
C1=====−P2+P4+P5+P6(−A1B4−A2B4)+P4+(A1B1+A1B4+A4B1+A4B4)+P6−A2B4+(A4B3−A4B1)+A1B1+A4B1+A4B4+P6−A2B4+A4B3+A1B1+A4B4+(A2B3+A2A4−A4B3−A4B4)A1B1+A2B3
Part 1-2. C2=A1B2+A2B4
C2===P1+P2(A1B2−A1B4)+(A1B4+A2B4)A1B2+A2B4
Part 1-3. C3=A3B1+A4B3
C3===P3+P4(A3B1+A4B1)+(A4B3−A4B1)A3B1+A4B3
Part 1-4. C4=A3B2+A4B4
C4=====P1−P3+P5+P7(A1B2−A1B4)−P3+(A1B1+A1B4+A4B1+A4B4)+P7A1B2+(−A3B1−A4B1)+A1B1+A4B1+A4B4+P7A1B2−A3B1+A1B1+A4B4+(A3B1+A3B2−A1B1−A1B2)A3B2+A4B4
Part 2. 시간복잡도
본질적으로 원래의 계산법이 Θ(n3) 이라는 것을 증명한 방법과 같다. 한번 계산하는데 걸리는 시간이 T(n) 이고 반복 외의 수행시간을 c 라고 하면 T(n)=7T(2n)+c 이므로
T(n)=====≈===7T(2n)+c7[7T(4n)+c]+c7[49T(8n)+7c+c]+c73T(8n)+(1+7+72)c73T(8n)+7−173−1c⋮7log2n(T(1)+c)nlog27(T(1)+c)n2.807(T(1)+c)Θ(n2.807)
■