<?php
class Fish
{
protected function B($m, $n, $f)
{
if ($m == 0) {
// B(0, n) = f(n)
return $f($n);
} else if ($n == 0) {
// B(m+1, 0) = B(m, 1)
return $this->B($m - 1, 1, $f);
} else {
// B(m+1, n+1) = B(m, B(m+1, n))
return $this->B($m - 1, $this->B($m, $n - 1, $f), $f);
}
}
protected function g($f)
{
// g(x) = B(x, x)
return function ($x) use ($f) {
return $this->B($x, $x, $f);
};
}
/**
* S 変換
* S(m, f(x)) = (g(m), g(x))
* 自然数と関数のペアから、
* 自然数と関数のペアへの写像 S を定義。
*/
public function S()
{
return function ($m, $f) {
$g = $this->g($f);
return [$g($m), $g];
};
}
/**
* S2 (SS変換の一部)
* S^f(m) を定義。
*/
protected function S2($S)
{
return function ($m, $f) use ($S) {
foreach (range(1, $f($m)) as $i) { list($m, $f) = $S($m, $f); }
};
}
/**
* SS 変換
* SS(m, f, S) = (S^f(m)[m, f], S^f(m))
* 自然数、関数、変換の組から、
* 同様の組を生み出す写像 SS を定義。
*
* @param $m int 自然数
* @param $f Closure 関数
* @param $S Closure 変換
* @return array (
* $n int 自然数
* $g Closure 関数
* $S2 Closure 変換
* )
*/
public function SS($m, $f, $S)
{
$S2 = $this->S2($S);
list($n, $g) = $S2($m, $f); return [$n, $g, $S2];
}
}
/**
* ふぃっしゅ数 バージョン 1
*
* $m = 0
* $f = $x + 1
* $S = S 変換
*
* 初期値を上記の通り設定した上で、
* SS 変換を 63 回行った後の、
* 第 1 成分をふぃっしゅ数バージョン 1、
* 第 2 成分をふぃっしゅ関数バージョン 1
* と定義する。
*/
$fish = new Fish();
$m = 3;
$f = function ($x) {
return $x + 1;
};
$S = $fish->S();
foreach (range(1, 63) as $i) { list($m, $f, $S) = $fish->SS($m, $f, $S); }
echo 'ふぃっしゅ数 = ' . $m;
PD9waHAKCmNsYXNzIEZpc2gKewogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIEIoJG0sICRuLCAkZikKICAgIHsKICAgICAgICBpZiAoJG0gPT0gMCkgewogICAgICAgICAgICAvLyBCKDAsIG4pID0gZihuKQogICAgICAgICAgICByZXR1cm4gJGYoJG4pOwogICAgICAgIH0gZWxzZSBpZiAoJG4gPT0gMCkgewogICAgICAgICAgICAvLyBCKG0rMSwgMCkgPSBCKG0sIDEpCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+QigkbSAtIDEsIDEsICRmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBCKG0rMSwgbisxKSA9IEIobSwgQihtKzEsIG4pKQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPkIoJG0gLSAxLCAkdGhpcy0+QigkbSwgJG4gLSAxLCAkZiksICRmKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnKCRmKQogICAgewogICAgICAgIC8vIGcoeCkgPSBCKHgsIHgpCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgkeCkgdXNlICgkZikgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPkIoJHgsICR4LCAkZik7CiAgICAgICAgfTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTIOWkieaPmwogICAgICogUyhtLCBmKHgpKSA9IChnKG0pLCBnKHgpKQogICAgICog6Ieq54S25pWw44Go6Zai5pWw44Gu44Oa44Ki44GL44KJ44CBCiAgICAgKiDoh6rnhLbmlbDjgajplqLmlbDjga7jg5rjgqLjgbjjga7lhpnlg48gUyDjgpLlrprnvqnjgIIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIFMoKQogICAgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoJG0sICRmKSB7CiAgICAgICAgICAgICRnID0gJHRoaXMtPmcoJGYpOwogICAgICAgICAgICByZXR1cm4gWyRnKCRtKSwgJGddOwogICAgICAgIH07CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUzIgKFNT5aSJ5o+b44Gu5LiA6YOoKQogICAgICogU15mKG0pIOOCkuWumue+qeOAggogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gUzIoJFMpCiAgICB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgkbSwgJGYpIHVzZSAoJFMpIHsKICAgICAgICAgICAgZm9yZWFjaCAocmFuZ2UoMSwgJGYoJG0pKSBhcyAkaSkgewogICAgICAgICAgICAgICAgbGlzdCgkbSwgJGYpID0gJFMoJG0sICRmKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU1Mg5aSJ5o+bCiAgICAgKiBTUyhtLCBmLCBTKSA9IChTXmYobSlbbSwgZl0sIFNeZihtKSkKICAgICAqIOiHqueEtuaVsOOAgemWouaVsOOAgeWkieaPm+OBrue1hOOBi+OCieOAgQogICAgICog5ZCM5qeY44Gu57WE44KS55Sf44G/5Ye644GZ5YaZ5YOPIFNTIOOCkuWumue+qeOAggogICAgICoKICAgICAqIEBwYXJhbSAkbSAgICBpbnQgICAgIOiHqueEtuaVsAogICAgICogQHBhcmFtICRmICAgIENsb3N1cmUg6Zai5pWwCiAgICAgKiBAcGFyYW0gJFMgICAgQ2xvc3VyZSDlpInmj5sKICAgICAqIEByZXR1cm4gYXJyYXkgKAogICAgICogICAgICAkbiAgICAgIGludCAgICAg6Ieq54S25pWwCiAgICAgKiAgICAgICRnICAgICAgQ2xvc3VyZSDplqLmlbAKICAgICAqICAgICAgJFMyICAgICBDbG9zdXJlIOWkieaPmwogICAgICogKQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gU1MoJG0sICRmLCAkUykKICAgIHsKICAgICAgICAkUzIgPSAkdGhpcy0+UzIoJFMpOwogICAgICAgIGxpc3QoJG4sICRnKSA9ICRTMigkbSwgJGYpOwogICAgICAgIHJldHVybiBbJG4sICRnLCAkUzJdOwogICAgfQp9CgovKioKICog44G144GD44Gj44GX44KF5pWwIOODkOODvOOCuOODp+ODsyAxCiAqCiAqICRtID0gMAogKiAkZiA9ICR4ICsgMQogKiAkUyA9IFMg5aSJ5o+bCiAqCiAqIOWIneacn+WApOOCkuS4iuiomOOBrumAmuOCiuioreWumuOBl+OBn+S4iuOBp+OAgQogKiBTUyDlpInmj5vjgpIgNjMg5Zue6KGM44Gj44Gf5b6M44Gu44CBCiAqIOesrCAxIOaIkOWIhuOCkuOBteOBg+OBo+OBl+OCheaVsOODkOODvOOCuOODp+ODsyAx44CBCiAqIOesrCAyIOaIkOWIhuOCkuOBteOBg+OBo+OBl+OChemWouaVsOODkOODvOOCuOODp+ODsyAxCiAqIOOBqOWumue+qeOBmeOCi+OAggogKi8KJGZpc2ggPSBuZXcgRmlzaCgpOwoKJG0gPSAzOwokZiA9IGZ1bmN0aW9uICgkeCkgewogICAgcmV0dXJuICR4ICsgMTsKfTsKJFMgPSAkZmlzaC0+UygpOwoKZm9yZWFjaCAocmFuZ2UoMSwgNjMpIGFzICRpKSB7CiAgICBsaXN0KCRtLCAkZiwgJFMpID0gJGZpc2gtPlNTKCRtLCAkZiwgJFMpOwp9CgplY2hvICfjgbXjgYPjgaPjgZfjgoXmlbAgPSAnIC4gJG07Cg==