アッカーマン関数

アッカーマン関数(アッカーマンかんすう、: Ackermann function: Ackermannfunktion)とは、非負整数 mn に対し、

によって定義される関数のことである。[1]

与える数が大きくなると爆発的に計算量が大きくなるという特徴があり、性能測定などに用いられることもある。

また、数学的な意味として、原始再帰関数でないμ再帰関数の実例として有名である。これを(再帰呼出しのない手続き型の)プログラミング言語の言葉で言えば、スタックを用いればループを使ってアッカーマン関数を書き表すことができるが、ループだけでは書き表せないということである。

なお、アッカーマン関数のグラフは原始再帰的である。

歴史

1920年代後半、数学者ダフィット・ヒルベルトの教導を受けていた学生だったガブリエル・スーダンヴィルヘルム・アッカーマンは、計算の基礎を研究していた。

スーダンとアッカーマンの双方が全域計算可能関数(いくつかの参考文献では単純に "再帰的"と呼ばれる)でありながら原始再帰的でない関数の発見に功績が有ったと信じられている[2]

スーダンがあまり知られていないスーダン関数を公表し独立した後、1928年アッカーマンは自分の生み出した関数 (ギリシャ文字のファイ)を公表する。その関数は3つの引数を必要とし の様に表記された。[3]

1926年ダフィット・ヒルベルトは、すべての計算可能関数が 原始再帰的であると仮定していた。簡単に言えば、これは、コンピューターで計算できる各関数をいくつかの非常に単純なルールからまとめて、計算の期間を事前に推定できることを意味する。実際にこれは人々が利用するほとんどの関数に適用出来るが、2人の研究はそれを覆した。

ダフィット・ヒルベルトはアッカーマン関数が原始再帰的では無いと仮定したが、この仮説は彼の個人秘書となっていたアッカーマンによって実際に証明され、ヒルベルトの執筆した実数の論文上に掲載された。[3][4]

多くの数学者に愛用される事になった2変数形式に単純化されたアッカーマン関数は、1935年ペーテル・ロージャによって開発された[5]

概念

というを想定すると、その全ての項は b 個の a で演算を b − 1 回繰り返すことで、次項に変換される。(例えば第一項 で行われた加算b 個の ab − 1 個間全てで行うと、第二項 と等価になる。)

: 上記の列に を代入すると、6, 8, 16, 65536, (65536階立の指数タワー) , ... という数列となる。第5項目の数はすでに、宇宙のすべての原子の推定数よりもはるかに大きい。

アッカーマン関数の背後には、この考え方があると思うべきである。オリジナルのアッカーマン関数 は、以下のリストを満たす関数である:

第4行目からは、一般的な演算子では書き表せなくなり、ハイパー演算子など高度で専門的な表記法を必要とする。

アッカーマン関数の値の表

アッカーマン関数の計算は、無限の表を使った手順に言い換えることができる。まず、一番上の列に自然数を順番に並べる。表の値を決めるためは、すぐ左の値を見て、一つ上の列でその順番の値を取る。もし左に数値がない場合は、単に一つ上の列のカラム 1 (n = 1) の数値を取る。表の左上の部分は以下のようになる。

A(m, n) の値
m\n 0 1 2 3 4 n
0 12345
1 23456
2 357911
3 5132961125
4 1365533 265536  3 A(3, A(4, 3)) = 22265536 − 3
5 65533

A(4, A(5, 1)) A(4, A(5, 2))A(4, A(5, 3))
6 A(5, 1)A(5, A(6, 0)) A(5, A(6, 1)) A(5, A(6, 2))A(5, A(6, 3))

再帰的な参照で表示している値は非常に大きいが、クヌースの矢印表記コンウェイのチェーン表記ハイパー演算子等を使えば

と簡潔に表す事が出来る。

以下は、上記のテーブルと同じものであるが、パターンを分かりやすくするため、値を関数定義の表現に置き換えている。

A(m, n) の値
m\n 0 1 2 3 4 n
0 0+11+12+13+14+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))
2 A(1,1)A(1,A(2,0))A(1,A(2,1))A(1,A(2,2))A(1,A(2,3))
3 A(2,1)A(2,A(3,0))A(2,A(3,1))A(2,A(3,2))A(2,A(3,3))
4 A(3,1)A(3,A(4,0))A(3,A(4,1))A(3,A(4,2))A(3,A(4,3))

5 A(4,1)A(4,A(5,0))A(4,A(5,1))A(4,A(5,2))A(4,A(5,3))

6 A(5,1)A(5,A(6,0))A(5,A(6,1))A(5,A(6,2))A(5,A(6,3))

アッカーマン関数は急増加関数(は定数)と近似できる。クヌースの矢印表記と同じくらいの増加速度である。

多変数アッカーマン関数

2ちゃんねるの巨大数探索スレッドにおいて、アッカーマン関数を多変数に拡張した多変数アッカーマン関数が定義された。

定義

多変数関数を以下のように定義する。

(以上の任意の整数, 個以上の, 個以上の以上の整数)[6]

この関数は、本質的には通常のアッカーマン関数に:のルールが追加されただけで、あとの3行は通常のアッカーマン関数の前に飾りが付いただけのものである。

この関数は変数関数で急増加関数で程度の強さとなる。配列表記(非拡張)と同じくらいの強さである。

3変数でコンウェイのチェーン表記レベル、4変数でピーター・ハーフォードによる拡張チェーン表記(あるいは回転矢印表記)レベルの巨大数となり、5変数以上になるとそのレベルを超える。この関数は日本ではコンウェイのチェーン表記レベルを超える巨大数の表記法として最も主流となっている。

この関数でふぃっしゅ数バージョン1はと近似でき、ふぃっしゅ数バージョン2はと近似できる。

この関数では、数の大きさを評価するための重要度は、最も重要なのが変数の数であり、その次に重要なのが最も左側の変数の値で、右側に行くほど重要度が下がっていく。

配列表記と多変数アッカーマン関数の間には近似関係があり、次のような式で表される。まず、配列表記の2変数目が2の場合は、

{n,2,b+1,c+1,d+1,e+1,…}≒A(…,e,d,c,b,n)

次に、配列表記の2変数目が3以上の場合は、

{n,a,b+1,c+1,d+1,e+1,…}≒A(…,e,d,c,b,A(…,e,d,c,b,…A(…,e,d,c,b,n)…))(括弧は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重リストアッカーマン関数」や、「多重リストアッカーマン関数」といったものも考えられている。

関連項目

脚注

  1. 岩波数学辞典第4版』日本数学会岩波書店、2007年、1、334頁。ISBN 978-4000803090。
  2. 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.
  3. Wilhelm Ackermann (1928). “Zum Hilbertschen Aufbau der reellen Zahlen”. Mathematische Annalen 99: 118?133. doi:10.1007/BF01459088. http://gdz.sub.uni-goettingen.de/en/dms/loader/img/?PPN=PPN235181684_0099&DMDID=DMDLOG_0009.
  4. von Heijenoort. From Frege To Godel Archived May 4, 2008, at the Wayback Machine., 1967.
  5. Raphael M. Robinson (1948). “Recursion and Double Recursion”. アメリカ数学会紀要 54 (10): 987?93. doi:10.1090/S0002-9904-1948-09121-2. http://projecteuclid.org/DPubS?verb=Display&version=1.0&service=UI&handle=euclid.bams/1183512393&page=record.
  6. フィッシュ『巨大数論 第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)

外部リンク

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.