import Mathlib import Definitions.Def_WeierstrassCurve_ProjModel import Definitions.Def_ModularCurve_WeierstrassLevelComponents import Definitions.Def_WeierstrassCurve_DrinfeldBasisGlobal import Definitions.Def_WeierstrassCurve_DrinfeldTransportPin import Definitions.Def_WeierstrassCurve_SectionAtOrigin set_option autoImplicit false universe u noncomputable section open AlgebraicGeometry CategoryTheory WeierstrassProjModel attribute [local instance] MvPolynomial.gradedAlgebra namespace WeierstrassCurve.DrinfeldGlobal variable {A : Type u} [CommRing A] abbrev GroupLaws (A : Type u) [CommRing A] : Type (u + 1) := โˆ€ (T : Type u) [CommRing T] [Algebra A T] (W : WeierstrassCurve.Projective T), IsUnit W.ฮ” โ†’ RelativeGroupLaw T (projModelStrCR W) def GroupLaws.IsChordTangent (๐’ข : GroupLaws A) : Prop := โˆ€ (T : Type u) [CommRing T] [Algebra A T] (W : WeierstrassCurve.Projective T) (hฮ” : IsUnit W.ฮ”), โˆƒ ev, IsPointsEval W (๐’ข T W hฮ”) ev def GroupLaws.IsOriginIdentity (๐’ข : GroupLaws A) : Prop := โˆ€ (T : Type u) [CommRing T] [Algebra A T] (W : WeierstrassCurve.Projective T) (hฮ” : IsUnit W.ฮ”), โˆƒ ฯ‡ : OriginChartRing W โ†’+* T, IsOriginChartSection ((๐’ข T W hฮ”).one (๐Ÿ™ _)) ฯ‡ โˆง ฯ‡ (xOverY W) = 0 โˆง ฯ‡ (zOverY W) = 0 def RawDrinfeldPair.IsLevel (๐’ข : GroupLaws A) (q : โ„•) {T : Type u} [CommRing T] [Algebra A T] (W : WeierstrassCurve.Projective T) (x : RawDrinfeldPair T) : Prop := x.curve = W โˆง โˆƒ hฮ” : IsUnit x.curve.ฮ”, IsDrinfeldBasis (๐’ข T x.curve hฮ”) q x.P x.Q structure LevelTransport (A : Type u) [CommRing A] (๐’ข : GroupLaws A) (q : โ„•) where map : {T T' : Type u} โ†’ [CommRing T] โ†’ [Algebra A T] โ†’ [CommRing T'] โ†’ [Algebra A T'] โ†’ (T โ†’โ‚[A] T') โ†’ RawDrinfeldPair T โ†’ RawDrinfeldPair T' act : {T : Type u} โ†’ [CommRing T] โ†’ [Algebra A T] โ†’ WeierstrassCurve.VariableChange T โ†’ RawDrinfeldPair T โ†’ RawDrinfeldPair T map_id : โˆ€ {T : Type u} [CommRing T] [Algebra A T] (x : RawDrinfeldPair T), map (AlgHom.id A T) x = x map_comp : โˆ€ {T T' T'' : Type u} [CommRing T] [Algebra A T] [CommRing T'] [Algebra A T'] [CommRing T''] [Algebra A T''] (f : T โ†’โ‚[A] T') (g : T' โ†’โ‚[A] T'') (x : RawDrinfeldPair T), map (g.comp f) x = map g (map f x) act_one : โˆ€ {T : Type u} [CommRing T] [Algebra A T] (x : RawDrinfeldPair T), act (1 : WeierstrassCurve.VariableChange T) x = x act_mul : โˆ€ {T : Type u} [CommRing T] [Algebra A T] (C C' : WeierstrassCurve.VariableChange T) (x : RawDrinfeldPair T), act (C * C') x = act C (act C' x) map_act : โˆ€ {T T' : Type u} [CommRing T] [Algebra A T] [CommRing T'] [Algebra A T'] (f : T โ†’โ‚[A] T') (C : WeierstrassCurve.VariableChange T) (x : RawDrinfeldPair T), map f (act C x) = act (C.map f.toRingHom) (map f x) isLevel_map : โˆ€ {T T' : Type u} [CommRing T] [Algebra A T] [CommRing T'] [Algebra A T'] (f : T โ†’โ‚[A] T') (W : WeierstrassCurve T) (x : RawDrinfeldPair T), RawDrinfeldPair.IsLevel ๐’ข q W x โ†’ RawDrinfeldPair.IsLevel ๐’ข q (W.map f.toRingHom) (map f x) isLevel_act : โˆ€ {T : Type u} [CommRing T] [Algebra A T] (C : WeierstrassCurve.VariableChange T) (W : WeierstrassCurve T) (x : RawDrinfeldPair T), RawDrinfeldPair.IsLevel ๐’ข q W x โ†’ RawDrinfeldPair.IsLevel ๐’ข q (C โ€ข W) (act C x) def LevelTransport.IsSectionTransport {๐’ข : GroupLaws A} {q : โ„•} (๐’ฏ : LevelTransport A ๐’ข q) : Prop := (โˆ€ (T : Type u) [CommRing T] [Algebra A T] (C : WeierstrassCurve.VariableChange T) (x : RawDrinfeldPair T), โˆƒ hc : (๐’ฏ.act C x).curve = C โ€ข x.curve, โˆ€ (ฯ† : projModelGradingCR x.curve โ†’+*แต projModelGradingCR (C โ€ข x.curve)) (hฯ† : HomogeneousIdeal.irrelevant (projModelGradingCR (C โ€ข x.curve)) โ‰ค (HomogeneousIdeal.irrelevant (projModelGradingCR x.curve)).map ฯ†), IsVariableChangeHom x.curve C ฯ† โ†’ (๐’ฏ.act C x).P.1 โ‰ซ eqToHom (congrArg projModelCR hc) โ‰ซ Proj.map ฯ† hฯ† = x.P.1 โˆง (๐’ฏ.act C x).Q.1 โ‰ซ eqToHom (congrArg projModelCR hc) โ‰ซ Proj.map ฯ† hฯ† = x.Q.1) โˆง (โˆ€ (T T' : Type u) [CommRing T] [Algebra A T] [CommRing T'] [Algebra A T'] (f : T โ†’โ‚[A] T') (x : RawDrinfeldPair T), โˆƒ hc : (๐’ฏ.map f x).curve = x.curve.map f.toRingHom, โˆ€ (ฯ† : projModelGradingCR x.curve โ†’+*แต projModelGradingCR (x.curve.map f.toRingHom)) (hฯ† : HomogeneousIdeal.irrelevant (projModelGradingCR (x.curve.map f.toRingHom)) โ‰ค (HomogeneousIdeal.irrelevant (projModelGradingCR x.curve)).map ฯ†), IsCoefficientHom x.curve f.toRingHom ฯ† โ†’ (๐’ฏ.map f x).P.1 โ‰ซ eqToHom (congrArg projModelCR hc) โ‰ซ Proj.map ฯ† hฯ† = Spec.map (CommRingCat.ofHom f.toRingHom) โ‰ซ x.P.1 โˆง (๐’ฏ.map f x).Q.1 โ‰ซ eqToHom (congrArg projModelCR hc) โ‰ซ Proj.map ฯ† hฯ† = Spec.map (CommRingCat.ofHom f.toRingHom) โ‰ซ x.Q.1) def levelComponent (A : Type u) [CommRing A] (๐’ข : GroupLaws A) (q : โ„•) (๐’ฏ : LevelTransport A ๐’ข q) : ModularCurve.LevelComponent A where obj T _ _ := RawDrinfeldPair T IsLevel W x := RawDrinfeldPair.IsLevel ๐’ข q W x map f x := ๐’ฏ.map f x act C x := ๐’ฏ.act C x map_id x := ๐’ฏ.map_id x map_comp f g x := ๐’ฏ.map_comp f g x act_one x := ๐’ฏ.act_one x act_mul C C' x := ๐’ฏ.act_mul C C' x map_act f C x := ๐’ฏ.map_act f C x isLevel_map f W x h := ๐’ฏ.isLevel_map f W x h isLevel_act C W x h := ๐’ฏ.isLevel_act C W x h def rigidData (A : Type u) [CommRing A] (โ„“ N q : โ„•) (hโ„“ : โˆ€ (T : Type u) [CommRing T] [Algebra A T] (W : WeierstrassCurve T) (C : WeierstrassCurve.VariableChange T) (D : ModularCurve.LevelPData T), ModularCurve.IsLevelPStructure W โ„“ D โ†’ ModularCurve.IsLevelPStructure (C โ€ข W) โ„“ (D.variableChange C)) (hN : โˆ€ (T : Type u) [CommRing T] [Algebra A T] (W : WeierstrassCurve T) (C : WeierstrassCurve.VariableChange T) (h : Polynomial T), W.IsCyclicKernel N h โ†’ (C โ€ข W).IsCyclicKernel N (ModularCurve.kernelVariableChangeDeg C ((N - 1) / 2) h)) (๐’ข : GroupLaws A) (๐’ฏ : LevelTransport A ๐’ข q) : ModularCurve.RigidWeierstrassData.{u} A := ModularCurve.weierstrassLevelRigidData A โ„“ N hโ„“ hN (levelComponent A ๐’ข q ๐’ฏ) end WeierstrassCurve.DrinfeldGlobal end