这是一个定义在复数底,高为实数的超-4运算(或者说迭代幂次运算,幂塔函数):
(*原作者Andrew Robbins*)
TetratePrepare[n_Integer, x_] := {x, LinearSolve[
Table[k^j/k! - If[j == k, Log[x]^-k, 0], {j, 0, n - 1}, {k, 1, n}],
Table[If[k == 1, 1, 0], {k, 1, n}]]}
(*产生高度为(-1,0]的实数的时候的特征信息,n为微分精度,x为底*)
SuperLog[v_, z_?NumericQ] :=
Block[{(*SlogCrit*)},
SlogCrit[zc_] := -1 + Sum[v[[2, k]]*zc^k/k!, {k, 1, Length[v[[2]]]}];
Which[z <= 0, SlogCrit[v[[1]]^z] - 1, 0 < z <= 1, SlogCrit[z],
z > 1, Block[{i = -1},
SlogCrit[NestWhile[Log[v[[1]], #] &, z, (i++; # > 1) &]] + i]]]
(*幂塔函数的反函数.使用方法为SuperLog[TetratePrepare[精度,底],高]*)
Tetrate[v_, y_?NumericQ] :=
Block[{(*SlogCrit,TetCrit*)},
SlogCrit[zc_] := -1 + Sum[v[[2, k]]*zc^k/k!, {k, 1, Length[v[[2]]]}];
TetCrit[yc_] := FindRoot[SlogCrit[z] == yc, {z, 1}][[1, 2]];
If[y > -1,
Nest[Power[v[[1]], #] &, TetCrit[y - Ceiling[y]], Ceiling[y]],
Nest[Log[v[[1]], #] &, TetCrit[y - Ceiling[y]], -Ceiling[y]]]]
(*幂塔函数.使用方法为Tetrate[TetratePrepare[精度,底],高]*)
可以看到这个定义是依照可微性定义的,n决定这个函数可以做多少次微分之后依然连续,当n无穷大的时候便是所需要的无穷可微,但是这个定义的阻碍也是在于此:当需要的输出精度提升一点时,TetratePrepare的n就需要比较大的上升,然而n的上升将严重影响到整个函数的性能。(6位有效数字左右的输出,n大于150才准确)
====================================================================================
精度对照表:
定义幂塔运算符为:(n->∞,h为高,a为底,书写的不标准什么的不要在意)
那么有精度表:
明显可见精度n的增加会随着h和a的增加而增加。
对于5位有效数字,本表的例子需要n在8,20,30,70不等;
6位需要n在30,50,90不等;
7位需要n在130左右;
8位140~150以上。
现在来测速,令h=a=E:
In[257]:= NumberForm[Tetrate[TetratePrepare[30,E],E],16]//AbsoluteTiming
NumberForm[Tetrate[TetratePrepare[50,E],E],16]//AbsoluteTiming
NumberForm[Tetrate[TetratePrepare[130,E],E],16]//AbsoluteTiming
NumberForm[Tetrate[TetratePrepare[140,E],E],16]//AbsoluteTiming
NumberForm[Tetrate[TetratePrepare[200,E],E],16]//AbsoluteTiming
NumberForm[Tetrate[TetratePrepare[233,E],E],16]//AbsoluteTiming
NumberForm[Tetrate[TetratePrepare[250,E],E],16]//AbsoluteTiming
NumberForm[Tetrate[TetratePrepare[314,E],E],16]//AbsoluteTiming
NumberForm[Tetrate[TetratePrepare[350,E],E],16]//AbsoluteTiming
NumberForm[Tetrate[TetratePrepare[400,E],E],16]//AbsoluteTiming
NumberForm[Tetrate[TetratePrepare[444,E],E],16]//AbsoluteTiming
Out[257]= {0.0144852,2075.998583292668}
Out[258]= {0.123252,2075.968983446195}
Out[259]= {2.04883,2075.968051571146}
Out[260]= {2.90037,2075.968108549399}
Out[261]= {22.7724,2075.968255391066}
Out[262]= {43.2987,2075.968287381941}
Out[263]= {54.9554,2075.968297523795}
Out[264]= {199.563,2075.968318425804}
Out[265]= {326.491,2075.968323984475}
Out[266]= {673.932,2075.968328436254}
Out[267]= {1281.27,2075.968330769448}
恩打脸打得好爽。。。n=140有个屁8位有效数字。差不多n=350才有8位有效数字,320+可以说慢到可以了
===================================================================
更新问题:
1.能不能用mma的命令求出Tetrate[TetratePrepare[n,a],h](其中n为给定的一个充分大的数)的级数展开形式?(这可是个正二八经的二元函数)
2.能不能优化/编译/并行化Tetrate[TetratePrepare[n,a],h]这个函数?