Imports
/- Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Joseph Tooby-Smith -/ module public import Physlib.QFT.QED.AnomalyCancellation.BasisLinear public import Physlib.QFT.QED.AnomalyCancellation.VectorLike

Splitting the linear solutions in the odd case into two ACC-satisfying planes

i. Overview

We split the linear solutions of PureU1 (2 * n + 1) into two planes, where every point in either plane satisfies both the linear and cubic anomaly cancellation conditions.

ii. Key results

    Unshifted.planeLinSols : The inclusion of the unshifted plane into linear solutions

    Unshifted.planeCharges_accCube : The statement that charges from the unshifted plane satisfy the cubic ACC

    Shifted.planeLinSols : The inclusion of the shifted plane.

    Shifted.planeCharges_accCube : The statement that charges from the shifted plane satisfy the cubic ACC

    span_basis : Every linear solution is the sum of a point from each plane.

iii. Table of contents

    A. Splitting the charges up into groups

      A.1. The symmetric split: Spltting the charges up via (n + 1) + 1

      A.2. The shifted split: Spltting the charges up via 1 + n + n

      A.3. The shifte shifted split: Spltting the charges up via ((1+n)+1) + n.succ

      A.4. Relating the splittings together

    B. The unshifted plane

      B.1. The basis vectors of the unshifted plane as charges

      B.2. Components of the basis vectors as charges

      B.3. The basis vectors satisfy the linear ACCs

      B.4. The basis vectors as LinSols

      B.5. The inclusion of the unshifted plane into charges

      B.6. Components of the unshifted plane

      B.7. Points on the unshifted plane satisfies the ACCs

      B.8. Kernel of the inclusion into charges

      B.9. The basis vectors are linearly independent

    C. The shifted plane

      C.1. The basis vectors of the shifted plane as charges

      C.2. Components of the basis vectors as charges

      C.3. The basis vectors satisfy the linear ACCs

      C.4. The basis vectors as LinSols

      C.5. Permutations equal adding basis vectors

      C.6. The inclusion of the shifted plane into charges

      C.7. Components of the shifted plane

      C.8. Points on the shifted plane satisfies the ACCs

      C.9. Kernel of the inclusion into charges

      C.10. The inclusion of the shifted plane into LinSols

      C.11. The basis vectors are linearly independent

    D. The mixed cubic ACC from points in both planes

    E. The combined basis

      E.1. The combined basis as LinSols

      E.2. The inclusion of the span of the combined basis into charges

      E.3. Components of the inclusion

      E.4. Kernel of the inclusion into charges

      E.5. The inclusion of the span of the combined basis into LinSols

      E.6. The combined basis vectors are linearly independent

      E.7. Injectivity of the inclusion into linear solutions

      E.8. Cardinality of the basis

      E.9. The basis vectors as a basis

    F. Every Lienar solution is the sum of a point from each plane

      F.1. Relation under permutations

iv. References

    https://arxiv.org/pdf/1912.04804.pdf

@[expose] public section

A. Splitting the charges up into groups

We have 2 * n + 1 charges, which we split up in the following ways:

| evenFst j (0 to n) | evenSnd j (n.succ to n + n.succ)|

| evenShiftZero (0) | evenShiftFst j (1 to n) |
  evenShiftSnd j (n.succ to 2 * n) | evenShiftLast (2 * n.succ - 1) |

A.1. The symmetric split: Spltting the charges up via (n + 1) + 1

lemma odd_shift_eq (n : ) : (1 + n) + n = 2 * n +1 := n:1 + n + n = 2 * n + 1 All goals completed! 🐙

The inclusion of Fin n into Fin ((n + 1) + n) via the first n. This is then casted to Fin (2 * n + 1).

def oddFst (j : Fin n) : Fin (2 * n + 1) := Fin.cast (split_odd n) (Fin.castAdd n (Fin.castAdd 1 j))

The inclusion of Fin n into Fin ((n + 1) + n) via the second n. This is then casted to Fin (2 * n + 1).

def oddSnd (j : Fin n) : Fin (2 * n + 1) := Fin.cast (split_odd n) (Fin.natAdd (n+1) j)

The element representing 1 in Fin ((n + 1) + n). This is then casted to Fin (2 * n + 1).

def oddMid : Fin (2 * n + 1) := Fin.cast (split_odd n) (Fin.castAdd n (Fin.natAdd n 1))
n:S:Fin (2 * n + 1) h1: i, S i = i, S (Fin.cast i)S (Fin.cast (Fin.castAdd n (Fin.natAdd n 0))) + ( i, S (Fin.cast (Fin.castAdd n (Fin.castAdd 1 i))) + i, S (Fin.cast (Fin.natAdd (n + 1) i))) = S oddMid + ( x, S (oddFst x) + x, S (oddSnd x)) All goals completed! 🐙

A.2. The shifted split: Spltting the charges up via 1 + n + n

The inclusion of Fin n into Fin (1 + n + n) via the first n. This is then casted to Fin (2 * n + 1).

def oddShiftFst (j : Fin n) : Fin (2 * n + 1) := Fin.cast (odd_shift_eq n) (Fin.castAdd n (Fin.natAdd 1 j))

The inclusion of Fin n into Fin (1 + n + n) via the second n. This is then casted to Fin (2 * n + 1).

def oddShiftSnd (j : Fin n) : Fin (2 * n + 1) := Fin.cast (odd_shift_eq n) (Fin.natAdd (1 + n) j)

The element representing the 1 in Fin (1 + n + n). This is then casted to Fin (2 * n + 1).

def oddShiftZero : Fin (2 * n + 1) := Fin.cast (odd_shift_eq n) (Fin.castAdd n (Fin.castAdd n 1))
n:S:Fin (2 * n + 1) h1: i, S i = i, S (Fin.cast i)S (Fin.cast (Fin.castAdd n (Fin.castAdd n 0))) + ( i, S (Fin.cast (Fin.castAdd n (Fin.natAdd 1 i))) + i, S (Fin.cast (Fin.natAdd (1 + n) i))) = S oddShiftZero + ( x, S (oddShiftFst x) + x, S (oddShiftSnd x)) All goals completed! 🐙

A.3. The shifted shifted split: Spltting the charges up via ((1+n)+1) + n.succ

lemma odd_shift_shift_eq (n : ) : ((1+n)+1) + n.succ = 2 * n.succ + 1 := n:1 + n + 1 + n.succ = 2 * n.succ + 1 All goals completed! 🐙

The element representing the first 1 in Fin (1 + n + 1 + n.succ) casted to Fin (2 * n.succ + 1).

def oddShiftShiftZero : Fin (2 * n.succ + 1) := Fin.cast (odd_shift_shift_eq n) (Fin.castAdd n.succ (Fin.castAdd 1 (Fin.castAdd n 1)))

The inclusion of Fin n into Fin (1 + n + 1 + n.succ) via the first n and casted to Fin (2 * n.succ + 1).

def oddShiftShiftFst (j : Fin n) : Fin (2 * n.succ + 1) := Fin.cast (odd_shift_shift_eq n) (Fin.castAdd n.succ (Fin.castAdd 1 (Fin.natAdd 1 j)))

The element representing the second 1 in Fin (1 + n + 1 + n.succ) casted to 2 * n.succ + 1.

def oddShiftShiftMid : Fin (2 * n.succ + 1) := Fin.cast (odd_shift_shift_eq n) (Fin.castAdd n.succ (Fin.natAdd (1+n) 1))

The inclusion of Fin n.succ into Fin (1 + n + 1 + n.succ) via the n.succ and casted to Fin (2 * n.succ + 1).

def oddShiftShiftSnd (j : Fin n.succ) : Fin (2 * n.succ + 1) := Fin.cast (odd_shift_shift_eq n) (Fin.natAdd ((1+n)+1) j)

A.4. Relating the splittings together

lemma oddShiftShiftZero_eq_oddFst_zero : @oddShiftShiftZero n = oddFst 0 := Fin.rev_inj.mp rfllemma oddShiftShiftZero_eq_oddShiftZero : @oddShiftShiftZero n = oddShiftZero := rfllemma oddShiftShiftFst_eq_oddFst_succ (j : Fin n) : oddShiftShiftFst j = oddFst j.succ := n:j:Fin noddShiftShiftFst j = oddFst j.succ n:j:Fin n1 + j = j + 1 All goals completed! 🐙lemma oddShiftShiftFst_eq_oddShiftFst_castSucc (j : Fin n) : oddShiftShiftFst j = oddShiftFst j.castSucc := n:j:Fin noddShiftShiftFst j = oddShiftFst j.castSucc All goals completed! 🐙lemma oddShiftShiftMid_eq_oddMid : @oddShiftShiftMid n = oddMid := n:oddShiftShiftMid = oddMid n:1 + n = n + 1 All goals completed! 🐙lemma oddShiftShiftMid_eq_oddShiftFst_last : oddShiftShiftMid = oddShiftFst (Fin.last n) := n:oddShiftShiftMid = oddShiftFst (Fin.last n) All goals completed! 🐙lemma oddShiftShiftSnd_eq_oddSnd (j : Fin n.succ) : oddShiftShiftSnd j = oddSnd j := n:j:Fin n.succoddShiftShiftSnd j = oddSnd j n:j:Fin n.succ1 + n = n + 1 All goals completed! 🐙n:j:Fin n.succ(oddShiftShiftSnd j) = (oddShiftSnd j) All goals completed! 🐙lemma oddSnd_eq_oddShiftSnd (j : Fin n) : oddSnd j = oddShiftSnd j := n:j:Fin noddSnd j = oddShiftSnd j n:j:Fin nn + 1 = 1 + n All goals completed! 🐙lemma oddShiftZero_eq_oddFst : oddShiftZero = oddFst (0 : Fin n.succ) := n:oddShiftZero = oddFst 0 All goals completed! 🐙lemma oddShiftFst_castSucc_eq_oddFst_succ (j : Fin n) : oddShiftFst j.castSucc = oddFst j.succ := n:j:Fin noddShiftFst j.castSucc = oddFst j.succ n:j:Fin n1 + j = j + 1 All goals completed! 🐙lemma oddShiftFst_last_eq_oddMid : oddShiftFst (Fin.last n) = oddMid := n:oddShiftFst (Fin.last n) = oddMid n:1 + n = n + 1 + 1 All goals completed! 🐙lemma oddShiftSnd_eq_oddSnd (j : Fin n) : oddShiftSnd j = oddSnd j := n:j:Fin noddShiftSnd j = oddSnd j n:j:Fin n1 + n = n + 1 All goals completed! 🐙

B. The unshifted plane

B.1. The basis vectors of the unshifted plane as charges

The unshifted part of the basis as charge assignments.

def basisAsCharges (j : Fin n) : (PureU1 (2 * n + 1)).Charges := fun i => if i = oddFst j then 1 else if i = oddSnd j then - 1 else 0

B.2. Components of the basis vectors as charges

lemma basis_on_oddFst_self (j : Fin n) : basisAsCharges j (oddFst j) = 1 := n:j:Fin nbasisAsCharges j (oddFst j) = 1 All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in lemma basis_on_oddFst_other {k j : Fin n} (h : k j) : basisAsCharges k (oddFst j) = 0 := n:k:Fin nj:Fin nh:k jbasisAsCharges k (oddFst j) = 0 n:k:Fin nj:Fin nh:k jhk:k jbasisAsCharges k (oddFst j) = 0 n:k:Fin nj:Fin nh:k jhk:k j(if j = k then 1 else if j = n + 1 + k then -1 else 0) = 0 n:k:Fin nj:Fin nh:k jhk:k jh✝:j = k1 = 0n:k:Fin nj:Fin nh:k jhk:k jh✝:¬j = k(if j = n + 1 + k then -1 else 0) = 0 n:k:Fin nj:Fin nh:k jhk:k jh✝:j = k1 = 0 All goals completed! 🐙 n:k:Fin nj:Fin nh:k jhk:k jh✝:¬j = k(if j = n + 1 + k then -1 else 0) = 0 n:k:Fin nj:Fin nh:k jhk:k jh✝¹:¬j = kh✝:j = n + 1 + k-1 = 0n:k:Fin nj:Fin nh:k jhk:k jh✝¹:¬j = kh✝:¬j = n + 1 + k0 = 0 n:k:Fin nj:Fin nh:k jhk:k jh✝¹:¬j = kh✝:j = n + 1 + k-1 = 0 All goals completed! 🐙 n:k:Fin nj:Fin nh:k jhk:k jh✝¹:¬j = kh✝:¬j = n + 1 + k0 = 0 All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in lemma basis_on_other {k : Fin n} {j : Fin (2 * n + 1)} (h1 : j oddFst k) (h2 : j oddSnd k) : basisAsCharges k j = 0 := n:k:Fin nj:Fin (2 * n + 1)h1:j oddFst kh2:j oddSnd kbasisAsCharges k j = 0 All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in lemma basis_oddSnd_eq_minus_oddFst (j i : Fin n) : basisAsCharges j (oddSnd i) = - basisAsCharges j (oddFst i) := n:j:Fin ni:Fin nbasisAsCharges j (oddSnd i) = -basisAsCharges j (oddFst i) n:j:Fin ni:Fin n(if n + 1 + i = j then 1 else if n + 1 + i = n + 1 + j then -1 else 0) = -if i = j then 1 else if i = n + 1 + j then -1 else 0 n:j:Fin ni:Fin nh✝¹:n + 1 + i = jh✝:i = j1 = -1n:j:Fin ni:Fin nh✝²:n + 1 + i = jh✝¹:¬i = jh✝:i = n + 1 + j1 = - -1n:j:Fin ni:Fin nh✝²:n + 1 + i = jh✝¹:¬i = jh✝:¬i = n + 1 + j1 = -0n:j:Fin ni:Fin nh✝²:¬n + 1 + i = jh✝¹:n + 1 + i = n + 1 + jh✝:i = j-1 = -1n:j:Fin ni:Fin nh✝³:¬n + 1 + i = jh✝²:n + 1 + i = n + 1 + jh✝¹:¬i = jh✝:i = n + 1 + j-1 = - -1n:j:Fin ni:Fin nh✝³:¬n + 1 + i = jh✝²:n + 1 + i = n + 1 + jh✝¹:¬i = jh✝:¬i = n + 1 + j-1 = -0n:j:Fin ni:Fin nh✝²:¬n + 1 + i = jh✝¹:¬n + 1 + i = n + 1 + jh✝:i = j0 = -1n:j:Fin ni:Fin nh✝³:¬n + 1 + i = jh✝²:¬n + 1 + i = n + 1 + jh✝¹:¬i = jh✝:i = n + 1 + j0 = - -1n:j:Fin ni:Fin nh✝³:¬n + 1 + i = jh✝²:¬n + 1 + i = n + 1 + jh✝¹:¬i = jh✝:¬i = n + 1 + j0 = -0 n:j:Fin ni:Fin nh✝¹:n + 1 + i = jh✝:i = j1 = -1n:j:Fin ni:Fin nh✝²:n + 1 + i = jh✝¹:¬i = jh✝:i = n + 1 + j1 = - -1n:j:Fin ni:Fin nh✝²:n + 1 + i = jh✝¹:¬i = jh✝:¬i = n + 1 + j1 = -0n:j:Fin ni:Fin nh✝²:¬n + 1 + i = jh✝¹:n + 1 + i = n + 1 + jh✝:i = j-1 = -1n:j:Fin ni:Fin nh✝³:¬n + 1 + i = jh✝²:n + 1 + i = n + 1 + jh✝¹:¬i = jh✝:i = n + 1 + j-1 = - -1n:j:Fin ni:Fin nh✝³:¬n + 1 + i = jh✝²:n + 1 + i = n + 1 + jh✝¹:¬i = jh✝:¬i = n + 1 + j-1 = -0n:j:Fin ni:Fin nh✝²:¬n + 1 + i = jh✝¹:¬n + 1 + i = n + 1 + jh✝:i = j0 = -1n:j:Fin ni:Fin nh✝³:¬n + 1 + i = jh✝²:¬n + 1 + i = n + 1 + jh✝¹:¬i = jh✝:i = n + 1 + j0 = - -1n:j:Fin ni:Fin nh✝³:¬n + 1 + i = jh✝²:¬n + 1 + i = n + 1 + jh✝¹:¬i = jh✝:¬i = n + 1 + j0 = -0 first | All goals completed! 🐙 | All goals completed! 🐙All goals completed! 🐙n:k:Fin nj:Fin nh:k j-0 = 0 All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in lemma basis_on_oddMid (j : Fin n) : basisAsCharges j oddMid = 0 := n:j:Fin nbasisAsCharges j oddMid = 0 n:j:Fin n(if n = j then 1 else if n = n + 1 + j then -1 else 0) = 0 n:j:Fin nh✝:n = j1 = 0n:j:Fin nh✝:¬n = j(if n = n + 1 + j then -1 else 0) = 0 n:j:Fin nh✝:n = j1 = 0 All goals completed! 🐙 n:j:Fin nh✝:¬n = j(if n = n + 1 + j then -1 else 0) = 0 n:j:Fin nh✝¹:¬n = jh✝:n = n + 1 + j-1 = 0n:j:Fin nh✝¹:¬n = jh✝:¬n = n + 1 + j0 = 0 n:j:Fin nh✝¹:¬n = jh✝:n = n + 1 + j-1 = 0 All goals completed! 🐙 n:j:Fin nh✝¹:¬n = jh✝:¬n = n + 1 + j0 = 0 All goals completed! 🐙

B.3. The basis vectors satisfy the linear ACCs

n:j:Fin n{ toFun := fun S => i, S i, map_add' := , map_smul' := } (basisAsCharges j) = 0 All goals completed! 🐙

B.4. The basis vectors as LinSols

The unshifted part of the basis as LinSols.

@[simps!] def basis (j : Fin n) : (PureU1 (2 * n + 1)).LinSols := basisAsCharges j, n:j:Fin n (i : Fin (PureU1 (2 * n + 1)).numberLinear), ((PureU1 (2 * n + 1)).linearACCs i) (basisAsCharges j) = 0 n:j:Fin ni:Fin (PureU1 (2 * n + 1)).numberLinear((PureU1 (2 * n + 1)).linearACCs i) (basisAsCharges j) = 0 match i with n:j:Fin ni:Fin (PureU1 (2 * n + 1)).numberLinearisLt✝:0 < (PureU1 (2 * n + 1)).numberLinear((PureU1 (2 * n + 1)).linearACCs 0, isLt✝) (basisAsCharges j) = 0 All goals completed! 🐙

B.5. The inclusion of the unshifted plane into charges

A point in the span of the unshifted part of the basis as a charge.

def planeCharges (f : Fin n ) : (PureU1 (2 * n + 1)).Charges := i, f i basisAsCharges i

B.6. Components of the unshifted plane

n:f:Fin n j:Fin nf j * basisAsCharges j (oddFst j) = f jn:f:Fin n j:Fin n (x : Fin n), x j f x * basisAsCharges x (oddFst j) = 0 n:f:Fin n j:Fin nf j * basisAsCharges j (oddFst j) = f j All goals completed! 🐙 n:f:Fin n j:Fin n (x : Fin n), x j f x * basisAsCharges x (oddFst j) = 0 n:f:Fin n j:Fin nk:Fin nhkj:k jf k * basisAsCharges k (oddFst j) = 0 All goals completed! 🐙n:f:Fin n j:Fin nf j * basisAsCharges j (oddSnd j) = -f jn:f:Fin n j:Fin n (x : Fin n), x j f x * basisAsCharges x (oddSnd j) = 0 n:f:Fin n j:Fin nf j * basisAsCharges j (oddSnd j) = -f j All goals completed! 🐙 n:f:Fin n j:Fin n (x : Fin n), x j f x * basisAsCharges x (oddSnd j) = 0 n:f:Fin n j:Fin nk:Fin nhkj:k jf k * basisAsCharges k (oddSnd j) = 0 All goals completed! 🐙n:f:Fin n i, (f i basisAsCharges i) oddMid = 0 All goals completed! 🐙

B.7. Points on the unshifted plane satisfies the ACCs

n:f:Fin n { toFun := fun S => i, S i, map_add' := , map_smul' := } (planeCharges f) = 0 All goals completed! 🐙n:f:Fin n 0 ^ 3 + i, (((fun i => planeCharges f i ^ 3) oddFst) i + ((fun i => planeCharges f i ^ 3) oddSnd) i) = 0 n:f:Fin n x, (planeCharges f (oddFst x) ^ 3 + planeCharges f (oddSnd x) ^ 3) = 0 n:f:Fin n i:Fin nx✝:i univplaneCharges f (oddFst i) ^ 3 + planeCharges f (oddSnd i) ^ 3 = 0 n:f:Fin n i:Fin nx✝:i univf i ^ 3 + (-f i) ^ 3 = 0 All goals completed! 🐙

B.8. Kernel of the inclusion into charges

lemma planeCharges_zero (f : Fin n ) (h : planeCharges f = 0) : i, f i = 0 := fun i => (planeCharges_oddFst f i).symm.trans (congr_fun h (oddFst i))

A point in the span of the unshifted part of the basis.

def planeLinSols (f : Fin n ) : (PureU1 (2 * n + 1)).LinSols := i, f i basis i
n:f:Fin n i:Fin (PureU1 (2 * n + 1)).numberCharges i_1, (f i_1 basis i_1).val i = i_1, (f i_1 basisAsCharges i_1) i All goals completed! 🐙

B.9. The basis vectors are linearly independent

theorem basis_linear_independent : LinearIndependent (@basis n) := n:LinearIndependent basis n: (g : Fin n ), i, g i basis i = 0 (i : Fin n), g i = 0 n:f:Fin n h: i, f i basis i = 0 (i : Fin n), f i = 0 n:f:Fin n h:planeLinSols f = 0 (i : Fin n), f i = 0 All goals completed! 🐙

C. The shifted plane

C.1. The basis vectors of the shifted plane as charges

The shifted part of the basis as charge assignments.

def basisAsCharges (j : Fin n) : (PureU1 (2 * n + 1)).Charges := fun i => if i = oddShiftFst j then 1 else if i = oddShiftSnd j then - 1 else 0

C.2. Components of the basis vectors as charges

lemma basis_on_oddShiftFst_self (j : Fin n) : basisAsCharges j (oddShiftFst j) = 1 := n:j:Fin nbasisAsCharges j (oddShiftFst j) = 1 All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in lemma basis_on_oddShiftFst_other {k j : Fin n} (h : k j) : basisAsCharges k (oddShiftFst j) = 0 := n:k:Fin nj:Fin nh:k jbasisAsCharges k (oddShiftFst j) = 0 n:k:Fin nj:Fin nh:k jhk:k jbasisAsCharges k (oddShiftFst j) = 0 n:k:Fin nj:Fin nh:k jhk:k j(if 1 + j = 1 + k then 1 else if 1 + j = 1 + n + k then -1 else 0) = 0 n:k:Fin nj:Fin nh:k jhk:k jh✝:1 + j = 1 + k1 = 0n:k:Fin nj:Fin nh:k jhk:k jh✝:¬1 + j = 1 + k(if 1 + j = 1 + n + k then -1 else 0) = 0 n:k:Fin nj:Fin nh:k jhk:k jh✝:1 + j = 1 + k1 = 0 All goals completed! 🐙 n:k:Fin nj:Fin nh:k jhk:k jh✝:¬1 + j = 1 + k(if 1 + j = 1 + n + k then -1 else 0) = 0 n:k:Fin nj:Fin nh:k jhk:k jh✝¹:¬1 + j = 1 + kh✝:1 + j = 1 + n + k-1 = 0n:k:Fin nj:Fin nh:k jhk:k jh✝¹:¬1 + j = 1 + kh✝:¬1 + j = 1 + n + k0 = 0 n:k:Fin nj:Fin nh:k jhk:k jh✝¹:¬1 + j = 1 + kh✝:1 + j = 1 + n + k-1 = 0 All goals completed! 🐙 n:k:Fin nj:Fin nh:k jhk:k jh✝¹:¬1 + j = 1 + kh✝:¬1 + j = 1 + n + k0 = 0 All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in lemma basis_on_other {k : Fin n} {j : Fin (2 * n + 1)} (h1 : j oddShiftFst k) (h2 : j oddShiftSnd k) : basisAsCharges k j = 0 := n:k:Fin nj:Fin (2 * n + 1)h1:j oddShiftFst kh2:j oddShiftSnd kbasisAsCharges k j = 0 All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in lemma basis_oddShiftSnd_eq_minus_oddShiftFst (j i : Fin n) : basisAsCharges j (oddShiftSnd i) = - basisAsCharges j (oddShiftFst i) := n:j:Fin ni:Fin nbasisAsCharges j (oddShiftSnd i) = -basisAsCharges j (oddShiftFst i) n:j:Fin ni:Fin n(if 1 + n + i = 1 + j then 1 else if 1 + n + i = 1 + n + j then -1 else 0) = -if 1 + i = 1 + j then 1 else if 1 + i = 1 + n + j then -1 else 0 n:j:Fin ni:Fin nh✝¹:1 + n + i = 1 + jh✝:1 + i = 1 + j1 = -1n:j:Fin ni:Fin nh✝²:1 + n + i = 1 + jh✝¹:¬1 + i = 1 + jh✝:1 + i = 1 + n + j1 = - -1n:j:Fin ni:Fin nh✝²:1 + n + i = 1 + jh✝¹:¬1 + i = 1 + jh✝:¬1 + i = 1 + n + j1 = -0n:j:Fin ni:Fin nh✝²:¬1 + n + i = 1 + jh✝¹:1 + n + i = 1 + n + jh✝:1 + i = 1 + j-1 = -1n:j:Fin ni:Fin nh✝³:¬1 + n + i = 1 + jh✝²:1 + n + i = 1 + n + jh✝¹:¬1 + i = 1 + jh✝:1 + i = 1 + n + j-1 = - -1n:j:Fin ni:Fin nh✝³:¬1 + n + i = 1 + jh✝²:1 + n + i = 1 + n + jh✝¹:¬1 + i = 1 + jh✝:¬1 + i = 1 + n + j-1 = -0n:j:Fin ni:Fin nh✝²:¬1 + n + i = 1 + jh✝¹:¬1 + n + i = 1 + n + jh✝:1 + i = 1 + j0 = -1n:j:Fin ni:Fin nh✝³:¬1 + n + i = 1 + jh✝²:¬1 + n + i = 1 + n + jh✝¹:¬1 + i = 1 + jh✝:1 + i = 1 + n + j0 = - -1n:j:Fin ni:Fin nh✝³:¬1 + n + i = 1 + jh✝²:¬1 + n + i = 1 + n + jh✝¹:¬1 + i = 1 + jh✝:¬1 + i = 1 + n + j0 = -0 n:j:Fin ni:Fin nh✝¹:1 + n + i = 1 + jh✝:1 + i = 1 + j1 = -1n:j:Fin ni:Fin nh✝²:1 + n + i = 1 + jh✝¹:¬1 + i = 1 + jh✝:1 + i = 1 + n + j1 = - -1n:j:Fin ni:Fin nh✝²:1 + n + i = 1 + jh✝¹:¬1 + i = 1 + jh✝:¬1 + i = 1 + n + j1 = -0n:j:Fin ni:Fin nh✝²:¬1 + n + i = 1 + jh✝¹:1 + n + i = 1 + n + jh✝:1 + i = 1 + j-1 = -1n:j:Fin ni:Fin nh✝³:¬1 + n + i = 1 + jh✝²:1 + n + i = 1 + n + jh✝¹:¬1 + i = 1 + jh✝:1 + i = 1 + n + j-1 = - -1n:j:Fin ni:Fin nh✝³:¬1 + n + i = 1 + jh✝²:1 + n + i = 1 + n + jh✝¹:¬1 + i = 1 + jh✝:¬1 + i = 1 + n + j-1 = -0n:j:Fin ni:Fin nh✝²:¬1 + n + i = 1 + jh✝¹:¬1 + n + i = 1 + n + jh✝:1 + i = 1 + j0 = -1n:j:Fin ni:Fin nh✝³:¬1 + n + i = 1 + jh✝²:¬1 + n + i = 1 + n + jh✝¹:¬1 + i = 1 + jh✝:1 + i = 1 + n + j0 = - -1n:j:Fin ni:Fin nh✝³:¬1 + n + i = 1 + jh✝²:¬1 + n + i = 1 + n + jh✝¹:¬1 + i = 1 + jh✝:¬1 + i = 1 + n + j0 = -0 first | All goals completed! 🐙 | All goals completed! 🐙All goals completed! 🐙n:k:Fin nj:Fin nh:k j-0 = 0 All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in lemma basis_on_oddShiftZero (j : Fin n) : basisAsCharges j oddShiftZero = 0 := n:j:Fin nbasisAsCharges j oddShiftZero = 0 n:j:Fin n(if 0 = 1 + j then 1 else if 0 = 1 + n + j then -1 else 0) = 0 n:j:Fin nh✝:0 = 1 + j1 = 0n:j:Fin nh✝:¬0 = 1 + j(if 0 = 1 + n + j then -1 else 0) = 0 n:j:Fin nh✝:0 = 1 + j1 = 0 All goals completed! 🐙 n:j:Fin nh✝:¬0 = 1 + j(if 0 = 1 + n + j then -1 else 0) = 0 n:j:Fin nh✝¹:¬0 = 1 + jh✝:0 = 1 + n + j-1 = 0n:j:Fin nh✝¹:¬0 = 1 + jh✝:¬0 = 1 + n + j0 = 0 n:j:Fin nh✝¹:¬0 = 1 + jh✝:0 = 1 + n + j-1 = 0 All goals completed! 🐙 n:j:Fin nh✝¹:¬0 = 1 + jh✝:¬0 = 1 + n + j0 = 0 All goals completed! 🐙

C.3. The basis vectors satisfy the linear ACCs

n:j:Fin n{ toFun := fun S => i, S i, map_add' := , map_smul' := } (basisAsCharges j) = 0 All goals completed! 🐙

C.4. The basis vectors as LinSols

The shifted part of the basis as LinSols.

@[simps!] def basis (j : Fin n) : (PureU1 (2 * n + 1)).LinSols := basisAsCharges j, n:j:Fin n (i : Fin (PureU1 (2 * n + 1)).numberLinear), ((PureU1 (2 * n + 1)).linearACCs i) (basisAsCharges j) = 0 n:j:Fin ni:Fin (PureU1 (2 * n + 1)).numberLinear((PureU1 (2 * n + 1)).linearACCs i) (basisAsCharges j) = 0 match i with n:j:Fin ni:Fin (PureU1 (2 * n + 1)).numberLinearisLt✝:0 < (PureU1 (2 * n + 1)).numberLinear((PureU1 (2 * n + 1)).linearACCs 0, isLt✝) (basisAsCharges j) = 0 All goals completed! 🐙

C.5. Permutations equal adding basis vectors

Swapping the elements oddShiftFst j and oddShiftSnd j is equivalent to adding a vector basisAsCharges j.

n:S:(PureU1 (2 * n + 1)).LinSolsS':(PureU1 (2 * n + 1)).LinSolsj:Fin nhS:((FamilyPermutations (2 * n + 1)).linSolRep (Equiv.swap (oddShiftFst j) (oddShiftSnd j))) S = S'i:Fin (PureU1 (2 * n + 1)).numberChargeshi:¬i = oddShiftFst jhi2:¬i = oddShiftSnd jS.val ((Equiv.symm (Equiv.swap (oddShiftFst j) (oddShiftSnd j))) i) = S.val i + (S.val (oddShiftSnd j) - S.val (oddShiftFst j)) * 0 All goals completed! 🐙

C.6. The inclusion of the shifted plane into charges

A point in the span of the shifted part of the basis as a charge.

def planeCharges (f : Fin n ) : (PureU1 (2 * n + 1)).Charges := i, f i basisAsCharges i

C.7. Components of the shifted plane

n:f:Fin n j:Fin nf j * basisAsCharges j (oddShiftFst j) = f jn:f:Fin n j:Fin n (x : Fin n), x j f x * basisAsCharges x (oddShiftFst j) = 0 n:f:Fin n j:Fin nf j * basisAsCharges j (oddShiftFst j) = f j All goals completed! 🐙 n:f:Fin n j:Fin n (x : Fin n), x j f x * basisAsCharges x (oddShiftFst j) = 0 n:f:Fin n j:Fin nk:Fin nhkj:k jf k * basisAsCharges k (oddShiftFst j) = 0 All goals completed! 🐙n:f:Fin n j:Fin nf j * basisAsCharges j (oddShiftSnd j) = -f jn:f:Fin n j:Fin n (x : Fin n), x j f x * basisAsCharges x (oddShiftSnd j) = 0 n:f:Fin n j:Fin nf j * basisAsCharges j (oddShiftSnd j) = -f j All goals completed! 🐙 n:f:Fin n j:Fin n (x : Fin n), x j f x * basisAsCharges x (oddShiftSnd j) = 0 n:f:Fin n j:Fin nk:Fin nhkj:k jf k * basisAsCharges k (oddShiftSnd j) = 0 All goals completed! 🐙n:f:Fin n i, (f i basisAsCharges i) oddShiftZero = 0 All goals completed! 🐙

C.8. Points on the shifted plane satisfies the ACCs

n:f:Fin n { toFun := fun S => i, S i, map_add' := , map_smul' := } (planeCharges f) = 0 All goals completed! 🐙n:f:Fin n 0 ^ 3 + i, (((fun i => planeCharges f i ^ 3) oddShiftFst) i + ((fun i => planeCharges f i ^ 3) oddShiftSnd) i) = 0 n:f:Fin n x, (planeCharges f (oddShiftFst x) ^ 3 + planeCharges f (oddShiftSnd x) ^ 3) = 0 n:f:Fin n i:Fin nx✝:i univplaneCharges f (oddShiftFst i) ^ 3 + planeCharges f (oddShiftSnd i) ^ 3 = 0 n:f:Fin n i:Fin nx✝:i univf i ^ 3 + (-f i) ^ 3 = 0 All goals completed! 🐙

C.9. Kernel of the inclusion into charges

lemma planeCharges_zero (f : Fin n ) (h : planeCharges f = 0) : i, f i = 0 := fun i => (planeCharges_oddShiftFst f i).symm.trans (congr_fun h (oddShiftFst i))

C.10. The inclusion of the shifted plane into LinSols

A point in the span of the shifted part of the basis.

def planeLinSols (f : Fin n ) : (PureU1 (2 * n + 1)).LinSols := i, f i basis i
n:f:Fin n i:Fin (PureU1 (2 * n + 1)).numberCharges i_1, (f i_1 basis i_1).val i = i_1, (f i_1 basisAsCharges i_1) i All goals completed! 🐙

C.11. The basis vectors are linearly independent

theorem basis_linear_independent : LinearIndependent (@basis n) := n:LinearIndependent basis n: (g : Fin n ), i, g i basis i = 0 (i : Fin n), g i = 0 n:f:Fin n h: i, f i basis i = 0 (i : Fin n), f i = 0 n:f:Fin n h:planeLinSols f = 0 (i : Fin n), f i = 0 All goals completed! 🐙

D. The mixed cubic ACC from points in both planes

n:g:Fin n j:Fin nUnshifted.planeCharges g (oddShiftFst j) * Unshifted.planeCharges g (oddShiftFst j) * 1 + -g j * -g j * -1 = Unshifted.planeCharges g (oddShiftFst j) ^ 2 - g j ^ 2 All goals completed! 🐙 n:g:Fin n j:Fin n (x : Fin n), x j Unshifted.planeCharges g (oddShiftFst x) * Unshifted.planeCharges g (oddShiftFst x) * Shifted.basisAsCharges j (oddShiftFst x) + Unshifted.planeCharges g (oddShiftSnd x) * Unshifted.planeCharges g (oddShiftSnd x) * Shifted.basisAsCharges j (oddShiftSnd x) = 0 n:g:Fin n j:Fin nk:Fin nhkj:k jUnshifted.planeCharges g (oddShiftFst k) * Unshifted.planeCharges g (oddShiftFst k) * Shifted.basisAsCharges j (oddShiftFst k) + Unshifted.planeCharges g (oddShiftSnd k) * Unshifted.planeCharges g (oddShiftSnd k) * Shifted.basisAsCharges j (oddShiftSnd k) = 0 erw [n:g:Fin n j:Fin nk:Fin nhkj:k jUnshifted.planeCharges g (oddShiftFst k) * Unshifted.planeCharges g (oddShiftFst k) * 0 + Unshifted.planeCharges g (oddShiftSnd k) * Unshifted.planeCharges g (oddShiftSnd k) * Shifted.basisAsCharges j (oddShiftSnd k) = 0 n:g:Fin n j:Fin nk:Fin nhkj:k jUnshifted.planeCharges g (oddShiftFst k) * Unshifted.planeCharges g (oddShiftFst k) * 0 + Unshifted.planeCharges g (oddShiftSnd k) * Unshifted.planeCharges g (oddShiftSnd k) * 0 = 0n:g:Fin n j:Fin nk:Fin nhkj:k jUnshifted.planeCharges g (oddShiftFst k) * Unshifted.planeCharges g (oddShiftFst k) * 0 + Unshifted.planeCharges g (oddShiftSnd k) * Unshifted.planeCharges g (oddShiftSnd k) * 0 = 0 All goals completed! 🐙

E. The combined Unshifted.basis

E.1. The combined Unshifted.basis as LinSols

The whole Unshifted.basis as LinSols.

def basisa : Fin n Fin n (PureU1 (2 * n + 1)).LinSols := fun i => match i with | .inl i => Unshifted.basis i | .inr i => Shifted.basis i

E.2. The inclusion of the span of the combined Unshifted.basis into charges

A point in the span of the Unshifted.basis as a charge.

def Pa (f : Fin n ) (g : Fin n ) : (PureU1 (2 * n + 1)).Charges := Unshifted.planeCharges f + Shifted.planeCharges g

E.3. Components of the inclusion

All goals completed! 🐙All goals completed! 🐙All goals completed! 🐙n:f:Fin n.succ g:Fin n.succ j:Fin n.succ-f j + -g j = -f j - g j All goals completed! 🐙

E.4. Kernel of the inclusion into charges

n:f:Fin n.succ g:Fin n.succ h:Pa f g = 0h₃:0 = f 0i:Fin n.succhinduc: (iv : ) (hiv : iv < n.succ), f iv, hiv = 0f i = 0 All goals completed! 🐙n:f:Fin n.succ g:Fin n.succ h: i, f i Unshifted.basisAsCharges i + Shifted.planeCharges g = 0hf: (i : Fin n.succ), f i = 0 (i : Fin n.succ), g i = 0 n:f:Fin n.succ g:Fin n.succ hf: (i : Fin n.succ), f i = 0h:Shifted.planeCharges g = 0 (i : Fin n.succ), g i = 0 All goals completed! 🐙

E.5. The inclusion of the span of the combined Unshifted.basis into LinSols

A point in the span of the whole Unshifted.basis.

def Pa' (f : (Fin n) (Fin n) ) : (PureU1 (2 * n + 1)).LinSols := i, f i basisa i
lemma Pa'_P'_P!' (f : (Fin n) (Fin n) ) : Pa' f = Unshifted.planeLinSols (f Sum.inl) + Shifted.planeLinSols (f Sum.inr) := n:f:Fin n Fin n Pa' f = Unshifted.planeLinSols (f Sum.inl) + Shifted.planeLinSols (f Sum.inr) All goals completed! 🐙

E.6. The combined Unshifted.basis vectors are linearly independent

n:f:Fin n.succ Fin n.succ h:Pa' f = 0h1:Unshifted.planeCharges (f Sum.inl) + Shifted.planeCharges (f Sum.inr) = 0 (i : Fin n.succ Fin n.succ), f i = 0 n:f:Fin n.succ Fin n.succ h:Pa' f = 0h1:Pa (f Sum.inl) (f Sum.inr) = 0 (i : Fin n.succ Fin n.succ), f i = 0 n:f:Fin n.succ Fin n.succ h:Pa' f = 0h1:Pa (f Sum.inl) (f Sum.inr) = 0hf: (i : Fin n.succ), (f Sum.inl) i = 0 (i : Fin n.succ Fin n.succ), f i = 0 n:f:Fin n.succ Fin n.succ h:Pa' f = 0h1:Pa (f Sum.inl) (f Sum.inr) = 0hf: (i : Fin n.succ), (f Sum.inl) i = 0hg: (i : Fin n.succ), (f Sum.inr) i = 0 (i : Fin n.succ Fin n.succ), f i = 0 n:f:Fin n.succ Fin n.succ h:Pa' f = 0h1:Pa (f Sum.inl) (f Sum.inr) = 0hf: (i : Fin n.succ), (f Sum.inl) i = 0hg: (i : Fin n.succ), (f Sum.inr) i = 0i:Fin n.succ Fin n.succf i = 0 n:f:Fin n.succ Fin n.succ i:Fin n.succ Fin n.succh:Pa' f = 0h1:Pa (f Sum.inl) (f Sum.inr) = 0hf: (i : Fin (n + 1)), f (Sum.inl i) = 0hg: (i : Fin (n + 1)), f (Sum.inr i) = 0f i = 0 n:f:Fin n.succ Fin n.succ h:Pa' f = 0h1:Pa (f Sum.inl) (f Sum.inr) = 0hf: (i : Fin (n + 1)), f (Sum.inl i) = 0hg: (i : Fin (n + 1)), f (Sum.inr i) = 0val✝:Fin n.succf (Sum.inl val✝) = 0n:f:Fin n.succ Fin n.succ h:Pa' f = 0h1:Pa (f Sum.inl) (f Sum.inr) = 0hf: (i : Fin (n + 1)), f (Sum.inl i) = 0hg: (i : Fin (n + 1)), f (Sum.inr i) = 0val✝:Fin n.succf (Sum.inr val✝) = 0 n:f:Fin n.succ Fin n.succ h:Pa' f = 0h1:Pa (f Sum.inl) (f Sum.inr) = 0hf: (i : Fin (n + 1)), f (Sum.inl i) = 0hg: (i : Fin (n + 1)), f (Sum.inr i) = 0val✝:Fin n.succf (Sum.inl val✝) = 0n:f:Fin n.succ Fin n.succ h:Pa' f = 0h1:Pa (f Sum.inl) (f Sum.inr) = 0hf: (i : Fin (n + 1)), f (Sum.inl i) = 0hg: (i : Fin (n + 1)), f (Sum.inr i) = 0val✝:Fin n.succf (Sum.inr val✝) = 0 All goals completed! 🐙

E.7. Injectivity of the inclusion into linear solutions

All goals completed! 🐙n:g:Fin n.succ g':Fin n.succ f:Fin n.succ f':Fin n.succ h:Pa g f = Pa g' f'(Unshifted.planeLinSols (Sum.elim g f Sum.inl) + Shifted.planeLinSols (Sum.elim g f Sum.inr)).val = (Unshifted.planeLinSols (Sum.elim g' f' Sum.inl) + Shifted.planeLinSols (Sum.elim g' f' Sum.inr)).val n:g:Fin n.succ g':Fin n.succ f:Fin n.succ f':Fin n.succ h:Pa g f = Pa g' f'Unshifted.planeCharges (Sum.elim g f Sum.inl) + Shifted.planeCharges (Sum.elim g f Sum.inr) = Unshifted.planeCharges (Sum.elim g' f' Sum.inl) + Shifted.planeCharges (Sum.elim g' f' Sum.inr) All goals completed! 🐙n:g:Fin n.succ g':Fin n.succ f:Fin n.succ f':Fin n.succ Pa' (Sum.elim g f) = Pa' (Sum.elim g' f') Sum.elim g f = Sum.elim g' f' All goals completed! 🐙

E.8. Cardinality of the Unshifted.basis

lemma basisa_card : Fintype.card ((Fin n.succ) (Fin n.succ)) = Module.finrank (PureU1 (2 * n.succ + 1)).LinSols := n:Fintype.card (Fin n.succ Fin n.succ) = finrank (PureU1 (2 * n.succ + 1)).LinSols erw [n:Fintype.card (Fin n.succ Fin n.succ) = 2 * n.succn:Fintype.card (Fin n.succ Fin n.succ) = 2 * n.succ All goals completed! 🐙

E.9. The Unshifted.basis vectors as a Unshifted.basis

F. Every Lienar solution is the sum of a point from each plane

n:S:(PureU1 (2 * n.succ + 1)).LinSolsf:Fin n.succ Fin n.succ hf:((Unshifted.planeLinSols fun i => f (Sum.inl i)) + Shifted.planeLinSols fun i => f (Sum.inr i)) = S((Unshifted.planeLinSols fun i => f (Sum.inl i)) + Shifted.planeLinSols fun i => f (Sum.inr i)).val = Unshifted.planeCharges (f Sum.inl) + Shifted.planeCharges (f Sum.inr) n:S:(PureU1 (2 * n.succ + 1)).LinSolsf:Fin n.succ Fin n.succ hf:((Unshifted.planeLinSols fun i => f (Sum.inl i)) + Shifted.planeLinSols fun i => f (Sum.inr i)) = S((Unshifted.planeCharges fun i => f (Sum.inl i)) + Shifted.planeCharges fun i => f (Sum.inr i)) = Unshifted.planeCharges (f Sum.inl) + Shifted.planeCharges (f Sum.inr) All goals completed! 🐙

F.1. Relation under permutations

n:S':(PureU1 (2 * n.succ + 1)).LinSolsS:(PureU1 (2 * n.succ + 1)).LinSolsj:Fin n.succhS:((FamilyPermutations (2 * n.succ + 1)).linSolRep (Equiv.swap (oddShiftFst j) (oddShiftSnd j))) S = S'g:Fin n.succ f:Fin n.succ hS1:S.val = Unshifted.planeCharges g + Shifted.planeCharges fX:(PureU1 (2 * n.succ + 1)).Charges := Shifted.planeCharges f + (S.val (oddShiftSnd j) - S.val (oddShiftFst j)) Shifted.basisAsCharges jhf:Shifted.planeCharges f Submodule.span (Set.range Shifted.basisAsCharges)hP:(S.val (oddShiftSnd j) - S.val (oddShiftFst j)) Shifted.basisAsCharges j Submodule.span (Set.range Shifted.basisAsCharges)hX:X Submodule.span (Set.range Shifted.basisAsCharges)f':Fin n.succ hf':Shifted.planeCharges f' = XS'.val = S.val + (S.val (oddShiftSnd j) - S.val (oddShiftFst j)) Shifted.basisAsCharges j n:S':(PureU1 (2 * n.succ + 1)).LinSolsS:(PureU1 (2 * n.succ + 1)).LinSolsj:Fin n.succg:Fin n.succ f:Fin n.succ hS1:S.val = Unshifted.planeCharges g + Shifted.planeCharges fX:(PureU1 (2 * n.succ + 1)).Charges := Shifted.planeCharges f + (S.val (oddShiftSnd j) - S.val (oddShiftFst j)) Shifted.basisAsCharges jhf:Shifted.planeCharges f Submodule.span (Set.range Shifted.basisAsCharges)hP:(S.val (oddShiftSnd j) - S.val (oddShiftFst j)) Shifted.basisAsCharges j Submodule.span (Set.range Shifted.basisAsCharges)hX:X Submodule.span (Set.range Shifted.basisAsCharges)f':Fin n.succ hf':Shifted.planeCharges f' = XhS:S'.val = S.val + (S.val (oddShiftSnd j) - S.val (oddShiftFst j)) Shifted.basisAsCharges jS'.val = S.val + (S.val (oddShiftSnd j) - S.val (oddShiftFst j)) Shifted.basisAsCharges j All goals completed! 🐙