アッカーマン関数
アッカーマン関数(アッカーマンかんすう、英: Ackermann function、独: Ackermannfunktion)とは、非負整数 m と n に対し、
与える数が大きくなると爆発的に計算量が大きくなるという特徴があり、性能測定などに用いられることもある。
また、数学的な意味として、原始再帰関数でないμ再帰関数の実例として有名である。これを(再帰呼出しのない手続き型の)プログラミング言語の言葉で言えば、アッカーマン数をプログラムで計算することはできるが、While文を使わずFor文のみでそれを計算することができない、ということになる。
歴史編集
1920年代後半、数学者ダフィット・ヒルベルトの教導を受けていた学生だったガブリエル・スーダンとヴィルヘルム・アッカーマンは、計算の基礎を研究していた。
スーダンとアッカーマンの双方が全域計算可能関数(いくつかの参考文献では単純に "再帰的"と呼ばれる)でありながら原始再帰的でない関数の発見に功績が有ったと信じられている[2]。
スーダンがあまり知られていないスーダン関数を公表し独立した後、1928年アッカーマンは自分の生み出した関数 (ギリシャ文字のファイ)を公表する。その関数は3つの引数を必要とし の様に表記された。[3]
1926年ダフィット・ヒルベルトは、すべての計算可能関数が 原始再帰的であると仮定していた。簡単に言えば、これは、コンピューターで計算できる各関数をいくつかの非常に単純なルールからまとめて、計算の期間を事前に推定できることを意味する。実際にこれは人々が利用するほとんどの関数に適用出来るが、2人の研究はそれを覆した。
ダフィット・ヒルベルトはアッカーマン関数が原始再帰的では無いと仮定したが、この仮説は彼の個人秘書となっていたアッカーマンによって実際に証明され、ヒルベルトの執筆した実数の論文上に掲載された。[3][4]
多くの数学者に愛用される事になった2変数形式に単純化されたアッカーマン関数は、1935年ペーテル・ロージャによって開発された[5]。
概念編集
という列を想定すると、その全ての項は b 個の a で演算を b − 1 回繰り返すことで、次項に変換される。(例えば第一項 で行われた加算を b 個の a の b − 1 個間全てで行うと、第二項 と等価になる。)
- 例: 上記の列に を代入すると、6, 8, 16, 65536, (65536階立の指数タワー) , ... という数列となる。第5項目の数はすでに、宇宙のすべての原子の推定数よりもはるかに大きい。
アッカーマン関数の背後には、この考え方があると思うべきである。オリジナルのアッカーマン関数 は、以下のリストを満たす関数である:
アッカーマン関数の値の表編集
アッカーマン関数の計算は、無限の表を使った手順に言い換えることができる。まず、一番上の列に自然数を1から順番に並べる。表の値を決めるためは、すぐ左の値を見て、一つ上の列でその順番の値を取る。もし左に数値がない場合は、単に一つ上の列のカラム 1 (n = 1) の数値を取る。
m\n | 0 | 1 | 2 | 3 | 4 | n |
---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | n+1 |
1 | A(0, 1) | A(0, A(1, 0)) | A(0, A(1, 1)) | A(0, A(1, 2)) | A(0, A(1, 3)) | A(0, A(1, n-1)) |
2 | A(1, 1) | A(1, A(2, 0)) | A(1, A(2, 1)) | A(1, A(2, 2)) | A(1, A(2, 3)) | A(1, A(2, n-1)) |
3 | A(2, 1) | A(2, A(3, 0)) | A(2, A(3, 1)) | A(2, A(3, 2)) | A(2, A(3, 3)) | A(2, A(3, n-1)) |
︙ | ︙ | ︙ | ︙ | ︙ | ︙ |
︙ |
計算できる範囲で具体的な数値に置き換えていくと、表は次のようになる。
m\n | 0 | 1 | 2 | 3 | 4 | n |
---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | n + 1 |
1 | 2 | 3 | 4 | 5 | 6 | n + 2 = 2 + (n + 3) - 3 |
2 | 3 | 5 | 7 | 9 | 11 | |
3 | 5 | 13 | 29 | 61 | 125 | |
4 | 13 | 65533 | ||||
5 | 65533 |
|
一般の値は非常に大きいが、クヌースの矢印表記、コンウェイのチェーン表記、ハイパー演算子等を使えば
と簡潔に表す事が出来る。
十分にxの値を大きくしたとき、アッカーマン関数の値は急増加関数で ( は定数)と近似できる。
逆アッカーマン関数編集
自然数nに対して を満たすようなmを取り、 として関数αを定義する。この関数を逆アッカーマン関数という。このとき定義から逆アッカーマン関数は全域かつ上界を持たないが、その値は非常にゆっくりと大きくなる。
Tarjanの1975年の論文において提唱された素集合データ構造の探索および結合アルゴリズムについて、その計算量が で見積もられた[6]。
逆アッカーマン関数は原始再帰関数である。
多変数アッカーマン関数編集
2ちゃんねるの巨大数探索スレッドにおいて、アッカーマン関数を多変数に拡張した多変数アッカーマン関数が定義された。
定義編集
多変数関数 を以下のように定義する。
- ( 以上の任意の整数, 個以上の , 個以上の 以上の整数)[7]
この関数は、本質的には通常のアッカーマン関数に: のルールが追加されただけで、あとの3行は通常のアッカーマン関数の前に飾りが付いただけのものである。
この関数は 変数関数 が急増加関数で 程度の強さとなる。これは配列表記(非拡張)と同じくらいの強さであり、3変数でコンウェイのチェーン表記レベル、4変数でピーター・ハーフォードによる拡張チェーン表記(あるいは回転矢印表記)レベルの巨大数となり、5変数以上になるとそのレベルを超える。この関数は日本ではコンウェイのチェーン表記レベルを超える巨大数の表記法として最も主流となっている[要検証 ]。
配列表記と多変数アッカーマン関数の間には近似関係があり、次のような式で表される。まず、配列表記の2変数目が2の場合は、
次に、配列表記の2変数目が3以上の場合は、
- (括弧はa-1重)
ただし、配列表記では先頭が1ならその値は1に、4変数以上で先頭が2ならば、2変数目が1であれば2、2変数目が1でなければ4になってしまうし、更に配列表記では0も要素として使えないので、多変数アッカーマン関数においてnが2以下の場合はこの近似式は直接適用できない。
配列表記と多変数アッカーマン関数を比較すると、両者には次のような違いがあるが、最終的な振る舞いや特徴は似ている。
- 配列表記では 1 が最小の数だが、多変数アッカーマンでは 0 が最小の数となっている。
- 数を並べる順番が左右逆になっている。配列表記では右の数の方が数を大きくする効果が大きく、多変数アッカーマンではその逆である。
- 配列表記では末尾が1になるとそれが消えるが、多変数アッカーマン関数では先頭が0になると実質的にそれが消える。
- 配列表記は {a,b} = ab の 2 変数関数が基本となり、多変数アッカーマンは A(a) = a+1 の 1 変数関数(後者関数)が基本となっている。
- 配列表記では {a,b,1,…,1,c,d…,n} ={a,a,a,…,{a,b−1,1,…,1,c,d, …,n},c−1,d,…,n}と、前の数が全部 a に変わる。多変数アッカーマンでは A(N,b+1,0,M,a) = A(N,b,a,M,a)と、1つ右の数だけ変わる。
特に最後の点がだいぶ違うように見えるが、多変数アッカーマン関数でも A(2,0,0,0,0,5) = A(1,5,0,0,0,5) = A(1,4,5,0,0,5) = A(1,4,4,5,0,5) = A(1,4,4,4,5,5) のように、結局は1つずつ数が変わっていくので、本質的にはそれほど変わらない。
また、多変数アッカーマン関数を更に拡張したものとして、「2重リストアッカーマン関数」や、「多重リストアッカーマン関数」といったものも考えられている。
関連項目編集
脚注編集
- ^ 『岩波数学辞典第4版』日本数学会、岩波書店、2007年、1、334頁。ISBN 978-4000803090。
- ^ Cristian Calude, Solomon Marcus and Ionel Tevy (November 1979). “The first example of a recursive function which is not primitive recursive”. Historia Math. 6 (4): 380?84. doi:10.1016/0315-0860(79)90024-7.
- ^ a b Wilhelm Ackermann (1928). “Zum Hilbertschen Aufbau der reellen Zahlen”. Mathematische Annalen 99: 118?133. doi:10.1007/BF01459088 .
- ^ von Heijenoort. From Frege To Godel Archived May 4, 2008, at the Wayback Machine., 1967.
- ^ Raphael M. Robinson (1948). “Recursion and Double Recursion”. アメリカ数学会紀要 54 (10): 987?93. doi:10.1090/S0002-9904-1948-09121-2 .
- ^ Tarjan, Robert Endre (1975-04-01). “Efficiency of a Good But Not Linear Set Union Algorithm”. Journal of the ACM 22 (2): 215–225. doi:10.1145/321879.321884. ISSN 0004-5411 .
- ^ フィッシュ『巨大数論 第2版』インプレス R&D、東京、2017年、81-82頁。ISBN 9784802093194。
参考文献編集
- Y. Sundblad: The Ackermann Function. A theoretical, computational, and formulamanipulative study. BIT 11, 107–119 (1971)
- 竹内外史『数学基礎論の世界 ロジックの雑記帳から』日本評論社、1972年、ISBN 4-535-78126-5
- マイケル・シプサー著、『計算理論の基礎』太田和夫・田中圭介 監訳, 共立出版。原著: "Introduction to the Theory of Computation" (Michael Sipser, Thomson Course Technology)
外部リンク編集
- Weisstein, Eric W. "Ackermann Function." From MathWorld. (英語)