Definitions/Def_WeierstrassCurve_FormalGroupLaw.lean
Formal group law of a Weierstrass curve
For a Weierstrass curve W with coefficients a_1,\dots,a_6 over a commutative ring R, this module constructs the series entering the formal group at the origin. First, the one-variable Weierstrass series: wSubst sends w to X^3 + a_1Xw + a_2X^2w + a_3w^2 + a_4Xw^2 + a_6w^3, wIter iterates it from 0, and formalW is the power series whose n-th coefficient is the n-th coefficient of the n-th iterate. It is shown to be the unique w \in R[[X]] with zero constant term satisfying w = X^3 + a_1Xw + a_2X^2w + a_3w^2 + a_4Xw^2 + a_6w^3 (existsUnique_formalW), to be divisible by X^3, of order exactly 3 over a nontrivial ring, and to satisfy w \cdot u = X^3 for the unit u = wUnitFactor = 1 - (a_1X + a_2X^2 + a_3w + a_4Xw + a_6w^2); its coefficients in degrees 3 to 7 are computed explicitly (1, a_1, a_1^2+a_2, a_1^3+2a_1a_2+a_3, a_1^4+3a_1^2a_2+3a_1a_3+a_2^2+a_4). Next, in two variables: fgW₁ is w(X_0), fgSlope is the divided difference, defined coefficientwise by assigning to the monomial X_0^{d_0}X_1^{d_1} the coefficient of degree d_0+d_1+1 of w, and fgNu = w(X_0) - \lambda X_0. With fgZ3Denom = 1 + a_2\lambda + a_4\lambda^2 + a_6\lambda^3 (a series with constant term 1, inverted by invOfUnit), fgZ3 and fgZ3Fixed are -X_0 - X_1 plus fgZ3Num, resp. fgZ3NumFixed, divided by that denominator, where fgZ3Num = a_1\lambda + a_3\lambda^2 - a_2\nu - 2a_4\lambda\nu - 3a_6\lambda^2\nu and fgZ3NumFixed is -(a_1\lambda + a_3\lambda^2 + a_2\nu + 2a_4\lambda\nu + 3a_6\lambda^2\nu). Finally fgInv = -X \cdot (1 - a_1X - a_3w)^{-1}, and formalGroupLaw, formalGroupLawFixed are fgInv with X substituted by fgZ3, resp. fgZ3Fixed. Both have zero constant coefficient and coefficient 1 at each X_i, and the coefficient of formalGroupLawFixed at X_i^2 is shown to vanish; auxiliary lemmas bound orders of the constituent series and compute coefficients of products divisible by powers of X.
Relation to Mathlib
The WeierstrassCurve structure, PowerSeries/MvPowerSeries with their order, invOfUnit and substitution (subst, HasSubst) machinery are Mathlib's; the Weierstrass series formalW and the group-law series are defined here in the WeierstrassCurve namespace.
Where it is used
The coefficient identities established here — vanishing constant term, linear coefficients equal to 1, and vanishing of the pure square coefficients of formalGroupLawFixed — are the normalisations required to exhibit formalGroupLawFixed as a formal group law; the associativity verification and the packaging as a formal group are carried out in a separate module.
References
- J. H. Silverman, The Arithmetic of Elliptic Curves, 2nd ed., Graduate Texts in Mathematics 106, Springer, 2009, Chapter IV §1
- M. Hazewinkel, Formal Groups and Applications, Pure and Applied Mathematics 78, Academic Press, 1978
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 973 lines
- 102 declarations
- used in the statements of 207 theorems and imported by 214 proofs
- imports 0 definition modules
Source file: Definitions/Def_WeierstrassCurve_FormalGroupLaw.lean
Imports
- only Mathlib
Declarations
- theorem
PowerSeries.coeff_add_mul_of_X_pow_dvd - theorem
PowerSeries.coeff_add_succ_mul_of_X_pow_dvd - def
WeierstrassCurve.wSubst - def
WeierstrassCurve.wIter - theorem
WeierstrassCurve.wIter_zero - theorem
WeierstrassCurve.wIter_succ - theorem
WeierstrassCurve.wSubst_sub_wSubst - theorem
WeierstrassCurve.X_dvd_wSubst - theorem
WeierstrassCurve.X_pow_three_dvd_wSubst - theorem
WeierstrassCurve.X_pow_succ_dvd_wSubst_sub_wSubst - theorem
WeierstrassCurve.X_dvd_wIter - theorem
WeierstrassCurve.X_pow_three_dvd_wIter - theorem
WeierstrassCurve.X_pow_succ_dvd_wIter_succ_sub - theorem
WeierstrassCurve.X_pow_succ_dvd_wIter_sub_wIter - def
WeierstrassCurve.formalW - theorem
WeierstrassCurve.coeff_formalW - theorem
WeierstrassCurve.X_pow_succ_dvd_formalW_sub_wIter - theorem
WeierstrassCurve.constantCoeff_formalW - theorem
WeierstrassCurve.X_dvd_formalW - theorem
WeierstrassCurve.X_pow_three_dvd_formalW - theorem
WeierstrassCurve.coeff_formalW_zero - theorem
WeierstrassCurve.coeff_formalW_one - theorem
WeierstrassCurve.coeff_formalW_two - theorem
WeierstrassCurve.X_pow_succ_dvd_formalW_sub_wSubst - theorem
WeierstrassCurve.formalW_eq_wSubst - theorem
WeierstrassCurve.formalW_eq - theorem
WeierstrassCurve.eq_formalW_of_constantCoeff_eq_zero - theorem
WeierstrassCurve.existsUnique_formalW - def
WeierstrassCurve.wUnitFactor - theorem
WeierstrassCurve.formalW_mul_wUnitFactor - theorem
WeierstrassCurve.constantCoeff_wUnitFactor - theorem
WeierstrassCurve.isUnit_wUnitFactor - theorem
WeierstrassCurve.X_pow_six_dvd_formalW_sq - theorem
WeierstrassCurve.X_pow_nine_dvd_formalW_cube - theorem
WeierstrassCurve.coeff_formalW_sq_of_lt - theorem
WeierstrassCurve.coeff_formalW_cube_of_lt - theorem
WeierstrassCurve.coeff_X_mul_formalW' - theorem
WeierstrassCurve.coeff_formalW_step - theorem
WeierstrassCurve.coeff_formalW_three - theorem
WeierstrassCurve.coeff_formalW_four - theorem
WeierstrassCurve.coeff_formalW_five - theorem
WeierstrassCurve.coeff_formalW_sq_six - theorem
WeierstrassCurve.coeff_formalW_six - theorem
WeierstrassCurve.coeff_formalW_sq_seven - theorem
WeierstrassCurve.coeff_formalW_seven - theorem
WeierstrassCurve.exists_eq_X_pow_three_mul - theorem
WeierstrassCurve.order_formalW - def
WeierstrassCurve.fgW₁ - def
WeierstrassCurve.fgSlope - def
WeierstrassCurve.fgNu - def
WeierstrassCurve.fgZ3Denom - def
WeierstrassCurve.fgZ3Num - def
WeierstrassCurve.fgZ3 - def
WeierstrassCurve.fgInvDenom - def
WeierstrassCurve.fgInv - def
WeierstrassCurve.formalGroupLaw - theorem
WeierstrassCurve.coeff_fgSlope - theorem
WeierstrassCurve.constantCoeff_fgSlope - theorem
WeierstrassCurve.degree_fin2 - theorem
WeierstrassCurve.two_le_order_mul_left - theorem
WeierstrassCurve.constantCoeff_fgNu - theorem
WeierstrassCurve.constantCoeff_fgZ3Num - theorem
WeierstrassCurve.constantCoeff_fgZ3 - theorem
WeierstrassCurve.hasSubst_fgZ3 - theorem
WeierstrassCurve.hasSubst_X0 - theorem
WeierstrassCurve.constantCoeff_fgInv - theorem
WeierstrassCurve.coeff_one_fgInv - theorem
WeierstrassCurve.coeff_fgSlope_eq_zero_of_le_one - theorem
WeierstrassCurve.two_le_order_fgSlope - theorem
WeierstrassCurve.two_le_order_fgW1 - theorem
WeierstrassCurve.two_le_order_fgNu - theorem
WeierstrassCurve.two_le_order_fgZ3Num - theorem
WeierstrassCurve.coeff_single_fgZ3 - theorem
WeierstrassCurve.coeff_fgZ3_pow_eq_zero - theorem
WeierstrassCurve.constantCoeff_formalGroupLaw - theorem
WeierstrassCurve.coeff_single_formalGroupLaw - theorem
WeierstrassCurve.coeff_zero_formalGroupLaw - theorem
WeierstrassCurve.coeff_one_formalGroupLaw - def
WeierstrassCurve.fgZ3NumFixed - def
WeierstrassCurve.fgZ3Fixed - def
WeierstrassCurve.formalGroupLawFixed - theorem
WeierstrassCurve.constantCoeff_fgZ3NumFixed - theorem
WeierstrassCurve.two_le_order_fgZ3NumFixed - theorem
WeierstrassCurve.constantCoeff_fgZ3Fixed - theorem
WeierstrassCurve.hasSubst_fgZ3Fixed - theorem
WeierstrassCurve.coeff_single_fgZ3Fixed - theorem
WeierstrassCurve.coeff_fgZ3Fixed_pow_eq_zero - theorem
WeierstrassCurve.constantCoeff_formalGroupLawFixed - theorem
WeierstrassCurve.coeff_single_formalGroupLawFixed - theorem
WeierstrassCurve.coeff_zero_formalGroupLawFixed - theorem
WeierstrassCurve.coeff_one_formalGroupLawFixed - theorem
WeierstrassCurve.coeff_two_fgInv - theorem
WeierstrassCurve.three_le_order_fgW1 - theorem
WeierstrassCurve.three_le_order_fgNu - theorem
WeierstrassCurve.eq_zero_of_degree_lt_one - theorem
WeierstrassCurve.coeff_sq_mul_invD - theorem
WeierstrassCurve.coeff_sq_fgZ3NumFixed - theorem
WeierstrassCurve.coeff_sq_fgZ3Fixed - theorem
WeierstrassCurve.coeff_pow_lt - theorem
WeierstrassCurve.coeff_sq_pow2 - theorem
WeierstrassCurve.coeff_sq_subst - theorem
WeierstrassCurve.coeff_sq_formalGroupLawFixed
Source
import Mathlib.AlgebraicGeometry.EllipticCurve.Weierstrass ↗ import Mathlib.RingTheory.PowerSeries.Basic ↗ import Mathlib.RingTheory.PowerSeries.Inverse ↗ import Mathlib.RingTheory.PowerSeries.Order ↗ import Mathlib.RingTheory.PowerSeries.Substitution ↗ import Mathlib.RingTheory.MvPowerSeries.Substitution ↗ import Mathlib.RingTheory.MvPowerSeries.Order ↗ set_option autoImplicit false set_option maxHeartbeats 800000 noncomputable section open PowerSeries namespace PowerSeries variable {R : Type*} [CommRing R] theorem coeff_add_mul_of_X_pow_dvd {f g : R⟦X⟧} {a b : ℕ} (hf : (X : R⟦X⟧) ^ a ∣ f) (hg : (X : R⟦X⟧) ^ b ∣ g) : coeff (a + b) (f * g) = coeff a f * coeff b g := by obtain ⟨f', rfl⟩ := hf obtain ⟨g', rfl⟩ := hg have h : (X : R⟦X⟧) ^ a * f' * ((X : R⟦X⟧) ^ b * g') = (X : R⟦X⟧) ^ (a + b) * (f' * g') := by ring rw [h] simp [coeff_X_pow_mul', coeff_zero_eq_constantCoeff_apply] theorem coeff_add_succ_mul_of_X_pow_dvd {f g : R⟦X⟧} {a b : ℕ} (hf : (X : R⟦X⟧) ^ a ∣ f) (hg : (X : R⟦X⟧) ^ b ∣ g) : coeff (a + b + 1) (f * g) = coeff (a + 1) f * coeff b g + coeff a f * coeff (b + 1) g := by obtain ⟨f', rfl⟩ := hf obtain ⟨g', rfl⟩ := hg have h : (X : R⟦X⟧) ^ a * f' * ((X : R⟦X⟧) ^ b * g') = (X : R⟦X⟧) ^ (a + b) * (f' * g') := by ring rw [h, coeff_X_pow_mul', if_pos (by omega : a + b ≤ a + b + 1), (show a + b + 1 - (a + b) = 1 by omega), coeff_one_mul] have e1 : coeff (a + 1) ((X : R⟦X⟧) ^ a * f') = coeff 1 f' := by rw [coeff_X_pow_mul', if_pos (by omega : a ≤ a + 1), (show a + 1 - a = 1 by omega)] have e2 : coeff b ((X : R⟦X⟧) ^ b * g') = constantCoeff g' := by rw [coeff_X_pow_mul', if_pos le_rfl, Nat.sub_self, coeff_zero_eq_constantCoeff_apply] have e3 : coeff a ((X : R⟦X⟧) ^ a * f') = constantCoeff f' := by rw [coeff_X_pow_mul', if_pos le_rfl, Nat.sub_self, coeff_zero_eq_constantCoeff_apply] have e4 : coeff (b + 1) ((X : R⟦X⟧) ^ b * g') = coeff 1 g' := by rw [coeff_X_pow_mul', if_pos (by omega : b ≤ b + 1), (show b + 1 - b = 1 by omega)] rw [e1, e2, e3, e4] ring end PowerSeries namespace WeierstrassCurve variable {R : Type*} [CommRing R] (W : WeierstrassCurve R) def wSubst (w : R⟦X⟧) : R⟦X⟧ := X ^ 3 + C W.a₁ * (X * w) + C W.a₂ * (X ^ 2 * w) + C W.a₃ * w ^ 2 + C W.a₄ * (X * w ^ 2) + C W.a₆ * w ^ 3 def wIter : ℕ → R⟦X⟧ | 0 => 0 | k + 1 => W.wSubst (wIter k) @[simp] theorem wIter_zero : W.wIter 0 = 0 := by simp [wIter] theorem wIter_succ (k : ℕ) : W.wIter (k + 1) = W.wSubst (W.wIter k) := by simp [wIter] theorem wSubst_sub_wSubst (w w' : R⟦X⟧) : W.wSubst w - W.wSubst w' = (w - w') * (C W.a₁ * X + C W.a₂ * X ^ 2 + C W.a₃ * (w + w') + C W.a₄ * (X * (w + w')) + C W.a₆ * (w ^ 2 + w * w' + w' ^ 2)) := by simp only [wSubst] ring theorem X_dvd_wSubst {w : R⟦X⟧} (hw : (X : R⟦X⟧) ∣ w) : (X : R⟦X⟧) ∣ W.wSubst w := by rw [X_dvd_iff] at hw ⊢ simp [wSubst, hw, constantCoeff_X, constantCoeff_C] theorem X_pow_three_dvd_wSubst {w : R⟦X⟧} (hw : (X : R⟦X⟧) ^ 3 ∣ w) : (X : R⟦X⟧) ^ 3 ∣ W.wSubst w := by simp only [wSubst] refine dvd_add (dvd_add (dvd_add (dvd_add (dvd_add dvd_rfl ?_) ?_) ?_) ?_) ?_ · exact (hw.mul_left X).mul_left _ · exact (hw.mul_left ((X : R⟦X⟧) ^ 2)).mul_left _ · exact (hw.trans (dvd_pow_self w (by norm_num))).mul_left _ · exact ((hw.trans (dvd_pow_self w (by norm_num))).mul_left X).mul_left _ · exact (hw.trans (dvd_pow_self w (by norm_num))).mul_left _ theorem X_pow_succ_dvd_wSubst_sub_wSubst {w w' : R⟦X⟧} {n : ℕ} (hw : (X : R⟦X⟧) ∣ w) (hw' : (X : R⟦X⟧) ∣ w') (h : (X : R⟦X⟧) ^ n ∣ w - w') : (X : R⟦X⟧) ^ (n + 1) ∣ W.wSubst w - W.wSubst w' := by rw [W.wSubst_sub_wSubst, pow_succ] refine mul_dvd_mul h ?_ rw [X_dvd_iff] at hw hw' ⊢ simp [hw, hw', constantCoeff_X, constantCoeff_C] theorem X_dvd_wIter (k : ℕ) : (X : R⟦X⟧) ∣ W.wIter k := by induction k with | zero => simp | succ k ih => rw [W.wIter_succ k] exact W.X_dvd_wSubst ih theorem X_pow_three_dvd_wIter (k : ℕ) : (X : R⟦X⟧) ^ 3 ∣ W.wIter k := by induction k with | zero => simp | succ k ih => rw [W.wIter_succ k] exact W.X_pow_three_dvd_wSubst ih theorem X_pow_succ_dvd_wIter_succ_sub (k : ℕ) : (X : R⟦X⟧) ^ (k + 1) ∣ W.wIter (k + 1) - W.wIter k := by induction k with | zero => rw [W.wIter_succ 0, W.wIter_zero, sub_zero] exact dvd_trans (pow_dvd_pow X (by norm_num)) (W.X_pow_three_dvd_wSubst (dvd_zero _)) | succ k ih => have h := W.X_pow_succ_dvd_wSubst_sub_wSubst (W.X_dvd_wIter (k + 1)) (W.X_dvd_wIter k) ih simpa only [wIter_succ] using h theorem X_pow_succ_dvd_wIter_sub_wIter {k m : ℕ} (h : k ≤ m) : (X : R⟦X⟧) ^ (k + 1) ∣ W.wIter m - W.wIter k := by induction m, h using Nat.le_induction with | base => simp | succ m hm ih => have h1 : W.wIter (m + 1) - W.wIter k = (W.wIter (m + 1) - W.wIter m) + (W.wIter m - W.wIter k) := by ring rw [h1] exact dvd_add (dvd_trans (pow_dvd_pow X (by omega)) (W.X_pow_succ_dvd_wIter_succ_sub m)) ih def formalW : R⟦X⟧ := PowerSeries.mk fun n => coeff n (W.wIter n) theorem coeff_formalW (n : ℕ) : coeff n W.formalW = coeff n (W.wIter n) := coeff_mk _ _ theorem X_pow_succ_dvd_formalW_sub_wIter (k : ℕ) : (X : R⟦X⟧) ^ (k + 1) ∣ W.formalW - W.wIter k := by rw [X_pow_dvd_iff] intro m hm have hmk : m ≤ k := Nat.lt_succ_iff.mp hm have h := W.X_pow_succ_dvd_wIter_sub_wIter hmk rw [X_pow_dvd_iff] at h have h2 := h m (Nat.lt_succ_self m) rw [map_sub] at h2 ⊢ rw [coeff_formalW, sub_eq_zero.mp h2, sub_self] theorem constantCoeff_formalW : constantCoeff W.formalW = 0 := by rw [← coeff_zero_eq_constantCoeff_apply, coeff_formalW, W.wIter_zero, map_zero] theorem X_dvd_formalW : (X : R⟦X⟧) ∣ W.formalW := X_dvd_iff.mpr W.constantCoeff_formalW theorem X_pow_three_dvd_formalW : (X : R⟦X⟧) ^ 3 ∣ W.formalW := by rw [X_pow_dvd_iff] intro m hm rw [coeff_formalW] exact X_pow_dvd_iff.mp (W.X_pow_three_dvd_wIter m) m hm theorem coeff_formalW_zero : coeff 0 W.formalW = 0 := by rw [coeff_zero_eq_constantCoeff_apply] exact W.constantCoeff_formalW theorem coeff_formalW_one : coeff 1 W.formalW = 0 := X_pow_dvd_iff.mp W.X_pow_three_dvd_formalW 1 (by norm_num) theorem coeff_formalW_two : coeff 2 W.formalW = 0 := X_pow_dvd_iff.mp W.X_pow_three_dvd_formalW 2 (by norm_num) theorem X_pow_succ_dvd_formalW_sub_wSubst (k : ℕ) : (X : R⟦X⟧) ^ (k + 1) ∣ W.formalW - W.wSubst W.formalW := by have h1 : (X : R⟦X⟧) ^ (k + 1 + 1) ∣ W.formalW - W.wIter (k + 1) := W.X_pow_succ_dvd_formalW_sub_wIter (k + 1) have h2 : (X : R⟦X⟧) ^ (k + 1) ∣ W.wIter k - W.formalW := dvd_sub_comm.mp (W.X_pow_succ_dvd_formalW_sub_wIter k) have h3 : (X : R⟦X⟧) ^ (k + 1 + 1) ∣ W.wSubst (W.wIter k) - W.wSubst W.formalW := W.X_pow_succ_dvd_wSubst_sub_wSubst (W.X_dvd_wIter k) W.X_dvd_formalW h2 have h4 : W.formalW - W.wSubst W.formalW = (W.formalW - W.wIter (k + 1)) + (W.wSubst (W.wIter k) - W.wSubst W.formalW) := by rw [W.wIter_succ k] ring rw [h4] exact dvd_add (dvd_trans (pow_dvd_pow X (by omega)) h1) (dvd_trans (pow_dvd_pow X (by omega)) h3) theorem formalW_eq_wSubst : W.formalW = W.wSubst W.formalW := by ext n have h := W.X_pow_succ_dvd_formalW_sub_wSubst n rw [X_pow_dvd_iff] at h have h2 := h n (Nat.lt_succ_self n) rw [map_sub, sub_eq_zero] at h2 exact h2 theorem formalW_eq : W.formalW = X ^ 3 + C W.a₁ * X * W.formalW + C W.a₂ * X ^ 2 * W.formalW + C W.a₃ * W.formalW ^ 2 + C W.a₄ * X * W.formalW ^ 2 + C W.a₆ * W.formalW ^ 3 := by conv_lhs => rw [W.formalW_eq_wSubst] unfold wSubst ring theorem eq_formalW_of_constantCoeff_eq_zero {w : R⟦X⟧} (hw : constantCoeff w = 0) (heq : w = X ^ 3 + C W.a₁ * X * w + C W.a₂ * X ^ 2 * w + C W.a₃ * w ^ 2 + C W.a₄ * X * w ^ 2 + C W.a₆ * w ^ 3) : w = W.formalW := by have hsub : w = W.wSubst w := by conv_lhs => rw [heq] unfold wSubst ring have hX : (X : R⟦X⟧) ∣ w := X_dvd_iff.mpr hw have key : ∀ k : ℕ, (X : R⟦X⟧) ^ k ∣ w - W.formalW := by intro k induction k with | zero => simp | succ k ih => have h := W.X_pow_succ_dvd_wSubst_sub_wSubst hX W.X_dvd_formalW ih rwa [← hsub, ← W.formalW_eq_wSubst] at h ext n have h := key (n + 1) rw [X_pow_dvd_iff] at h have h2 := h n (Nat.lt_succ_self n) rwa [map_sub, sub_eq_zero] at h2 theorem existsUnique_formalW : ∃! w : R⟦X⟧, constantCoeff w = 0 ∧ w = X ^ 3 + C W.a₁ * X * w + C W.a₂ * X ^ 2 * w + C W.a₃ * w ^ 2 + C W.a₄ * X * w ^ 2 + C W.a₆ * w ^ 3 := ⟨W.formalW, ⟨W.constantCoeff_formalW, W.formalW_eq⟩, fun _ hw => W.eq_formalW_of_constantCoeff_eq_zero hw.1 hw.2⟩ def wUnitFactor : R⟦X⟧ := 1 - (C W.a₁ * X + C W.a₂ * X ^ 2 + C W.a₃ * W.formalW + C W.a₄ * (X * W.formalW) + C W.a₆ * W.formalW ^ 2) theorem formalW_mul_wUnitFactor : W.formalW * W.wUnitFactor = X ^ 3 := by unfold wUnitFactor linear_combination W.formalW_eq theorem constantCoeff_wUnitFactor : constantCoeff W.wUnitFactor = 1 := by unfold wUnitFactor simp [W.constantCoeff_formalW, constantCoeff_X, constantCoeff_C] theorem isUnit_wUnitFactor : IsUnit W.wUnitFactor := isUnit_iff_constantCoeff.mpr (by rw [W.constantCoeff_wUnitFactor]; exact isUnit_one) private theorem X_pow_six_dvd_formalW_sq : (X : R⟦X⟧) ^ 6 ∣ W.formalW ^ 2 := by have h := pow_dvd_pow_of_dvd W.X_pow_three_dvd_formalW 2 rw [← pow_mul] at h norm_num at h exact h private theorem X_pow_nine_dvd_formalW_cube : (X : R⟦X⟧) ^ 9 ∣ W.formalW ^ 3 := by have h := pow_dvd_pow_of_dvd W.X_pow_three_dvd_formalW 3 rw [← pow_mul] at h norm_num at h exact h private theorem coeff_formalW_sq_of_lt {n : ℕ} (hn : n < 6) : coeff n (W.formalW ^ 2) = 0 := X_pow_dvd_iff.mp W.X_pow_six_dvd_formalW_sq n hn private theorem coeff_formalW_cube_of_lt {n : ℕ} (hn : n < 9) : coeff n (W.formalW ^ 3) = 0 := X_pow_dvd_iff.mp W.X_pow_nine_dvd_formalW_cube n hn private theorem coeff_X_mul_formalW' (n : ℕ) (φ : R⟦X⟧) : coeff n ((X : R⟦X⟧) * φ) = if 1 ≤ n then coeff (n - 1) φ else 0 := by rw [← pow_one (X : R⟦X⟧), coeff_X_pow_mul'] private theorem coeff_formalW_step (n : ℕ) : coeff n W.formalW = coeff n ((X : R⟦X⟧) ^ 3) + W.a₁ * coeff n ((X : R⟦X⟧) * W.formalW) + W.a₂ * coeff n ((X : R⟦X⟧) ^ 2 * W.formalW) + W.a₃ * coeff n (W.formalW ^ 2) + W.a₄ * coeff n ((X : R⟦X⟧) * W.formalW ^ 2) + W.a₆ * coeff n (W.formalW ^ 3) := by conv_lhs => rw [W.formalW_eq_wSubst] unfold wSubst simp only [map_add, coeff_C_mul] theorem coeff_formalW_three : coeff 3 W.formalW = 1 := by have h := W.coeff_formalW_step 3 have e0 : coeff 3 ((X : R⟦X⟧) ^ 3) = (1 : R) := by rw [coeff_X_pow]; norm_num have e1 : coeff 3 ((X : R⟦X⟧) * W.formalW) = 0 := by rw [coeff_X_mul_formalW'] norm_num [W.coeff_formalW_two] have e2 : coeff 3 ((X : R⟦X⟧) ^ 2 * W.formalW) = 0 := by rw [coeff_X_pow_mul'] norm_num [W.coeff_formalW_one] have e3 : coeff 3 (W.formalW ^ 2) = 0 := W.coeff_formalW_sq_of_lt (by norm_num) have e4 : coeff 3 ((X : R⟦X⟧) * W.formalW ^ 2) = 0 := by rw [coeff_X_mul_formalW'] norm_num [W.coeff_formalW_sq_of_lt (show (2 : ℕ) < 6 by norm_num)] have e5 : coeff 3 (W.formalW ^ 3) = 0 := W.coeff_formalW_cube_of_lt (by norm_num) rw [h, e0, e1, e2, e3, e4, e5] ring theorem coeff_formalW_four : coeff 4 W.formalW = W.a₁ := by have h := W.coeff_formalW_step 4 have e0 : coeff 4 ((X : R⟦X⟧) ^ 3) = (0 : R) := by rw [coeff_X_pow]; norm_num have e1 : coeff 4 ((X : R⟦X⟧) * W.formalW) = 1 := by rw [coeff_X_mul_formalW'] norm_num [W.coeff_formalW_three] have e2 : coeff 4 ((X : R⟦X⟧) ^ 2 * W.formalW) = 0 := by rw [coeff_X_pow_mul'] norm_num [W.coeff_formalW_two] have e3 : coeff 4 (W.formalW ^ 2) = 0 := W.coeff_formalW_sq_of_lt (by norm_num) have e4 : coeff 4 ((X : R⟦X⟧) * W.formalW ^ 2) = 0 := by rw [coeff_X_mul_formalW'] norm_num [W.coeff_formalW_sq_of_lt (show (3 : ℕ) < 6 by norm_num)] have e5 : coeff 4 (W.formalW ^ 3) = 0 := W.coeff_formalW_cube_of_lt (by norm_num) rw [h, e0, e1, e2, e3, e4, e5] ring theorem coeff_formalW_five : coeff 5 W.formalW = W.a₁ ^ 2 + W.a₂ := by have h := W.coeff_formalW_step 5 have e0 : coeff 5 ((X : R⟦X⟧) ^ 3) = (0 : R) := by rw [coeff_X_pow]; norm_num have e1 : coeff 5 ((X : R⟦X⟧) * W.formalW) = W.a₁ := by rw [coeff_X_mul_formalW'] norm_num [W.coeff_formalW_four] have e2 : coeff 5 ((X : R⟦X⟧) ^ 2 * W.formalW) = 1 := by rw [coeff_X_pow_mul'] norm_num [W.coeff_formalW_three] have e3 : coeff 5 (W.formalW ^ 2) = 0 := W.coeff_formalW_sq_of_lt (by norm_num) have e4 : coeff 5 ((X : R⟦X⟧) * W.formalW ^ 2) = 0 := by rw [coeff_X_mul_formalW'] norm_num [W.coeff_formalW_sq_of_lt (show (4 : ℕ) < 6 by norm_num)] have e5 : coeff 5 (W.formalW ^ 3) = 0 := W.coeff_formalW_cube_of_lt (by norm_num) rw [h, e0, e1, e2, e3, e4, e5] ring private theorem coeff_formalW_sq_six : coeff 6 (W.formalW ^ 2) = (1 : R) := by have h := PowerSeries.coeff_add_mul_of_X_pow_dvd W.X_pow_three_dvd_formalW W.X_pow_three_dvd_formalW norm_num [W.coeff_formalW_three] at h rw [pow_two, h] theorem coeff_formalW_six : coeff 6 W.formalW = W.a₁ ^ 3 + 2 * W.a₁ * W.a₂ + W.a₃ := by have h := W.coeff_formalW_step 6 have e0 : coeff 6 ((X : R⟦X⟧) ^ 3) = (0 : R) := by rw [coeff_X_pow]; norm_num have e1 : coeff 6 ((X : R⟦X⟧) * W.formalW) = W.a₁ ^ 2 + W.a₂ := by rw [coeff_X_mul_formalW'] norm_num [W.coeff_formalW_five] have e2 : coeff 6 ((X : R⟦X⟧) ^ 2 * W.formalW) = W.a₁ := by rw [coeff_X_pow_mul'] norm_num [W.coeff_formalW_four] have e3 : coeff 6 (W.formalW ^ 2) = 1 := W.coeff_formalW_sq_six have e4 : coeff 6 ((X : R⟦X⟧) * W.formalW ^ 2) = 0 := by rw [coeff_X_mul_formalW'] norm_num [W.coeff_formalW_sq_of_lt (show (5 : ℕ) < 6 by norm_num)] have e5 : coeff 6 (W.formalW ^ 3) = 0 := W.coeff_formalW_cube_of_lt (by norm_num) rw [h, e0, e1, e2, e3, e4, e5] ring private theorem coeff_formalW_sq_seven : coeff 7 (W.formalW ^ 2) = 2 * W.a₁ := by have h := PowerSeries.coeff_add_succ_mul_of_X_pow_dvd W.X_pow_three_dvd_formalW W.X_pow_three_dvd_formalW norm_num [W.coeff_formalW_three, W.coeff_formalW_four] at h rw [pow_two, h] ring theorem coeff_formalW_seven : coeff 7 W.formalW = W.a₁ ^ 4 + 3 * W.a₁ ^ 2 * W.a₂ + 3 * W.a₁ * W.a₃ + W.a₂ ^ 2 + W.a₄ := by have h := W.coeff_formalW_step 7 have e0 : coeff 7 ((X : R⟦X⟧) ^ 3) = (0 : R) := by rw [coeff_X_pow]; norm_num have e1 : coeff 7 ((X : R⟦X⟧) * W.formalW) = W.a₁ ^ 3 + 2 * W.a₁ * W.a₂ + W.a₃ := by rw [coeff_X_mul_formalW'] norm_num [W.coeff_formalW_six] have e2 : coeff 7 ((X : R⟦X⟧) ^ 2 * W.formalW) = W.a₁ ^ 2 + W.a₂ := by rw [coeff_X_pow_mul'] norm_num [W.coeff_formalW_five] have e3 : coeff 7 (W.formalW ^ 2) = 2 * W.a₁ := W.coeff_formalW_sq_seven have e4 : coeff 7 ((X : R⟦X⟧) * W.formalW ^ 2) = 1 := by rw [coeff_X_mul_formalW'] norm_num [W.coeff_formalW_sq_six] have e5 : coeff 7 (W.formalW ^ 3) = 0 := W.coeff_formalW_cube_of_lt (by norm_num) rw [h, e0, e1, e2, e3, e4, e5] ring theorem exists_eq_X_pow_three_mul : ∃ u : R⟦X⟧, constantCoeff u = 1 ∧ W.formalW = (X : R⟦X⟧) ^ 3 * u := by obtain ⟨u, hu⟩ := W.X_pow_three_dvd_formalW refine ⟨u, ?_, hu⟩ have h3 : coeff 3 ((X : R⟦X⟧) ^ 3 * u) = constantCoeff u := by rw [coeff_X_pow_mul'] simp rw [← h3, ← hu] exact W.coeff_formalW_three theorem order_formalW [Nontrivial R] : (W.formalW).order = (3 : ℕ) := by rw [PowerSeries.order_eq_nat] refine ⟨?_, fun i hi => X_pow_dvd_iff.mp W.X_pow_three_dvd_formalW i hi⟩ rw [W.coeff_formalW_three] exact one_ne_zero end WeierstrassCurve end noncomputable section open PowerSeries MvPowerSeries namespace WeierstrassCurve variable {R : Type*} [CommRing R] (W : WeierstrassCurve R) noncomputable def fgW₁ : MvPowerSeries (Fin 2) R := PowerSeries.subst (MvPowerSeries.X (0 : Fin 2)) W.formalW noncomputable def fgSlope : MvPowerSeries (Fin 2) R := fun d => PowerSeries.coeff (d 0 + d 1 + 1) W.formalW noncomputable def fgNu : MvPowerSeries (Fin 2) R := W.fgW₁ - W.fgSlope * MvPowerSeries.X (0 : Fin 2) noncomputable def fgZ3Denom : MvPowerSeries (Fin 2) R := 1 + MvPowerSeries.C W.a₂ * W.fgSlope + MvPowerSeries.C W.a₄ * W.fgSlope ^ 2 + MvPowerSeries.C W.a₆ * W.fgSlope ^ 3 noncomputable def fgZ3Num : MvPowerSeries (Fin 2) R := MvPowerSeries.C W.a₁ * W.fgSlope + MvPowerSeries.C W.a₃ * W.fgSlope ^ 2 - MvPowerSeries.C W.a₂ * W.fgNu - MvPowerSeries.C (2 * W.a₄) * (W.fgSlope * W.fgNu) - MvPowerSeries.C (3 * W.a₆) * (W.fgSlope ^ 2 * W.fgNu) noncomputable def fgZ3 : MvPowerSeries (Fin 2) R := - MvPowerSeries.X (0 : Fin 2) - MvPowerSeries.X (1 : Fin 2) + W.fgZ3Num * MvPowerSeries.invOfUnit W.fgZ3Denom (1 : Rˣ) noncomputable def fgInvDenom : R⟦X⟧ := 1 - PowerSeries.C W.a₁ * PowerSeries.X - PowerSeries.C W.a₃ * W.formalW noncomputable def fgInv : R⟦X⟧ := - PowerSeries.X * PowerSeries.invOfUnit W.fgInvDenom (1 : Rˣ) noncomputable def formalGroupLaw : MvPowerSeries (Fin 2) R := PowerSeries.subst W.fgZ3 W.fgInv theorem coeff_fgSlope (d : Fin 2 →₀ ℕ) : MvPowerSeries.coeff d W.fgSlope = PowerSeries.coeff (d 0 + d 1 + 1) W.formalW := rfl theorem constantCoeff_fgSlope : MvPowerSeries.constantCoeff (σ := Fin 2) W.fgSlope = 0 := by have h := W.coeff_fgSlope 0 simpa [MvPowerSeries.coeff_zero_eq_constantCoeff, W.coeff_formalW_one] using h end WeierstrassCurve end noncomputable section open PowerSeries MvPowerSeries namespace WeierstrassCurve variable {R : Type*} [CommRing R] (W : WeierstrassCurve R) theorem degree_fin2 (d : Fin 2 →₀ ℕ) : Finsupp.degree d = d 0 + d 1 := by simp [Finsupp.degree_eq_sum, Fin.sum_univ_two] theorem two_le_order_mul_left {f g : MvPowerSeries (Fin 2) R} (h : (2 : ℕ∞) ≤ f.order) : (2 : ℕ∞) ≤ (f * g).order := le_trans (le_trans h le_self_add) MvPowerSeries.le_order_mul theorem constantCoeff_fgNu : MvPowerSeries.constantCoeff (σ := Fin 2) W.fgNu = 0 := by unfold fgNu fgW₁ rw [map_sub, map_mul, PowerSeries.constantCoeff_subst_eq_zero (by simp [MvPowerSeries.constantCoeff_X]) W.formalW W.constantCoeff_formalW, MvPowerSeries.constantCoeff_X, mul_zero, sub_zero] theorem constantCoeff_fgZ3Num : MvPowerSeries.constantCoeff (σ := Fin 2) W.fgZ3Num = 0 := by unfold fgZ3Num simp [map_add, map_sub, map_mul, MvPowerSeries.constantCoeff_C, W.constantCoeff_fgSlope, W.constantCoeff_fgNu] theorem constantCoeff_fgZ3 : MvPowerSeries.constantCoeff (σ := Fin 2) W.fgZ3 = 0 := by unfold fgZ3 simp [map_add, map_sub, map_neg, map_mul, MvPowerSeries.constantCoeff_X, W.constantCoeff_fgZ3Num] theorem hasSubst_fgZ3 : PowerSeries.HasSubst W.fgZ3 := PowerSeries.HasSubst.of_constantCoeff_zero W.constantCoeff_fgZ3 theorem hasSubst_X0 : PowerSeries.HasSubst (MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) R) := PowerSeries.HasSubst.of_constantCoeff_zero (by simp [MvPowerSeries.constantCoeff_X]) theorem constantCoeff_fgInv : PowerSeries.constantCoeff W.fgInv = 0 := by unfold fgInv simp [map_mul, map_neg, PowerSeries.constantCoeff_X] theorem coeff_one_fgInv : PowerSeries.coeff 1 W.fgInv = -1 := by unfold fgInv rw [neg_mul, map_neg, PowerSeries.coeff_succ_X_mul, PowerSeries.coeff_zero_eq_constantCoeff, PowerSeries.constantCoeff_invOfUnit] simp theorem coeff_fgSlope_eq_zero_of_le_one (d : Fin 2 →₀ ℕ) (hd : d 0 + d 1 ≤ 1) : MvPowerSeries.coeff d W.fgSlope = 0 := by rw [W.coeff_fgSlope] interval_cases h : (d 0 + d 1) · simpa using W.coeff_formalW_one · simpa using W.coeff_formalW_two theorem two_le_order_fgSlope : (2 : ℕ∞) ≤ W.fgSlope.order := by apply MvPowerSeries.le_order intro d hd apply W.coeff_fgSlope_eq_zero_of_le_one have hd' : Finsupp.degree d < 2 := by exact_mod_cast hd rw [degree_fin2 d] at hd' omega theorem two_le_order_fgW1 : (2 : ℕ∞) ≤ W.fgW₁.order := by apply MvPowerSeries.le_order intro d hd have hdeg : d 0 + d 1 ≤ 1 := by have h2 : Finsupp.degree d < 2 := by exact_mod_cast hd rw [degree_fin2 d] at h2; omega unfold fgW₁ rw [PowerSeries.coeff_subst hasSubst_X0, finsum_eq_single _ (d 0) (fun n hn => by rw [MvPowerSeries.coeff_X_pow, if_neg (fun h => hn (by have := congrFun (congrArg DFunLike.coe h) 0 simp at this; omega)), smul_zero]), MvPowerSeries.coeff_X_pow] by_cases hd1 : d 1 = 0 · have hdeq : d = Finsupp.single 0 (d 0) := by ext j; fin_cases j <;> simp [hd1] rw [if_pos hdeq] have : d 0 ≤ 1 := by omega interval_cases hh : (d 0) · simp [W.coeff_formalW_zero] · simp [W.coeff_formalW_one] · rw [if_neg (fun h => hd1 (by have := congrFun (congrArg DFunLike.coe h) 1 simpa [Finsupp.single_apply] using this)), smul_zero] theorem two_le_order_fgNu : (2 : ℕ∞) ≤ W.fgNu.order := by apply MvPowerSeries.le_order intro d hd unfold fgNu rw [map_sub, MvPowerSeries.coeff_of_lt_order (lt_of_lt_of_le hd W.two_le_order_fgW1), MvPowerSeries.coeff_of_lt_order (lt_of_lt_of_le hd (two_le_order_mul_left W.two_le_order_fgSlope)), sub_zero] theorem two_le_order_fgZ3Num : (2 : ℕ∞) ≤ W.fgZ3Num.order := by apply MvPowerSeries.le_order intro d hd have oS := W.two_le_order_fgSlope have oN := W.two_le_order_fgNu have oS2 : (2 : ℕ∞) ≤ (W.fgSlope ^ 2).order := by rw [pow_two]; exact two_le_order_mul_left oS have e : ∀ P : MvPowerSeries (Fin 2) R, (2 : ℕ∞) ≤ P.order → MvPowerSeries.coeff d P = 0 := fun P hP => MvPowerSeries.coeff_of_lt_order (lt_of_lt_of_le hd hP) unfold fgZ3Num simp only [map_add, map_sub, MvPowerSeries.coeff_C_mul, e _ oS, e _ oS2, e _ oN, e _ (two_le_order_mul_left oS), e _ (two_le_order_mul_left oS2), mul_zero, add_zero, sub_zero] theorem coeff_single_fgZ3 (i : Fin 2) : MvPowerSeries.coeff (Finsupp.single i 1) W.fgZ3 = -1 := by unfold fgZ3 have hprod : MvPowerSeries.coeff (Finsupp.single i 1) (W.fgZ3Num * MvPowerSeries.invOfUnit W.fgZ3Denom 1) = 0 := by apply MvPowerSeries.coeff_of_lt_order calc ((Finsupp.degree (Finsupp.single i 1) : ℕ) : ℕ∞) = (1 : ℕ∞) := by simp [Finsupp.degree_single] _ < (2 : ℕ∞) := by norm_num _ ≤ _ := two_le_order_mul_left W.two_le_order_fgZ3Num rw [map_add, map_sub, map_neg, hprod, add_zero] fin_cases i <;> simp [MvPowerSeries.coeff_X, Finsupp.single_eq_single_iff] theorem coeff_fgZ3_pow_eq_zero (d : Fin 2 →₀ ℕ) (hd : Finsupp.degree d ≤ 1) {n : ℕ} (hn : 2 ≤ n) : MvPowerSeries.coeff d (W.fgZ3 ^ n) = 0 := by apply MvPowerSeries.coeff_of_lt_order calc ((Finsupp.degree d : ℕ) : ℕ∞) ≤ (1 : ℕ∞) := by exact_mod_cast hd _ < (n : ℕ∞) := by exact_mod_cast hn _ ≤ (W.fgZ3 ^ n).order := MvPowerSeries.le_order_pow_of_constantCoeff_eq_zero n W.constantCoeff_fgZ3 theorem constantCoeff_formalGroupLaw : MvPowerSeries.constantCoeff (σ := Fin 2) W.formalGroupLaw = 0 := by unfold formalGroupLaw rw [PowerSeries.constantCoeff_subst W.hasSubst_fgZ3] rw [finsum_eq_single _ 0 (fun d hd => by rw [map_pow, W.constantCoeff_fgZ3, zero_pow hd, smul_zero])] rw [map_pow, pow_zero] simp [W.constantCoeff_fgInv] theorem coeff_single_formalGroupLaw (i : Fin 2) : MvPowerSeries.coeff (Finsupp.single i 1) W.formalGroupLaw = 1 := by unfold formalGroupLaw rw [PowerSeries.coeff_subst W.hasSubst_fgZ3] rw [finsum_eq_single _ 1 (fun d hd => by rcases Nat.lt_or_ge d 2 with h2 | h2 · interval_cases d · simp [pow_zero, MvPowerSeries.coeff_one, Finsupp.single_eq_zero] · exact absurd rfl hd · rw [W.coeff_fgZ3_pow_eq_zero _ (by simp [Finsupp.degree_single]) h2, smul_zero])] rw [pow_one, W.coeff_one_fgInv, W.coeff_single_fgZ3] simp theorem coeff_zero_formalGroupLaw : MvPowerSeries.coeff (Finsupp.single 0 1) W.formalGroupLaw = 1 := W.coeff_single_formalGroupLaw 0 theorem coeff_one_formalGroupLaw : MvPowerSeries.coeff (Finsupp.single 1 1) W.formalGroupLaw = 1 := W.coeff_single_formalGroupLaw 1 end WeierstrassCurve end noncomputable section open PowerSeries MvPowerSeries namespace WeierstrassCurve variable {R : Type*} [CommRing R] (W : WeierstrassCurve R) noncomputable def fgZ3NumFixed : MvPowerSeries (Fin 2) R := - ( MvPowerSeries.C W.a₁ * W.fgSlope + MvPowerSeries.C W.a₃ * W.fgSlope ^ 2 + MvPowerSeries.C W.a₂ * W.fgNu + MvPowerSeries.C (2 * W.a₄) * (W.fgSlope * W.fgNu) + MvPowerSeries.C (3 * W.a₆) * (W.fgSlope ^ 2 * W.fgNu) ) noncomputable def fgZ3Fixed : MvPowerSeries (Fin 2) R := - MvPowerSeries.X (0 : Fin 2) - MvPowerSeries.X (1 : Fin 2) + W.fgZ3NumFixed * MvPowerSeries.invOfUnit W.fgZ3Denom (1 : Rˣ) noncomputable def formalGroupLawFixed : MvPowerSeries (Fin 2) R := PowerSeries.subst W.fgZ3Fixed W.fgInv theorem constantCoeff_fgZ3NumFixed : MvPowerSeries.constantCoeff (σ := Fin 2) W.fgZ3NumFixed = 0 := by unfold fgZ3NumFixed simp [map_neg, map_add, map_mul, map_pow, MvPowerSeries.constantCoeff_C, W.constantCoeff_fgSlope, W.constantCoeff_fgNu] theorem two_le_order_fgZ3NumFixed : (2 : ℕ∞) ≤ W.fgZ3NumFixed.order := by apply MvPowerSeries.le_order intro d hd have oS := W.two_le_order_fgSlope have oN := W.two_le_order_fgNu have oS2 : (2 : ℕ∞) ≤ (W.fgSlope ^ 2).order := by rw [pow_two]; exact two_le_order_mul_left oS have e : ∀ P : MvPowerSeries (Fin 2) R, (2 : ℕ∞) ≤ P.order → MvPowerSeries.coeff d P = 0 := fun P hP => MvPowerSeries.coeff_of_lt_order (lt_of_lt_of_le hd hP) unfold fgZ3NumFixed rw [map_neg, neg_eq_zero] simp only [map_add, MvPowerSeries.coeff_C_mul, e _ oS, e _ oS2, e _ oN, e _ (two_le_order_mul_left oS), e _ (two_le_order_mul_left oS2), mul_zero, add_zero] theorem constantCoeff_fgZ3Fixed : MvPowerSeries.constantCoeff (σ := Fin 2) W.fgZ3Fixed = 0 := by unfold fgZ3Fixed simp [map_add, map_sub, map_neg, map_mul, MvPowerSeries.constantCoeff_X, W.constantCoeff_fgZ3NumFixed] theorem hasSubst_fgZ3Fixed : PowerSeries.HasSubst W.fgZ3Fixed := PowerSeries.HasSubst.of_constantCoeff_zero W.constantCoeff_fgZ3Fixed theorem coeff_single_fgZ3Fixed (i : Fin 2) : MvPowerSeries.coeff (Finsupp.single i 1) W.fgZ3Fixed = -1 := by unfold fgZ3Fixed have hprod : MvPowerSeries.coeff (Finsupp.single i 1) (W.fgZ3NumFixed * MvPowerSeries.invOfUnit W.fgZ3Denom 1) = 0 := by apply MvPowerSeries.coeff_of_lt_order calc ((Finsupp.degree (Finsupp.single i 1) : ℕ) : ℕ∞) = (1 : ℕ∞) := by simp [Finsupp.degree_single] _ < (2 : ℕ∞) := by norm_num _ ≤ _ := two_le_order_mul_left W.two_le_order_fgZ3NumFixed rw [map_add, map_sub, map_neg, hprod, add_zero] fin_cases i <;> simp [MvPowerSeries.coeff_X, Finsupp.single_eq_single_iff] theorem coeff_fgZ3Fixed_pow_eq_zero (d : Fin 2 →₀ ℕ) (hd : Finsupp.degree d ≤ 1) {n : ℕ} (hn : 2 ≤ n) : MvPowerSeries.coeff d (W.fgZ3Fixed ^ n) = 0 := by apply MvPowerSeries.coeff_of_lt_order calc ((Finsupp.degree d : ℕ) : ℕ∞) ≤ (1 : ℕ∞) := by exact_mod_cast hd _ < (n : ℕ∞) := by exact_mod_cast hn _ ≤ (W.fgZ3Fixed ^ n).order := MvPowerSeries.le_order_pow_of_constantCoeff_eq_zero n W.constantCoeff_fgZ3Fixed theorem constantCoeff_formalGroupLawFixed : MvPowerSeries.constantCoeff (σ := Fin 2) W.formalGroupLawFixed = 0 := by unfold formalGroupLawFixed rw [PowerSeries.constantCoeff_subst W.hasSubst_fgZ3Fixed] rw [finsum_eq_single _ 0 (fun d hd => by rw [map_pow, W.constantCoeff_fgZ3Fixed, zero_pow hd, smul_zero])] rw [map_pow, pow_zero] simp [W.constantCoeff_fgInv] theorem coeff_single_formalGroupLawFixed (i : Fin 2) : MvPowerSeries.coeff (Finsupp.single i 1) W.formalGroupLawFixed = 1 := by unfold formalGroupLawFixed rw [PowerSeries.coeff_subst W.hasSubst_fgZ3Fixed] rw [finsum_eq_single _ 1 (fun d hd => by rcases Nat.lt_or_ge d 2 with h2 | h2 · interval_cases d · simp [pow_zero, MvPowerSeries.coeff_one, Finsupp.single_eq_zero] · exact absurd rfl hd · rw [W.coeff_fgZ3Fixed_pow_eq_zero _ (by simp [Finsupp.degree_single]) h2, smul_zero])] rw [pow_one, W.coeff_one_fgInv, W.coeff_single_fgZ3Fixed] simp theorem coeff_zero_formalGroupLawFixed : MvPowerSeries.coeff (Finsupp.single 0 1) W.formalGroupLawFixed = 1 := W.coeff_single_formalGroupLawFixed 0 theorem coeff_one_formalGroupLawFixed : MvPowerSeries.coeff (Finsupp.single 1 1) W.formalGroupLawFixed = 1 := W.coeff_single_formalGroupLawFixed 1 theorem coeff_two_fgInv : PowerSeries.coeff 2 W.fgInv = - W.a₁ := by have hden0 : PowerSeries.constantCoeff W.fgInvDenom = 1 := by unfold fgInvDenom simp [map_sub, map_mul, PowerSeries.constantCoeff_X, W.constantCoeff_formalW] have hden1 : PowerSeries.coeff 1 W.fgInvDenom = - W.a₁ := by unfold fgInvDenom simp [map_sub, PowerSeries.coeff_C_mul, W.coeff_formalW_one] have hc0den : PowerSeries.coeff 0 W.fgInvDenom = 1 := by rw [PowerSeries.coeff_zero_eq_constantCoeff]; exact hden0 have hmul : W.fgInv * W.fgInvDenom = - PowerSeries.X := by unfold fgInv rw [mul_assoc, mul_comm (PowerSeries.invOfUnit W.fgInvDenom 1) W.fgInvDenom, PowerSeries.mul_invOfUnit W.fgInvDenom 1 (by rw [hden0]; simp), mul_one] have hc0 : PowerSeries.coeff 0 W.fgInv = 0 := by rw [PowerSeries.coeff_zero_eq_constantCoeff]; exact W.constantCoeff_fgInv have key := congrArg (PowerSeries.coeff 2) hmul rw [PowerSeries.coeff_mul, Finset.Nat.sum_antidiagonal_eq_sum_range_succ (fun i j => PowerSeries.coeff i W.fgInv * PowerSeries.coeff j W.fgInvDenom)] at key simp only [Finset.sum_range_succ, Finset.sum_range_zero, zero_add, Nat.sub_self, Nat.sub_zero] at key rw [hc0, W.coeff_one_fgInv, hden1, hc0den, show PowerSeries.coeff (R := R) 2 (- PowerSeries.X) = 0 by simp [PowerSeries.coeff_X]] at key linear_combination key theorem three_le_order_fgW1 : (3 : ℕ∞) ≤ W.fgW₁.order := by apply MvPowerSeries.le_order intro d hd have hdeg : d 0 + d 1 ≤ 2 := by have h2 : Finsupp.degree d < 3 := by exact_mod_cast hd rw [degree_fin2 d] at h2; omega unfold fgW₁ rw [PowerSeries.coeff_subst hasSubst_X0, finsum_eq_single _ (d 0) (fun n hn => by rw [MvPowerSeries.coeff_X_pow, if_neg (fun h => hn (by have := congrFun (congrArg DFunLike.coe h) 0 simp at this; omega)), smul_zero]), MvPowerSeries.coeff_X_pow] by_cases hd1 : d 1 = 0 · have hdeq : d = Finsupp.single 0 (d 0) := by ext j; fin_cases j <;> simp [hd1] rw [if_pos hdeq] have : d 0 ≤ 2 := by omega interval_cases hh : (d 0) · simp [W.coeff_formalW_zero] · simp [W.coeff_formalW_one] · simp [W.coeff_formalW_two] · rw [if_neg (fun h => hd1 (by have := congrFun (congrArg DFunLike.coe h) 1 simpa [Finsupp.single_apply] using this)), smul_zero] theorem three_le_order_fgNu : (3 : ℕ∞) ≤ W.fgNu.order := by apply MvPowerSeries.le_order intro d hd have hX0 : (1 : ℕ∞) ≤ (MvPowerSeries.X (0 : Fin 2) : MvPowerSeries (Fin 2) R).order := by apply MvPowerSeries.le_order intro e he rw [MvPowerSeries.coeff_X, if_neg (fun hcon => by rw [hcon, Finsupp.degree_single] at he exact absurd he (by norm_num))] have hSX : (3 : ℕ∞) ≤ (W.fgSlope * MvPowerSeries.X (0 : Fin 2)).order := by calc (3 : ℕ∞) = 2 + 1 := by norm_num _ ≤ W.fgSlope.order + (MvPowerSeries.X (0 : Fin 2)).order := add_le_add W.two_le_order_fgSlope hX0 _ ≤ _ := MvPowerSeries.le_order_mul unfold fgNu rw [map_sub, MvPowerSeries.coeff_of_lt_order (lt_of_lt_of_le hd W.three_le_order_fgW1), MvPowerSeries.coeff_of_lt_order (lt_of_lt_of_le hd hSX), sub_zero] theorem eq_zero_of_degree_lt_one (e : Fin 2 →₀ ℕ) (he : (↑(Finsupp.degree e) : ℕ∞) < 1) : e = 0 := by have h : e 0 + e 1 = 0 := by have h1 : Finsupp.degree e < 1 := by exact_mod_cast he rw [degree_fin2] at h1; omega have h0 : e 0 = 0 := by omega have h1 : e 1 = 0 := by omega ext j; fin_cases j · simpa using h0 · simpa using h1 theorem coeff_sq_mul_invD {Num : MvPowerSeries (Fin 2) R} (hNum : (2 : ℕ∞) ≤ Num.order) (i : Fin 2) : MvPowerSeries.coeff (Finsupp.single i 2) (Num * MvPowerSeries.invOfUnit W.fgZ3Denom 1) = MvPowerSeries.coeff (Finsupp.single i 2) Num := by set D := MvPowerSeries.invOfUnit W.fgZ3Denom (1 : Rˣ) with hDdef have hD0 : MvPowerSeries.constantCoeff (σ := Fin 2) D = 1 := by rw [hDdef, MvPowerSeries.constantCoeff_invOfUnit]; simp have hDm1 : (1 : ℕ∞) ≤ (D - 1).order := by apply MvPowerSeries.le_order intro e he rw [eq_zero_of_degree_lt_one e he, MvPowerSeries.coeff_zero_eq_constantCoeff, map_sub, hD0, map_one, sub_self] have hcross : MvPowerSeries.coeff (Finsupp.single i 2) (Num * (D - 1)) = 0 := by apply MvPowerSeries.coeff_of_lt_order calc ((Finsupp.degree (Finsupp.single i 2) : ℕ) : ℕ∞) = 2 := by simp [Finsupp.degree_single] _ < 3 := by norm_num _ ≤ Num.order + (D - 1).order := by calc (3 : ℕ∞) ≤ 2 + 1 := by norm_num _ ≤ Num.order + (D - 1).order := add_le_add hNum hDm1 _ ≤ _ := MvPowerSeries.le_order_mul have hsplit : Num * D = Num + Num * (D - 1) := by ring rw [hsplit, map_add, hcross, add_zero] theorem coeff_sq_fgZ3NumFixed (i : Fin 2) : MvPowerSeries.coeff (Finsupp.single i 2) W.fgZ3NumFixed = - W.a₁ := by have ez : ∀ P : MvPowerSeries (Fin 2) R, (3 : ℕ∞) ≤ P.order → MvPowerSeries.coeff (Finsupp.single i 2) P = 0 := by intro P hP apply MvPowerSeries.coeff_of_lt_order calc ((Finsupp.degree (Finsupp.single i 2) : ℕ) : ℕ∞) = 2 := by simp [Finsupp.degree_single] _ < 3 := by norm_num _ ≤ P.order := hP have oS := W.two_le_order_fgSlope have oN := W.three_le_order_fgNu have hsl : MvPowerSeries.coeff (Finsupp.single i 2) W.fgSlope = 1 := by rw [W.coeff_fgSlope] have h3 : (Finsupp.single i 2) 0 + (Finsupp.single i 2) 1 + 1 = 3 := by fin_cases i <;> simp rw [h3]; exact W.coeff_formalW_three have hsl2 : (3 : ℕ∞) ≤ (W.fgSlope ^ 2).order := by rw [pow_two] exact le_trans (by calc (3 : ℕ∞) ≤ 2 + 2 := by norm_num _ ≤ W.fgSlope.order + W.fgSlope.order := add_le_add oS oS) MvPowerSeries.le_order_mul have hslN : (3 : ℕ∞) ≤ (W.fgSlope * W.fgNu).order := le_trans (by calc (3 : ℕ∞) ≤ 2 + 3 := by norm_num _ ≤ W.fgSlope.order + W.fgNu.order := add_le_add oS oN) MvPowerSeries.le_order_mul have hsl2N : (3 : ℕ∞) ≤ (W.fgSlope ^ 2 * W.fgNu).order := le_trans (by calc (3 : ℕ∞) ≤ 3 + 3 := by norm_num _ ≤ (W.fgSlope ^ 2).order + W.fgNu.order := add_le_add hsl2 oN) MvPowerSeries.le_order_mul unfold fgZ3NumFixed rw [map_neg, map_add, map_add, map_add, map_add, MvPowerSeries.coeff_C_mul, MvPowerSeries.coeff_C_mul, MvPowerSeries.coeff_C_mul, MvPowerSeries.coeff_C_mul, MvPowerSeries.coeff_C_mul, hsl, ez _ hsl2, ez _ oN, ez _ hslN, ez _ hsl2N] ring theorem coeff_sq_fgZ3Fixed (i : Fin 2) : MvPowerSeries.coeff (Finsupp.single i 2) W.fgZ3Fixed = - W.a₁ := by have hlin : MvPowerSeries.coeff (Finsupp.single i 2) ((- MvPowerSeries.X (0 : Fin 2) - MvPowerSeries.X (1 : Fin 2)) : MvPowerSeries (Fin 2) R) = 0 := by simp [map_sub, map_neg, MvPowerSeries.coeff_X, Finsupp.single_eq_single_iff] unfold fgZ3Fixed rw [map_add, hlin, zero_add, W.coeff_sq_mul_invD W.two_le_order_fgZ3NumFixed, W.coeff_sq_fgZ3NumFixed] theorem coeff_pow_lt {g : MvPowerSeries (Fin 2) R} (hg : MvPowerSeries.constantCoeff (σ := Fin 2) g = 0) (d : Fin 2 →₀ ℕ) {n : ℕ} (hlt : Finsupp.degree d < n) : MvPowerSeries.coeff d (g ^ n) = 0 := by apply MvPowerSeries.coeff_of_lt_order calc ((Finsupp.degree d : ℕ) : ℕ∞) < (n : ℕ∞) := by exact_mod_cast hlt _ ≤ (g ^ n).order := MvPowerSeries.le_order_pow_of_constantCoeff_eq_zero n hg theorem coeff_sq_pow2 {H : MvPowerSeries (Fin 2) R} (hH : (2 : ℕ∞) ≤ H.order) (i : Fin 2) : MvPowerSeries.coeff (Finsupp.single i 2) ((- MvPowerSeries.X (0 : Fin 2) - MvPowerSeries.X (1 : Fin 2) + H) ^ 2) = 1 := by have hXX1 : (1 : ℕ∞) ≤ (((- MvPowerSeries.X (0 : Fin 2) - MvPowerSeries.X (1 : Fin 2)) : MvPowerSeries (Fin 2) R)).order := by apply MvPowerSeries.le_order intro e he rw [eq_zero_of_degree_lt_one e he, MvPowerSeries.coeff_zero_eq_constantCoeff] simp [map_sub, map_neg, MvPowerSeries.constantCoeff_X] have ez3 : ∀ P : MvPowerSeries (Fin 2) R, (3 : ℕ∞) ≤ P.order → MvPowerSeries.coeff (Finsupp.single i 2) P = 0 := by intro P hP apply MvPowerSeries.coeff_of_lt_order calc ((Finsupp.degree (Finsupp.single i 2) : ℕ) : ℕ∞) = 2 := by simp [Finsupp.degree_single] _ < 3 := by norm_num _ ≤ P.order := hP have expand : (- MvPowerSeries.X (0 : Fin 2) - MvPowerSeries.X (1 : Fin 2) + H) ^ 2 = (MvPowerSeries.X (0 : Fin 2) + MvPowerSeries.X (1 : Fin 2)) ^ 2 + ((- MvPowerSeries.X (0 : Fin 2) - MvPowerSeries.X (1 : Fin 2)) * H * 2 + H * H) := by ring rw [expand, map_add] have hcr : MvPowerSeries.coeff (Finsupp.single i 2) ((- MvPowerSeries.X (0 : Fin 2) - MvPowerSeries.X (1 : Fin 2)) * H * 2 + H * H) = 0 := by rw [map_add] have hHH : (3 : ℕ∞) ≤ (H * H).order := le_trans (by calc (3 : ℕ∞) ≤ 2 + 2 := by norm_num _ ≤ H.order + H.order := add_le_add hH hH) MvPowerSeries.le_order_mul have hLH : (3 : ℕ∞) ≤ ((- MvPowerSeries.X (0 : Fin 2) - MvPowerSeries.X (1 : Fin 2)) * H * 2).order := by have hbase : (3 : ℕ∞) ≤ ((- MvPowerSeries.X (0 : Fin 2) - MvPowerSeries.X (1 : Fin 2)) * H).order := le_trans (by calc (3 : ℕ∞) ≤ 1 + 2 := by norm_num _ ≤ (((- MvPowerSeries.X (0 : Fin 2) - MvPowerSeries.X (1 : Fin 2)) : MvPowerSeries (Fin 2) R)).order + H.order := add_le_add hXX1 hH) MvPowerSeries.le_order_mul exact le_trans hbase (le_trans le_self_add MvPowerSeries.le_order_mul) rw [ez3 _ hLH, ez3 _ hHH, add_zero] rw [hcr, add_zero] have hexp2 : (MvPowerSeries.X (0 : Fin 2) + MvPowerSeries.X (1 : Fin 2) : MvPowerSeries (Fin 2) R) ^ 2 = MvPowerSeries.X 0 ^ 2 + MvPowerSeries.X 0 * MvPowerSeries.X 1 * 2 + MvPowerSeries.X 1 ^ 2 := by ring have hmono : (MvPowerSeries.X (0 : Fin 2) * MvPowerSeries.X 1 : MvPowerSeries (Fin 2) R) = MvPowerSeries.monomial (Finsupp.single 0 1 + Finsupp.single 1 1) 1 := by rw [MvPowerSeries.X_def, MvPowerSeries.X_def, MvPowerSeries.monomial_mul_monomial, mul_one] have hX0X1c : MvPowerSeries.coeff (Finsupp.single i 2) (MvPowerSeries.X (0 : Fin 2) * MvPowerSeries.X 1 : MvPowerSeries (Fin 2) R) = 0 := by rw [hmono, MvPowerSeries.coeff_monomial, if_neg] intro hcon have hc := congrFun (congrArg (DFunLike.coe) hcon.symm) i fin_cases i <;> simp [Finsupp.add_apply] at hc have hX0X1 : MvPowerSeries.coeff (Finsupp.single i 2) (MvPowerSeries.X (0 : Fin 2) * MvPowerSeries.X 1 * 2 : MvPowerSeries (Fin 2) R) = 0 := by rw [show (MvPowerSeries.X (0 : Fin 2) * MvPowerSeries.X 1 * 2 : MvPowerSeries (Fin 2) R) = MvPowerSeries.C 2 * (MvPowerSeries.X 0 * MvPowerSeries.X 1) by rw [map_ofNat]; ring, MvPowerSeries.coeff_C_mul, hX0X1c, mul_zero] rw [hexp2, map_add, map_add, hX0X1, add_zero, MvPowerSeries.coeff_X_pow, MvPowerSeries.coeff_X_pow] fin_cases i <;> simp [Finsupp.single_eq_single_iff] theorem coeff_sq_subst {g : MvPowerSeries (Fin 2) R} {i : Fin 2} (hg : PowerSeries.HasSubst g) (hgc : MvPowerSeries.constantCoeff (σ := Fin 2) g = 0) (hg1 : MvPowerSeries.coeff (Finsupp.single i 2) (g ^ 2) = 1) : MvPowerSeries.coeff (Finsupp.single i 2) (PowerSeries.subst g W.fgInv) = - MvPowerSeries.coeff (Finsupp.single i 2) g - W.a₁ := by rw [PowerSeries.coeff_subst hg, finsum_eq_finsetSum_of_support_subset _ (s := {1, 2}) (by intro n hn rw [Function.mem_support] at hn match n with | 0 => exact absurd (by rw [pow_zero, MvPowerSeries.coeff_one, if_neg (by simp [Finsupp.single_eq_zero]), smul_zero]) hn | 1 => simp | 2 => simp | (k + 3) => exact absurd (by rw [coeff_pow_lt hgc (Finsupp.single i 2) (by rw [Finsupp.degree_single]; omega), smul_zero]) hn), Finset.sum_pair (by norm_num : (1 : ℕ) ≠ 2), pow_one, W.coeff_one_fgInv, W.coeff_two_fgInv, hg1] simp only [smul_eq_mul] ring theorem coeff_sq_formalGroupLawFixed (i : Fin 2) : MvPowerSeries.coeff (Finsupp.single i 2) W.formalGroupLawFixed = 0 := by have hpow2 : MvPowerSeries.coeff (Finsupp.single i 2) (W.fgZ3Fixed ^ 2) = 1 := by have hH : (2 : ℕ∞) ≤ (W.fgZ3NumFixed * MvPowerSeries.invOfUnit W.fgZ3Denom 1).order := le_trans W.two_le_order_fgZ3NumFixed (le_trans le_self_add MvPowerSeries.le_order_mul) have := coeff_sq_pow2 hH i rwa [show (- MvPowerSeries.X (0 : Fin 2) - MvPowerSeries.X (1 : Fin 2) + W.fgZ3NumFixed * MvPowerSeries.invOfUnit W.fgZ3Denom 1) = W.fgZ3Fixed from rfl] at this unfold formalGroupLawFixed rw [W.coeff_sq_subst W.hasSubst_fgZ3Fixed W.constantCoeff_fgZ3Fixed hpow2, W.coeff_sq_fgZ3Fixed] ring end WeierstrassCurve end
Statements phrased using this module (207)
- Reduced special fibre at a supersingular point of a full-level component
ModularCurve.FullLevel.isReduced_residueField_tensorProduct_adicCompletion_quotient_of_nthSeries_eq_mul_X_pow_mul_of_pow_sub_one_eq_mul_levelModuliPackageAbs_gamma0Pow1,474 below · depth 32 - Reduced special fibre at an ordinary point
ModularCurve.FullLevel.isReduced_residueField_tensorProduct_adicCompletion_quotient_of_nthSeries_eq_mul_X_pow_of_isPrimitiveRoot_levelModuliPackageAbs_gamma0Pow1,459 below · depth 32 - Regular two-dimensional complete local ring at a supersingular point
ModularCurve.LevelModuliPackageAbs.exists_isDrinfeldBasisAdic_isRegularLocalRing_hasseParam_adicCompletion_of_forall_mem_ssJSet_gamma0Pow1,037 below · depth 32 - Height at most 2 for the formal group of an elliptic curve
WeierstrassCurve.exists_isUnit_nthSeries_eq_mul_X_pow_or_eq_mul_X_pow_mul15 below · depth 32 - Frobenius factorisation of [q]_F in characteristic q
FormalGroup.nthSeries_eq_zero_or_exists_eq_mul_X_pow_pow5 below · depth 33 - Reduced special fibre at a supersingular point, H₁ level
ModularCurve.FullLevel.Diamond.isReduced_residueField_tensorProduct_adicCompletion_quotient_of_nthSeries_eq_mul_X_pow_mul_of_pow_sub_one_eq_mul_levelModuliPackageAbs_rigidDataH1Pow1,485 below · depth 33 - Reduced special fibre at an ordinary point, H₁ level
ModularCurve.FullLevel.Diamond.isReduced_residueField_tensorProduct_adicCompletion_quotient_of_nthSeries_eq_mul_X_pow_of_isPrimitiveRoot_levelModuliPackageAbs_rigidDataH1Pow1,471 below · depth 33 - Supersingular completion of full-level moduli ring modulo 1-ζ is reduced
ModularCurve.FullLevel.isReduced_adicCompletion_quotient_span_one_sub_of_isPrimitiveRoot_of_nthSeries_eq_mul_X_pow_mul_levelModuliPackageAbs_gamma0Pow1,035 below · depth 33 - Reducedness of (1-ζ)-quotient at an ordinary point of the full-level package
ModularCurve.FullLevel.isReduced_adicCompletion_quotient_span_one_sub_of_pow_eq_one_of_nthSeries_eq_mul_X_pow_levelModuliPackageAbs_gamma0Pow1,164 below · depth 33 - Unramified descent of completed local rings at an ordinary point
ModularCurve.FullLevel.nonempty_ringEquiv_adicCompletion_quotient_adicCompletion_unramified_of_nthSeries_eq_mul_X_pow_levelModuliPackageAbs_gamma0Pow1,455 below · depth 33 - Completed local ring at a supersingular point descends to an unramified base
ModularCurve.FullLevel.nonempty_ringEquiv_adicCompletion_quotient_adicCompletion_unramified_of_nthSeries_eq_mul_X_pow_mul_levelModuliPackageAbs_gamma0Pow1,455 below · depth 33 - Hasse parameter and j-invariant at a supersingular point, Γ₀-tuple level
ModularCurve.LevelModuliPackageAbs.exists_coeff_nthSeries_sub_mul_mem_span_and_map_j0_sub_algebraMap_eq_mul_pow_of_factorsThrough_of_five_le_gamma0Pow73 below · depth 33 - Regular complete local ring at a supersingular Drinfeld-level point
ModularCurve.LevelModuliPackageAbs.exists_isDrinfeldBasisAdic_isRegularLocalRing_hasseParam_adicCompletion_of_forall_mem_ssJSet_rigidDataH1Pow1,053 below · depth 33 - Complete local ring at a supersingular point, with level relabelling
ModularCurve.LevelModuliPackageAbs.exists_isDrinfeldBasisAdic_isRegularLocalRing_hasseParam_problemAut_linearPart_adicCompletion_of_forall_mem_ssJSet_gamma0Pow1,093 below · depth 33 - Universal formal Drinfeld basis at a supersingular point
ModularCurve.LevelModuliPackageAbs.exists_reducesToOrigin_isDrinfeldBasisAdic_universal_of_factorsThrough_of_ne_two_gamma0Pow960 below · depth 33 - Existence of the commutative Weierstrass formal group law
WeierstrassCurve.exists_formalGroup_isComm_toPowerSeries_eq2 below · depth 33 - Commutative lift of widehatE₀ over W₀[[t]] with normalised q-series
WeierstrassCurve.exists_isComm_lift_powerSeries_formalGroup_coeff_nthSeries_of_ne_two29 below · depth 33 - Supersingular j-invariant forces formal height two
WeierstrassCurve.isDrinfeldBasisAdic_bot_zero_zero_of_map_j_mem_ssJSet43 below · depth 33 - Multiplication by q in characteristic q has order at most q²
WeierstrassCurve.nthSeries_ne_zero_and_not_X_pow_dvd_of_charP8 below · depth 33 - Reducedness modulo 1-ζ_q at a supersingular point (H₁ level)
ModularCurve.FullLevel.Diamond.isReduced_adicCompletion_quotient_span_one_sub_of_isPrimitiveRoot_of_nthSeries_eq_mul_X_pow_mul_levelModuliPackageAbs_rigidDataH1Pow1,045 below · depth 34 - Reducedness of widehatB₀_𝔪/(1-ζ) at an ordinary point
ModularCurve.FullLevel.Diamond.isReduced_adicCompletion_quotient_span_one_sub_of_pow_eq_one_of_nthSeries_eq_mul_X_pow_levelModuliPackageAbs_rigidDataH1Pow1,165 below · depth 34 - Unramified model for an ordinary completed local ring
ModularCurve.FullLevel.Diamond.nonempty_ringEquiv_adicCompletion_quotient_adicCompletion_unramified_of_nthSeries_eq_mul_X_pow_levelModuliPackageAbs_rigidDataH1Pow1,468 below · depth 34 - Supersingular completed local ring descends to an unramified base
ModularCurve.FullLevel.Diamond.nonempty_ringEquiv_adicCompletion_quotient_adicCompletion_unramified_of_nthSeries_eq_mul_X_pow_mul_levelModuliPackageAbs_rigidDataH1Pow1,469 below · depth 34 - Completed stalks away from q are integrally closed domains
ModularCurve.FullLevel.isDomain_and_isIntegrallyClosed_adicCompletion_of_not_mem_levelModuliPackageAbs_gamma0Pow274 below · depth 34 - Ordinary completed stalks of the full-level moduli ring are normal domains
ModularCurve.FullLevel.isDomain_and_isIntegrallyClosed_adicCompletion_of_nthSeries_eq_mul_X_pow_levelModuliPackageAbs_gamma0Pow1,163 below · depth 34 - Supersingular completed stalks of full-level moduli are normal domains
ModularCurve.FullLevel.isDomain_and_isIntegrallyClosed_adicCompletion_of_nthSeries_eq_mul_X_pow_mul_levelModuliPackageAbs_gamma0Pow1,016 below · depth 34 - Uniqueness of the classifying W₀-algebra map, Γ₀-power level
ModularCurve.LevelModuliPackageAbs.algHom_eq_of_isBaseChange_lawIso_appAdic_eq_gamma0Pow78 below · depth 34 - Existence of a classifying W₀-algebra map for Drinfeld bases
ModularCurve.LevelModuliPackageAbs.exists_algHom_isBaseChange_lawIso_appAdic_eq_gamma0Pow936 below · depth 34 - Hasse parameter and j at a supersingular Drinfeld point
ModularCurve.LevelModuliPackageAbs.exists_coeff_nthSeries_sub_mul_mem_span_and_map_j0_sub_algebraMap_eq_mul_eval_of_factorsThrough_rigidDataH1Pow78 below · depth 34 - Supersingular completion: Drinfeld basis, Hasse parameter, relabelling linear part
ModularCurve.LevelModuliPackageAbs.exists_isDrinfeldBasisAdic_isRegularLocalRing_hasseParam_problemAut_linearPart_adicCompletion_of_forall_mem_ssJSet_rigidDataH1Pow1,117 below · depth 34 - Rigidified universality of the H₁ moduli ring at a supersingular point
ModularCurve.LevelModuliPackageAbs.exists_reducesToOrigin_isDrinfeldBasisAdic_universal_of_factorsThrough_rigidDataH1Pow972 below · depth 34 - Level relabelling on the deformation ring: linear part cγ̄
ModularCurve.LevelModuliPackageAbs.exists_ringEquiv_originParam_linearPart_of_problemAut_relabel_of_reducesToOrigin_universal_gamma0Pow_of_mem_ssJSet189 below · depth 34 - Residue base change of the universal formal group and Drinfeld-basis transport
ModularCurve.LevelModuliPackageAbs.isBaseChange_and_isDrinfeldBasisAdic_residue_of_toPowerSeries_eq_gamma0Pow3 below · depth 34 - Reducedness of R/(1-ζ) at an ordinary Drinfeld point
ModularCurve.LevelModuliPackageAbs.isReduced_quotient_span_one_sub_of_pow_eq_one_of_factorsThrough_of_nthSeries_eq_mul_X_pow_gamma0Pow1,155 below · depth 34 - Global Drinfeld q-basis yields formal Drinfeld basis, supersingular case
WeierstrassCurve.DrinfeldGlobal.IsDrinfeldBasis.exists_reducesToOrigin_isDrinfeldBasisAdic_of_toPowerSeries_eq_typeZero139 below · depth 34 - The X^q-coefficient of [q] equals the Hasse invariant
WeierstrassCurve.exists_coeff_nthSeries_eq_mul_hasseInvariant21 below · depth 34 - Base change of an Igusa-type factorisation of [q]
WeierstrassCurve.exists_formalGroup_toPowerSeries_eq_formalGroupLawFixed_map_and_nthSeries_eq_X_mul_map_mul_map2 below · depth 34 - Generic point of the formal group law is the sum of coordinate generic points
WeierstrassCurve.exists_genericPoint_formalGroupLawFixed_eq_add0 below · depth 34 - Commutative lift over W₀llbracket trrbracket with unit first-order q-series coefficient
WeierstrassCurve.exists_isComm_lift_powerSeries_formalGroup_coeff_nthSeries30 below · depth 34 - Shape [q]=u· Xⁿ is invariant under Weierstrass coordinate change
WeierstrassCurve.exists_isUnit_nthSeries_eq_mul_X_npow_of_variableChange8 below · depth 34 - Supersingular curves admit a deformation moving the q-th [q]-coefficient
WeierstrassCurve.exists_map_fstHom_eq_and_snd_coeff_nthSeries_ne_zero_of_ne_two28 below · depth 34 - Deformation over W₀[[X]] of a supersingular curve with monomial j
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_X_pow_of_five_le33 below · depth 34 - Commutativity of the Weierstrass formal group law
WeierstrassCurve.formalGroupLawFixed_comm_of_commRing1 below · depth 34 - Base change of the Weierstrass formal group law
WeierstrassCurve.formalW_map_and_formalGroupLawFixed_map0 below · depth 34 - Supersingular j-invariant forces formal height two
WeierstrassCurve.isDrinfeldBasisAdic_bot_zero_zero_of_map_j_mem_ssJSet_of_prime44 below · depth 34 - Serre–Tate: ⋆-isomorphic formal groups force equal j-invariants
WeierstrassCurve.jOfUnit_eq_jOfUnit_of_lawIso_of_isAdicComplete46 below · depth 34 - Coefficient of Tᵖ in [p] versus invariant differential
FormalGroup.coeff_nthSeries_eq_coeff_invDiff_of_isBaseChange4 below · depth 35 - The variable-change series defines a formal group law homomorphism
FormalGroup.exists_lawHom_series_eq_variableChangeSeries5 below · depth 35 - Completions away from q are integrally closed domains
ModularCurve.FullLevel.Diamond.isDomain_and_isIntegrallyClosed_adicCompletion_of_not_mem_levelModuliPackageAbs_rigidDataH1Pow286 below · depth 35 - Completed local ring at an ordinary point is normal
ModularCurve.FullLevel.Diamond.isDomain_and_isIntegrallyClosed_adicCompletion_of_nthSeries_eq_mul_X_pow_levelModuliPackageAbs_rigidDataH1Pow1,165 below · depth 35 - Normality of completed local rings at supersingular points
ModularCurve.FullLevel.Diamond.isDomain_and_isIntegrallyClosed_adicCompletion_of_nthSeries_eq_mul_X_pow_mul_levelModuliPackageAbs_rigidDataH1Pow1,029 below · depth 35 - Formal smoothness of the full-level moduli ring away from q
ModularCurve.FullLevel.formallySmooth_localization_atPrime_of_not_mem_levelModuliPackageAbs_gamma0Pow213 below · depth 35 - Krull dimension at most one away from q
ModularCurve.FullLevel.ringKrullDim_localization_atPrime_le_one_of_not_mem_levelModuliPackageAbs_gamma0Pow105 below · depth 35 - Uniqueness of the classifying map at level H₁
ModularCurve.LevelModuliPackageAbs.algHom_eq_of_isBaseChange_lawIso_appAdic_eq_rigidDataH1Pow77 below · depth 35 - Igusa presentation of the ordinary completed local ring
ModularCurve.LevelModuliPackageAbs.exists_algEquiv_adjoinRoot_powerSeries_of_factorsThrough_of_nthSeries_eq_mul_X_pow_of_five_le_gamma0Pow1,151 below · depth 35 - Ordinary H₁ local ring as W₀[[t]][X]/(g), g Eisenstein-like
ModularCurve.LevelModuliPackageAbs.exists_algEquiv_adjoinRoot_powerSeries_of_factorsThrough_of_nthSeries_eq_mul_X_pow_rigidDataH1Pow1,153 below · depth 35 - Pinned relabelling lifts to a residue-trivial automorphism of R
ModularCurve.LevelModuliPackageAbs.exists_algEquiv_comp_eq_classify_act_of_problemAut_relabel_of_factorsThrough_gamma0Pow132 below · depth 35 - Existence of the classifying W₀-algebra map on formal deformations
ModularCurve.LevelModuliPackageAbs.exists_algHom_isBaseChange_lawIso_appAdic_eq_rigidDataH1Pow947 below · depth 35 - Raw Drinfeld points over T come from R
ModularCurve.LevelModuliPackageAbs.exists_algHom_of_raw_lawIso_appAdic_eq_gamma0Pow21 below · depth 35 - Linear part of the relabelling endomorphism on Drinfeld parameters
ModularCurve.LevelModuliPackageAbs.exists_originParam_linearPart_of_algHom_comp_eq_classify_act_of_problemAut_relabel_gamma0Pow_of_mem_ssJSet182 below · depth 35 - Lifting a Drinfeld basis to a raw Γ₀(M')-level datum
ModularCurve.LevelModuliPackageAbs.exists_raw_lawIso_appAdic_eq_of_isDrinfeldBasisAdic_gamma0Pow924 below · depth 35 - Relabelling automorphisms act linearly on Drinfeld origin parameters
ModularCurve.LevelModuliPackageAbs.exists_ringEquiv_originParam_linearPart_of_problemAut_relabel_of_reducesToOrigin_universal_rigidDataH1Pow_of_mem_ssJSet218 below · depth 35 - Residue base change and Drinfeld basis of the reduced law
ModularCurve.LevelModuliPackageAbs.isBaseChange_and_isDrinfeldBasisAdic_residue_of_toPowerSeries_eq_rigidDataH1Pow3 below · depth 35 - Two rigidified lifts induce the same moduli point
ModularCurve.LevelModuliPackageAbs.map_univ_eq_of_isBaseChange_lawIso_appAdic_eq_gamma0Pow77 below · depth 35 - Counting linear factors via reduction to unit· X^N
PowerSeries.card_eq_of_isUnit_mul_eq_prod_X_sub_C_of_map_residue_eq_mul_X_pow0 below · depth 35 - Drinfeld basis factorisation of the q-division series
WeierstrassCurve.DrinfeldGlobal.IsDrinfeldBasis.exists_isUnit_mul_nthSeries_eq_prod_X_sub_C_originParam135 below · depth 35 - Uniqueness of the origin-chart map of a section
WeierstrassCurve.DrinfeldGlobal.IsOriginChartSection.eq0 below · depth 35 - Unique lifting of level-q Drinfeld pairs along nilpotent surjections
WeierstrassCurve.DrinfeldGlobal.existsUnique_isLevel_map_eq_of_surjective_of_ker_pow_eq_bot_of_isUnit_of_ne_two202 below · depth 35 - Origin parameter of [a]P+[b]Q is a formal linear combination
WeierstrassCurve.DrinfeldGlobal.exists_reducesToOrigin_linComb_and_originParam_eq_linCombAdic109 below · depth 35 - Origin chart ring generated by scalars, X/Y and Z/Y
WeierstrassCurve.DrinfeldGlobal.ringHom_originChartRing_ext0 below · depth 35 - Residue of [q]_F is a unit times X^{q^2}
WeierstrassCurve.exists_isUnit_map_residue_nthSeries_eq_mul_X_pow_of_isDrinfeldBasisAdic_zero2 below · depth 35 - Laurent frame for the Weierstrass formal group and its invariant differential
WeierstrassCurve.exists_laurent_frame_invDiff_mul_eq_derivative9 below · depth 35 - Deformation moving the Z^q-coefficient of [q]
WeierstrassCurve.exists_map_fstHom_eq_and_snd_coeff_nthSeries_ne_zero29 below · depth 35 - First-order deformation with non-zero Hasse-invariant derivative
WeierstrassCurve.exists_map_fstHom_eq_and_snd_hasseInvariant_ne_zero4 below · depth 35 - Monomial j universal deformation at a supersingular point, case j=1728
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_X_pow_of_five_le_of_j_eq_172826 below · depth 35 - Universal monomial-j deformation at a supersingular point, case j=0
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_X_pow_of_five_le_of_j_eq_zero26 below · depth 35 - Supersingular deformation with monomial j when j(E₀)≠ 0,1728
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_X_pow_of_five_le_of_j_ne_zero_of_j_ne30 below · depth 35 - Universal Weierstrass lift of a supersingular curve over W₀[[t]]
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_eval37 below · depth 35 - Rigidity of Weierstrass lifts over an Artinian local ring
WeierstrassCurve.exists_variableChange_map_eq_one_and_smul_eq_of_lawIso_of_isArtinianRing45 below · depth 35 - Serre–Tate: strictly isomorphic formal groups give equal j
WeierstrassCurve.jOfUnit_eq_jOfUnit_of_lawIso_of_isAdicComplete_of_prime47 below · depth 35 - Invariant differential commutes with base change of formal groups
FormalGroup.IsBaseChange.invDiff_eq_map0 below · depth 36 - Passing factorisation through Artinian quotients to a complete local ring
IsAdicComplete.existsUnique_algHom_comp_eq_of_forall_residue_eq_of_factorsThrough_artinian0 below · depth 36 - Formal smoothness of the H₁ moduli local rings away from q
ModularCurve.FullLevel.Diamond.formallySmooth_localization_atPrime_of_not_mem_levelModuliPackageAbs_rigidDataH1Pow231 below · depth 36 - Dimension ≤ 1 at q-invertible maximal ideals of B₀
ModularCurve.FullLevel.Diamond.ringKrullDim_localization_atPrime_le_one_of_not_mem_levelModuliPackageAbs_rigidDataH1Pow101 below · depth 36 - Rigidity: reduction of a full-level change of variables is trivial
ModularCurve.FullLevel.variableChange_map_eq_one_of_eq_act_of_map_residue_eq_gamma0Pow3 below · depth 36 - First-order action of level relabelling on Drinfeld origin parameters
ModularCurve.LevelModuliPackageAbs.apply_originParam_sub_inv_u_mul_mem_sq_of_act_mapRing_eq_relabel_gamma0Pow118 below · depth 36 - Igusa presentation of the ordinary local ring, normal position
ModularCurve.LevelModuliPackageAbs.exists_algEquiv_adjoinRoot_powerSeries_of_nthSeries_eq_mul_X_pow_of_eq_one_of_ne_one_rigidDataH1Pow1,139 below · depth 36 - Igusa presentation of the completed ordinary stalk in normal position
ModularCurve.LevelModuliPackageAbs.exists_algEquiv_adjoinRoot_powerSeries_of_nthSeries_eq_mul_X_pow_of_five_le_of_eq_one_of_ne_one_gamma0Pow1,137 below · depth 36 - Relabelling automorphism of the rigidified ring R
ModularCurve.LevelModuliPackageAbs.exists_algEquiv_comp_eq_classify_act_of_problemAut_relabel_of_factorsThrough_rigidDataH1Pow183 below · depth 36 - Artinian points with prescribed reduction arise from R → T
ModularCurve.LevelModuliPackageAbs.exists_algHom_of_raw_lawIso_appAdic_eq_rigidDataH1Pow26 below · depth 36 - Linear part of a Γ₀(M')-relabelling on Drinfeld origin parameters
ModularCurve.LevelModuliPackageAbs.exists_originParam_linearPart_of_algHom_comp_eq_classify_act_of_problemAut_relabel_rigidDataH1Pow_of_mem_ssJSet214 below · depth 36 - Artinian lift of a Drinfeld basis to a raw H₁ datum
ModularCurve.LevelModuliPackageAbs.exists_raw_lawIso_appAdic_eq_of_isDrinfeldBasisAdic_rigidDataH1Pow934 below · depth 36 - Lifts of the universal curve differ by a trivial variable change
ModularCurve.LevelModuliPackageAbs.exists_variableChange_map_eq_one_smul_map_eq_map_of_lawIso_gamma0Pow46 below · depth 36 - Uniqueness of Γ₀(M') kernel data under a trivial variable change
ModularCurve.LevelModuliPackageAbs.kernel_map_eq_kernelVariableChangeDeg_of_smul_map_eq_gamma0Pow12 below · depth 36 - Level-ℓ data of two lifts differ by the variable change C
ModularCurve.LevelModuliPackageAbs.levelPData_map_eq_variableChange_of_smul_map_eq_gamma0Pow8 below · depth 36 - Drinfeld pairs transported by a variable change reducing to one
ModularCurve.LevelModuliPackageAbs.levelTransport_map_eq_act_map_of_smul_map_eq_gamma0Pow23 below · depth 36 - Equality of moduli points from matching Drinfeld basis data
ModularCurve.LevelModuliPackageAbs.map_univ_eq_of_isBaseChange_lawIso_appAdic_eq_rigidDataH1Pow76 below · depth 36 - Residue compatibility of the classifying map at Γ₀-power level
ModularCurve.LevelModuliPackageAbs.residue_classify_eq_of_map_residue_eq_gamma0Pow4 below · depth 36 - Scaling of a γ-relabelling is a (q+1)-st root of unity mod 𝔪
ModularCurve.LevelModuliPackageAbs.u_pow_sub_one_mem_and_of_act_mapRing_eq_relabel_gamma0Pow_of_mem_ssJSet45 below · depth 36 - Origin-chart section: restricted graph ideal equals kerχ
WeierstrassCurve.DrinfeldGlobal.IsOriginChartSection.map_ideal_comap_ker_eq_ker1 below · depth 36 - Unique lifting of Drinfeld level-q structures along nilpotent thickenings
WeierstrassCurve.DrinfeldGlobal.existsUnique_isLevel_map_eq_of_surjective_of_ker_pow_eq_bot_of_isUnit208 below · depth 36 - Transport of a law isomorphism along a trivial variable change
WeierstrassCurve.DrinfeldGlobal.exists_lawIso_appAdic_originParam_eq_of_variableChange_map_eq_one10 below · depth 36 - Existence of a unimodular pair with one relation for a Drinfeld basis
WeierstrassCurve.DrinfeldGlobal.exists_linComb_eq_one_and_linComb_ne_one_of_isDrinfeldBasis_of_nthSeries_eq_mul_X_pow_of_isOriginChartSection138 below · depth 36 - Formal addition law for sections reducing to the origin
WeierstrassCurve.DrinfeldGlobal.exists_reducesToOrigin_mul_originParam_eq_eval108 below · depth 36 - Power series realisation of the origin chart ring
WeierstrassCurve.DrinfeldGlobal.exists_ringHom_originChartRing_powerSeries0 below · depth 36 - Formal Drinfeld basis gives a global Drinfeld Γ(q)-basis
WeierstrassCurve.DrinfeldGlobal.isDrinfeldBasis_of_reducesToOrigin_of_isDrinfeldBasisAdic_typeZero852 below · depth 36 - Sections avoiding the origin span the formal chart
WeierstrassCurve.DrinfeldGlobal.map_ideal_comap_ker_eq_top_of_not_reducesToOrigin0 below · depth 36 - Torsion ideal on the origin chart is ([q]_F)
WeierstrassCurve.DrinfeldGlobal.map_ideal_comap_torsionIdeal_eq_span_nthSeries127 below · depth 36 - Image of the origin-chart kernel in T[[X]]
WeierstrassCurve.DrinfeldGlobal.map_ker_eq_span_X_sub_C_originParam4 below · depth 36 - Serre–Tate lifting: formal group lifts come from Weierstrass lifts
WeierstrassCurve.exists_map_eq_and_lawIso_of_isBaseChange_formalGroup_of_isArtinianRing51 below · depth 36 - Transport of the universal-family package along a variable change
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_X_pow_of_coeff_hasseInvariant_map_variableChange24 below · depth 36 - Characteristic three: universal deformation of a supersingular curve
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_eval_of_eq_three24 below · depth 36 - Characteristic 2 supersingular lift with distinguished j-polynomial
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_eval_of_eq_two2 below · depth 36 - One induction step of Serre–Tate uniqueness of lifts
WeierstrassCurve.exists_variableChange_map_eq_one_and_map_smul_eq_map_pow_succ_of_lawIso44 below · depth 36 - Formal-group isomorphism yields a variable change over an Artinian local ring
WeierstrassCurve.exists_variableChange_map_eq_one_and_smul_eq_of_lawIso_of_isArtinianRing_of_prime46 below · depth 36 - Laurent frame at the origin of a Weierstrass curve
WeierstrassCurve.laurentFrame_wUnitFactor0 below · depth 36 - Formal invariant differential equals dx/(2y+a₁x+a₃) in the Laurent frame
WeierstrassCurve.ofPowerSeries_invDiff_mul_eq_derivative_laurentFrame7 below · depth 36 - Global ideal of an ideal sheaf pulled back along Specφ
AlgebraicGeometry.Scheme.IdealSheafData.map_ideal_comap_specMap_eq_map0 below · depth 37 - Transport of adic parameters along a homomorphism reducing to X
FormalGroup.LawHom.appAdic_eq_of_lawIso_appAdic_eq_of_map_series_eq_X9 below · depth 37 - Kernel of evaluation at a is (X - C a)
FormalGroup.ker_evalSeries_eq_span1 below · depth 37 - Residual triviality of variable changes at level Γ₁(ℓ_g)
ModularCurve.FullLevel.variableChange_map_eq_one_of_eq_act_of_map_residue_eq_rigidDataH1Pow8 below · depth 37 - First-order action of a relabelling on Drinfeld origin parameters
ModularCurve.LevelModuliPackageAbs.apply_originParam_sub_inv_u_mul_mem_sq_of_act_mapRing_eq_relabel_rigidDataH1Pow118 below · depth 37 - One-dimensional tangent space at an ordinary q-torsion point
ModularCurve.LevelModuliPackageAbs.exists_algHom_dualNumber_of_represents_nsmul_eq_one_of_nthSeries_eq_mul_X_pow_gamma0Pow939 below · depth 37 - First-order deformations with q-torsion section form a line (H₁ level)
ModularCurve.LevelModuliPackageAbs.exists_algHom_dualNumber_of_represents_nsmul_eq_one_of_nthSeries_eq_mul_X_pow_rigidDataH1Pow937 below · depth 37 - Two deformations with isomorphic formal groups differ by a trivial variable change
ModularCurve.LevelModuliPackageAbs.exists_variableChange_map_eq_one_smul_map_eq_map_of_lawIso_rigidDataH1Pow47 below · depth 37 - Kernel data of two lifts differ by the variable change
ModularCurve.LevelModuliPackageAbs.kernel_map_eq_kernelVariableChangeDeg_of_smul_map_eq_rigidDataH1Pow12 below · depth 37 - Equality of Γ₁(ℓ_g)-data under an infinitesimal variable change
ModularCurve.LevelModuliPackageAbs.levelPData_map_eq_variableChange_of_smul_map_eq_rigidDataH1Pow6 below · depth 37 - Transport of Drinfeld pairs under a residually trivial variable change
ModularCurve.LevelModuliPackageAbs.levelTransport_map_eq_act_map_of_smul_map_eq_rigidDataH1Pow23 below · depth 37 - Full-level moduli deformation ring is the Igusa root ring S[X]/(g)
ModularCurve.LevelModuliPackageAbs.nonempty_algEquiv_adjoinRoot_of_factorsThrough_of_nthSeries_eq_X_mul_mul_of_isDomain_adjoinRoot_gamma0Pow964 below · depth 37 - Completed local ring at level H₁ is S[X]/(g)
ModularCurve.LevelModuliPackageAbs.nonempty_algEquiv_adjoinRoot_of_factorsThrough_of_nthSeries_eq_X_mul_mul_of_isDomain_adjoinRoot_rigidDataH1Pow968 below · depth 37 - Residue compatibility of the classifying map for `rigidDataH1Pow`
ModularCurve.LevelModuliPackageAbs.residue_classify_eq_of_map_residue_eq_rigidDataH1Pow4 below · depth 37 - Rigidity of the scalar of a relabelling automorphism at supersingular j
ModularCurve.LevelModuliPackageAbs.u_pow_sub_one_mem_and_of_act_mapRing_eq_relabel_rigidDataH1Pow_of_mem_ssJSet182 below · depth 37 - Ordinary case: exactly q combinations of a Drinfeld basis are the origin
WeierstrassCurve.DrinfeldGlobal.IsDrinfeldBasis.exists_card_eq_of_nthSeries_eq_mul_X_pow136 below · depth 37 - Section ideal restricted to the origin chart is kerχ
WeierstrassCurve.DrinfeldGlobal.IsOriginChartSection.comap_ker_originChartInclusion0 below · depth 37 - Torsion ideal pulled back along a point equals [q]^* of the origin
WeierstrassCurve.DrinfeldGlobal.comap_torsionIdeal_eq_comap_ker_one0 below · depth 37 - Multiplication by q on the formal point at the origin
WeierstrassCurve.DrinfeldGlobal.exists_originChart_comp_schemeNsmul_eq_of_formalChart120 below · depth 37 - Formal group law as parameter of the universal sum
WeierstrassCurve.DrinfeldGlobal.exists_reducesToOrigin_mul_originParam_eq_formalGroupLawFixed92 below · depth 37 - Section with formal parameter Xᵢ over A[[X₀,X₁]]
WeierstrassCurve.DrinfeldGlobal.exists_section_reducesToOrigin_originParam_eq_X0 below · depth 37 - Kernel of a scalar-compatible origin-chart map
WeierstrassCurve.DrinfeldGlobal.ker_eq_span_of_originChartRing0 below · depth 37 - Preimage of the origin section in the origin chart
WeierstrassCurve.DrinfeldGlobal.map_ideal_comap_ker_one_eq_span4 below · depth 37 - Origin-chart section: w equals w_W at its parameter
WeierstrassCurve.DrinfeldGlobal.originW_eq_evalSeries_formalW_originParam_of_isOriginChartSection1 below · depth 37 - Sections reducing to the origin cut out prodᵢ (X - zᵢ)
WeierstrassCurve.DrinfeldGlobal.prodKerGraph_eq_ker_originChart_of_forall_reducesToOrigin21 below · depth 37 - Invariance of [q]=u X^q under Weierstrass variable change
WeierstrassCurve.exists_isUnit_nthSeries_eq_mul_X_pow_of_variableChange8 below · depth 37 - Base step of Serre–Tate lifting modulo 𝔪_T
WeierstrassCurve.exists_lift_lawIso_quotient_maximalIdeal_pow_one_of_isBaseChange2 below · depth 37 - Serre–Tate lifting step: from 𝔪ⁿ to 𝔪ⁿ⁺¹
WeierstrassCurve.exists_lift_lawIso_quotient_maximalIdeal_pow_succ_of_exists48 below · depth 37 - Descending a lift from T/𝔪^N when 𝔪^N=0
WeierstrassCurve.exists_map_eq_and_lawIso_of_exists_quotient_of_pow_eq_bot2 below · depth 37 - Serre–Tate existence of Weierstrass lifts of formal groups
WeierstrassCurve.exists_map_eq_and_lawIso_of_isBaseChange_formalGroup_of_isArtinianRing_of_prime52 below · depth 37 - From an explicit q-adic family to the formal-group package
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_X_pow_of_coeff_hasseInvariant_map22 below · depth 37 - Deformation package from a distinguished j-expansion
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_eval_of_coeff_hasseInvariant_map22 below · depth 37 - Serre–Tate uniqueness: improving a variable change from 𝔪ⁿ to 𝔪ⁿ⁺¹
WeierstrassCurve.exists_variableChange_map_eq_one_and_map_smul_eq_map_pow_succ_of_lawIso_of_prime45 below · depth 37
… and 57 more statements (search for the module name to find them).