# 컴퓨터에서의 허수 (Imaginary Numbers in Computing)

컴퓨터에서 허수는 복소수의 일부분으로 처리되며, 수치 해석, 신호 처리 등 다양한 분야에서 필수적인 역할을 한다. 컴퓨터는 유한한 정밀도를 가지며, 따라서 허수를 포함한 복소수를 표현하고 계산하는 데 있어서 여러 가지 제약과 고려 사항이 존재한다. 이 글에서는 컴퓨터에서 허수를 다루는 방법, 데이터 표현, 연산 및 수치적 안정성 등을 중심으로 설명한다.

#### 컴퓨터에서의 복소수 표현

컴퓨터에서 복소수를 표현하기 위해서는 실수부와 허수부를 각각 실수로 저장해야 한다. 보통 `float` 또는 `double`과 같은 부동소수점(floating-point) 형식을 사용하여 복소수의 실수부와 허수부를 각각 저장한다. 복소수 $ z = a + bi $는 컴퓨터 메모리 내에서 두 개의 실수 값 $ (a, b) $로 표현된다. 많은 프로그래밍 언어에서 복소수 타입이 기본 제공되며, 이를 통해 복소수 연산이 가능하다.

예를 들어, C 언어에서는 `complex.h` 헤더 파일을 통해 복소수를 지원하며, `double complex` 형식을 사용하여 복소수를 표현한다. Python에서는 `complex` 타입이 내장되어 있으며, `(3 + 4j)`와 같이 복소수를 직접적으로 표현할 수 있다.

#### 복소수 연산의 구현

컴퓨터에서 허수를 포함한 복소수 연산은 기본적으로 실수부와 허수부를 독립적으로 처리하는 방식으로 구현된다. 다음은 주요 복소수 연산의 구현 방식을 설명한다.

* **덧셈과 뺄셈**: 두 복소수 $ z\_1 = a + bi $와 $ z\_2 = c + di $의 덧셈은 실수부와 허수부를 각각 더함으로써 수행된다.

$$
z\_1 + z\_2 = (a + c) + (b + d)i
$$

뺄셈도 마찬가지로 실수부와 허수부를 각각 뺄셈한다.

* **곱셈**: 복소수의 곱셈은 다음과 같이 계산된다.

$$
z\_1 \times z\_2 = (ac - bd) + (ad + bc)i
$$

이때 실수부와 허수부의 곱셈 및 덧셈이 필요하며, 특히 $ i^2 = -1 $이 되는 특성을 이용하여 계산한다.

* **나눗셈**: 복소수 나눗셈은 분모에 해당하는 복소수의 크기로 정규화(normalization)하여 실수부와 허수부를 계산한다.

$$
\frac{z\_1}{z\_2} = \frac{(ac + bd) + (bc - ad)i}{c^2 + d^2}
$$

나눗셈 연산은 여러 차례의 곱셈과 덧셈이 필요하므로 상대적으로 비용이 많이 든다.

#### 부동소수점 연산의 한계와 수치적 안정성

허수를 포함한 복소수 연산에서도 부동소수점 연산의 한계와 관련된 문제들이 발생할 수 있다. 이는 특히 연산의 수치적 안정성(numerical stability)과 관련이 있다.

* **정밀도 손실**: 부동소수점 표현의 유한성으로 인해, 실수부와 허수부에서 정밀도 손실(precision loss)이 발생할 수 있다. 예를 들어, 매우 작은 값의 덧셈이나 뺄셈이 큰 값에 비해 상대적으로 정밀도 손실을 일으킬 수 있다.
* **언더플로우와 오버플로우**: 허수부가 매우 큰 경우나 작은 경우, 오버플로우 또는 언더플로우가 발생할 수 있다. 이는 특히 복소수의 크기(magnitude)를 계산할 때 문제가 될 수 있다.
* **조건수**: 복소수 행렬의 조건수(condition number)는 연산의 수치적 안정성을 평가하는 데 중요한 지표다. 조건수가 매우 크면 작은 입력 값의 변화가 출력에 큰 영향을 미칠 수 있다.

#### 복소수 연산 라이브러리와 컴퓨터 알고리즘

컴퓨터에서 허수를 다루는 다양한 라이브러리와 알고리즘이 존재한다. 이들은 수치 해석, 신호 처리, 푸리에 변환(Fourier transform) 등에서 필수적이다.

* **BLAS (Basic Linear Algebra Subprograms)**: 고성능 선형대수 연산을 위한 라이브러리로, 복소수 벡터와 행렬 연산을 포함한다. 예를 들어, `zaxpy`는 복소수 벡터의 선형 결합을 계산하는 함수다.
* **FFTW (Fastest Fourier Transform in the West)**: 빠른 푸리에 변환을 위한 라이브러리로, 복소수 데이터를 입력으로 받아서 복소수 결과를 출력한다. FFT 알고리즘은 주로 복소수의 곱셈과 덧셈으로 이루어진다.
* **LAPACK (Linear Algebra PACKage)**: 복소수 행렬의 고유값 계산, LU 분해 등 복잡한 선형대수 연산을 수행하는 라이브러리로, 과학 계산 및 공학에서 널리 사용된다.

***

관련 자료:

* Golub, Gene H., and Charles F. Van Loan. *Matrix Computations*. Johns Hopkins University Press, 2013.
* Trefethen, Lloyd N., and David Bau. *Numerical Linear Algebra*. SIAM, 1997.
* Press, William H., et al. *Numerical Recipes: The Art of Scientific Computing*. Cambridge University Press, 2007.
* Stewart, Gilbert W. *Matrix Algorithms, Volume 1: Basic Decompositions*. SIAM, 1998.
