fork(1) download
  1. <?php
  2.  
  3. class Fish
  4. {
  5. protected function B($m, $n, $f)
  6. {
  7. if ($m == 0) {
  8. // B(0, n) = f(n)
  9. return $f($n);
  10. } else if ($n == 0) {
  11. // B(m+1, 0) = B(m, 1)
  12. return $this->B($m - 1, 1, $f);
  13. } else {
  14. // B(m+1, n+1) = B(m, B(m+1, n))
  15. return $this->B($m - 1, $this->B($m, $n - 1, $f), $f);
  16. }
  17. }
  18.  
  19. protected function g($f)
  20. {
  21. // g(x) = B(x, x)
  22. return function ($x) use ($f) {
  23. return $this->B($x, $x, $f);
  24. };
  25. }
  26.  
  27. /**
  28.   * S 変換
  29.   * S(m, f(x)) = (g(m), g(x))
  30.   * 自然数と関数のペアから、
  31.   * 自然数と関数のペアへの写像 S を定義。
  32.   */
  33. public function S()
  34. {
  35. return function ($m, $f) {
  36. $g = $this->g($f);
  37. return [$g($m), $g];
  38. };
  39. }
  40.  
  41. /**
  42.   * S2 (SS変換の一部)
  43.   * S^f(m) を定義。
  44.   */
  45. protected function S2($S)
  46. {
  47. return function ($m, $f) use ($S) {
  48. foreach (range(1, $f($m)) as $i) {
  49. list($m, $f) = $S($m, $f);
  50. }
  51. };
  52. }
  53.  
  54. /**
  55.   * SS 変換
  56.   * SS(m, f, S) = (S^f(m)[m, f], S^f(m))
  57.   * 自然数、関数、変換の組から、
  58.   * 同様の組を生み出す写像 SS を定義。
  59.   *
  60.   * @param $m int 自然数
  61.   * @param $f Closure 関数
  62.   * @param $S Closure 変換
  63.   * @return array (
  64.   * $n int 自然数
  65.   * $g Closure 関数
  66.   * $S2 Closure 変換
  67.   * )
  68.   */
  69. public function SS($m, $f, $S)
  70. {
  71. $S2 = $this->S2($S);
  72. list($n, $g) = $S2($m, $f);
  73. return [$n, $g, $S2];
  74. }
  75. }
  76.  
  77. /**
  78.  * ふぃっしゅ数 バージョン 1
  79.  *
  80.  * $m = 0
  81.  * $f = $x + 1
  82.  * $S = S 変換
  83.  *
  84.  * 初期値を上記の通り設定した上で、
  85.  * SS 変換を 63 回行った後の、
  86.  * 第 1 成分をふぃっしゅ数バージョン 1、
  87.  * 第 2 成分をふぃっしゅ関数バージョン 1
  88.  * と定義する。
  89.  */
  90. $fish = new Fish();
  91.  
  92. $m = 3;
  93. $f = function ($x) {
  94. return $x + 1;
  95. };
  96. $S = $fish->S();
  97.  
  98. foreach (range(1, 63) as $i) {
  99. list($m, $f, $S) = $fish->SS($m, $f, $S);
  100. }
  101.  
  102. echo 'ふぃっしゅ数 = ' . $m;
  103.  
Time limit exceeded #stdin #stdout 5s 31084KB
stdin
Standard input is empty
stdout
Standard output is empty