LRW

Writing

One multiplication, three geometries

Complex, dual and split-complex numbers through one multiplication rule. Interactive figures show rotations, shears and squeezes, with links to Lean proofs.

14 min readUpdated 4 Oct 2026Copy Markdown
  • algebra
  • design
  • verification
  • ai

This is an introductory blog post for people curious about the underlying algebra and intuition. Start with a pair of numbers and one rule for multiplying them. That rule gives us rotations, shears and squeezes, depending on a single choice.

I came to this through AI research. I was trying to understand how a model could remember, change and forget, and ended up learning a fair bit of algebra. This is the part of that work I keep coming back to.

Revision 3, 4 October 2026. The pairs, multiplication and three geometries now come first; the research connections come later. Figures start still, with playback where useful, and the interval example distinguishes crossed bounds from the null axes. The Song update covers the gen2 → gen3 transition, the rename to Iota and the assembly proof boundary added in Revision 2.

Two numbers for one point

Numbers on a line

-4-3-2-101234
value
3/2
kind
a fraction
Counting gives 0, 1, 2, 3. Undoing a count gives the negatives. Sharing gives fractions, and filling every gap between them gives the real numbers: every point of the line.

Counting gives 0, 1, 2, 3 and on. Running a count backwards gives the negatives. Sharing gives fractions. Filling every gap between the fractions gives the real numbers: one number for every point of a line.

A point is a pair of numbers

a b
red point z
(1.500, 0.800), written 1.500 + 0.800·x
gold point w
(−0.600, 1.400)
z + w
(0.900, 2.200)
Drag either point. A point is two numbers: how far right (a) and how far up (b), read off the dotted lines. Adding two points adds right to right and up to up: walk one arrow, then the other.

Cross two number lines at their zeros, and every point is found by two numbers: a across and b up (coordinates). We can write that pair as

a + b·x

saya plus b x

meansa in the first slot, b in the second; x only marks which slot b is in

apeironCell<i64> word representation in src/cell.rs and RingCell in AnyRing.lean

physicsstate pair coordinates in phase space or 1+1 spacetime

Adding two points adds slot to slot, which is walking one arrow and then the other:

(a + b·x) + (c + d·x) = (a + c) + (b + d)·x

saya plus b x, plus c plus d x, equals a plus c, plus b plus d times x

meansadd the firsts together and the seconds together

apeironCell::add in src/cell.rs, verified by AnyRing.ringAdd

physicssuperposition of linear states or vector translation

Multiplying needs one decision

Multiply two pairs the way brackets are multiplied at school: every part by every part. Four products appear: a·c, a·d·x, b·c·x and b·d·x·x (the dot means times; letters stand for numbers). The first three are fine. The last contains x·x, and nothing so far says what that is.

That is the one decision. Choose a real number σ and declare x·x = σ (x squared is σ). Worked with σ = −1:

(2 + 3x)(1 + 4x) = 2 + 8x + 3x + 12·x·x = 2 + 11x − 12 = −10 + 11x

saytwo plus three x, times one plus four x, equals minus ten plus eleven x

meansmultiply every part by every part, then replace x times x by σ, here minus one

apeironconcrete evaluation of Cell multiplication on the elliptic face

physicscomplex multiplication in the Argand plane

and in general

(a + b·x)(c + d·x) = (ac + σbd) + (ad + bc)·x

saya plus b x, times c plus d x, equals a c plus sigma b d, plus (a d plus b c) x

meansthe first slot of the answer collects the plain products; the second collects the ones with one x

apeironword_mul_denote extracted from src/cell.rs, proved as AnyRing.ringMul

physicsthe quadratic extension classifying elliptic, parabolic, and hyperbolic metric algebras

Order and grouping do not matter, and 1 + 0·x changes nothing. This is the algebra ℝ[x]/(x² − σ); the formula is forced by x·x = σ rather than chosen (mul_eq_quotient_mul).

Multiplication as a map

a b
z
1.300 + 0.600·x
N(z)
2.050
area of image
2.050
orientation
kept
Drag z (or use the sliders). The dashed square is multiplied by z: the result has area |N(z)|, and the F is mirrored when N(z) < 0. The gold curve is every point with the same N as z.

Fix one point z and multiply every point of the plane by it. Straight lines stay straight, the centre stays put, and the square becomes a slanted box. That holds on every face.

Multiplication by z = a + b·x is a linear map. As a matrix it has rows (a, σb) and (b, a), and its determinant is the area scale in the figure:

N(z) = a² − σb²

sayN of z equals a squared minus sigma b squared

meanshow many times bigger or smaller multiplying by z makes every area

apeironringNormForm in AnyRing.lean; certifies Table coordinate admission and zero-divisor avoidance

physicsinvariant Minkowski interval s² = c²t² − x² and quantum probability norm conservation

That is the norm. Negative N mirrors the plane; zero N flattens it onto a line. Multiplying by z then by w is multiplying by zw, and area scales compose, so

N(zw) = N(z)·N(w)

sayN of z w equals N of z times N of w

meansscaling area twice is scaling by the product of the two scales

apeironringNormForm_mul in AnyRing.lean, proved in Lean 4

physicscomposition of Lorentz boosts and area preservation in symplectic phase space

The elements with N = 1 keep every area without mirroring, and they form a group.

Faces

a b
face
elliptic
σ
−1.000
flow(σ, t)
0.622 + 0.783·x
N
1.000
N = 1 (gold), N = 0 away from the origin (red, dashed), and flow(σ, t) from 1 (point). The flow is periodic iff σ < 0.

Rescaling x by 1/√|σ| reduces every σ to −1, 0 or +1: only the sign matters. Each figure multiplies the whole plane by a norm-1 element, continuously in t. Gold curves are the level sets of N; every point stays on its own.

σ = −1: rotation

a b
flow(σ, t)
0.878 + 0.479·x
red point
1.077 + 1.158·x
its N
2.500
Every point multiplied by flow(−1, t) = cos t + x·sin t. The plane rotates by t. Each point stays on its circle of constant N; the F turns but keeps its shape.

x² = −1: the complex numbers. Norm-1 elements are cos t + x·sin t (cos, sin), the level sets are circles, and multiplication rotates. Every non-zero element is invertible: a field.

σ = 0: shear

a b
flow(σ, t)
1.000 + 0.500·x
red point
1.500 + 1.250·x
its N
2.250
Every point multiplied by flow(0, t) = 1 + t·x. The point (a, b) goes to (a, b + t·a): each vertical line of constant N = a² slides along itself. A shear.

x² = 0: the dual numbers. Norm-1 elements are 1 + t·x, sending (a, b) to (a, b + t·a): a shear along the vertical level lines a = const. Because x·x = 0, putting a + x into a polynomial f gives an exact result with two parts:

f(a + x) = f(a) + f′(a)·x

sayf of a plus x equals f of a, plus f prime of a, times x

meansthe first slot is the formula's value at a; the second is its slope there

apeironexact dual-number autodiff in fluid boundary solvers without numerical truncation

physicsGalilean boost and classical Hamilton-Jacobi phase flow

For example, with f(y) = y·y: (3 + x)(3 + x) = 9 + 6x, and 6 is the slope of y·y at 3. This is forward-mode automatic differentiation.

σ = +1: squeeze

a b
flow(σ, t)
1.128 + 0.521·x
red point
1.952 + 1.345·x
its N
2.000
Every point multiplied by flow(1, t) = cosh t + x·sinh t. Points slide along hyperbolas of constant N. The diagonals (N = 0) stretch by eᵗ and e⁻ᵗ. A squeeze.

x² = +1: the split-complex numbers. Norm-1 elements are cosh t + x·sinh t (cosh, sinh); points slide along hyperbolas and the diagonals stretch by eᵗ and e⁻ᵗ (eᵗ): a squeeze, the Lorentz boost of 1+1-dimensional relativity with rapidity t.

For σ ≥ 0 the diagonals themselves have N = 0, and a non-zero element with N = 0 is a zero divisor:

a b
multiplier
1.000 + 0.600·x
N = area scale
0.640
σ = +1. From u = 0 to 1 the plane is multiplied by 1 + u·x; its N falls to 0 and the plane flattens onto the line b = a. From 1 to 2 that line is multiplied by 1 − (u − 1)·x; at u = 2 everything is at the origin: (1 + x)(1 − x) = 0.
(1 + x)(1 − x) = 1 − x·x = 1 − 1 = 0

sayone plus x, times one minus x, equals one minus x times x, which is one minus one, which is zero

meanstwo things that are not zero multiply to zero; this can only happen when σ is zero or above

apeirontwo-channel orthogonal expert routing in sparse attention (Nous/Seq/TwoChannelRouter.lean)

physicslightcone boundary of Minkowski spacetime; null trajectories at the speed of light

Each factor flattens the plane onto a line, and the second sends the first one's line to the origin.

σalgebraN = 1N = 0, z ≠ 0norm-1 action
−1ℂcirclenonerotation
0Dual numberslines a = ±1the b-axisShear
+1Split-complex numbershyperbolalines b = ±aSqueeze

Found separately: ℂ by Bombelli (1572) and Gauss (1831), split-complex numbers by Cockle (1849), dual numbers by Clifford (1873).

Only three

λ y
σ = p + q²/4
0.750
real roots
2
face
hyperbolic
Any 2-dimensional algebra has an element w with w² = p + q·w. Gold: λ² − qλ − p. Dashed: the same parabola slid by q/2, λ² − σ. Each real root r makes w − r a zero divisor. Two roots: hyperbolic. One: parabolic. None: elliptic.

Every number system made of pairs, with a 1 that changes nothing, is one of the three (classification). Take any element w that is not a plain number. With only two slots, w·w has to be made of 1 and w, so w·w = p + q·w for some numbers p and q. Sliding w by half of q removes the w part:

w·w = p + q·w, x = w − q/2, x·x = p + q²/4 = σ

sayw times w is p plus q w; let x be w minus q over two; then x times x is p plus q squared over four, and that number is sigma

meansany two-slot number system can be shifted so that its extra symbol squares to a plain number

apeironrootsParts classification in Trichotomy.Roots

physicsdiscriminant classification of quadratic dispersion relations

This is completing the square, the same step as in the school formula for quadratics. The sign of σ fixes how many real roots λ·λ − q·λ − p has (two, one or none), and that is the number of null lines.

The flow

a b
red area
0.450
gold area
0.300
z · w
0.071 + 0.997·x
flow(σ, s + t)
0.071 + 0.997·x
z = flow(σ, s) (red point) sweeps the red region, of area s/2. w = flow(σ, t) (hollow) sweeps a region of area t/2 from 1 (outlined). Multiplying by z moves that region to start at z (gold). The product z·w lands at flow(σ, s + t): swept areas add.

The point flow(σ, t) runs along the gold curve from 1, and the line from the centre to it sweeps out area at a steady rate. Writing the point as (C, S):

d(area)/dt = ½·(C·S′ − S·C′) = ½·(C·C − σ·S·S) = ½·N = ½

saythe rate the area grows equals one half of (C times S prime, minus S times C prime), which is one half of N, which is one half

meansin each small moment the line sweeps a thin triangle; its area always grows at half a unit per unit of t

apeironarea rate invariance across all three faces

physicsconservation of symplectic 2-form area in Hamiltonian phase flows

Multiplying by flow(σ, s) rotates, shears or squeezes the region swept by flow(σ, t) so that it starts where the first one ends. The two statements

N(flow(σ, t)) = 1
flow(σ, s) · flow(σ, t) = flow(σ, s + t)

sayN of flow sigma t is one; flow sigma s times flow sigma t is flow sigma s plus t

meansthe point never leaves the size-one curve, and sweeping s then t sweeps s + t

apeironnormForm_flow and flow_add in Trichotomy.Flow

physicsone-parameter group property of dynamical evolutions

are what the figure shows. So moving along the flow is a one-parameter group: every step is the same multiplication, and at the start that multiplication is by x. It is defined by two rates of change (derivatives):

C′ = σ·S, S′ = C, (C, S)(0) = (1, 0)

sayC prime is sigma S, S prime is C, starting from one, zero

meansthe first slot changes at σ times the second, the second changes at the first, starting at 1

apeironinfinitesimal generator derivation of cell flows

physicsHamilton's canonical equations for quadratic Hamiltonians

σflow(σ, t)returns to 1
−1(cos t, sin t)at t = 2π
0(1, t)never
+1(cosh t, sinh t)never

One formula covers all three rows. Each of C and S is an endless sum of simple pieces, a power series:

C = 1 + σ·t²/2 + σ²·t⁴/24 + σ³·t⁶/720 + …
S = t + σ·t³/6 + σ²·t⁵/120 + σ³·t⁷/5040 + …

sayC equals one, plus sigma t squared over two, plus sigma squared t to the fourth over twenty-four, and so on; S equals t, plus sigma t cubed over six, plus sigma squared t to the fifth over one hundred and twenty, and so on

meansevery piece is a power of σ times a power of t divided by a fixed number, and the pieces shrink fast

apeironpower series expansion in AnyRing.Flow

physicsanalytic continuation of evolution operators between Euclidean and Lorentzian time

The numbers underneath are 2 = 1·2, 6 = 1·2·3, 24 = 1·2·3·4 and so on, written k! ("k factorial"). With Σ meaning "add up all of these", the same two sums read:

C = Σ σᵏ·t²ᵏ / (2k)!, S = Σ σᵏ·t²ᵏ⁺¹ / (2k+1)!

sayC is the sum, for k equals zero, one, two and on, of sigma to the k times t to the two k, over two k factorial; S is the same with two k plus one

meansthe two lines above, in short form

apeironcompact series notation for generalized trigonometric functions

physicsanalytic propagator kernel across all metric signatures

Put σ = −1 and the sums are cos t and sin t. Put σ = +1 and they are cosh t and sinh t. Put σ = 0 and every piece after the first vanishes, leaving 1 and t. Nothing in the sums divides by σ or takes its square root, so they change smoothly as σ passes through zero (they are analytic in σ). The σ slider in the first figure shows it: the circle opens through the parallel lines into the hyperbola without a jump.

Periodic flows

closes
after 2 turns
Two elliptic flows, angles t and ω·t, as one point on a torus (left) or on a square whose opposite edges are glued (right). The path closes iff ω is rational; at √2 it never closes and fills the surface.

Only the elliptic flow returns (flow_returns_iff_disc_neg). Two independent elliptic flows are a point on a torus; the path closes iff the ratio of their rates is rational, and is dense otherwise.

C and S depend on σ only through σt², so σ ↦ −σ is t ↦ it up to a factor i on S: Wick rotation. The closing of the elliptic flow is the periodicity in imaginary time that thermal field theory reads as a temperature.

From numbers back to rules

We've used numbers to see what the multiplication does. There is another question underneath it: how do we build numbers, choices and computation out of rules? This next part follows that route. The applications come after it.

From nothing

0 1
now
the point is 0; one ring, chosen as the unit of distance, is 1
distance of the moving point
1.000
An empty plane. Click anywhere in it (or press the button) to put down one point. Each ripple is every place at one distance from the point; the moving point keeps its distance by turning, which is the elliptic flow.

Start with nothing: no numbers, no rules, no things. Picture it as a blank plane, the bulk everything else happens in. With nothing in it, every place and every direction looks the same.

Put down one point. Now there is one difference, and one thing becomes measurable: how far a place is from the point. One point has no direction, so distance is the same all the way round, and the only shapes it defines are circles around it.

That's the elliptic face (σ = −1) of the algebra we've just used, where a point's size is its squared distance from the centre. The only motion that keeps distance is turning: the moving point in the figure, the elliptic flow(σ, t).

The point is 0, the one place at distance zero. Pick one ring as the unit of distance and that's 1. They are the only ordinary numbers that don't change when multiplied by themselves (x·x = x).

x·x = x

sayx times x equals x

meanstrue only for x = 0 and x = 1; George Boole (1847) took it as the law of yes and no

apeironidempotent_iff_trivial_of_disc_nonpos in Apeiron.Trichotomy.Idempotents

physicssingle-channel projection and truth classification

Where x·x = x splits

Boole's rule x·x = x has two solutions in ordinary numbers, 0 and 1. On one number line, logic only has yes and no.

In a two-slot algebra it depends on the face. On the elliptic face (σ < 0), 0 and 1 are still the only solutions. On the hyperbolic face (σ > 0) there are two more, the diagonal projectors e_+ and e_-.

e_+ = (1 + x/√σ)/2
e_- = (1 - x/√σ)/2

saye plus is 1 plus x over root sigma, all over 2; e minus is 1 minus x over root sigma, all over 2

meanstwo new idempotent elements (x·x = x) that exist only when σ > 0

apeironexists_nontrivial_idempotent_iff_disc_pos in Idempotents

physicsprojection operators along the two lightlike rays of the cone

Benjamin Peirce (1870) showed they split the algebra into two independent channels, the Peirce decomposition:

e_+ · e_- = 0
e_+ + e_- = 1

saye plus times e minus equals 0; e plus plus e minus equals 1

meansBenjamin Peirce (1870); multiplied they annihilate to zero, added they recompose the unit

apeironcomplementary_idemPlus in Idempotents; the_razor in DotToTorus

physicsresolution of identity into two uncoupled, mutually annihilating channels

the_razor in Apeiron's DotToTorus.lean collects three facts about them:

  1. The product is zero: e_+ · e_- = 0 (null_times_mirror).
  2. The pairing is not: ⟨e_+, e_-⟩ = 2 under the hyperbolic metric (nNull_pairing). Multiplying erases them; the metric still tells them apart.
  3. The sum is one: e_+ + e_- = 1 (arms_sum_to_unit).

So every point is a pair of independent channels, (u, v) = u·e_+ + v·e_-. Multiplying by e_+ keeps the first and zeroes the second, (u·e_+ + v·e_-)·e_+ = u·e_+ (proj_keeps_first_channel), and multiplying by e_- keeps v. That is linear projection.

Projection is not the combinator K. Projection drops one coordinate of a vector; K drops a whole argument, and no bilinear product over ℝ can do that: bilinearity forces (K·a)·0 = 0, so K·a·b = a would make every a zero. Apeiron proves the meet cannot host K (idem_no_K and no_K_of_comm_assoc in Implicative.lean): no commutative, associative operation has a discarding combinator over arbitrary terms.

So universal computation lives in a separate term-rewriting calculus (Substrate/Ski/TermCore.lean), where application builds a tree instead of multiplying. The algebra gives the two channels and projection; the calculus gives evaluation.

One rule

Ix

I x

Press Step to follow the highlighted rewrite.

steps
0
next rule
I hands back what it is given
Follow one rewrite at a time in the same window. I returns its argument; K consumes the second branch; S copies the last branch into two places. Forks mean application: give the left branch the right branch. Try SKK to watch a whole chain collapse to x.

A combinator is a rule for rearranging whatever it is given. It holds no numbers. Writing two things side by side, f x, means "give x to f" (f x), and each fork in the tree means the same thing. Two rules are enough for any computation (Schönfinkel, 1924):

K a b → a

sayK, given a and then b, becomes a

meanskeep the first thing, drop the second

apeironcapp_kCombinator on weighted routes; proj_keeps_first_channel in Projection.lean

physicsprojection onto an orthogonal idempotent subspace, discarding complementary states

S f g x → f x (g x)

sayS, given f, g and x, becomes f given x, given (g given x)

meanshand x to both f and g, then hand g's answer to f's

apeironrouting bifurcation in BulkAlgebra and BulkTower; S_bulk in BulkInevitability.lean

physicsbranched distribution of conserved flux across two channels

ιιx

ι ι x

Press Step to follow the highlighted rewrite.

steps
0
next rule
ι hands what it is given S and K
Each fork means “give the left side the right side”. Press Step: the highlighted part is rewritten by one rule. ι given to itself behaves as I, as K and as S: one rule makes the other three.

K keeps; S shares. Chris Barker found in 2001 that a single rule produces both, ι:

ι x → x S K

sayiota, given x, becomes x given S and then K

meanswhatever ι is given, ι hands it S and K

apeironiota_app in Combinator.Basic; iota_eq_pack in Combinator.Pair

physicsself-routing bifurcation dispatching between constant retention and dual branching

Given to itself, ι behaves as the do-nothing rule I; three deep it behaves as K, and four deep as S. Step runs one → at a time. In Apeiron these are iota_is_I, iota_is_K and iota_is_S.

Pairs and choices

SSIKaKbK

S (S I (K a)) (K b) K

Press Step to follow the highlighted rewrite.

steps
0
next rule
S gives the last to both, then applies
The pair holds two things and hands both to whatever it meets. Given K it answers with the first; given K I, the second. ι itself is this pair, holding S and K.

The smallest structure is a pair: it holds two things and hands both, in order, to whatever it meets.

pair(a, b) m → m a b

saythe pair of a and b, given m, becomes m given a and then b

meansa pair is anything that passes its two contents on, first then second

apeironpack constructor in Combinator.Pair; two-channel decomposition of hyperbolic cells

physicstwo-slot state vector decomposing into independent normal coordinates

Given K, a pair answers with its first thing; given K I, its second. K and K I are yes and no, so reading a pair is a choice. ι itself is the pair holding S and K (iota_eq_pack, true by definition).

Counting

KIfx

K I f x

Press Step to follow the highlighted rewrite.

steps
0
next rule
K keeps the first and drops the second
A number n, built only from S and K, given a rule f and a start x, applies f n times. Counting is repetition.

Counting is doing something again. The number n is the rule that, given f and x, applies f to x n times. Numbers need nothing but S and K: 0 = K I, and "one more" is S (S (K S) K).

2 f x → f (f x)

saytwo, given f and x, becomes f given (f given x)

meansthe number two is do it twice

apeironChurch numeral representation in Combinator.Basic

physicsdiscrete iteration of a transfer map or dynamical step

One rule gives a pair, a choice and counting. Combinators, Church's λ-calculus and Turing's machines compute the same functions (Turing, 1937).

The machine has limits

Combinatory logic describes rules without committing to a particular machine. A physical computer has a finite amount of memory and a finite amount of time. I want the model of a programme to include those limits, so the implementation has to account for the space and work it uses.

CSS

WRITING
panel
matrix(1,0,-0.24,1,0,0)
contents
matrix(1,0,0.24,1,0,0)
product
matrix(1,0,0,1,0,0)
A panel as used in this site's navigation. The panel is flow(σ, t); its contents are flow(σ, −t). The product is 1, so the text is upright on every face.

A CSS matrix() is the same 2×2 map. With the screen x axis carrying b and the y axis carrying a, multiplication by (C, S) is matrix(C, σS, S, C, 0, 0). From src/algebra/cell.ts:

export const mul = (s: Sigma, [a, b]: Cell, [c, d]: Cell): Cell =>
  [a * c + s * b * d, a * d + b * c];

export const norm = (s: Sigma, [a, b]: Cell): number => a * a - s * b * b;

export const flow = (s: Sigma, t: number): Cell => {
  const r = Math.sqrt(Math.abs(s));
  return s < 0 ? [Math.cos(r * t), Math.sin(r * t) / r]
    : s > 0 ? [Math.cosh(r * t), Math.sinh(r * t) / r]
    : [1, t];
};

export const act = (s: Sigma, [c, sn]: Cell): string =>
  `matrix(${fx(c)},${fx(s * sn)},${fx(sn)},${fx(c)},0,0)`;

fx rounds to four places. On this site: σ = 0, t = −0.24 for every panel, tab and tag, with contents at flow(0, +0.24), the inverse; σ = −1, |t| ≤ 0.08 for the letters of the name; σ = +1, t = 0.03 for card hover. src/algebra/algebra.test.ts checks the laws above at seven values of σ; the Lean statements in Apeiron are normForm_mul, normForm_flow, flow_add and flow_returns_iff_disc_neg.

Why this matters

Machines that do not fit in the universe

0110100111010010→ ∞ unbounded tape (Turing 1936) 10⁻³⁵10⁻³⁰10⁻²⁵10⁻²⁰10⁻¹⁵10⁻¹⁰10⁻⁵10⁰10⁵10¹⁰10¹⁵10²⁰10²⁵ Planck lengthprotonatompersonEarthSolar SystemMilky WayHubble radius metres, log scale
bits on the tape
10⁴⁰
smallest region
7.6e-16 m
light across it and back
5.1e-24 s
fits inside the horizon
yes
The smallest sphere that can hold the tape, from the holographic bound: bits ≤ area / (4·lP²·ln 2). Reaching the far cell takes at least that radius over the speed of light. Past about 10¹²² bits nothing inside the cosmological horizon can hold it.

A universal Turing machine has an unbounded tape (Turing, 1936). Physical memory does not. The information a region can hold is bounded by its surface area, the holographic bound (Bekenstein, 1981; 't Hooft, 1993; Susskind, 1995), and reaching a cell at distance R takes at least R/c. Lloyd (2000) works out the resulting limits on speed and memory for a 1 kg computer.

The valid program cone

NUMBERS FIT: lo ≤ hi EMPTY: lo > hi lo → ↑ hi
interval [lo, hi]
[1.000, 1.200]
Does a number fit?
1.1 satisfies every bound.
Requirement
Choose x = 1.1: it meets all three requirements.
A worked example of tightening bounds. Above the diagonal, the lower bound is at most the upper bound, so an interval remains. Below it, no number fits. This diagonal is lo = hi; the null axes are lo = 0 and hi = 0. They are different boundaries. Choose a case and move through its steps at your own pace.

Suppose a value must be at least 1 and at most 1.2. We can choose 1.1. Now suppose it must be at least 2.5 and at most 0.8. No number can do both. The lower and upper bounds have crossed.

Song gen2 used this kind of bound propagation as part of its decider. Each pair of bounds can be drawn as a point in the plane. The diagonal lo = hi separates intervals that contain numbers from intervals that don't.

That diagonal is different from the null axes. In null coordinates the norm is lo·hi, which vanishes when either coordinate is zero. The contradictory pair (2.5, 0.8) has positive norm, 2.0. Its problem is the ordering of its bounds.

This example uses one variable. A real checker also has to establish that its constraints describe the programme being checked. Running out of checking time is not evidence that a programme is safe or impossible.

Unbounded memory in practice

buf 0: primary (8B) buf 1: staging (4B) buf 2: sink (4B) 0123456789101112131415
result
bytes 8–10 land beyond the payload, inside the sandbox; masking alone does not make that safe
An illustrative write into an eight-byte payload. An unchecked C write can overwrite neighbouring control data. A checked Rust write refuses an oversized request. The gen2 Song layout places other buffers inside a sandbox: keeping a write inside that sandbox does not prove it belongs in those buffers. This picture shows the layout, not a proof of recovery or isolation.

An unchecked C write can go past its buffer and corrupt neighbouring data, which can include the return address (Aleph One, 1996). About 70% of the vulnerabilities Microsoft fixes and assigns a CVE are memory-safety bugs (MSRC, 2019).

Safe Rust checks bounds at run time and rules out aliasing mistakes at compile time, but an out-of-bounds index still panic!s ; .get() lets the programme handle a missing element instead.

Song gen2 used Software Fault Isolation (SFI; Wahbe et al., 1993): an address was masked to b + (index & (2ᴷ − 1)) to select a location inside a power-of-two sandbox. Its wrapped-access design used a 3-buffer staging ring (buffer 0 payload, buffer 1 staging, buffer 2 sink), with faults recorded for inspection. That addressing rule alone does not establish authority over the whole accessed range. Gen3 carries extent, authority, initialisation and preservation through actual machine accesses as proof obligations. The register-only multiplication slice below does not yet establish buffer or kernel isolation.

The references are seL4 (Klein et al., 2009) and CHERI (Watson et al., 2015; 2020). Their results concern their own implementations and assumptions; Song's corresponding obligations need their own proofs.

Apeiron and Song pass σ explicitly to every operation, so whether a quantity rotates (bounded, periodic), shears, or grows and decays is fixed by the system, not by accident of the code.

Physics

  • Contraction. Lohmiller and Slotine (1998): if a system's update shrinks the distance between any two states, it forgets its initial conditions exponentially fast. On the elliptic face (σ = −1), N(z) = a² + b² is the squared Euclidean length, so multiplying by an element with N < 1 is a strict contraction. For σ ≥ 0, N is not a length, and contraction needs the Euclidean operator norm below 1. See the last figure.
  • The quadratic window. Apeiron's Lean work follows Lohmiller and Slotine (2024), who argued the Schrödinger equation can be solved from classical action, and the exchange with Vattay (2026) (reply). The physical reading is still argued over. The maths underneath is a clean theorem: the semiclassical Van Vleck propagator is exact if and only if the Hamiltonian is at most quadratic in position and momentum. Quadratic Hamiltonians generate sl(2, ℝ), whose one-parameter subgroups are elliptic, parabolic or hyperbolic. This algebra classifies what is inside that window, where the classical and quantum descriptions agree.
  • Holography. The half-planes over the three faces are the Poincaré half-plane (hyperbolic geometry, despite the names), the Galilean plane and the Minkowski plane (Yaglom, 1979; Kisil, 2005). In the Poincaré half-plane the Ryu–Takayanagi formula (2006) reads a boundary region's entanglement from a bulk geodesic, and that bulk can be made discrete (Gubser et al., 2016; Heydeman, Marcolli and Saberi, 2016). Apeiron's discrete bulk has the same shape; it gets its own post.
  • Predictions. Cosmological predictions from the discrete bulk are pre-registered with explicit kill conditions (Zenodo, 2026), including constraints on a normal neutrino mass hierarchy checked against the current dynamical dark-energy parameters (w_0, w_a).

AI

attention: keeps every token SSM: fixed state
attention memory
0 entries
SSM memory
16 entries
work for the next token
attention ∝ n, SSM constant
Each gold square is one stored token. Attention reads all of them to produce the next one, so memory grows with the context and work per token grows with it. A state space model folds each token into the same fixed state and forgets at a controlled rate.

Attention (Vaswani et al., 2017) keeps every past token, so memory grows with the context and so does the work per token: the unbounded tape again, inside the model. Linear attention (Katharopoulos et al., 2020) rewrote it as a recurrence with a fixed-size state. Structured state space models (Gu, Goel and Ré, 2021; Gu and Dao, 2023) and Mamba-2's state space duality (Dao and Gu, 2024) made that competitive, and DeltaNet (Yang et al., 2024; 2024b) made the update a step of online regression, the fast-weight view of Schlag, Irie and Schmidhuber (2021).

a b
step
40
distance between states
λᵏ · starting distance
One state pair, updated each step by h ← λ·flow(−1, θ)·h + input: rotate by θ, shrink by λ, add the token. Two copies start far apart and receive the same inputs. With λ < 1 the distance between them is exactly λᵏ times the starting distance: the state forgets where it started. At λ = 1 it never forgets, and never settles.

Mamba-3 (Lahoti et al., 2026) makes the state complex-valued and proves the update equivalent to a data-dependent rotary embedding (Su et al., 2021). In this algebra each state pair is updated by

h ← λ·flow(−1, θ)·h + input

sayh becomes lambda times flow of minus one and theta, times h, plus the input

meanseach step, turn the state by angle θ, shrink it by the factor λ, then add the new token

apeironMamba-3 and DeltaNet rotary state updates; norm below 1 guarantees contractive forgetting

physicsnon-linear contraction analysis; convergence of open dissipative dynamical systems

a rotation on the elliptic face, shrunk by λ. With λ < 1 its norm is below 1 and the update is a contraction: two states fed the same tokens converge, which is Lohmiller–Slotine stability applied to memory.

What I work on

The same object turns up in security (bounded memory, capability boundaries), compilers and operating systems (Song), physics (the quadratic window, holography), simulation (world generation, fluids and weather, artificial life) and AI (state updates as flows). The engineering targets are a growable table to replace std::collections::HashMap and hashbrown, and a Rust training and inference stack on SPIR-V and Vulkan instead of CUDA and PyTorch.

Each operation has to do what its Lean definition says. Charon and Aeneas carry Apeiron's Rust into Lean so the two can be checked against each other. Song generates its own native code. A kernel that is fast but unproven, or proven but slow, does not pass.

Song gen3 and Iota

In the transition from Song gen2 to gen3 I renamed the language from Slang to Iota, after learning that Slang was already a shader language. Iota takes its name from the combinator introduced above.

Gen3 carries the proof down to assembly and the bytes the processor executes. For the first example, cell multiplication, the proof follows the operation through the generated instructions and their bytes. seL4 proves from a specification through C and, on supported platforms, to the binary. Song builds its instruction generator into that chain.

Gen2's checked Ring 0 foundation stopped above its unverified assembly core. Gen3 brings native instruction generation into that foundation too. Song's rings show how the libraries, applications and interfaces build on it.

The rest of the compiler and operating system is ahead.

For the measured results behind this work, I’ve put together a results page with the records and their conditions.