I tried to implement 4th power burning ship, but was not successful.
The result get distorted beyond e14 already, due to precision issues, in the same way as if I make burning ship or cubic burning ship without laster blaster's abs method...
The real part is straight forward, since it doesn't include any abs (first parentesis is the delta, minus the second from the reference)
double &r = m_db_dxr[antal]; // reference real part
double &i = m_db_dxi[antal]; // reference imaginary part
double dr = (r+Dr); // delta real part
double di = (i+Di); // delta imaginary part
double sdr=dr*dr; // delta real squared
double sdi=di*di; // delta imaginary squared
double sr = r*r; // reference real squared
double si = i*i; // reference imaginary squared
Dnr = (sdr*sdr + sdi*sdi - 6*sdr*sdi) - (sr*sr+si*si-6*sr*si) + dbD0r;
However the imaginary part has the abs, for the delta minus the reference
Here is without laser-blaster's abs method:
Dni = 4*abs(dr*di)*(sdr-sdi) - (4*abs(r*i)*(sr-si)) + dbD0i;
Expanding dr, di, sdr and sdi, and rearranging it to define the abs(c+d)-abs(c) Construction:
Dni = 4*(sr-si)*(abs(r*i + r*Di + Dr*i + Dr*Di) - abs(r*i)) + 4*abs(r*i + r*Di + Dr*i + Dr*Di)*(2*Dr*r+Dr*Dr-2*Di*i-Di*Di) + dbD0i;
In order to be able to use laser blaster's abs method on the first abs:
double c = r*i;
double d = r*Di + Dr*i + Dr*Di;
double abs_value;
if (c>0){
if (c + d>0)
abs_value = d;
else if (d == -c)
abs_value = d;
else if (d<-c)
abs_value = -d - 2 * c;
}
else if (c == 0)
abs_value = _abs(d);
else if (c < 0){
if (c + d>0)
abs_value = d + 2 * c;
else if (d == -c)
abs_value = -d;
else if (d < -c)
abs_value = -d;
}
Dni = 4*(sr-si)*(abs_value) + 4*_abs(r*i + r*Di + Dr*i + Dr*Di)*(2*Dr*r+Dr*Dr-2*Di*i-Di*Di) + dbD0i;
I wanted to say thank you for attempting to render these fractals. I do have one more trick up my sleeve that may or may not work with the 4th order abs fractals.
I won't pretend to understand exactly how the perturbation rendering method works (aside from using deltas to calculate orbits at lower precision), but the burning ship and buffalo fractals (as well as their partial |Zr| and |Zi| variants) can be computed to arbitrary power N.
Since complex Z can be defined as:
Assume complex absolute value is applied separately to the Zr and Zi components.
Burning Ship arbitrary power N:
Buffalo arbitrary power N:
Next, take the standard reduced polynomial 4th power Mandelbrot:
Mandelbrot 4th Order (Reduced Polynomial): Z = Z^4 + C
zi = 4 * zr * zi * (zrsqr - zisqr) + ci;
zr = zrsqr * zrsqr + zisqr * zisqr - 6 * zrsqr * zisqr +cr;
zisqr = zi * zi;
zrsqr = zr * zr;
The above formula uses seven bignum multiply operations (four of which are squares) not counting simple integers. Alternately we can use nested exponents to express higher order exponents N which have smaller prime factors. For instance, Z^4 = (Z^2)^2
Mandelbrot 4th Order (Nested Exponent): Z = (Z^2)^2 + C
zi= zr * zi * 2
zr = zrsqr - zisqr
zisqr = zi * zi
zrsqr = zr * zr
zi= zr * zi * 2 + ci
zr = zrsqr - zisqr + cr
zisqr = zi * zi
zrsqr = zr * zr
The above formula uses six bignum multiply operations (four of which are squares), making it slightly more computationally efficient than the reduced polynomial 4th.
To convert the 4th order Mandelbrot to the generalized Burning Ship, the absolute value command must be applied to the equation
before to the exponent. This yields:
Burning Ship 4th Nested: Z = (|Z|^2)^2 + C
zi= abs(zr * zi) * 2
zr = zrsqr - zisqr
zisqr = zi * zi
zrsqr = zr * zr
zi= zr * zi * 2 + ci
zr = zrsqr - zisqr + cr
zisqr = zi * zi
zrsqr = zr * zr
Burning Ship 4th Partial Imag Nested:
zi= zr * abs(zi) * 2
zr = zrsqr - zisqr
zisqr = zi * zi
zrsqr = zr * zr
zi= zr * zi * 2 + ci
zr = zrsqr - zisqr + cr
zisqr = zi * zi
zrsqr = zr * zr
Buffalo fractal applies the absolute values
after the exponent.
Buffalo 4th Nested: Z = |(Z^2)^2| + C
zi= zr * zi * 2
zr = zrsqr - zisqr
zisqr = zi * zi
zrsqr = zr * zr
zi= abs(zr * zi) * 2 + ci
zr = abs(zrsqr - zisqr) + cr
zisqr = zi * zi
zrsqr = zr * zr
Buffalo 4th Partial Real (Celtic 4th) Nested:
zi= zr * zi * 2
zr = zrsqr - zisqr
zisqr = zi * zi
zrsqr = zr * zr
zi= zr * zi * 2 + ci
zr = abs(zrsqr - zisqr) + cr
zisqr = zi * zi
zrsqr = zr * zr
Buffalo 4th Partial Imag (Quasi B.S. 4th) Nested:
zi= zr * zi * 2
zr = zrsqr - zisqr
zisqr = zi * zi
zrsqr = zr * zr
zi= abs(zr * zi) * 2 + ci
zr = zrsqr - zisqr + cr
zisqr = zi * zi
zrsqr = zr * zr
These nested exponent formula might give you something to play with since all the lower order abs formula worked but not 4th and 5th. I haven't tested these yet but the output should be equivalent to the reduced polynomial variants...
Again, I won't pretend to understand perturbation theory, but it may be possible to simplify the code by expressing forth order fractals as two nested second order "half-iterations", and only adding complex C every second iteration. Applying the burning ship formula only to the second half-iteration instead of the first should result in a 4th Order Quasi Burning Ship (labeled as "Buffalo Partial Imag 4th" on my formula sheet). The 4th Order Quasi Perpendicular and Quasi Heart variants likely won't be possible using nested second order equations, but Burning Ship, Buffalo, Celtic, their real and imaginary partials, and Mandelbar variants should be possible with nested second order iterations.
A nested 5th order, being prime, is out, but 6th (Z^3)^2, 8th ((Z^2)^2)^2, and 9th (Z^3)^3 nested exponents would work. It may also make rendering higher order Mandelbrots more efficient. I recently did a 10th degree zoom video and progress of fractal frames was slow. My
5th order Mandelbrot optimized, reduced polynomial formula uses 7 bignum multiplies, and a nested tenth order version Z = (Z^5)^2 + C would have used only ten bignum multiply operations per iteration.
Remember, Burning Ship fractals apply the absolute value to Zi and Zr
before the exponent, and Buffalo/Celtic fractals apply the absolute value
after the exponent.
Again I'd like to thank you for attempting this!