Snapshot 1: the graphs of

and

with no correction term

Snapshot 2: the graphs of

and

with correction term that uses the first 20 pairs of zeros of the zeta function

Snapshot 3: a closeup showing that

with correction term correctly predicts the primes 103, 107, 109, 113, and 127, and the gap between 113 and 127; notice that, with no correction term,

by itself misses these details

The function

(

*Mathematica*'s built-in function

PrimePi[x]) is a step function that jumps by 1 whenever

is prime. Riemann's prime-counting function

(

*Mathematica'*s built-in function

RiemannR[x]) is defined as

,

where

is the Möbius mu function μ (

MoebiusMu[n] in

*Mathematica*) and

is the logarithmic integral (

*Mathematica*'s built-in function

LogIntegral[x]).

Overall,

is a good approximation to

. However,

does not track the details, that is, the jumps) of

. Furthermore, when a gap occurs in the primes (as, for example, between 23 and 29),

keeps increasing even though

remains constant between primes.

However, if we add to

a correction term that uses the first few zeros (roots) of the Riemann zeta function, something very surprising happens: we get a new function that very closely matches the jumps and irregularities of

! When

is prime, this new function increases by about 1 near

, so, in effect, it "knows" where the primes are. And when a gap occurs, this new function tends to level out, again emulating the behavior of

.

It's almost as if the zeros of the zeta function determine which numbers are prime!

The first three complex zeros of the zeta function are approximately

,

, and

. The zeros occur in conjugate pairs, so if

is a zero, then so is

. The famous Riemann hypothesis is the claim that these complex zeros all have real part 1/2. All of the first

complex zeros do, indeed, have real part 1/2 (see [4]).

This Demonstration uses an exact formula for a function that is equal to

except when

is prime. We define our new prime counting function, usually denoted by

, as follows. First, if

is a prime number, say,

, then

jumps from

to

. For this

, we will define

to be halfway between these two values: that is,

. Second, for all other values of

,

. With this definition in mind,

has the following exact formula:

(1)

,

where

is Riemann's prime counting function defined above, and

(2)

,

where

is the

complex zero of the zeta function. In this formula,

(

*Mathematica'*s built-in function

ExpIntegralEi[z]) is the generalization of the logarithmic integral to complex numbers. These equations come from references [1], [2], and [3].

For a given

, and with the value of

that you choose with the slider control, here is how this Demonstration computes the correction term that involves zeta zeros:

First, let

be the smallest integer such that

. We need to add only the first

terms (that is,

) in the sum in equation (1). For each of these values of

, we use equation (2) to compute the value of

. However, we will add only the first

terms (that is,

) in the sum in equation (2). Because the purpose of this Demonstration is to show how the jumps in the step function

can be closely approximated by adding to

a correction term that involves zeta zeros, we ignore the integral and the

in equation (2); this speeds up the computation and will not noticeably affect the graphs, especially for

more than about 5.

The more zeros we use, the closer we can approximate

. For larger

, the correction term must include more zeros in order to accurately approximate

.

References:

[1] H. Riesel,

*Prime Numbers and Computer Methods for Factorization*, 2nd ed., Boston: Birkhauser, 1994 pp. 44–55.

[2] H. Riesel and G Gohl, "Calculations Related to Riemann's Prime Number Formula,"

*Mathematics of Computation*,

**24**(112), 1970 pp. 969–983.

[3] S. Wagon,

*Mathematica in Action*, 2nd ed., New York: Springer, 1999 pp. 540–554.