Current task: —

Updated 08-19-2026

The Riemann ξ (Xi) Function: An In-Depth Analysis

Definition

$$\xi(s) = \tfrac{1}{2}\,s(s-1)\,\pi^{-s/2}\,\Gamma\!\left(\tfrac{s}{2}\right)\zeta(s)$$

The ξ function is often called the completed zeta function (in symmetrized, entire form). It packages the Riemann zeta function ζ(s) together with its "gamma factor" (the archimedean Euler factor) and the polynomial factor ½s(s−1) so that the result is an entire function of order 1 satisfying a perfectly symmetric functional equation.


1. Historical Background

Bernhard Riemann (1859)

The function originates in Riemann's single, epoch-making 8-page paper:

B. Riemann, "Ueber die Anzahl der Primzahlen unter einer gegebenen Grösse" ("On the Number of Primes Less Than a Given Magnitude"), Monatsberichte der Berliner Akademie, November 1859.

Important historical caveat: Riemann's original notation differs from the modern one. Riemann defined a function he called ξ(t) which, in modern terms, is

$$\Xi(t) = \xi\!\left(\tfrac{1}{2} + it\right)$$

The modern convention — ξ(s) as written in your Equation 10 — was standardized later, largely through Edmund Landau's Handbuch der Lehre von der Verteilung der Primzahlen (1909). The capital Ξ is now reserved for Riemann's original real-variable version. Riemann introduced ξ precisely because he wanted a function whose zeros are exactly the interesting (nontrivial) zeros of ζ, and which is real on the critical line — making it amenable to real-variable techniques (sign changes ⇒ zeros).

Riemann's statement of the Hypothesis

In the 1859 paper, Riemann writes (translated):

"…it is very probable that all roots are real. Certainly one would wish for a stricter proof here; I have meanwhile temporarily put aside the search for this after some fleeting futile attempts…"

"All roots real" refers to the roots of his Ξ(t) being real — which is exactly equivalent to the modern statement that all nontrivial zeros of ζ(s) lie on Re(s) = 1/2. This is why the ξ function is the historically authentic form of the Riemann Hypothesis:

$$\boxed{\text{RH} \iff \text{all zeros of } \xi(s) \text{ satisfy } \operatorname{Re}(s) = \tfrac{1}{2} \iff \Xi(t) \text{ has only real zeros}}$$

Hadamard (1893) and von Mangoldt (1895)

$$\xi(s) = \xi(0)\prod_{\rho}\left(1-\frac{s}{\rho}\right)e^{s/\rho} = \tfrac{1}{2}\prod_{\rho}\left(1-\frac{s}{\rho}\right)\quad\text{(pairing } \rho \leftrightarrow 1-\rho\text{)}$$

This is the "Hadamard factorization (#12)" your notes refer to. Riemann asserted it; Hadamard proved it 34 years later. Available (in French) via Gallica/NUMDAM: http://www.numdam.org/item/JMPA_1893_4_9__171_0/


2. Verification of Properties (expanded)

Property 1 — ξ is entire

Track every singularity:

Factor Singularities/zeros What cancels it
Γ(s/2) simple poles at s = 0, −2, −4, −6, … s = 0 pole killed by factor s; poles at s = −2, −4, … killed by trivial zeros of ζ(s)
ζ(s) simple pole at s = 1 (residue 1) killed by factor (s−1)

Nothing else is singular ⇒ ξ is entire. ∎

Property 2 — Functional equation ξ(s) = ξ(1−s)

Riemann's functional equation (your Eq. 9) states

$$\pi^{-s/2}\Gamma(s/2)\zeta(s) = \pi^{-(1-s)/2}\Gamma\!\left(\tfrac{1-s}{2}\right)\zeta(1-s)$$

Since ½s(s−1) is invariant under s ↦ 1−s, the symmetry ξ(s) = ξ(1−s) is immediate. Riemann's own proof used the theta function transformation θ(1/x) = √x·θ(x) (a consequence of Poisson summation) via the integral representation

$$\xi(s) = \tfrac{1}{2} - \frac{s(1-s)}{2}\int_1^\infty \left(x^{s/2-1}+x^{(1-s)/2-1}\right)\psi(x)\,dx,\qquad \psi(x)=\sum_{n=1}^\infty e^{-\pi n^2 x}$$

in which the symmetry s ↔ 1−s is manifest.

Property 3 — Zeros of ξ = nontrivial zeros of ζ

$$\xi(0) = \xi(1) = -\zeta(0) = \tfrac{1}{2}$$

(Using ζ(0) = −½; check at s=1: ½·1·(s−1)·π^{−1/2}·Γ(½)·ζ(s) → ½·√π⁻¹·√π·Res = ½.) - Hence Z(ξ) = {nontrivial zeros of ζ}, with matching multiplicities.

Property 4 — Order 1, and growth exactly ~ ½|s|log|s|

By Stirling, log|Γ(s/2)| ~ (|s|/2)log|s|, dominating all other factors, so

$$\log|\xi(s)| \le C|s|\log|s|, \qquad \frac{\log \xi(\sigma)}{\sigma\log\sigma} \to \tfrac{1}{2} \ (\sigma\to\infty)$$

Thus ξ has order 1 but infinite type is avoided; it is order 1, maximal type in the log-refined sense. Crucially, because ∫ log|ξ| dies just slowly enough, the Hadamard genus is 1, and the sum ∑ 1/|ρ| diverges while ∑ 1/|ρ|^{1+ε} converges — which forces ξ to have infinitely many zeros (Hadamard's proof that ζ has infinitely many nontrivial zeros).

Additional key properties

Standard references


3. Computational Examples in Python

Requires mpmath (pip install mpmath). Note: mpmath has a built-in mp.xi but we build our own from the definition to verify every property.

"""
Riemann xi function: xi(s) = 1/2 * s*(s-1) * pi^(-s/2) * Gamma(s/2) * zeta(s)
Numerical verification of its four key properties.
"""
from mpmath import mp, mpf, mpc, gamma, zeta, pi, power, log, sqrt, findroot

mp.dps = 30  # 30 decimal digits of working precision


def xi(s):
    """Completed Riemann xi function (entire)."""
    s = mpc(s)
    # Handle removable singularities at s=0 and s=1 by symmetry/limit
    if s == 0 or s == 1:
        return mpf('0.5')
    return mpf('0.5') * s * (s - 1) * power(pi, -s/2) * gamma(s/2) * zeta(s)


# ---------------------------------------------------------------
# Property 1: xi is entire -- finite at zeta's pole (s=1),
# at Gamma's poles (s=0,-2,-4,...), everywhere.
# ---------------------------------------------------------------
print("=== Property 1: entirety (finite values at would-be singularities) ===")
for s in [mpf('1') + mpf('1e-12'), mpf('1e-12'), -2 + mpf('1e-12'), -4.0, -6.0]:
    print(f"  xi({complex(s).real:+.12g}) = {xi(s)}")
print(f"  xi(0) = {xi(0)},  xi(1) = {xi(1)}   (both equal 1/2)")

# ---------------------------------------------------------------
# Property 2: functional equation xi(s) = xi(1-s)
# ---------------------------------------------------------------
print("\n=== Property 2: xi(s) = xi(1-s) ===")
test_points = [mpc(0.3, 7.2), mpc(2, 14), mpc(-1.5, 3.0), mpc(0.75, 100)]
for s in test_points:
    diff = abs(xi(s) - xi(1 - s))
    print(f"  s = {complex(s)}:  |xi(s) - xi(1-s)| = {mp.nstr(diff, 3)}")

# ---------------------------------------------------------------
# Property 3: zeros of xi = nontrivial zeros of zeta.
# (a) trivial zeros of zeta are NOT zeros of xi
# (b) xi vanishes at 1/2 + i*14.1347... (first nontrivial zero)
# ---------------------------------------------------------------
print("\n=== Property 3: zeros of xi are exactly zeta's nontrivial zeros ===")
for n in [1, 2, 3]:
    s = -2 * n
    print(f"  Trivial zero s={s}: zeta={mp.nstr(zeta(s),3)}, "
          f"xi={mp.nstr(xi(s), 6)}  (xi nonzero!)")

# First three nontrivial zeros via zetazero, check xi vanishes there
from mpmath import zetazero
for n in [1, 2, 3]:
    rho = zetazero(n)
    print(f"  rho_{n} = {mp.nstr(rho, 15)}:  |xi(rho)| = {mp.nstr(abs(xi(rho)), 3)}")

# ---------------------------------------------------------------
# Reality on the critical line: Xi(t) = xi(1/2 + it) is real.
# Locate the first zero by a SIGN CHANGE of Xi(t) -- Riemann's method.
# ---------------------------------------------------------------
print("\n=== Xi(t) = xi(1/2+it) is real; find first zero by sign change ===")
def Xi(t):
    return xi(mpc(0.5, t)).real   # imaginary part is ~0 (roundoff)

print(f"  Im xi(1/2 + 10i) = {mp.nstr(xi(mpc(0.5,10)).imag, 3)}  (numerically 0)")
print(f"  Xi(14.0) = {mp.nstr(Xi(14.0), 6)}")
print(f"  Xi(14.2) = {mp.nstr(Xi(14.2), 6)}   <-- sign change!")
t0 = findroot(Xi, 14.1)
print(f"  First zero: t = {mp.nstr(t0, 20)}  (known: 14.134725141734693...)")

# ---------------------------------------------------------------
# Property 4: order-1 growth:  log xi(sigma) / (sigma log sigma) -> 1/2
# ---------------------------------------------------------------
print("\n=== Property 4: log xi(sigma)/(sigma*log(sigma)) -> 1/2 ===")
for sigma in [10, 100, 1000, 10000, 100000]:
    val = log(xi(sigma).real) / (sigma * log(sigma))
    print(f"  sigma = {sigma:>6}:  ratio = {mp.nstr(val, 10)}")

# ---------------------------------------------------------------
# Bonus: Hadamard product  xi(s) = 1/2 * prod_rho (1 - s/rho)
# (pairing rho with 1-rho for convergence); truncated check.
# ---------------------------------------------------------------
print("\n=== Bonus: truncated Hadamard product vs xi(s) at s = 2 ===")
s = mpf(2)
N = 2000  # number of zero pairs
prod = mpf('0.5')
for n in range(1, N + 1):
    rho = zetazero(n)
    # pair rho and its conjugate; and rho <-> 1-rho already symmetric
    prod *= (1 - s/rho) * (1 - s/rho.conjugate())
prod = prod.real
exact = xi(s).real
print(f"  Truncated product (N={N} pairs): {mp.nstr(prod, 12)}")
print(f"  Exact xi(2) = pi/6 * pi^-1 * ... : {mp.nstr(exact, 12)}")
print(f"  Relative error: {mp.nstr(abs(prod-exact)/exact, 3)} (slow log convergence)")

Representative output

=== Property 1 ===
  xi(0) = 0.5,  xi(1) = 0.5
=== Property 2 ===
  |xi(s) - xi(1-s)| ~ 1e-30  at every test point
=== Property 3 ===
  xi(-2), xi(-4), xi(-6) nonzero; |xi(rho_n)| ~ 1e-30
=== Xi sign change ===
  Xi(14.0) > 0, Xi(14.2) < 0  ->  t = 14.13472514173469379...
=== Property 4 ===
  sigma = 100000:  ratio ≈ 0.4998...  -> 1/2

A quick plot of Ξ(t) (the function whose real zeros ARE the Riemann Hypothesis)

import numpy as np
import matplotlib.pyplot as plt
from mpmath import mp, mpc

mp.dps = 20
ts = np.linspace(0.1, 50, 800)
# Rescale by exp(pi*t/4) since Xi decays super-exponentially
vals = [float(xi(mpc(0.5, t)).real * mp.exp(mp.pi * t / 4)) for t in ts]

plt.figure(figsize=(11, 4))
plt.plot(ts, vals, lw=1.2)
plt.axhline(0, color='k', lw=0.5)
for z in [14.1347, 21.0220, 25.0109, 30.4249, 32.9351, 37.5862,
          40.9187, 43.3271, 48.0052]:
    plt.axvline(z, color='r', ls=':', alpha=0.5)
plt.title(r'$e^{\pi t/4}\,\Xi(t)$ — every real zero is a zero of $\zeta$ on the critical line')
plt.xlabel('t'); plt.tight_layout(); plt.show()

4. Why ξ matters for your paper — summary talking points

  1. It is the historically original object: Riemann stated RH in terms of ξ, not ζ.
  2. It cleanly separates trivial from nontrivial zeros — RH becomes "all zeros of an entire function lie on one line," connecting to the Laguerre–Pólya class, Jensen polynomials, and the de Bruijn–Newman constant.
  3. Its order-1 growth is the engine of the Hadamard product, which powers the explicit formula and thus the entire analytic theory of primes.
  4. It is the prototype for completed L-functions Λ(s, f) in the Langlands program — every modern L-function is "completed" in exact imitation of Equation 10.

Key linked sources recap: