복소 벡터와 행렬 개요 (Complex Vectors and Matrices Overview)

왜 실수만으로는 부족한가 — Hermitian·Unitary·Fourier의 지도

회전 행렬은 실 벡터로는 불변 방향을 갖지 않지만, 복소 벡터로 확장하면 \(e^{i\theta}\) 와 그 켤레쌍이 고유값으로 등장한다. 실행렬도 복소 고유값을 갖고, 많은 선형대수 도구(푸리에 변환, 양자역학, 신호처리)는 복소 공간에서만 정확히 작동한다. 이 포스트는 Strang Ch.10 을 뼈대로 복소수 기본 → 켤레전치(Hermitian) → 복소 내적 → Hermitian/Unitary 행렬의 스펙트럼 정리 → 푸리에 행렬과 FFT → ML·DL 응용까지를 한 편에 개관한다. 각 섹션은 실수 세계의 대응 개념과 짝지어 “무엇이 바뀌고 무엇이 보존되는가”를 명시한다.

Mathematics
Machine Learning
Deep Learning
저자

Kwangmin Kim

공개

2026년 04월 13일

1 개요

지금까지의 선형대수는 모두 실수 위에서 전개했다. 벡터는 \(\mathbb{R}^n\) 원소였고, 행렬은 실수 원소였으며, 고유값·특이값은 대부분 실수로 나왔다. 그런데 평범한 2×2 회전 행렬

\[ \mathbf{R}_\theta = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix} \]

의 고유값을 풀어 보면 실수 해가 없다. 특성방정식 \(\lambda^2 - 2\cos\theta\,\lambda + 1 = 0\) 의 해는 \(\lambda = e^{\pm i\theta}\) 이다. “방향을 바꾸지 않는 벡터”가 실수 세계에는 존재하지 않기 때문에 실 고유벡터가 없고, 복소 벡터 \((1, \mp i)^\top\) 만이 이 역할을 한다.

이 한 사례가 선형대수 전체에서 복소수 확장이 선택이 아니라 필수임을 보여 준다.

  1. 실 행렬도 복소 고유값을 갖는다 — 따라서 고유분해를 완전히 다루려면 \(\mathbb{C}^n\) 이 필요하다.
  2. 복소 행렬 자체가 필요하다 — 푸리에 행렬, 양자역학의 해밀토니안, 신호처리의 주파수 응답.
  3. 실수 대칭 정리는 자연스럽게 확장된다\(A = A^\top\) (대칭) → \(A = A^H\) (Hermitian), \(Q^\top Q = I\) (직교) → \(U^H U = I\) (unitary).

이 포스트는 Strang (2009) Introduction to Linear Algebra Ch.10 “Complex Vectors and Matrices” 를 뼈대로 복소 선형대수의 지형을 개관한다. §10.1 복소수 기본, §10.2 Hermitian과 Unitary 행렬, §10.3 Fast Fourier Transform 을 모두 다루되, 개별 주제의 상세는 각 후속 포스트로 분리한다.


2 복소수 기초

2.1 허수 단위 \(i\)

\(i\) 는 방정식 \(x^2 = -1\) 의 해로 정의된다. 실수로는 해를 가질 수 없으므로 수 체계의 확장이며, 그 확장은 \(i^2 = -1\) 이라는 단 하나의 규칙으로 충분하다.

정의: 복소수 (Complex Number)

\(a, b \in \mathbb{R}\) 에 대해 \(z = a + bi\) 를 복소수라 하고, \(a = \text{Re}(z)\) 를 실부, \(b = \text{Im}(z)\) 를 허부라 한다. 복소수 전체의 집합은 \(\mathbb{C}\) 이다.

연산:

  • : \((a + bi) + (c + di) = (a+c) + (b+d)i\)
  • : \((a + bi)(c + di) = (ac - bd) + (ad + bc)i\)\(i^2 = -1\) 로부터 유도
  • 켤레 (conjugate): \(\bar{z} = a - bi\)
  • 절댓값 (modulus): \(|z| = \sqrt{a^2 + b^2} = \sqrt{z\bar{z}}\)

2.2 복소평면

복소수 \(z = a + bi\) 는 평면 \(\mathbb{R}^2\) 의 점 \((a, b)\) 에 대응한다. 합은 벡터 덧셈과 동일하다. 차이는 곱셈 연산이 복소평면에 존재한다는 점이다 — 복소수 곱은 평면에서 “크기 곱 + 각도 합”이다.

2.3 극형식과 Euler 공식

\(z\) 를 길이 \(r\) 과 각도 \(\theta\) 로 쓰면

\[ z = r(\cos\theta + i\sin\theta) = r e^{i\theta} \]

이다. 두 번째 등호가 Euler 공식 \(e^{i\theta} = \cos\theta + i\sin\theta\) 이다.

곱셈의 의미가 선명해진다.

\[ (r_1 e^{i\theta_1})(r_2 e^{i\theta_2}) = r_1 r_2\, e^{i(\theta_1 + \theta_2)} \]

크기는 곱, 각도는 합. \(i\) 를 곱하면 각도가 \(90°\) 더해진다 (\(i = e^{i\pi/2}\)). \(e^{i\pi} = -1\) 은 “반 바퀴 돌면 부호가 바뀐다”. \(e^{2\pi i} = 1\) 은 “한 바퀴 돌면 제자리”.

직관: Euler 공식은 “회전의 언어”

곱셈 \(\times e^{i\theta}\) 는 복소평면에서 원점 기준 \(\theta\) 회전이다. 이 관점에서

  • \(z^n = r^n e^{in\theta}\) (De Moivre): \(n\) 번 곱하면 각도 \(n\) 배, 크기 \(n\) 제곱
  • \(n\) 제곱근 \(z^{1/n}\): \(n\) 개 해가 원 위에 \(2\pi/n\) 간격으로 배치 → 단위원의 n등분점

FFT가 의존하는 1의 \(n\) 제곱근 \(\omega_n^k = e^{2\pi i k/n}\) 은 단위원을 정확히 \(n\) 등분한 점들이다. 회전의 언어 없이는 이 구조가 보이지 않는다.

2.4 켤레의 핵심 성질

  1. \(\overline{z_1 + z_2} = \bar{z}_1 + \bar{z}_2\)
  2. \(\overline{z_1 z_2} = \bar{z}_1 \bar{z}_2\)
  3. \(z \bar{z} = |z|^2\) (항상 실수, 양의 값)
  4. \(z + \bar{z} = 2\text{Re}(z)\) (실수)

이 네 성질이 이후 모든 Hermitian 정리의 도구다.

실 행렬의 복소 고유쌍: \(A \mathbf{v} = \lambda \mathbf{v}\) 이고 \(A\) 가 실이면, 양변에 켤레를 취하면 \(A\bar{\mathbf{v}} = \bar{\lambda}\bar{\mathbf{v}}\). 즉 복소 고유값은 반드시 켤레쌍 \((\lambda, \bar{\lambda})\) 으로 등장한다. 그래서 회전 행렬이 \(e^{i\theta}, e^{-i\theta}\) 를 함께 갖는다.


3 복소 벡터와 켤레전치

3.1\(z^\top\) 으로는 부족한가

실 벡터 \(\mathbf{x} \in \mathbb{R}^n\) 의 길이 제곱은 \(\mathbf{x}^\top \mathbf{x} = \sum x_i^2\). 이를 복소 벡터에 그대로 적용하면 문제가 생긴다. \(\mathbf{z} = (1, i)^\top\) 에 대해

\[ \mathbf{z}^\top \mathbf{z} = 1^2 + i^2 = 0 \]

영이 아닌 벡터가 길이 0을 갖는다. 이것은 길이의 정의를 무너뜨린다. 원인은 \(i^2 = -1\) 로 음의 기여를 만들기 때문이다.

3.2 해법: 켤레전치

각 성분을 켤레한 뒤 전치한다.

정의: 켤레전치 (Conjugate Transpose, Hermitian)

복소 벡터 \(\mathbf{z} = (z_1, \dots, z_n)^\top\) 에 대해

\[ \mathbf{z}^H = \bar{\mathbf{z}}^\top = (\bar{z}_1, \dots, \bar{z}_n) \]

를 켤레전치(z Hermitian)라 한다. 행렬에 대해서도 동일하게 \((A^H)_{ij} = \overline{A_{ji}}\).

기호는 \(A^H\) 또는 \(A^*\). MATLAB의 A', NumPy의 A.conj().T 가 이에 해당한다.

이제 길이 제곱은

\[ \mathbf{z}^H \mathbf{z} = \sum_i \bar{z}_i z_i = \sum_i |z_i|^2 \geq 0 \]

양의 실수, 그리고 0이 되는 건 \(\mathbf{z} = \mathbf{0}\) 일 때뿐이다. 길이가 복원된다.

3.3 복소 내적

정의: 복소 내적

\(\mathbf{u}, \mathbf{v} \in \mathbb{C}^n\) 의 내적은

\[ \langle \mathbf{u}, \mathbf{v} \rangle = \mathbf{u}^H \mathbf{v} = \sum_i \bar{u}_i v_i \]

로 정의된다. 이 내적은 첫 인자에 대해 켤레선형, 둘째에 대해 선형이다 (물리학 규약).

주의: \(\mathbf{u}^H \mathbf{v} \neq \mathbf{v}^H \mathbf{u}\). 대신 \(\mathbf{v}^H \mathbf{u} = \overline{\mathbf{u}^H \mathbf{v}}\) 이다. 복소 내적은 비가환이며, 이는 복소 세계를 실 세계와 구분 짓는 본질적 성질이다.

직교성: \(\mathbf{u}^H \mathbf{v} = 0\) 이면 두 복소 벡터를 직교한다고 한다. 예로 \(\mathbf{z}_1 = (1, i)^\top, \mathbf{z}_2 = (1, -i)^\top\) 의 내적은 \(\mathbf{z}_1^H \mathbf{z}_2 = \bar{1}\cdot 1 + \bar{i}\cdot(-i) = 1 + (-i)(-i) = 1 - 1 = 0\) 이므로 직교.


4 Hermitian 행렬: 실 대칭의 복소 일반화

4.1 정의

\(A = A^H\) 인 행렬을 Hermitian 행렬이라 한다. 실 행렬이면 \(A^H = A^\top\) 이므로 “실수 대칭 = 실수 Hermitian”이고, Hermitian은 대칭의 진짜 복소 일반화다.

성분 조건: \(a_{ij} = \overline{a_{ji}}\). 따라서 대각 성분은 실수이고, 비대각 쌍은 켤레 관계다.

예시: \(A = \begin{pmatrix} 2 & 3 - 3i \\ 3 + 3i & 5 \end{pmatrix}\).

4.2 세 가지 핵심 성질

Hermitian 행렬은 실 대칭 행렬의 세 가지 황금 성질을 그대로 이어받는다.

(1) 이차형식은 항상 실수: \(\mathbf{z}^H A \mathbf{z} \in \mathbb{R}\)

증명: \(\mathbf{z}^H A \mathbf{z}\)\(1\times 1\) 스칼라이므로 \((\mathbf{z}^H A \mathbf{z})^H = \mathbf{z}^H A^H \mathbf{z} = \mathbf{z}^H A \mathbf{z}\). 자기 자신과 켤레가 같으므로 실수. \(\square\)

(2) 고유값은 모두 실수: \(A = A^H\) 이면 \(\lambda \in \mathbb{R}\)

증명: \(A\mathbf{z} = \lambda\mathbf{z}\) 양변에 \(\mathbf{z}^H\) 곱하면 \(\mathbf{z}^H A \mathbf{z} = \lambda \mathbf{z}^H\mathbf{z}\). 좌변 실수, \(\mathbf{z}^H\mathbf{z} > 0\) 실수, 따라서 \(\lambda\) 실수. \(\square\)

(3) 다른 고유값의 고유벡터는 직교

증명은 실 대칭의 경우와 동일하며, 전치 대신 켤레전치를 사용한다.

4.3 스펙트럼 정리 (복소판)

\(A = A^H\) 이면

\[ A = U \Lambda U^H \]

로 분해된다. 여기서 \(\Lambda\) 는 실 대각, \(U\) 는 고유벡터를 orthonormal 열로 갖는 unitary 행렬 (\(U^H U = I\)). 실 대칭 행렬의 \(A = Q \Lambda Q^\top\) 의 정확한 복소판이다.

직관: Hermitian이 왜 “좋은” 행렬인가

실 대칭 행렬이 선형대수의 “가장 좋은 행렬”인 이유는 (a) 고유값이 실수라 물리량으로 해석 가능, (b) 고유벡터가 직교라 좌표계를 이룸, (c) 스펙트럼 분해로 함수계산이 쉬움. Hermitian은 이 세 장점을 복소 세계에서 그대로 갖는다.

양자역학이 Hermitian 연산자(관측 가능량)로 관측량을 모델링하는 이유가 정확히 이것이다 — 측정값은 실수여야 하므로 연산자는 Hermitian이어야 하고, 서로 다른 측정값은 직교 상태에 대응한다.


5 Unitary 행렬: 직교 행렬의 복소 일반화

5.1 정의

\(U^H U = I\) 인 정방 행렬을 unitary 행렬이라 한다. 등가적으로 \(U^{-1} = U^H\).

실 세계의 직교 행렬 \(Q^\top Q = I\) 의 정확한 복소판이다. 예: 푸리에 행렬 \(F_n / \sqrt{n}\), 회전·반사, \(2 \times 2\) 양자 게이트 (Pauli, Hadamard, CNOT 등).

5.2 두 가지 핵심 성질

(1) 길이 보존: \(\|U\mathbf{z}\| = \|\mathbf{z}\|\)

증명: \(\|U\mathbf{z}\|^2 = (U\mathbf{z})^H(U\mathbf{z}) = \mathbf{z}^H U^H U \mathbf{z} = \mathbf{z}^H \mathbf{z} = \|\mathbf{z}\|^2\). \(\square\)

(2) 내적 보존: \((U\mathbf{u})^H(U\mathbf{v}) = \mathbf{u}^H \mathbf{v}\)

따라서 unitary 변환은 각도·직교성·길이를 모두 보존한다. 기하학적으로 “복소 공간에서의 회전·반사”.

5.3 고유값

Unitary 행렬의 모든 고유값은 \(|\lambda| = 1\) 이다 (단위원 위). 증명: \(U\mathbf{z} = \lambda\mathbf{z}\) 이면 \(\|\mathbf{z}\| = \|U\mathbf{z}\| = |\lambda|\|\mathbf{z}\|\). 따라서 \(|\lambda| = 1\). \(\square\)

실 직교 행렬의 고유값이 \(\pm 1\) 또는 복소 켤레쌍 \(e^{\pm i\theta}\) 인 것의 일반화다.

직관: Unitary는 “각도계를 흔들지 않는 변환”

Unitary 변환은 복소 공간의 기저를 회전·반사한다. 벡터들의 상대적 길이·각도는 그대로 유지되고, 단지 보는 좌표계만 바뀐다. 양자역학의 시간 진화 \(|\psi(t)\rangle = e^{-iHt/\hbar}|\psi(0)\rangle\) 이 unitary인 이유가 이것이다: 관측 확률의 합이 보존되려면 상태 벡터의 길이가 보존되어야 한다.


6 실수 ↔︎ 복소 대응 표

Strang §10.2 말미의 “Real versus Complex” 대응을 정리하면 복소 선형대수 전체가 한눈에 들어온다.

영역 실수 복소수
공간 \(\mathbb{R}^n\) \(\mathbb{C}^n\)
길이 제곱 \(\mathbf{x}^\top\mathbf{x} = \sum x_i^2\) \(\mathbf{z}^H\mathbf{z} = \sum \|z_i\|^2\)
전치 \((A^\top)_{ij} = A_{ji}\) \((A^H)_{ij} = \overline{A_{ji}}\)
곱의 규칙 \((AB)^\top = B^\top A^\top\) \((AB)^H = B^H A^H\)
내적 \(\mathbf{x}^\top\mathbf{y}\) \(\mathbf{u}^H\mathbf{v}\) (비가환)
수반 성질 \((A\mathbf{x})^\top\mathbf{y} = \mathbf{x}^\top(A^\top\mathbf{y})\) \((A\mathbf{u})^H\mathbf{v} = \mathbf{u}^H(A^H\mathbf{v})\)
대칭 \(A = A^\top\) Hermitian \(A = A^H\)
반대칭 \(K^\top = -K\) skew-Hermitian \(K^H = -K\)
직교 \(Q^\top = Q^{-1}\) unitary \(U^H = U^{-1}\)
스펙트럼 정리 \(A = Q\Lambda Q^\top\) \(A = U\Lambda U^H\)
보존 성질 \(\|Q\mathbf{x}\| = \|\mathbf{x}\|\) \(\|U\mathbf{z}\| = \|\mathbf{z}\|\)

좌우가 1:1 대응한다는 것이 복소 선형대수의 큰 그림이다. \(^\top\)\(^H\) 로만 바꾸면 실수 세계의 정리가 그대로 복소 세계에서 성립한다.


7 푸리에 행렬과 FFT 개요

7.1 푸리에 행렬

Strang §10.3 의 주인공은 \(n\) 차 푸리에 행렬이다. \(\omega = e^{2\pi i/n}\) (“1의 \(n\) 제곱근”) 에 대해

\[ F_n = \begin{pmatrix} 1 & 1 & 1 & \cdots & 1 \\ 1 & \omega & \omega^2 & \cdots & \omega^{n-1} \\ 1 & \omega^2 & \omega^4 & \cdots & \omega^{2(n-1)} \\ \vdots & & & & \vdots \\ 1 & \omega^{n-1} & \omega^{2(n-1)} & \cdots & \omega^{(n-1)^2} \end{pmatrix}, \qquad (F_n)_{jk} = \omega^{jk} \]

\(F_n / \sqrt{n}\)unitary 행렬이다. 즉 \(F_n^H F_n = n I\).

이 행렬은 “시간 영역 → 주파수 영역” 변환을 실현한다. 벡터 \(\mathbf{c}\)\(F_n\) 을 곱하면 \(\mathbf{c}\) 를 여러 주파수의 진동으로 분해한 계수가 나온다.

7.2 FFT가 왜 중요한가

직접 곱셈 \(F_n \mathbf{c}\)\(O(n^2)\) 연산이다. Cooley-Tukey (1965)의 Fast Fourier Transform (FFT)\(F_n\) 의 재귀적 구조를 이용해

\[ O(n \log n) \]

으로 단축한다. \(n = 10^6\) 에서 \(10^{12}\) 연산이 \(2 \times 10^7\) 연산이 된다 — 5만 배 차이.

FFT의 재귀 원리는 “짝수 인덱스와 홀수 인덱스를 분리하면 \(F_n\)\(F_{n/2}\) 둘로 쪼개진다”는 것이다. Strang §10.3 는 이 분해

\[ F_n = \begin{pmatrix} I & D \\ I & -D \end{pmatrix} \begin{pmatrix} F_{n/2} & 0 \\ 0 & F_{n/2} \end{pmatrix} \begin{pmatrix} \text{permutation} \end{pmatrix} \]

을 전개한다. \(\log_2 n\) 단계 재귀로 전체가 \(n \log n\) 에 끝난다.

직관: FFT는 “분할정복의 교과서 사례”

1024차 시스템을 한 번에 푸는 대신, 두 개의 512차 시스템으로 나누고, 각각을 두 개의 256차로… 이렇게 \(\log n\) 번 쪼개면 각 단계는 \(O(n)\) 이고 총 \(O(n \log n)\) 이 된다. 행렬의 대수 구조(\(\omega^n = 1\) 라는 단 하나의 관계)가 이 재귀를 가능하게 하며, 이 구조가 없으면 \(O(n^2)\) 로 돌아간다.

FFT가 “20세기 10대 알고리즘”에 선정된 이유는 이 단축률이 알고리즘의 존재 자체(실시간 신호처리, JPEG, MP3, 딥러닝의 컨볼루션 가속)를 결정하기 때문이다.


8 ML/DL·과학 전반의 응용

복소 선형대수는 다양한 분야에서 내재된다.

분야 핵심 도구 역할
양자역학 Hermitian 해밀토니안, unitary 시간 진화 관측량 실수성·확률 보존
신호처리 FFT, 스펙트럼 분석 주파수 분해·필터링·압축
영상처리 2D FFT, Wiener 필터 JPEG 압축·디블러링·에지 검출
딥러닝 FFT 기반 컨볼루션 큰 커널 CNN 가속 (NeurIPS’20+ 연구)
시계열 푸리에 피처, 웨이블릿 주기성 추출, 추세 분해
그래프 신호 그래프 라플라시안 스펙트럼 GSP/GNN의 스펙트럼 해석
통신 OFDM (직교 주파수 분할) 5G, Wi-Fi의 물리 계층
수치 PDE 스펙트럼 방법 고정밀 PDE 해법 (Chebyshev, Fourier)
제어공학 복소 전달함수, 극/영점 Nyquist 안정성 판별

8.1 딥러닝 특화 응용

  • FFT 컨볼루션: 큰 커널 (예: \(5\times 5\) 이상, \(k > 11\)) 에서는 공간 도메인 convolution이 Hadamard 곱 + FFT 쌍으로 대체될 때 더 빠르다. PyTorch의 torch.nn.functional.conv2d 는 커널 크기에 따라 자동 선택한다.
  • Neural Operator (FNO): PDE 해를 학습할 때 \(F\)\(F^{-1}\) 사이에 학습 가능한 대각 행렬을 두어 주파수 도메인에서 선형 변환을 학습한다. 메시·격자 독립성과 \(O(n\log n)\) 복잡도가 매력.
  • Signal embedding: 시계열을 푸리에 계수로 변환해 Transformer 입력으로 사용 (Informer, Autoformer).
  • Spectral GNN: 그래프 라플라시안의 Hermitian 스펙트럼으로 그래프 컨볼루션을 정의 (Bruna et al., Defferrard et al., ChebConv).

9 코드 예시

9.1 Step 1: 복소 기본 연산과 Hermitian 성질

코드
import numpy as np

# 복소수 기본
z = 3 + 2j
print(f"z        = {z}")
print(f"|z|      = {abs(z)}  (sqrt(13))")
print(f"conj(z)  = {z.conjugate()}")
print(f"z * z̄    = {z * z.conjugate()}  (실수 = |z|^2)")

# Euler 공식 검증: e^(i*pi) + 1 = 0
print(f"e^(iπ) + 1 = {np.exp(1j*np.pi) + 1:.3e}")

# Hermitian 행렬 구성과 고유값 (실수)
A = np.array([[2, 3-3j], [3+3j, 5]], dtype=complex)
print(f"A^H == A ? {np.allclose(A.conj().T, A)}")
eigs = np.linalg.eigvalsh(A)   # eigvalsh: Hermitian 전용
print(f"고유값 = {eigs}  (모두 실수)")

9.2 Step 2: Unitary 행렬과 길이 보존

코드
import numpy as np

# 무작위 Unitary 행렬 생성 (QR로 직교화)
n = 4
A = np.random.randn(n, n) + 1j*np.random.randn(n, n)
Q, _ = np.linalg.qr(A)
U = Q   # Q는 unitary (np.linalg.qr는 복소도 처리)

print(f"U^H U = I ? {np.allclose(U.conj().T @ U, np.eye(n))}")

# 길이 보존 확인
z = np.random.randn(n) + 1j*np.random.randn(n)
print(f"||z||    = {np.linalg.norm(z):.4f}")
print(f"||U z||  = {np.linalg.norm(U @ z):.4f}  (같음)")

# 모든 고유값의 절댓값은 1
print(f"|λ(U)| = {np.abs(np.linalg.eigvals(U))}")

9.3 Step 3: 푸리에 행렬과 FFT

코드
import numpy as np

n = 8
omega = np.exp(2j*np.pi/n)

# 푸리에 행렬 직접 구성
F = np.array([[omega**(j*k) for k in range(n)] for j in range(n)])

# Unitary 성질 (정규화 후)
print(f"F^H F / n = I ? {np.allclose(F.conj().T @ F / n, np.eye(n))}")

# FFT vs 직접 곱셈 비교
c = np.random.randn(n)
Fc_direct = F @ c               # O(n^2)
Fc_fft    = np.fft.fft(c)       # O(n log n)

print(f"두 결과 일치: {np.allclose(Fc_direct, Fc_fft)}")

9.4 Step 4: FFT 성능 감각

코드
import numpy as np
import time

for n in [2**10, 2**14, 2**18, 2**22]:
    c = np.random.randn(n)

    t0 = time.time()
    Fc = np.fft.fft(c)
    t_fft = time.time() - t0

    # 직접 곱셈은 n=4096부터 매우 느려 건너뜀
    if n <= 4096:
        F = np.exp(2j*np.pi*np.outer(np.arange(n), np.arange(n))/n)
        t0 = time.time()
        _ = F @ c
        t_mat = time.time() - t0
        print(f"n={n:>8d}  FFT: {t_fft*1000:7.2f} ms   MatMul: {t_mat*1000:7.2f} ms   가속: {t_mat/t_fft:.0f}x")
    else:
        print(f"n={n:>8d}  FFT: {t_fft*1000:7.2f} ms   MatMul: (생략, O(n^2) 불가)")

이 코드의 핵심: \(n\) 이 두 배 증가할 때 FFT는 약 2배 시간이 늘지만, 직접 곱셈은 4배 늘어난다. 이 차이가 FFT의 실용적 가치다.


10 학습 로드맵

이 포스트는 Ch.10 의 지도다. 각 섹션은 향후 별도 포스트로 심화한다.

Strang Ch.10 시리즈 — 교재 기반 핵심 3주제

교재 외 심화 주제 (복소 확장)

  • 양자 게이트와 텐서곱 (placeholder)
  • Schur 분해와 정규(normal) 행렬 (placeholder)
  • 신호처리의 DFT·DCT·웨이블릿 (placeholder)
  • Spectral GNN 과 그래프 라플라시안 (placeholder)
  • Fourier Neural Operator (placeholder, 교재 외)

11 관련 주제

선행 지식

후속 주제

  • §10.1, §10.2, §10.3 상세 포스트 (위 로드맵 참조, placeholder)

다른 카테고리 연결

참고 교재

  • Strang (2009) Introduction to Linear Algebra Ch.10 — 본 포스트의 논리 뼈대
  • Trefethen & Bau (1997) Numerical Linear Algebra Lect.1–4 — 복소 내적·수반·unitary
  • Oppenheim & Schafer Discrete-Time Signal Processing — DFT·FFT의 공학적 맥락
  • Nielsen & Chuang Quantum Computation and Quantum Information Ch.2 — Hermitian·unitary의 양자역학 의미

Subscribe

Enjoy this blog? Get notified of new posts by email: