Math Mapgenerated 2026-10-25 · a354234
PUBLIC BUILD

run 029Falsified

Is the quantum Mixmaster (Artin) billiard spectrum Poisson, despite the classical dynamics being chaotic?

slug
artin-billiard-maass
state
run
created
2026-09-14
outcome
falsified
script
R3_artin_billiard_maass.py
artifacts
[~/R3_sv_9-50.tsv (Y=0.5, BernoullisBook), ~/mapofmath/R3_sv_9-50_Y0.42.tsv (Y=0.42, M5), ~/mapofmath/R3_kept_position_9-50.txt, ~/mapofmath/lmfdb_odd.txt, ~/mapofmath/lmfdb_even.txt]
concepts
[modular-forms, random-matrix-theory, dynamical-systems]
next
Extend the Maass-form window to R ≈ 150 (Hejhal, BernoullisBook) — does ⟨r⟩ drift from GOE toward Poisson where the arithmetic anomaly is claimed | builds_on: 029
source
../lab/runs/029-artin-billiard-maass.md

Predictionthe level-spacing ratio ⟨r⟩ ≈ 0.39 (Poisson) for odd Maass eigenvalues with R in [9, 150]

Falsifier⟨r⟩ near 0.53 (GOE) — the arithmetic-quantum-chaos anomaly does not hold on this object, and the spectrum is that of a generic chaotic billiard after all

VerdictFALSIFIED — ⟨r⟩ = 0.527 ± 0.033 on the 72 odd level-1 levels in R ∈ [9, 49.98]: 4.3σ from Poisson 0.38629 and within 1σ of GOE 0.5307 (large-N) and 0.53590 (3×3 surmise). The falsifier fired. Completeness 72/72 against LMFDB, none missed or mislocated, Weyl predicting 72.7. Not an artefact of the method: LMFDB's own levels over the same window give the same 0.527, and the estimator reproduces both ensemble controls. SCOPE, not a hedge on the token: the arithmetic Poisson anomaly is an asymptotic claim, and the sealed prediction names R ∈ [9, 150] while this scores R ∈ [9, 49.98] — the bottom third of the sealed range, ~72 of ~818 odd levels (8.9%), where the Weyl log term is 43% of the count against 15% at R = 150. A GOE-like bottom window does not settle the anomaly at large R.

Unblocked — the patch is in the repo. All four fields are present (state: open per the daily loop — "sized" is the prose term, no run carries it as a frontmatter state). The smoke-test bug (below) is fixed, validated on three known eigenvalues, and now in the repo R3_artin_billiard_maass.py (commit 3c97382). The full ⟨r⟩ scan's first attempt was void — orphaned workers computing into a dead pipe after a double launch (see below) — so no full scan has completed; a clean single-process relaunch is running (PID recorded at launch), and the ⟨r⟩ verdict is not in. Vet the candidate list before believing any GOE result (see the caveat).

What it tests. The Artin billiard is the quotient of the hyperbolic plane by PSL(2,ℤ) — the classical geodesic flow is strongly chaotic, so a generic quantization would give GOE (⟨r⟩ ≈ 0.53). The arithmetic-quantum-chaos anomaly is that the Maass eigenvalues instead behave like an integrable system, Poisson (⟨r⟩ ≈ 0.39), because the Hecke operators supply a hidden symmetry. This run measures ⟨r⟩ on the odd spectrum and reads which regime it sits in.

Validation. The first odd eigenvalue must come out at R = 9.5337 — a known value; if the scan misses it, the eigenvalue-finder is wrong and nothing downstream is trustworthy.

Sizing. Hejhal's method, scan step 0.02, M = 40 — about a day single-core, bottlenecked on mpmath's Bessel K with imaginary order. Runs on BernoullisBook.

Smoke test found a silent bug (2026-09-14) — the reason this is blocked. The Hejhal scan returned an empty candidate list: no eigenvalue at 9.5337, none anywhere, and no crash. Diagnosis: kbess returns K_{iR}(2πny)·e^{πR/2}, and at n = 18, y = 0.5 the argument is ≈ 56, so the matrix columns span nineteen orders of magnitude. The smallest singular value was measuring the tiniest column's scale, not linear dependence — the values rose smoothly from 2.44×10⁻¹⁹ to 3.52×10⁻¹⁹ across the window with no structure, and the lone jump at R = 9.67 was Nmax ticking 18 → 19, a discretisation artefact. Fix: normalise each column to unit norm before the SVD. With that, the same window gives a clean V-shaped minimum — 0.193 falling to 0.0031 at R = 9.535 and back up, a factor of sixty, against the expected 9.5337 on a 0.005 grid. The patch has since been validated (next paragraph) and is now in the repo copy of R3_artin_billiard_maass.py (commit 3c97382).

Validation passed (2026-09-14). With the column-normalisation patch the scan recovers three known odd eigenvalues — 9.54, 12.18, 14.36 against expected 9.5337, 12.1730, 14.3585, each within the 0.005 grid step. The finder works; the earlier empty list was the bug, not a null.

Caveat on the statistic — vet before believing a GOE result. The same scan also returned three candidates not in the expected list: 12.42, 12.80, 14.82. If those are spurious they inflate the level count and bias ⟨r⟩ upward toward 0.53 — GOE, the falsifier direction. So a GOE-looking result is not believable until the candidate list is vetted: cross-check each candidate against LMFDB's Maass-form table (named in R3's own REFERENCES) before scoring the prediction. A false GOE built from spurious levels would look exactly like a real one — the same shape as the empty-list bug, one rung up: there the detector's silence was untrustworthy, here its extra hits are.

Void first attempt, and the timing (2026-09-14). R3 was accidentally launched twice on the same file. Killing the parent (kill) did not stop its multiprocessing fork pool — the workers ran on for about four hours computing into a dead pipe until BrokenPipeError, and were cleared with pkill -9 -f R3_artin (see OPS, and the MANUAL launch note). So the first attempt's output is not merely untimed — it is void: computed by orphaned workers with no reader. The current run is a clean single-process relaunch with its PID recorded at launch. No full scan has completed, so the docstring's ~24-hour estimate remains unverified by any completed run. (Two runs writing one log truncate it the same way two writing one --save target clobber; MANUAL covers both.)

Firsts. This is the first run launched on BernoullisBook, and the first real test of its clamshell sleep behaviour under a long job (see MANUAL, "Launching a long run": lid open, on power, caffeinate -i).

Amendment (2026-09-20): a two-height filter; Y₂ = 0.42 validated; the detection threshold made local.

The filter. An eigenvalue does not depend on the sample height Y; a spurious minimum of the smallest singular value (sv) does. R3_artin_billiard_maass.py (commit 520514a) scans a second height with --Y, into its own headed TSV, and --score H1 --height2 H2 keeps only candidates found at both heights. Height 1 is Y = 0.5. The [9, 50] scan launched on BernoullisBook before the filter existed (pid 7079, writing ~/R3_sv_9-50.tsv) is height 1 as it stands, and is not rerun. That was checked against the data, not assumed: a snapshot matches a local Y = 0.5 run bit for bit at all 300 shared points of [9, 15].

Y₂ = 0.42 validated on [9, 15]. This was the first value tried. Height 1 reproduced the three extras (12.414, 12.794, 14.818). At Y = 0.42 all three vanish, with no minimum within 0.24–0.62 and their sv at 1.06–1.86× the median. The three known levels 9.5337, 12.1730 and 14.3585 are kept at both heights. At Y = 0.5 alone no threshold could have separated them: the spurious 12.794 dips deeper (0.008× median) than the real 9.5337 (0.044×). The height-2 scan on [9, 50] then ran on the M5 in 13 min (2,050 points, ~/mapofmath/R3_sv_9-50_Y0.42.tsv).

Threshold made local, on principle. A detection threshold must be relative to the local baseline. The typical sv drifts about 15× across [9, 50] (median 0.30 on [9, 14) to 0.02 at the top, at Y = 0.42), so any whole-range statistic fails at one end or the other. The global-median cut dropped the real 12.1730 (sv 0.00985 against 0.00856) and printed MISS; the streamed output had caught it. At high R it admitted eight minima that fail a local cut. The cut is now 0.1× the median sv within ±1.0 in R, for both the end-of-run score and the intersection. This was decided before any vetted ⟨r⟩ was computed, on that principle, and not by its effect on ⟨r⟩. OPS entry: a threshold set against a whole-range statistic fails wherever the baseline drifts across the range.

The eight high-R minima, adjudicated by the filter before LMFDB. Height 1 is not yet computed there on BernoullisBook, so windows of ±1.0 in R around each were computed at Y = 0.5 on the M5. They are bit-identical to what pid 7079 will write. Depth is sv ÷ the local median; the cut is < 0.1.

minimumY = 0.5: nearest local minimum, depthY = 0.42: nearest local minimum, depthunder the filter as built
32.93332.931, 0.020×32.933, 0.109×dropped (only Y = 0.5 passes the cut)
39.82739.828, 0.051×39.827, 0.146×dropped (only Y = 0.5)
40.27240.272, 0.228×40.272, 0.125×dropped (neither passes)
43.38543.386, 0.075×43.385, 0.245×dropped (only Y = 0.5)
46.56546.564, 0.024×46.565, 0.109×dropped (only Y = 0.5)
48.35548.353, 0.002×48.355, 0.153×dropped (only Y = 0.5)
49.10749.101, 0.029×49.107, 0.109×dropped (only Y = 0.5)
49.284none nearby (nearest 49.439)49.284, 0.136×dropped: moves by 0.155 between heights

Open, not decided here: depth or position. All eight are dropped by the filter as built, which requires the depth cut at both heights. But seven of them are local minima at the same R at both heights (within 0.006). The three confirmed spurious minima had no minimum within 0.24 at the second height. The invariance behind the filter is about position: a true eigenvalue's R does not depend on Y. Nothing promises that its dip is equally deep at every Y. Read that way, six of the seven (all but 40.272, which is shallow at both heights) look real, and a depth-at-both rule would discard them. That argument is from principle, but it was noticed by looking at these eight, so it does not carry the weight of the threshold decision above. LMFDB (lmfdb_odd.txt) now serves as the independent check on which rule is right, before the rule is changed or any vetted ⟨r⟩ is computed.

Amendment (2026-09-26): scored — ⟨r⟩ = 0.527 ± 0.033, the falsifier fires. A scoring pass over the two completed [9, 50] scans; nothing was recomputed. Height 1 is ~/R3_sv_9-50.tsv (Y = 0.5, BernoullisBook, 2050 points); height 2 is ~/mapofmath/R3_sv_9-50_Y0.42.tsv (Y = 0.42, M5). The kept level list is ~/mapofmath/R3_kept_position_9-50.txt.

The validation MISS was the threshold, not the finder. Height 1's end-of-run log said "VALIDATION 9.5337: MISS", because that scan predated the local-median cut. Rescored under the current threshold, all three validations PASS. At R = 9.54 the sv is 0.01515 against a whole-range cut of 0.00860 (miss) and a local cut of 0.06044 (pass) — the same defect that dropped 12.1730.

The filter rule is position, not depth. A true eigenvalue's R does not depend on Y; its dip depth does. Keeping candidates that are a local minimum at the same R (within 0.02) at both heights gives 72 kept, 72/72 of LMFDB found, none missed, none mislocated, with 2 survivors that match no LMFDB level. The depth-at-both rule the script implements keeps 50 and loses 21 real levels — 29% missing, biased toward Poisson, which is this run's own predicted answer. Depth-at-one-plus-position keeps 68 and loses 3. The position rule's false-positive rate is 2 in 72, with zero real levels lost.

Completeness first, because the bias points at the prediction. Weyl's odd count gives N_odd(49.98) − N_odd(9) = 72.7 against 72 in LMFDB and 72 kept.

Parity is clean. The two unmatched survivors are not even-parity leakage: against lmfdb_even.txt (49 even level-1 forms, R ≤ 50), 44.4927's nearest even level is 44.4263 (Δ = 0.0663) and 47.3608's is 47.4229 (Δ = 0.0621), both far outside the 0.02 tolerance, and neither has an odd match either. They are spurious position-rule coincidences.

The grid step is the binding constraint, not the filter. Two LMFDB pairs are separated by less than the 0.02 scan step — (40.8581, 40.8805) at Δ = 0.022 and (44.2821, 44.2950) at Δ = 0.013 — so each registers as a single minimum. Decomposing the measured value against the truth:

contributionΔ⟨r⟩running
truth: LMFDB odd reference, unmerged (72 levels)—0.527
the grid merging those two unresolvable pairs+0.0270.554
the 2 spurious survivors−0.0020.553
the scan's own positional error+0.0010.553

So 0.527 ± 0.033 is the result, and 0.553 ± 0.031 is the grid-affected measurement. The whole gap is the grid step, robust to where the merged level is placed (0.554 / 0.555 / 0.554 for midpoint / lower / upper). The scan's actual performance claim is the +0.001: its positional error is RMS 0.0038, max 0.0171, against a 0.02 step. Resolving those two pairs needs a finer step near them, not a better filter.

A parity limit the count does not show. Three kept levels sit within 0.02 of an even level — 30.403, 35.858, 42.629 — but these are accidental near-degeneracies in LMFDB itself (Δ = 0.006, 0.017, 0.003 between an odd and an even level). The basis is odd, so the dips are odd levels. At those three R the scan cannot attribute parity, though the level count is unaffected.

Controls. The ⟨r⟩ estimator returns 0.3861 on synthetic Poisson spectra of 72 levels (expected 0.38629) and 0.5295 on 72×72 GOE matrices (expected ≈ 0.5307). In 4,000 synthetic 72-level Poisson spectra, none reached 0.553.

The result is not about the method. LMFDB's own levels over this window give 0.527, so a GOE-like answer here is a fact about the bottom of the odd level-1 spectrum, not about Hejhal's algorithm or this scan.

Scope — recorded as scope, not as a hedge on the token. The sealed prediction names R ∈ [9, 150]; this scores R ∈ [9, 49.98], the bottom third of that range and ~72 of ~818 odd levels by Weyl, 8.9%. The Weyl log term is 43% of the count at R = 50 against 15% at R = 150. The arithmetic anomaly that predicts Poisson is an asymptotic statement, and the degeneracies that drive it grow with R. So the falsifier fired on the window that was scanned, and a GOE-like bottom window does not settle the anomaly at large R. Extending toward the sealed R = 150 is the outstanding work, and it is a much larger computation than this one.

generated 2026-10-25the lab index