logo

라플라스 전개 📂행렬대수

라플라스 전개

정리

정사각행렬 $A_{n \times n} = (a_{ij})$ 이 주어져 있다고 하자.

  • [1]: 선택된 $i$행 에 대해 $$ \det A = \sum_{j=1}^{n} a_{ij} C_{ij} $$
  • [2]: 선택된 $j$열 에 대해 $$ \det A = \sum_{i=1}^{n} a_{ij} C_{ij} $$

  • 정사각행렬 $A_{n \times n} = (a_{ij})$ 의 $i$번째 행과 $j$번째 열을 제거한 행렬행렬식 $M_{ij}$ 을 소행렬식, 이에 대해 $C_{ij} := (-1)^{i + j} M_{ij}$ 를 여인자라고 한다.

설명

라플라스 전개여인자 전개 로도 불리는 정리로써, 그 유용함이 이루 말할 수가 없다. 당장 행렬식을 정의만 가지고 계산하는 것보단 훨씬 쉽다. 특수한 조건이 갖춰진 행렬의 행렬식을 구할 땐 그 장점이 더더욱 배가되므로 팩트만큼은 반드시 알아야만 한다.

예시

당장 어떤 행렬이 가역행렬인지 판단할 때 써먹을만한 예로써 다음 라플라스 전개를 보자.

$$ \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*} $$

따라서 $\displaystyle \det \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix}$ 는 역행렬이 존재하지 않음을 쉽게 확인할 수 있다.

코드

다음은 줄리아에서 라플라스 전개를 구현하고 검증하는 내용의 코드다. 사실상 수식을 거의 그대로 옮겨놓은 수준이고, 실제로는 매우 비효율적으로 구현되어 있는 상태다. 이에 대해서는 다음의 포스트를 참고하면 좋다:

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))