Appendix A

Appendix A. Computations

Kakeya Sets with Multiplicity

All computations were performed in JavaScript (Node.js 22) on a laptop. The fields F4,F8,F9,F16\mathbb F_4,\mathbb F_8,\mathbb F_9,\mathbb F_{16} were represented as F2[x]/(x2+x+1)\mathbb F_2[x]/(x^2+x+1), F2[x]/(x3+x+1)\mathbb F_2[x]/(x^3+x+1), F3[x]/(x2+1)\mathbb F_3[x]/(x^2+1), F2[x]/(x4+x+1)\mathbb F_2[x]/(x^4+x+1), with an element aixi\sum a_ix^i encoded as the integer aipi\sum a_ip^i; the witnesses in §5.4 use this encoding. Lines of direction (1:s:0)(1:s:0) are {(t,b+st):tFq}\{(t,\,b+st):t\in\mathbb F_q\} and lines of direction (0:1:0)(0:1:0) are {(b,t)}\{(b,t)\}.

A.1 Exhaustive search for κr(q)\kappa_r(q)

The program enumerates rr-fold configurations direction by direction, choosing an rr-subset of the qq lines of each direction, maintaining the multiplicity of every point and the current union size, and abandoning a branch as soon as the union is at least the best size found (the union can only grow). Symmetry is used in the two coordinate directions: the maps (x,y)(λx+μ, νy+ρ)(x,y)\mapsto(\lambda x+\mu,\ \nu y+\rho), λν0\lambda\nu\ne0, permute the parallel classes and preserve union sizes, and they act on the lines y=by=b of direction (1:0:0)(1:0:0) through the affine group of Fq\mathbb F_q, which is transitive on ordered pairs of distinct elements; so for r2r\ge2 the chosen lines in that direction may be assumed to include y=0y=0 and y=1y=1, and independently those in direction (0:1:0)(0:1:0) may be assumed to include x=0x=0 and x=1x=1; for r=1r=1, translations give y=0y=0 and x=0x=0. The number of configurations examined is therefore (q2r2)2(qr)q1\binom{q-2}{r-2}^2\binom qr^{q-1} before pruning.

qqrrresultstatustime
31, 27, 8exhaustive<1<1 ms
41, 2, 310, 14, 15exhaustive<1<1 ms
51, 2, 3, 417, 21, 23, 24exhaustive<10<10 ms
7240exhaustive0.3 s
7344exhaustive1.4 s
7446exhaustive0.5 s
8251exhaustive35 s
8464\le64stopped after 600 s in the first branch
9265\le65stopped after 600 s

The pruning is effective when rr is small relative to qq; for q=8q=8, r=4r=4 the (84)=70\binom84=70 subsets per direction defeat it. The extremal configurations reported in Chapter 7 are, in the notation "b1b2b_1b_2\cdots\mid\cdots" listing the chosen bb-values per direction (1:0:0),(1:1:0),,(1:q1:0),(0:1:0)(1:0:0),(1:1:0),\dots,(1:q-1:0),(0:1:0):

  • q=5q=5, r=2r=2: 01012324340101\mid01\mid23\mid24\mid34\mid01;
  • q=7q=7, r=2r=2: 010103122356450101\mid01\mid03\mid12\mid23\mid56\mid45\mid01;
  • q=7q=7, r=3r=3: 012012034123236056456013012\mid012\mid034\mid123\mid236\mid056\mid456\mid013;
  • q=7q=7, r=4r=4: 012301230345124502341456045601340123\mid0123\mid0345\mid1245\mid0234\mid1456\mid0456\mid0134;
  • q=8q=8, r=2r=2: 01020534173426150101\mid02\mid05\mid34\mid17\mid34\mid26\mid15\mid01;
  • q=9q=9, r=2r=2 (65 points): 0101343545677868010101\mid01\mid34\mid35\mid45\mid67\mid78\mid68\mid01\mid01.

A.2 Denniston arcs and their duals

For q=2hq=2^h and nqn\mid q the program finds β\beta with Tr(β)=1\operatorname{Tr}(\beta)=1, takes AA to be the span of 1,x,1,x,\dots (as F2\mathbb F_2-subspace of dimension log2n\log_2n), forms K={(x,y):x2+xy+βy2A}K=\{(x,y):x^2+xy+\beta y^2\in A\}, and checks K=(n1)q+n|K|=(n-1)q+n and that every affine line meets KK in 00 or nn points. It then forms the dual lines xX+yY+1=0xX+yY+1=0 for (x,y)K{(0,0)}(x,y)\in K\setminus\{(0,0)\}, whose direction is (y:x:0)(y:x:0) in characteristic 22, verifies that there are n1n-1 per direction, and computes the union and its multiplicities. Results: (q,n)=(4,2)(q,n)=(4,2): K=6|K|=6, dual union 1010, all multiplicities 22. (8,2)(8,2): 1010, 3636, all 22. (8,4)(8,4): β=1\beta=1, K=28|K|=28, line intersections {0:9, 4:63}\{0{:}9,\ 4{:}63\}, dual union 5454, all multiplicities 44. (16,4)(16,4): β=8\beta=8 (i.e. x3x^3), K=52|K|=52, intersections {0:51, 4:221}\{0{:}51,\ 4{:}221\}, dual union 204204, all multiplicities 44. Sub-configurations with rr lines per direction chosen inside the dual arc were minimised exhaustively over (n1r)q+1\binom{n-1}r^{q+1} choices: (8,4)(8,4): r=1r=1: 3636; r=2r=2: 5151. (16,4)(16,4): r=1r=1: 136136; r=2r=2: 194194.

A.3 Pencils of conics

For odd qq the program takes the least non-square β\beta, the conics Cλ={x2βy2=λ}C_\lambda=\{x^2-\beta y^2=\lambda\}, and, for even rr, every choice of r/2r/2 squares and r/2r/2 non-squares as Λ\Lambda; it forms the dual lines of the points of λΛCλ\bigcup_{\lambda\in\Lambda}C_\lambda, checks that there are rr per direction, and records the smallest union. The values are in §7.3.

A.4 The direction-determination number D(q)D(q)

Since the affine group is transitive on ordered pairs of distinct points, a determining set may be assumed to contain (0,0)(0,0) and (1,0)(1,0). For t=2,3,t=2,3,\dots the program searches depth-first for tt-sets containing these two points that determine all q+1q+1 directions, maintaining a count of determined directions and pruning a branch when the remaining points cannot determine enough new directions (a kk-th point adds at most k1k-1). All runs took under a second; D(q)D(q) is the least tt for which a set is found, and its non-existence for smaller tt is exhaustive.

A.5 Vanishing degrees

For the prime fields F5\mathbb F_5 and F7\mathbb F_7 and a configuration given by its choice string, the program lists the reduced monomials xiyjx^iy^j (0i,jq10\le i,j\le q-1, i+jdi+j\le d), forms the evaluation matrix at the points of UU, and computes its rank by Gaussian elimination modulo qq. A nonzero reduced polynomial of degree d\le d vanishing on UU exists iff the rank is less than the number of monomials, and the kernel dimension is the difference. The results are in §7.4.

// r-fold Kakeya sets in AG(2,q): minimum union of r lines per direction (core; field tables omitted)
const q = Number(process.argv[2]), r = Number(process.argv[3]);
// lines[d][b]: point indices of the b-th line in direction d (d = 0..q-1 slopes, d = q vertical)
function subsets(mustContain) {            // r-subsets of {0..q-1}, optionally forced to contain 0 and 1
  const out = [], fixed = mustContain ? (r === 1 ? [0] : [0, 1]) : [];
  (function rec(start, cur) {
    if (cur.length === r) { out.push(cur.slice()); return; }
    for (let b = start; b < q; b++) { cur.push(b); rec(b + 1, cur); cur.pop(); }
  })(fixed.length, fixed.slice());
  return out;
}
const allSubs = subsets(false), fixedSubs = subsets(true);
const cnt = new Int32Array(q * q); let size = 0, best = Infinity;
(function rec(d) {
  if (size >= best) return;                  // the union only grows
  if (d === q + 1) { best = size; return; }
  const subs = (d === 0 || d === q) ? fixedSubs : allSubs;   // symmetry in the two axis directions
  for (const S of subs) {
    for (const b of S) for (const P of lines[d][b]) if (cnt[P]++ === 0) size++;
    rec(d + 1);
    for (const b of S) for (const P of lines[d][b]) if (--cnt[P] === 0) size--;
  }
})(0);
console.log(q, r, best);