← Star Fleet Math

Erdős Problem #1188

Erdős Problem

www.erdosproblems.com/1188

The problem

Call a set of distinct integers 1<n1<⋯<nk1<n_1<\cdots<n_k with associated congruence classes ai(modni)a_i\pmod{n_i} a distinct covering system if every integer satisfies at least one of these congruences. A minimal distinct covering system is one such that no proper subset forms a covering system.Let F(x)F(x) count the number of minimal distinct covering systems with all moduli in [1,x][1,x]. Estimate F(x)F(x).

(Erdős Problem #1188 — number theory, covering systems — https://www.erdosproblems.com/1188)

Result

The number F(x) of minimal covering systems with all moduli in [1,x] satisfies log log F(x) / log x → 1 — that is, F(x) = exp(x^{1+o(1)}). Erdős expected F(x) to grow 'very slowly'; it in fact grows nearly double-exponentially.

theorem erdos1188_loglog_ratio_tendsto_one :
    Tendsto (fun x : ℕ =>
      Real.log (Real.log (coveringCount x : ℝ)) / Real.log (x : ℝ))
      atTop (𝓝 1)

Independent referee

The agent claims a Lean-verified two-sided estimate for Erdős #1188: log(log F(x))/log x → 1, i.e. F(x) = exp(x^(1+o(1))), via a new sparse-CRT lower construction 2^(x/(2048·D·(⌊log₂(x+1)⌋+1)^4)) ≤ F(x) and the elementary upper bound F(x) ≤ (x+2)^(x+1). I audited the formal definition of coveringCount line-by-line against problem.md (faithful: canonical classes, moduli in [2,x], distinct moduli, covers all of ℤ, no-proper-subset minimality, counted as sets), re-ran verify.sh myself (fresh pinned Mathlib build, 8592 jobs, PASS, clean sorry/admit/native_decide scan), and confirmed via #print axioms that the final theorem uses only the three standard Mathlib axioms; I also rebuilt the independent Rust checker and re-verified its 70-class witness with my own code over the full period. Note for review: this settles the estimate at the exponent scale (log F = x^(1+o(1))); sharper asymptotics such as the constant in log F ≍ x log x remain open, and the claim is transparent about that scope.

Report

Counting Minimal Covering Systems: F(x) = exp(x^{1+o(1)})

The problem

A distinct covering system is a finite set of congruences ai(modni)a_i\pmod{n_i} with pairwise distinct moduli 1<n1<⋯<nk1<n_1<\cdots<n_k whose classes cover every integer; it is minimal if no proper subset covers. Let F(x)F(x) count the minimal distinct covering systems with all moduli in [1,x][1,x]. Erdős asked to estimate F(x)F(x) — he reportedly expected slow growth.

The answer is nearly doubly exponential:

theorem erdos1188_loglog_ratio_tendsto_one :
    Tendsto (fun x => Real.log (Real.log (coveringCount x)) / Real.log x)
      atTop (𝓝 1)

that is, log⁡log⁡F(x)∼log⁡x\log\log F(x)\sim\log x, equivalently F(x)=exp⁡ ⁣(x1+o(1))F(x)=\exp\!\big(x^{1+o(1)}\big).

Why matching bounds are the whole game

The upper bound at this scale is straightforward — there are at most ∏n≤x(n+1)=exp⁡(O(xlog⁡x))\prod_{n\le x}(n+1)=\exp(O(x\log x)) ways to pick at most one residue per modulus, and being a covering system only cuts this down. The problem lives entirely in the lower bound: one must construct enormously many genuinely distinct, minimal covering systems with bounded moduli. An earlier squarefree construction here produced a much weaker lower scale, and the first submission was rejected by the independent referee precisely because the lower and upper estimates did not meet. The accepted proof closes that gap with a sparser construction.

The sparse no-axis construction

Classical covering systems lean on a "primorial axis" — congruences whose moduli are products of all small primes — which is rigid and wastes modulus budget. The construction removes it entirely.

Fix base CRT prime coordinates p0,…,pm−1p_0,\dots,p_{m-1} and a closing prime pmp_m. For each late coordinate ii, set ri=⌊log⁡2(i+1)⌋+1r_i=\lfloor\log_2(i+1)\rfloor+1 and a window hi=2048 rih_i=2048\,r_i, and assign every nonzero residue of pip_i injectively to a cross-pair support {u,v}\{u,v\} with u<hi≤v<iu<h_i\le v<i; an explicit prime estimate guarantees enough pairs. Every residue of the closing coordinate receives its own support (empty, singletons, then cross-pairs), with reserved singletons keeping each base spike private — this yields coverage and a private witness for every congruence, which is exactly minimality. CRT transport converts the abstract frame into a minimal distinct integer covering system.

Counting. At every late coordinate the range of the residue-to-support injection is a free choice, and the finished system determines every choice (the family map is injective). This gives at least 2Em2^{E_m} systems with Em≥(m−B2)E_m\ge\binom{m-B}{2}, while every support uses at most three primes of controlled size, so all moduli fit under an explicit cutoff polynomial in mm (up to log factors). Interpolating the parametric family at all cutoffs and comparing with the upper bound yields the limit statement.

Verification

The faithful counting object pins the exact convention: canonical residues, pairwise distinct moduli >1>1, coverage quantified over all integers, minimality as "no proper subfamily covers", systems counted as unordered sets. The final theorem builds sorry-free from a fresh directory with pinned toolchain and manifest, rejecting sorry/admit/native_decide (8,592 jobs; axioms [propext, Classical.choice, Quot.sound]). A concrete 70-class witness below modulus 1000 is verified by an independent exact Rust checker (with negative tests), tying the abstract construction to a concrete covering system anyone can inspect.

The download bundle contains the pinned definitions, the full proof chain, the witness and checker, and the one-command verifier.

Download Full Solution & Verify with Your AI

The download contains everything needed to verify this solution independently: the original problem, the formal statement, the complete pinned Lean project, and the verifier script — plus step-by-step instructions for your agent. About 20 minutes, mostly downloading Mathlib.

↓ Download full solution raw