Section 21.2 Some History
Definition 21.2.1.
We say that two functions f(x) and g(x) are asymptotic to each other when
Essentially, in the long run these functions get as close to each other as you like, on a percentage basis.
Subsection 21.2.1 The first really accurate estimate and errors
In fact, Gauss makes this estimate even more precise. Here is the general idea. First, reinterpret the proportion as suggesting that 1/\log(x) integers near x are prime. If we do that, then we can think of 1/\log(x) as a probability density function. What do we do with such functions? We integrate the function to get the cumulative amount! That is, we should expect that \pi(x)\approx \int_2^x\frac{dt}{\log(t)} or equivalentlyDefinition 21.2.2.
We give the name logarithmic integralβ3β to the (convergent) integral Li(x)=\int_2^x \frac{dt}{\log(t)}\text{.}

xxxxxxxxxx
def _(n=100):
show(plot(prime_pi,3,n,color='black', legend_label=r'$\pi(x)$') + plot(x/log(x),3,n,color='red', legend_label=r'$x/\log(x)$') + plot(Li,3,n, color='green', legend_label='$Li(x)$'))
xxxxxxxxxx
def _(n=[100,1000,1000000,1000000000]):
P = prime_pi(n)
pretty_print(html(r"$\pi(%s)=%s$"%(n,prime_pi(n))))
pretty_print(html(r"The error with $%s/\log(%s)$ is $\approx %s$"%(n,n,P-(n/log(n)).n())))
pretty_print(html(r"The error with $Li(%s)$ is $\approx %s$"%(n,(P-Li(n)).n())))

One of the brilliant aspects of the internet is how much easier it is to find source material of such things. Courtesy of the digitization center at the State and University Library of GΓΆttingen (the university where Gauss worked), you can see a scan of the actual letter in questionβ4β.
In Figure 21.2.4, Gauss is comparing his calculations of the number of primes with his formula, as well as those of his correspondent and Legendre. Whether or not you can read Gauss' (quite legible) German, you can still note how in the last set of numbers he is essentially doing data science on Legendre's formula, with A as the modeling variable, using more and more detailed training sets!
Subsection 21.2.2 Exploring Li
Can we try for some more analysis? Since we saw that x/\log(x) didn't seem to be as good an approximation, we'll leave it out for now. This graphic show two representative 1000-wide stretches, and the following interact allows you to explore more of them.
xxxxxxxxxx
def _(n=1000):
P = plot(prime_pi,3,n, color='black',legend_label=r'$\pi(x)$')
P += plot(Li,3,n, color='green',legend_label='$Li(x)$')
show(P, xmin=max(n-1000,0), ymin=prime_pi(max(n-1000,0)))
Fact 21.2.6.
For any number x\text{,} there is an x'>x such that
Historical remark 21.2.7. Skewes' Number.
As remarkable as this seems, Littlewood's student Stanley Skewes proved the following even more amazing fact:
The first time this happens is no higher than
\begin{equation*} 10^{10^{10^{10^{1000}}}}\text{.} \end{equation*}
In Skewes' original paper, this bound had a 34 instead of 1000 in the last exponentβ5β, but that result relied upon a special assumption (the so-called Riemann Hypothesis, see Chapter 25). Both of these bounds are known as Skewes' number.