# Kernel Waves - Asks whether the wavelength of a Larger-than-Life still is set by the mask or by the rule, and whether it is readable off the mask's Fourier transform alone. - A design mask is the Kronecker power at level `level` of the odd-side base-2 tile a code names, `side^level` cells across, centre popped, built here as the crate builds it: corner `i` of the tile carries residue `((i / 2) mod 2, i mod 2)`, a tile cell is filled when its residue corner is a set bit of the code, and `np.kron` deepens the tile; the side-3 tiles are code 7 the full block minus its centre, code 6 the von Neumann cross, code 9 the diagonals, and the study asserts the side-3 code-7 tile has 8 cells and its level-2 mask is `9 x 9` with 64 ones. - The box mask at radius `r` is the `(2r+1)^2` block minus its centre, `m = 120` at `r = 5` and `728` at `r = 13`. - A rule is a birth interval and a survive interval as fractions of the mask budget `m`: a dead cell with `count/m` in `[b_lo, b_hi]` is born, a live cell with `count/m` in `[s_lo, s_hi]` survives, the integer thresholds being `ceil(lo m)` and `floor(hi m)`; the count is the FFT convolution of the 0/1 grid by the mask on the torus. - The three named rules are Bugs `B[34/120, 45/120] S[34/120, 58/120]`, wide survive with Bugs birth and `S[0.28, 0.60]`, and narrow birth `B[0.30, 0.34]` with Bugs survive; the rule grid is every product of birth lower `{0.20, 0.30, 0.35}`, birth upper `{0.35, 0.40, 0.45, 0.50, 0.55}`, survive lower `{0.00, 0.30}` and survive upper `{0.45, 0.50, 0.55, 0.60, 0.70, 0.80}`, 180 rules, run under two seeds. - The state after 64 steps is read through its power spectrum on integer rings `k = round|xi|`, `k = 1..128`: `k*` is the ring of highest mean power, the wavelength is `256/k*`, the share is the ring's fraction of the power off DC, the gain is the ring's mean power over the mean of all rings, which a white soup holds near 1.3. - Classes: dead is density below 0.02, full above 0.98, active is any change at the last step, flat is a still of gain below 3, coarse is a still with `256/k*` above twice the side, ring is every other still; the wavelength laws are tested on ring stills only and every exclusion is printed. - The mask alone is read through the ring mean `A(k)` of `|DFT|`, with `k_min` its first minimum past DC, `k_2` the first maximum past `k_min`, `k_min2` the next minimum and the lobe the rings between the minima holding at least half of `A(k_2)`; and through the ring mean `g(k)` of the signed DFT, real because every mask here is centrally symmetric, with `k_neg` its most negative ring and the negative band the run of negative rings around `k_neg`. - Riesz product. With `P(theta) = sum over tile cells e of exp(-2 pi i theta . e)`, `e` the offset from the tile centre, the DFT of the popped mask at level `level` and frequency `xi` on an `N` torus is `prod over j = 0..level-1 of P(side^j xi / N)` minus the tile's centre value. Proof: every cell of the Kronecker power is `sum over j of d_j side^j` with each digit cell `d_j` ranging independently over the tile's filled cells, and the mask centre is the same sum with every digit at the tile centre, so the offsets are `sum over j of (d_j - c) side^j`, the exponential sum over the product set factorises into the tile sums at the scaled frequencies `side^j xi`, and popping the centre subtracts its own term, 1 when the tile fills its centre (code 9) and 0 when it does not (codes 7 and 6). The study checks it at codes 7, 6, 9 and levels 2, 3, 4 over all `256 x 256` frequencies to `1e-9`. - Laws, each printed Verified when it holds at every ring still and Refuted with its first witness and its failure count otherwise: `k*` in the half-height lobe; `k*` nearer `k_2` than `k_min`; `k*` within one ring of `k_2`; `k*` within one ring of `k_min`; `g(k*) < 0`; `k*` within one ring of `k_neg`; `k*` in the negative band; one `k*` per mask across the rules. A per-mask table repeats the three sharpest laws with the failing `k*` values. ## RUN - `uv run python research/lab/py/kernel-waves/waves.py` from the repo root - Domain: torus `256 x 256`, soup density 0.5, seeds 20260 and 4093 printed, 64 steps, 7 masks, 3 named rules at the first seed and 180 grid rules at both seeds, 2520 grid runs; about 75 seconds, prints only, exits nonzero if the Riesz check fails. ## WITNESSES - automata.md the waves: the Riesz product holds to `2.5e-12` at every one of the 9 code and level pairs, the largest error at code 9 level 4; the minus term is the tile centre, 1 for code 9 and 0 for codes 7 and 6. (Proved; Verified.) - automata.md the waves: under the three named rules from the density-0.5 soup no mask reaches a ring still, 21 of 21 cells; 11 die, 6 freeze as a flat soup at density 0.49 to 0.50, 4 stay active, the wide-survive rule on the masks of 512 ones or more freezes the soup unchanged. (Verified.) - automata.md the waves: over the rule grid the census reads 176 ring stills of 2520 runs, 571 dead, 0 full, 950 active, 737 flat, 86 coarse. (Verified.) - automata.md the waves: `k*` sits within one ring of `k_min` in 25 of 176 ring stills and 21 of those are on the under-resolved side-81 mask where `k_min = 3` and `k_2 = 5`; the box `r = 5` holds 25 ring stills at `k* = 30..36` against `k_min = 24` and `k_2 = 32`, wavelength 7.1 to 8.5 cells against a mask width of 11. (Refuted for `k* = k_min`.) - automata.md the waves: `k*` lies in the mask's negative band in 173 of 176 ring stills and in every one of the 130 on box `r = 5`, code 7 levels 2 and 3, and code 9 level 3; the three witnesses are box `r = 13` at `k* = 10`, its `k_min`, code 7 level 4 at `k* = 2`, and code 6 level 3 at `k* = 8`. (Refuted as a universal law; Verified on those four masks.) - automata.md the waves: `k*/k_2` runs 0.94 to 1.12 on box `r = 5`, 0.71 to 1.07 on box `r = 13`, 0.97 to 1.10 on code 7 level 2, 0.77 to 1.08 on level 3, 0.92 to 1.17 on code 9 level 3; one mask's `k*` spreads across the rules, box `r = 5` from 30 to 36. (Verified; Refuted for one `k*` per mask.) - automata.md the waves: the carpet family's median wavelength over side reads 0.729 at level 2 and 0.729 at level 3 against `256/k_2/side = 0.729` at both, and 0.790 at level 4 against 0.632 where the torus holds only 3.2 mask widths. (Verified.)