急速に成長する機能
計算可能性理論
において 、 ヴィルヘルム・アッカーマン にちなんで名付けられた アッカーマン関数は、 原始再帰的 ではない 全 計算可能関数の最も単純で 最も早く発見された例 の1つです 。すべての原始再帰関数は全計算可能で計算可能ですが、アッカーマン関数は、すべての全計算可能関数が原始再帰的であるとは限らないことを示しています。
アッカーマンが 彼の関数(3つの非負の整数引数を持つ) ロザ・ペーテル と ラファエル・ロビンソン によって開発された2つの引数を持つ アッカーマン・ペーテル関数 です。その値は非常に急速に増加します。たとえば、は 19,729桁の整数 になります。 [3]
あ
(
4
、
2
)
{\displaystyle \operatorname {A} (4,2)}
2
65536
−
3
{\displaystyle 2^{65536}-3}
歴史
1920 年代後半、数学者 ガブリエル・スーダン と ヴィルヘルム・アッカーマンは 、 デイヴィッド・ヒルベルト の弟子で、計算の基礎を研究していました。スーダンとアッカーマンはともに、 原始再帰的 ではない 全 計算可能関数 (いくつかの文献では単に「再帰的」と称される)を発見したとされています 4] 。スーダンは、あまり知られていない スーダン関数 を発表し、その後まもなく独立して、1928 年にアッカーマンが自身の関数 (ギリシャ語の文字 phi に由来) を発表しました。アッカーマンの 3 引数関数 は、 に対して、 加算 、 乗算 、 累乗 の基本演算を 次のように
再現する ように定義されます。
φ
{\displaystyle \varphi}
φ
(
メートル
、
ん
、
p
)
{\displaystyle \varphi (m,n,p)}
p
=
0
、
1
、
2
{\displaystyle p=0,1,2}
φ
(
メートル
、
ん
、
0
)
=
メートル
+
ん
φ
(
メートル
、
ん
、
1
)
=
メートル
×
ん
φ
(
メートル
、
ん
、
2
)
=
メートル
ん
{\displaystyle {\begin{aligned}\varphi (m,n,0)&=m+n\\\varphi (m,n,1)&=m\times n\\\varphi (m,n,2)&=m^{n}\end{aligned}}}
p > 2の場合、これらの基本演算は ハイパー演算 と比較できる方法で拡張されます 。
φ
(
メートル
、
ん
、
3
)
=
メートル
[
4
]
(
ん
+
1
)
φ
(
メートル
、
ん
、
p
)
⪆
メートル
[
p
+
1
]
(
ん
+
1
)
のために
p
>
3
{\displaystyle {\begin{aligned}\varphi (m,n,3)&=m[4](n+1)\\\varphi (m,n,p)&\gtrapprox m[p+1](n+1)&&{\text{for }}p>3\end{aligned}}}
(完全に計算可能だが原始再帰的ではない関数としての歴史的な役割とは別に、アッカーマンの元の関数は、基本的な算術演算を累乗を超えて拡張すると考えられていますが、 グッドスタインの ハイパー演算 シーケンスなど、その目的のために特別に設計されたアッカーマン関数のバリアントほどシームレスではありません。)
デイヴィト・ヒルベルトは『無限について 』 で アッカーマン関数は原始再帰的ではないという仮説を立てたが、実際にその仮説を証明したのはヒルベルトの個人秘書で元教え子のアッカーマンであり、彼の論文『 ヒルベルトの実数の構成について』 でその仮説を証明した。
その後、ロザ・ペーテル とラファエル・ロビンソン ほぼすべての著者に好まれるようになったアッカーマン関数の2変数バージョンを開発しました。
一般化された ハイパーオペレーションシーケンス (例えば )もアッカーマン関数の一種である。
グ
(
メートル
、
1つの
、
b
)
=
1つの
[
メートル
]
b
{\displaystyle G(m,a,b)=a[m]b}
1963年に RCバックは、 ハイパーオペレーションシーケンス に 基づいた直感的な2変数 [n 1]の 変種を考案した 。
ふ
{\displaystyle \operatorname {F} }
ふ
(
メートル
、
ん
)
=
2
[
メートル
]
ん
。
{\displaystyle \operatorname {F} (m,n)=2[m]n.}
他のほとんどのバージョンと比較して、Buck 関数には不要なオフセットがありません。
F
(
0
,
n
)
=
2
[
0
]
n
=
n
+
1
F
(
1
,
n
)
=
2
[
1
]
n
=
2
+
n
F
(
2
,
n
)
=
2
[
2
]
n
=
2
×
n
F
(
3
,
n
)
=
2
[
3
]
n
=
2
n
F
(
4
,
n
)
=
2
[
4
]
n
=
2
2
2
.
.
.
2
⋮
{\displaystyle {\begin{aligned}\operatorname {F} (0,n)&=2[0]n=n+1\\\operatorname {F} (1,n)&=2[1]n=2+n\\\operatorname {F} (2,n)&=2[2]n=2\times n\\\operatorname {F} (3,n)&=2[3]n=2^{n}\\\operatorname {F} (4,n)&=2[4]n=2^{2^{2^{{}^{.^{.^{{}_{.}2}}}}}}\\&\quad \vdots \end{aligned}}}
アッカーマン関数の他の多くのバージョンが研究されてきた。
意味
定義: m-ary関数として
アッカーマンのオリジナルの3引数関数は、 非負整数 とに対して次のように 再帰的に 定義されます 。
φ
(
m
,
n
,
p
)
{\displaystyle \varphi (m,n,p)}
m
,
n
,
{\displaystyle m,n,}
p
{\displaystyle p}
φ
(
m
,
n
,
0
)
=
m
+
n
φ
(
m
,
0
,
1
)
=
0
φ
(
m
,
0
,
2
)
=
1
φ
(
m
,
0
,
p
)
=
m
for
p
>
2
φ
(
m
,
n
,
p
)
=
φ
(
m
,
φ
(
m
,
n
−
1
,
p
)
,
p
−
1
)
for
n
,
p
>
0
{\displaystyle {\begin{aligned}\varphi (m,n,0)&=m+n\\\varphi (m,0,1)&=0\\\varphi (m,0,2)&=1\\\varphi (m,0,p)&=m&&{\text{for }}p>2\\\varphi (m,n,p)&=\varphi (m,\varphi (m,n-1,p),p-1)&&{\text{for }}n,p>0\end{aligned}}}
さまざまな 2 つの引数バージョンのうち、Péter と Robinson によって開発されたバージョン (ほとんどの著者によって「」Ackermann 関数と呼ばれています) は 、非負の整数に対して 次のように定義されます。
m
{\displaystyle m}
n
{\displaystyle n}
A
(
0
,
n
)
=
n
+
1
A
(
m
+
1
,
0
)
=
A
(
m
,
1
)
A
(
m
+
1
,
n
+
1
)
=
A
(
m
,
A
(
m
+
1
,
n
)
)
{\displaystyle {\begin{array}{lcl}\operatorname {A} (0,n)&=&n+1\\\operatorname {A} (m+1,0)&=&\operatorname {A} (m,1)\\\operatorname {A} (m+1,n+1)&=&\operatorname {A} (m,\operatorname {A} (m+1,n))\end{array}}}
アッカーマン関数は ハイパーオペレーションシーケンス との関連でも表現されている:
A
(
m
,
n
)
=
{
n
+
1
m
=
0
2
[
m
]
(
n
+
3
)
−
3
m
>
0
{\displaystyle A(m,n)={\begin{cases}n+1&m=0\\2[m](n+3)-3&m>0\\\end{cases}}}
または、 Knuthの上矢印表記法 (整数インデックスに拡張 )で記述すると次のようになります。
≥
−
2
{\displaystyle \geq -2}
=
{
n
+
1
m
=
0
2
↑
m
−
2
(
n
+
3
)
−
3
m
>
0
{\displaystyle ={\begin{cases}n+1&m=0\\2\uparrow ^{m-2}(n+3)-3&m>0\\\end{cases}}}
あるいは、バック関数Fの観点からは、次のように表される。
=
{
n
+
1
m
=
0
F
(
m
,
n
+
3
)
−
3
m
>
0
{\displaystyle ={\begin{cases}n+1&m=0\\F(m,n+3)-3&m>0\\\end{cases}}}
定義: 反復1項関数として
を の n 回目の反復として 定義します 。
f
n
{\displaystyle f^{n}}
f
{\displaystyle f}
f
0
(
x
)
=
x
f
n
+
1
(
x
)
=
f
(
f
n
(
x
)
)
{\displaystyle {\begin{array}{rll}f^{0}(x)&=&x\\f^{n+1}(x)&=&f(f^{n}(x))\end{array}}}
反復処理 は、関数をそれ自身と特定の回数合成するプロセスです。 関数合成は 結合 演算 なので、 .
f
(
f
n
(
x
)
)
=
f
n
(
f
(
x
)
)
{\displaystyle f(f^{n}(x))=f^{n}(f(x))}
アッカーマン関数を単項関数の列として考えると、 を設定できます 。
A
m
(
n
)
=
A
(
m
,
n
)
{\displaystyle \operatorname {A} _{m}(n)=\operatorname {A} (m,n)}
関数は反復 から定義される単項 [n 2] 関数の シーケンスになります 。
A
0
,
A
1
,
A
2
,
.
.
.
{\displaystyle \operatorname {A} _{0},\operatorname {A} _{1},\operatorname {A} _{2},...}
A
0
(
n
)
=
n
+
1
A
m
+
1
(
n
)
=
A
m
n
+
1
(
1
)
{\displaystyle {\begin{array}{lcl}\operatorname {A} _{0}(n)&=&n+1\\\operatorname {A} _{m+1}(n)&=&\operatorname {A} _{m}^{n+1}(1)\\\end{array}}}
計算
アッカーマン関数の再帰定義は、 項書き換えシステム (TRS) に自然に転置できます。
2項関数に基づくTRS
2元 アッカーマン関数の定義は 明らかな簡約規則を導く
(r1)
A
(
0
,
n
)
→
S
(
n
)
(r2)
A
(
S
(
m
)
,
0
)
→
A
(
m
,
S
(
0
)
)
(r3)
A
(
S
(
m
)
,
S
(
n
)
)
→
A
(
m
,
A
(
S
(
m
)
,
n
)
)
{\displaystyle {\begin{array}{lll}{\text{(r1)}}&A(0,n)&\rightarrow &S(n)\\{\text{(r2)}}&A(S(m),0)&\rightarrow &A(m,S(0))\\{\text{(r3)}}&A(S(m),S(n))&\rightarrow &A(m,A(S(m),n))\end{array}}}
例
計算
A
(
1
,
2
)
→
∗
4
{\displaystyle A(1,2)\rightarrow _{*}4}
縮約シーケンスは [n 3]である。
を計算するには 、最初に要素を含む スタック を使用できます 。
A
(
m
,
n
)
{\displaystyle \operatorname {A} (m,n)}
⟨
m
,
n
⟩
{\displaystyle \langle m,n\rangle }
その後、上位2つの要素が規則に従って繰り返し置き換えられる [n 4]
(r1)
0
,
n
→
(
n
+
1
)
(r2)
(
m
+
1
)
,
0
→
m
,
1
(r3)
(
m
+
1
)
,
(
n
+
1
)
→
m
,
(
m
+
1
)
,
n
{\displaystyle {\begin{array}{lllllllll}{\text{(r1)}}&0&,&n&\rightarrow &(n+1)\\{\text{(r2)}}&(m+1)&,&0&\rightarrow &m&,&1\\{\text{(r3)}}&(m+1)&,&(n+1)&\rightarrow &m&,&(m+1)&,&n\end{array}}}
図式的には、次のように始まります 。
⟨
m
,
n
⟩
{\displaystyle \langle m,n\rangle }
スタック長 <> 1 の 場合
{
2つの要素
をPOPし 、ルールr1、r2、r3を適用して1つまたは2つまたは3つの要素を PUSHする
}
疑似コード は Grossman & Zeitman (1988) に掲載されています。
たとえば、入力では 、
⟨
2
,
1
⟩
{\displaystyle \langle 2,1\rangle }
備考
最左内戦略は、 Rosetta Code 上の 225 のコンピュータ言語で実装されています。
の計算 にはステップ しかかかりません 。
m
,
n
{\displaystyle m,n}
A
(
m
,
n
)
{\displaystyle A(m,n)}
(
A
(
m
,
n
)
+
1
)
m
{\displaystyle (A(m,n)+1)^{m}}
Grossman & Zeitman (1988) は、 の計算において、 である限り、 スタックの最大長は であることを指摘しました 。
A
(
m
,
n
)
{\displaystyle \operatorname {A} (m,n)}
A
(
m
,
n
)
{\displaystyle \operatorname {A} (m,n)}
m
>
0
{\displaystyle m>0}
独自のアルゴリズムは本質的に反復的であり、 時間と 空間内 で計算を行います。
A
(
m
,
n
)
{\displaystyle \operatorname {A} (m,n)}
O
(
m
A
(
m
,
n
)
)
{\displaystyle {\mathcal {O}}(m\operatorname {A} (m,n))}
O
(
m
)
{\displaystyle {\mathcal {O}}(m)}
反復1項関数に基づくTRS
反復1項 アッカーマン関数の定義は、 異なる簡約規則につながる。
(r4)
A
(
S
(
0
)
,
0
,
n
)
→
S
(
n
)
(r5)
A
(
S
(
0
)
,
S
(
m
)
,
n
)
→
A
(
S
(
n
)
,
m
,
S
(
0
)
)
(r6)
A
(
S
(
S
(
x
)
)
,
m
,
n
)
→
A
(
S
(
0
)
,
m
,
A
(
S
(
x
)
,
m
,
n
)
)
{\displaystyle {\begin{array}{lll}{\text{(r4)}}&A(S(0),0,n)&\rightarrow &S(n)\\{\text{(r5)}}&A(S(0),S(m),n)&\rightarrow &A(S(n),m,S(0))\\{\text{(r6)}}&A(S(S(x)),m,n)&\rightarrow &A(S(0),m,A(S(x),m,n))\end{array}}}
関数合成は結合的であるため、規則r6の代わりに次のように定義できる。
(r7)
A
(
S
(
S
(
x
)
)
,
m
,
n
)
→
A
(
S
(
x
)
,
m
,
A
(
S
(
0
)
,
m
,
n
)
)
{\displaystyle {\begin{array}{lll}{\text{(r7)}}&A(S(S(x)),m,n)&\rightarrow &A(S(x),m,A(S(0),m,n))\end{array}}}
前のセクションと同様に、の計算は スタックを使用して実装できます。
A
m
1
(
n
)
{\displaystyle \operatorname {A} _{m}^{1}(n)}
最初、スタックには 3 つの要素が含まれます 。
⟨
1
,
m
,
n
⟩
{\displaystyle \langle 1,m,n\rangle }
その後、上位3つの要素が規則に従って繰り返し置き換えられる [n 4]
(r4)
1
,
0
,
n
→
(
n
+
1
)
(r5)
1
,
(
m
+
1
)
,
n
→
(
n
+
1
)
,
m
,
1
(r6)
(
x
+
2
)
,
m
,
n
→
1
,
m
,
(
x
+
1
)
,
m
,
n
{\displaystyle {\begin{array}{lllllllll}{\text{(r4)}}&1&,0&,n&\rightarrow &(n+1)\\{\text{(r5)}}&1&,(m+1)&,n&\rightarrow &(n+1)&,m&,1\\{\text{(r6)}}&(x+2)&,m&,n&\rightarrow &1&,m&,(x+1)&,m&,n\\\end{array}}}
図式的には、次のように始まります 。
⟨
1
,
m
,
n
⟩
{\displaystyle \langle 1,m,n\rangle }
スタック長 <> 1 の 場合
{
3 つの要素
を POP します 。ルール r4、r5、r6 を適用して、1 つまたは 3 つまたは 5 つの要素を PUSH します。
}
例
入力時に 連続するスタック構成は
⟨
1
,
2
,
1
⟩
{\displaystyle \langle 1,2,1\rangle }
1
,
2
,
1
_
→
r
5
2
,
1
,
1
_
→
r
6
1
,
1
,
1
,
1
,
1
_
→
r
5
1
,
1
,
2
,
0
,
1
_
→
r
6
1
,
1
,
1
,
0
,
1
,
0
,
1
_
→
r
4
1
,
1
,
1
,
0
,
2
_
→
r
4
1
,
1
,
3
_
→
r
5
4
,
0
,
1
_
→
r
6
1
,
0
,
3
,
0
,
1
_
→
r
6
1
,
0
,
1
,
0
,
2
,
0
,
1
_
→
r
6
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
_
→
r
4
1
,
0
,
1
,
0
,
1
,
0
,
2
_
→
r
4
1
,
0
,
1
,
0
,
3
_
→
r
4
1
,
0
,
4
_
→
r
4
5
{\displaystyle {\begin{aligned}&{\underline {1,2,1}}\rightarrow _{r5}{\underline {2,1,1}}\rightarrow _{r6}1,1,{\underline {1,1,1}}\rightarrow _{r5}1,1,{\underline {2,0,1}}\rightarrow _{r6}1,1,1,0,{\underline {1,0,1}}\\&\rightarrow _{r4}1,1,{\underline {1,0,2}}\rightarrow _{r4}{\underline {1,1,3}}\rightarrow _{r5}{\underline {4,0,1}}\rightarrow _{r6}1,0,{\underline {3,0,1}}\rightarrow _{r6}1,0,1,0,{\underline {2,0,1}}\\&\rightarrow _{r6}1,0,1,0,1,0,{\underline {1,0,1}}\rightarrow _{r4}1,0,1,0,{\underline {1,0,2}}\rightarrow _{r4}1,0,{\underline {1,0,3}}\rightarrow _{r4}{\underline {1,0,4}}\rightarrow _{r4}5\end{aligned}}}
対応する等式は
A
2
(
1
)
=
A
1
2
(
1
)
=
A
1
(
A
1
(
1
)
)
=
A
1
(
A
0
2
(
1
)
)
=
A
1
(
A
0
(
A
0
(
1
)
)
)
=
A
1
(
A
0
(
2
)
)
=
A
1
(
3
)
=
A
0
4
(
1
)
=
A
0
(
A
0
3
(
1
)
)
=
A
0
(
A
0
(
A
0
2
(
1
)
)
)
=
A
0
(
A
0
(
A
0
(
A
0
(
1
)
)
)
)
=
A
0
(
A
0
(
A
0
(
2
)
)
)
=
A
0
(
A
0
(
3
)
)
=
A
0
(
4
)
=
5
{\displaystyle {\begin{aligned}&A_{2}(1)=A_{1}^{2}(1)=A_{1}(A_{1}(1))=A_{1}(A_{0}^{2}(1))=A_{1}(A_{0}(A_{0}(1)))\\&=A_{1}(A_{0}(2))=A_{1}(3)=A_{0}^{4}(1)=A_{0}(A_{0}^{3}(1))=A_{0}(A_{0}(A_{0}^{2}(1)))\\&=A_{0}(A_{0}(A_{0}(A_{0}(1))))=A_{0}(A_{0}(A_{0}(2)))=A_{0}(A_{0}(3))=A_{0}(4)=5\end{aligned}}}
ルールr6の代わりにルールr7が使用される場合、スタック内の置換は次のようになります。
(r7)
(
x
+
2
)
,
m
,
n
→
(
x
+
1
)
,
m
,
1
,
m
,
n
{\displaystyle {\begin{array}{lllllllll}{\text{(r7)}}&(x+2)&,m&,n&\rightarrow &(x+1)&,m&,1&,m&,n\end{array}}}
その後のスタック構成は
1
,
2
,
1
_
→
r
5
2
,
1
,
1
_
→
r
7
1
,
1
,
1
,
1
,
1
_
→
r
5
1
,
1
,
2
,
0
,
1
_
→
r
7
1
,
1
,
1
,
0
,
1
,
0
,
1
_
→
r
4
1
,
1
,
1
,
0
,
2
_
→
r
4
1
,
1
,
3
_
→
r
5
4
,
0
,
1
_
→
r
7
3
,
0
,
1
,
0
,
1
_
→
r
4
3
,
0
,
2
_
→
r
7
2
,
0
,
1
,
0
,
2
_
→
r
4
2
,
0
,
3
_
→
r
7
1
,
0
,
1
,
0
,
3
_
→
r
4
1
,
0
,
4
_
→
r
4
5
{\displaystyle {\begin{aligned}&{\underline {1,2,1}}\rightarrow _{r5}{\underline {2,1,1}}\rightarrow _{r7}1,1,{\underline {1,1,1}}\rightarrow _{r5}1,1,{\underline {2,0,1}}\rightarrow _{r7}1,1,1,0,{\underline {1,0,1}}\\&\rightarrow _{r4}1,1,{\underline {1,0,2}}\rightarrow _{r4}{\underline {1,1,3}}\rightarrow _{r5}{\underline {4,0,1}}\rightarrow _{r7}3,0,{\underline {1,0,1}}\rightarrow _{r4}{\underline {3,0,2}}\\&\rightarrow _{r7}2,0,{\underline {1,0,2}}\rightarrow _{r4}{\underline {2,0,3}}\rightarrow _{r7}1,0,{\underline {1,0,3}}\rightarrow _{r4}{\underline {1,0,4}}\rightarrow _{r4}5\end{aligned}}}
対応する等式は
A
2
(
1
)
=
A
1
2
(
1
)
=
A
1
(
A
1
(
1
)
)
=
A
1
(
A
0
2
(
1
)
)
=
A
1
(
A
0
(
A
0
(
1
)
)
)
=
A
1
(
A
0
(
2
)
)
=
A
1
(
3
)
=
A
0
4
(
1
)
=
A
0
3
(
A
0
(
1
)
)
=
A
0
3
(
2
)
=
A
0
2
(
A
0
(
2
)
)
=
A
0
2
(
3
)
=
A
0
(
A
0
(
3
)
)
=
A
0
(
4
)
=
5
{\displaystyle {\begin{aligned}&A_{2}(1)=A_{1}^{2}(1)=A_{1}(A_{1}(1))=A_{1}(A_{0}^{2}(1))=A_{1}(A_{0}(A_{0}(1)))\\&=A_{1}(A_{0}(2))=A_{1}(3)=A_{0}^{4}(1)=A_{0}^{3}(A_{0}(1))=A_{0}^{3}(2)\\&=A_{0}^{2}(A_{0}(2))=A_{0}^{2}(3)=A_{0}(A_{0}(3))=A_{0}(4)=5\end{aligned}}}
備考
これまで紹介した TRS は、任意の入力に対して同じステップ数で収束します。また、同じ削減ルールを使用します (この比較では、ルール r1、r2、r3 は、それぞれルール r4、r5、r6/r7 と同じと見なされます)。たとえば、の削減は 14 ステップで収束します: 6 × r1、3 × r2、5 × r3。の削減も 同じ 14 ステップで収束します: 6 × r4、3 × r5、5 × r6/r7。TRS は、削減ルールが適用される順序が異なります。
A
(
2
,
1
)
{\displaystyle A(2,1)}
A
2
(
1
)
{\displaystyle A_{2}(1)}
が規則 {r4, r5, r6} に従って計算される場合 、スタックの最大長は 未満に留まります 。規則 r6 の代わりに削減規則 r7 を使用すると、スタックの最大長は のみになります 。スタックの長さは再帰の深さを反映します。規則 {r4, r5, r7} に従った削減では再帰の最大深さがより小さくなるため、 [n 6] この計算はその点でより効率的です。
A
i
(
n
)
{\displaystyle A_{i}(n)}
2
×
A
(
i
,
n
)
{\displaystyle 2\times A(i,n)}
2
(
i
+
2
)
{\displaystyle 2(i+2)}
ハイパー演算子に基づくTRS
Sundblad (1971) や Porto & Matos (1980) が明示したように、アッカーマン関数はハイパーオペレーション シーケンスで表現できます 。
A
(
m
,
n
)
=
{
n
+
1
m
=
0
2
[
m
]
(
n
+
3
)
−
3
m
>
0
{\displaystyle A(m,n)={\begin{cases}n+1&m=0\\2[m](n+3)-3&m>0\\\end{cases}}}
または、定数2をパラメータリストから削除した後、バック関数の観点から
=
{
n
+
1
m
=
0
F
(
m
,
n
+
3
)
−
3
m
>
0
{\displaystyle ={\begin{cases}n+1&m=0\\F(m,n+3)-3&m>0\\\end{cases}}}
バック関数 [ はアッカーマン関数の変形であり、以下の簡約規則で計算できる。
F
(
m
,
n
)
=
2
[
m
]
n
{\displaystyle \operatorname {F} (m,n)=2[m]n}
(b1)
F
(
S
(
0
)
,
0
,
n
)
→
S
(
n
)
(b2)
F
(
S
(
0
)
,
S
(
0
)
,
0
)
→
S
(
S
(
0
)
)
(b3)
F
(
S
(
0
)
,
S
(
S
(
0
)
)
,
0
)
→
0
(b4)
F
(
S
(
0
)
,
S
(
S
(
S
(
m
)
)
)
,
0
)
→
S
(
0
)
(b5)
F
(
S
(
0
)
,
S
(
m
)
,
S
(
n
)
)
→
F
(
S
(
n
)
,
m
,
F
(
S
(
0
)
,
S
(
m
)
,
0
)
)
(b6)
F
(
S
(
S
(
x
)
)
,
m
,
n
)
→
F
(
S
(
0
)
,
m
,
F
(
S
(
x
)
,
m
,
n
)
)
{\displaystyle {\begin{array}{lll}{\text{(b1)}}&F(S(0),0,n)&\rightarrow &S(n)\\{\text{(b2)}}&F(S(0),S(0),0)&\rightarrow &S(S(0))\\{\text{(b3)}}&F(S(0),S(S(0)),0)&\rightarrow &0\\{\text{(b4)}}&F(S(0),S(S(S(m))),0)&\rightarrow &S(0)\\{\text{(b5)}}&F(S(0),S(m),S(n))&\rightarrow &F(S(n),m,F(S(0),S(m),0))\\{\text{(b6)}}&F(S(S(x)),m,n)&\rightarrow &F(S(0),m,F(S(x),m,n))\end{array}}}
ルールb6の代わりにルールを定義することもできる。
(b7)
F
(
S
(
S
(
x
)
)
,
m
,
n
)
→
F
(
S
(
x
)
,
m
,
F
(
S
(
0
)
,
m
,
n
)
)
{\displaystyle {\begin{array}{lll}{\text{(b7)}}&F(S(S(x)),m,n)&\rightarrow &F(S(x),m,F(S(0),m,n))\end{array}}}
アッカーマン関数を計算するには、3つの簡約規則を追加するだけで十分である。
(r8)
A
(
0
,
n
)
→
S
(
n
)
(r9)
A
(
S
(
m
)
,
n
)
→
P
(
F
(
S
(
0
)
,
S
(
m
)
,
S
(
S
(
S
(
n
)
)
)
)
)
(r10)
P
(
S
(
S
(
S
(
m
)
)
)
)
→
m
{\displaystyle {\begin{array}{lll}{\text{(r8)}}&A(0,n)&\rightarrow &S(n)\\{\text{(r9)}}&A(S(m),n)&\rightarrow &P(F(S(0),S(m),S(S(S(n)))))\\{\text{(r10)}}&P(S(S(S(m))))&\rightarrow &m\\\end{array}}}
これらのルールは、基本ケース A(0,n)、アライメント (n+3)、およびファッジ (-3) を処理します。
例
計算
A
(
2
,
1
)
→
∗
5
{\displaystyle A(2,1)\rightarrow _{*}5}
対応する等式は
削減規則を伴うTRSを 適用すると、次のようになります。
b6
{\displaystyle {\text{b6}}}
A
(
2
,
1
)
+
3
=
F
(
2
,
4
)
=
⋯
=
F
6
(
0
,
2
)
=
F
(
0
,
F
5
(
0
,
2
)
)
=
F
(
0
,
F
(
0
,
F
4
(
0
,
2
)
)
)
=
F
(
0
,
F
(
0
,
F
(
0
,
F
3
(
0
,
2
)
)
)
)
=
F
(
0
,
F
(
0
,
F
(
0
,
F
(
0
,
F
2
(
0
,
2
)
)
)
)
)
=
F
(
0
,
F
(
0
,
F
(
0
,
F
(
0
,
F
(
0
,
F
(
0
,
2
)
)
)
)
)
)
=
F
(
0
,
F
(
0
,
F
(
0
,
F
(
0
,
F
(
0
,
3
)
)
)
)
)
=
F
(
0
,
F
(
0
,
F
(
0
,
F
(
0
,
4
)
)
)
)
=
F
(
0
,
F
(
0
,
F
(
0
,
5
)
)
)
=
F
(
0
,
F
(
0
,
6
)
)
=
F
(
0
,
7
)
=
8
{\displaystyle {\begin{aligned}&A(2,1)+3=F(2,4)=\dots =F^{6}(0,2)=F(0,F^{5}(0,2))=F(0,F(0,F^{4}(0,2)))\\&=F(0,F(0,F(0,F^{3}(0,2))))=F(0,F(0,F(0,F(0,F^{2}(0,2)))))=F(0,F(0,F(0,F(0,F(0,F(0,2))))))\\&=F(0,F(0,F(0,F(0,F(0,3)))))=F(0,F(0,F(0,F(0,4))))=F(0,F(0,F(0,5)))=F(0,F(0,6))=F(0,7)=8\end{aligned}}}
削減規則を伴うTRSを 適用すると、次のようになります。
b7
{\displaystyle {\text{b7}}}
A
(
2
,
1
)
+
3
=
F
(
2
,
4
)
=
⋯
=
F
6
(
0
,
2
)
=
F
5
(
0
,
F
(
0
,
2
)
)
=
F
5
(
0
,
3
)
=
F
4
(
0
,
F
(
0
,
3
)
)
=
F
4
(
0
,
4
)
=
F
3
(
0
,
F
(
0
,
4
)
)
=
F
3
(
0
,
5
)
=
F
2
(
0
,
F
(
0
,
5
)
)
=
F
2
(
0
,
6
)
=
F
(
0
,
F
(
0
,
6
)
)
=
F
(
0
,
7
)
=
8
{\displaystyle {\begin{aligned}&A(2,1)+3=F(2,4)=\dots =F^{6}(0,2)=F^{5}(0,F(0,2))=F^{5}(0,3)=F^{4}(0,F(0,3))=F^{4}(0,4)\\&=F^{3}(0,F(0,4))=F^{3}(0,5)=F^{2}(0,F(0,5))=F^{2}(0,6)=F(0,F(0,6))=F(0,7)=8\end{aligned}}}
備考
の計算は、 {b1 - b5, b6, r8 - r10} という規則に従って、深く再帰的です。ネストされた の最大深度 は です 。原因は反復が実行される順序にあります。 最初のものは、 シーケンス全体が展開された後にのみ消えます。
A
i
(
n
)
{\displaystyle \operatorname {A} _{i}(n)}
F
{\displaystyle F}
A
(
i
,
n
)
+
1
{\displaystyle A(i,n)+1}
F
n
+
1
(
x
)
=
F
(
F
n
(
x
)
)
{\displaystyle F^{n+1}(x)=F(F^{n}(x))}
F
{\displaystyle F}
その点では、{b1 - b5, b7, r8 - r10} の規則に従った計算の方が効率的です。反復は、 コードブロックの繰り返しループをシミュレートします。 [n 7] ネストには、反復関数ごとに 1 つの再帰レベルという制限があります 。Meyer & Ritchie (1967) はこの対応を示しました。
F
n
+
1
(
x
)
=
F
n
(
F
(
x
)
)
{\displaystyle F^{n+1}(x)=F^{n}(F(x))}
(
i
+
1
)
{\displaystyle (i+1)}
これらの考慮事項は、再帰の深さにのみ関係します。どちらの方法で反復しても、同じ数の削減ステップがもたらされ、同じルールが適用されます (ルール b6 と b7 が「同じ」と見なされる場合)。 たとえば、の削減は 35 ステップで収束します: 12 × b1、4 × b2、1 × b3、4 × b5、12 × b6/b7、1 × r9、1 × r10。 反復法は、 削減ルールが適用される順序にのみ影響します。
A
(
2
,
1
)
{\displaystyle A(2,1)}
実行時間の実際の短縮は、サブ結果を何度も再計算しないことによってのみ達成できます。 メモ化は 、関数呼び出しの結果をキャッシュし、同じ入力が再び発生したときに返す最適化手法です。たとえば、Ward (1993) を参照してください。Grossman と Zeitman (1988) は、時間と空間内 で 計算する巧妙なアルゴリズムを公開しました 。
A
(
i
,
n
)
{\displaystyle A(i,n)}
O
(
i
A
(
i
,
n
)
)
{\displaystyle {\mathcal {O}}(iA(i,n))}
O
(
i
)
{\displaystyle {\mathcal {O}}(i)}
膨大な数
計算が 多くのステップと大きな数値でどのように行われるかを示すために: [n 5]
A
(
4
,
3
)
{\displaystyle A(4,3)}
A
(
4
,
3
)
→
A
(
3
,
A
(
4
,
2
)
)
→
A
(
3
,
A
(
3
,
A
(
4
,
1
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
4
,
0
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
3
,
1
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
3
,
0
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
2
,
1
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
1
,
A
(
2
,
0
)
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
1
,
A
(
1
,
1
)
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
1
,
A
(
0
,
A
(
1
,
0
)
)
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
1
,
A
(
0
,
A
(
0
,
1
)
)
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
1
,
A
(
0
,
2
)
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
1
,
3
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
0
,
A
(
1
,
2
)
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
0
,
A
(
0
,
A
(
1
,
1
)
)
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
0
,
A
(
0
,
A
(
0
,
A
(
1
,
0
)
)
)
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
0
,
A
(
0
,
A
(
0
,
A
(
0
,
1
)
)
)
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
0
,
A
(
0
,
A
(
0
,
2
)
)
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
0
,
A
(
0
,
3
)
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
A
(
0
,
4
)
)
)
)
)
→
A
(
3
,
A
(
3
,
A
(
3
,
A
(
2
,
5
)
)
)
)
⋮
→
A
(
3
,
A
(
3
,
A
(
3
,
13
)
)
)
⋮
→
A
(
3
,
A
(
3
,
65533
)
)
⋮
→
A
(
3
,
2
65536
−
3
)
⋮
→
2
2
65536
−
3.
{\displaystyle {\begin{aligned}A(4,3)&\rightarrow A(3,A(4,2))\\&\rightarrow A(3,A(3,A(4,1)))\\&\rightarrow A(3,A(3,A(3,A(4,0))))\\&\rightarrow A(3,A(3,A(3,A(3,1))))\\&\rightarrow A(3,A(3,A(3,A(2,A(3,0)))))\\&\rightarrow A(3,A(3,A(3,A(2,A(2,1)))))\\&\rightarrow A(3,A(3,A(3,A(2,A(1,A(2,0))))))\\&\rightarrow A(3,A(3,A(3,A(2,A(1,A(1,1))))))\\&\rightarrow A(3,A(3,A(3,A(2,A(1,A(0,A(1,0)))))))\\&\rightarrow A(3,A(3,A(3,A(2,A(1,A(0,A(0,1)))))))\\&\rightarrow A(3,A(3,A(3,A(2,A(1,A(0,2))))))\\&\rightarrow A(3,A(3,A(3,A(2,A(1,3)))))\\&\rightarrow A(3,A(3,A(3,A(2,A(0,A(1,2))))))\\&\rightarrow A(3,A(3,A(3,A(2,A(0,A(0,A(1,1)))))))\\&\rightarrow A(3,A(3,A(3,A(2,A(0,A(0,A(0,A(1,0))))))))\\&\rightarrow A(3,A(3,A(3,A(2,A(0,A(0,A(0,A(0,1))))))))\\&\rightarrow A(3,A(3,A(3,A(2,A(0,A(0,A(0,2)))))))\\&\rightarrow A(3,A(3,A(3,A(2,A(0,A(0,3))))))\\&\rightarrow A(3,A(3,A(3,A(2,A(0,4)))))\\&\rightarrow A(3,A(3,A(3,A(2,5))))\\&\qquad \vdots \\&\rightarrow A(3,A(3,A(3,13)))\\&\qquad \vdots \\&\rightarrow A(3,A(3,65533))\\&\qquad \vdots \\&\rightarrow A(3,2^{65536}-3)\\&\qquad \vdots \\&\rightarrow 2^{2^{65536}}-3.\\\end{aligned}}}
値の表
アッカーマン関数の計算は、無限の表で言い換えることができます。まず、自然数を一番上の行に並べます。表の数字を決定するには、すぐ左の数字を取ります。次に、その数字を使用して、その数字で指定された列と 1 行上の列で必要な数字を検索します。その左側に数字がない場合は、前の行の見出しが「1」の列を参照するだけです。表の左上の小さな部分を次に示します。
ここで再帰的指数またはKnuth 矢印 のみで表現される数値は 非常に大きく、単純な 10 進数で表記するにはスペースを取りすぎます。
表のこの最初のセクションでは大きな値が出現しますが、 グラハム数 など、さらに大きな数も定義されています。グラハム数は、クヌース矢印の数が少ないと表すことができません。この数は、アッカーマン関数を自身に再帰的に適用するのと同様の手法で構築されます。
これは上記の表の繰り返しですが、パターンを明確に示すために、値が関数定義の関連する式に置き換えられています。
プロパティ
の評価が常に終了することは、すぐには明らかではないかもしれません 。ただし、各再帰アプリケーションで が 減少するか、 同じままで減少するため、再帰は制限されます。 が ゼロに達する たびに が 減少し、 最終的に もゼロに達します。(より技術的に表現すると、各ケースでペアは ペアの 辞書式順序 で減少します。これは、単一の非負整数の順序と同様に、 整列した です。つまり、順序が無限に連続して下がることはできません。) ただし、 が減少する場合、増加できる量に上限はなく 、多くの場合大幅に増加します。
A
(
m
,
n
)
{\displaystyle A(m,n)}
m
{\displaystyle m}
m
{\displaystyle m}
n
{\displaystyle n}
n
{\displaystyle n}
m
{\displaystyle m}
m
{\displaystyle m}
(
m
,
n
)
{\displaystyle (m,n)}
m
{\displaystyle m}
n
{\displaystyle n}
m が1、2、3 のように 小さい値の場合、アッカーマン関数は n に対して比較的ゆっくりと増加します(最大でも 指数関数的 に増加します)。 ただし、 の場合は、はるかに急速に増加します。m は、 約 2.00353 × 10です。
m
≥
4
{\displaystyle m\geq 4}
A
(
4
,
2
)
{\displaystyle A(4,2)}
19 728 であり、 の小数展開は、 あらゆる典型的な尺度で見て非常に大きく、約 2.12004 × 10 6.03123 × 10
A
(
4
,
3
)
{\displaystyle A(4,3)}
19 727 .
興味深い点は、このプログラムが使用する算術演算は 1 の加算だけであるということです。このプログラムの急速なパワー増大は、ネストされた再帰のみに基づいています。これは、実行時間が少なくとも出力に比例し、非常に膨大になることも意味します。実際には、ほとんどの場合、実行時間は出力よりもはるかに長くなります (上記を参照)。
と の両方を 同時に 増加させる 単一引数バージョンは、 指数関数 、 階乗関数、多重階乗関数および 超階乗 関数、さらには Knuth の上矢印表記法を使用して定義された関数 (インデックス付き上矢印が使用されている場合を除く) などの非常に増加の速い関数を含む、すべての原始再帰関数を小さく見せます。 は、 増加の速い階層 で とほぼ同等であることがわかります 。 この極端な増加を利用して、 は チューリングマシン などの無限のメモリを持つマシンで明らかに計算可能であり 、したがって 計算可能関数 であるが、どの原始再帰関数よりも速く増加し、したがって原始再帰ではないことを示すことができます。
f
(
n
)
=
A
(
n
,
n
)
{\displaystyle f(n)=A(n,n)}
m
{\displaystyle m}
n
{\displaystyle n}
f
(
n
)
{\displaystyle f(n)}
f
ω
(
n
)
{\displaystyle f_{\omega }(n)}
f
{\displaystyle f}
原始再帰ではない
アッカーマン関数は、どの 原始再帰関数 よりも速く増加するため、それ自体は原始再帰的ではありません。証明の概要は次のとおりです。最大 k 回の再帰を使用して定義された原始再帰関数は 、高速増加階層の (k+1) 番目の関数である よりも遅く増加する必要がありますが、アッカーマン関数は少なくとも と同じ速さで増加します 。
f
k
+
1
(
n
)
{\displaystyle f_{k+1}(n)}
f
ω
(
n
)
{\displaystyle f_{\omega }(n)}
具体的には、すべての原始再帰関数に対して、すべての 非負整数 に対して 、
f
(
x
1
,
…
,
x
n
)
{\displaystyle f(x_{1},\ldots ,x_{n})}
t
{\displaystyle t}
x
1
,
…
,
x
n
{\displaystyle x_{1},\ldots ,x_{n}}
f
(
x
1
,
…
,
x
n
)
<
A
(
t
,
max
i
x
i
)
.
{\displaystyle f(x_{1},\ldots ,x_{n})<A(t,\max _{i}x_{i}).}
これが確立されると、それ 自体は原始再帰的ではないことが分かります。そうでなければ 、
A
{\displaystyle A}
x
1
=
x
2
=
t
{\displaystyle x_{1}=x_{2}=t}
A
(
t
,
t
)
<
A
(
t
,
t
)
.
{\displaystyle A(t,t)<A(t,t).}
証明は次のように進む: アッカーマン関数よりも遅く増加するすべての関数の
クラスを定義する
A
{\displaystyle {\mathcal {A}}}
A
=
{
f
|
∃
t
∀
x
1
⋯
∀
x
n
:
f
(
x
1
,
…
,
x
n
)
<
A
(
t
,
max
i
x
i
)
}
{\displaystyle {\mathcal {A}}=\left\{f\,{\bigg |}\,\exists t\ \forall x_{1}\cdots \forall x_{n}:\ f(x_{1},\ldots ,x_{n})<A(t,\max _{i}x_{i})\right\}}
そして、 が すべての原始再帰関数を含むことを示します。 後者は、 が 定数関数、後続関数、射影関数を含み、関数合成と原始再帰の操作に対して閉じていることを示すことによって達成されます。
A
{\displaystyle {\mathcal {A}}}
A
{\displaystyle {\mathcal {A}}}
計算複雑性における使用
アッカーマン関数は、 ベクトル加算システム や ペトリネット到達可能性 など のいくつかの アルゴリズム の時間 計算量 に現れ、 大規模なインスタンスでは計算不可能であることを示しています。アッカーマン関数の逆関数は、いくつかの時間計算量結果に現れます。
逆
上で考察した 関数 f ( n ) = A ( n , n )は非常に急速に増加するため、その 逆関数 f −1 は 非常にゆっくりと増加します。この 逆アッカーマン関数 f −1は通常 α で表されます 。実際、 A (4, 4) は のオーダーである ため、 α ( n ) は任意の実用的な入力サイズ n に対して 5 未満です 。
2
2
2
2
16
{\displaystyle 2^{2^{2^{2^{16}}}}}
この逆関数は、分離集合データ構造 や 最小全域木に対する Chazelle のアルゴリズム など、一部のアルゴリズムの時間計算量に現れます 。これらの設定では、Ackermann の元の関数やその他のバリエーションが使用されることもありますが、それらはすべて同様に高い速度で増加します。特に、いくつかの修正された関数は、-3 などの項を削除することで式を簡素化します。
逆アッカーマン関数の2パラメータ変形は次のように定義できます。ここで、 は 床関数 です 。
⌊
x
⌋
{\displaystyle \lfloor x\rfloor }
α
(
m
,
n
)
=
min
{
i
≥
1
:
A
(
i
,
⌊
m
/
n
⌋
)
≥
log
2
n
}
.
{\displaystyle \alpha (m,n)=\min\{i\geq 1:A(i,\lfloor m/n\rfloor )\geq \log _{2}n\}.}
この関数は、上記のアルゴリズムをより正確に分析する際に発生し、より洗練された時間制限を与えます。分離集合データ構造では、 m は 演算数を表し、 n は要素数を表します。最小全域木アルゴリズムでは、 m は 辺の数を表し、 n は頂点の数を表します。α ( m , n )には 、 わずかに異なる定義がいくつか あります。たとえば、 log 2 n は n に置き換えられることがあり 、床関数は 天井 関数に置き換えられることがあります。
他の研究では、mを定数に設定して1の逆関数を定義し、その逆が特定の行に適用されるかもしれない。
アッカーマン関数の逆関数は原始再帰的である。
ベンチマークとして使用
アッカーマン関数は、非常に深い再帰に基づいて定義されているため、 コンパイラ の再帰最適化能力のベンチマークとして使用できます。この方法でアッカーマン関数を初めて公開したのは、1970年にDragoșVaida と、ほぼ同時に1971年にYngve Sundblad
サンドブラッドの画期的な論文は、ブライアン・ヴィッヒマン(ウェットストーンベンチマーク の共著者 )によって1975年から1982年にかけて書かれた三部作の論文の中で取り上げられました。
参照
注記
^ パラメータの順序が逆
^ ' カレー '
^ 各 ステップ で下線付きの redex が書き換えられます。
^ ここは ab: 最も左から最も内側の戦略です!
^ abcd 読みやすくするために 、S(0) は 1 と表記され、 S(S(0)) は 2 と表記され、 S(S(S(0))) は 3 と表記されます 。
^ 再帰の最大深度とは、手続きの最も深い呼び出し中に存在する手続きの活性化レベルの数を指します。Cornelius & Kirby (1975)
^ n+1 回 ループして Fを実行する
参考文献
^ 「A(4,2)の10進展開」 kosara.net 2000年8月27日。2010年1月20日時点のオリジナルよりアーカイブ。
文献
アッカーマン、ヴィルヘルム (1928)。 「ツム・ヒルベルトシェン・アウフバウ・デア・リーレン・ザーレン」。 数学アンナレン 。 99 : 118–133。 土井 :10.1007/BF01459088。 S2CID 123431274。
Buck, RC (1963). 「数学的帰納法と再帰的定義」. アメリカ数学月刊誌 . 70 (2): 128–135. doi :10.2307/2312881. JSTOR 2312881.
Calude, Cristian ; Marcus, Solomon ; Tevy, Ionel (1979年11月)。「原始再帰ではない再帰関数の最初の例」。Historia Math . 6 (4): 380–84. doi : 10.1016/0315-0860(79)90024-7 。
コーエン、ダニエル E. (1987 年 1 月)。 計算可能性と論理 。ハルステッド プレス 。ISBN 9780745800349 。
Cornelius, BJ; Kirby, GH (1975). 「再帰の深さとアッカーマン関数」. BIT 数値数学 . 15 (2): 144–150. doi :10.1007/BF01932687. S2CID 120532578.
Czerwiński, Wojciech; Orlikowski, Łukasz (2022 年 2 月 7 日)。ベクトル加算システムの到達可能性 はアッカーマン完全です。2021 IEEE 62nd Annual Symposium on Foundations of Computer Science の議事録。arXiv : 2104.13866。doi : 10.1109 /FOCS52979.2021.00120。
Grossman, Jerrold W.; Zeitman , R.Suzanne (1988 年 5 月)。「アッカーマン関数の本質的に反復的な計算」。 理論計算機科学 。57 (2–3): 327–330。doi :10.1016/0304-3975(88)90046-1。
ヴァン・ヘイエノールト、ジャン(1977)[訂正を加えて再版、初版1967年]。 フレーゲからゲーデルまで:1879-1931年の数理論理学の資料集 。ハーバード大学出版局。
デイヴィッド・ヒルベルト (1926)。 「ユーバー・ダス・ウンエンドリッシェ」。 数学アンナレン 。 95 :161-190。 土井 :10.1007/BF01206605。 S2CID 121888793。
Leroux, Jérôme (2022年2月7日). 「ペトリネットの到達可能性 問題は原始再帰的ではない」。2021 IEEE 62nd Annual Symposium on Foundations of Computer Science の議事録。arXiv : 2104.12695 . doi :10.1109/FOCS52979.2021.00121。
Matos, Armando B (2014 年 5 月 7 日). 「アッカーマン関数の逆関数は原始再帰的である」 (PDF) 。2022年 10 月 9 日時点のオリジナルから アーカイブ (PDF) 。
Meeussen, VCS; Zantema, H. (1992). 自然数の解釈による項書き換えの導出長 (PDF) (レポート). ユトレヒト大学. UU-CS、コンピュータサイエンス学部. ISSN 0924-3275. 2022年10月9日時点のオリジナルよりアーカイブ (PDF) 。
Meyer, Albert R. ; Ritchie, Dennis MacAlistair (1967)。「ループ プログラムの複雑さ」。1967 年第 22 回全国会議の議事録 。ACM '67: 1967 年第 22 回全国会議の議事録。pp. 465–469。doi : 10.1145 /800196.806014 。
モナン、ジャン=フランソワ、ヒンチー、MG(2003)。形式手法の理解。シュプリンガー 。p.61。ISBN 9781852332471 。
Munafo, Robert (1999a). 「アッカーマン関数のバージョン」。MROB の Large Numbers。2021 年 11 月 6 日 閲覧 。
Munafo, Robert (1999b). 「新しい演算子と関数の発明」 。MROB の Large Numbers。2021 年 11 月 6 日 閲覧 。
Paulson, Lawrence C. (2021). 「反復形式のアッカーマン関数: 証明支援実験」 。 2021年 10月19日 閲覧 。
ペテル、ロザ (1935)。 「Konstruktion nichtrekursiver Funktionen」。 数学アンナレン 。 111 :42~60。 土井 :10.1007/BF01472200。 S2CID 121107217。
Pettie, S. (2002)。「オンライン 最小全域木検証問題に対する逆アッカーマン スタイルの下限値」。 第 43 回 IEEE コンピュータ サイエンス基礎シンポジウム、2002 年。議事録 。pp. 155–163。doi :10.1109/ SFCS.2002.1181892。ISBN 0-7695-1822-2 . S2CID 8636108。
Porto, António; Matos, Armando B. (1980 年 9 月 1 日). 「Ackermann と超大国」 (PDF) . ACM SIGACT News . 12 (3): 1980 年のオリジナル版、「ACM SIGACT News」に掲載、2012 年 10 月 20 日に修正、2016 年 1 月 23 日に修正 (ワーキング ペーパー)。doi :10.1145/1008861.1008872。S2CID 29780652。2022年 10 月 9 日のオリジナルから アーカイブ (PDF) 。
リッチー、ロバート・ ウェルズ (1965 年 11 月)。「アッカーマン関数に基づく再帰関数のクラス」。 パシフィック ジャーナル オブ マスマティクス 。15 (3 ) : 1027–1044。doi : 10.2140/pjm.1965.15.1027 。
ロビンソン、ラファエル・ミッチェル (1948)。「再帰と二重再帰」。 アメリカ 数学 会報 。54 (10): 987–93。doi : 10.1090/S0002-9904-1948-09121-2 。
Sundblad , Yngve (1971 年 3 月)。「アッカーマン関数。理論的、計算的、および数式操作的研究」。BIT 数値数学 。11 (1): 107–119。doi :10.1007/BF01935330。S2CID 123416408 。
ヴァイダ、ドラゴシュ (1970)。 「アルゴリズムに似た言語のコンパイラ検証」。 Bulletin Mathématique de la Société des Sciences ルーマニ共和国社会主義数学 。ヌーベルシリーズ。 14 (62) (4): 487–502。 JSTOR 43679758。
Ward, Martin P. (1993 年 7 月 16 日). Ackerman 関数を計算するための反復手順 . CiteSeerX 10.1.1.35.9907 .
Wichmann, Brian A. ( 1976 年3 月)。「Ackermann 関数: 呼び出し手順の 効率 に関する研究」。BIT Numerical Mathematics。16 : 103–110。CiteSeerX 10.1.1.108.4125。doi :10.1007/BF01940783。S2CID 16993343 。
Wichmann, Brian A. (1977年7 月)。「プロシージャの 呼び出し 方法、または Ackermann 関数の再考」。BIT 数値数学 。16 (3): 103–110。doi :10.1002/spe.4380070303。S2CID 206507320 。
Wichmann, Brian A. (1982 年 7 月)。「手続き呼び出しテスト、アッカーマン関数の最新結果」 (PDF) 。2022 年 10 月 9 日時点のオリジナルから アーカイブ (PDF) 。
外部リンク
「アッカーマン関数」。 数学百科事典 。EMS Press。2001 [1994]。
Weisstein, Eric W. 「アッカーマン関数」 。MathWorld 。
この記事には、 Paul E. Black の パブリック ドメイン資料が組み込ま れ ています。「Ackermann 関数」。 アルゴリズムとデータ構造の辞書 。NIST 。
アニメーション化されたアッカーマン関数計算機
アーロンソン、スコット (1999)。「より大きな数字を挙げられるのは誰か?」
アッカーマン関数。いくつかの値の表が含まれています。
ブルーベーカー、ベン(2023年12月4日)。「簡単に聞こえる問題が、私たちの宇宙には大きすぎる数字を生み出す」。
ムナフォ、ロバート。「大きな数字」。 A の定義に関するいくつかのバリエーションについて説明します 。
Nivasch, Gabriel (2021年10月). 「痛みのない逆アッカーマン」。2007年8月21日時点のオリジナルよりアーカイブ 。 2023年 6月18日 閲覧。
Seidel, Raimund. 「逆アッカーマン関数の理解」 (PDF) 。
さまざまなプログラミング言語で書かれたアッカーマン関数 ( Rosetta Code 上)
Smith, Harry J. 「Ackermann's Function」。2009年10月26日時点のオリジナルよりアーカイブ。 ) 少し勉強してプログラミングをします。