如何表示复数的 tetration 函数

xak*_*p35 3 algorithm math glsl fractals complex-numbers

确实存在所谓的超操作序列。它的工作原理就像你a*b=a+a+a+a...+a用许多a重复b次数的加法来构造乘法。然后a^b = a*a*a*a*...*a进行a多次重复乘法的幂运算b。然后,出现tetration,表示为幂的塔,就像a^^b == a^a^a^...^a,重复b次数。

我对如何为浮点数和复数编写此函数感兴趣?

我已经在 glsl 中编写了乘法和幂函数:

// complex multiplication:
vec2 cmul(in vec2 a, in vec2 b) {
    return vec2(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);
}

// complex exponent e^a
vec2 cexp(in vec2 a) {
    float ea = exp(a.x);
    float vl = a.y;
    return ea * vec2( cos(vl), sin(vl) );
}

// complex natural logarithm ln(a)
vec2 cln(in vec2 a) {
    float ql = length(a);
    return vec2( log(ql), atan(a.y, a.x));
}

// complex power function a^b
vec2 cpow(in vec2 a, in vec2 b) {
    return cexp(cmul(cln(a), b));   
}
Run Code Online (Sandbox Code Playgroud)

但后来我被卡住了!我们如何编写ctet(in vec2 a, in vec2 b)tetration 函数,不仅适用于浮点数,还适用于整个复平面本身?

Spe*_*tre 7

好吧,让我们从真正的域整数 开始b

a^^b = a^a^a^a^a...^a  // a is there b times
Run Code Online (Sandbox Code Playgroud)

这可以在C++ 中这样评估:

a^^b = a^a^a^a^a...^a  // a is there b times
Run Code Online (Sandbox Code Playgroud)

因为你已经得到了pow复杂的域,你也可以在那里做同样的事情......为了保持这个简单,我现在不会碰它......

这里有一些结果:

a\b| 1|   2|            3|    4
-------------------------------
 1 | 1|   1|            1|    1
 2 | 2|   4|           16|65536
 3 | 3|  27|7625597484987|
 4 | 4| 256|             |
 5 | 5|3125|             |
Run Code Online (Sandbox Code Playgroud)

顺便提一句。所有这些超级操作都与阿克曼函数有关,您可以在这里找到我在 C++ 中的迭代实现:

然而,由于极快的增长甚至double很快就会超出范围(因此缺失值)......

现在如何移动bReal 域?对此没有代数方法的线索,但几何方法是可能的。

简单地“绘制”a^^b作为变量b和常数的函数,a用于b您想要的实数周围的整数值,b然后使用整数域作为控制点插入实数域 。它类似于获得函数的非整数阶导数。b b

所以,(X,Y)将是你的(a^^b,b)。现在使用任何插值来构造实域函数。

线性插值将如下所示:

y0 = a^^(int(b)) 
y1 = a^^(int(b)+1)
a^^b = y0 + (b-int(b))*(y1-y0)
Run Code Online (Sandbox Code Playgroud)

然而,需要更高阶的插值,并且插值参数也应该缩放到非线性度量。有关更多信息,请参阅:

经过一些详细说明立方体 ( t^3) 和log^2比例证明是足够的(使用我的 128 位浮点f128类的C++ 示例只需将其重命名为double):

double tetration(double a,int b)    // a^^b = a^a^a^a... b times
    {
    double c;
    if (b<=0) return 0;
    for (c=a;b>1;b--) c=pow(a,c);
    return c;
    }
Run Code Online (Sandbox Code Playgroud)

最后的真实预览

这是我与它的比较:

我选择相同的图形基地a距离a^^b,正如你可以看到它是一个很好的搭配范围仅低于1.0是稍微偏离。

让我们开始复杂域分形

现在当你想进入复杂域时,你不能像在 Real 中那样做,因为结果对于插值来说太混乱了。所以我们只能坚持整数b或者使用Kneser算法来计算。

对我们来说幸运的是,有更多的方法可以显示分形......例如,我们可以ba^^b只有a复杂的地方评估整数,并使用结果为输出着色。这里是GLSL示例(基于我的Mandelbrot 着色器和您的复杂数学):

分段:

a\b| 1|   2|            3|    4
-------------------------------
 1 | 1|   1|            1|    1
 2 | 2|   4|           16|65536
 3 | 3|  27|7625597484987|
 4 | 4| 256|             |
 5 | 5|3125|             |
Run Code Online (Sandbox Code Playgroud)

和四分预览:

复杂的预览

这是我比较的:

它匹配我的结果只是反映在两者中 x,y

所以我所做的就是计算a^^100,其中a的片段在屏幕上复杂的结构域位置<-1,+1>有一些panningzooming和呈现从结果构成的彩色...

我还在那里留下了一个测试函数(不是分形),我用来测试从这里获取的着色方法和复杂数学,第一个来自 Wiki,第二个是着色器结果(色轮):

测试功能维基 测试功能矿

你可以像 mandelbrot 或任何其他算法一样进行逃逸测试来显示分形。

这里是 tetration 的着色选项截图(我喜欢灰度) zoom=500.0 pos=-0.188418+0.234466i

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

最后pentation:

在此处输入图片说明 在此处输入图片说明