같은 행렬을 여러 번 곱하는 자리가 딥러닝에는 많습니다. 순환망이 시간 축을 따라 같은 가중치를 반복해 곱하고, 깊은 층의 역전파도 층마다의 야코비안을 줄줄이 곱합니다. 그런데 그렇게 반복해 곱해 보면 이상한 일이 벌어집니다 — 어떤 입력은 몇 배씩 커지고 어떤 입력은 0으로 죽는데, 크기가 아니라 방향이 그 운명을 가릅니다.
논문의 문장들도 그 사실을 전제하고 쓰여 있습니다. "스펙트럼 반지름이 1을 넘으면", "헤세 행렬의 가장 큰 고윳값이 곧 곡률이고", "공분산의 주축을 따라" 같은 표현들은 전부 행렬마다 특별한 방향이 있다는 이야기입니다.
이 글은 그 방향을 정의하고, 그것을 찾는 방정식을 세우고, 마지막에는 방정식을 풀지 않고도 갈래를 읽는 법까지 갑니다.
방향이 변하지 않는 축
정의
지난 글에서 회전은 모든 방향을 돌리고 스케일은 축 방향을 그대로 둔다는 것을 봤습니다. 그 "그대로 둔다"를 정의로 만듭니다.
정의. 이고 를 만족하는 스칼라 가 있으면, 를 의 고유벡터, 를 그에 딸린 고윳값이라고 한다.
오른쪽의 는 의 스칼라배이므로 같은 직선 위에 있습니다. 행렬을 먹였는데 방향이 안 바뀌고 길이만 배가 된 것입니다. 가 음수면 반대쪽을 향하지만 직선은 같습니다.
이라는 조건이 붙은 이유는 간단합니다. 은 어떤 로도 참이라 아무것도 말해 주지 않기 때문입니다.
λ가 0일 때와 1일 때
배율 의 값에 따라 그 방향이 겪는 일이 다릅니다. 두 자리를 먼저 못 박아 두면 나중에 읽기가 쉬워집니다.
이면 입니다. 0이 아닌 벡터가 통째로 0으로 뭉개졌다는 뜻이고, 그러면 는 되돌릴 수 없습니다. 어느 입력에서 왔는지 알 길이 없기 때문입니다. 그래서 0이 고윳값이라는 말과 이라는 말은 같은 말입니다. 어느 쪽이 먼저인지 따질 것 없이 같은 사실의 두 표현입니다.
이면 라 그 방향이 손도 안 대진 채 남습니다. 무엇을 몇 번 곱해도 그 방향은 그대로이니 입니다. 반복해 곱하는 상황에서 이런 방향은 폭발하지도 사라지지도 않는 자리입니다.
가 1보다 크면 곱할 때마다 그 방향이 길어지고 1보다 작으면 짧아집니다. 첫머리의 "어떤 입력은 커지고 어떤 입력은 죽는다"가 이미 여기 다 들어 있습니다.
길이와 부호를 정하는 관례
고유벡터는 하나로 정해지지 않습니다. 의 양변에 2를 곱하면 라 도 같은 고윳값의 고유벡터이고, 도 마찬가지입니다.
그래서 관례로 길이를 1로 맞춰 둡니다. 계산 라이브러리가 돌려주는 고유벡터는 전부 노름이 1입니다. 그래도 부호는 남습니다 — 길이가 1인 후보가 한 직선에 둘이라, 어느 쪽을 돌려줄지는 구현이 정합니다. 같은 행렬을 다른 라이브러리에 넣어 부호가 뒤집힌 답이 나와도 틀린 것이 아닙니다.
부호가 바뀌면 곤란한 계산을 하고 있다면 — 예를 들어 주성분의 방향을 그림으로 그려 비교한다면 — 첫 성분이 양수가 되도록 맞추는 식으로 직접 고정해야 합니다. 라이브러리는 그것까지 보장해 주지 않습니다.
특성방정식
det(A − λI) = 0
와 를 한꺼번에 찾기는 어렵습니다. 정의를 한쪽으로 몰면 길이 열립니다.
를 쓰는 이유는 라는 뺄셈이 정의되지 않기 때문입니다 — 행렬에서 스칼라를 뺄 수는 없고, 대각에만 를 놓은 행렬을 빼야 합니다.
이제 조건은 " 을 만족하는 0이 아닌 가 있는가"입니다. 그런 가 있다는 것은 그 행렬이 0이 아닌 벡터를 0으로 뭉갠다는 뜻이고, 9번 글의 그림으로 말하면 단위 정사각형이 납작해졌다는 뜻입니다. 넓이 배율이 0이므로
이것을 의 특성방정식이라고 합니다. 행렬식의 정의와 "0이면 되돌릴 수 없다"는 성질은 초급 44번의 것이고, 여기서는 가져다 쓰기만 합니다. 앞 절에서 본 "0이 고윳값이면 "은 이 식에 을 넣은 것과 같습니다.
에서 왼쪽을 실제로 전개합니다. 이면
여기서 는 대각 성분의 합, 즉 대각합 이고 는 행렬식입니다. 대각합이라는 이름은 초급 42번에서 이름만 지나갔는데, 그것이 쓰이는 첫 자리가 여기입니다.
행렬의 고윳값은 이 이차방정식의 두 근입니다.
손으로 두 개
이면 , 이므로
고윳값을 알았으니 각각에 대해 을 풉니다. 이면
두 식이 같은 말이라 해가 하나로 안 정해지고 직선 전체가 나옵니다. 을 대표로 잡습니다. 검산하면 로 맞습니다.
이면 이라 , 즉 입니다. 로 길이도 방향도 그대로입니다.
두 식이 같은 말이 되는 것이 우연이 아니라는 점을 짚어 둡니다. 를 특성방정식의 근으로 골랐으니 이고, 그러면 그 행렬의 두 행은 서로의 상수배입니다. 만약 연립식을 풀다가 만 나왔다면 그 가 근이 아니거나 계산이 틀린 것입니다. 풀이가 직선으로 안 나오면 되짚어 봐야 합니다.
고유공간
해가 직선으로 나오는 것은 오류가 아니라 구조입니다. 가 고유벡터면 도 고유벡터이기 때문입니다. 그래서 고윳값 에 딸린 해 전체 — 의 해집합 — 를 고유공간이라고 부르고, 8번 글의 말로 하면 그것은 부분공간입니다. 고유벡터를 하나 고르는 것은 그 부분공간의 기저를 하나 잡는 일입니다.
부분공간이라는 말을 여기서 한 번 더 짚으면, 고유공간의 두 벡터를 더해도 그 안에 있고 상수배해도 그 안에 있다는 뜻입니다. 확인은 한 줄입니다. 이고 이면
이라 합도 같은 고윳값의 고유벡터입니다. 여기서 두 벡터의 고윳값이 같아야 한다는 것이 중요합니다. 가 다른 둘을 더하면 이고 이것은 어느 한 수의 배가 아닙니다.
그리고 그 사실이 곧 다음 성질로 이어집니다. 고윳값이 서로 다르면 고유벡터는 저절로 일차독립입니다. 만약 였다면 가 의 고유벡터이기도 해서 가 되어야 하는데 다르다고 했으니 모순입니다. 대각화의 조건을 확인할 때 이 성질이 절반을 그냥 처리해 줍니다 — 고윳값이 전부 다르면 독립성은 따로 볼 것이 없습니다.
남는 것은 중근인 경우이고, 그때는 고유공간의 차원이 1일 수도 2일 수도 있습니다. 단위행렬 는 이 중근인데 모든 벡터가 고유벡터라 고유공간이 평면 전체입니다. 전단은 같은 중근인데 직선 하나뿐입니다. 둘을 가르는 것은 근의 개수가 아니라 가 얼마나 납작해졌는가입니다.
n차 다항식과 수치 계산
으로 올라가면 가 에 대한 차 다항식이 됩니다. 중복을 세면 근이 정확히 개이므로 고윳값도 중복을 세어 개 입니다. 다만 실수 범위에서 그렇다는 말은 아닙니다. 아래에서 볼 회전처럼 실근이 하나도 없을 수 있습니다.
바로 답이 나오는 자리가 하나 있습니다. 위삼각행렬이나 아래삼각행렬이면 가 대각 성분의 곱이라 이고, 대각 성분이 그대로 고윳값 입니다. 손으로 확인할 예를 만들 때 이 사실이 편합니다.
그런데 실제 수치 계산은 이 다항식을 풀지 않습니다. 다항식의 계수에서 근을 찾는 문제는 입력이 조금만 달라져도 답이 크게 흔들리는 종류라, 계수를 만들어 근을 구하는 순간 정확도를 잃습니다. 이 100만 되어도 계수의 자릿수가 감당이 안 됩니다. 라이브러리는 대신 행렬을 반복해서 삼각행렬에 가까운 모양으로 몰아가는 알고리즘을 씁니다. 특성방정식은 정의를 세우고 손으로 를 푸는 도구이지 계산 절차가 아닙니다.
대각합과 행렬식으로 읽기
합은 대각합, 곱은 행렬식
특성방정식이 이차방정식이므로 초급 23번의 근과 계수의 관계를 그대로 읽을 수 있습니다. 의 두 근을 라 하면
고윳값을 구하지 않고도 그 합과 곱은 눈으로 읽힙니다. 대각 성분을 더하고, 대각선끼리 곱해 빼면 끝입니다. 위의 예에서 합은 , 곱은 로 맞습니다.
에서도 그대로입니다. 고윳값을 전부 더하면 대각합이고 전부 곱하면 행렬식입니다. 크기가 커져도 두 수는 여전히 한눈에 읽히므로, 100차 행렬이라도 "고윳값의 평균은 대각합을 100으로 나눈 값"이라는 정보는 공짜로 얻습니다.
판별식이 가르는 갈래
이 두 줄이 생각보다 멀리 갑니다. 판별식이 이므로 두 수만으로 고윳값의 갈래가 정해지기 때문입니다.
| 행렬 | 읽는 방법 | 결론 | ||
|---|---|---|---|---|
| 열 | 4 | 3 | 합 4, 곱 3 | |
| 열 | 7 | 10 | 합 7, 곱 10 | |
| 열 | 5 | 곱이 음수 | 부호가 다른 두 실근 | |
| 전단 열 | 2 | 1 | 판별식 | 중근 |
| 90도 회전 열 | 0 | 1 | 합 0인데 곱이 양수 | 실수로는 불가능 |
마지막 줄이 흥미롭습니다. 합이 0인 두 실수는 와 꼴이라 곱이 입니다. 곱이 이려면 실수여서는 안 됩니다. 판별식도 으로 같은 말을 합니다.
기하로 보면 당연한 결론입니다. 90도 회전은 모든 방향을 돌려 버리므로 제자리에 남는 실수 방향이 있을 수 없습니다. 일반적인 회전 도 , 이라 판별식이 이고, 가 0도나 180도가 아닌 한 음수입니다. 복소 고윳값이 나오면 그 행렬 안에 회전이 들어 있다는 신호이고, 이 대응은 「중급 15번 · 특잇값 분해」에서 다시 만납니다.
좌표계와 무관한 두 수
갈래 읽기가 쓸모 있는 더 깊은 이유가 있습니다. 대각합과 행렬식은 기저를 바꿔도 변하지 않는 수 입니다.
행렬식 쪽은 곱의 성질에서 바로 나옵니다.
대각합 쪽은 라는 성질을 쓰면 됩니다. , 로 놓으면 입니다.
같은 변환을 다른 축에서 보면 행렬의 아홉 개 성분은 전부 달라지는데 이 두 수만은 그대로입니다. 그러니 고윳값도 좌표계와 무관합니다 — 애초에 고윳값이 좌표계와 무관하기 때문에 그것으로 만든 합과 곱이 안 변하는 것이고, 순서를 바꿔 읽어도 같은 말입니다. 어떤 축에서 적었든 행렬의 갈래는 하나로 정해져 있습니다.
고윳값이 있는 자리 가두기
합과 곱만으로는 고윳값이 정확히 어디쯤인지까지는 안 나옵니다. 그런데 행 하나하나를 보면 대략의 자리를 가둘 수 있습니다. 대각 성분 를 가운데로 놓고, 그 행의 나머지 성분들의 절댓값을 더한 만큼을 반지름으로 잡은 구간을 그립니다. 모든 고윳값은 그 구간들의 합집합 안에 있습니다.
로 해 봅니다. 첫 행은 가운데 4, 반지름 1이라 이고 둘째 행은 가운데 2, 반지름 1이라 입니다. 실제 고윳값은 , 이므로
둘 다 각각의 구간 안에 들어 있습니다.
이 눈어림이 특히 쓸모 있는 것은 대각이 크고 나머지가 작은 행렬 에서입니다. 반지름이 작으면 구간이 좁아져 고윳값이 대각 성분 가까이에 있다는 것이 바로 읽히고, 모든 구간이 0보다 오른쪽에 있으면 그 행렬은 고윳값이 전부 양수라 되돌릴 수 있습니다. 여기서는 대칭 행렬만 다루므로 구간으로 적었는데, 대칭이 아니면 고윳값이 실수가 아닐 수 있어 수직선이 아니라 평면 위의 원판이 됩니다.
대각화
세 단계
고유벡터가 좋은 이유는 거기서는 행렬이 곱셈 하나로 줄기 때문입니다. 8번 글에서 축을 바꾸는 조작을 로 적었는데, 그 자리에 고유벡터를 세우면 어떻게 되는지 봅니다.
고유벡터들을 열로 세운 행렬을 , 고윳값을 대각에 놓은 행렬을 라고 합니다. 열 시선으로 곱을 보면 의 열은 이고, 그것은 의 열과 같습니다. 즉
이것을 대각화라고 합니다. 가 가역이어야 하므로 조건은 일차독립인 고유벡터가 개 있는 것입니다 — 8번 글의 기저 조건 그대로입니다.
를 계산하는 일이 세 걸음으로 갈린 것으로 읽으면 뜻이 분명해집니다. 이 를 고유기저의 좌표로 옮기고, 가 축마다 제 배율로 늘이고, 가 원래 좌표로 되돌립니다. 가운데 걸음만 실제 계산이고 양옆은 읽는 자리를 옮기는 일입니다.
로 확인합니다.
가 8번 글에서 좌표를 다시 읽어 볼 때 쓴 바로 그 기저입니다. 그때는 임의로 고른 축이었는데, 이 행렬에 대해서는 그것이 특별한 축이었던 것입니다.
거듭제곱
대각화가 값을 발휘하는 자리는 거듭제곱입니다. 가운데의 가 차례로 지워지므로
그리고 는 대각 성분을 각각 제곱한 것뿐입니다. 행렬을 번 곱하는 일이 수를 제곱하는 일로 바뀌었고, 첫머리의 "어떤 방향은 커지고 어떤 방향은 죽는다"가 여기서 설명됩니다 — 인 방향은 폭발하고 인 방향은 사라집니다.
가 커질수록 안에서 가장 큰 를 가진 성분이 나머지를 압도합니다. , 인 위 예에서 이면 와 이라 사실상 한 방향만 남습니다. 이 가장 큰 절댓값에 스펙트럼 반지름 이라는 이름이 붙고, 그 이야기를 끝까지 끌고 가는 것이 다음 글입니다.
대각에 먹이는 다른 계산
거듭제곱만 되는 것이 아닙니다. 에 무엇을 하든 그것이 "곱하고 더하는 일"로 적히면 대각에서도 같은 일을 하면 됩니다.
제곱근이 그 예입니다. 고윳값이 전부 0 이상인 대칭 행렬에서 각 의 제곱근을 대각에 놓고 로 감싸면, 그것을 두 번 곱해 가 되는 행렬이 나옵니다. 지수도 마찬가지로 를 대각에 놓으면 됩니다. 역행렬조차 를 대각에 놓은 것이고, 그래서 고윳값 중 하나가 0이면 역행렬이 없다는 앞 절의 말이 여기서 다시 나옵니다 — 0으로 나눌 수 없기 때문입니다.
정규직교 기저일 때
의 열들이 서로 직교하고 길이가 1이면 계산이 통째로 가벼워집니다. 그런 행렬은 이므로 이고, 역행렬을 구할 필요가 아예 없습니다.
역행렬을 구하는 일은 이 커지면 비싸고 수치적으로도 불안한데, 전치는 성분의 자리를 바꾸는 것뿐이라 공짜이고 오차도 없습니다. 이 좋은 일이 언제 일어나는지는 다음 절에서 봅니다.
대각화가 안 되는 두 경우
조건이 "독립인 고유벡터 개"였으니 그 수를 못 채우는 행렬이 있습니다. 두 가지 방식으로 모자랍니다.
방향이 모자랄 때
중근인데 방향이 하나뿐인 경우입니다. 전단 은 , 이라 으로 이 중근입니다. 고유공간을 구하면
은 자유이므로 해는 방향 직선 하나입니다. 근은 둘인데 방향은 하나라 의 열을 채울 수 없습니다.
중근이면 늘 이렇게 되는 것은 아닙니다. 단위행렬 도 이 중근인데 이라 모든 벡터가 해이고, 고유공간이 평면 전체입니다. 독립인 방향을 둘 잡을 수 있으니 대각화가 됩니다 — 사실 이미 대각입니다. 중근은 위험 신호일 뿐 판정이 아니고, 판정은 고유공간의 차원이 합니다.
실수 방향이 없을 때
회전이 여기 해당합니다. 실수 범위에서는 대각화되지 않고, 복소수까지 허용하면 대각화됩니다 — 다만 이 커리큘럼은 복소수 없이 진행하므로 "회전은 실수로 대각화되지 않는다"까지만 들고 갑니다.
앞 절의 지도에서 판별식이 음수인 영역 전체가 이 경우입니다. 그 영역은 포물선 의 위쪽이라 좁은 예외가 아니라 넓은 구역이고, 대각합이 작은데 행렬식이 큰 행렬은 대체로 여기에 듭니다.
대칭 행렬은 이런 사고가 절대 나지 않습니다. 이면 언제나 실수 고윳값이 나오고 고유벡터를 서로 직교하게 잡을 수 있다는 결과가 있습니다. 직교하게 잡을 수 있다는 것은 앞 절의 이 성립한다는 말이기도 합니다. AI에서 만나는 행렬 — 공분산·헤세·그람 — 이 대부분 대칭이라 실전에서는 이 좋은 경우가 기본값입니다. 그 증명과 활용은 「중급 14번 · 대칭 행렬」의 몫입니다.
다만 대칭은 충분조건이지 필요조건이 아닙니다. 대칭이 아니어도 독립인 고유벡터가 개이기만 하면 대각화됩니다. 위 지도에서 판별식이 양수인 자리의 행렬들이 전부 그렇습니다 — 서로 다른 두 실근이면 고유벡터가 저절로 독립이라는 성질을 앞에서 봤습니다.
거의 평행할 때
수치 계산에서는 되느냐 안 되느냐보다 얼마나 아슬아슬한가가 더 중요합니다. 고유벡터 둘이 독립이기는 한데 거의 평행하면 를 되돌리는 일이 불안정해집니다.
을 생각해 보면 두 열의 사잇각이 이 작을수록 좁아지고 이라 역행렬의 성분이 만큼 커집니다. 을 계산하는 도중에 큰 수와 작은 수가 섞여 유효숫자가 깎입니다.
두 고유 방향이 나란해지는 것은 두 고윳값이 서로 가까워질 때 자주 일어납니다. 앞 절에서 "중근이면 방향이 모자랄 수 있다"고 했는데, 중근에 가까운 자리는 그 사고의 문턱에 앉아 있는 셈입니다. 대각화가 되는가는 예 아니오로 갈리지만 얼마나 믿을 만한가는 연속적으로 나빠집니다.
코드로 확인하기
eig 와 eigh
import numpy as np
A = np.array([[2., 1], [1, 2]])
w, V = np.linalg.eig(A)
print(w) # [3. 1.]
print(V) # 열이 고유벡터 (부호와 크기는 정규화되어 있다)
print(np.trace(A), np.linalg.det(A)) # 4.0 3.0
print(w.sum(), w.prod()) # 4.0 3.0 — 합은 대각합, 곱은 행렬식
대칭 행렬에는 eig 대신 eigh 를 씁니다. 이름 끝의 h는 대칭인 경우를 가리키고, 그 구조를 쓰는 알고리즘이라 빠를 뿐 아니라 실수 고윳값과 직교하는 고유벡터를 보장 합니다. eig 로 대칭 행렬을 풀면 이론상 실수인 값에 짜리 허수부가 붙어 돌아오는 일이 있는데, eigh 는 그럴 일이 없습니다. 고윳값도 오름차순으로 정렬해 돌려줍니다.
w2, V2 = np.linalg.eigh(A)
print(w2) # [1. 3.] — 오름차순
print(np.allclose(V2.T @ V2, np.eye(2))) # True — 열이 정규직교
부호와 순서
같은 코드를 다른 환경에서 돌리면 고유벡터의 부호가 뒤집혀 나올 수 있고, eig 는 고윳값의 순서도 보장하지 않습니다. 값을 눈으로 비교하다 "결과가 다르다"고 놀라기 쉬운 자리입니다.
print(np.allclose(A @ V[:, 0], w[0] * V[:, 0])) # True — 정의로 확인한다
비교는 값이 아니라 정의로 합니다. 를 직접 확인하거나, 고윳값을 정렬한 뒤 견주거나, 부호를 손으로 고정하고 나서 비교합니다.
대각화와 거듭제곱도 한 줄씩입니다.
P, L = V, np.diag(w)
print(np.allclose(P @ L @ np.linalg.inv(P), A)) # True
print(np.allclose(P @ (L ** 5) @ np.linalg.inv(P),
np.linalg.matrix_power(A, 5))) # True
대각화가 안 되는 행렬에서
대각화되지 않는 두 경우도 그대로 보입니다.
N = np.array([[1., 1], [0, 1]]) # 전단
print(np.linalg.eig(N).eigenvalues) # [1. 1.]
print(np.linalg.matrix_rank(np.linalg.eig(N).eigenvectors)) # 1 — 방향이 하나뿐
R = np.array([[0., -1], [1, 0]]) # 90도 회전
print(np.linalg.eigvals(R)) # [0.+1.j 0.-1.j] 실수가 아니다
전단 쪽에서 눈여겨볼 것은 오류가 나지 않는다는 점입니다. eig 는 고윳값을 둘 돌려주고 고유벡터도 두 열을 돌려주는데, 두 열이 사실상 같은 방향이라 계수가 1입니다. 그대로 로 써서 을 계산하면 역행렬 자리에서 값이 터지거나 엉뚱한 수가 나옵니다. 대각화가 되는지는 라이브러리가 알려 주지 않으므로 고유벡터 행렬의 계수를 직접 봐야 합니다.
정리
- 고유벡터는 방향이 변하지 않는 벡터이고, 그때의 배율이 고윳값입니다. , 단 입니다. 은 그 방향이 뭉개진다는 뜻이라 과 같은 말이고, 은 그 방향이 그대로 남는다는 뜻입니다.
- 고유벡터는 길이와 부호가 안 정해집니다. 라이브러리는 길이를 1로 맞춰 주지만 부호는 구현이 정합니다.
- 특성방정식은 이고, 에서 전개하면 입니다. 삼각행렬이면 대각 성분이 그대로 고윳값입니다.
- 수치 계산은 이 다항식을 풀지 않습니다. 계수에서 근을 찾는 문제가 불안정해서, 라이브러리는 행렬을 삼각형에 가깝게 몰아가는 다른 알고리즘을 씁니다.
- 근과 계수의 관계를 읽으면 합이 대각합, 곱이 행렬식입니다. 두 수만으로 판별식의 부호가 정해지므로 고윳값을 풀지 않고 갈래를 읽을 수 있고, 두 수는 기저를 바꿔도 변하지 않습니다.
- 합이 0인데 곱이 양수 같은 조합은 실수로 불가능하고, 그런 자리가 회전입니다.
- 행마다 대각 성분을 가운데, 나머지 합을 반지름으로 잡은 구간의 합집합 안에 고윳값이 전부 들어갑니다. 대각이 크고 나머지가 작을수록 좁게 가둡니다.
- 고유공간은 부분공간이라 고유벡터는 직선(또는 그 이상)으로 나옵니다. 고윳값이 서로 다르면 고유벡터는 저절로 일차독립이고, 중근이면 고유공간의 차원을 직접 봐야 합니다.
- 대각화 은 독립인 고유벡터가 개일 때 가능하고, 로 거듭제곱이 수의 거듭제곱이 됩니다. 제곱근·지수·역행렬도 같은 방식으로 대각에 먹입니다.
- 의 열이 정규직교이면 이라 역행렬을 구할 일이 없습니다.
- 전단은 방향이 모자라고 회전은 실수 방향이 없어 대각화되지 않습니다. 대칭 행렬에서는 이런 일이 없지만, 대칭은 충분조건일 뿐입니다. 그리고 두 고유 방향이 거의 평행하면 대각화는 되어도 수치적으로 무너집니다.
다음 글은 를 끝까지 밀어붙입니다 — 반복해 곱할 때 가장 큰 고윳값 하나가 나머지를 어떻게 압도하는지, 그리고 그 성질을 거꾸로 이용해 곱셈만으로 최대 고윳값을 찾아내는 방법입니다.
읽어주셔서 감사합니다. 😊

