I finally understand Pauldelbrot's formula enough to have extended it to true "dial-a-" parameter representation.

I posted more details here, also check the post I quoted (follow link back to original post) in this thread:

Hm, I think the dial-a-Julia is more complicated than that - doesn't seem to work intuitively in all cases...

yeah it''s way more complicated. even for combining two Julia sets you need iterative algorithms (reading about "slow mating" recently).

This is 1/5 mated with 3/7, by Wolf Jung's slow mating code. I think these are called "kokopelli" and "airplane" but I'm not 100% sure.

The coordinates of the original quadratic Julia sets z^2+p and z^2+q are:

This gets transformed by slow mating into a rational Julia set of (z^2+a)/(z^2+b) with:

Why the code needs angles as inputs and not just p,q complex numbers I'm not sure - maybe it has to do with needing (pre)periods for the mating step? I need to read the code to be sure...

Extract from the code:

u = rd - 1.0L, v = id, x = 1.0L - rc, y = ic, w = x*x + y*y;
u /= w; v /= w; w = u*x - v*y; y = u*y + v*x; x = w;
u = rd*rd - id*id; v = 2.0L*rd*id; w=u*u + v*v;
x /= w; y /= w; w = x*u + y*v; y = y*u - x*v; x = w;
w = rd*rd + id*id; u = rc/w; v = ic/w;
w = u*rd + v*id; v = v*rd - u*id; u = w;
w = u*x - v*y; v = u*y + v*x; u = w;

it would be nice if there were comments explaining what complex number expression of (rd+i id) and (rc + i ic) this is computing into (u+ i v) and (x + i y), but there aren't, so I guess I have to carefully unpick what all of this means.

This is the bit that takes the mated values and from them computes $a$ and $b$ for the rational function $(z^2+a)/(z^2+b)$.

I think that the mess of code works out as:

$$A = \frac{C(D-1)}{D^3(1-C)}$$
$$B = \frac{D-1}{D^2(1-C)}$$

but I'm not 100% sure, I guess I could test it numerically to see how close it is....

I implemented Slow Mating for quadratic polynomials using the equations and hints in Chapter 5 of Wolf Jung's 2017 paper "The Thurston Algorithm for quadratic matings"

My code is 145 lines of quite-straightforward C, vs 2249 lines of C++ with various state hidden in mutating objects for the code accompanying the paper (which admittedly does a lot more, working from angles to compute the complex points and (pre)periods that are the input to my code). I'll do a blog post next week once I've tested more cases to make sure I haven't done any big mistakes.

There were a couple of subtleties, 1. needing to use cproj() to normalize infinity's representation and avoid NaNs; and 2. in one place, converting (a - b) / (a - c) to (1 - b/a) / (1 - c/a) so that it still works when a is infinite.

Attached images are the north period 4 island mated with the west period 4 island (blue background), and 2/5 bulb mated with 1/2 bulb (turquoise background).

1/3 child bulb of north period 4 island, mated with 1/2 child bulb of period 3 island

I used my mandelbrot-numerics programs to calculate the input coordinates:
./slow-mating $(m-nucleus double $(m-exray-in double ".(001100110100)" 16 1000 | tail -n 1) 12 64 1) 0 12 $(m-nucleus double $(m-exray-in double ".(011100)" 16 1000 | tail -n 1) 6 64 1) 0 6

I plotted the pullback curves of the previous example. for periodic cycles the first curve is fixed at 0 or infinity and the next is the critical point (which in previous posts I labelled C and D for the two families of curves, and gave an expression to calculate A and B from them to give the rational function (Z^2+A)/(Z^2+B)).

The pullback process involves all the curves simultaneously, each segment of the curve depends on the previous segment of the next curve in the periodic cycle.

I didn't check for homotopy violations yet, not sure how, nor when it is likely to occur....

Sign in to participate in the conversation

Hometown is adapted from Mastodon, a decentralized social network with no ads, no corporate surveillance, and ethical design.