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

    P' : The inclusion of the first plane into linear solutions

    P_accCube : The statement that chares from the first plane satisfy the cubic ACC

    P!' : The inclusion of the second plane.

    P!_accCube : The statement that charges from the second 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 first plane

      B.1. The basis vectors of the first 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 first plane into charges

      B.6. Components of the first plane

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

      B.8. Kernel of the inclusion into charges

      B.9. The basis vectors are linearly independent

    C. The second plane

      C.1. The basis vectors of the second 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 second plane into charges

      C.7. Components of the second plane

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

      C.9. Kernel of the inclusion into charges

      C.10. The inclusion of the second 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 first plane

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

The first 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 first 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 first plane into charges

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

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

B.6. Components of the first 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 first plane satisfies the ACCs

n:f:Fin n { toFun := fun S => i, S i, map_add' := , map_smul' := } (P f) = 0 All goals completed! 🐙n:f:Fin n 0 ^ 3 + i, (((fun i => P f i ^ 3) oddFst) i + ((fun i => P f i ^ 3) oddSnd) i) = 0 n:f:Fin n x, (P f (oddFst x) ^ 3 + P f (oddSnd x) ^ 3) = 0 n:f:Fin n i:Fin nx✝:i univP f (oddFst i) ^ 3 + P 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 P_zero (f : Fin n ) (h : P f = 0) : i, f i = 0 := fun i => (P_oddFst f i).symm.trans (congr_fun h (oddFst i))

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

def P' (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:P' f = 0 (i : Fin n), f i = 0 All goals completed! 🐙

C. The second plane

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

The second part of the basis as charge assignments.

def basis!AsCharges (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) : basis!AsCharges j (oddShiftFst j) = 1 := n:j:Fin nbasis!AsCharges 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) : basis!AsCharges k (oddShiftFst j) = 0 := n:k:Fin nj:Fin nh:k jbasis!AsCharges k (oddShiftFst j) = 0 n:k:Fin nj:Fin nh:k jhk:k jbasis!AsCharges 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) : basis!AsCharges k j = 0 := n:k:Fin nj:Fin (2 * n + 1)h1:j oddShiftFst kh2:j oddShiftSnd kbasis!AsCharges k j = 0 All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in lemma basis!_oddShiftSnd_eq_minus_oddShiftFst (j i : Fin n) : basis!AsCharges j (oddShiftSnd i) = - basis!AsCharges j (oddShiftFst i) := n:j:Fin ni:Fin nbasis!AsCharges j (oddShiftSnd i) = -basis!AsCharges 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) : basis!AsCharges j oddShiftZero = 0 := n:j:Fin nbasis!AsCharges 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' := } (basis!AsCharges j) = 0 All goals completed! 🐙

C.4. The basis vectors as LinSols

The second part of the basis as LinSols.

@[simps!] def basis! (j : Fin n) : (PureU1 (2 * n + 1)).LinSols := basis!AsCharges j, n:j:Fin n (i : Fin (PureU1 (2 * n + 1)).numberLinear), ((PureU1 (2 * n + 1)).linearACCs i) (basis!AsCharges j) = 0 n:j:Fin ni:Fin (PureU1 (2 * n + 1)).numberLinear((PureU1 (2 * n + 1)).linearACCs i) (basis!AsCharges 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✝) (basis!AsCharges 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 basis!AsCharges 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 second plane into charges

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

def P! (f : Fin n ) : (PureU1 (2 * n + 1)).Charges := i, f i basis!AsCharges i

C.7. Components of the second plane

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

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

n:f:Fin n { toFun := fun S => i, S i, map_add' := , map_smul' := } (P! f) = 0 All goals completed! 🐙n:f:Fin n 0 ^ 3 + i, (((fun i => P! f i ^ 3) oddShiftFst) i + ((fun i => P! f i ^ 3) oddShiftSnd) i) = 0 n:f:Fin n x, (P! f (oddShiftFst x) ^ 3 + P! f (oddShiftSnd x) ^ 3) = 0 n:f:Fin n i:Fin nx✝:i univP! f (oddShiftFst i) ^ 3 + P! 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 P!_zero (f : Fin n ) (h : P! f = 0) : i, f i = 0 := fun i => (P!_oddShiftFst f i).symm.trans (congr_fun h (oddShiftFst i))

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

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

def P!' (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 basis!AsCharges 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:P!' 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 nP g (oddShiftFst j) * P g (oddShiftFst j) * 1 + -g j * -g j * -1 = P g (oddShiftFst j) ^ 2 - g j ^ 2 All goals completed! 🐙 n:g:Fin n j:Fin n (x : Fin n), x j P g (oddShiftFst x) * P g (oddShiftFst x) * basis!AsCharges j (oddShiftFst x) + P g (oddShiftSnd x) * P g (oddShiftSnd x) * basis!AsCharges j (oddShiftSnd x) = 0 n:g:Fin n j:Fin nk:Fin nhkj:k jP g (oddShiftFst k) * P g (oddShiftFst k) * basis!AsCharges j (oddShiftFst k) + P g (oddShiftSnd k) * P g (oddShiftSnd k) * basis!AsCharges j (oddShiftSnd k) = 0 erw [n:g:Fin n j:Fin nk:Fin nhkj:k jP g (oddShiftFst k) * P g (oddShiftFst k) * 0 + P g (oddShiftSnd k) * P g (oddShiftSnd k) * basis!AsCharges j (oddShiftSnd k) = 0 n:g:Fin n j:Fin nk:Fin nhkj:k jP g (oddShiftFst k) * P g (oddShiftFst k) * 0 + P g (oddShiftSnd k) * P g (oddShiftSnd k) * 0 = 0n:g:Fin n j:Fin nk:Fin nhkj:k jP g (oddShiftFst k) * P g (oddShiftFst k) * 0 + P g (oddShiftSnd k) * P g (oddShiftSnd k) * 0 = 0 All goals completed! 🐙

E. The combined basis

E.1. The combined basis as LinSols

The whole basis as LinSols.

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

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

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

def Pa (f : Fin n ) (g : Fin n ) : (PureU1 (2 * n + 1)).Charges := P f + P! 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 basisAsCharges i + P! 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:P! g = 0 (i : Fin n.succ), g i = 0 All goals completed! 🐙

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

A point in the span of the whole 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 = P' (f Sum.inl) + P!' (f Sum.inr) := n:f:Fin n Fin n Pa' f = P' (f Sum.inl) + P!' (f Sum.inr) All goals completed! 🐙

E.6. The combined basis vectors are linearly independent

n:f:Fin n.succ Fin n.succ h:Pa' f = 0h1:P (f Sum.inl) + P! (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'(P' (Sum.elim g f Sum.inl) + P!' (Sum.elim g f Sum.inr)).val = (P' (Sum.elim g' f' Sum.inl) + P!' (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'P (Sum.elim g f Sum.inl) + P! (Sum.elim g f Sum.inr) = P (Sum.elim g' f' Sum.inl) + P! (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 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 basis vectors as a 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:((P' fun i => f (Sum.inl i)) + P!' fun i => f (Sum.inr i)) = S((P' fun i => f (Sum.inl i)) + P!' fun i => f (Sum.inr i)).val = P (f Sum.inl) + P! (f Sum.inr) n:S:(PureU1 (2 * n.succ + 1)).LinSolsf:Fin n.succ Fin n.succ hf:((P' fun i => f (Sum.inl i)) + P!' fun i => f (Sum.inr i)) = S((P fun i => f (Sum.inl i)) + P! fun i => f (Sum.inr i)) = P (f Sum.inl) + P! (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 = P g + P! fX:(PureU1 (2 * n.succ + 1)).Charges := P! f + (S.val (oddShiftSnd j) - S.val (oddShiftFst j)) basis!AsCharges jhf:P! f Submodule.span (Set.range basis!AsCharges)hP:(S.val (oddShiftSnd j) - S.val (oddShiftFst j)) basis!AsCharges j Submodule.span (Set.range basis!AsCharges)hX:X Submodule.span (Set.range basis!AsCharges)f':Fin n.succ hf':P! f' = XS'.val = S.val + (S.val (oddShiftSnd j) - S.val (oddShiftFst j)) basis!AsCharges 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 = P g + P! fX:(PureU1 (2 * n.succ + 1)).Charges := P! f + (S.val (oddShiftSnd j) - S.val (oddShiftFst j)) basis!AsCharges jhf:P! f Submodule.span (Set.range basis!AsCharges)hP:(S.val (oddShiftSnd j) - S.val (oddShiftFst j)) basis!AsCharges j Submodule.span (Set.range basis!AsCharges)hX:X Submodule.span (Set.range basis!AsCharges)f':Fin n.succ hf':P! f' = XhS:S'.val = S.val + (S.val (oddShiftSnd j) - S.val (oddShiftFst j)) basis!AsCharges jS'.val = S.val + (S.val (oddShiftSnd j) - S.val (oddShiftFst j)) basis!AsCharges j All goals completed! 🐙