Current task: —

Updated 08-19-2026

Equation 48: The Keating–Snaith Moment Conjecture — In-Depth Analysis


1. What This Equation Says (Plain-Language Overview)

The Keating–Snaith conjecture is arguably the single most influential bridge between random matrix theory (RMT) and the Riemann zeta function. It answers a question that had been open for over 80 years:

What is the asymptotic behavior of the moments $$M_k(T) = \frac{1}{T}\int_0^T \left|\zeta\left(\tfrac{1}{2}+it\right)\right|^{2k} dt \quad \text{as } T \to \infty\ ?$$

The conjectured answer:

$$\boxed{\ M_k(T) \sim a_k \, g_k \, (\log T)^{k^2}\ }$$

where:

The deep insight: the analytic difficulty of the problem lives entirely in $g_k$, and RMT computes it exactly.


2. Historical Background

2.1 The classical era (1918–1998)

Year Who Result
1918 Hardy & Littlewood Proved $M_1(T) \sim \log T$. (Coefficient: $a_1 g_1 = 1$ ✓)
1926 A. E. Ingham Proved $M_2(T) \sim \frac{1}{2\pi^2}(\log T)^4$. (Coefficient: $a_2 g_2 = \frac{6}{\pi^2}\cdot\frac{1}{12} = \frac{1}{2\pi^2}$ ✓)
1984–98 Conrey & Ghosh Conjectured the $k=3$ coefficient: $\frac{42\, a_3}{9!}$ — via number theory, not RMT.
1998 Conrey & Gonek Conjectured $k=4$: coefficient $\frac{24024\, a_4}{16!}$ — using long Dirichlet polynomials.

For general $k$, nobody could even guess the constant. The pattern $1, 2, 42, 24024$ (values of $g_k \cdot (k^2)!$) was a complete mystery.

2.2 The RMT connection (1973–2000)

Keating and Snaith received the 2010 Fröhlich Prize (Keating) and related recognitions largely for this work; the paper launched an entire subfield.

2.3 The full recipe (2005)

Conrey, Farmer, Keating, Rubinstein, Snaith (CFKRS), "Integral moments of L-functions", Proc. London Math. Soc. 91 (2005) 33–104, extended the conjecture to all lower-order terms: $M_k(T)$ should be a polynomial of degree $k^2$ in $\log T$, with all coefficients given explicitly by an autocorrelation-of-characteristic-polynomials formula. Numerical agreement is astonishing (10+ digits).


3. The Mathematics, Step by Step

Step 1: The model

Let $U \in U(N)$ be Haar-random unitary. Its characteristic polynomial on the unit circle: $$Z(U,\theta) = \det(I - Ue^{-i\theta}) = \prod_{n=1}^{N}\left(1 - e^{i(\theta_n - \theta)}\right).$$

Dictionary: the eigenangle density is $\frac{N}{2\pi}$; the zeta-zero density at height $T$ is $\frac{1}{2\pi}\log\frac{T}{2\pi}$. Matching gives the fundamental calibration: $$N = \log\frac{T}{2\pi}.$$

Step 2: The exact CUE moment via Selberg's integral

Keating and Snaith evaluated the $2k$-th moment over the Circular Unitary Ensemble using Selberg's integral (Atle Selberg, 1944 — proved in a Norwegian journal and nearly forgotten for decades):

$$\mathbb{E}_{U(N)}\left[|Z(U,\theta)|^{2k}\right] = \prod_{j=0}^{N-1}\frac{j!\,(j+2k)!}{\left((j+k)!\right)^2}$$

As $N \to \infty$ this behaves as $g_k N^{k^2}$ with

$$g_k = \prod_{j=0}^{k-1}\frac{j!}{(j+k)!} = \frac{G(k+1)^2}{G(2k+1)}$$

($G$ = Barnes G-function). Values: $g_1 = 1$, $g_2 = \frac{1}{12}$, $g_3 = \frac{1}{8640} = \frac{42}{9!}$, $g_4 = \frac{24024}{16!}$ — exactly reproducing the mysterious 42 and 24024 from Conrey–Ghosh and Conrey–Gonek. This was the smoking gun.

Step 3: The arithmetic factor

Primes are invisible to RMT (a unitary matrix has no arithmetic). The Euler product factor $a_k$ arises from "diagonal terms" in the classical divisor-function analysis: $$a_k = \prod_p \left(1-p^{-1}\right)^{k^2} \sum_{m=0}^\infty d_k(p^m)^2\, p^{-m}, \qquad d_k(p^m) = \binom{m+k-1}{m}.$$

Step 4: The conjecture and its checks

$$M_k(T) \sim a_k\, g_k\, (\log T)^{k^2}.$$

Rigorous progress since: Soundararajan (2009, Annals of Math.) proved conditional upper bounds $M_k(T) \ll (\log T)^{k^2+\varepsilon}$; Adam Harper (2013) sharpened to $\ll (\log T)^{k^2}$ under RH; Radziwiłł–Soundararajan and Heap–Radziwiłł–Soundararajan established matching unconditional lower bounds. The leading constant remains unproven for any $k \ge 3$.


4. Key Papers and Links

  1. Keating & Snaith (2000) — Random matrix theory and ζ(1/2+it), Comm. Math. Phys. 214, 57–89. https://doi.org/10.1007/s002200000261
  2. CFKRS (2005) — Integral moments of L-functions, Proc. LMS 91, 33–104. https://arxiv.org/abs/math/0206018
  3. Montgomery (1973) — The pair correlation of zeros of the zeta function, Proc. Symp. Pure Math. 24, AMS.
  4. Conrey & Ghosh (1998) — A conjecture for the sixth power moment of the Riemann zeta-function, IMRN 1998, 775–780.
  5. Soundararajan (2009) — Moments of the Riemann zeta function, Annals of Math. 170, 981–993. https://arxiv.org/abs/math/0612106
  6. Harper (2013) — Sharp conditional bounds for moments of the Riemann zeta function. https://arxiv.org/abs/1305.4618
  7. Keating & Snaith (2003) — survey: Random matrices and L-functions, J. Phys. A 36, 2859. (Excellent for a research paper's background section.)

5. Computational Examples in Python

5.1 Exact CUE moment, asymptotics, and the famous integers 1, 2, 42, 24024

from math import factorial
from fractions import Fraction

def cue_moment_exact(N, k):
    """E_{U(N)} |Z|^{2k} = prod_{j=0}^{N-1} j!(j+2k)! / ((j+k)!)^2  (exact rational)."""
    result = Fraction(1)
    for j in range(N):
        result *= Fraction(factorial(j) * factorial(j + 2*k),
                           factorial(j + k)**2)
    return result

def g_k(k):
    """Random matrix factor g_k = prod_{j=0}^{k-1} j!/(j+k)!  (exact rational)."""
    result = Fraction(1)
    for j in range(k):
        result *= Fraction(factorial(j), factorial(j + k))
    return result

print("k | g_k                 | g_k * (k^2)!   <-- the 'mystery integers'")
for k in range(1, 6):
    g = g_k(k)
    print(f"{k} | {str(g):>19} | {g * factorial(k*k)}")

# Verify the asymptotic  E|Z|^{2k} ~ g_k * N^{k^2}
print("\nRatio  E|Z|^{2k} / (g_k N^{k^2})  ->  1 as N grows (k=3):")
k = 3
for N in [10, 50, 200, 1000]:
    ratio = cue_moment_exact(N, k) / (g_k(k) * Fraction(N)**(k*k))
    print(f"  N={N:5d}:  {float(ratio):.6f}")

Output shows g_k * (k^2)! = 1, 2, 42, 24024, 701149020 — precisely the sequence number theorists could not explain before 2000.

5.2 The arithmetic factor $a_k$ via Euler product

import mpmath as mp
mp.mp.dps = 30

def a_k(k, prime_bound=10**5):
    """Arithmetic factor a_k = prod_p (1-1/p)^{k^2} * sum_m binom(m+k-1,m)^2 p^{-m}."""
    log_a = mp.mpf(0)
    ksq = k*k
    for p in mp_primes(prime_bound):
        p = mp.mpf(p)
        s, m = mp.mpf(0), 0
        while True:
            term = mp.binomial(m + k - 1, m)**2 / p**m
            s += term
            if m > 2 and term < mp.mpf(10)**(-35):
                break
            m += 1
        log_a += ksq * mp.log(1 - 1/p) + mp.log(s)
    return mp.e**log_a

def mp_primes(n):
    sieve = bytearray([1]) * (n + 1); sieve[0:2] = b'\x00\x00'
    for i in range(2, int(n**0.5) + 1):
        if sieve[i]:
            sieve[i*i::i] = bytearray(len(sieve[i*i::i]))
    return [i for i in range(2, n + 1) if sieve[i]]

print("a_1 =", a_k(1))                        # -> 1
print("a_2 =", a_k(2))                        # -> 6/pi^2
print("6/pi^2 =", 6/mp.pi**2)                 # check
print("a_3 =", a_k(3))                        # needed for the sixth-moment conjecture

5.3 Monte Carlo verification: random unitary matrices vs. Selberg's exact answer

import numpy as np
from scipy.stats import unitary_group

def monte_carlo_cue_moment(N, k, samples=20000, seed=42):
    rng = np.random.default_rng(seed)
    total = 0.0
    for _ in range(samples):
        U = unitary_group.rvs(N, random_state=rng)
        Z = np.linalg.det(np.eye(N) - U)
        total += abs(Z)**(2*k)
    return total / samples

N, k = 12, 2
mc    = monte_carlo_cue_moment(N, k)
exact = float(cue_moment_exact(N, k))
print(f"CUE N={N}, k={k}:  Monte Carlo = {mc:.3f},  Selberg exact = {exact:.3f}")

5.4 Testing the conjecture against ζ itself

import mpmath as mp
mp.mp.dps = 15

def zeta_moment(T, k, npts=2000):
    """(1/T) * integral_0^T |zeta(1/2+it)|^{2k} dt   (composite quadrature)."""
    f = lambda t: abs(mp.zeta(mp.mpc(0.5, t)))**(2*k)
    return mp.quad(f, mp.linspace(0.1, T, 40)) / T

k  = 1
T  = 2000
lhs = zeta_moment(T, k)
# Keating-Snaith leading order, with the calibrated N = log(T/2pi):
rhs = float(g_k(k)) * a_k(k) * mp.log(T)**(k*k)
print(f"k={k}, T={T}")
print(f"  measured moment      : {lhs}")
print(f"  a_k g_k (log T)^{k*k}   : {rhs}")
print(f"  ratio                : {lhs/rhs}")
# For k=1 the full asymptotic is log(T/2pi) + 2*gamma - 1; try:
rhs_full = mp.log(T/(2*mp.pi)) + 2*mp.euler - 1 + mp.log(2*mp.pi)  # ≈ log T + 2γ - 1
print(f"  with lower-order term: {lhs/rhs_full}")

Note on convergence: because the error terms decay only in powers of $\log T$, leading-order agreement improves very slowly — this is exactly why the CFKRS full polynomial recipe matters: including all $k^2+1$ coefficients gives near-perfect agreement even at modest $T$ (see the tables in the CFKRS paper, e.g., agreement to ~10 significant figures for the sixth moment at $T \approx 2.4\times 10^6$).


6. Why This Matters for Your Riemann Hypothesis Paper

  1. Structural evidence for RH: the GUE/CUE statistics of zeros are consistent with the Hilbert–Pólya philosophy — that the zeros are eigenvalues of a self-adjoint operator, which would imply RH.
  2. The ζ–RMT dictionary is quantitative, not just qualitative: Keating–Snaith shows RMT predicts values of ζ, not merely zero spacings.
  3. It resolved genuine number-theoretic mysteries (42, 24024) that arithmetic methods produced but could not systematize.
  4. It generalizes: the same recipe (with symmetry types USp/SO from the Katz–Sarnak philosophy) predicts moments of families of L-functions — central to modern analytic number theory.