Navier–Stokes Blowup: An Interactive Explainer
An interactive walkthrough of OpenAI's announcement, On the Navier–Stokes Millennium Prize Problem (September 8, 2026). Sliders and plots below let you play with the scaling arithmetic that sits at the heart of the claim.
1. What was announced
OpenAI reported an AI-generated resolution of the Navier–Stokes existence-and-smoothness problem — in the negative direction: smooth initial data plus a smooth force can produce a genuine blowup in finite time. They released a writeup and a Lean formalization, and separately a disproof of regularity for the unforced Euler equations.
The three headline claims:
Claim | Content |
|---|---|
Navier–Stokes | Fluid starting at rest, smooth force, finite energy throughout, velocity unbounded in finite time |
Millennium formulation | Establishes statement "C" (and "D"), the disproof side |
Euler | Separate resolution of the unforced Euler regularity question |
They also stated they do not intend to claim the prize money for the result.
2. The equations
For an incompressible fluid of constant density in
together with the incompressibility constraint
Here
The problem: starting from smooth
Blowup means
for some finite
3. Interactive: the self-similar scaling budget
The obstruction to blowup is a bookkeeping problem. Suppose near the singularity time
with velocity amplitude
Each term in the equation then has its own power of
import marimo as mo
import numpy as np
import matplotlib.pyplot as plt
beta_slider = mo.ui.slider(0.30, 0.70, 0.01, value=0.45, label="length-scale exponent β")
beta_sliderbeta = beta_slider.value
alpha = 1.0 - beta # advection balance: α = 1 - β
energy_exp = 3 * beta - 2 * alpha # energy ~ U² ℓ³ = (T-t)^(3β-2α)
viscous_exp = alpha + 1 - (alpha + 2 * beta)
mo.Html(
f"<p>α = <b>{alpha:.2f}</b> · "
f"energy exponent <b>{energy_exp:+.2f}</b> · "
f"viscous–inertia gap <b>{viscous_exp:+.2f}</b></p>"
)def scaling_plot(b):
a = 1.0 - b
s = np.linspace(1e-3, 1.0, 400) # s = T - t
fig, ax = plt.subplots(figsize=(6, 3.6))
ax.loglog(s, s ** (-a), label="velocity U ~ s^-α")
ax.loglog(s, s ** b, label="length ℓ ~ s^β")
ax.loglog(s, s ** (3 * b - 2 * a), label="energy U²ℓ³")
ax.set_xlabel("s = T - t (time to blowup)")
ax.legend(fontsize=8)
ax.invert_xaxis()
return fig
scaling_plot(beta_slider.value)Two things to notice while dragging. The velocity curve blows up as
4. Interactive: the vortex geometry
The announced solution is described as a vortex that spirals inward while stretching along its axis — the "spaghetti" picture. Incompressibility ties the two together: if a tube of fluid narrows radially by a factor
strain_slider = mo.ui.slider(0.2, 3.0, 0.1, value=1.2, label="axial strain rate γ")
strain_sliderswirl_slider = mo.ui.slider(0.5, 6.0, 0.25, value=3.0, label="swirl strength Γ")
swirl_sliderdef spiral(gamma, gam_swirl, n=5, steps=1400, dt=0.004):
paths = []
for r0 in np.linspace(0.35, 1.0, n):
r, th, z = r0, 0.0, 0.25
pts = []
for _ in range(steps):
r += dt * (-0.5 * gamma * r)
th += dt * gam_swirl / (r ** 2 + 0.02)
z += dt * gamma * z
pts.append((r * np.cos(th), r * np.sin(th), z))
paths.append(np.array(pts))
return pathsdef vortex_fig(gamma, gam_swirl):
fig = plt.figure(figsize=(6.4, 4.6))
ax = fig.add_subplot(111, projection="3d")
for p in spiral(gamma, gam_swirl):
speed = gam_swirl / (np.hypot(p[:, 0], p[:, 1]) + 0.02)
ax.scatter(p[:, 0], p[:, 1], p[:, 2], c=speed, cmap="cool", s=1.2)
ax.set_xlabel("x"); ax.set_ylabel("y"); ax.set_zlabel("z")
ax.set_title(f"inward spiral + axial stretch (γ={gamma:.1f}, Γ={gam_swirl:.2f})")
return fig
vortex_fig(strain_slider.value, swirl_slider.value)Turn
5. Why "big yet cancelling" is the hard part
The announcement's key technical remark is worth restating carefully. It is easy to make velocity blow up if you are allowed to inject an infinite force. The requirement is that
stays smooth and bounded while each individual term on the right diverges. So the construction needs a near-exact cancellation among four separately-exploding quantities, sustained all the way to time
You can feel the difficulty in one number: if
6. How the proof was produced
The methodology is arguably as notable as the result:
A new internal model, described as more capable than GPT-6 Astra, in training since late August 2026.
A multi-agent system with cached web access and code execution, organized into communicating groups; the Navier–Stokes group ran on the order of 10,000 concurrent agents.
Different groups were seeded with different variants of the problem statement — versions "A"/"B" (proof side) and "C"/"D" (disproof side) — so the search covered both outcomes.
The easier Euler warm-up problem was solved first by roughly 100 agents over about 50 hours, and that result was then fed back as a prompt to the Navier–Stokes groups.
Total resolution time was about 88 hours from launch, plus about 17 hours of Lean formalization.
Aggregate cost across all attempted problems: about 4.9 million inter-agent messages and roughly 300 billion output tokens, of which 2.7 million messages and about 130 billion tokens went to Navier–Stokes.
7. Concurrent work and open questions
There was parallel activity: Levent Alpöge and Tristan Buckmaster independently obtained a resolution of the forced Euler problem, and OpenAI's post recognizes their priority on that. The two Euler results differ in the forced-versus-unforced distinction.
Worth keeping in mind as you read:
A Lean formalization is strong evidence, but its value depends on whether the formal statement faithfully encodes the Clay problem's conditions. That is a human review question, not a machine one.
The result is a disproof of global regularity, which means the physical continuum model breaks down in this regime rather than being validated.
Independent verification by the fluid dynamics community is the step that actually settles it.
Sources: the announcement, the paper, the Euler paper, and the Lean formalization.