Soundness of the kernel gap leaf #
pGapOK b s w₀ w₁ = true implies, at every point of the box, the hypotheses of gap_core.
The vertex table #
theorem
Cayley.Pack.vt_scaled'
(t : ℕ)
:
t < 90 →
(vertexOf (t / 6) (t % 6 / 3) (t % 3)).x.e ≤ 160 ∧ (vertexOf (t / 6) (t % 6 / 3) (t % 3)).y.e ≤ 160 ∧ (vertexOf (t / 6) (t % 6 / 3) (t % 3)).z.e ≤ 160 ∧ (vertexOf (t / 6) (t % 6 / 3) (t % 3)).x.m * 2 ^ (160 - (vertexOf (t / 6) (t % 6 / 3) (t % 3)).x.e) = (vt t).1 ∧ (vertexOf (t / 6) (t % 6 / 3) (t % 3)).y.m * 2 ^ (160 - (vertexOf (t / 6) (t % 6 / 3) (t % 3)).y.e) = (vt t).2.1 ∧ (vertexOf (t / 6) (t % 6 / 3) (t % 3)).z.m * 2 ^ (160 - (vertexOf (t / 6) (t % 6 / 3) (t % 3)).z.e) = (vt t).2.2
The kernel vertex table is the checker's vertexTab, scaled by 2^160.
The tabulated vertex as a real vector.
Equations
- Cayley.Pack.vR t i = Cayley.Pack.svec (Cayley.Pack.vt t) i / 2 ^ 160
Instances For
The decoded polynomials #
The gap-leaf expressions for inner vertex s.
Equations
- Cayley.Pack.gp b s w0 w1 = Cayley.Pack.gapPE b (Cayley.Pack.vt s) w0 w1
Instances For
Eₖ = αₖ κD.
Equations
- Cayley.Pack.Ep0 b s w0 w1 = (Cayley.Pack.gp b s w0 w1).a0.mul (Cayley.Pack.gp b s w0 w1).kd
Instances For
Equations
- Cayley.Pack.Ep1 b s w0 w1 = (Cayley.Pack.gp b s w0 w1).a1.mul (Cayley.Pack.gp b s w0 w1).kd
Instances For
Equations
- Cayley.Pack.Ep2 b s w0 w1 = (Cayley.Pack.gp b s w0 w1).a2.mul (Cayley.Pack.gp b s w0 w1).kd
Instances For
F_T = A − (Σ Tₖ αₖ) κD.
Equations
- Cayley.Pack.Fp b s w0 w1 T = (Cayley.Pack.Ap b s w0 w1).sub ((Cayley.Pack.xp b s w0 w1 T).mul (Cayley.Pack.gp b s w0 w1).kd)
Instances For
theorem
Cayley.Pack.gp_fields_real
(b : K.KBox)
(s : ℕ)
(w0 w1 : ℤ)
(t : Fin 5 → ℝ)
:
have g := gapR b (vt s) w0 w1 t;
PE.ev t (gp b s w0 w1).a0 = g.a0 ∧ PE.ev t (gp b s w0 w1).a1 = g.a1 ∧ PE.ev t (gp b s w0 w1).a2 = g.a2 ∧ PE.ev t (gp b s w0 w1).b0 = g.b0 ∧ PE.ev t (gp b s w0 w1).b1 = g.b1 ∧ PE.ev t (gp b s w0 w1).b2 = g.b2 ∧ PE.ev t (gp b s w0 w1).kd = g.kd ∧ PE.ev t (gp b s w0 w1).l0 = g.l0 ∧ PE.ev t (gp b s w0 w1).l1 = g.l1 ∧ PE.ev t (gp b s w0 w1).l2 = g.l2
theorem
Cayley.Pack.Fp_real
(b : K.KBox)
(s : ℕ)
(w0 w1 : ℤ)
(hj : b.chart < 5)
(t : Fin 5 → ℝ)
(T : ℤ × ℤ × ℤ)
:
PE.ev t (Fp b s w0 w1 T) = 2 ^ K.gapSc b * 2 ^ 160 * (cayleyDenom (kpt b t 1) (-kpt b t 0) 0 * kapJ b.chart * cayleyDenom (rOf (kblow b.chart) b.face (kpt b t) 0) (rOf (kblow b.chart) b.face (kpt b t) 1)
(rOf (kblow b.chart) b.face (kpt b t) 2) * (lin (↑w0) (↑w1)
((outerRot (kpt b t 0) (kpt b t 1) * Qm b.chart (rOf (kblow b.chart) b.face (kpt b t))).mulVec (vR s)) - lin (↑w0) (↑w1) ((outerRot (kpt b t 0) (kpt b t 1)).mulVec fun (i : Fin 3) => svec T i / 2 ^ 160)))
The real value of F_T: the scaled gap of the tabulated vertices.
Degrees and norms #
theorem
Cayley.Pack.gapNrmOK_spec
{b : K.KBox}
{S : ℤ × ℤ × ℤ}
{w0 w1 : ℤ}
(h : K.gapNrmOK b S w0 w1 = true)
:
(K.gapNrm b S w0 w1).a0 * (K.gapNrm b S w0 w1).b0 + (K.gapNrm b S w0 w1).a1 * (K.gapNrm b S w0 w1).b1 + (K.gapNrm b S w0 w1).a2 * (K.gapNrm b S w0 w1).b2 + 2 ^ 161 * ((K.gapNrm b S w0 w1).a0 + (K.gapNrm b S w0 w1).a1 + (K.gapNrm b S w0 w1).a2) * (K.gapNrm b S w0 w1).kd < 2 ^ 390 ∧ (K.gapNrm b S w0 w1).a0 * (K.gapNrm b S w0 w1).l0 + (K.gapNrm b S w0 w1).a1 * (K.gapNrm b S w0 w1).l1 + (K.gapNrm b S w0 w1).a2 * (K.gapNrm b S w0 w1).l2 < 2 ^ 390
The norm guard from the cheap check nrmOK #
The worst box of a chart and face: scale 2^16, every centre and radius 2^17.
Equations
- Cayley.Pack.worstBox chart face = { chart := chart, face := face, K := 16, c := List.replicate 5 ↑(2 ^ 17), h := List.replicate 5 ↑(2 ^ 17) }
Instances For
theorem
Cayley.Pack.gapNrmOK_box
(b : K.KBox)
(hj : b.chart < 5)
(hf : b.face < 6)
(hlc : b.c.length = 5)
(hlh : b.h.length = 5)
(hmag : ∀ (i : Fin 5), |b.c.getD (↑i) 0| + |b.h.getD (↑i) 0| ≤ 2 * 2 ^ b.K)
{s : ℕ}
(hs : s < 90)
{w0 w1 : ℤ}
(hn : K.nrmOK b w0 w1 = true)
:
A box with the walk's magnitude bound that passes nrmOK passes the norm guard.
The vertex-packed quick test #
Its slot t.
Equations
- One or more equations did not get rendered due to their size.
Instances For
theorem
Cayley.Pack.quick_bit
(q e00 e01 e02 : ℤ)
(n0 n1 n2 : ℕ)
(hC : 0 ≤ K.p2 639 + q - K.p2 170 * (↑e00.natAbs + ↑e01.natAbs + ↑e02.natAbs + (↑n0 + ↑n1 + ↑n2)))
(hC2 :
K.p2 639 + q - K.p2 170 * (↑e00.natAbs + ↑e01.natAbs + ↑e02.natAbs + (↑n0 + ↑n1 + ↑n2)) + 2 * K.p2 170 * (↑e00.natAbs + ↑e01.natAbs + ↑e02.natAbs + (↑n0 + ↑n1 + ↑n2)) < K.p2 640)
{t : ℕ}
(ht : t < 90)
(hb :
(K.quickV (K.p2 639 + q - K.p2 170 * (↑e00.natAbs + ↑e01.natAbs + ↑e02.natAbs + (↑n0 + ↑n1 + ↑n2))) e00 e01 e02 n0 n1
n2).testBit
(640 * t + 639) = true)
:
Per-vertex bounds #
@[reducible, inline]
The Kronecker point as a function.
Equations
- Cayley.Pack.pXv i = Cayley.K.pX ↑i
Instances For
theorem
Cayley.Pack.gp_fields_int
(b : K.KBox)
(s : ℕ)
(w0 w1 : ℤ)
:
have g := K.pGapData b (vt s) w0 w1;
PE.ev pXv (gp b s w0 w1).a0 = g.a0 ∧ PE.ev pXv (gp b s w0 w1).a1 = g.a1 ∧ PE.ev pXv (gp b s w0 w1).a2 = g.a2 ∧ PE.ev pXv (gp b s w0 w1).b0 = g.b0 ∧ PE.ev pXv (gp b s w0 w1).b1 = g.b1 ∧ PE.ev pXv (gp b s w0 w1).b2 = g.b2 ∧ PE.ev pXv (gp b s w0 w1).kd = g.kd ∧ PE.ev pXv (gp b s w0 w1).l0 = g.l0 ∧ PE.ev pXv (gp b s w0 w1).l1 = g.l1 ∧ PE.ev pXv (gp b s w0 w1).l2 = g.l2
theorem
Cayley.Pack.ints
(b : K.KBox)
(s : ℕ)
(w0 w1 : ℤ)
:
have g := K.pGapData b (vt s) w0 w1;
K.gA g = PE.ev pXv (Ap b s w0 w1) ∧ K.gL g = PE.ev pXv (Lp b s w0 w1) ∧ g.a0.mul g.kd = PE.ev pXv (Ep0 b s w0 w1) ∧ g.a1.mul g.kd = PE.ev pXv (Ep1 b s w0 w1) ∧ g.a2.mul g.kd = PE.ev pXv (Ep2 b s w0 w1) ∧ ∀ (T : ℤ × ℤ × ℤ), K.gF g T.1 T.2.1 T.2.2 = PE.ev pXv (Fp b s w0 w1 T)
theorem
Cayley.Pack.full_G1
(b : K.KBox)
(s : ℕ)
(w0 w1 : ℤ)
(hj : b.chart < 5)
(hf : b.face < 6)
(hn : K.gapNrmOK b (vt s) w0 w1 = true)
{tt : ℕ}
(htt : tt < 90)
(hfull : K.fullOK b (vt s) w0 w1 (vt tt).1 (vt tt).2.1 (vt tt).2.2 = true)
{t : Fin 5 → ℝ}
(ht : ∀ (i : Fin 5), |t i| ≤ 1)
:
G1 b s w0 w1 t tt
theorem
Cayley.Pack.quick_G1
(b : K.KBox)
(s : ℕ)
(w0 w1 : ℤ)
(hj : b.chart < 5)
(hf : b.face < 6)
(hn : K.gapNrmOK b (vt s) w0 w1 = true)
{tt : ℕ}
(htt : tt < 90)
(hC :
0 ≤ K.p2 639 + K.quickQ b (vt s) w0 w1 - K.p2 170 * (↑(K.quickE b (vt s) w0 w1).1.c0.natAbs + ↑(K.quickE b (vt s) w0 w1).2.1.c0.natAbs + ↑(K.quickE b (vt s) w0 w1).2.2.c0.natAbs + (↑(K.quickE b (vt s) w0 w1).1.abs + ↑(K.quickE b (vt s) w0 w1).2.1.abs + ↑(K.quickE b (vt s) w0 w1).2.2.abs)))
(hC2 :
K.p2 639 + K.quickQ b (vt s) w0 w1 - K.p2 170 * (↑(K.quickE b (vt s) w0 w1).1.c0.natAbs + ↑(K.quickE b (vt s) w0 w1).2.1.c0.natAbs + ↑(K.quickE b (vt s) w0 w1).2.2.c0.natAbs + (↑(K.quickE b (vt s) w0 w1).1.abs + ↑(K.quickE b (vt s) w0 w1).2.1.abs + ↑(K.quickE b (vt s) w0 w1).2.2.abs)) + 2 * K.p2 170 * (↑(K.quickE b (vt s) w0 w1).1.c0.natAbs + ↑(K.quickE b (vt s) w0 w1).2.1.c0.natAbs + ↑(K.quickE b (vt s) w0 w1).2.2.c0.natAbs + (↑(K.quickE b (vt s) w0 w1).1.abs + ↑(K.quickE b (vt s) w0 w1).2.1.abs + ↑(K.quickE b (vt s) w0 w1).2.2.abs)) < K.p2 640)
(hb :
(K.quickV
(K.p2 639 + K.quickQ b (vt s) w0 w1 - K.p2 170 * (↑(K.quickE b (vt s) w0 w1).1.c0.natAbs + ↑(K.quickE b (vt s) w0 w1).2.1.c0.natAbs + ↑(K.quickE b (vt s) w0 w1).2.2.c0.natAbs + (↑(K.quickE b (vt s) w0 w1).1.abs + ↑(K.quickE b (vt s) w0 w1).2.1.abs + ↑(K.quickE b (vt s) w0 w1).2.2.abs)))
(K.quickE b (vt s) w0 w1).1.c0 (K.quickE b (vt s) w0 w1).2.1.c0 (K.quickE b (vt s) w0 w1).2.2.c0
(K.quickE b (vt s) w0 w1).1.abs (K.quickE b (vt s) w0 w1).2.1.abs (K.quickE b (vt s) w0 w1).2.2.abs).testBit
(640 * tt + 639) = true)
{t : Fin 5 → ℝ}
(ht : ∀ (i : Fin 5), |t i| ≤ 1)
:
G1 b s w0 w1 t tt
Unfolding the checker #
theorem
Cayley.Pack.pGapOK_sound
(b : K.KBox)
(hj : b.chart < 5)
(hf : b.face < 6)
(hlc : b.c.length = 5)
(hlh : b.h.length = 5)
(hmag : ∀ (i : Fin 5), |b.c.getD (↑i) 0| + |b.h.getD (↑i) 0| ≤ 2 * 2 ^ b.K)
{s : ℕ}
{w0 w1 : ℤ}
(h : K.pGapOK b s w0 w1 = true)
{t : Fin 5 → ℝ}
(ht : ∀ (i : Fin 5), |t i| ≤ 1)
(hpt : PtOK b.chart b.face (kpt b t))
:
Soundness of a kernel gap leaf.