problems / lonely-runner-fourteen

Also in this folder: compute/

Walkthrough — the gcd branch that composite 14 makes wide

0. What was actually missing

Not a search. A term.

The folder had been reading the 14-runner case as blocked by a missing algebraic identity: Sungkawichai and Trakulthongchai prove that the tuple (1,2,…,k)(1,2,\dots,k) is eventually (k,p)(k,p)-proper when k+1k+1 is an odd prime, by a polynomial argument in the field with k+1k+1 elements, and 1414 is not prime. That reading is what set the previous campaign's target.

The degree of freedom that was actually sitting unused is on the other side of the same proposition. Their Proposition 4.4 splits the fiber above (1,…,k)(1,\dots,k) into three cases, and one of them is discharged not by any witness time but by the gcd condition in their Definition 2.1: a speed tuple is proper as soon as some prime dividing l=k+1l = k+1 divides all but one of its coordinates. When k+1k+1 is prime that condition says "at most one nonzero coordinate", which is nearly nothing, and it is easy to read past it. When k+1=14k+1 = 14 it says "some q∈{2,7}q \in \{2,7\} divides all but one coordinate", which is a large piece of (Z/14)13(\mathbb Z/14)^{13}.

The previous campaign was searching a space with that piece left in. So it was looking for witnesses for tuples that never needed one.

1. Named false starts

Redo Proposition 4.1 over Z/14\mathbb Z/14. Their proof compares leading coefficients of two degree-kk polynomials that agree on k+1k+1 points, and concludes 1≡−∣G∣1 \equiv -|G|. Both steps want a field. Z/14\mathbb Z/14 has zero divisors and the argument dies on the first line. Killed on paper, before writing code.

Clear B13B_{13} with more primes. Proposition 2.7 gives LRC(k)\mathrm{LRC}(k) from J(k,p)=∅J(k,p) = \emptyset over a prime set with ∏p≥Bk\prod p \ge B_k. Here ln⁡B13=670.35\ln B_{13} = 670.35, and the earlier note that primes in [191,800][191,800] only reach 591.6591.6 is right. But the conclusion drawn from it — "one modular constraint cannot finish" — was answering the wrong question: the requirement is a long enough list, and the list just needs to run to about p≈880p \approx 880. What actually kills this is their Section 7: each J(13,p)=∅J(13,p) = \emptyset needs I(13,p,1)I(13,p,1), roughly 1.1×10171.1 \times 10^{17} tuples at p=191p = 191 under their own Section 5.1 reduction. Dead on cost, not on arithmetic.

Resume the leftover CSP. The previous run enumerated vectors — millions per zero-pattern — and had been left partway through the "remaining columns 4 to 12" range. Continuing it would have been weeks of arithmetic toward a false statement. See beat 2.

2. The useful failure

Rewriting the question as a covering problem made it cheap enough to just ask, so the first thing to do was ask it in the form the previous campaign had assumed, over all of N13N_{13} — nonzero with a zero coordinate, no gcd condition. The answer came back in 27 seconds, and it was the wrong sign: there is such a vector, v=2⋅(1,2,…,13) mod 14=(2,4,6,8,10,12,0,2,4,6,8,10,12),v = 2\cdot(1,2,\dots,13) \bmod 14 = (2,4,6,8,10,12,0,2,4,6,8,10,12), and none of the 14×191=267414 \times 191 = 2674 pairs (s,j)(s,j) saves it.

That was the useful failure. The target as stated was false, so the search that was running could not have terminated the way it was aimed — and the vector sits in exactly the unfinished range.

Then look at what the counterexample is. Every coordinate is even. It is not a subtle object; it is the whole of 2Z/142\mathbb Z/14. And a tuple all of whose coordinates are even is precisely what the gcd condition throws away. The false statement and the missing term are the same fact seen twice.

3. The click

Put the gcd condition back and the hypothesis becomes clean. For a prime q∣mq \mid m, "some ii has q∣vjq \mid v_j for all j≠ij \ne i" is the same as #{j:q∤vj}≤1\#\{j : q \nmid v_j\} \le 1. So with m=14m = 14:

vv needs a witness exactly when it has a zero coordinate, at least two odd coordinates, and at least two coordinates not divisible by 7.

Two counts and a flag. And it is the same shape at every composite mm — which means the guess is testable at small mm where brute force still runs.

It does. At m=6m = 6 the p-independent statement has 64 obstructions and at p=31p = 31 it has none; at m=8m = 8, 2596 and none at p=59p = 59. Composite mm breaks the pp-free statement and pp repairs it. That is the pattern the k=13k = 13 case then reproduces.

4. The argument, in the order it was found

Write Bi(j)=⌊14{ij/p}⌋B^{(j)}_i = \lfloor 14\{ij/p\}\rfloor, the ii-th entry of r13(j/p)r_{13}(j/p). Call a pair (s,j)(s,j) a constraint, and say coordinate ii taking value aa hits it when sa+Bi(j)≡0sa + B^{(j)}_i \equiv 0 or 13(mod14)13 \pmod{14}. Unwinding the definition:

vv has no witness   ⟺  \iff the sets hit(i,vi)\mathrm{hit}(i,v_i) cover all 14p14p constraints.

So the question is set-cover feasibility in 13 variables of 14 values — not an enumeration over the 1413−1313−1≈7.9×101414^{13} - 13^{13} - 1 \approx 7.9\times 10^{14} candidates. That is the entire reason this became a four-minute computation instead of a multi-week one.

Two reductions come free. Every s=0s = 0 constraint is hit by every vv, because some coordinate of r13(j/p)r_{13}(j/p) is always 00 or 1313 — which is just Goddyn–Wong tightness of (1,…,13)(1,\dots,13), and the code asserts it rather than assuming it. And (s,j)(s,j) and (−s, p−j)(-s,\,p-j) induce the same hitting set. At p=191p = 191 that takes 2674 constraints down to 1181.

./cover --k 13 --p 191
k=13 m=14 p=191 constraints=1181
m factors: 2 7   search space = { some v_i = 0 } minus gcd-proper
RESULT UNSAT (T2(13,191) HOLDS)
nodes=102905279 bound_cuts=80243639 dead_cuts=8002240 seconds=240.73

Agreement table — brute force is an independent enumeration of all of Zmk\mathbb Z_m^k written from the paper, not from the search:

kk mm pp brute force cover cover_bdd
4 5 p-indep 0 obstructions UNSAT —
5 6 p-indep 64 SAT SAT
5 6 31 0 UNSAT UNSAT
7 8 p-indep 2596 SAT SAT
7 8 59 0 UNSAT UNSAT
8 9 p-indep — SAT SAT
13 14 p-indep — SAT SAT
13 14 191 out of reach UNSAT state-explodes

6. What is proved, what is not

Proved, and checkable in four minutes from a clean checkout:

Every (u1,…,u13)∈Z>013(u_1,\dots,u_{13}) \in \mathbb Z^{13}_{>0} with gcd⁡(u1,…,u13)=1\gcd(u_1,\dots,u_{13}) = 1 and ui≡i(mod191)u_i \equiv i \pmod{191} has the lonely runner property.

Equivalently (1,2,…,13)∉J(13,191)(1,2,\dots,13) \notin J(13,191). Sungkawichai and Trakulthongchai prove the corresponding statement only when k+1k+1 and pp are both odd primes, so k=13k = 13 falls outside it, and their Section 5.2 reports (1,2,…,13)(1,2,\dots,13) as the sole survivor of the ×2\times 2 lifting ladder — it is eliminated here with no ×7\times 7 and no ×14\times 14 lift.

Not proved, and worth being blunt about. This is not a bound on the number of runners. The lonely runner conjecture for 14 runners is open, and the reason it is open is untouched: their Section 7 names computing I(13,p,1)I(13,p,1) as the bottleneck, about 101710^{17} tuples at p=191p=191, and nothing here reduces that. What has been removed is one named obstacle — the tight tuple — at one prime.

Also not done. The forward-sweep second decision procedure agrees on every small composite case but runs out of memory before k=13k=13, so the p=191p=191 verdict rests on one exact search plus brute-force validation of the reformulation and 23 million adversarial samples, rather than on two exact searches. Subset dominance would fix it. And whether T2(13,p)T2(13,p) holds for every prime p>182p > 182 — the statement that would actually replace Proposition 4.1 for composite k+1k+1 — is open; it fails at p=17,19p = 17, 19, so there is a threshold, and locating it is a sweep, not a proof.


Walkthrough II — where the modulus stops being enough

The first walkthrough ends with an admission: T2(13,p)T2(13,p) holds at p=191p = 191 and fails at p=17,19p = 17, 19, so there is a threshold somewhere, and finding it "is a sweep, not a proof". The sweep is the wrong instrument. Here is what replaced it.

7. The witnesses were trying to tell us something

p=43p = 43 would not resolve in forty minutes, in either direction. So stop asking for a decision and ask only for a witness — restrict every coordinate to a small alphabet and exhaust. The alphabet came from looking at what q1q1 had already printed: at p=31p = 31 the witness was (0,0,0,1,1,1,0,0,1,0,0,0,0)(0,0,0,1,1,1,0,0,1,0,0,0,0), at p=37p = 37 it used only {0,1,7}\{0,1,7\}.

With A={0,1,7}A = \{0,1,7\}, p=43p = 43 answers in milliseconds: v=(0,0,0,0,0,0,0,0,0,0,0,1,1).v = (0,0,0,0,0,0,0,0,0,0,0,1,1). Two coordinates equal to 11, everything else 00. And the same shape comes back at 47,59,61,71,73,8947, 59, 61, 71, 73, 89.

8. Why that shape works, exactly

Write TT for the two nonzero positions and ZZ for the eleven zeros. Fix jj.

A coordinate in ZZ has value 00, so it hits (s,j)(s,j) iff Bi(j)∈{0,13}B^{(j)}_i \in \{0,13\} — a condition with no ss in it. Either it hits every ss at this jj, or none.

A coordinate in TT has value 11, so it hits (s,j)(s,j) iff s≡−Bis \equiv -B_i or −Bi−1-B_i - 1: exactly two values of ss.

So at a given jj there are only two outcomes. Either some zero coordinate fires and all fourteen ss are covered at once; or no zero coordinate fires, and the two coordinates of TT between them reach at most 44 of the 1313 nonzero ss — and 4<134 < 13, so vv is saved. The whole question collapses:

v=ea+ebv = e_a + e_b is unsaved at pp   ⟺  \iff every j∈Zpj \in \mathbb{Z}_p has some i∉{a,b}i \notin \{a,b\} with ∥ij/p∥<1/14\|i j/p\| < 1/14.

Read the right-hand side out loud and it is a lonely-runner statement about eleven speeds: delete two runners from the tight configuration, and ask whether the survivors have a witness time on the grid (1/p)Z(1/p)\mathbb{Z}. They always have one on the circle — deleting two speeds makes 1/141/14 slack, so the good set G(Z)={t:∥it∥≥1/14 ∀i∈Z}G(Z) = \{t : \|it\| \ge 1/14 \ \forall i \in Z\} contains intervals, not just the six points j/14j/14. The only question is whether the grid is fine enough to land in one.

That is computable once and for all. G(Z)G(Z) is a union of closed intervals with endpoints over D=14⋅lcm(1,…,13)=5045040D = 14 \cdot \mathrm{lcm}(1,\dots,13) = 5045040; for each of the 7878 pairs, list them, and for each pp ask whether any interval contains a multiple of 1/p1/p. No search over vv, no search over pp.

The answer: T2(13,p)T2(13,p) fails at p=43,47,59,61,71,73,89p = 43, 47, 59, 61, 71, 73, 89 and at no larger prime from this family, the largest failing integer being 116116. The tightest pair is {6,10}\{6,10\}, whose longest good interval is 31680/5045040=1/159.2531680/5045040 = 1/159.25; past p=159p = 159 every pair has room.

The last known failure moves from 4141 to 8989. Two programs that share no code agree on the list, including the composite cases 90,95,99,105,11690, 95, 99, 105, 116, and q1q1's own checker — written from the paper — calls the p=43p = 43, 6161 and 8989 vectors genuine obstructions.

9. The correction this forces

It is tempting to now say "so the threshold is 89". It is not, and k=5k=5 is the proof. There, brute force over all 77767776 vectors decides every pp outright: T2(5,p)T2(5,p) fails at 6..14,19,21,22,24,26,27,39,42,576..14, 19, 21, 22, 24, 26, 27, 39, 42, 57. The pair family accounts for p≤13p \le 13 and nothing else. Everything from 1919 to 5757 comes from one richer vector, v=(1,5,0,1,5)=(1,−1,0,1,−1)v = (1,5,0,1,5) = (1,-1,0,1,-1) — the balanced lift of i mod 3i \bmod 3, and 3=m/23 = m/2.

So the pair family is a lower bound on where failure stops, not the threshold. (The obvious m=14m=14 analogue, the balanced lift of i mod 7i \bmod 7, is saved at every prime from 1717 to 293293. The construction does not transfer; the caution does.)

That same k=5k=5 table kills a second habit. 1919 fails and 1717 holds. The pass/fail set is not an interval, so "the first pp that holds" is not a well-posed quantity, and a sweep column must not be read as a threshold.

Which leaves the other direction: not "which pp fails" but "is there a qq past which nothing can". For that, get rid of pp.

Everything in the problem depends on jj only through the real number t=j/pt = j/p, via Bi(t)=⌊14 {it}⌋B_i(t) = \lfloor 14\,\{i t\}\rfloor. That function is right-continuous and jumps only where 14it14 i t crosses an integer — on (1/(14i))Z(1/(14i))\mathbb{Z}. Take all of those together, i=1,…,13i = 1,\dots,13: 812812 breakpoints, cutting the circle into 812812 half-open cells on which the entire hitting structure is constant. Every real tt is in exactly one. No boundary cases.

Now the only fact needed about the grid: every half-open interval of length 1/p1/p contains a point of (1/p)Z(1/p)\mathbb{Z}. So fix qq, and for each cell start crc_r look at the window [cr,cr+1/q)[c_r, c_r + 1/q). If p≥qp \ge q, that window contains a grid point, and that grid point lies in one of the cells the window meets. An unsaved vv must hit at least one of them. Union those cells' hitting sets and it is a set-cover constraint again — the same DFS, the same counting bound, the same gcd branch as q1q1, with only the constraints rebuilt:

no eligible vv covers all of it   ⟹  \implies T2(13,p)T2(13,p) holds for every integer p≥qp \ge q.

One run, an infinite tail. And monotone in qq, so the smallest qq that returns UNSAT is the statement to report.

The first version of this used only cells longer than 1/q1/q, throwing away every short cell. It works, but loosely: at k=7k=7 it certifies p≥121p \ge 121 where the window version certifies p≥84p \ge 84. The union over a window is what recovers the short cells, and it is kept side by side (--strictcell) so the difference is visible.

Calibration, where brute force can check everything: k=5k=5 certifies p≥90p \ge 90 against a true last failure of 5757; brute force over Z65\mathbb{Z}_6^5 for all p∈[90,399]p \in [90, 399] finds no contradiction. So the certificate is sound and about 1.6×1.6\times loose. At k=13k = 13 the lemma of §8 forces any such qq to be at least 117117.