import Definitions.Def_HeckeGalois_EichlerShimura set_option autoImplicit false open MvPolynomial namespace ModularCurve def IsEventuallyEisenstein (๐”ช : Ideal HeckeAlg) : Prop := โˆƒ S : Finset Nat.Primes, โˆ€ โ„“ : Nat.Primes, โ„“ โˆ‰ S โ†’ heckeGen โ„“ - (((โ„“ : โ„•) : HeckeAlg) + 1) โˆˆ ๐”ช section AbelianPart variable {G : Type*} [Group G] {J : Type*} [AddCommGroup J] [Module HeckeAlg J] [DistribMulAction G J] [SMulCommClass G HeckeAlg J] {Jโ‚€ : Type*} [AddCommGroup Jโ‚€] [Module HeckeAlg Jโ‚€] structure IsAbelianPartData (S : Finset Nat.Primes) (I : Subgroup G) (๐’ฏ : Submodule HeckeAlg J) (ฮด : Fin 2 โ†’ J โ†’+ Jโ‚€) : Prop where toric_le_ker : โˆ€ i : Fin 2, โˆ€ x โˆˆ ๐’ฏ, ฮด i x = 0 goodPrime_equivariant : โˆ€ i : Fin 2, โˆ€ โ„“ : Nat.Primes, โ„“ โˆ‰ S โ†’ โˆ€ x : J, ฮด i (heckeGen โ„“ โ€ข x) = heckeGen โ„“ โ€ข ฮด i x component_eisenstein : โˆ€ ๐”ช : Ideal HeckeAlg, ๐”ช.IsMaximal โ†’ ยฌ IsEventuallyEisenstein ๐”ช โ†’ โˆ€ x โˆˆ heckeTorsion J ๐”ช, (โˆ€ ฯƒ โˆˆ I, ฯƒ โ€ข x = x) โ†’ (โˆ€ i : Fin 2, ฮด i x = 0) โ†’ x โˆˆ ๐’ฏ namespace IsAbelianPartData variable {S : Finset Nat.Primes} {I : Subgroup G} {๐’ฏ : Submodule HeckeAlg J} {ฮด : Fin 2 โ†’ J โ†’+ Jโ‚€} theorem mem_toric_or_exists_ne_zero (h : IsAbelianPartData S I ๐’ฏ ฮด) {๐”ช : Ideal HeckeAlg} (hmax : ๐”ช.IsMaximal) (heis : ยฌ IsEventuallyEisenstein ๐”ช) {x : J} (hx : x โˆˆ heckeTorsion J ๐”ช) (hinv : โˆ€ ฯƒ โˆˆ I, ฯƒ โ€ข x = x) : x โˆˆ ๐’ฏ โˆจ โˆƒ i : Fin 2, ฮด i x โ‰  0 := by by_cases hker : โˆ€ i : Fin 2, ฮด i x = 0 ยท exact Or.inl (h.component_eisenstein ๐”ช hmax heis x hx hinv hker) ยท exact Or.inr (not_forall.mp hker) theorem heckeGen_sub_smul_image_eq_zero (h : IsAbelianPartData S I ๐’ฏ ฮด) (i : Fin 2) {โ„“ : Nat.Primes} (hโ„“ : โ„“ โˆ‰ S) (b : โ„ค) {x : J} (hx : (heckeGen โ„“ - C b) โ€ข x = 0) : (heckeGen โ„“ - C b) โ€ข ฮด i x = 0 := by rw [sub_smul] at hx โŠข rw [eq_intCast (MvPolynomial.C : โ„ค โ†’+* HeckeAlg) b] at hx โŠข rw [โ† h.goodPrime_equivariant i โ„“ hโ„“ x, โ† map_intCast_smul (ฮด i) HeckeAlg HeckeAlg b x, โ† map_sub, hx, map_zero] end IsAbelianPartData theorem natCast_smul_addMonoidHom_eq_zero (f : J โ†’+ Jโ‚€) (n : โ„•) {x : J} (hx : (n : HeckeAlg) โ€ข x = 0) : (n : HeckeAlg) โ€ข f x = 0 := by rw [โ† map_natCast_smul f HeckeAlg HeckeAlg n x, hx, map_zero] end AbelianPart def HasLowerLevelTorsion (S : Finset Nat.Primes) (๐”ช : Ideal HeckeAlg) (Jโ‚€ : Type*) [AddCommGroup Jโ‚€] [Module HeckeAlg Jโ‚€] : Prop := โˆƒ y : Jโ‚€, y โ‰  0 โˆง (โˆ€ n : โ„•, (n : HeckeAlg) โˆˆ ๐”ช โ†’ (n : HeckeAlg) โ€ข y = 0) โˆง โˆ€ โ„“ : Nat.Primes, โ„“ โˆ‰ S โ†’ โˆ€ b : โ„ค, heckeGen โ„“ - C b โˆˆ ๐”ช โ†’ (heckeGen โ„“ - C b) โ€ข y = 0 end ModularCurve