https://www.acmicpc.net/problem/25510
https://infossm.github.io/blog/2022/08/18/CharPoly/
Division-Free Determinant에 대해 위 문제를 내고 글도 썼는데, 최근 훨씬 간단한 알고리즘이 있다고 해서 정리해보려고 한다.
원본 글에 달린 것과 동일하게 O(n4)에 동작하는 division-free characteristic polynomial 알고리즘이다.
Algorithm
n×n 행렬 A=(aij)에 대해, Ai를 i…n번째 행, 열만 따와서 만든 크기 n−i+1의 정사각행렬이라고 하자. 당연히 A1=A이다.
p1(x)=det(xI−A)를 cofactor expansion으로 계산하면 p1(x)=(x−a11)det(xI−A2)−a12det(⋯)⋯ 와 같은 형태로 나올 텐데, 사실 훨씬 간단한 형태로 계산할 수 있다.
Lemma.
A를 (a11CRA2)로 쓰자. 즉 R,C를 각각 크기 n−1의 row/column 벡터로 볼 때,
p1(x)=(x−a11)p2(x)−Radj(xI−A2)C.
여기서 adj(A)는 Aadj(A)=(detA)I를만족하는행렬로,(-1)^{i+j}\det (A_{-j, -i})를(i, j)원소로가진다.A_{-i, -j}는A의i번째행,j번째열을제외한크기n-1$의 정사각행렬인데, 말이 어렵지만 사실 cofactor expansion을 행렬로 적은 것이다.
Proof. (xI−A)adj(xI−A)=p1(x)I 의 (1,1)을 보자. xI−A의 첫번째 row는 $\begin{pmatrix} x - a_{11} & -R$이고, adj(xI−A)의 첫번째 column은 당연히 첫 원소에 p2(x)가 있을 테지만, j>1에 대해서는 xI−A2의 j−1번째 column을 빼고, 첫 행에 −C를 집어넣은 행렬에 (−1)1+j를 곱한 값이다.
여기서 다시 cofactor expansion을 진행하자. 이번에는 첫 column (−C)를 빼고 다른 row들을 빼면서 내려가면, 이는 (−1)1+j∑i=1n−1(−1)1+i(−C)idet(A2)−i,−(j−1) 이 된다. 이는 곧 (adj(xI−A2)C)j−1이 됨을 알 수 있다. □
따라서 Radj(xI−A2)C 를 계산하는 게 중요한데, adj(xI−A) 꼴에 대한 다음 lemma가 중요하다.
Lemma.
det(xI−A)=p0xn+⋯+pn이라고 하자. adj(xI−A)=∑k=1nxn−k(p0Ak−1+⋯+pk−1)가 성립한다.
Proof. Cayley-Hamilton theorem에 의해서 p(A)=0이다. p(x)−p(A)=∑k=0npk(xn−kI−An−k)를 생각하고, 이들을 xI−A로 나누면 ∑k=0npk∑i=0n−k−1xn−k−1−iAi가 되고, 이걸 정리하면 위 식을 얻는다.
따라서 이 두 식을 조합하면, p2(x)=q0xn−1+⋯+qn−1이라고 하면
p1(x)=(x−a11)p2(x)−k=0∑n−2qk(xn−k−2+(RA2C)xn−k−3+⋯+(RA2n−k−2C))
를 얻는다. 이 때 RA2iC는 i=1,⋯,n에 대해 O(n3) 시간에 계산할 수 있고, A2에 대해 재귀적으로 문제를 해결하면 전체 O(n4) 시간복잡도를 갖는다.
위키피디아의 식이 이렇게 유도되는데, 이를 잘 분해하면 n개의 toeplitz matrix (대각선을 따라 constant인) 의 곱을 얻는데, 이는 원래 행렬 A에서 모두 얻을 수 있어 병렬적으로 계산이 가능하다. 아쉽게도 두 toeplitz matrix의 곱이 toeplitz라는 보장은 없기 때문에 단순 곱셈보다 빠르게 계산할 수는 없는 것 같다.