필립 클라인의 저서 코딩 더 매트릭스 11장 특수 기저
다항식의 평가와 인터폴레이션을 알아봅니다.
내적이 복소수 필드에 대해 적용될 때 정의를 알아봅니다.
이산 푸리에 변환과 고속 푸리에 변환 (FFT)를 알아봅니다.
순환행렬의 특징을 알아봅니다.
다항식 평가와 인터폴레이션 (interpolation)
차수가 d d d 인 다항식(polynomial)은 다음 형태를 가지는 단일 변수의 함수입니다.
f ( x ) = a 0 1 + a 1 x 1 + a 2 x 2 + . . . + a d x d f(x) = a_0 1 + a_1 x^1 + a_2 x^2 + ... + a_d x^d f ( x ) = a 0 1 + a 1 x 1 + a 2 x 2 + . . . + a d x d
함수 f ( x ) f(x) f ( x ) 의 x x x 값을 대입해 값을 얻는 것을 다항식을 평가 한다고 합니다. 예를 들어 다항식 2 + 3 x + x 2 2 + 3x + x^2 2 + 3 x + x 2 을 7에 대해 평가하면 72를 얻습니다.
다항식의 차수가 2이상일 때 함수 자체는 선형함수가 아니지만 각 변수 x x x 의 값을 달리하고 행렬-벡터 곱셈으로 표현하면 선형함수입니다. 예를 들어 r i d r_i^d r i d 를 f ( x ) f(x) f ( x ) 에 대입하는 행렬-벡터 곱셈은 다음과 같이 표현할 수 있습니다.
[ r 0 0 r 0 1 r 0 2 r 0 3 r 1 0 r 1 1 r 1 2 r 1 3 . . . r k − 1 0 r k − 1 1 r k − 1 2 r k − 1 3 ] [ a 0 a 1 a 2 a 3 ] \begin{bmatrix}
r_0^0 & r_0^1 & r_0^2 & r_0^3 \\
r_1^0 & r_1^1 & r_1^2 & r_1^3 \\
& ... & & \\
r_{k-1}^0 & r_{k-1}^1 & r_{k-1}^2 & r_{k-1}^3
\end{bmatrix}
\begin{bmatrix}
a_0 \\
a_1 \\
a_2 \\
a_3
\end{bmatrix} ⎣ ⎢ ⎢ ⎢ ⎡ r 0 0 r 1 0 r k − 1 0 r 0 1 r 1 1 . . . r k − 1 1 r 0 2 r 1 2 r k − 1 2 r 0 3 r 1 3 r k − 1 3 ⎦ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎡ a 0 a 1 a 2 a 3 ⎦ ⎥ ⎥ ⎥ ⎤
왼쪽의 행렬은 x d x^d x d 에 대입한 값에 대응합니다. 오른쪽 벡터는 다항식의 계수입니다. 다항식의 평가가 위 행렬-벡터 곱셈 연산을 수행하는 것이라면 반대로 결과값을 알고 계수를 구하는 것을 인터폴레이션(interpolation) 이라 합니다. 다항식 평가와 인터폴레이션은 역함수 관계입니다.
복소수 필드에 대한 내적
복소수 필드상의 벡터들에 대한 내적은 다음과 같이 정의됩니다.
⟨ u , v ⟩ = u ˉ ⋅ v \langle u, v \rangle = \bar{u} \cdot v ⟨ u , v ⟩ = u ˉ ⋅ v
여기서 u ˉ \bar{u} u ˉ 는 u u u 의 켤레 복소수 벡터입니다. 이러한 정의는 복소수 벡터 v v v 의 norm이 음수가 아님을 보장합니다.
⟨ v , v ⟩ = [ z 1 ˉ , . . . , z n ˉ ] ⋅ [ z 1 , . . . , z n ] = z 1 ˉ z 1 + . . . + z n ˉ z n = ∣ z 1 ∣ 2 + . . . + ∣ z n ∣ 2 \begin{aligned}
\langle v, v \rangle & = [\bar{z_1}, ..., \bar{z_n}] \cdot [z_1, ..., z_n] \\
& = \bar{z_1} z_1 + ... + \bar{z_n} z_n \\
& = |z_1|^2 + ... + |z_n|^2
\end{aligned} ⟨ v , v ⟩ = [ z 1 ˉ , . . . , z n ˉ ] ⋅ [ z 1 , . . . , z n ] = z 1 ˉ z 1 + . . . + z n ˉ z n = ∣ z 1 ∣ 2 + . . . + ∣ z n ∣ 2
이것은 음수가 아닌 실수입니다.
예를 들어 w = e θ i w = e^{\theta i} w = e θ i 라고 할 때 v = [ w 0 , w 1 , . . . , w n ] v = [w^0, w^1, ..., w^n] v = [ w 0 , w 1 , . . . , w n ] 이면 ⟨ v , v ⟩ \langle v, v \rangle ⟨ v , v ⟩ 는 다음과 같습니다.
⟨ v , v ⟩ = v ˉ ⋅ v = e θ i ⋅ 0 − θ i ⋅ 0 + e θ i ⋅ 1 − θ i ⋅ 1 + . . . + e θ i ⋅ n − θ i ⋅ n = 1 + 1 + . . . + 1 = n \begin{aligned}
\langle v, v \rangle & = \bar{v} \cdot v \\
& = e^{\theta i \cdot 0 - \theta i \cdot 0} + e^{\theta i \cdot 1 - \theta i \cdot 1} + ... + e^{\theta i \cdot n - \theta i \cdot n} \\
& = 1 + 1 + ... + 1 = n
\end{aligned} ⟨ v , v ⟩ = v ˉ ⋅ v = e θ i ⋅ 0 − θ i ⋅ 0 + e θ i ⋅ 1 − θ i ⋅ 1 + . . . + e θ i ⋅ n − θ i ⋅ n = 1 + 1 + . . . + 1 = n
한편 복소수 필드상의 벡터 내적은 실수상의 벡터 내적과 다르게 대칭성이 성립하지 않습니다. 즉, 복소수 벡터 u u u , v v v 에 대해 ⟨ u , v ⟩ = ⟨ v , u ⟩ \langle u, v \rangle = \langle v, u \rangle ⟨ u , v ⟩ = ⟨ v , u ⟩ 가 항상 성립하는 것은 아닙니다. 예를 들어 u = [ 1 + 2 i , 1 ] u = [1 + 2i, 1] u = [ 1 + 2 i , 1 ] , v = [ 2 , 1 ] v = [2,1] v = [ 2 , 1 ] 라고 할 때,
⟨ u , v ⟩ = [ 1 − 2 i 1 ] [ 2 1 ] = [ 2 − 4 i + 1 ] ⟨ v , u ⟩ = [ 2 1 ] [ 1 + 2 i 1 ] = [ 2 + 4 i + 1 ] \begin{aligned}
\langle u, v \rangle & = \begin{bmatrix}
1 - 2i & 1
\end{bmatrix}
\begin{bmatrix}
2 \\
1
\end{bmatrix} \\
& = \begin{bmatrix}
2 - 4i + 1
\end{bmatrix}
\\
\langle v, u \rangle & = \begin{bmatrix}
2 & 1
\end{bmatrix}
\begin{bmatrix}
1 + 2i \\
1
\end{bmatrix} \\
& = \begin{bmatrix}
2 + 4i + 1
\end{bmatrix}
\end{aligned} ⟨ u , v ⟩ ⟨ v , u ⟩ = [ 1 − 2 i 1 ] [ 2 1 ] = [ 2 − 4 i + 1 ] = [ 2 1 ] [ 1 + 2 i 1 ] = [ 2 + 4 i + 1 ]
위와 같이 ⟨ u , v ⟩ \langle u, v \rangle ⟨ u , v ⟩ 와 ⟨ v , u ⟩ \langle v, u \rangle ⟨ v , u ⟩ 의 값은 다를 수 있습니다.
복소수 필드에서 직교하는 두 벡터의 내적은 실수에서와 같이 0입니다. 예를 들어 u = [ e 0 ⋅ π i 2 , e 1 ⋅ π i 2 , e 2 ⋅ π i 2 , e 3 ⋅ π i 2 ] u = [e^{\frac{0 \cdot \pi i}{2}}, e^{\frac{1 \cdot \pi i}{2}}, e^{\frac{2 \cdot \pi i}{2}}, e^{\frac{3 \cdot \pi i}{2}}] u = [ e 2 0 ⋅ π i , e 2 1 ⋅ π i , e 2 2 ⋅ π i , e 2 3 ⋅ π i ] 이고 v = [ e 0 ⋅ π i , e 1 ⋅ π i , e 2 ⋅ π i , e 3 ⋅ π i ] v = [e^{0 \cdot \pi i}, e^{1 \cdot \pi i}, e^{2 \cdot \pi i}, e^{3 \cdot \pi i}] v = [ e 0 ⋅ π i , e 1 ⋅ π i , e 2 ⋅ π i , e 3 ⋅ π i ] 의 내적은 다음과 같습니다.
e − 0 ⋅ π i 2 e 0 ⋅ π i + e − 1 ⋅ π i 2 e 1 ⋅ π i + e − 2 ⋅ π i 2 e 2 ⋅ π i + e − 3 ⋅ π i 2 e 3 ⋅ π i = e 0 ⋅ π i 2 + e 1 ⋅ π i 2 + e 2 ⋅ π i 2 + e 3 ⋅ π i 2 \begin{aligned}
e^{-\frac{0 \cdot \pi i}{2}} e^{0 \cdot \pi i} + e^{-\frac{1 \cdot \pi i}{2}} e^{1 \cdot \pi i} + e^{-\frac{2 \cdot \pi i}{2}} e^{2 \cdot \pi i} + e^{-\frac{3 \cdot \pi i}{2}} e^{3 \cdot \pi i} \\
= e^{\frac{0 \cdot \pi i}{2}} + e^{\frac{1 \cdot \pi i}{2}} + e^{\frac{2 \cdot \pi i}{2}} + e^{\frac{3 \cdot \pi i}{2}}
\end{aligned} e − 2 0 ⋅ π i e 0 ⋅ π i + e − 2 1 ⋅ π i e 1 ⋅ π i + e − 2 2 ⋅ π i e 2 ⋅ π i + e − 2 3 ⋅ π i e 3 ⋅ π i = e 2 0 ⋅ π i + e 2 1 ⋅ π i + e 2 2 ⋅ π i + e 2 3 ⋅ π i
위의 마지막 식은 등비수열의 합이므로 e x p ( 0 ⋅ π i 2 ) ( e x p ( 4 ⋅ π i 2 ) − 1 ) e x p ( 1 ⋅ π i 2 ) − 1 \frac{exp(\frac{0 \cdot \pi i}{2}) (exp(\frac{4 \cdot \pi i}{2}) - 1)}{exp(\frac{1 \cdot \pi i}{2}) - 1} e x p ( 2 1 ⋅ π i ) − 1 e x p ( 2 0 ⋅ π i ) ( e x p ( 2 4 ⋅ π i ) − 1 ) 와 같이 쓸 수 있고 e x p ( 4 ⋅ π i 2 ) exp(\frac{4 \cdot \pi i}{2}) e x p ( 2 4 ⋅ π i ) 는 오일러의 공식에 의해 c o s 2 π + ( s i n 2 π ) i = 1 cos 2\pi + (sin 2\pi)i = 1 c o s 2 π + ( s i n 2 π ) i = 1 이므로 내적값은 0입니다. 따라서 u u u 와 v v v 는 직교합니다.
복소수 필드 상의 행렬 A A A 의 에르미트 수반행렬은 A H A^H A H 로 나타내고 이것은 A A A 의 전치행렬에서 각 원소의 켤레복소수를 취함으로써 얻어지는 행렬입니다. 복소 필드상의 행렬 A A A 는 만약 A A A 가 정방행렬이고 A H A A^H A A H A 가 단위행렬이면 유니터리(unitary)라고 말합니다. 직교행렬에 의한 곱이 norm을 보존하는 것처럼 유니터리 행렬에 의한 곱셈은 norm을 보존합니다.
이산 푸리에 변환
w = e x p ( 2 π n i ) w = exp(\frac{2\pi}{n}i) w = e x p ( n 2 π i ) 라 하고 F ( t ) = w t F(t) = w^t F ( t ) = w t 로 정의되는 함수 F : R → C F: \Bbb{R} \to \Bbb{C} F : R → C 를 고려해 보겠습니다. t = 0 t = 0 t = 0 에서 오일러의 공식에 의해 w 0 = e x p ( 2 π n i ⋅ 0 ) = c o s ( 2 π n ⋅ 0 ) + ( s i n ( 2 π n ⋅ 0 ) ) i = 1 + 0 i w^0 = exp(\frac{2 \pi}{n} i \cdot 0) = cos (\frac{2 \pi}{n}\cdot 0) + (sin (\frac{2 \pi}{n} \cdot 0))i = 1 + 0i w 0 = e x p ( n 2 π i ⋅ 0 ) = c o s ( n 2 π ⋅ 0 ) + ( s i n ( n 2 π ⋅ 0 ) ) i = 1 + 0 i 라 쓸 수 있습니다. t = n , 2 n , 3 n , . . . t = n, 2n, 3n, ... t = n , 2 n , 3 n , . . . 인 경우 1 + 0 i 1 + 0i 1 + 0 i 로 돌아옵니다. 따라서 이 함수의 주기는 n n n , 주파수는 1 n \frac{1}{n} n 1 이라 할 수 있습니다.
이번에는 함수 k = 0 , 1 , 2 , 3 , . . . , n − 1 k = 0, 1, 2, 3, ..., n-1 k = 0 , 1 , 2 , 3 , . . . , n − 1 에 대해 F 0 F_0 F 0 , F 1 F_1 F 1 , F 2 F_2 F 2 , F 3 F_3 F 3 , ..., F k F_k F k 를 정의해 보겠습니다.
F 0 ( x ) = 1 n w 0 ⋅ t F 1 ( x ) = 1 n w 1 ⋅ t F 2 ( x ) = 1 n w 2 ⋅ t F 3 ( x ) = 1 n w 3 ⋅ t . . . F k ( x ) = w k ⋅ t \begin{aligned}
F_0(x) &= \frac{1}{\sqrt{n}}w^{0 \cdot t} \\
F_1(x) &= \frac{1}{\sqrt{n}}w^{1 \cdot t} \\
F_2(x) &= \frac{1}{\sqrt{n}}w^{2 \cdot t} \\
F_3(x) &= \frac{1}{\sqrt{n}}w^{3 \cdot t} \\
& ... \\
F_k(x) &= w^{k \cdot t}
\end{aligned} F 0 ( x ) F 1 ( x ) F 2 ( x ) F 3 ( x ) F k ( x ) = n 1 w 0 ⋅ t = n 1 w 1 ⋅ t = n 1 w 2 ⋅ t = n 1 w 3 ⋅ t . . . = w k ⋅ t
F 0 ( x ) F_0(x) F 0 ( x ) 를 제외한 각각의 함수는 주기 n n n , n 2 \frac{n}{2} 2 n , n 3 \frac{n}{3} 3 n , ..., n k \frac{n}{k} k n 을 갖습니다. F 0 ( x ) F_0(x) F 0 ( x ) 의 경우 주기 n 0 \frac{n}{0} 0 n , 즉 무한대를 갖는데 이는 시계가 움직이지 않는 경우를 생각하면 좋을 것 같습니다. 그리고 t = 0 t = 0 t = 0 에서 각각의 함수는 1 n + 0 i \frac{1}{\sqrt{n}} + 0i n 1 + 0 i 을 가집니다.
함수 F k ( x ) F_k(x) F k ( x ) 와 x x x 의 대입값을 바탕으로 다음 행렬 방정식을 쓸 수 있습니다.
[ F 0 ( 0 ) F 1 ( 0 ) . . . F n − 1 ( 0 ) F 0 ( 1 ) F 1 ( 1 ) . . . F n − 1 ( 1 ) . . . . . . . . . . . . F 0 ( n − 1 ) F 1 ( n − 1 ) . . . F n − 1 ( n − 1 ) ] [ ϕ 0 ϕ 1 . . . ϕ n − 1 ] = [ s ( 0 ) s ( 1 ) . . . s ( n − 1 ) ] \begin{bmatrix}
F_0(0) & F_1(0) & ... & F_{n-1}(0) \\
F_0(1) & F_1(1) & ... & F_{n-1}(1) \\
... & ... & ... & ... \\
F_0(n-1) & F_1(n-1) & ... & F_{n-1}(n-1)
\end{bmatrix}
\begin{bmatrix}
\phi_0 \\
\phi_1 \\
... \\
\phi_{n-1} \\
\end{bmatrix}
= \begin{bmatrix}
s(0) \\
s(1) \\
... \\
s(n-1)
\end{bmatrix} ⎣ ⎢ ⎢ ⎢ ⎡ F 0 ( 0 ) F 0 ( 1 ) . . . F 0 ( n − 1 ) F 1 ( 0 ) F 1 ( 1 ) . . . F 1 ( n − 1 ) . . . . . . . . . . . . F n − 1 ( 0 ) F n − 1 ( 1 ) . . . F n − 1 ( n − 1 ) ⎦ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎡ ϕ 0 ϕ 1 . . . ϕ n − 1 ⎦ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎡ s ( 0 ) s ( 1 ) . . . s ( n − 1 ) ⎦ ⎥ ⎥ ⎥ ⎤
위 행렬 방정식을 간단히 F k ϕ = s F_k \phi = s F k ϕ = s 라 쓰면 F k F_k F k 는 각각의 F k ( x ) F_k(x) F k ( x ) 함수의 평가이고 ϕ \phi ϕ 는 선형결합의 계수입니다. s ( t ) s(t) s ( t ) 는 동일한 시간 t t t 에 대해 각각의 F k F_k F k 함수의 선형결합의 결과를 나타내는 샘플링 함수라 할 수 있습니다. (e.g. s ( 0 ) = ϕ 0 F 0 ( 0 ) + ϕ 1 F 1 ( 0 ) + . . . + ϕ n − 1 F n − 1 ( 0 ) s(0) = \phi_0 F_0(0) + \phi_1 F_1(0) + ... + \phi_{n-1} F_{n-1}(0) s ( 0 ) = ϕ 0 F 0 ( 0 ) + ϕ 1 F 1 ( 0 ) + . . . + ϕ n − 1 F n − 1 ( 0 ) )
행렬 방정식 F k ϕ = s F_k \phi = s F k ϕ = s 를 두가지 관점에서 해석할 수 있습니다. 먼저 F k ϕ F_k \phi F k ϕ 를 구함으로서 신호 s s s 를 찾아낼 수 있습니다. 그리고 F k − 1 F_k^{-1} F k − 1 을 구함으로서 계수 ϕ \phi ϕ 를 구할 수 있습니다.
앞으로 다음의 행렬을 W ( w , n ) W(w, n) W ( w , n ) 로 표시합니다.
행라벨과 열라벨의 집합이 0 , 1 , . . . , n − 1 {0, 1, ..., n-1} 0 , 1 , . . . , n − 1 이고
엔트리 r c rc r c 는 w r ⋅ c w^{r \cdot c} w r ⋅ c 입니다.
W ( w , n ) = [ w 0 ⋅ 0 w 0 ⋅ 1 w 0 ⋅ 2 w 0 ⋅ ( n − 1 ) w 1 ⋅ 0 w 1 ⋅ 1 w 1 ⋅ 2 . . . w 1 ⋅ ( n − 1 ) w 2 ⋅ 0 w 2 ⋅ 1 w 2 ⋅ 2 w 2 ⋅ ( n − 1 ) . . . . . . . . . . . . w ( n − 1 ) ⋅ 0 w ( n − 1 ) ⋅ 1 w ( n − 1 ) ⋅ 2 w ( n − 1 ) ⋅ ( n − 1 ) ] W(w, n) = \begin{bmatrix}
w^{0 \cdot 0} & w^{0 \cdot 1} & w^{0 \cdot 2} & \text{ } & w^{0 \cdot (n-1)} \\
w^{1 \cdot 0} & w^{1 \cdot 1} & w^{1 \cdot 2} & ... & w^{1 \cdot (n-1)} \\
w^{2 \cdot 0} & w^{2 \cdot 1} & w^{2 \cdot 2} & \text{ } & w^{2 \cdot (n-1)} \\
... & ... & ... & \text{ } & ... \\
w^{(n-1) \cdot 0} & w^{(n-1) \cdot 1} & w^{(n-1) \cdot 2} & \text{ } & w^{(n-1) \cdot (n-1)}
\end{bmatrix} W ( w , n ) = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ w 0 ⋅ 0 w 1 ⋅ 0 w 2 ⋅ 0 . . . w ( n − 1 ) ⋅ 0 w 0 ⋅ 1 w 1 ⋅ 1 w 2 ⋅ 1 . . . w ( n − 1 ) ⋅ 1 w 0 ⋅ 2 w 1 ⋅ 2 w 2 ⋅ 2 . . . w ( n − 1 ) ⋅ 2 . . . w 0 ⋅ ( n − 1 ) w 1 ⋅ ( n − 1 ) w 2 ⋅ ( n − 1 ) . . . w ( n − 1 ) ⋅ ( n − 1 ) ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
위의 행렬을 참고하여 F n = 1 n W ( w , n ) F_n = \frac{1}{\sqrt{n}}W(w, n) F n = n 1 W ( w , n ) 이라 쓸 수 있습니다. 이를 푸리에 행렬이라 합니다.
한편 푸리에 행렬의 역행렬은 F n − 1 = 1 n W ( w − 1 , n ) F_n^{-1} = \frac{1}{\sqrt{n}}W(w^{-1}, n) F n − 1 = n 1 W ( w − 1 , n ) 입니다. 이는 복소 필드 상의 유니터리 행렬과 연관됩니다. 행렬-벡터 곱셈을 통해 이를 증명할 수 있습니다. 먼저 F n F n − 1 F_n F_n^{-1} F n F n − 1 의 엔트리는 행과 열의 도트곱이고 다음과 같이 표현됩니다.
w r ⋅ 0 w − 0 ⋅ c + w r ⋅ 1 w − 1 ⋅ c + w r ⋅ 2 w − 2 ⋅ c + . . . + w r ⋅ ( n − 1 ) w − ( n − 1 ) ⋅ c = w 0 ( r − c ) + w 1 ( r − c ) + w 2 ( r − c ) + . . . + w ( n − 1 ) ( r − c ) \begin{aligned}
w^{r \cdot 0} w^{-0 \cdot c} + w^{r \cdot 1} w^{-1 \cdot c} + w^{r \cdot 2} w^{-2 \cdot c} + ... + w^{r \cdot (n-1)} w^{-(n-1) \cdot c} \\
= w^{0(r-c)} + w^{1(r-c)} + w^{2(r-c)} + ... + w^{(n-1)(r-c)}
\end{aligned} w r ⋅ 0 w − 0 ⋅ c + w r ⋅ 1 w − 1 ⋅ c + w r ⋅ 2 w − 2 ⋅ c + . . . + w r ⋅ ( n − 1 ) w − ( n − 1 ) ⋅ c = w 0 ( r − c ) + w 1 ( r − c ) + w 2 ( r − c ) + . . . + w ( n − 1 ) ( r − c )
r = c r = c r = c 일 때 즉, F n F n − 1 F_n F_n^{-1} F n F n − 1 의 대각 엔트리는 1 + 1 + . . . 1 = n 1 + 1 + ... 1 = n 1 + 1 + . . . 1 = n 입니다. r ≠ c r \neq c r = c 일 때 위 식은 등비수열의 합이므로 아래와 같이 표현할 수 있습니다.
w 0 ( r − c ) ( w ( r − c ) ⋅ n − 1 ) w r − c − 1 \frac{w^{0(r-c)}(w^{(r-c) \cdot n} - 1)}{w^{r-c} - 1} w r − c − 1 w 0 ( r − c ) ( w ( r − c ) ⋅ n − 1 )
이 때 w ( r − c ) ⋅ n = e x p ( 2 π ⋅ ( r − c ) n ⋅ n ) = c o s ( 2 π ( r − c ) ) + s i n ( 2 π ( r − c ) ) i = 1 w^{(r-c) \cdot n} = exp(\frac{2 \pi \cdot (r-c)}{n} \cdot n) = cos (2\pi (r-c)) + sin(2\pi (r-c))i = 1 w ( r − c ) ⋅ n = e x p ( n 2 π ⋅ ( r − c ) ⋅ n ) = c o s ( 2 π ( r − c ) ) + s i n ( 2 π ( r − c ) ) i = 1 이므로 등비수열의 합은 0입니다. (0은 두 벡터가 직교임을 증명합니다.) 따라서 F n F n − 1 F_n F_n^{-1} F n F n − 1 은 대각 엔트리가 n n n 이고 나머지 엔트리는 모두 0인 행렬과 스칼라 1 n \frac{1}{n} n 1 의 곱, 즉 단위행렬입니다.
고속 푸리에 변환 알고리즘 (FFT)
[ w 0 ⋅ 0 w 0 ⋅ 1 w 0 ⋅ 2 w 0 ⋅ ( n − 1 ) w 1 ⋅ 0 w 1 ⋅ 1 w 1 ⋅ 2 . . . w 1 ⋅ ( n − 1 ) w 2 ⋅ 0 w 2 ⋅ 1 w 2 ⋅ 2 w 2 ⋅ ( n − 1 ) . . . . . . . . . . . . w ( n − 1 ) ⋅ 0 w ( n − 1 ) ⋅ 1 w ( n − 1 ) ⋅ 2 w ( n − 1 ) ⋅ ( n − 1 ) ] [ ϕ 0 ϕ 1 ϕ 2 . . . ϕ n − 1 ] = [ s ( 0 ) s ( 1 ) s ( 2 ) . . . s ( n − 1 ) ] \begin{bmatrix}
w^{0 \cdot 0} & w^{0 \cdot 1} & w^{0 \cdot 2} & \text{ } & w^{0 \cdot (n-1)} \\
w^{1 \cdot 0} & w^{1 \cdot 1} & w^{1 \cdot 2} & ... & w^{1 \cdot (n-1)} \\
w^{2 \cdot 0} & w^{2 \cdot 1} & w^{2 \cdot 2} & \text{ } & w^{2 \cdot (n-1)} \\
... & ... & ... & \text{ } & ... \\
w^{(n-1) \cdot 0} & w^{(n-1) \cdot 1} & w^{(n-1) \cdot 2} & \text{ } & w^{(n-1) \cdot (n-1)}
\end{bmatrix}
\begin{bmatrix}
\phi_0 \\
\phi_1 \\
\phi_2 \\
... \\
\phi_{n-1}
\end{bmatrix}
= \begin{bmatrix}
s(0) \\
s(1) \\
s(2) \\
... \\
s(n-1)
\end{bmatrix} ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ w 0 ⋅ 0 w 1 ⋅ 0 w 2 ⋅ 0 . . . w ( n − 1 ) ⋅ 0 w 0 ⋅ 1 w 1 ⋅ 1 w 2 ⋅ 1 . . . w ( n − 1 ) ⋅ 1 w 0 ⋅ 2 w 1 ⋅ 2 w 2 ⋅ 2 . . . w ( n − 1 ) ⋅ 2 . . . w 0 ⋅ ( n − 1 ) w 1 ⋅ ( n − 1 ) w 2 ⋅ ( n − 1 ) . . . w ( n − 1 ) ⋅ ( n − 1 ) ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ ϕ 0 ϕ 1 ϕ 2 . . . ϕ n − 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ s ( 0 ) s ( 1 ) s ( 2 ) . . . s ( n − 1 ) ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
푸리에 행렬 W ( w , n ) W(w, n) W ( w , n ) 과 계수 벡터의 행렬-벡터 곱셈은 n 2 n^2 n 2 의 연산이 필요합니다. 연산을 크게 줄이는 알고리즘으로 고속 푸리에 변환 알고리즘 (FFT)이 있습니다. FFT에는 다음 두 가지 전제 조건이 있습니다.
n n n 은 2의 거듭제곱입니다.
w n = 1 w^n = 1 w n = 1
FFT의 핵심은 아래와 같이 짝수번째와 홀수번째로 분할 정복하는 것입니다.
s ( k ) = ϕ 0 w k ⋅ 0 + ϕ 1 w k ⋅ 1 + ϕ 2 w k ⋅ 2 + . . . + ϕ n − 1 w k ⋅ ( n − 1 ) = ϕ 0 w k ⋅ 0 + ϕ 2 w k ⋅ 2 + . . . + ϕ n − 2 w k ⋅ ( n − 2 ) + w k ( ϕ 1 w k ⋅ 1 + ϕ 3 w k ⋅ 3 + . . . + ϕ n − 1 w k ⋅ ( n − 1 ) ) \begin{aligned}
s(k) & = \phi_0 w^{k \cdot 0} + \phi_1 w^{k \cdot 1} + \phi_2 w^{k \cdot 2} + ... + \phi_{n-1} w^{k \cdot (n-1)} \\
& = \phi_0 w^{k \cdot 0} + \phi_2 w^{k \cdot 2} + ... + \phi_{n-2} w^{k \cdot (n-2)} + w^k(\phi_1 w^{k \cdot 1} + \phi_3 w^{k \cdot 3} + ... + \phi_{n-1} w^{k \cdot (n-1)})
\end{aligned} s ( k ) = ϕ 0 w k ⋅ 0 + ϕ 1 w k ⋅ 1 + ϕ 2 w k ⋅ 2 + . . . + ϕ n − 1 w k ⋅ ( n − 1 ) = ϕ 0 w k ⋅ 0 + ϕ 2 w k ⋅ 2 + . . . + ϕ n − 2 w k ⋅ ( n − 2 ) + w k ( ϕ 1 w k ⋅ 1 + ϕ 3 w k ⋅ 3 + . . . + ϕ n − 1 w k ⋅ ( n − 1 ) )
다음과 같이 s e v e n s_{even} s e v e n 과 s o d d s_{odd} s o d d 를 정의하고 k k k 값에 따른 식을 정리해 보겠습니다.
s e v e n ( x ) = s 0 + s 2 x + s 4 x 2 + . . . + s n − 2 x n − 2 2 s o d d ( x ) = s 1 + s 3 x + s 5 x 2 + . . . + s n − 1 x n − 2 2 \begin{aligned}
s_{even}(x) = s_0 + s_2 x + s_4 x^2 + ... + s_{n-2} x^{\frac{n-2}{2}} \\
s_{odd}(x) = s_1 + s_3 x + s_5 x^2 + ... + s_{n-1} x^{\frac{n-2}{2}}
\end{aligned} s e v e n ( x ) = s 0 + s 2 x + s 4 x 2 + . . . + s n − 2 x 2 n − 2 s o d d ( x ) = s 1 + s 3 x + s 5 x 2 + . . . + s n − 1 x 2 n − 2
s ( w 0 ) = s e v e n ( w 0 ⋅ 2 ) + w 0 ( s o d d ( w 0 ⋅ 2 ) ) s ( w 1 ) = s e v e n ( w 1 ⋅ 2 ) + w 1 ( s o d d ( w 1 ⋅ 2 ) ) s ( w 2 ) = s e v e n ( w 2 ⋅ 2 ) + w 2 ( s o d d ( w 2 ⋅ 2 ) ) . . . s ( w n − 1 ) = s e v e n ( w ( n − 1 ) ⋅ 2 ) + w n − 1 ( s o d d ( w ( n − 1 ) ⋅ 2 ) ) \begin{aligned}
s(w^0) &= s_{even}(w^{0 \cdot 2}) + w^0(s_{odd}(w^{0 \cdot 2})) \\
s(w^1) &= s_{even}(w^{1 \cdot 2}) + w^1(s_{odd}(w^{1 \cdot 2})) \\
s(w^2) &= s_{even}(w^{2 \cdot 2}) + w^2(s_{odd}(w^{2 \cdot 2})) \\
& ... \\
s(w^{n-1}) &= s_{even}(w^{(n-1) \cdot 2}) + w^{n-1}(s_{odd}(w^{(n-1) \cdot 2}))
\end{aligned} s ( w 0 ) s ( w 1 ) s ( w 2 ) s ( w n − 1 ) = s e v e n ( w 0 ⋅ 2 ) + w 0 ( s o d d ( w 0 ⋅ 2 ) ) = s e v e n ( w 1 ⋅ 2 ) + w 1 ( s o d d ( w 1 ⋅ 2 ) ) = s e v e n ( w 2 ⋅ 2 ) + w 2 ( s o d d ( w 2 ⋅ 2 ) ) . . . = s e v e n ( w ( n − 1 ) ⋅ 2 ) + w n − 1 ( s o d d ( w ( n − 1 ) ⋅ 2 ) )
FFT를 Python 코드로 옮겨 보겠습니다.
def FFT ( w, s) :
n = len ( s)
if n == 1 : return s
f0 = FFT( w* w, s[ 0 : : 2 ] )
f1 = FFT( w* w, s[ 1 : : 2 ] )
return [ f0[ j] + w** j* f1[ j] for j in range ( n // 2 ) ] + \
[ f0[ j] - w** j* f1[ j] for j in range ( n // 2 ) ]
재귀호출을 차근차근 따라가면서 직접 도트곱의 값과 비교해 보는 것이 좋습니다. 이 때 w n = 1 w^n = 1 w n = 1 , w n 2 = − 1 w^{\frac{n}{2}} = -1 w 2 n = − 1 인 점을 알면 계산이 쉬워집니다.
w n 2 = − 1 ∵ e x p ( 2 π i n ⋅ n 2 ) = e x p ( π i ) = c o s π + ( s i n π ) i = − 1 \begin{aligned}
w^{\frac{n}{2}} &= -1 \\
\because exp(\frac{2\pi i}{n} \cdot \frac{n}{2}) &= exp(\pi i) = cos \pi + (sin \pi)i = -1
\end{aligned} w 2 n ∵ e x p ( n 2 π i ⋅ 2 n ) = − 1 = e x p ( π i ) = c o s π + ( s i n π ) i = − 1
순환행렬
다음과 같이 다음 행이 이전 행의 오른쪽 시프트인 행렬을 순환행렬이라 합니다.
[ a 0 a 1 a 2 . . . a n − 3 a n − 2 a n − 1 a n − 1 a 0 a 1 . . . a n − 4 a n − 3 a n − 2 a n − 2 a n − 1 a 0 . . . a n − 5 a n − 4 a n − 3 . . . a 2 a 3 a 4 . . . a n − 1 a 0 a 1 a 1 a 2 a 3 . . . a n − 2 a n − 1 a 0 ] \begin{bmatrix}
a_0 & a_1 & a_2 & ... & a_{n-3} & a_{n-2} & a_{n-1} \\
a_{n-1} & a_0 & a_1 & ... & a_{n-4} & a_{n-3} & a_{n-2} \\
a_{n-2} & a_{n-1} & a_0 & ... & a_{n-5} & a_{n-4} & a_{n-3} \\
\text{ } & \text{ } & \text{ } & ... & \text{ } & \text{ } & \text{ }\\
a_2 & a_3 & a_4 & ... & a_{n-1} & a_0 & a_1 \\
a_1 & a_2 & a_3 & ... & a_{n-2} & a_{n-1} & a_0
\end{bmatrix} ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ a 0 a n − 1 a n − 2 a 2 a 1 a 1 a 0 a n − 1 a 3 a 2 a 2 a 1 a 0 a 4 a 3 . . . . . . . . . . . . . . . . . . a n − 3 a n − 4 a n − 5 a n − 1 a n − 2 a n − 2 a n − 3 a n − 4 a 0 a n − 1 a n − 1 a n − 2 a n − 3 a 1 a 0 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
순환행렬을 어디에 응용할지 감 잡기가 쉽지 않습니다. 아래의 순환행렬과 푸리에 행렬 W ( w , 4 ) W(w, 4) W ( w , 4 ) 의 곱을 통해 순환행렬의 흥미로운 현상을 알아보겠습니다.
[ a 0 a 1 a 2 a 3 a 3 a 0 a 1 a 2 a 2 a 3 a 0 a 1 a 1 a 2 a 3 a 0 ] [ w 0 ⋅ 0 w 0 ⋅ 1 w 0 ⋅ 2 w 0 ⋅ 3 w 1 ⋅ 0 w 1 ⋅ 1 w 1 ⋅ 2 w 1 ⋅ 3 w 2 ⋅ 0 w 2 ⋅ 1 w 2 ⋅ 2 w 2 ⋅ 3 w 3 ⋅ 0 w 3 ⋅ 1 w 3 ⋅ 2 w 3 ⋅ 3 ] \begin{bmatrix}
a_0 & a_1 & a_2 & a_3 \\
a_3 & a_0 & a_1 & a_2 \\
a_2 & a_3 & a_0 & a_1 \\
a_1 & a_2 & a_3 & a_0
\end{bmatrix}
\begin{bmatrix}
w^{0 \cdot 0} & w^{0 \cdot 1} & w^{0 \cdot 2} & w^{0 \cdot 3} \\
w^{1 \cdot 0} & w^{1 \cdot 1} & w^{1 \cdot 2} & w^{1 \cdot 3} \\
w^{2 \cdot 0} & w^{2 \cdot 1} & w^{2 \cdot 2} & w^{2 \cdot 3} \\
w^{3 \cdot 0} & w^{3 \cdot 1} & w^{3 \cdot 2} & w^{3 \cdot 3}
\end{bmatrix} ⎣ ⎢ ⎢ ⎢ ⎡ a 0 a 3 a 2 a 1 a 1 a 0 a 3 a 2 a 2 a 1 a 0 a 3 a 3 a 2 a 1 a 0 ⎦ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎡ w 0 ⋅ 0 w 1 ⋅ 0 w 2 ⋅ 0 w 3 ⋅ 0 w 0 ⋅ 1 w 1 ⋅ 1 w 2 ⋅ 1 w 3 ⋅ 1 w 0 ⋅ 2 w 1 ⋅ 2 w 2 ⋅ 2 w 3 ⋅ 2 w 0 ⋅ 3 w 1 ⋅ 3 w 2 ⋅ 3 w 3 ⋅ 3 ⎦ ⎥ ⎥ ⎥ ⎤
위 행렬 곱셈 중 푸리에 행렬의 첫번째 열만으로 행렬-벡터 곱셈을 살펴보겠습니다.
[ a 0 a 1 a 2 a 3 a 3 a 0 a 1 a 2 a 2 a 3 a 0 a 1 a 1 a 2 a 3 a 0 ] [ w 0 ⋅ 0 w 1 ⋅ 0 w 2 ⋅ 0 w 3 ⋅ 0 ] \begin{bmatrix}
a_0 & a_1 & a_2 & a_3 \\
a_3 & a_0 & a_1 & a_2 \\
a_2 & a_3 & a_0 & a_1 \\
a_1 & a_2 & a_3 & a_0
\end{bmatrix}
\begin{bmatrix}
w^{0 \cdot 0} \\
w^{1 \cdot 0} \\
w^{2 \cdot 0} \\
w^{3 \cdot 0}
\end{bmatrix} ⎣ ⎢ ⎢ ⎢ ⎡ a 0 a 3 a 2 a 1 a 1 a 0 a 3 a 2 a 2 a 1 a 0 a 3 a 3 a 2 a 1 a 0 ⎦ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎡ w 0 ⋅ 0 w 1 ⋅ 0 w 2 ⋅ 0 w 3 ⋅ 0 ⎦ ⎥ ⎥ ⎥ ⎤
순환행렬의 첫번째 행과 벡터의 곱셈은 다음과 같습니다.
a 0 w 0 ⋅ 0 + a 1 w 1 ⋅ 0 + a 2 w 2 ⋅ 0 + a 3 w 3 ⋅ 0 a_0 w^{0 \cdot 0} + a_1 w^{1 \cdot 0} + a_2 w^{2 \cdot 0} + a_3 w^{3 \cdot 0} a 0 w 0 ⋅ 0 + a 1 w 1 ⋅ 0 + a 2 w 2 ⋅ 0 + a 3 w 3 ⋅ 0
순환행렬의 두번째 행과 벡터의 곱셈은 다음과 같습니다.
a 3 w 0 ⋅ 0 + a 0 w 1 ⋅ 0 + a 1 w 2 ⋅ 0 + a 2 w 3 ⋅ 0 a_3 w^{0 \cdot 0} + a_0 w^{1 \cdot 0} + a_1 w^{2 \cdot 0} + a_2 w^{3 \cdot 0} a 3 w 0 ⋅ 0 + a 0 w 1 ⋅ 0 + a 1 w 2 ⋅ 0 + a 2 w 3 ⋅ 0
위 식은 첫번째식에 w 1 ⋅ 0 w^{1 \cdot 0} w 1 ⋅ 0 을 곱한것과 같습니다. (∵ w 4 = 1 \because w^4 = 1 ∵ w 4 = 1 )
마찬가지로 순환행렬의 세번째 행과 벡터의 곱셈은 첫번째 식에 w 2 ⋅ 0 w^{2 \cdot 0} w 2 ⋅ 0 을, 네번째 행과 벡터의 곱셈은 w 3 ⋅ 0 w^{3 \cdot 0} w 3 ⋅ 0 을 곱한 것과 같습니다. 따라서 a 0 w 0 ⋅ j + a 1 w 1 ⋅ j + a 2 w 2 ⋅ j + a 3 w 3 ⋅ j = λ j a_0 w^{0 \cdot j} + a_1 w^{1 \cdot j} + a_2 w^{2 \cdot j} + a_3 w^{3 \cdot j} = \lambda_j a 0 w 0 ⋅ j + a 1 w 1 ⋅ j + a 2 w 2 ⋅ j + a 3 w 3 ⋅ j = λ j 라 할 때 다음이 성립합니다.
λ j [ w 0 ⋅ j w 1 ⋅ j w 2 ⋅ j w 3 ⋅ j ] = [ a 0 a 1 a 2 a 3 a 3 a 0 a 1 a 2 a 2 a 3 a 0 a 1 a 1 a 2 a 3 a 0 ] [ w 0 ⋅ j w 1 ⋅ j w 2 ⋅ j w 3 ⋅ j ] \lambda_j
\begin{bmatrix}
w^{0 \cdot j} \\
w^{1 \cdot j} \\
w^{2 \cdot j} \\
w^{3 \cdot j}
\end{bmatrix}
= \begin{bmatrix}
a_0 & a_1 & a_2 & a_3 \\
a_3 & a_0 & a_1 & a_2 \\
a_2 & a_3 & a_0 & a_1 \\
a_1 & a_2 & a_3 & a_0
\end{bmatrix}
\begin{bmatrix}
w^{0 \cdot j} \\
w^{1 \cdot j} \\
w^{2 \cdot j} \\
w^{3 \cdot j}
\end{bmatrix} λ j ⎣ ⎢ ⎢ ⎢ ⎡ w 0 ⋅ j w 1 ⋅ j w 2 ⋅ j w 3 ⋅ j ⎦ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎡ a 0 a 3 a 2 a 1 a 1 a 0 a 3 a 2 a 2 a 1 a 0 a 3 a 3 a 2 a 1 a 0 ⎦ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎡ w 0 ⋅ j w 1 ⋅ j w 2 ⋅ j w 3 ⋅ j ⎦ ⎥ ⎥ ⎥ ⎤
푸리에 행렬의 모든 열에 대해 적용하면 다음과 같습니다.
[ w 0 ⋅ 0 w 0 ⋅ 1 w 0 ⋅ 2 w 0 ⋅ 3 w 1 ⋅ 0 w 1 ⋅ 1 w 1 ⋅ 2 w 1 ⋅ 3 w 2 ⋅ 0 w 2 ⋅ 1 w 2 ⋅ 2 w 2 ⋅ 3 w 3 ⋅ 0 w 3 ⋅ 1 w 3 ⋅ 2 w 3 ⋅ 3 ] [ λ 0 0 0 0 0 λ 1 0 0 0 0 λ 2 0 0 0 0 λ 3 ] = [ a 0 a 1 a 2 a 3 a 3 a 0 a 1 a 2 a 2 a 3 a 0 a 1 a 1 a 2 a 3 a 0 ] [ w 0 ⋅ 0 w 0 ⋅ 1 w 0 ⋅ 2 w 0 ⋅ 3 w 1 ⋅ 0 w 1 ⋅ 1 w 1 ⋅ 2 w 1 ⋅ 3 w 2 ⋅ 0 w 2 ⋅ 1 w 2 ⋅ 2 w 2 ⋅ 3 w 3 ⋅ 0 w 3 ⋅ 1 w 3 ⋅ 2 w 3 ⋅ 3 ] \begin{bmatrix}
w^{0 \cdot 0} & w^{0 \cdot 1} & w^{0 \cdot 2} & w^{0 \cdot 3} \\
w^{1 \cdot 0} & w^{1 \cdot 1} & w^{1 \cdot 2} & w^{1 \cdot 3} \\
w^{2 \cdot 0} & w^{2 \cdot 1} & w^{2 \cdot 2} & w^{2 \cdot 3} \\
w^{3 \cdot 0} & w^{3 \cdot 1} & w^{3 \cdot 2} & w^{3 \cdot 3}
\end{bmatrix}
\begin{bmatrix}
\lambda_0 & 0 & 0 & 0 \\
0 & \lambda_1 & 0 & 0 \\
0 & 0 & \lambda_2 & 0 \\
0 & 0 & 0 & \lambda_3
\end{bmatrix}
= \begin{bmatrix}
a_0 & a_1 & a_2 & a_3 \\
a_3 & a_0 & a_1 & a_2 \\
a_2 & a_3 & a_0 & a_1 \\
a_1 & a_2 & a_3 & a_0
\end{bmatrix}
\begin{bmatrix}
w^{0 \cdot 0} & w^{0 \cdot 1} & w^{0 \cdot 2} & w^{0 \cdot 3} \\
w^{1 \cdot 0} & w^{1 \cdot 1} & w^{1 \cdot 2} & w^{1 \cdot 3} \\
w^{2 \cdot 0} & w^{2 \cdot 1} & w^{2 \cdot 2} & w^{2 \cdot 3} \\
w^{3 \cdot 0} & w^{3 \cdot 1} & w^{3 \cdot 2} & w^{3 \cdot 3}
\end{bmatrix} ⎣ ⎢ ⎢ ⎢ ⎡ w 0 ⋅ 0 w 1 ⋅ 0 w 2 ⋅ 0 w 3 ⋅ 0 w 0 ⋅ 1 w 1 ⋅ 1 w 2 ⋅ 1 w 3 ⋅ 1 w 0 ⋅ 2 w 1 ⋅ 2 w 2 ⋅ 2 w 3 ⋅ 2 w 0 ⋅ 3 w 1 ⋅ 3 w 2 ⋅ 3 w 3 ⋅ 3 ⎦ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎡ λ 0 0 0 0 0 λ 1 0 0 0 0 λ 2 0 0 0 0 λ 3 ⎦ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎡ a 0 a 3 a 2 a 1 a 1 a 0 a 3 a 2 a 2 a 1 a 0 a 3 a 3 a 2 a 1 a 0 ⎦ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎡ w 0 ⋅ 0 w 1 ⋅ 0 w 2 ⋅ 0 w 3 ⋅ 0 w 0 ⋅ 1 w 1 ⋅ 1 w 2 ⋅ 1 w 3 ⋅ 1 w 0 ⋅ 2 w 1 ⋅ 2 w 2 ⋅ 2 w 3 ⋅ 2 w 0 ⋅ 3 w 1 ⋅ 3 w 2 ⋅ 3 w 3 ⋅ 3 ⎦ ⎥ ⎥ ⎥ ⎤
위 식을 간단하게 F 4 Λ = A F 4 F_4 \Lambda = A F_4 F 4 Λ = A F 4 로 쓸 수 있고 양변에 F 4 − 1 F_4^{-1} F 4 − 1 을 곱하면 다음 두 식을 얻을 수 있습니다.
F 4 Λ F 4 − 1 = A Λ = F 4 − 1 A F 4 \begin{aligned}
F_4 \Lambda F_4^{-1} = A \\
\Lambda = F_4^{-1} A F_4
\end{aligned} F 4 Λ F 4 − 1 = A Λ = F 4 − 1 A F 4
이 방정식은 나중에 대각화에서 다루게 됩니다.
직교 행렬과 관련된 프로시저
직교행렬의 행공간에 대한 좌표 표현을 구하는 프로시저 orthogonal_vec2rep
def orthogonal_vec2rep ( Q, b) :
return b * Q. transpose( )
프로시저 orthogonal_vec2rep
는 직교행렬 Q Q Q 에 대해 Q T Q = I Q^TQ = I Q T Q = I 라는 성질을 이용합니다.
직교행렬에 대해 기저 변경 후 좌표 표현을 구하는 프로시저 orthogonal_change_of_basis
def orthogonal_change_of_basis ( A, B, a) :
v = a * A
return B. transpose( ) * v
직교행렬에 대한 직교 정사영을 구하는 프로시저 orthonormal_projection_orthogonal
def orthonormal_projection_orthogonal ( W, b) :
return b - W. transpose( ) * W * b
위 프로시저는 직교행렬의 각각의 벡터의 norm은 1임을 이용합니다.