수반행렬

편집 역사 토론
수치해석 계산물리 마지막 수정: 2026-08-09 04:41:07

1. 개요[편집]

수반행렬
Adjugate (classical adjoint)
정의여인수행렬의 전치, $\operatorname{adj}(A)_{ij} = C_{ji}$
기본 항등식$\operatorname{adj}(A)\,A = A\,\operatorname{adj}(A) = \det(A)\,I$
미분야코비 공식 $d\det(A) = \operatorname{tr}(\operatorname{adj}(A)\,dA)$
특이 행렬$\operatorname{rank}A = n-1$ 이면 $\operatorname{adj}A$ 의 계수는 1
실용 영역$2\times2$, $3\times3$ 닫힌 형 역행렬 · 기호 계산
실용 금지$n \gtrsim 4$ 에서 선형계 풀이 용도

모든 선형대수 교과서가 3장에서 가르치고, 모든 수치해석 교과서가 1장에서 쓰지 말라고 하는 그 행렬.

수반행렬(adjugate, classical adjoint)은 정사각행렬 AA 의 여인수(cofactor)들을 모아 전치해 만든 같은 크기의 행렬로, adj(A)\operatorname{adj}(A) 로 쓴다. 존재 이유는 딱 하나의 항등식이다.

adj(A)A  =  Aadj(A)  =  det(A)I\operatorname{adj}(A)\,A \;=\; A\,\operatorname{adj}(A) \;=\; \det(A)\,I

det(A)0\det(A) \ne 0 이면 양변을 나눠 A1=adj(A)/det(A)A^{-1} = \operatorname{adj}(A)/\det(A) 라는 역행렬의 닫힌 공식이 나온다. 나눗셈 없이 쓰인 형태라는 점이 핵심 — 이 항등식은 실수·복소수뿐 아니라 임의의 가환환 위에서 성립하고, 그래서 정수 행렬·다항식 행렬·기호 행렬에도 그대로 적용된다. 케일리-해밀턴 정리의 표준 증명이 다항식 환 위에서 adj(λIA)\operatorname{adj}(\lambda I - A) 를 쓰는 것도 그 덕이다.

그런데 수치해석 수업에서는 이 공식이 등장하자마자 절대 쓰지 말라는 경고가 붙는다. 비용도 정확도도 재앙이기 때문. 그럼에도 수반행렬이 죽지 않는 이유는 따로 있다 — 행렬식을 미분할 때, 특이행렬의 영공간을 읽을 때, 그리고 3×33\times3 을 수십억 번 뒤집어야 할 때다.

2. 정의 — 여인수행렬의 전치[편집]

AAiijj 열을 지운 (n1)×(n1)(n-1)\times(n-1) 소행렬의 행렬식을 소행렬식 MijM_{ij}, 부호를 붙인 것을 여인수 Cij=(1)i+jMijC_{ij} = (-1)^{i+j}M_{ij} 라 한다. 수반행렬은 이 여인수행렬을 전치한 것이다.

adj(A)ij=Cji=(1)i+jMji\operatorname{adj}(A)_{ij} = C_{ji} = (-1)^{i+j} M_{ji}

전치를 빼먹는 것이 이 개념의 1번 실수다. 2×22\times2 에서는

A=[abcd]    adj(A)=[dbca]A = \begin{bmatrix} a & b \\ c & d\end{bmatrix} \;\Longrightarrow\; \operatorname{adj}(A) = \begin{bmatrix} d & -b \\ -c & a\end{bmatrix}

로 “대각은 바꾸고 비대각은 부호만 뒤집기”라는 외우기 쉬운 형태가 나온다. 대칭행렬이라 전치가 티가 안 나는 2×22\times2 로 배운 사람이 3×33\times3 에서 전치를 잊고 역행렬을 전치된 채 얻는 사고가 이 바닥의 국룰.

항등식 자체는 행렬식의 여인수 전개를 두 방향으로 읽은 것에 불과하다. jaijCij=det(A)\sum_j a_{ij}C_{ij} = \det(A)ii 행 전개고, iki \ne k 일 때 jaijCkj=0\sum_j a_{ij}C_{kj} = 0 은 ”kk 행을 ii 행으로 갈아끼운 행렬”의 행렬식인데 그 행렬은 같은 행이 두 개라 0이다. 둘을 묶은 것이 Aadj(A)=det(A)IA\operatorname{adj}(A) = \det(A)I.

따라오는 성질들도 깔끔하다.

  • adj(AB)=adj(B)adj(A)\operatorname{adj}(AB) = \operatorname{adj}(B)\operatorname{adj}(A) — 순서가 뒤집힌다.
  • det(adjA)=(detA)n1\det(\operatorname{adj}A) = (\det A)^{n-1}.
  • n2n \ge 2 에서 adj(adjA)=(detA)n2A\operatorname{adj}(\operatorname{adj}A) = (\det A)^{n-2}A.
  • adj(cA)=cn1adj(A)\operatorname{adj}(cA) = c^{n-1}\operatorname{adj}(A) — 스케일에 n1n-1 제곱으로 반응한다.

마지막 성질은 곧바로 오버플로 경고이기도 하다. n=30n = 30 짜리 행렬의 원소를 10배 키우면 수반행렬 원소는 102910^{29} 배가 된다.

수반행렬의 각 성분이 (n1)(n-1) 차 소행렬식이라는 사실은 이것이 (n1)(n-1)복합행렬(compound matrix)과 부호·전치 차이밖에 없는 대상임을 뜻한다. 복합행렬 언어로 보면 코시-비네 공식에서 adj(AB)=adj(B)adj(A)\operatorname{adj}(AB) = \operatorname{adj}(B)\operatorname{adj}(A) 가 자동으로 떨어진다.

3. 크라메르 법칙과, 아무도 그걸로 안 푸는 이유[편집]

Ax=bAx = b 의 해를 성분별 행렬식 비로 주는 것이 **크라메르 법칙**이다.

xi=det(Ai)det(A),Ai=(A 의 i 열을 b 로 갈아끼운 행렬)x_i = \frac{\det(A_i)}{\det(A)}, \qquad A_i = (A \text{ 의 } i \text{ 열을 } b \text{ 로 갈아끼운 행렬})

x=A1b=adj(A)b/det(A)x = A^{-1}b = \operatorname{adj}(A)b/\det(A) 를 성분별로 쓴 것과 같다. 닫힌 형이고 아름다운데, 실무에서 쓰이지 않는 이유가 두 겹이다.

첫째, 느리다. 여인수 전개로 각 행렬식을 재귀 계산하면 O(n!)O(n!) 이라 논외고, LU 분해로 영리하게 해도 n+1n+1 개의 행렬식을 각각 O(n3)O(n^3) 에 구해야 하니 O(n4)O(n^4) 다. 가우스 소거법 한 번이면 23n3\tfrac23 n^3 에 끝나는 일을 nn 배 비싸게 하는 셈. 수반행렬 전체를 만드는 것도 마찬가지로 O(n4)O(n^4) 이고, 정칙이면 adj(A)=det(A)A1\operatorname{adj}(A) = \det(A)A^{-1}O(n3)O(n^3) 에 우회할 수 있지만 특이행렬에서는 그 우회로가 막힌다.

둘째, 그리고 더 나쁘게, 불안정하다. 크라메르 법칙은 후진 안정하지 않다. 계산된 해 x^\hat{x} 가 원래 문제의 작은 섭동 (A+ΔA)x^=b+Δb(A+\Delta A)\hat x = b + \Delta b 의 정확한 해라고 말할 수 없다는 뜻이다. 하이엄의 표준 반례는 2×22\times2 만으로도 충분한데, 두 행렬식이 각각 심한 상쇄를 겪고 나서 서로 나누어지므로 유효숫자가 두 번 증발한다. 부분 피벗팅을 붙인 가우스 소거는 실무적으로 후진 안정한데, 크라메르는 그 성질을 원리적으로 갖지 못한다.1

그래서 정리하면 이렇다 — 크라메르 법칙은 해가 계수에 대해 어떻게 의존하는지 보여주는 이론 도구이지 알고리즘이 아니다. 존재성 증명이나 기호 미분에는 여전히 유용하다.2

4. 야코비 공식 — 행렬식을 미분하는 방법[편집]

수반행렬의 진짜 밥벌이는 여기다. det\detAA 의 성분에 대한 함수로 보고 미분하면

det(A)aij=Cij=adj(A)ji\frac{\partial \det(A)}{\partial a_{ij}} = C_{ij} = \operatorname{adj}(A)_{ji}

이고, 이것을 전미분으로 묶은 것이 야코비 공식(Jacobi’s formula)이다.

ddet(A)=tr ⁣(adj(A)dA),ddtdetA(t)=tr ⁣(adj(A)A˙)d\,\det(A) = \operatorname{tr}\!\left(\operatorname{adj}(A)\,dA\right), \qquad \frac{d}{dt}\det A(t) = \operatorname{tr}\!\left(\operatorname{adj}(A)\,\dot A\right)

AA 가 정칙이면 adj(A)=det(A)A1\operatorname{adj}(A) = \det(A)A^{-1} 이므로 익숙한 ddtdetA=det(A)tr(A1A˙)\frac{d}{dt}\det A = \det(A)\operatorname{tr}(A^{-1}\dot A) 가 되고, 여기서 deteAt=ettrA\det e^{At} = e^{t\operatorname{tr}A} 나 유체역학의 레이놀즈 수송정리(부피 요소의 시간 변화율 J˙=J ⁣ ⁣u\dot J = J\,\nabla\!\cdot\!\mathbf{u})가 나온다. 다만 특이행렬에서도 성립하는 것은 수반행렬 형태뿐이라는 점이 야코비 공식을 굳이 adj\operatorname{adj} 로 쓰는 이유다.

CAE에서 이 공식이 등장하는 자리는 셀 수 없이 많다.

  • 초탄성 구성식. 초탄성 재료 모델의 변형 에너지에는 부피 변화 J=detFJ = \det \mathbf{F} 가 들어가고, 응력을 얻으려면 J/F\partial J/\partial \mathbf{F} 가 필요하다. 야코비 공식이 곧바로 J/F=cof(F)=adj(F)=JF\partial J/\partial\mathbf{F} = \operatorname{cof}(\mathbf{F}) = \operatorname{adj}(\mathbf{F})^{\top} = J\mathbf{F}^{-\top} 를 준다. 연속체역학낸슨 공식 nda=cof(F)NdA\mathbf{n}\,da = \operatorname{cof}(\mathbf{F})\,\mathbf{N}\,dA 도 같은 여인수행렬이며, 비압축 요소의 압력 자유도와 요소 잠김 논의가 전부 이 JJ 를 둘러싸고 벌어진다.
  • 형상 민감도. 형상 최적화위상 최적화에서 절점 좌표가 움직이면 자코비안 행렬의 행렬식 detJe\det J_e 가 변하고, 요소 적분의 미분에 d(detJe)d(\det J_e) 가 그대로 등장한다. 자동 미분이 내부적으로 뱉는 것도 이 공식이다. 메시 생성의 요소 뒤집힘 검사(detJe>0\det J_e > 0)를 개선 방향으로 밀 때도 같다.
  • 통계와 우도. 가우시안 로그우도의 12logdetΣ-\tfrac12\log\det\Sigma 를 하이퍼파라미터로 미분하면 tr(Σ1Σ)\operatorname{tr}(\Sigma^{-1}\partial\Sigma) 가 나온다. 가우시안 프로세스 학습의 기울기가 정확히 이것.

5. 특이행렬에서의 수반행렬[편집]

det(A)=0\det(A) = 0 이면 항등식이 Aadj(A)=OA\operatorname{adj}(A) = O 로 무너진다. 그런데 이 “무너짐”이 오히려 정보를 준다. 계수에 따라 다음이 성립한다.

rank(A)\operatorname{rank}(A)adj(A)\operatorname{adj}(A)
nn정칙, det(A)A1\det(A)A^{-1}
n1n-1계수가 정확히 1
n2\le n-2영행렬

계수가 n1n-1 인 경우가 흥미롭다. Aadj(A)=OA\operatorname{adj}(A) = Oadj(A)\operatorname{adj}(A)모든 열이 AA 의 영공간에 들어 있다는 뜻이고, 그 영공간은 1차원인데 adj(A)\operatorname{adj}(A) 는 영행렬이 아니다. 따라서 adj(A)\operatorname{adj}(A) 의 0이 아닌 아무 열이나 뽑으면 그것이 영공간을 생성하는 벡터다. 마찬가지로 adj(A)A=O\operatorname{adj}(A)A = O 에서 행들은 좌영공간을 생성한다. 결국 adj(A)=σuv\operatorname{adj}(A) = \sigma\,uv^{\top} 꼴의 계수 1 행렬이고, uu 는 우영벡터, vv 는 좌영벡터다.

작은 문제에서는 이게 실제로 쓰인다. 두 벡터에 동시에 수직인 방향, 사영기하 동차좌표에서 두 직선의 교점, 3점을 지나는 평면 — 전부 계수 결손 행렬의 영공간 뽑기다. 반면 큰 문제에서는 안 쓴다. 반올림 오차 때문에 rank\operatorname{rank} 가 정확히 n1n-1 인 일이 관측되지 않고, 무엇보다 특이값 분해의 최소 특이벡터가 같은 답을 훨씬 안정적으로 준다. “수치 영공간”은 SVD의 영역, 수반행렬은 기호·저차원의 영역이라는 분업이 확실하다.3

6. 그래도 살아남은 자리들[편집]

2×22\times2 · 3×33\times3 닫힌 형 역행렬. 유한요소법등매개변수 요소 루틴은 매 요소·매 구적점마다 3×33\times3 야코비안 JJ 를 뒤집는다. 100만 요소 × 구적점 8개면 800만 번. 이 크기에서는 J1=adj(J)/det(J)J^{-1} = \operatorname{adj}(J)/\det(J)압도적으로 빠르다 — 피벗 탐색이 없어 분기가 전혀 없고, 곱셈 몇 개와 나눗셈 하나뿐이며, 완전히 언롤되어 SIMD와 GPU 워프에 그대로 올라간다. 범용 가우스 소거법 루틴은 피벗 분기 때문에 파이프라인이 깨져 몇 배 느리다. 조건수는? 3×33\times3 야코비안이 나쁘다면 그건 메시 생성이 잘못된 것이지 역행렬 알고리즘 탓이 아니다.4 강성행렬 조립, 회전행렬 처리, 그래픽스의 법선 변환 행렬(adj(M)\operatorname{adj}(M)^{\top} 이 정확히 그것)이 전부 이 세계다.

분해행렬과 특성다항식. 정의에서 λ\lambda 를 변수로 둔 다항식 행렬에 항등식을 쓰면

(λIA)1=adj(λIA)det(λIA)=adj(λIA)p(λ)(\lambda I - A)^{-1} = \frac{\operatorname{adj}(\lambda I - A)}{\det(\lambda I - A)} = \frac{\operatorname{adj}(\lambda I - A)}{p(\lambda)}

이 나온다. 분해행렬(resolvent)의 극점이 곧 특성다항식의 근이라는 사실이 여기서 눈에 보인다. 분자 adj(λIA)=k=0n1Bkλk\operatorname{adj}(\lambda I - A) = \sum_{k=0}^{n-1}B_k\lambda^{k} 의 계수 행렬 BkB_kp(λ)p(\lambda) 의 계수를 AA 의 거듭제곱과 대각합만으로 동시에 뽑아내는 것이 파데예프-르베리에(Faddeev–LeVerrier) 알고리즘이며, O(n4)O(n^4) 에 나눗셈이 정수뿐이라 기호·정수 계산에서는 지금도 쓰인다. 부동소수점에서는 항들의 크기 차가 극단적이라 nn 이 20만 넘어도 유효숫자가 남지 않는다 — 자세한 사정과 최소다항식과의 관계는 케일리-해밀턴 정리 참고. 분해행렬은 행렬함수의 코시 적분 정의에도 그대로 들어간다.

기호 계산과 정수 산술. 컴퓨터 대수 시스템에서 나눗셈 없이 역행렬 정보를 다룰 때, 정수 행렬의 역을 유리수로 확장하지 않고 표현할 때 adj\operatorname{adj} 가 표준 도구다. “나눗셈이 없다”는 성질은 부동소수점 세계에서 아무 가치도 없지만 환(ring) 위에서는 전부다.

7. 관련 문서[편집]

8. Footnotes[편집]

  1. 하이엄의 Accuracy and Stability of Numerical Algorithms 1장이 이 반례로 시작한다. 재밌는 건 크라메르 법칙이 전진 오차로는 꽤 괜찮은 경우가 있다는 것 — 그래서 “돌려봤더니 맞던데요?”라는 반박이 끊이지 않는다. 문제는 언제 맞고 언제 틀리는지 사전에 알 수 없다는 점이고, 수치해석에서 그건 그냥 틀린 것과 같다.

  2. 수반행렬로 역행렬을 구하는 코드를 제출했다가 리뷰에서 반려당한 신입의 변명이 “교과서에 나온 공식대로 했는데요”였다는 이야기는 사무실마다 하나씩 있다. 교과서는 틀리지 않았다. 다만 그 장의 목적이 “역행렬이 존재한다”를 증명하는 것이었지 “역행렬을 구하라”가 아니었을 뿐이다.

  3. 한국어 “수반행렬”은 지뢰밭이다. 선형대수에서는 이 문서의 adjugate를 뜻하지만, 함수해석·양자역학 맥락에서는 켤레전치 AHA^{H}(Hermitian adjoint, 에르미트 수반)를 가리킨다. 영어권이 헷갈리다 못해 전자를 adjugate라는 새 단어로 갈아치운 게 20세기 중반인데, 한국어는 아직 그 개명을 못 따라갔다. 참고로 동반행렬(companion matrix)은 또 다른 물건.

  4. 그렇다고 4×44\times4, 5×55\times5 까지 손으로 전개한 코드를 쓰는 것은 다른 이야기다. 항이 급격히 늘어 코드가 수백 줄이 되고 상쇄도 심해진다. 그래픽스가 4×44\times4 동차 변환을 닫힌 형으로 뒤집는 건 그게 회전+평행이동이라는 특수 구조라서지, 일반 4×44\times4 라면 그냥 LU 분해를 쓰자.