クヌースの矢印表記法:プログラミングでべき乗を^で表す理由
定義
クヌースの上向き矢印記法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$は次のように定義される。
▶eq5◁
一般的な定義
$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年、MATLABがリリースされる。べき乗演算子は
^
を使用した。1991年、Pythonが発表される。べき乗演算子は
**
を使用した。1992年、R言語が発表される。べき乗演算子は
^
を使用した。1995年、Ruby が発表される。べき乗演算子は
**
を使用した。1995年、Javaが発表される。
Math
ライブラリのpow
メソッドを使用する。2009年、Go言語が発表される。
math
ライブラリのpow
関数を使用する。2012年、Juliaが発表される。べき乗演算子は
^
を使用した。
プログラミングでのべき乗演算子の歴史はクヌースの前後に分かれ、一般的な開発に関連する言語はフォートランのように**
を使ったり、C言語のように別途の標準ライブラリから関数を提供し、科学技術計算や統計分析に関連する言語は^
を選択した。例外的にPythonの場合は科学分野でも地位が大きいが、根本的には一般的な開発目的の言語である。
Donald E. Knuth ,Mathematics and Computer Science: Coping with Finiteness.Science194,1235-1242(1976).DOI: https://doi.org/10.1126/science.194.4271.1235 ↩︎