The Other Ladder
Everything on this site is built from a binary ladder over a number's structure. There are two of them, and they were designed for opposite ends. One is uneven, so structure survives it and you can walk on the result. The other is perfectly regular, so structure dies in it — which is the entire point, because it was built to whiten. This page is what happens when you point the second at the first.
The ruler ladder — uneven on purpose
run(g) grouped by v₂(g+1). The steps are ragged, and
the ragged part is the landscape.
Three jumps of +6, +8 and +5 where a plain ruler would step by one. Those are whole scale classes appearing at once, and they are why Range has mountain classes and Rivers has confluences where the river abruptly doubles.
The square ladder — even on purpose
The spine of v → isqrt(v), repeated. Bit lengths, top to bottom.
Every step is exactly a halving. Nothing to catch on, nothing to see. A 2048-bit input splits into 386 leaves, and every one of them lands at depth 8 or 9 — there is no scale hierarchy anywhere in it. Feed this to a terrain generator and you get a plain. That is not a failure; it is what a whitener is for.
The bias, derived
Almost everything on this site is measured. This one is derived first, then confirmed — and the confirmation is an exact count, not a sample.
Why the ramp is worth keeping
indexrng's square backend sets SKIP = 32 to throw the
isqrt root branch away, because it carries this ramp and a generator must
not have one.
A ramp is a defect in a generator and a gradient in a world. So on the next panel it is kept, and used to slide each peak of the ruler off its slot — by an amount that is not random and has a closed form.
Every other warp in procedural generation is statistically opaque: you perturb with
noise and you cannot say how far anything moved. Here (2a+1−q)/R
says exactly.
What it did, and what I got wrong
The prediction was that a warp would break the lattice — Range's one honest weakness, that peaks sit on 2-divisible indices. It does the opposite.
| layer | peaks | spread | lattice |
|---|---|---|---|
| none | 75 | 0.202 | 0.512 |
| hash 0.25 | 105 | 0.209 | 0.456 |
| square 0.45 | 78 | 0.236 | 0.621 |
| square 0.80 | 36 | 0.251 | 0.573 |
A ramp is coherent, so neighbouring peaks slide together and the periodicity survives. What it does instead is differentiate: 75 peaks merge into 36 and the height classes separate by 24%. The hash layer decorrelates; this one sharpens. They are not interchangeable, and combining them lands mid-table on both axes rather than adding up.
Same seed, three settings
Top to bottom: no layer, 0.45, 0.80. Watch the peaks gather rather than scatter.
Try it live on Ruler Range → · the object itself: The Edge Run →
The square split is v → (isqrt(v), v − isqrt(v)²), taken to
leaves. The rem branch is a bijection onto [0, 2r] — exact, no
analysis — so all of its error comes from blocks having different lengths and
nowhere else. The root branch is the one plotted above. Both, and the degree doubling
d → 2d+1, are stated as runnable claims in squaretheory.py,
whose verify() passes all five with the operating point at 2−27.