Imports
/-
Copyright (c) 2026 Andrea Pari. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrea Pari
-/
module
public import Physlib.Relativity.Tensors.Contraction.CrossToEndResult-to-slot contraction against a rank-2 tensor
i. Overview
crossToEnd deposits the surviving index of a slot contraction at the end of the survivor list.
Raising and lowering a named index instead wants the replacement to stay in place: contracting
slot i of t against a rank-2 tensor M (a metric, the unit tensor) should return t with only
slot i's color changed, T^{μ}{}_{νρ} ↦ T_{μνρ}. crossToSlot i j hc M is that operation, and
crossToSlot_eq_crossToEnd is the one place the two conventions meet.
This module stays at the CommRing altitude of crossToEnd; the RCLike round trips built on the
operation live with the unit-tensor collapse theory in
Physlib.Relativity.Tensors.Contraction.UnitTensorContraction.
ii. Key results
TensorSpecies.Tensor.crossToSlot : contract slot i against slot j of a rank-2 tensor and
rotate the survivor back into position i; raising and lowering a named index.
TensorSpecies.Tensor.crossToSlot_eq_crossToEnd : the bridge to the result-to-end convention.
TensorSpecies.Tensor.crossToSlotInv : the returning half of a round trip, the contraction
against the second factor with the round trip's color cast absorbed.
TensorSpecies.Tensor.crossToSlot_permT_right_id : an identity reindexing of the rank-2 tensor
passes through the contraction.
TensorSpecies.Tensor.crossToSlot_equivariant : the contraction commutes with the G-action.
iii. Table of contents
A. The result-to-slot contraction
iv. References
@[expose] public sectionA. The result-to-slot contraction
The survivor color of crossToEnd i j against a rank-2 tensor of color cM is c with
slot i replaced by the surviving color cM (j.succAbove 0), once the survivors are rotated
back by the inverse of the cycle [i, last].
refine_2 C:TypenA:ℕc:Fin (nA + 1) → CcM:Fin 2 → Ci:Fin (nA + 1)j:Fin 2z:Fin (nA + 1)a:Fin 1⊢ cM (j.succAbove a) = cM (j.succAbove 0)
fin_cases a refine_2.«0» C:TypenA:ℕc:Fin (nA + 1) → CcM:Fin 2 → Ci:Fin (nA + 1)j:Fin 2z:Fin (nA + 1)⊢ cM (j.succAbove ((fun i => i) ⟨0, ⋯⟩)) = cM (j.succAbove 0)
rfl All goals completed! 🐙
The bridge between the two conventions: crossToSlot i j hc M t is crossToEnd i j hc t M
with the survivor rotated from the last slot back to slot i by the inverse cycle.
lemma crossToSlot_eq_crossToEnd {nA : ℕ} {c : Fin (nA + 1) → C} {cM : Fin 2 → C}
(i : Fin (nA + 1)) (j : Fin 2) (hc : S.τ (c i) = cM j) (M : S.Tensor cM) (t : S.Tensor c) :
crossToSlot i j hc M t =
permT ⇑(Fin.cycleIcc i (Fin.last nA)).symm (IsReindexing.crossToSlot_cycle i j)
(crossToEnd i j hc t M) := rfl
An identity reindexing of the rank-2 tensor becomes the corresponding identity reindexing of
the contracted output: the crossToSlot-level case of crossToEnd_permT_right where the rank-2
tensor's colors are only propositionally recast.
lemma crossToSlot_permT_right_id {nA : ℕ} {c : Fin (nA + 1) → C} {cM cM' : Fin 2 → C}
(i : Fin (nA + 1)) (j : Fin 2) (hc : S.τ (c i) = cM' j)
(M : Tensor S cM) (hM : IsReindexing cM cM' (id : Fin 2 → Fin 2)) (t : Tensor S c) :
crossToSlot i j hc (permT (id : Fin 2 → Fin 2) hM M) t =
permT (id : Fin (nA + 1) → Fin (nA + 1))
(IsReindexing.on_id.mpr (fun a => by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor ca:Fin (nA + 1)⊢ Function.update c i (cM (j.succAbove 0)) a = Function.update c i (cM' (j.succAbove 0)) a
by_cases ha : a = i pos k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor ca:Fin (nA + 1)ha:a = i⊢ Function.update c i (cM (j.succAbove 0)) a = Function.update c i (cM' (j.succAbove 0)) aneg k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor ca:Fin (nA + 1)ha:¬a = i⊢ Function.update c i (cM (j.succAbove 0)) a = Function.update c i (cM' (j.succAbove 0)) a
· pos k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor ca:Fin (nA + 1)ha:a = i⊢ Function.update c i (cM (j.succAbove 0)) a = Function.update c i (cM' (j.succAbove 0)) a subst ha pos k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Cj:Fin 2M:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor ca:Fin (nA + 1)hc:S.τ (c a) = cM' j⊢ Function.update c a (cM (j.succAbove 0)) a = Function.update c a (cM' (j.succAbove 0)) a
simpa using hM.2 (j.succAbove 0) All goals completed! 🐙
· neg k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor ca:Fin (nA + 1)ha:¬a = i⊢ Function.update c i (cM (j.succAbove 0)) a = Function.update c i (cM' (j.succAbove 0)) a simp [Function.update_of_ne ha] All goals completed! 🐙))
(crossToSlot i j (hc.trans (hM.2 j).symm) M t) := by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ (crossToSlot i j hc ((permT id hM) M)) t = (permT id ⋯) ((crossToSlot i j ⋯ M) t)
rw [crossToSlot_eq_crossToEnd, k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j hc) t) ((permT id hM) M)) =
(permT id ⋯) ((crossToSlot i j ⋯ M) t) k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j hc) t) ((permT id hM) M)) =
(permT id ⋯) ((permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j ⋯) t) M)) crossToSlot_eq_crossToEnd k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j hc) t) ((permT id hM) M)) =
(permT id ⋯) ((permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j ⋯) t) M)) k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j hc) t) ((permT id hM) M)) =
(permT id ⋯) ((permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j ⋯) t) M))] k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j hc) t) ((permT id hM) M)) =
(permT id ⋯) ((permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j ⋯) t) M))
rw [crossToEnd_permT_right i j
(id : Fin 2 → Fin 2) id hM (by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ (id j).succAbove ∘ id = id ∘ j.succAbove k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯)
((permT (Fin.append (Fin.castAdd 1) (Fin.natAdd nA ∘ id)) ⋯) (((crossToEnd i (id j) ⋯) t) M)) =
(permT id ⋯) ((permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j ⋯) t) M)) rfl All goals completed! 🐙 k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯)
((permT (Fin.append (Fin.castAdd 1) (Fin.natAdd nA ∘ id)) ⋯) (((crossToEnd i (id j) ⋯) t) M)) =
(permT id ⋯) ((permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j ⋯) t) M)))] k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯)
((permT (Fin.append (Fin.castAdd 1) (Fin.natAdd nA ∘ id)) ⋯) (((crossToEnd i (id j) ⋯) t) M)) =
(permT id ⋯) ((permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j ⋯) t) M))
simp only [permT_permT] k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ (permT (Fin.append (Fin.castAdd 1) (Fin.natAdd nA ∘ id) ∘ ⇑(Equiv.symm (i.cycleIcc (Fin.last nA)))) ⋯)
(((crossToEnd i (id j) ⋯) t) M) =
(permT (⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ∘ id) ⋯) (((crossToEnd i j ⋯) t) M)
apply permT_congr hmap k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ Fin.append (Fin.castAdd 1) (Fin.natAdd nA ∘ id) ∘ ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) =
⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ∘ idhtensor k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ ((crossToEnd i (id j) ⋯) t) M = ((crossToEnd i j ⋯) t) M
· hmap k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ Fin.append (Fin.castAdd 1) (Fin.natAdd nA ∘ id) ∘ ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) =
⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ∘ id funext x hmap k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor cx:Fin (nA + 1)⊢ (Fin.append (Fin.castAdd 1) (Fin.natAdd nA ∘ id) ∘ ⇑(Equiv.symm (i.cycleIcc (Fin.last nA)))) x =
(⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ∘ id) x
simpa only [Function.comp_apply, Function.comp_id, id_eq] using
congrFun Fin.append_castAdd_natAdd_eq_id ((Fin.cycleIcc i (Fin.last nA)).symm x) All goals completed! 🐙
· htensor k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → CcM':Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM' jM:S.Tensor cMhM:IsReindexing cM cM' idt:S.Tensor c⊢ ((crossToEnd i (id j) ⋯) t) M = ((crossToEnd i j ⋯) t) M rfl All goals completed! 🐙
Cross contraction into a slot is G-equivariant, both constituents (crossToEnd, permT)
being so.
@[simp]
lemma crossToSlot_equivariant {nA : ℕ} {c : Fin (nA + 1) → C} {cM : Fin 2 → C}
(i : Fin (nA + 1)) (j : Fin 2) (hc : S.τ (c i) = cM j) (g : G)
(M : Tensor S cM) (t : Tensor S c) :
crossToSlot i j hc (g • M) (g • t) = g • crossToSlot i j hc M t := by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM jg:GM:S.Tensor cMt:S.Tensor c⊢ (crossToSlot i j hc (g • M)) (g • t) = g • (crossToSlot i j hc M) t
rw [crossToSlot_eq_crossToEnd, k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM jg:GM:S.Tensor cMt:S.Tensor c⊢ (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j hc) (g • t)) (g • M)) =
g • (crossToSlot i j hc M) t All goals completed! 🐙 crossToSlot_eq_crossToEnd, k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM jg:GM:S.Tensor cMt:S.Tensor c⊢ (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j hc) (g • t)) (g • M)) =
g • (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j hc) t) M) All goals completed! 🐙 crossToEnd_equivariant, k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM jg:GM:S.Tensor cMt:S.Tensor c⊢ (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (g • ((crossToEnd i j hc) t) M) =
g • (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j hc) t) M) All goals completed! 🐙
permT_equivariant k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Module.Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bnA:ℕc:Fin (nA + 1) → CcM:Fin 2 → Ci:Fin (nA + 1)j:Fin 2hc:S.τ (c i) = cM jg:GM:S.Tensor cMt:S.Tensor c⊢ g • (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j hc) t) M) =
g • (permT ⇑(Equiv.symm (i.cycleIcc (Fin.last nA))) ⋯) (((crossToEnd i j hc) t) M) All goals completed! 🐙] All goals completed! 🐙