对于
k
k
k个
x
x
x相加,可以表示成
k
x
kx
kx,由此衍生出更高级的乘法运算;对于
k
k
k个
x
x
x相乘,可以表示成
x
k
x^k
xk,由此衍生出更高级的乘方运算。对于
k
k
k个
x
x
x的乘方,即
x
x
x
.
.
.
x
x^{x^{x^{.^{.^{.^x}}}}}
xxx...x,没有相应的表示方法。虽然我们可以给相应的定义,比如
x
k
x_k
xk,但是这样就会又出现新的高级运算,比如
x
x
x
.
.
.
x
x_{x_{x_{._{._{._x}}}}}
xxx...x,这样下去无穷尽,显得定义没有了意义。
事实上我们可以把它变得有意义,即通过某种方法,表示任意级的运算。我们可以定义加法为0级运算,乘法为1级运算,乘方为2级运算,以此类推。观察上例运算,可以发现每个运算都带有前面的系数
k
k
k,因此我们得到下面定义:
定义1
A
s
,
k
A_{s,k}
As,k表示
s
s
s级运算,运算的系数为
k
k
k。
定义2
A
(
s
,
k
,
x
)
A(s,k,x)
A(s,k,x)表示将
A
s
,
k
A_{s,k}
As,k作用到
x
x
x上,即
A
(
s
,
k
,
x
)
A
s
,
k
(
x
)
A(s,k,x)A_{s,k}(x)
A(s,k,x)As,k(x)
例1
A
(
3
,
3
,
x
)
=
x
3
=
x
x
x
A(3,3,x)=x_3=x^{x^x}
A(3,3,x)=x3=xxx
接下来的问题就是如何计算了。
我们可以确定的是,
A
s
,
k
A_{s,k}
As,k是右结合的。那么我们就可以在计算时做一些推导。如例1,
A
(
3
,
3
,
x
)
=
x
3
=
x
x
x
=
x
(
x
x
)
=
x
x
2
=
x
A
(
3
,
2
,
x
)
=
A
(
2
,
A
(
3
,
2
,
x
)
,
x
)
\begin{aligned} A(3,3,x) &= x_3 \\ &=x^{x^x} \\ &=x^{(x^x)} \\ &=x^{x_2} \\ &=x^{A(3,2,x)} \\ &=A(2,A(3,2,x),x) \end{aligned}
A(3,3,x)=x3=xxx=x(xx)=xx2=xA(3,2,x)=A(2,A(3,2,x),x)
以此类推可得
A
(
s
,
k
,
x
)
=
A
(
s
−
1
,
A
(
s
,
k
−
1
,
x
)
,
x
)
A(s,k,x) = A(s-1, A(s,k-1,x),x)
A(s,k,x)=A(s−1,A(s,k−1,x),x)
这样对于任何的运算,都可以通过此公式递推化简。为得到答案,还需要一些初始条件。
A
(
0
,
k
,
x
)
=
x
+
k
A
(
s
,
1
,
x
)
=
x
\begin{aligned} & A(0,k,x)=x+k \\ & A(s,1,x)=x \end{aligned}
A(0,k,x)=x+kA(s,1,x)=x
接下来就可以通过计算机计算得到任意级的计算结果了。
def A(s,k,x):
if k==1: return x
if s==0: return x+k
if s==1: return k*x #乘法已经有了优化,不需要在这里分解成加法
return A(s-1,A(s,k-1,x),x)
x = 3
print("%d"%(x**(x**x))) # output: 7625597484987
print("%d"%(A(3,3,x))) # output: 7625597484987