The Mathematical Menagerie: One Tool Was Not Enough

2026-07-29 • 7 min read

I started planning this project as one tool. I wanted something that computes

$$ \int_0^T \|\omega(t)\|_{L^\infty}\,dt = \infty \iff \text{singularity at } T $$

the Beale-Kato-Majda quantity, or something close to it, and watches it while a 3D fluid field evolves. If it blows up, that is the criterion, made visible. I spent a few days on that plan before I started writing any code, and while I was planning it I realized the plan was wrong. Figuring out why took longer than the code I have written since.

The plan I threw out

The one-tool plan assumes the norm is the hard part. It is not. Computing $\|\omega\|_{B^0_{\infty,\infty}}$ on a smooth field, once you have a Littlewood-Paley decomposition, is direct. That part is working now, and it was never where the difficulty was going to live. The hard part is upstream: why does the nonlinear advection term $(u\cdot\nabla)u$ resist the energy estimates that work for linear equations? A single tool that only measures a norm cannot show that, because measuring a quantity is not the same as explaining what forces it to grow.

The second thing the one-tool plan assumed was that I would recognize blow-up if I saw it. 3D Euler and Navier-Stokes blow-up is open. Nobody has ever produced a genuine example, numerically or otherwise, at any resolution anyone can currently run. If all I had was a norm-tracker pointed at an equation where nobody knows whether blow-up happens, I would have no way to check whether my diagnostic was even built correctly. A thermometer is only as trustworthy as your ability to test it against a temperature you already know.

Both parts of the plan were wrong in the same direction. I was treating the criterion as a measurement problem, when it is a measurement problem sitting on top of a control problem, sitting on top of the fact that I had no ground truth to calibrate against.

Three tools, not one

That is why this project split into three repositories instead of staying one. Each exists because the one-tool plan failed at a specific point, not because three tools sound more impressive than one.

dyadic-besov-analyzer is the measurement layer, and it is the only one of the three that is actually built. It takes a 3D vector field, applies a smooth Littlewood-Paley decomposition, and computes $\|u\|_{B^s_{p,q}}$ for arbitrary $s$, $p$, $q$, including both $H^s = B^s_{2,2}$ and the scale-invariant $B^0_{\infty,\infty}$ on the same field, so the two can be compared directly instead of taken on faith from a textbook inequality. The Littlewood-Paley filters form a smooth partition of unity, and $\sum_j \varphi_j$ comes out to $1$ with error 0.000e+00 at float64 on every grid I have tested. That surprised me at first, since I expected some residual from the smooth cutoff's table interpolation. There is none, because the construction telescopes algebraically: the interpolation error in each filter cancels out of the partial sum instead of accumulating in it.

The Besov norm of a random field came out at $88.5\%$ of its direct $L^2$ norm, not $100\%$, and I first read that gap as a bug. It is not one. Bahouri, Chemin, and Danchin state $H^s$ and $B^s_{2,2}$ as equivalent norms, not identical ones, precisely because the dyadic blocks here overlap in frequency instead of being orthogonal projections. A ratio of exactly $1$ would have meant I had built a sharp Fourier truncation by accident instead of the smooth decomposition the theory actually calls for.

def besov_norm(u, s, p, q, j_max, dyadic, freq_radius, dx):
    shell_norms = []
    for j in range(-1, j_max + 1):
        delta_j_u = dyadic.delta(u, j, freq_radius)
        lp = grid_lp_norm(delta_j_u, p, dx)
        shell_norms.append(2.0 ** (j * s) * lp)
    if math.isinf(q):
        return max(shell_norms)
    return sum(v ** q for v in shell_norms) ** (1.0 / q)

That is the entire norm once the blocks exist: weight each shell by $2^{js}$, combine in $\ell^q$. The theorem is short. Trusting that the code implements the theorem, and not something that merely resembles it, is what took the actual work.

kato-ponce-engine does not exist yet as code. It is a Manifest, a strategic goal and a list of objectives, and nothing else, and I want to say that plainly instead of letting the announcement imply otherwise. Its job, once built, is the control problem the first tool cannot touch: the Kato-Ponce commutator estimate

$$ \| J^s(fg) - f J^s g \|_{L^p} \le C\Big( \|\nabla f\|_{L^{p_1}}\|J^{s-1}g\|_{L^{p_2}} + \|J^s f\|_{L^{p_3}}\|g\|_{L^{p_4}} \Big) $$

(Kato and Ponce, Comm. Pure Appl. Math. 41 (1988), 891 to 907), the estimate that lets you bound derivatives of a product without paying for every derivative twice, which is what lets energy methods survive contact with the quadratic nonlinearity in Navier-Stokes. This is where I expect to find something specifically wrong in the same way I was wrong about the norm ratio above. Bony's paraproduct decomposition $f\cdot g = T_f g + T_g f + R(f,g)$ (Bony, Ann. Sci. ENS 14 (1981), 209 to 246) splits a product into three frequency-interaction regimes for a reason, and I do not yet have working intuition for why the high-high term $R(f,g)$ is the dangerous one. Building the engine is how I plan to find out.

nls-3d-blowup-sim is also just a Manifest right now. Its job is to be the ground truth the first two tools cannot produce on their own. The 3D focusing cubic NLS equation $i\partial_t\psi + \Delta\psi + |\psi|^2\psi = 0$ is mass-supercritical and energy-subcritical, and for negative-energy initial data it blows up in finite time, not conjecturally, but as a theorem, via Glassey's virial identity (Glassey, J. Math. Phys. 18 (1977), 1794 to 1797). That is the thermometer I can actually calibrate against. If a $B^0_{\infty,\infty}$-style diagnostic run against NLS does not sharpen as $t\to t_{\text{blowup}}$ the way the Sobolev embedding $H^1(\mathbb{R}^3)\hookrightarrow L^6(\mathbb{R}^3)$ says it should, the diagnostic is wrong, and I will know that before ever pointing it at an equation where the answer is unknown.

What changed

I no longer think of this as a Besov norm calculator, a commutator engine, and an NLS simulator. I think of it as one question, what actually obstructs global regularity for 3D incompressible flow, split across the three places I got stuck trying to answer it with a single tool. I could not measure the right quantity without the decomposition. I could not explain why the quantity grows without the commutator estimates. I could not check whether my explanation was even self-consistent without an equation where blow-up is a proven fact rather than an open problem.

The general lesson is not specific to fluids. A single measurement tool answers "how much," never "why," and never "am I even measuring the right thing." Those are two separate jobs, and my first plan was, without meaning to be, an attempt to make one tool do both.

References