라플라스 전개
📂행렬대수 라플라스 전개 정리 정사각행렬 A n × n = ( a i j ) A_{n \times n} = (a_{ij}) A n × n = ( a ij ) 이 주어져 있다고 하자.
[1]: 선택된 i i i 행 에 대해
det A = ∑ j = 1 n a i j C i j
\det A = \sum_{j=1}^{n} a_{ij} C_{ij}
det A = j = 1 ∑ n a ij C ij [2]: 선택된 j j j 열 에 대해
det A = ∑ i = 1 n a i j C i j
\det A = \sum_{i=1}^{n} a_{ij} C_{ij}
det A = i = 1 ∑ n a ij C ij 정사각행렬 A n × n = ( a i j ) A_{n \times n} = (a_{ij}) A n × n = ( a ij ) 의 i i i 번째 행과 j j j 번째 열을 제거한 행렬 의 행렬식 M i j M_{ij} M ij 을 소행렬식, 이에 대해 C i j : = ( − 1 ) i + j M i j C_{ij} := (-1)^{i + j} M_{ij} C ij := ( − 1 ) i + j M ij 를 여인자 라고 한다.설명 라플라스 전개 는 여인자 전개 로도 불리는 정리로써, 그 유용함이 이루 말할 수가 없다. 당장 행렬식 을 정의만 가지고 계산하는 것보단 훨씬 쉽다. 특수한 조건이 갖춰진 행렬의 행렬식 을 구할 땐 그 장점이 더더욱 배가되므로 팩트만큼은 반드시 알아야만 한다.
예시 당장 어떤 행렬이 가역행렬인지 판단할 때 써먹을만한 예로써 다음 라플라스 전개를 보자.
det [ 1 2 3 4 5 6 7 8 9 ] = 1 ⋅ ∣ 5 6 8 9 ∣ − 2 ⋅ ∣ 4 6 7 9 ∣ + 3 ⋅ ∣ 4 5 7 8 ∣ = 1 ⋅ ( − 3 ) − 2 ⋅ ( − 6 ) + 3 ⋅ ( − 3 ) = 0
\begin{align*}
\displaystyle \det \begin{bmatrix}
1 & 2 & 3
\\ 4 & 5 & 6
\\ 7 & 8 & 9
\end{bmatrix} =& 1 \cdot \begin{vmatrix} 5 & 6
\\ 8 & 9 \end{vmatrix} - 2 \cdot \begin{vmatrix} 4 & 6
\\ 7 & 9 \end{vmatrix} + 3 \cdot \begin{vmatrix} 4 & 5
\\ 7 & 8 \end{vmatrix}
\\ =& 1 \cdot (-3) - 2 \cdot (-6) + 3 \cdot (-3)
\\ =& 0
\end{align*}
det 1 4 7 2 5 8 3 6 9 = = = 1 ⋅ 5 8 6 9 − 2 ⋅ 4 7 6 9 + 3 ⋅ 4 7 5 8 1 ⋅ ( − 3 ) − 2 ⋅ ( − 6 ) + 3 ⋅ ( − 3 ) 0
따라서 det [ 1 2 3 4 5 6 7 8 9 ] \displaystyle \det \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} det 1 4 7 2 5 8 3 6 9 는 역행렬이 존재하지 않음을 쉽게 확인할 수 있다.
코드 다음은 줄리아 에서 라플라스 전개를 구현하고 검증하는 내용의 코드다. 사실상 수식을 거의 그대로 옮겨놓은 수준이고, 실제로는 매우 비효율적으로 구현되어 있는 상태다. 이에 대해서는 다음의 포스트를 참고하면 좋다:
function laplace(A::AbstractMatrix )
n = size(A, 1 )
@assert n == size(A, 2 ) "matrix $A is not square"
if n |> isone
aijCij = A
else
aijCij = [A[1 ,j] * (-(-1 )^j) * laplace(A[2 :end , setdiff(1 :n, j)]) for j in 1 :n]
end
return sum(aijCij)
end
B = [2 3 ; 4 6 ]
laplace(B)
C = [7 1 ; 9 3 ]
laplace(C)
M = rand(3 ,3 )
laplace(M)
using LinearAlgebra
det(M)
abs(det(M) - laplace(M))