竹内たけうち関数かんすう

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』

竹内たけうち関数かんすう(たけうちかんすう)は、プログラミング言語げんご処理しょりけいベンチマークなどに使つかわれる、再帰さいきてき定義ていぎされた関数かんすうである。

概要がいよう[編集へんしゅう]

再帰さいきてき定義ていぎされる、3引数ひきすう x, y, z をとるつぎのような関数かんすうである。

とくわるところいがLispはん[1]参照さんしょうのこと。定義ていぎからわかるように処理しょり次々つぎつぎたらいまわにしていくことから、たらいまわし関数かんすう[2]たらい関数かんすう (Tarai function) ともばれる(後述こうじゅつのマッカーシーばんとの混同こんどうけるためこのばれることのほうがおおいが、こちらの定義ていぎのほうがオリジナルである。マッカーシーばんとくにTak関数かんすうとして区別くべつする場合ばあいもある)。電電でんでん公社こうしゃ研究けんきゅういん当時とうじ)の竹内たけうち郁雄いくおが、1974ねんなつまえころ後述こうじゅつするような特性とくせいのある関数かんすうをあれこれかんがえていた、ある午前ごぜんおもいついたものである[3]竹内たけうち関数かんすう命名めいめいしたのは野崎のさき昭弘あきひろである[4]

特性とくせいとして、のよくベンチマークに使つかわれる関数かんすう比較ひかくして、たとえばフィボナッチすうなん工夫くふうもなく計算けいさんするいわゆるダム(dumb)フィボナッチと比較ひかくして、計算けいさんりょうやしても、たいしておおきなかず計算けいさん必要ひつようない(ワードちょう整数せいすう演算えんざんさえ実装じっそうしていれば十分じゅうぶん)、再帰さいきがたいしてふかくならない(たいしたりょうのスタックを使つかえなくても十分じゅうぶん)、といったものがある。このためベンチマークとしては、その処理しょりけい関数かんすうし(ともどり)のオーバーヘッド集中しゅうちゅうして結果けっかること、メモリのすくないハードウェアや多倍たばいちょう計算けいさんがまだ処理しょりけいなどのような実験じっけんてき環境かんきょうでも実装じっそう測定そくていできること、といった特徴とくちょうがある。

マッカーシーばん[編集へんしゅう]

ジョン・マッカーシー竹内たけうち関数かんすう記憶きおくちがいで[5] zかえすように変更へんこうし、これがTak関数かんすうとしてひろまった。以下いかがその定義ていぎである。

計算けいさんりょうはずっとすくない(たとえば tarai(12, 6, 0) では 12,604,860 かい tarai がばれるのにたいし、 tak(12, 6, 0) では tak は 63,608 かいしかばれない)。

本質ほんしつ[編集へんしゅう]

竹内たけうち関数かんすう出力しゅつりょく以下いかのものと同等どうとうである。

ドナルド・クヌースによる研究けんきゅうが、Textbook Examples of Recursion(1990)にある。

高速こうそく[編集へんしゅう]

竹内たけうち関数かんすう高速こうそくするには、関数かんすうしのコストをちいさくする、というまっとうな手法しゅほうと、計算けいさん必要ひつようになるまでやらない(引数ひきすうのx, y, zの実際じっさい必要ひつようなのは、関数かんすうでなくifの評価ひょうかで、しかもつね全部ぜんぶ必要ひつようとしない)か、一度いちどやった計算けいさん結果けっかさい利用りようするかして、計算けいさんりょう自体じたい削減さくげんする(当然とうぜん非常ひじょうはやい。ベンチマークとしては一種いっしゅのチートとえなくもない)手法しゅほうとがあり、後者こうしゃにはつぎのような手法しゅほうがある。

メモ
一度いちど計算けいさんしたおぼえておき、つぎしではその使つかう。
遅延ちえん評価ひょうか
クロージャなどを利用りようして、関数かんすうしの計算けいさんよりまえ引数ひきすう計算けいさんすること(先行せんこう評価ひょうか)をしない(ただし、クロージャ生成せいせいのコストがかかる)。原則げんそくとして遅延ちえん評価ひょうかする言語げんごであるHaskellでは定義ていぎそのままで非常ひじょうはやい。ほかにもScalaなど遅延ちえん評価ひょうか対応たいおうした言語げんごにおいては、簡単かんたんに、非常ひじょう高速こうそく評価ひょうかわるコードを作成さくせいできる。

マッカーシーばんは、メモでは同様どうようはやい。しかし、マッカーシーばんをHaskellなどでそのままの定義ていぎ遅延ちえん評価ひょうかした場合ばあいは、高速こうそくにならない(遅延ちえん評価ひょうかでは計算けいさんりょうらない)、というちがいがある。これはすこ動作どうさいかけてかんがえてみるとわかるが、本物ほんものでは z のをたらいまわしした挙句あげく結局けっきょく使つかっていない(ててしまっている)ため、遅延ちえん評価ひょうかではその計算けいさんがごっそりおこなわれなくなるからである。マッカーシーばんでは z をかえしているため結局けっきょくその必要ひつようになっている、というちがいになっている。先行せんこう評価ひょうかによる tarai(n, 0, n+1) の計算けいさん全体ぜんたいにおいて「さもなくば」のがわ評価ひょうかされる回数かいすうをTakeuchi Numberと[6]

感覚かんかく[編集へんしゅう]

数値すうちデータとう視覚しかく聴覚ちょうかくでとらえられるようにすることがあるが(視覚しかく場合ばあい可視かしという)、竹内たけうち関数かんすう引数ひきすう音階おんかいり、3引数ひきすう和音わおんのようなおとにしたこころみがある[7]

参照さんしょう[編集へんしゅう]

  1. ^ https://www.nue.org/nue/index.html#tak-function 2023ねん9がつ1にち閲覧えつらん
  2. ^ 奥村おくむら晴彦はるひこ『C言語げんごによる最新さいしんアルゴリズム事典じてん技術評論社ぎじゅつひょうろんしゃ、1991ねん、185ぺーじISBN 4-87408-414-1 
  3. ^ 竹内たけうち 郁雄いくお. “ハッカーの遺言ゆいごんじょう──竹内たけうち郁雄いくお徒然つれづれこけだい18かい問題児もんだいじわるくない”. サイボウズしき. 2016ねん3がつ7にち閲覧えつらん
  4. ^ 野崎のさき昭弘あきひろ (1984). 計算けいさん数学すうがく. 共立きょうりつ出版しゅっぱん 
  5. ^ 竹内たけうち郁雄いくお. “どうころんでもLisp”. p. 12. 2006ねん12月11にち時点じてんオリジナルよりアーカイブ。2007ねん10がつ4にち閲覧えつらん
  6. ^ Weisstein, Eric W.. “Takeuchi Number” (英語えいご). mathworld.wolfram.com. 2015ねん6がつ22にち閲覧えつらん
  7. ^ aike. “竹内たけうち関数かんすう音楽おんがく生成せいせい”. aike’s blog. 2011ねん11月15にち閲覧えつらん

関連かんれん項目こうもく[編集へんしゅう]

外部がいぶリンク[編集へんしゅう]