Settled. The variance constant moved from 5855 to 275, a factor of 21.3, with every statement's shape preserved, no hypothesis added, no sorry, and a green lake build. The three constants below are kernel-checked by Lean 4 + Mathlib v4.33.0-rc2 against the standard axioms.
Reproduce the arithmetic with python3 hunts/r_4218d4/probe.py; reproduce the mathematics with cd lean && lake build and the axiom audit in PrintMertensAxioms.lean.
Before and after
| quantity | before | after | reference |
|---|---|---|---|
Chebyshev remainder constant, psi x <= x log 4 + c x | 4 | 3/2 | sharp value 4/e = 1.4715 |
sum_{n <= N} (log n)/n^2 (sum_log_div_sq_le) | 6 | 3/2 | sharp 4/e = 1.4715; limit -zeta'(2) = 0.9375 |
| prime-power tail in Mertens I | 12 | 3 | sharp 8/e = 2.9430; limit 0.7554 |
mertens_first_theorem band | log 4 + 16 = 17.3863 | log 4 + 3 = 4.3863 | classical 2 |
mertens_second_theorem band | 76 | 16 | assembly needs 15.698; classical 4 |
sum_sq_dev_le variance constant | 5855 | 275 | m^2 + m + 3 in the Mertens band m |
Nothing else changed. mertens_first_theorem, mertens_second_theorem, sum_sq_dev_le, turan_variance and hardy_ramanujan keep their names, their arguments, their hypotheses and their shape; the only edits inside a statement are numerals, and each moved down.
What was chosen, and why
Three independent slack steps fed the chain. All three are local, which is what the discovering runs predicted; none needed new mathematics.
1. The Chebyshev remainder: 4 -> 3/2
Mathlib proves Chebyshev.psi_le : psi x <= x log 4 + 2 sqrt(x) log x, then packages psi_le_const_mul_self : psi x <= (log 4 + 4) x by bounding 2 sqrt(x) log x <= 4 x, that is, by using log t / sqrt t <= 2. The supremum of log t / sqrt t is 2/e = 0.7358, attained at t = e^2, so that step throws away a factor of e/1 and a bit more.
The sharp majorant is one line: log t <= t/e for t > 0, which is log x <= x - 1 applied at x = t/e together with log e = 1. It is added as ZetaLean.Mertens.log_le_div_exp_one. Composing it with log x = 2 log sqrt x gives 2 sqrt(x) log x <= (4/e) x, and 4/e < 3/2 because 3e > 8. The result is psi_le_const_mul_self', stated for x >= 1 and used only at natural arguments.
Mathlib's own constant was left alone; this is a local corollary in this repository's file, not a change to Mathlib.
2. sum_log_div_sq_le: 6 -> 3/2
Two tightenings of one telescope, both cheap:
- the same
log t <= t/emajorant giveslog n <= (2/e) sqrt n, against thelog n <= 2 sqrt nthe file used (that came fromlog t <= t - 1applied tosqrt ndirectly, which is the same inequality used less sharply); - the
n = 1term ofsum (log n)/n^2is zero, so the telescope may start atn = 2, wheresum_{2 <= n <= N} n^{-3/2} <= 2 - 2/sqrt Nrather than the3 - 2/sqrt Nthat starting at1forces. The existing lemmasum_inv_mul_sqrt_leis reused unchanged and then = 1term subtracted.
(2/e) * 2 = 4/e = 1.4715, stated as 3/2. The limit is -zeta'(2) = 0.9375, so about 60 percent of what remains is the telescope against the true sum, not the majorant.
The prime-power tail is 2 B by the existing geometric layer bound, so it falls from 12 to 3 with no other change.
3. Mertens I: keeping the two halves apart
This is the step neither discovering run named, and it is worth about 1.5.
The von Mangoldt form is asymmetric. Its lower half loses only 1 (from N log N - N + 1 <= sum_{n<=N} log n <= N log N), while its upper half loses the whole Chebyshev constant. The prime form then loses the tail on the lower side only, since the prime sum is at most the von Mangoldt sum. So the honest band is
max(c_psi, 1 + tail) = max(log 4 + 3/2, 4) = 4,
whereas routing through the symmetric von Mangoldt band, which is what the original proof did, pays c_psi + tail = log 4 + 4.5 = 5.886.
A new one-sided lemma log_sub_one_le_sum_vonMangoldt_div extracts the lower half; abs_sum_vonMangoldt_div_sub_log_le now uses it too, so nothing is proved twice. mertens_first_theorem is stated as log 4 + 3 = 4.3863, which covers 4 because 1 <= log 4, and keeps the log 4 + c shape the file has carried since it landed.
4. Propagation
mertens_second_theorem needed no structural change: the band c enters its assembly as
upper <= c*r + 1 + |log log 2| + c*r lower >= -c*r + 1 - g - c*r
with r an upper bound for 1/log 2 and g = 4 the sum 1/n^2 gap term. Two numerals moved: c from 17.4 to 4.4 (the rounding of log 4 + 3), and r from 2 to 1.443 (the true value is 1.442695, and the sharper bound is no harder to prove from Mathlib's log_two_gt_d9). The assembly then needs 15.698, and 16 is stated.
sum_sq_dev_le needed only its numerals: the variance decomposition is m^2 + m + 3 in the Mertens band m, unchanged, so 76 -> 16 gives 5855 -> 275.
What could not be settled
The classical constants are still out of reach, and deliberately so. Mertens I's classical band is 2 and we land 4.3863; Mertens II's is 4 and we land 16. Closing either needs mathematics the brief explicitly declined to fund, and the brief's kill condition ("do not chase the classical constant at the cost of a green build") applies.
Three named steps resisted, with what each would need:
- The
4in Mertens II fromsum 1/n^2against the logarithm bracket.log_sub_log_le_mul_addbounds1/(xy)by4from the hypothesis1/2 < x. In use,x = log nwithn >= 2, so1/(xy) <= 1/(log 2)^2 = 2.081and the term would fall from4to about2.1, taking the Mertens II band from16to about14. Getting it requires replacing the hypothesis1/2 < xby something like0.69 < x, which is a stronger hypothesis and therefore a weaker lemma. The addendum forbids that, so it was not done. The clean version instead threads the actuallog n >= log 2through as a bound on the conclusion rather than a hypothesis, which is a small restructuring, not a numeral change.
- The telescope
sum_{2<=n<=N} n^{-3/2} <= 2. The true value iszeta(3/2) - 1 = 1.6124. The bound is the integral comparisonint_1^N x^{-3/2} dx, which is already the natural one; improving it means an Euler-Maclaurin correction term, i.e. new mathematics for about0.2insum_log_div_sq_leand about0.4in the tail. Not worth it at this budget.
- The main term
log 4in the Chebyshev bound.psi x / x -> 1, solog 4 = 1.3863is itself 39 percent slack, and it propagates to everything. Removing it is the prime number theorem, not a constant tightening, and Mathlib v4.33.0-rc2 does not carry PNT.
The residual budget after this run, in order of size: log 4 (1.386, needs PNT), the 4-vs-2.1 bracket factor in Mertens II (needs the restructuring in point 1), the 1 + tail = 4 lower half of Mertens I (needs a better tail than 2B), and the roundings 3/2 for 4/e and 1.443 for 1/log 2 (worth about 0.03 each, not worth a rebuild).
Verification
cd lean && PATH="$HOME/.elan/bin:$PATH" lake build ZetaLean.Mertensstheorems,... ZetaLean.MertensSecondand... ZetaLean.HardyRamanujantheoremare each green with zero sorrys, onleanprover/lean4:v4.33.0-rc2with Mathlibv4.33.0-rc2, as is every other module that imports them.- A full
lake build ZetaLeanin this container also killed two modules,ZetaLean.Pub1.UpolyD2andZetaLean.Pub1.CertAtoms, with exit code 137. That is the OOM killer, not a proof failure: fourleanprocesses were resident at about 6.5 GB each under the default parallelism. Neither module imports anything this hunt touched (both import onlyMathliband otherZetaLean.Pub1.*files, and nothing outsideMertensSecond,HardyRamanujantheoremandZetaLean.leanimports the edited files at all), so the failure is a property of this container's memory, not of the diff. Stated rather than smoothed over: this run did not observe a single green whole-library build, only a green build of the affected subtree. lake env lean ../hunts/r_4218d4/PrintMertensAxioms.leanreports[propext, Classical.choice, Quot.sound]for every theorem in the chain, unchanged from before this hunt.python3 hunts/r_4218d4/probe.pyreproduces every number in the table above, and checks each majorant numerically against the quantity it majorises (sum (log n)/n^2and both telescopes toN = 200000, the prime-power tail top = 200000).
Nothing here is evidence for or against the Riemann hypothesis (docs/08-why-it-is-hard.md). Mertens's theorems and Hardy-Ramanujan are unconditional classical results; only their explicit constants moved.
Loose threads
- The bracket factor
4inMertensSecond.log_sub_log_le_mul_add. What: the lemma's4 * ccomes from1/(xy) < 4under1/2 < x, but every call site hasx = log nwithn >= 2, where1/(xy) <= 2.081. Why it might matter: it is the largest remaining term in the Mertens II assembly that is not the Mertens band itself; fixing it would take16to roughly14and the variance constant from275to about213, still with no new mathematics. First step: add a second lemma takinghx : c0 <= xand concludinglog y - log x <= x(1/x - 1/y) + c/c0^2, leave the existing lemma untouched, and call the new one withc0 = log 2inhterm_lb.
abs_psi_sub_theta_le_sqrt_mul_loghas the same2/eslack, upstream in Mathlib. What: Mathlib'spsi_le_const_mul_selfbounds2 sqrt(x) log xby4x;4/e = 1.4715works, by exactly the argument used here. Why it might matter: it is a two-line improvement to a Mathlib lemma that other users ofpsi_le_const_mul_selfwould inherit, and this repository now has the proof written out. First step: open a Mathlib PR replacing(log 4 + 4)by(log 4 + 3/2)inMathlib/NumberTheory/Chebyshev.lean, carryinglog_le_div_exp_oneasReal.log_le_div_exp_oneif Mathlib lacks it. Note the statement is for0 <= xthere and the sharp bound needs1 <= x, so thex < 1case has to be handled separately (psi x = 0).
- The
omegasecond-moment argument never uses the sharper first moment. What:sum_sq_dev_lefeedsfirst_moment_lower's loss ofN(one unit per prime) into the+3ofm^2 + m + 3. The true loss ispi(N), which iso(N). Why it might matter: the+3is small next tom^2, so this is worth about2out of275today, but it becomes the dominant term if the Mertens band ever reaches its classical4(4^2 + 4 + 3 = 23, of which3is 13 percent). First step: replace thecard_filter_lestep infirst_moment_lowerby a Chebyshev-type bound onpi(N), e.g. viaChebyshev.psi_le_primeCounting_mul_logread backwards, and check whether the resultingL-dependence still collapses under1 <= L.
sum_inv_mul_sqrt_leis stated fromn = 1, where it is tight, and used fromn = 2, where it is not. What: the hunt subtracts then = 1term at the call site rather than restating the lemma. Why it might matter: any future consumer will hit the same friction, and then = 2form is the one the mathematics wants. First step: addsum_inv_mul_sqrt_Ioc_one_le : sum_{2<=n<=N} <= 2 - 2/sqrt Nas the primary lemma and derive the existing one from it.