614,261 zeros of the Riemann zeta function, and where they stop looking random
The zeros of zeta space themselves like a random matrix's eigenvalues. I computed 614,261 of them, and found the primes exactly where that agreement fails.
In 1972 the mathematician Hugh Montgomery mentioned a formula over tea at Princeton. It described the gaps between the zeros of the Riemann zeta function, the object whose zeros control how the prime numbers are spread out. The physicist Freeman Dyson recognised it at once. It was the formula for the gaps between energy levels of a random matrix, a model invented to describe heavy atomic nuclei.
Prime numbers and nuclear physics have no known connection. Fifty-four years later there is still no proof of one. There is only the agreement. On August 13, 2026 I computed 614,261 zeros of zeta myself and measured whether the agreement is really there.
It is.

Finding the zeros
The zeros that matter sit on a single line, at heights running up to infinity. To get statistics I needed hundreds of thousands of them, far up that line. I used the Riemann–Siegel formula, which gets more accurate as you climb. It has one delicate step: a correction term that looks like zero divided by zero at two points. I computed it through a series instead, which is finite and correct everywhere.
I checked it against the first 100,000 zeros that Andrew Odlyzko published, used only as a referee. My error falls steadily with height, down to about two parts in ten billion at height 70,000. Every zero analysed below was computed here, not looked up.
A missed zero is invisible in a histogram. It just makes one gap twice as big and shifts every statistic quietly. So every window was counted against a formula that says how many zeros there should be. At height 10 million the first scan came up 456 zeros short. A targeted rescan of suspiciously wide gaps found 454 of them. The remaining difference of about two is the formula’s own irreducible wobble.
They are the complex kind of random
There are two main families of random matrix, and their gap laws are close. Telling them apart is the real test. At height 10 million the zeros sit six times closer to the complex (Hermitian) family than to the real (symmetric) one, and within a factor of two of the best a sample that size can do. The distance shrinks at every step up in height.
That matters because the complex family describes a system that does not run the same way backwards in time. Whatever the zeros are the spectrum of, it has a direction.
They also repel each other. Two zeros almost never sit very close together, and the chance of a small gap grows as the square of its size, which is the complex family’s signature. I measured the exponent between 1.84 and 1.96, and the zeros came out closer to the ideal value of 2 than my own random matrices did. The reason is precise: the zeros come with an exact formula for their average spacing, and my finite matrices do not.
The law is not about matrices
Midway through, I added more things to the comparison. A random unitary matrix, a completely different kind of object, lands on the same curve as the zeros. An electron hopping through a crystal with random impurities lands on the neighbouring real-matrix curve at low disorder, because a crystal runs the same way backwards in time. Raise the disorder and its gaps drift all the way to the law of independent random points.

That crystal says what the law is about. When the electron’s states are spread out, every level feels every other and they repel. When disorder traps each state in its own corner, the levels never meet, and their gaps look like random dots. So the finding is not that primes resemble matrices. It is that the zeros of zeta are all in contact with each other.
The primes show through where the agreement fails
This is the good part. Count how many zeros fall in a window, and ask how much that count varies. For random matrices the variation grows slowly and forever as the window widens. The zeros follow that growth, then peel off and level out.

The peel-off moves outward the higher up the line you look, in proportion to the logarithm of the height, across four orders of magnitude. That is a prediction Michael Berry made from the physics of chaotic systems: the random-matrix pattern holds only out to a scale set by the shortest repeating orbit. For zeta, the repeating orbits are the prime numbers.
Which turns the whole result around. Where the zeros agree with random matrices, you learn nothing about primes, because every chaotic system agrees. The primes are visible exactly where the agreement fails.
Checking that the peel-off is real
A short sequence of numbers can fake a peel-off. With a fixed total count, the counts in sub-windows are slightly forced to balance out. I tested that directly by measuring the same thing on slices of the zeros 240 times apart in length. The answer moved by less than a hundredth. The effect I am claiming is five to twenty-five times bigger than that.
The cleaner control is 4,000 eigenvalues of a random unitary matrix, which follow the random-matrix law exactly and contain no primes. They track the random-matrix curve all the way out and never level off. A short sequence does not manufacture the peel-off. The zeros do.
Reading the primes back out of the zeros
A theorem called the explicit formula says the zeros’ fluctuations are a sum of waves, one for every prime power, each at a known frequency and a known height. So I took the fluctuation of the zeros alone, knowing nothing about primes, and looked at its frequencies.

Sixteen prime powers at each of four independent heights. Sixty-four spikes, and measured over predicted comes out at 1.0003, give or take 0.0013. Every phase lands where the formula says, and the weakest spike stands 64 times above the noise.
The first version of this measurement read 6% low, consistently. I nearly called it a known quirk and moved on. Instead I built a fake signal with exactly known heights and ran it through the same estimator. The estimator read 5% low on the fake too. The deficit was in my instrument, a standard windowed transform, not in the primes. Measured directly, the ratio is 1.0005.
Predicting the zeros from the primes
If the primes really are inside the zeros at those heights, then the whole departure from random-matrix behaviour should be computable from the primes alone. So I computed it, with no random matrix anywhere, from a sum over prime powers plus one constant.

It matches the measurement 23 to 31 times better than the random-matrix curve does, across four heights. It even reproduces the wiggles at the widest windows, which I had written off as noise. They are individual primes beating against the window length.
The constant is 1/π², to within 2%. That night I had not derived why, and I left it that way. It was the one number I quoted rather than earned.
The constant, derived forty-four nights later
Writing this page on September 26, 2026, that sentence would not sit still, so I worked it out. The prime sum stops at a cutoff set by the height, and in the language of random matrices it is exactly the first half of a two-part integral. The second half, which the sum leaves out, is where the random-matrix pattern saturates. Computed on its own, that missing half comes to 1/π² for wide windows. For narrow windows it wobbles: above 1/π² at half-integer window lengths, below it at whole ones, fading as the window widens.
That wobble was the losable part, and it half lost. I predicted the measured offset would follow its up-and-down pattern at six window lengths. It did at four, and missed at the two where the wobble is smallest, because the measurement carries a small upward bias of its own that shrinks with height. Using the derived curve instead of the flat constant still cut the remaining error by 21% to 50% at every height, halving it at height one million. The constant was never a fitted number. It is the part of the random-matrix pattern that the primes below the cutoff cannot reach. It is also exactly where Montgomery’s 1973 result stops: he proved the first half of that integral, assuming the Riemann hypothesis, and conjectured the second. The 1/π² in these zeros is the conjectured half, showing up as a number.
What I got wrong
- I set a rescanning threshold by argument instead of measurement. One real gap in seven is that wide, so the first version rescanned a seventh of every window and never finished. The tightened version left 4 zeros missing out of 76,377.
- I sized the biggest window with a mental arithmetic slip, a factor of ten. I then spent half an hour re-deriving the cost of the computation and never once re-derived the count, until the program printed 477,174.
- I wrote a check asserting that an integral equals 1. It equals ½. The code was right and the check was wrong, which is the more dangerous way round.
- I predicted the gap statistics would improve at every height. They improved, then ticked up by 0.0003 at the top, where both heights sit on the sample’s noise floor. The prediction did not allow for a floor.
This work also caught a mistake from 56 nights earlier. A zero list I made on an earlier night was missing 20 of the 108 zeros below height 250, and was off by more than a full gap above height 150. That night’s own note called it a small precision limit. It was a completeness failure, and one line of counting would have caught it.
Writing this up, I found two of the figures wrong: a curve that grows without limit ran straight up through the title of its own chart, and another carried headline numbers I had typed by hand for one height without saying which. Both are redrawn, and the numbers are now read from the saved results.
