0. 시작하며

본 포스트는 선형대수학(Linear Algebra)의 기초 이론을 고찰하고, 시스템 프로그래밍 언어인 Rust를 활용해 직접 라이브러리로 구현하는 과정을 기록한 리포트이다.

단순한 라이브러리 제작을 넘어, 추상적인 수학적 개념이 실제 컴퓨터 아키텍처 위에서 어떻게 수치적으로 구현되고 최적화되는지를 탐구하는 데 목적이 있다.

본 글의 목적 및 대상 독자:

본 과제는 단순한 라이브러리 제작을 넘어, 추상적으로만 존재하던 수학적 개념이 실제 컴퓨터 아키텍처 위에서 어떻게 수치적으로 구현되고 최적화되는지를 탐구하는 데 목적이 있다. 따라서 이미 선형대수학의 기초를 이해하고 있어야 하며, 이를 복습하고자 하는 학습자, 수학적 모델을 코드로 변환하는 과정에 흥미가 있는 개발자들을 주요 독자로 상정한다.

독자가 얻을 수 있는 가치

  1. 이론의 실체화: 추상적인 벡터 공간의 공리가 실제 코드(Matrix Library)로 변환되는 메커니즘 이해.
  2. 다학제적 연결: 선형대수학이 물리학, 데이터 과학, 컴퓨터 그래픽스 등 실무 분야와 맞물리는 접점에 대한 통찰.
  3. 수치 해석적 기초: 부동 소수점 오차 제어(FMA) 및 시간·공간 복잡도 분석을 통한 고성능 연산 엔진의 핵심 고려 사항 파악.

1. Introduction

선형대수학은 벡터(vector) 라 불리는 객체들로 이루어진 벡터 공간(vector space) 을 체계적으로 연구하는 학문이다. 벡터 간의 변환을 의미하는 선형 사상(linear maps) 은 유한 차원에서 행렬(matrices) 이라는 도구를 통해 구체적으로 표현된다.

본 학문은 단순한 수치 계산을 넘어 다항식, 무한 차원 함수 공간 등 복잡한 대상을 통합된 논리 체계 안에서 다룬다. 아무리 복잡한 사례(complicated case)일지라도 그 본질은 기초적인 사례(simple case)와 궤를 같이한다. 따라서 본 과제는 시각화가 용이한 2D/3D 모델을 근본으로 삼아 고차원의 문제를 통찰하는 능력을 배양하는 데 집중한다.

선형대수학의 응용 분야

  • 물리학: 거시적 운동을 다루는 Newtonian mechanics(고전역학)은 본질적으로 벡터 연산의 집합이다. 이를 넘어 전자기학, 상대성 이론, 양자 역학에 이르기까지 심화 물리 분야는 선형대수학적 토대 위에 세워져 있다. 특히 양자 역학은 복소수 기반의 선형대수학적 상태 벡터와 연산자 이론의 정수이며, 일반 상대성 이론은 미분기하학과 텐서 대수학을 통해 시공간의 곡률을 정교하게 서술한다.
  • 그래픽스 및 게임: 현대의 비디오 게임은 정밀한 물리 시뮬레이션의 결과물이다. 캐릭터의 도약은 ‘충격량 벡터’와 ‘중력 벡터’의 선형 결합으로 계산되며, 영화적 연출을 위한 레이트레이싱(Raytracing) 기법은 광선이라는 벡터가 사물에 반사되는 궤적을 추적한다. 우리가 일상적으로 사용하는 ‘2D’와 ‘3D’라는 개념 자체가 선형대수학의 차원(Dimension) 이론에 뿌리를 두고 있다.
  • 컴퓨터 성능: 현대 컴퓨팅의 중추인 GPU(Graphics Processing Unit)는 수많은 독립적 선형대수 연산을 병렬로 처리하기 위해 설계된 장치이다. 이에 따라 고성능 컴퓨팅(HPC)과 수치 해석 분야는 대규모 행렬 연산의 효율성에 절대적으로 의존하고 있다.
  • 데이터 과학: 방대한 수치의 데이터는 고차원 벡터 공간상의 점들로 구성된 ‘데이터 포인트 클라우드’로 취급된다. 통계학의 핵심 지표인 공분산과 분산은 각각 내적과 노름의 개념으로 치환되며, 변수 간의 상관관계는 벡터 사이의 코사인 각도로 해석될 수 있다. 이는 선형대수학이 데이터 속에 숨겨진 기하학적 구조를 파악하는 결정적인 틀을 제공함을 시사한다.

선형대수학 학습의 의의와 접근성

선형대수학은 암호학부터 생태학적 모델링에 이르기까지 그 응용 범위가 광범위하다. 이 학문의 두드러진 특징은 다루는 주제의 심오함에 비해, 기초적인 산술 능력 외에 고도의 선수 지식을 크게 요구하지 않는다는 점이다. 이러한 높은 접근성과 더불어 수학 및 과학의 제반 분야로 나아가는 관문 역할을 하기에, 전 세계적으로 고등 수학 및 공학 교육의 표준적인 입문 과정으로 채택되어 있다.


2. 기초 이론 (Fundamental Theory)

선형대수학은 추상대수학의 핵심 구조인 체(Field)군(Group) 의 원리 위에 구축된 정교한 이론 체계이다.

벡터 공간의 공리 (Axioms of Vector Space)

현대 대수학적 관점에서 벡터 공간 $V$는 체 $F$(주로 실수체 $\mathbb{R}$ 또는 복소수체 $\mathbb{C}$) 상에서 정의되며, 다음의 공리들을 충족해야 한다.

  1. 아벨 군(Abelian Group): $V$는 벡터 합 연산에 대해 닫혀 있어야 하며, 결합 법칙, 교환 법칙, 항등원($\mathbf{0}$) 및 역원의 존재성을 만족해야 한다.
  2. 스칼라 곱의 일관성 (Scalar Multiplication): 체 $F$의 스칼라와 벡터 간의 곱은 분배 법칙과 결합 법칙을 만족해야 한다. 특히 체의 곱셈 항등원 $1$에 대하여 $1\mathbf{v} = \mathbf{v}$가 성립함으로써 구조적 정체성을 유지해야 한다.

특수 정사각 행렬 (Special Square Matrices)

행렬의 내부 구조는 해당 행렬이 나타내는 선형 변환의 기하학적 성질을 결정한다.

  • 대각 행렬 (Diagonal Matrix): 주대각 성분을 제외한 모든 원소가 $0$인 행렬로, 각 기저 축의 방향으로 독립적인 스케일링(Scaling) 변환을 수행한다.
  • 직교 행렬 (Orthogonal Matrix): $Q^T Q = I$를 만족하는 행렬로, 변환 과정에서 벡터의 노름(Norm)과 벡터 간의 각도를 보존한다. 이는 주로 회전(Rotation) 이나 반사(Reflection) 와 같은 등거리 변환(Isometry)을 표현한다.

선형 사상의 공리 (Axioms of Linear Maps)

두 벡터 공간 $V$와 $W$ 사이의 함수 $f: V \to W$가 선형성을 유지하기 위해서는 다음의 두 가지 본질적인 조건을 만족해야 한다.

  • 가법성 (Additivity): $f(\mathbf{u} + \mathbf{v}) = f(\mathbf{u}) + f(\mathbf{v})$ — 변환 후의 합은 변환 전 합의 결과와 같다.
  • 일차 동차성 (Homogeneity): $f(c\mathbf{u}) = cf(\mathbf{u})$ — 스칼라 배 연산과 변환의 순서는 결과에 영향을 주지 않는다.

이 두 성질은 중첩의 원리(Superposition principle) 를 가능케 하며, 복잡한 시스템을 단순한 부분들의 합으로 분석할 수 있는 근거가 된다.

커리큘럼의 구분

일반적으로 선형대수학은 다음 두 가지 관점으로 나뉜다.

  • 선형대수학개론 (선대개): 유클리드 공간 구조를 사용하여 Gauss-Jordan elimination, 행렬 분해 등 계산 기틀을 확립하는 공학적 접근.
  • 선형대수학: 임의의 “체” 위의 “벡터공간”의 이론을 다루는 추상적인 과목. 선대개의 경험과 거기서 연습한 계산 기본기를 전제로 하며, “계산할 수 있는 건 다 선대” 라고 생각하는 게 정신건강에 이롭다.

3. 구현 가이드 및 연산 최적화

GPU와 병렬 연산의 효율성

행렬 연산의 본질은 수많은 독립적인 산술 계산의 집합이므로, 병렬 처리 구조에 매우 최적화되어 있다. 현대의 GPU는 수천 개의 코어를 활용하여 대규모 행렬 곱셈을 동시에 수행함으로써, CPU 대비 압도적인 가속 성능을 제공한다. 본 과제의 구현 역시 이러한 병렬 확장성을 고려한 구조적 이해를 바탕으로 한다.

Fused Multiply-Add (FMA)와 수치 안정성

수치 해석적 관점에서 $a \times b + c$ 형태의 연산은 선형대수의 핵심인 내적(Dot product)과 행렬 곱셈등에서 가장 빈번하게 발생한다.일반적인 연산은 두 번의 반올림 오차가 발생하지만, Rust의 mul_add()를 이용한 FMA는 곱셈과 덧셈을 하나의 명령어로 처리하여 중간 결과의 반올림 오차(Rounding error)를 단 한 번으로 제한한다. 해당 함수는 하드웨어 수준의 FMA를 호출함으로써, 부동 소수점 연산의 정밀도를 향상시키고 계산 속도를 최적화하는 데 기여한다.

CS적 관점에서의 원리와 정밀도 향상

일반적인 부동 소수점 연산은 $a \times b$를 계산한 후 그 결과를 표준(IEEE 754)에 맞게 반올림(Rounding)하여 임시 저장하고, 다시 그 값에 $c$를 더하며 두 번째 반올림을 수행한다. 이 과정에서 누적된 반올림 오차(Accumulated rounding error)가 발생하며, 하위 비트의 정보가 소실될 수 있다.

반면, FMA는 하드웨어 레벨(ALU)에서 $a \times b$의 결과값을 무한한 정밀도(Infinite precision)를 가진 중간 상태로 유지한 채 $c$를 더한다. 즉, 전체 연산 과정에서 단 한 번의 반올림만 수행되므로 다음과 같은 이점을 얻는다.

  • 정밀도 유지: 두 번의 반올림이 발생할 때 생기는 잠재적 오차를 제거하여, 이론적 최댓값에 근접한 정확도를 보장한다.
  • 수치적 안정성: $a \times b$와 $c$의 부호가 달라 서로 상쇄되는 과정에서 발생할 수 있는 치명적 자리수 손실(Catastrophic cancellation) 현상을 완화한다.
  • 연산 성능 가속: 두 개의 명령어를 하나의 클럭 사이클에서 처리할 수 있는 하드웨어 파이프라인을 최적으로 활용하여 연산 처리량(Throughput)을 극대화한다.

특히 Rust 프로그래밍 언어에서는 대상 아키텍처가 FMA를 지원할 경우(현대적인 x86_64의 FMA3/FMA4 및 ARM64의 NEON 등), mul_add() 호출을 통해 이러한 하드웨어 가속을 직접 수행함으로써 고성능 수치 연산 라이브러리로서의 신뢰성을 확보하였다.

알고리즘 복잡도 분석 (Complexity Analysis)

본 라이브러리의 성능적 효율성을 객관적으로 평가하기 위해 빅오 표기법(Big-O notation)을 기반으로 시간 및 공간 복잡도를 분석한다.

변수 $n$의 정의

복잡도 분석에 사용되는 변수 $n$은 벡터 또는 행렬의 차원(Dimension), 즉 데이터에 포함된 전체 좌표(Coordinate)의 개수를 의미한다.

  • 벡터 $v \in \mathbb{R}^n$의 경우, $n$은 원소의 개수이다.
  • $m \times p$ 행렬의 경우, 복잡도 한계치에서의 $n$은 전체 원소의 수인 $m \times p$를 기준으로 산정한다.

CS 관점의 복잡도 계산 원리

알고리즘의 효율성은 입력 데이터의 크기가 무한히 커질 때(Asymptotic analysis) 자원이 어떻게 소모되는지를 기준으로 판단한다.

  1. 시간 복잡도 (Time Complexity): 알고리즘이 수행하는 기본 연산(Basic Operation)의 횟수를 측정한다.
    • 계산 방법: 코드 내의 반복문(Loop) 중첩 횟수가 결정적인 역할을 한다. 단일 반복문은 $O(n)$, 중첩된 $k$개의 반복문은 $O(n^k)$의 비용을 발생시킨다.
    • 구현 사례: 벡터의 가법 및 스칼라 배는 모든 원소를 한 번씩 순회하므로 $O(n)$을 가진다. 행렬 곱셈이나 가우스 소거법(RREF)은 행과 열에 대한 다중 반복문 구조를 가지므로 $O(n^3)$의 복잡도를 상회하지 않도록 설계하여 연산 효율을 보장한다.
  2. 공간 복잡도 (Space Complexity): 알고리즘 실행 도중 할당되는 메모리(Memory)의 양을 측정한다.
    • 계산 방법: 알고리즘이 입력을 처리하기 위해 추가로 생성하는 변수, 배열, 동적 할당 메모리의 크기를 분석한다.
    • 구현 사례: 연산 결과물을 저장하기 위해 새로운 행렬을 생성할 경우 입력 크기에 비례하는 $O(n^2)$의 추가 공간이 소요된다. 본 라이브러리는 불필요한 복사를 지양하고, 가능한 경우 메모리 할당을 최소화하는 인플레이스(In-place) 연산 방식을 고려하여 공간 효율성을 극대화하였다.

핵심 인터페이스 및 기능 요구사항

강건한 행렬 라이브러리 구축을 위해 다음과 같은 필수 기능을 구현한다.

  • Shape: data.len() 및 내부 구조를 참조하여 행렬의 차원(Dimension) 정보를 정확히 반환한다.
  • Square Check: 정사각 행렬 여부를 판별하여, 행렬식(Determinant)이나 역행렬 연산의 가용성을 사전에 검증한다.
  • Display: fmt::Display 트레이트를 구현하여, 부동 소수점 정밀도를 제어하고 행렬 구조를 시각적으로 명확하게 출력한다.
  • Reshape: 원소의 논리적 순서를 보존하면서 행렬의 형상(Shape)을 재구성하여 데이터 표현의 유연성을 확보한다.