logo

커누스 윗화살표 표기: 프로그래밍에서 거듭제곱을 ^로 표현하는 이유 📂프로그래밍

커누스 윗화살표 표기: 프로그래밍에서 거듭제곱을 ^로 표현하는 이유

정의

커누스의 윗화살표 표기Knuth’s up-arrow notation란 큰 정수를 나타내기 위해 고안한 표기법이다.

덧셈과 곱셈, 거듭제곱

덧셈addition $x + n$ 은 다음과 같이 정의된다. $$ x + n = x + \underbrace{1 + \cdots + 1}_{n \text{ times}} $$

곱셈multiplication $xn$ 은 다음과 같이 정의된다. $$ xn = \underbrace{x + \cdots + x}_{n \text{ times}} $$

거듭제곱exponentiation $x^{n}$ 은 다음과 같이 정의된다. $$ \begin{align*} x^{n} =& x \uparrow n \\ =& \underbrace{x \cdots x}_{n \text{ times}} \end{align*} $$

테트레이션과 펜테이션

테트레이션tetration $x \uparrow^{2} n$ 은 다음과 같이 정의된다. $$ \begin{align*} x \uparrow^{2} n =& x \uparrow \uparrow n \\ =& \underbrace{x \uparrow \cdots \uparrow x}_{n \text{ times}} \end{align*} $$

펜테이션pentation $x \uparrow^{3} n$ 은 다음과 같이 정의된다. $$ \begin{align*} x \uparrow^{3} n =& x \uparrow \uparrow \uparrow n \\ =& \underbrace{x \uparrow \uparrow \cdots \uparrow \uparrow x}_{n \text{ times}} \end{align*} $$

일반적인 정의

$x \uparrow^{k} n$ 은 다음과 같이 정의된다1. $$ \begin{align*} x \uparrow^{k} n =& x \overbrace{\uparrow \cdots \uparrow}^{k \text{ arrows}} n \\ =& \underbrace{x \overbrace{\uparrow \cdots \uparrow}^{(k-1) \text{ arrows}} \cdots \overbrace{\uparrow \cdots \uparrow}^{(k-1) \text{ arrows}} x}_{n \text{ times}} \end{align*} $$

설명

그 이름도 유명한 도널드 커누스Donald E. Knuth는 수학자면서 컴퓨터 과학자로써, 특히 인류의 수식 표현에 있어서 절대적이고 유일한 업적으로 남을, $\TeX$ 을 개발하기도 했다. 그는 또한 1976년 그의 논문에서 윗화살표 표기를 제안했는데, 정의 자체만 보아서는 너무나 큰 수를 다뤄서 이해하기 어려운 점이 있을 것이다. 그러나 그 중 $k = 1$ 일 때, 즉 $\uparrow = \uparrow^{1}$ 는 충분히 보통 인간들의 인식으로 따라갈 수도 있고 특히 윗 화살표 $\uparrow$ 를 직접 입력하기 곤란한 키보드 조판과 관련해서는 $x^{n} = x \uparrow n$ 가 캐럿caret 기호 ^를 사용한 x^n과 딱 맞아 떨어지면서 이러한 스타일이 널리 퍼지게 되었다.

몇가지 프로그래밍 언어들과 그 타임테이블을 보면 대단히 흥미롭다:

  • 1957년, 포트란Fortran이 발표된다. 포트란에서 거듭제곱은 **을 사용했다.
  • 1972년, C 언어가 발표된다. C 언어에서 거듭제곱은 아예 연산자도 없고 math.h 라이브러리의 pow 함수로 따로 정의되었다.
  • 1976년, 커누스가 논문을 통해 윗화살표 표기를 발표한다.
  • 1978년, 커누스가 $\TeX$ 을 개발한다. 물론 $\TeX$ 에서의 거듭제곱은 ^을 사용했다.
  • 1984년, 매트랩이 출시된다. 거듭제곱 연산자는 ^을 사용했다.
  • 1991년, 파이썬이 발표된다. 거듭제곱 연산자는 **을 사용했다.
  • 1992년, R 언어가 발표된다. 거듭제곱 연산자는 ^을 사용했다.
  • 1995년, 루비Ruby가 발표된다. 거듭제곱 연산자는 **을 사용했다.
  • 1995년, 자바Java가 발표된다. Math 라이브러리의 pow 메서드를 사용한다.
  • 2009년, Go 언어가 발표된다. math 라이브러리의 pow 함수를 사용한다.
  • 2012년, 줄리아가 발표된다. 거듭제곱 연산자는 ^을 사용했다.

프로그래밍에서 거듭제곱 연산자의 역사는 커누스 이전과 이후로 나뉘며 일반 개발과 관련된 언어들은 포트란과 같이 **를 쓰거나 C 언어와 같이 별도의 기본 라이브러리에서 함수를 제공하고, 과학계산 혹은 통계분석에 관련된 언어들은 ^를 선택했다. 예외적으로 파이썬의 경우엔 과학계에서도 입지가 크지만, 근본적으로는 일반 개발 목적의 언어다.


  1. Donald E. Knuth ,Mathematics and Computer Science: Coping with Finiteness.Science194,1235-1242(1976).DOI: https://doi.org/10.1126/science.194.4271.1235 ↩︎