import Mathlib import Definitions.Def_LatticeTreeOrbital import Definitions.Def_CerednikDrinfeld_BruhatTitsTree import Definitions.Def_CerednikDrinfeld_FormalUpperHalfPlaneCharts set_option autoImplicit false open scoped TensorProduct open LT.LatticeTree namespace CerednikDrinfeld namespace FormalOmega section Datum variable (π’ͺ : Type) [CommRing π’ͺ] (K : Type) [Field K] [Algebra π’ͺ K] (Ο€ : π’ͺ) abbrev latticeBaseChange (B : Type) [CommRing B] [Algebra π’ͺ B] (M : FullLattice π’ͺ K) : Type := B βŠ—[π’ͺ] β†₯M.1 variable {π’ͺ K} noncomputable def inclBaseChange (B : Type) [CommRing B] [Algebra π’ͺ B] {M' M : FullLattice π’ͺ K} (h : M'.1 ≀ M.1) : latticeBaseChange π’ͺ K B M' β†’β‚—[B] latticeBaseChange π’ͺ K B M := (Submodule.inclusion h).baseChange B theorem mulVecLinR_injective (g : Matrix.GeneralLinearGroup (Fin 2) K) : Function.Injective (mulVecLinR (R := π’ͺ) g) := by intro v w hvw have h := congrArg (fun x => Matrix.mulVec ((g⁻¹ : Matrix.GeneralLinearGroup (Fin 2) K) : Matrix (Fin 2) (Fin 2) K) x) hvw simpa only [mulVecLinR_apply, Matrix.mulVec_mulVec, ← Units.val_mul, inv_mul_cancel, Units.val_one, Matrix.one_mulVec] using h noncomputable def latticeMapEquiv (g : Matrix.GeneralLinearGroup (Fin 2) K) (M : Submodule π’ͺ (Fin 2 β†’ K)) : β†₯M ≃ₗ[π’ͺ] β†₯(latticeMap g M) := Submodule.equivMapOfInjective (mulVecLinR (R := π’ͺ) g) (mulVecLinR_injective g) M def FullLattice.act (g : Matrix.GeneralLinearGroup (Fin 2) K) (M : FullLattice π’ͺ K) : FullLattice π’ͺ K := ⟨latticeMap g M.1, M.2.map g⟩ noncomputable def actBaseChange (B : Type) [CommRing B] [Algebra π’ͺ B] (g : Matrix.GeneralLinearGroup (Fin 2) K) (M : FullLattice π’ͺ K) : latticeBaseChange π’ͺ K B M ≃ₗ[B] latticeBaseChange π’ͺ K B (FullLattice.act g M) := (latticeMapEquiv g M.1).baseChange π’ͺ B _ _ structure DeligneDatum (B : Type) [CommRing B] [Algebra π’ͺ B] : Type where line : βˆ€ M : FullLattice π’ͺ K, Submodule B (latticeBaseChange π’ͺ K B M) invertible : βˆ€ M : FullLattice π’ͺ K, Module.Invertible B (latticeBaseChange π’ͺ K B M β§Έ line M) mono : βˆ€ {M' M : FullLattice π’ͺ K} (h : M'.1 ≀ M.1), (line M').map (inclBaseChange B h) ≀ line M homothety : βˆ€ (c : KΛ£) (M : FullLattice π’ͺ K), line (FullLattice.act (scalarGL c) M) = (line M).map (actBaseChange B (scalarGL c) M).toLinearMap nondeg : βˆ€ (𝔭 : Ideal B), 𝔭.IsPrime β†’ βˆƒ (M' M : FullLattice π’ͺ K) (_ : M'.1 ≀ M.1), (βˆ€ v : β†₯M.1, (algebraMap π’ͺ K Ο€) β€’ (v : Fin 2 β†’ K) ∈ M'.1) ∧ (βˆ€ v : β†₯M.1, (v : Fin 2 β†’ K) βˆ‰ M'.1 β†’ (1 : B) βŠ—β‚œ[π’ͺ] v βˆ‰ line M βŠ” (𝔭 β€’ ⊀ : Submodule B (latticeBaseChange π’ͺ K B M))) ∧ (βˆ€ v' : β†₯M'.1, (Β¬ βˆƒ w : β†₯M.1, (v' : Fin 2 β†’ K) = (algebraMap π’ͺ K Ο€) β€’ (w : Fin 2 β†’ K)) β†’ (1 : B) βŠ—β‚œ[π’ͺ] v' βˆ‰ line M' βŠ” (𝔭 β€’ ⊀ : Submodule B (latticeBaseChange π’ͺ K B M'))) namespace DeligneDatum variable {Ο€} variable {B : Type} [CommRing B] [Algebra π’ͺ B] theorem ext' {d d' : DeligneDatum (K := K) Ο€ B} (h : d.line = d'.line) : d = d' := by cases d; cases d'; cases h; rfl end DeligneDatum abbrev OmegaObj (B : Type) [CommRing B] [Algebra π’ͺ B] : Type := DeligneDatum (K := K) Ο€ B variable (B : Type) [CommRing B] [Algebra π’ͺ B] def DeligneDatum.IsPullback (g : Matrix.GeneralLinearGroup (Fin 2) K) (d d' : DeligneDatum (K := K) Ο€ B) : Prop := βˆ€ M : FullLattice π’ͺ K, d'.line M = (d.line (FullLattice.act g M)).comap (actBaseChange B g M).toLinearMap variable {B} noncomputable def lineBaseChange {B' : Type} [CommRing B'] [Algebra π’ͺ B'] (f : B →ₐ[π’ͺ] B') (M : FullLattice π’ͺ K) (N : Submodule B (latticeBaseChange π’ͺ K B M)) : Submodule B' (latticeBaseChange π’ͺ K B' M) := Submodule.span B' ((LinearMap.rTensor (β†₯M.1) f.toLinearMap) '' (N : Set (latticeBaseChange π’ͺ K B M))) def DeligneDatum.IsBaseChange {B' : Type} [CommRing B'] [Algebra π’ͺ B'] (f : B →ₐ[π’ͺ] B') (d : DeligneDatum (K := K) Ο€ B) (d' : DeligneDatum (K := K) Ο€ B') : Prop := βˆ€ M : FullLattice π’ͺ K, d'.line M = lineBaseChange f M (d.line M) end Datum section OmegaNr variable {π’ͺ : Type} [CommRing π’ͺ] {K : Type} [Field K] [Algebra π’ͺ K] (Ο€ : π’ͺ) variable (Onr : Type) [CommRing Onr] [Algebra π’ͺ Onr] (Fr : Onr ≃ₐ[π’ͺ] Onr) variable (vdet : Matrix.GeneralLinearGroup (Fin 2) K β†’* Multiplicative β„€) abbrev OmegaNrObj (B : Type) [CommRing B] [Algebra π’ͺ B] : Type := (Onr →ₐ[π’ͺ] B) Γ— OmegaObj (K := K) Ο€ B noncomputable def frobTwist (n : β„€) {B : Type} [CommRing B] [Algebra π’ͺ B] (ψ : Onr →ₐ[π’ͺ] B) : Onr →ₐ[π’ͺ] B := ψ.comp ((Fr ^ n : Onr ≃ₐ[π’ͺ] Onr) : Onr →ₐ[π’ͺ] Onr) def OmegaNr.IsTwistedAct (B : Type) [CommRing B] [Algebra π’ͺ B] (g : Matrix.GeneralLinearGroup (Fin 2) K) (x x' : OmegaNrObj (K := K) Ο€ Onr B) : Prop := x'.1 = frobTwist Onr Fr (- Multiplicative.toAdd (vdet g)) x.1 ∧ DeligneDatum.IsPullback (K := K) (Ο€ := Ο€) B g⁻¹ x.2 x'.2 end OmegaNr end FormalOmega end CerednikDrinfeld