見出し画像

非整数におけるテトレーションの定義について

巨大数論におけるテトレーションとは

読者の皆さんは巨大数論をご存じでしょうか?巨大数論とは、通常の演算子である和(Adition, +)、積(Multiplication, ×, *)、べき(Exponentiation, ^, **, ↑)では表すことのない超巨大な数を扱う数学の一分野ですが、他の数学分野とは異なり主にアマチュア数学家の間で議論されて議論されてきた分野です。日本ではフィッシュ氏のふぃっしゅ数ver1-7が有名です。

巨大数というと、多くの読者は9をたくさん並べて99999….としてみたり、或いは無量大数やグーゴル、或いは不可説不可説転なんてものを聴いたことのある人もいるかもしれません。しかしこれらは指数関数を用いるとそれぞれ$${10^{68}, 10^{100}, 10^{7\times2^{122}}}$$と表示できてしまいます。これらの数が小さいわけではなく、無量大数やグーゴルはいわゆる「天文学的な」巨大数ですし、特に不可説不可説転などというのは
$${10^{37218383881977644441306597687849648128}\simeq 10^{3.7\times10^{37}}}$$
という、天文学でも見かけないほどの信じがたいほど巨大な数なのですが、それほどに指数関数が巨大な数を扱えるということなのですが、テトレーションはこれらの関数でも扱えない数、例えば

$$
2^{2^{2^{2^{2^{\cdots}}}}}
$$

などを表記するときに用いられます。

テトレーション(Tetration)とは、和(+)、積(×)、冪(^)に続く4番目の演算子で、日本語では超冪ちょうべきと訳されることがありますが、4を意味する接頭辞tetr-に-ationを付けた形です。これは単純な演算子で、ちょうど

$${\underbrace{a+a+\dots +a}_{\text{b}}=a\times b}$$
$${\underbrace{a\times a\times \dots +a}_{\text{b}}=a^b}$$

と示されるように、これを

$${\underbrace{a^{a^{\cdots^a}}}_{\text{b}}={}^ba}$$

と拡張したものです。ここで、矢印記号を用いると
$${a^b=a\uparrow b, {}^ba=a\uparrow\uparrow b}$$

と表現できます。つまり、テトレーションは$${\uparrow\uparrow}$$で表される演算子です。ここでは必要に応じて表示方法は切り替えたいと思います。

しかし今日は巨大数についての話はしません。(しません、というより、正確には、残念ながら私には巨大数論の新しい分野を切り開くような発見はできませんでした)

テトレーションの未定義問題

テトレーションの連続関数化については巨大数wikiにこのような議論があります。

こちらでは、あくまでテトレーションを巨大数の大きさを表示する道具として扱う目的ですので、以下のように簡便に定義が為されています。

$$
{}^{x}a=\begin{cases}  \log_a(^{x+1}a) & x\le 1 \\ 1+x & -1<x\le 0 \\ a^{\left(^{x-1}a\right)} & 0<x \end{cases}
$$

しかし、この定義はいかにも恣意的で、もちろんx<0とx>1の領域の定義に異議はないのですが、$${0\le x\le 1}$$においてただの直線になっています。これは確かに計算はしやすいですが、全く数学的な意義のない表現だと思います。

英語版wikipediaのtetrationの項目を見ると、超根(super root)という概念があり、この一例として、

$$
{}^{\frac{11}{4}}2={}^{2+\frac{3}{4}}2=2^{2^{{}^{\frac{3}{4}}2}}
\\
{}^\frac{3}{4}2={}^3({}^\frac{1}{4}2)={({}^\frac{1}{4}2)}^{({{}^\frac{1}{4}2)}^{({}^\frac{1}{4}2)}}
\\
{}^\frac{1}{4}2=x\iff {}^4({}^\frac{1}{4}2)=2={}^4x=x^{x^{x^x}}
$$

の場合が挙げられています。この$${{}^\frac{1}{4}2=\sqrt[4]{2}_s}$$の部分が超根(super-root)です。この具体例としてwikipediaには、$${\sqrt[4]{2}_s=1.4466…}$$の例が挙げられています。

解析解は以下の二つの場合でのみ求められます。ランベルトのW関数を用いて、

$$
f(z)=ze^z\\
\iff z=f^{-1}(ze^z)=W(ze^z)
$$

ここで$${z=\ln x}$$を代入して、

$$
\iff \ln x=W(\ln x\cdot e^{\ln x})=W(x\ln x)=W(\ln x^x) \\
\iff x=e^{W(\ln x^x)}
$$

であることから、

$$
{}^1x=\alpha \iff x=\alpha
\\
{}^2x=\alpha \iff x^x=\alpha \iff x=e^{W(\ln \alpha)}
$$

となります。しかし、(私の理解が正しければ)$${3\le n }$$においては解析解はないはずです。

そのため、ChatGPTを使って、tetration関数並びに二分法で数値解を求めるプログラムを作り検証することにしました。

 #Python  3.10

def tetration(a, b):
    if b == 0:
        return 1
    if b == 1:
        return a
    else:
        return a ** tetration(a, b - 1)

def bisection_method(f, a, b, tolerance=0.0001, max_iterations=100):
    """
    2分法を使用して方程式 f(x) = 0 の解を見つける

    :param f: 方程式の関数
    :param a: 探索範囲の下限
    :param b: 探索範囲の上限
    :param tolerance: 許容誤差(オプション)
    :param max_iterations: 最大反復回数(オプション)
    :return: 解の近似値
    """

    # 反復回数と初期の解の値を初期化
    iteration = 0
    x = (a + b) / 2

    while abs(f(x)) > tolerance and iteration < max_iterations:
        if f(a) * f(x) < 0:
            b = x
        else:
            a = x

        # 解の値を更新
        x = (a + b) / 2
        iteration += 1

    return x

print("a↑↑b=cとなるaを計算します。")
print("言い換えると、a=c↑↑(1/b)、つまりcのb乗超根b_√c_sを求めます。")
print("cには常識的な範囲の実数を入力してください。")
print("https://en.wikipedia.org/wiki/Tetration#Extension_to_real_heights")
while True:
    b = int(input("b: "))
    c = int(input("求める数c: "))

    # 方程式の関数の例
    def equation(x, b=b, c=c):
        return tetration(x, b) - c

    try:
        if c == 1:
            solution = 1
        elif b == 2:
            solution = bisection_method(equation, 0, 50)
        elif b == 3:
            solution = bisection_method(equation, 0, 4)
        elif b == 4:
            solution = bisection_method(equation, 0, 2.5)
        elif b == 5:
            solution = bisection_method(equation, 0, 2.05)
        elif b == 6:
            solution = bisection_method(equation, 0, 1.85)
        elif b == 7:
            solution = bisection_method(equation, 0, 1.68)
        elif b == 8:
            solution = bisection_method(equation, 0, 1.65)
        elif b == 9:
            solution = bisection_method(equation, 0, 1.58)
        elif b >= 10:
            solution = bisection_method(equation, 0, 1.55)
        print(f"a={solution}")
    except OverflowError:
        print("OverFlow")

このプログラムは、$${{}^ba=a \uparrow\uparrow b=c}$$においてb, cの値を入力することで、$${\sqrt[b]{c}_s={}^\frac{1}{b}c}$$を得るプログラムです。これを用いて計算していくと、例えば、

b,cの値における超根の値

のようになるのですが、
$${(\sqrt[4]{2}_s)^2=1.7059…}$$
$${\sqrt[2]{2}_s=1.5596…}$$
となり、結果が一致しません。

実を言えば、冪においては四則演算が成り立ちます。
$${x^a\times x^b=x^{a+b}, (x^a)^b=x^{a\times b}}$$
という具合です。しかし、超冪においては、

$$
({}^ba)^{({}^ca)}=({}^{c+1}a)^{({}^{b-1}a)}
$$

しか成り立ちません。そのようなわけで、テトレーションの連続関数化については数学者の間で一定の見解が得られていません。特に誰のためにもならない記事でした。

参考

画像は以下から使わせていただきました。


この記事が気に入ったらサポートをしてみませんか?