Definitions/Def_ModularCurve_CharPReduction.lean
Coefficientwise reduction of Laurent-series models of modular function fields
Over a commutative ring L with a subring A, integralCoeffs A is the subring of L((q)) (Mathlib's LaurentSeries, i.e. Hahn series indexed by \mathbb{Z}) consisting of the series all of whose coefficients lie in A; for a ring homomorphism \mathrm{red} : A \to k, coeffRed A red is the ring homomorphism \mathrm{integralCoeffs}\,A \to k((q)) applying \mathrm{red} to each coefficient. With k a field and R a subring of L((q)) contained in integralCoeffs A, redRes is the restriction of this reduction to R, redKer its kernel — a prime ideal \mathfrak{p} of R, since k((q)) is a field, and one not containing 1 — and localizedAtKer is the subring of L((q)) of those f for which f\cdot s \in R for some s \in R \setminus \mathfrak{p}; it contains R. This is an explicit subring of fractions inside L((q)), a presentation of R_{\mathfrak{p}} rather than an abstract localisation. On it, redLoc sends f to \mathrm{redRes}(r)\cdot \mathrm{redRes}(s)^{-1} for chosen witnesses f s = r; redLoc_spec shows that \mathrm{redLoc}(f)\cdot\mathrm{redRes}(s) = \mathrm{redRes}(r) for every pair r, s \in R with f s = r, and redLocHom packages redLoc as a ring homomorphism extending redRes.
The modular instance takes R to be modularRing N A, the subring of L((q)) generated by the constant series \mathrm{constSeries}\,A coming from A together with the two q-expansions jqModC L (that of j, with integral coefficients, q^{-1} + \dots) and jqNModC L N (its substitution q \mapsto q^N); all three lie in integralCoeffs A, whence modularRing_le_integralCoeffs. Then modularLocalized N A red is the corresponding fraction subring and modularRedLocHom N A red its reduction homomorphism to k((q)).
Relation to Mathlib
Mathlib supplies LaurentSeries and Subring.closure; the subring of series with coefficients in a given subring, the coefficientwise reduction maps, and the fraction subring localizedAtKer are the project's own. In particular localizedAtKer is a concrete subring of L((q)), not Mathlib's Localization.AtPrime, and no IsLocalization property is asserted for it.
Where it is used
These definitions model the function field of X_0(N) by the subfield of L((q)) generated by the q-expansions of j and of j(q^N), and provide its reduction modulo a prime of the coefficient ring: given A \subseteq L and \mathrm{red} : A \to k, the map modularRedLocHom reduces those modular functions that are integral at the prime cut out by \mathrm{red}. They are the basis for the project's treatment of the reduction of modular curves in characteristic p.
References
- G. Shimura, Introduction to the Arithmetic Theory of Automorphic Functions, Publications of the Mathematical Society of Japan 11, Princeton University Press, 1971
- J.-I. Igusa, Kroneckerian model of fields of elliptic modular functions, American Journal of Mathematics 81 (1959), 561–577
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 322 lines
- 34 declarations
- used in the statements of 83 theorems and imported by 120 proofs
- imports 2 definition modules
Source file: Definitions/Def_ModularCurve_CharPReduction.lean
Declarations
- def
ModularCurve.CharPReduction.integralCoeffs - theorem
ModularCurve.CharPReduction.mem_integralCoeffs - def
ModularCurve.CharPReduction.packCoeffs - theorem
ModularCurve.CharPReduction.coeffMap_subtype_packCoeffs - theorem
ModularCurve.CharPReduction.coeffMap_subtype_injective - def
ModularCurve.CharPReduction.packCoeffsHom - def
ModularCurve.CharPReduction.coeffRed - theorem
ModularCurve.CharPReduction.coeffRed_coeff - def
ModularCurve.CharPReduction.redRes - theorem
ModularCurve.CharPReduction.redRes_apply - def
ModularCurve.CharPReduction.redKer - theorem
ModularCurve.CharPReduction.redKer_isPrime - theorem
ModularCurve.CharPReduction.notMem_redKer_iff - theorem
ModularCurve.CharPReduction.one_notMem_redKer - def
ModularCurve.CharPReduction.localizedAtKer - theorem
ModularCurve.CharPReduction.mem_localizedAtKer - theorem
ModularCurve.CharPReduction.subring_le_localizedAtKer - def
ModularCurve.CharPReduction.redLoc - theorem
ModularCurve.CharPReduction.redRes_ne_zero_of_notMem - theorem
ModularCurve.CharPReduction.redLoc_spec - theorem
ModularCurve.CharPReduction.redLoc_coe - def
ModularCurve.CharPReduction.redLocHom - theorem
ModularCurve.CharPReduction.redLocHom_apply - def
ModularCurve.CharPReduction.constSeries - def
ModularCurve.CharPReduction.modularRing - theorem
ModularCurve.CharPReduction.jqModC_mem_modularRing - theorem
ModularCurve.CharPReduction.jqNModC_mem_modularRing - theorem
ModularCurve.CharPReduction.constSeries_mem_modularRing - theorem
ModularCurve.CharPReduction.jqModC_mem_integralCoeffs - theorem
ModularCurve.CharPReduction.jqNModC_mem_integralCoeffs - theorem
ModularCurve.CharPReduction.constSeries_mem_integralCoeffs - theorem
ModularCurve.CharPReduction.modularRing_le_integralCoeffs - def
ModularCurve.CharPReduction.modularLocalized - def
ModularCurve.CharPReduction.modularRedLocHom
Source
import Definitions.Def_ModularCurve_LaurentCoeff import Definitions.Def_ModularCurve_JqCoeff set_option autoImplicit false noncomputable section namespace ModularCurve namespace CharPReduction section IntegralCoeffs variable {L : Type*} [CommRing L] (A : Subring L) def integralCoeffs : Subring (LaurentSeries L) where carrier := {x | ∀ n : ℤ, x.coeff n ∈ A} zero_mem' := fun n => by simp one_mem' := fun n => by rw [HahnSeries.coeff_one] split_ifs · exact A.one_mem · exact A.zero_mem add_mem' := fun hx hy n => by rw [HahnSeries.coeff_add] exact A.add_mem (hx n) (hy n) neg_mem' := fun hx n => by rw [HahnSeries.coeff_neg] exact A.neg_mem (hx n) mul_mem' := fun hx hy n => by rw [HahnSeries.coeff_mul] exact A.sum_mem fun ij _ => A.mul_mem (hx ij.1) (hy ij.2) theorem mem_integralCoeffs {x : LaurentSeries L} : x ∈ integralCoeffs A ↔ ∀ n : ℤ, x.coeff n ∈ A := Iff.rfl private def packCoeffs (x : integralCoeffs A) : LaurentSeries A where coeff n := ⟨(x : LaurentSeries L).coeff n, x.2 n⟩ isPWO_support' := (x : LaurentSeries L).isPWO_support.mono (fun _ hn h => hn (Subtype.ext h)) private theorem coeffMap_subtype_packCoeffs (x : integralCoeffs A) : coeffMap A.subtype (packCoeffs A x) = (x : LaurentSeries L) := by ext n rfl private theorem coeffMap_subtype_injective : Function.Injective (coeffMap A.subtype : LaurentSeries A →+* LaurentSeries L) := by intro x y h ext n exact congrArg (fun z : LaurentSeries L => z.coeff n) h private def packCoeffsHom : integralCoeffs A →+* LaurentSeries A where toFun := packCoeffs A map_one' := coeffMap_subtype_injective A <| by rw [coeffMap_subtype_packCoeffs, map_one, OneMemClass.coe_one] map_mul' x y := coeffMap_subtype_injective A <| by rw [map_mul, coeffMap_subtype_packCoeffs, coeffMap_subtype_packCoeffs, coeffMap_subtype_packCoeffs, MulMemClass.coe_mul] map_zero' := coeffMap_subtype_injective A <| by rw [coeffMap_subtype_packCoeffs, map_zero, ZeroMemClass.coe_zero] map_add' x y := coeffMap_subtype_injective A <| by rw [map_add, coeffMap_subtype_packCoeffs, coeffMap_subtype_packCoeffs, coeffMap_subtype_packCoeffs, AddMemClass.coe_add] variable {k : Type*} [CommRing k] (red : A →+* k) def coeffRed : integralCoeffs A →+* LaurentSeries k := (coeffMap red).comp (packCoeffsHom A) @[simp] theorem coeffRed_coeff (x : integralCoeffs A) (n : ℤ) : (coeffRed A red x).coeff n = red ⟨(x : LaurentSeries L).coeff n, x.2 n⟩ := rfl end IntegralCoeffs section Reduction variable {L : Type*} [CommRing L] {k : Type*} [Field k] variable (A : Subring L) (red : A →+* k) variable (R : Subring (LaurentSeries L)) (hR : R ≤ integralCoeffs A) def redRes : R →+* LaurentSeries k := (coeffRed A red).comp (Subring.inclusion hR) theorem redRes_apply (r : R) : redRes A red R hR r = coeffRed A red ⟨(r : LaurentSeries L), hR r.2⟩ := rfl def redKer : Ideal R := RingHom.ker (redRes A red R hR) theorem redKer_isPrime : (redKer A red R hR).IsPrime := RingHom.ker_isPrime _ theorem notMem_redKer_iff {s : R} : s ∉ redKer A red R hR ↔ redRes A red R hR s ≠ 0 := by rw [redKer, not_iff_not, RingHom.mem_ker] theorem one_notMem_redKer : (1 : R) ∉ redKer A red R hR := by rw [notMem_redKer_iff, map_one] exact one_ne_zero def localizedAtKer : Subring (LaurentSeries L) where carrier := {f | ∃ r s : R, s ∉ redKer A red R hR ∧ f * s = r} zero_mem' := ⟨0, 1, one_notMem_redKer A red R hR, by simp⟩ one_mem' := ⟨1, 1, one_notMem_redKer A red R hR, by simp⟩ add_mem' := by rintro f g ⟨r, s, hs, hf⟩ ⟨u, t, ht, hg⟩ refine ⟨r * t + u * s, s * t, fun hmem => (((redKer_isPrime A red R hR).mem_or_mem hmem).elim hs ht), ?_⟩ push_cast calc (f + g) * ((s : LaurentSeries L) * t) = f * s * t + g * t * s := by ring _ = (r : LaurentSeries L) * t + u * s := by rw [hf, hg] neg_mem' := by rintro f ⟨r, s, hs, hf⟩ exact ⟨-r, s, hs, by push_cast; rw [neg_mul, hf]⟩ mul_mem' := by rintro f g ⟨r, s, hs, hf⟩ ⟨u, t, ht, hg⟩ refine ⟨r * u, s * t, fun hmem => (((redKer_isPrime A red R hR).mem_or_mem hmem).elim hs ht), ?_⟩ push_cast calc f * g * ((s : LaurentSeries L) * t) = (f * s) * (g * t) := by ring _ = (r : LaurentSeries L) * u := by rw [hf, hg] theorem mem_localizedAtKer {f : LaurentSeries L} : f ∈ localizedAtKer A red R hR ↔ ∃ r s : R, s ∉ redKer A red R hR ∧ f * s = r := Iff.rfl theorem subring_le_localizedAtKer : R ≤ localizedAtKer A red R hR := fun r hr => ⟨⟨r, hr⟩, 1, one_notMem_redKer A red R hR, by simp⟩ end Reduction section LocalizedReduction variable {L : Type*} [CommRing L] {k : Type*} [Field k] variable {A : Subring L} {red : A →+* k} variable {R : Subring (LaurentSeries L)} {hR : R ≤ integralCoeffs A} open Classical in def redLoc (f : localizedAtKer A red R hR) : LaurentSeries k := redRes A red R hR (Classical.choose f.2) * (redRes A red R hR (Classical.choose (Classical.choose_spec f.2)))⁻¹ theorem redRes_ne_zero_of_notMem {s : R} (hs : s ∉ redKer A red R hR) : redRes A red R hR s ≠ 0 := (notMem_redKer_iff A red R hR).mp hs theorem redLoc_spec (f : localizedAtKer A red R hR) {r s : R} (hfs : (f : LaurentSeries L) * s = r) : redLoc f * redRes A red R hR s = redRes A red R hR r := by obtain ⟨hs₀, hfs₀⟩ := Classical.choose_spec (Classical.choose_spec f.2) have hs₀ne : redRes A red R hR (Classical.choose (Classical.choose_spec f.2)) ≠ 0 := redRes_ne_zero_of_notMem (A := A) (red := red) (R := R) (hR := hR) hs₀ have hcross : Classical.choose f.2 * s = r * Classical.choose (Classical.choose_spec f.2) := by have h : ((Classical.choose f.2 : R) : LaurentSeries L) * (s : LaurentSeries L) = (r : LaurentSeries L) * ((Classical.choose (Classical.choose_spec f.2) : R) : LaurentSeries L) := by linear_combination ((Classical.choose (Classical.choose_spec f.2) : R) : LaurentSeries L) * hfs - (s : LaurentSeries L) * hfs₀ exact_mod_cast h have hred := congrArg (redRes A red R hR) hcross rw [map_mul, map_mul] at hred apply mul_right_cancel₀ hs₀ne calc redLoc f * redRes A red R hR s * redRes A red R hR (Classical.choose (Classical.choose_spec f.2)) = redRes A red R hR (Classical.choose f.2) * redRes A red R hR s * ((redRes A red R hR (Classical.choose (Classical.choose_spec f.2)))⁻¹ * redRes A red R hR (Classical.choose (Classical.choose_spec f.2))) := by rw [redLoc]; ring _ = redRes A red R hR (Classical.choose f.2) * redRes A red R hR s := by rw [inv_mul_cancel₀ hs₀ne, mul_one] _ = redRes A red R hR r * redRes A red R hR (Classical.choose (Classical.choose_spec f.2)) := hred theorem redLoc_coe (r : R) : redLoc ⟨(r : LaurentSeries L), subring_le_localizedAtKer A red R hR r.2⟩ = redRes A red R hR r := by have h := redLoc_spec (A := A) (red := red) (R := R) (hR := hR) ⟨(r : LaurentSeries L), subring_le_localizedAtKer A red R hR r.2⟩ (r := r) (s := 1) (by simp) rwa [map_one, mul_one] at h def redLocHom : localizedAtKer A red R hR →+* LaurentSeries k where toFun := redLoc map_one' := by have h := redLoc_spec (A := A) (red := red) (R := R) (hR := hR) (1 : localizedAtKer A red R hR) (r := 1) (s := 1) (by simp) rwa [map_one, mul_one] at h map_mul' f g := by obtain ⟨r, s, hs, hf⟩ := f.2 obtain ⟨u, t, ht, hg⟩ := g.2 have hsne := redRes_ne_zero_of_notMem (A := A) (red := red) (R := R) (hR := hR) hs have htne := redRes_ne_zero_of_notMem (A := A) (red := red) (R := R) (hR := hR) ht have hfg : ((f * g : localizedAtKer A red R hR) : LaurentSeries L) * ((s * t : R) : LaurentSeries L) = ((r * u : R) : LaurentSeries L) := by push_cast calc (f : LaurentSeries L) * g * ((s : LaurentSeries L) * t) = ((f : LaurentSeries L) * s) * ((g : LaurentSeries L) * t) := by ring _ = (r : LaurentSeries L) * u := by rw [hf, hg] have h2 := redLoc_spec (f * g) hfg have hfspec := redLoc_spec f hf have hgspec := redLoc_spec g hg apply mul_right_cancel₀ (mul_ne_zero hsne htne) calc redLoc (f * g) * (redRes A red R hR s * redRes A red R hR t) = redLoc (f * g) * redRes A red R hR (s * t) := by rw [map_mul] _ = redRes A red R hR (r * u) := h2 _ = (redLoc f * redRes A red R hR s) * (redLoc g * redRes A red R hR t) := by rw [map_mul, hfspec, hgspec] _ = redLoc f * redLoc g * (redRes A red R hR s * redRes A red R hR t) := by ring map_zero' := by have h := redLoc_spec (A := A) (red := red) (R := R) (hR := hR) (0 : localizedAtKer A red R hR) (r := 0) (s := 1) (by simp) rwa [map_one, mul_one, map_zero] at h map_add' f g := by obtain ⟨r, s, hs, hf⟩ := f.2 obtain ⟨u, t, ht, hg⟩ := g.2 have hsne := redRes_ne_zero_of_notMem (A := A) (red := red) (R := R) (hR := hR) hs have htne := redRes_ne_zero_of_notMem (A := A) (red := red) (R := R) (hR := hR) ht have hfg : ((f + g : localizedAtKer A red R hR) : LaurentSeries L) * ((s * t : R) : LaurentSeries L) = ((r * t + u * s : R) : LaurentSeries L) := by push_cast calc ((f : LaurentSeries L) + g) * ((s : LaurentSeries L) * t) = ((f : LaurentSeries L) * s) * t + ((g : LaurentSeries L) * t) * s := by ring _ = (r : LaurentSeries L) * t + (u : LaurentSeries L) * s := by rw [hf, hg] have h2 := redLoc_spec (f + g) hfg have hfspec := redLoc_spec f hf have hgspec := redLoc_spec g hg apply mul_right_cancel₀ (mul_ne_zero hsne htne) calc redLoc (f + g) * (redRes A red R hR s * redRes A red R hR t) = redLoc (f + g) * redRes A red R hR (s * t) := by rw [map_mul] _ = redRes A red R hR (r * t + u * s) := h2 _ = (redLoc f * redRes A red R hR s) * redRes A red R hR t + (redLoc g * redRes A red R hR t) * redRes A red R hR s := by rw [map_add, map_mul, map_mul, hfspec, hgspec] _ = (redLoc f + redLoc g) * (redRes A red R hR s * redRes A red R hR t) := by ring @[simp] theorem redLocHom_apply (f : localizedAtKer A red R hR) : redLocHom f = redLoc f := rfl end LocalizedReduction section Modular variable (N : ℕ) [NeZero N] variable {L : Type*} [CommRing L] (A : Subring L) def constSeries : A →+* LaurentSeries L := (algebraMap L (LaurentSeries L)).comp A.subtype def modularRing : Subring (LaurentSeries L) := Subring.closure (Set.range (constSeries A) ∪ {jqModC L, jqNModC L N}) theorem jqModC_mem_modularRing : jqModC L ∈ modularRing N A := Subring.subset_closure (Or.inr (Set.mem_insert _ _)) theorem jqNModC_mem_modularRing : jqNModC L N ∈ modularRing N A := Subring.subset_closure (Or.inr (Set.mem_insert_of_mem _ rfl)) theorem constSeries_mem_modularRing (a : A) : constSeries A a ∈ modularRing N A := Subring.subset_closure (Or.inl ⟨a, rfl⟩) theorem jqModC_mem_integralCoeffs : jqModC L ∈ integralCoeffs A := by intro n rw [jqModC_eq_map_intCast, HahnSeries.map_coeff] exact intCast_mem A _ theorem jqNModC_mem_integralCoeffs : jqNModC L N ∈ integralCoeffs A := by intro n by_cases h : ((N : ℕ) : ℤ) ∣ n · obtain ⟨m, rfl⟩ := h rw [jqNModC, qExpand_coeff_mul] exact jqModC_mem_integralCoeffs A m · rw [jqNModC, qExpand_coeff_of_not_dvd _ _ h] exact A.zero_mem theorem constSeries_mem_integralCoeffs (a : A) : constSeries A a ∈ integralCoeffs A := by intro n have : constSeries A a = HahnSeries.single 0 (a : L) := by show algebraMap L (LaurentSeries L) (a : L) = HahnSeries.single 0 (a : L) ext m rw [HahnSeries.algebraMap_apply', show algebraMap L (PowerSeries L) (a : L) = PowerSeries.C (a : L) from by simp, HahnSeries.ofPowerSeries_C] rfl rw [this, HahnSeries.coeff_single] split_ifs · exact a.2 · exact A.zero_mem theorem modularRing_le_integralCoeffs : modularRing N A ≤ integralCoeffs A := by rw [modularRing, Subring.closure_le] rintro x (⟨a, rfl⟩ | rfl | rfl) · exact constSeries_mem_integralCoeffs A a · exact jqModC_mem_integralCoeffs A · exact jqNModC_mem_integralCoeffs N A variable {k : Type*} [Field k] (red : A →+* k) def modularLocalized : Subring (LaurentSeries L) := localizedAtKer A red (modularRing N A) (modularRing_le_integralCoeffs N A) def modularRedLocHom : modularLocalized N A red →+* LaurentSeries k := redLocHom (A := A) (red := red) (R := modularRing N A) (hR := modularRing_le_integralCoeffs N A) end Modular end CharPReduction end ModularCurve end
Statements phrased using this module (83)
- Normal fibre model of X₀(N) with cusp chart
ModularCurve.CharPModel.exists_fibreModel_cuspChart_integrallyClosed79 below · depth 10 - Igusa lifting on both j-charts
ModularCurve.CharPModel.exists_integral_lift_jChart_and_jInvChart733 below · depth 10 - Relative degree ψ(N) of k(̄ j,̄ j_N) over k(̄ j)
ModularCurve.relfinrank_adjoin_jqModC_modularFunctionFieldC_eq_dedekindPsi105 below · depth 10 - Reduction on the finite chart is coefficientwise
ModularCurve.CharPModel.FibreModel.coe_piFin_eq_coeffRed116 below · depth 11 - q-expansion principle for the pole chart of a fibre model
ModularCurve.CharPModel.FibreModel.coe_piInf_eq_coeffRed_of_cuspChart96 below · depth 11 - Integral kernel elements at the j-chart are constant multiples
ModularCurve.CharPModel.exists_eq_const_mul_of_modularRedLocHom_eq_zero76 below · depth 11 - Kernel elements integral at the inverted j-chart are constant multiples
ModularCurve.CharPModel.exists_eq_const_mul_of_modularRedLocHom_eq_zero_inv77 below · depth 11 - Integral closedness of the localised modular subring
ModularCurve.CharPReduction.mem_modularLocalized_of_eval2_monic4 below · depth 11 - Reduced localised modular Laurent series lie in k(̃ j(q),̃ j(q^N))
ModularCurve.CharPReduction.modularRedLocHom_mem0 below · depth 11 - Chart dichotomy for ̄ j in terms of ord_w
ModularCurve.exists_ord_sub_pos_or_exists_ord_inv_sub_pos_of_dataAll113 below · depth 11 - Integrality over A[̄ j] forces coefficients into A
ModularCurve.mem_integralCoeffs_of_integral_affineBaseFin114 below · depth 11 - Integrality over A[1/j] forces Laurent coefficients into A
ModularCurve.mem_integralCoeffs_of_integral_affineBaseInf114 below · depth 11 - Localised reduction agrees with coefficientwise reduction
ModularCurve.CharPReduction.modularRedLocHom_eq_coeffRed0 below · depth 12 - Surjectivity of the localised modular reduction onto the fibre field
ModularCurve.CharPReduction.exists_modularRedLocHom_eq0 below · depth 13 - Localised modular ring of level Nq gives a valuation dichotomy
ModularCurve.coe_mem_modularLocalized_or_coe_inv_mem_modularLocalized_mul_of_not_dvd153 below · depth 13 - Integrality over A[jmath̄] from Gauss-integrality and pole-freeness
ModularCurve.CharPModel.exists_monic_eval2_affineBaseFin_eq_zero_of_mem_modularLocalized_of_forall_mem_of_jBar_mem138 below · depth 14 - Pole-chart integrality over A[1/j] at level N
ModularCurve.CharPModel.exists_monic_eval2_affineBaseInf_eq_zero_of_mem_modularLocalized_of_forall_inv_jBar_mem138 below · depth 14 - Valuation dichotomy in the localised modular presentation ring
ModularCurve.CharPReduction.mem_or_inv_mem_modularLocalized4 below · depth 14 - Integral q-expansion quotients lie in the localised modular ring
ModularCurve.mem_modularLocalized_mul_of_not_dvd_of_exists_coeffMap_mul_eq144 below · depth 14 - A fibre model with cusp chart for X₀(N)
ModularCurve.CharPModel.exists_fibreModel_cuspChart79 below · depth 15 - Points through a crossing have supersingular first reduction
ModularCurve.DRModelPackageLevel.reduceFst_mem_ssPlaces_of_specialPoint_eq_crossing126 below · depth 15 - Igusa chart rings inside a cusp-chart fibre model
ModularCurve.IgusaScheme.exists_fibreModel_cuspChart_of_chartAlg_of_lift743 below · depth 15 - Valuation property of the localized modular ring at level q
ModularCurve.coe_mem_modularLocalized_or_coe_inv_mem_modularLocalized123 below · depth 15 - j(q^N) lies in the localised modular ring of level Nq
ModularCurve.jqNModC_mem_modularLocalized_mul_of_not_dvd130 below · depth 15 - Integrally closed fibre model with cusp chart and lifts
ModularCurve.CharPModel.exists_fibreModel_cuspChart_integrallyClosed_of_lift79 below · depth 16 - Local points over a crossing factor through the finite-j chart
ModularCurve.DRModelPackageLevel.exists_eq_spec_map_comp_iotaFin_of_comp_base_eq1 below · depth 16 - Positivity of ord_W(j-φ(j)) for a chart A-point
ModularCurve.DRModelPackageLevel.ord_jFun_sub_pos_of_eq_spec_map_comp_iotaFin1 below · depth 16 - Reduction of the chart value of j at a crossing
ModularCurve.DRModelPackageLevel.red_jChartFin_eq_evalAt_jGeomGen_nodeEquiv1 below · depth 16 - Crossing lemma at a supersingular node of X₀(q) mod q
ModularCurve.exists_hasValue_frobNodePair_of_mem_ssJSet_of_pow_eq535 below · depth 17 - Gauss coordinate at a supersingular node with j=1728
ModularCurve.NodeLocalized.exists_gaussCoordinate_of_crossingPresentation_ofNat1728176 below · depth 18 - Gauss coordinate at a supersingular centre j=0
ModularCurve.NodeLocalized.exists_gaussCoordinate_of_crossingPresentation_zero176 below · depth 18 - Tube equation for the inertial displacement on an annulus
ModularCurve.PlaceSpecialization.LevelOneProlongationPair.exists_tubeEquation_smul_sub_self_of_annulus4 below · depth 18 - Gauss integrality as localisation of the Kronecker ring at level Nq
ModularCurve.exists_mul_coeffMap_eq_iff_coe_mem_modularLocalized_of_not_dvd126 below · depth 18 - Two-branch normalisation at a supersingular node of X₀(q)
ModularCurve.NodeLocalized.exists_twoBranchNormalisation_qpow_of_forall_centred_ord_eq_zero684 below · depth 19 - Unit values at places centred on a supersingular node
ModularCurve.NodeLocalized.isUnit_evalAt_of_forall_centred_ord_eq_zero_of_gaussUnit562 below · depth 19 - Regularity at a supersingular node gives membership in the local ring
ModularCurve.NodeLocalized.mem_modularLocalizedAtPoint_coeffSubring_of_isIntegral_of_mem_fieldOver_of_redRestrict_eq_of_forall_centred_ord_nonneg566 below · depth 19 - Residue-pair independent integral families in finite-dimensional subspaces
ModularCurve.exists_linearIndependent_residuePair_of_finiteDimensional0 below · depth 19 - Order zero at an ordinary point for the ∞-branch reduction
ModularCurve.ord_charLGeomPlaceOfPoint_modularRedLocHom_eq_zero_of_not_mem_ssJSet499 below · depth 19 - Residue at a centred place over a supersingular node
ModularCurve.NodeLocalized.exists_mem_and_red_eq_of_hasValue_frobNodePair_of_centred_of_ssJSet_of_ne_zero_of_ne_1728426 below · depth 20 - Scaling a modular function to a nonzero Gauss reduction
ModularCurve.NodeLocalized.exists_smul_gaussUnit376 below · depth 20 - Two-branch normalisation at the node j=1728: width divides the Fricke exponent
ModularCurve.NodeLocalized.exists_twoBranchNormalisation_qpow_ofNat1728_width_dvd594 below · depth 20 - Two-branch normalisation at the node j=0: width divides the Fricke exponent
ModularCurve.NodeLocalized.exists_twoBranchNormalisation_qpow_zero_width_dvd594 below · depth 20 - Gauss units q/G and w_q(G) for the node coordinate G
ModularCurve.NodeLocalized.gaussData_nodeCoord202 below · depth 20 - Unit values of a Gauss pair at nodes centred at 1728
ModularCurve.NodeLocalized.isUnit_evalAt_ofNat1728_of_gaussPair_of_isAlgClosed621 below · depth 20 - Unit values of a Gauss pair at the node j=0
ModularCurve.NodeLocalized.isUnit_evalAt_zero_of_gaussPair_of_isAlgClosed621 below · depth 20 - Non-vanishing of the near-branch node value at supersingular nodes
ModularCurve.NodeLocalized.ne_zero_of_hasValue_frobNodePair_of_forall_centred_ord_eq_zero449 below · depth 20 - Reduction is regular at ordinary points jmath̃=a with a^{q^2}=a
ModularCurve.ord_charLGeomPlaceOfPoint_modularRedLocHom_eq_zero_of_not_mem_ssJSet_of_pow_sq_eq469 below · depth 20 - Reduction is a unit at j=a when a^{q^2}≠ a
ModularCurve.ord_charLGeomPlaceOfPoint_modularRedLocHom_eq_zero_of_not_mem_ssJSet_of_pow_sq_ne494 below · depth 20 - Scalar normalisation making a modular function a unit of the localised reduction
ModularCurve.CharPReduction.exists_smul_mem_modularLocalized_and_modularRedLocHom_ne_zero_of_charP125 below · depth 21 - Zero or pole at a place centred at a supersingular node
ModularCurve.NodeLocalized.exists_centred_ord_ne_zero_of_not_isUnit_frobNodePair448 below · depth 21 - Residue compatibility at a supersingular node of X₀(q)
ModularCurve.NodeLocalized.exists_mem_and_red_eq_of_hasValue_frobNodePair_of_centred_of_ssJSet569 below · depth 21 - Membership in the node local ring at (a,a^q), a ≠ 0,1728
ModularCurve.NodeLocalized.mem_modularLocalizedAtPoint_coeffSubring_of_isIntegral_of_mem_fieldOver_of_ne_zero_of_ne_1728424 below · depth 21 - Nonvanishing of the near-branch node value at a supersingular centre
ModularCurve.NodeLocalized.ne_zero_of_hasValue_frobNodePair_of_forall_centred_ord_eq_zero_of_mem_ssJSet592 below · depth 21 - Equivariant family with independent residue pairs on X₀(q)
ModularCurve.exists_linearIndependent_residuePair_forall_arithmeticGalois_smul_eq_of_finiteDimensional2 below · depth 21 - Height-one prime containing p, avoiding q and the node
ModularCurve.NodeLocalized.exists_heightOne_mem_of_mul_eq_of_not_isUnit_frobNodePair405 below · depth 22 - A prime of the j-integral closure through p=fs avoiding the node
ModularCurve.NodeLocalized.exists_isPrime_mem_of_mul_eq_of_not_isUnit_frobNodePair361 below · depth 22 - Node-local functions as quotients integral over (A∩ K)[j]
ModularCurve.NodeLocalized.exists_mul_eq_mem_jIntegralClosure_of_not_isUnit_frobNodePair147 below · depth 22 - Membership in the node-local ring over a number field
ModularCurve.NodeLocalized.mem_modularLocalizedAtPoint_coeffSubring_of_isIntegral_of_mem_fieldOver566 below · depth 22 - Regularity at a supersingular node gives localised membership
ModularCurve.NodeLocalized.mem_modularLocalizedAtPoint_of_mem_modularLocalized_of_forall_centred_ord_eq_zero_of_ssJSet568 below · depth 22 - Coefficientwise reduction commutes with evaluating at λ-expansions
ModularCurve.coeffRed_lambdaEval0 below · depth 23 - Wide supersingular annuli of X₀(p) attached to both charts
ModularCurve.exists_ssAnnulus_oppAnnulus_isAttached_of_chartSpec_of_eq_zero_or_eq_ofNat1728_levelOne795 below · depth 24 - Attachment of the opposite supersingular annulus, level 1· p
ModularCurve.isAttached_oppAnnulus_inftyChart_of_chartSpec_levelOne702 below · depth 24 - Attachment of the supersingular annulus at level 1· p
ModularCurve.isAttached_ssAnnulus_zeroChart_of_chartSpec_levelOne702 below · depth 24 - Wide supersingular annuli of X₀(p) attached to both charts
ModularCurve.exists_ssAnnulus_oppAnnulus_isAttached_of_chartSpec_of_eq_zero_or_eq_ofNat1728796 below · depth 25 - Crossing parameter at supersingular j∈{0,1728}: Gauss unit, order one
ModularCurve.gaussUnit_frickeInvolutionBar_and_ord_eq_one_of_crossingPresentation_of_eq_zero_or_eq_ofNat1728282 below · depth 25 - Attachment of the opposite supersingular annulus to the ∞-chart
ModularCurve.isAttached_oppAnnulus_inftyChart_of_chartSpec701 below · depth 25 - Attachment of the opposite supersingular annulus, level 1· p
ModularCurve.isAttached_oppAnnulus_inftyChart_of_chartSpec_levelOne_univ702 below · depth 25 - Attachment of the wide supersingular annulus to a component chart
ModularCurve.isAttached_oppAnnulus_inftyChart_of_chartSpec_of_paramGauss_of_eq_zero_or_eq_ofNat1728_levelOne757 below · depth 25 - Attachment of the supersingular annulus at the zero chart
ModularCurve.isAttached_ssAnnulus_zeroChart_of_chartSpec701 below · depth 25 - Supersingular annulus attached to the zero chart, level 1· p
ModularCurve.isAttached_ssAnnulus_zeroChart_of_chartSpec_levelOne_univ702 below · depth 25 - Attachment of the wide supersingular annulus to the zero chart
ModularCurve.isAttached_ssAnnulus_zeroChart_of_chartSpec_of_paramGauss_of_eq_zero_or_eq_ofNat1728_levelOne757 below · depth 25 - Slope law of the opposite supersingular annulus, level 1· p
ModularCurve.slopeLaw_oppAnnulus_inftyChart_of_chartSpec_levelOne700 below · depth 25 - Slope law on the zero chart, level 1· p
ModularCurve.slopeLaw_ssAnnulus_zeroChart_of_chartSpec_levelOne700 below · depth 25 - Wide two-branch normalisation at supersingular nodes with j∈{0,1728}
ModularCurve.NodeLocalized.exists_twoBranchNormalisation_qpow_width_dvd_and_mul_ord_charLGeomPlaceOfPoint_eq_neg_of_eq_zero_or_eq_ofNat1728740 below · depth 26 - Attaching a wide supersingular annulus to the ∞-chart
ModularCurve.isAttached_oppAnnulus_inftyChart_of_chartSpec_of_paramGauss_of_eq_zero_or_eq_ofNat1728_levelOne_univ757 below · depth 26 - Attachment of the opposite supersingular annulus to the ∞-chart
ModularCurve.isAttached_oppAnnulus_inftyChart_of_chartSpec_univ701 below · depth 26 - Attachment of a wide supersingular annulus to the zero chart
ModularCurve.isAttached_ssAnnulus_zeroChart_of_chartSpec_of_paramGauss_of_eq_zero_or_eq_ofNat1728_levelOne_univ757 below · depth 26 - Attachment of the supersingular annulus to the zero chart
ModularCurve.isAttached_ssAnnulus_zeroChart_of_chartSpec_univ701 below · depth 26 - Slope law for the opposite supersingular annulus
ModularCurve.slopeLaw_oppAnnulus_inftyChart_of_chartSpec699 below · depth 26 - Slope law on the supersingular annulus, 0-component chart
ModularCurve.slopeLaw_ssAnnulus_zeroChart_of_chartSpec699 below · depth 26 - Two-branch normalisation at a node, with node order -m
ModularCurve.NodeLocalized.exists_twoBranchNormalisation_qpow_and_ord_charLGeomPlaceOfPoint_eq_neg696 below · depth 27 - Slope law on the infinity chart for the opposite annulus
ModularCurve.slopeLaw_oppAnnulus_inftyChart_of_chartSpec_univ699 below · depth 27 - Slope law on the supersingular annulus at the 0-chart
ModularCurve.slopeLaw_ssAnnulus_zeroChart_of_chartSpec_univ699 below · depth 27