import Definitions.Def_CohCarrier_Level import Definitions.Def_HeckeModule_IharaRungDatum import Definitions.Def_HeckeModule_IharaDataAt set_option autoImplicit false namespace IharaTower open IharaLemma variable {π’ͺ : Type} [CommRing π’ͺ] structure CornerData (𝕋 : Type) [CommRing 𝕋] [Algebra π’ͺ 𝕋] (V : Type) [AddCommGroup V] [Module π’ͺ V] [Module 𝕋 V] [IsScalarTower π’ͺ 𝕋 V] : Type where split : IdempotentSplitting 𝕋 idx : Fin split.n pairing : LevelPairing (π’ͺ := π’ͺ) (split.CornerRing idx) β†₯(cornerSubmodule (M := V) (split.e idx)) namespace CornerData variable {𝕋 : Type} [CommRing 𝕋] [Algebra π’ͺ 𝕋] variable {V : Type} [AddCommGroup V] [Module π’ͺ V] [Module 𝕋 V] [IsScalarTower π’ͺ 𝕋 V] abbrev cornerRing (cd : CornerData (π’ͺ := π’ͺ) 𝕋 V) : Type := cd.split.CornerRing cd.idx abbrev cornerModule (cd : CornerData (π’ͺ := π’ͺ) 𝕋 V) : Type := β†₯(cornerSubmodule (M := V) (cd.split.e cd.idx)) end CornerData variable {𝕋 : Type} [CommRing 𝕋] [Algebra π’ͺ 𝕋] variable {V : Type} [AddCommGroup V] [Module π’ͺ V] [Module 𝕋 V] [IsScalarTower π’ͺ 𝕋 V] variable {𝕋' : Type} [CommRing 𝕋'] [Algebra π’ͺ 𝕋'] variable {V' : Type} [AddCommGroup V'] [Module π’ͺ V'] [Module 𝕋' V'] [IsScalarTower π’ͺ 𝕋' V'] structure DegeneracyDescent (cd : CornerData (π’ͺ := π’ͺ) 𝕋 V) (cd' : CornerData (π’ͺ := π’ͺ) 𝕋' V') (n : β„•) : Type where iRaw : Fin n β†’ V β†’β‚—[π’ͺ] V' jRaw : Fin n β†’ V' β†’β‚—[π’ͺ] V corner_i : βˆ€ (k : Fin n) (v : V), v ∈ cornerSubmodule (M := V) (cd.split.e cd.idx) β†’ iRaw k v ∈ cornerSubmodule (M := V') (cd'.split.e cd'.idx) corner_j : βˆ€ (k : Fin n) (v' : V'), v' ∈ cornerSubmodule (M := V') (cd'.split.e cd'.idx) β†’ jRaw k v' ∈ cornerSubmodule (M := V) (cd.split.e cd.idx) namespace DegeneracyDescent variable {cd : CornerData (π’ͺ := π’ͺ) 𝕋 V} {cd' : CornerData (π’ͺ := π’ͺ) 𝕋' V'} {n : β„•} noncomputable def iLeg (D : DegeneracyDescent cd cd' n) (k : Fin n) : cd.cornerModule β†’β‚—[π’ͺ] cd'.cornerModule where toFun v := ⟨D.iRaw k v, D.corner_i k v v.2⟩ map_add' := by intro a b; apply Subtype.ext; simp map_smul' := by intro r a; apply Subtype.ext; simp noncomputable def jLeg (D : DegeneracyDescent cd cd' n) (k : Fin n) : cd'.cornerModule β†’β‚—[π’ͺ] cd.cornerModule where toFun v' := ⟨D.jRaw k v', D.corner_j k v' v'.2⟩ map_add' := by intro a b; apply Subtype.ext; simp map_smul' := by intro r a; apply Subtype.ext; simp @[simp] theorem iLeg_apply (D : DegeneracyDescent cd cd' n) (k : Fin n) (v : cd.cornerModule) : (↑(D.iLeg k v) : V') = D.iRaw k ↑v := rfl @[simp] theorem jLeg_apply (D : DegeneracyDescent cd cd' n) (k : Fin n) (v' : cd'.cornerModule) : (↑(D.jLeg k v') : V) = D.jRaw k ↑v' := rfl noncomputable def toLegDatum (D : DegeneracyDescent cd cd' n) (table : Fin n β†’ Fin n β†’ cd.cornerRing) (adjoint_leg : βˆ€ (k : Fin n) (m' : cd'.cornerModule) (m : cd.cornerModule), cd.pairing.B (D.jLeg k m') m = cd'.pairing.B m' (D.iLeg k m)) (htable : βˆ€ (k k' : Fin n) (m : cd.cornerModule), D.jLeg k (D.iLeg k' m) = table k k' β€’ m) : RungAssembly.LegDatum (π’ͺ := π’ͺ) cd.pairing cd'.pairing n := ⟨D.iLeg, D.jLeg, adjoint_leg, table, htable⟩ theorem toLegDatum_iLeg (D : DegeneracyDescent cd cd' n) (table : Fin n β†’ Fin n β†’ cd.cornerRing) (adjoint_leg : βˆ€ (k : Fin n) (m' : cd'.cornerModule) (m : cd.cornerModule), cd.pairing.B (D.jLeg k m') m = cd'.pairing.B m' (D.iLeg k m)) (htable : βˆ€ (k k' : Fin n) (m : cd.cornerModule), D.jLeg k (D.iLeg k' m) = table k k' β€’ m) : (D.toLegDatum table adjoint_leg htable).iLeg = D.iLeg := rfl theorem toLegDatum_jLeg (D : DegeneracyDescent cd cd' n) (table : Fin n β†’ Fin n β†’ cd.cornerRing) (adjoint_leg : βˆ€ (k : Fin n) (m' : cd'.cornerModule) (m : cd.cornerModule), cd.pairing.B (D.jLeg k m') m = cd'.pairing.B m' (D.iLeg k m)) (htable : βˆ€ (k k' : Fin n) (m : cd.cornerModule), D.jLeg k (D.iLeg k' m) = table k k' β€’ m) : (D.toLegDatum table adjoint_leg htable).jLeg = D.jLeg := rfl theorem toLegDatum_table (D : DegeneracyDescent cd cd' n) (table : Fin n β†’ Fin n β†’ cd.cornerRing) (adjoint_leg : βˆ€ (k : Fin n) (m' : cd'.cornerModule) (m : cd.cornerModule), cd.pairing.B (D.jLeg k m') m = cd'.pairing.B m' (D.iLeg k m)) (htable : βˆ€ (k k' : Fin n) (m : cd.cornerModule), D.jLeg k (D.iLeg k' m) = table k k' β€’ m) : (D.toLegDatum table adjoint_leg htable).table = table := rfl end DegeneracyDescent open CohCarrier in abbrev H1CornerData (M : β„•) (H : Subgroup (ZMod M)Λ£) (A : Type) [AddCommGroup A] [Module π’ͺ A] (𝕋 : Type) [CommRing 𝕋] [Algebra π’ͺ 𝕋] [Module 𝕋 (H1 M H A)] [IsScalarTower π’ͺ 𝕋 (H1 M H A)] : Type := CornerData (π’ͺ := π’ͺ) 𝕋 (H1 M H A) end IharaTower