Definitions/Def_MvFormalGroup_PointsV2.lean
Points of a multidimensional formal group law over an ideal
Fix a commutative ring R, an R-algebra S and an ideal J \subseteq S. The first half of the module sets up evaluation of multivariate power series in the J-adic topology: for an ideal J, a family x : \sigma \to S and f \in R[[X_\sigma]], adicEval J x f is Mathlib's MvPowerSeries.eval₂ of f along algebraMap R S and x, computed for the discrete topology on R and the J-adic topology on S. On (coercions of) polynomials it agrees with MvPolynomial.aeval x, and it sends X_s to x_s, with no further hypotheses. When \sigma is finite, every x_s lies in \sqrt J and S is J-adically complete, the entries x_s are topologically nilpotent, MvPowerSeries.HasEval x holds, and f \mapsto f(x) is an R-algebra homomorphism adicEvalAlgHom; moreover f(x) \in \sqrt J whenever f has zero constant term, and (\mathrm{subst}\ a\ f)(x) = f\big((a_t(x))_t\big) for any substitutable family a. For an R-algebra map \varphi : S \to S' with J finitely generated and \varphi(J) \subseteq \sqrt{J'}, \varphi is J-adically continuous and \varphi(f(x)) = f\big((\varphi(x_s))_s\big).
The structure Points F S J, for a g-dimensional formal group law F over R, has as fields a tuple val : Fin g → S together with the proof that each entry lies in \sqrt J. The zero tuple is always a point; for S J-adically complete, addition is (x+y)_i = F_i(x,y) and negation is (-x)_i = \iota_i(x), where \iota = invSeries F is the inverse series, and these make Points F S J an additive group, commutative when F is commutative, with n \cdot x given by the n-series of F. A homomorphism \varphi : F \to G of laws induces an additive map Hom.evalPoints by evaluating its series, compatibly with identity, composition, zero, addition (for G commutative), the ring structure of End F and natural-number multiples; and Points.map gives functoriality in (S,J) under the hypotheses above, commuting with evalPoints.
Relation to Mathlib
Built on Mathlib's multivariate power series evaluation and substitution (eval₂, aeval, HasEval, subst) and on Mathlib's adic topology and IsAdicComplete; the formal group laws, their homomorphisms and their groups of points are the project's own notions, Mathlib having no theory of formal group laws.
Where it is used
The group F(S,J) of points with entries in \sqrt J, its functoriality in (S,J) and the induced action of homomorphisms and endomorphisms are the vocabulary in which torsion of formal groups over complete local rings is expressed, as needed in the local analysis of the Galois representations attached to elliptic curves.
References
- M. Hazewinkel, Formal Groups and Applications, Pure and Applied Mathematics 78, Academic Press, 1978
- J. H. Silverman, The Arithmetic of Elliptic Curves, Graduate Texts in Mathematics 106, Springer, 1986, Chapter IV
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 485 lines
- 45 declarations
- used in the statements of 70 theorems and imported by 111 proofs
- imports 1 definition modules
Source file: Definitions/Def_MvFormalGroup_PointsV2.lean
Imports
Imported by
Declarations
- def
MvFormalGroup.adicEval - theorem
MvFormalGroup.isTopologicallyNilpotent_of_mem_radical - theorem
MvFormalGroup.hasEval_of_mem_radical - theorem
MvFormalGroup.adicEval_coe - theorem
MvFormalGroup.adicEval_X - def
MvFormalGroup.adicEvalAlgHom - theorem
MvFormalGroup.coe_adicEvalAlgHom - theorem
MvFormalGroup.adicEval_mem_radical - theorem
MvFormalGroup.adicEval_subst - theorem
MvFormalGroup.map_adicEval - theorem
MvFormalGroup.adicEval_subst_elim - theorem
MvFormalGroup.map_mem_radical - theorem
MvFormalGroup.forall_sumElim - structure
MvFormalGroup.Points - field
MvFormalGroup.Points.val - field
MvFormalGroup.Points.mem_radical - instance
MvFormalGroup.Points.instZero - theorem
MvFormalGroup.Points.val_zero - theorem
MvFormalGroup.Points.adicEval_X_eq - def
MvFormalGroup.Points.add - instance
MvFormalGroup.Points.instAdd - theorem
MvFormalGroup.Points.val_add - def
MvFormalGroup.Points.neg - instance
MvFormalGroup.Points.instNeg - theorem
MvFormalGroup.Points.val_neg - theorem
MvFormalGroup.Points.add_assoc - theorem
MvFormalGroup.Points.zero_add - theorem
MvFormalGroup.Points.add_zero - theorem
MvFormalGroup.Points.neg_add_cancel - instance
MvFormalGroup.Points.instAddGroup - theorem
MvFormalGroup.Points.add_comm - instance
MvFormalGroup.Points.instAddCommGroup - theorem
MvFormalGroup.Points.val_nsmul - def
MvFormalGroup.Hom.evalPoints - theorem
MvFormalGroup.Hom.val_evalPoints - theorem
MvFormalGroup.Hom.evalPoints_id - theorem
MvFormalGroup.Hom.evalPoints_comp - theorem
MvFormalGroup.Hom.evalPoints_zero - theorem
MvFormalGroup.Hom.evalPoints_add - theorem
MvFormalGroup.Hom.evalPoints_one - theorem
MvFormalGroup.Hom.evalPoints_mul - theorem
MvFormalGroup.Hom.evalPoints_natCast - def
MvFormalGroup.Points.map - theorem
MvFormalGroup.Points.val_map - theorem
MvFormalGroup.Hom.evalPoints_map
Source
import Definitions.Def_MvFormalGroup_NegV2 import Mathlib.RingTheory.AdicCompletion.Topology ↗ import Mathlib.RingTheory.Finiteness.Ideal ↗ set_option autoImplicit false noncomputable section open MvPowerSeries namespace MvFormalGroup variable {g h k : ℕ} {R : Type*} [CommRing R] section AdicEval variable {S : Type*} [CommRing S] [Algebra R S] {S' : Type*} [CommRing S'] [Algebra R S'] {σ : Type*} def adicEval (J : Ideal S) (x : σ → S) (f : MvPowerSeries σ R) : S := letI : UniformSpace R := ⊥ letI : WithIdeal S := ⟨J⟩ MvPowerSeries.eval₂ (algebraMap R S) x f private theorem isTopologicallyNilpotent_of_mem_radical (J : Ideal S) {a : S} (ha : a ∈ J.radical) : letI : TopologicalSpace S := J.adicTopology IsTopologicallyNilpotent a := by letI : TopologicalSpace S := J.adicTopology obtain ⟨k, hk⟩ := ha show Filter.Tendsto (a ^ ·) Filter.atTop (nhds 0) rw [(J.hasBasis_nhds_zero_adic).tendsto_right_iff] intro n _ filter_upwards [Filter.eventually_ge_atTop (k * n)] with m hm obtain ⟨r, rfl⟩ : ∃ r, m = k * n + r := ⟨m - k * n, by omega⟩ rw [pow_add, pow_mul] exact SetLike.mem_coe.mpr (Ideal.mul_mem_right _ _ (Ideal.pow_mem_pow hk n)) private theorem hasEval_of_mem_radical [Finite σ] (J : Ideal S) {x : σ → S} (hx : ∀ s, x s ∈ J.radical) : letI : TopologicalSpace S := J.adicTopology MvPowerSeries.HasEval x := by letI : TopologicalSpace S := J.adicTopology refine ⟨fun s => isTopologicallyNilpotent_of_mem_radical J (hx s), ?_⟩ rw [Filter.cofinite_eq_bot] exact Filter.tendsto_bot theorem adicEval_coe (J : Ideal S) (x : σ → S) (p : MvPolynomial σ R) : adicEval J x (p : MvPowerSeries σ R) = MvPolynomial.aeval x p := by letI : UniformSpace R := ⊥ letI : WithIdeal S := ⟨J⟩ rw [MvPolynomial.aeval_def] exact MvPowerSeries.eval₂_coe (algebraMap R S) x p theorem adicEval_X (J : Ideal S) (x : σ → S) (s : σ) : adicEval J x (X s : MvPowerSeries σ R) = x s := by letI : UniformSpace R := ⊥ letI : WithIdeal S := ⟨J⟩ exact MvPowerSeries.eval₂_X (algebraMap R S) x s def adicEvalAlgHom [Finite σ] (J : Ideal S) [IsAdicComplete J S] {x : σ → S} (hx : ∀ s, x s ∈ J.radical) : MvPowerSeries σ R →ₐ[R] S := letI : UniformSpace R := ⊥ letI : WithIdeal S := ⟨J⟩ haveI : CompleteSpace S := ((IsAdic.isAdicComplete_iff (show IsAdic J from rfl)).mp ‹IsAdicComplete J S›).1 haveI : T2Space S := ((IsAdic.isAdicComplete_iff (show IsAdic J from rfl)).mp ‹IsAdicComplete J S›).2 haveI : ContinuousSMul R S := DiscreteTopology.instContinuousSMul R S MvPowerSeries.aeval (hasEval_of_mem_radical J hx) theorem coe_adicEvalAlgHom [Finite σ] (J : Ideal S) [IsAdicComplete J S] {x : σ → S} (hx : ∀ s, x s ∈ J.radical) : ⇑(adicEvalAlgHom (R := R) J hx) = adicEval J x := by letI : UniformSpace R := ⊥ letI : WithIdeal S := ⟨J⟩ haveI : CompleteSpace S := ((IsAdic.isAdicComplete_iff (show IsAdic J from rfl)).mp ‹IsAdicComplete J S›).1 haveI : T2Space S := ((IsAdic.isAdicComplete_iff (show IsAdic J from rfl)).mp ‹IsAdicComplete J S›).2 haveI : ContinuousSMul R S := DiscreteTopology.instContinuousSMul R S funext f exact congrFun (MvPowerSeries.coe_aeval (hasEval_of_mem_radical J hx)) f open MvPowerSeries.WithPiTopology in theorem adicEval_mem_radical [Finite σ] (J : Ideal S) [IsAdicComplete J S] {x : σ → S} (hx : ∀ s, x s ∈ J.radical) {f : MvPowerSeries σ R} (hf : f.constantCoeff = 0) : adicEval J x f ∈ J.radical := by letI : UniformSpace R := ⊥ letI : WithIdeal S := ⟨J⟩ haveI : CompleteSpace S := ((IsAdic.isAdicComplete_iff (show IsAdic J from rfl)).mp ‹IsAdicComplete J S›).1 haveI : T2Space S := ((IsAdic.isAdicComplete_iff (show IsAdic J from rfl)).mp ‹IsAdicComplete J S›).2 show MvPowerSeries.eval₂ (algebraMap R S) x f ∈ J.radical have hφ : Continuous (algebraMap R S) := continuous_of_discreteTopology have ha := hasEval_of_mem_radical J hx have hf' : IsTopologicallyNilpotent f := MvPowerSeries.WithPiTopology.isTopologicallyNilpotent_of_constantCoeff_zero hf have hc : Continuous (MvPowerSeries.eval₂Hom hφ ha) := by rw [MvPowerSeries.coe_eval₂Hom] exact MvPowerSeries.continuous_eval₂ hφ ha obtain ⟨n, hn⟩ := (hf'.map hc).exists_pow_mem_of_mem_nhds ((J.hasBasis_nhds_zero_adic).mem_of_mem (i := 1) trivial) rw [MvPowerSeries.coe_eval₂Hom, pow_one] at hn exact ⟨n, hn⟩ theorem adicEval_subst [Finite σ] {τ : Type*} (J : Ideal S) [IsAdicComplete J S] {x : σ → S} (hx : ∀ s, x s ∈ J.radical) {a : τ → MvPowerSeries σ R} (ha : HasSubst a) (f : MvPowerSeries τ R) : adicEval J x (subst a f) = adicEval J (fun t => adicEval J x (a t)) f := by letI : UniformSpace R := ⊥ letI : WithIdeal S := ⟨J⟩ haveI : CompleteSpace S := ((IsAdic.isAdicComplete_iff (show IsAdic J from rfl)).mp ‹IsAdicComplete J S›).1 haveI : T2Space S := ((IsAdic.isAdicComplete_iff (show IsAdic J from rfl)).mp ‹IsAdicComplete J S›).2 exact MvPowerSeries.eval₂_subst ha (hasEval_of_mem_radical J hx) f theorem map_adicEval [Finite σ] (J : Ideal S) [IsAdicComplete J S] (J' : Ideal S') [IsAdicComplete J' S'] (φ : S →ₐ[R] S') (hJ : J.FG) (hφ : ∀ s ∈ J, φ s ∈ J'.radical) {x : σ → S} (hx : ∀ s, x s ∈ J.radical) (f : MvPowerSeries σ R) : φ (adicEval J x f) = adicEval J' (fun s => φ (x s)) f := by letI : UniformSpace R := ⊥ letI : WithIdeal S := ⟨J⟩ letI : WithIdeal S' := ⟨J'⟩ haveI : CompleteSpace S := ((IsAdic.isAdicComplete_iff (show IsAdic J from rfl)).mp ‹IsAdicComplete J S›).1 haveI : T2Space S := ((IsAdic.isAdicComplete_iff (show IsAdic J from rfl)).mp ‹IsAdicComplete J S›).2 haveI : CompleteSpace S' := ((IsAdic.isAdicComplete_iff (show IsAdic J' from rfl)).mp ‹IsAdicComplete J' S'›).1 haveI : T2Space S' := ((IsAdic.isAdicComplete_iff (show IsAdic J' from rfl)).mp ‹IsAdicComplete J' S'›).2 have hle : J.map (φ : S →+* S') ≤ J'.radical := by rw [Ideal.map_le_iff_le_comap] intro s hs exact hφ s hs obtain ⟨m, hm⟩ := Ideal.exists_pow_le_of_le_radical_of_fg hle (hJ.map _) have hcont : Continuous (φ : S →+* S') := by apply continuous_of_continuousAt_zero (φ : S →+* S') rw [ContinuousAt, map_zero, (J.hasBasis_nhds_zero_adic).tendsto_iff (J'.hasBasis_nhds_zero_adic)] intro n _ refine ⟨m * n, trivial, fun s hs => ?_⟩ have hpow : (J ^ (m * n)).map (φ : S →+* S') ≤ J' ^ n := by rw [Ideal.map_pow, pow_mul] exact Ideal.pow_right_mono hm n exact SetLike.mem_coe.mpr (hpow (Ideal.mem_map_of_mem _ (SetLike.mem_coe.mp hs))) have key := congrFun (MvPowerSeries.comp_eval₂ (φ := algebraMap R S) (a := x) continuous_of_discreteTopology (hasEval_of_mem_radical J hx) hcont) f rw [AlgHom.comp_algebraMap] at key exact key theorem adicEval_subst_elim (F : MvFormalGroup g R) {τ : Type*} [Finite τ] (J : Ideal S) [IsAdicComplete J S] {w : τ → S} (hw : ∀ t, w t ∈ J.radical) {u v : Fin g → MvPowerSeries τ R} (hu : ∀ j, (u j).constantCoeff = 0) (hv : ∀ j, (v j).constantCoeff = 0) (i : Fin g) : adicEval J w (subst (Sum.elim u v) (F.toPowerSeries i)) = adicEval J (Sum.elim (fun j => adicEval J w (u j)) fun j => adicEval J w (v j)) (F.toPowerSeries i) := by have hfam : (fun s => adicEval J w (Sum.elim u v s)) = Sum.elim (fun j => adicEval J w (u j)) fun j => adicEval J w (v j) := by funext s rcases s with j | j <;> rfl rw [adicEval_subst J hw (hasSubst_elim hu hv), hfam] private theorem map_mem_radical {J : Ideal S} {J' : Ideal S'} (φ : S →ₐ[R] S') (hφ : ∀ s ∈ J, φ s ∈ J'.radical) {s : S} (hs : s ∈ J.radical) : φ s ∈ J'.radical := by obtain ⟨a, ha⟩ := hs obtain ⟨b, hb⟩ := hφ _ ha refine ⟨a * b, ?_⟩ rw [pow_mul, ← map_pow φ s a] exact hb end AdicEval private theorem forall_sumElim {α β M : Type*} {p : M → Prop} {x : α → M} {y : β → M} (hx : ∀ a, p (x a)) (hy : ∀ b, p (y b)) : ∀ c, p (Sum.elim x y c) := by rintro (a | b) exacts [hx a, hy b] @[ext] structure Points (F : MvFormalGroup g R) (S : Type*) [CommRing S] (J : Ideal S) : Type _ where val : Fin g → S mem_radical : ∀ i, val i ∈ J.radical namespace Points variable {F : MvFormalGroup g R} {S : Type*} [CommRing S] {J : Ideal S} instance instZero : Zero (Points F S J) := ⟨⟨fun _ => 0, fun _ => Submodule.zero_mem _⟩⟩ theorem val_zero : (0 : Points F S J).val = fun _ => 0 := rfl variable [Algebra R S] private theorem adicEval_X_eq (x : Points F S J) : (fun j => adicEval J x.val (X j : MvPowerSeries (Fin g) R)) = x.val := funext fun j => adicEval_X J x.val j variable [IsAdicComplete J S] protected def add (x y : Points F S J) : Points F S J where val i := adicEval J (Sum.elim x.val y.val) (F.toPowerSeries i) mem_radical i := adicEval_mem_radical J (forall_sumElim x.mem_radical y.mem_radical) (F.constantCoeff_eq_zero i) instance instAdd : Add (Points F S J) := ⟨Points.add⟩ theorem val_add (x y : Points F S J) (i : Fin g) : (x + y).val i = adicEval J (Sum.elim x.val y.val) (F.toPowerSeries i) := rfl protected def neg (x : Points F S J) : Points F S J where val i := adicEval J x.val (invSeries F i) mem_radical i := adicEval_mem_radical J x.mem_radical (constantCoeff_invSeries F i) instance instNeg : Neg (Points F S J) := ⟨Points.neg⟩ theorem val_neg (x : Points F S J) (i : Fin g) : (-x).val i = adicEval J x.val (invSeries F i) := rfl protected theorem add_assoc (x y z : Points F S J) : x + y + z = x + (y + z) := by ext i show adicEval J (Sum.elim (fun j => adicEval J (Sum.elim x.val y.val) (F.toPowerSeries j)) z.val) (F.toPowerSeries i) = adicEval J (Sum.elim x.val fun j => adicEval J (Sum.elim y.val z.val) (F.toPowerSeries j)) (F.toPowerSeries i) have hw : ∀ t, Sum.elim x.val (Sum.elim y.val z.val) t ∈ J.radical := forall_sumElim x.mem_radical (forall_sumElim y.mem_radical z.mem_radical) have ha : ∀ j, (X (Sum.inl j) : MvPowerSeries (Fin g ⊕ (Fin g ⊕ Fin g)) R).constantCoeff = 0 := fun j => constantCoeff_X _ have hb : ∀ j, (X (Sum.inr (Sum.inl j)) : MvPowerSeries (Fin g ⊕ (Fin g ⊕ Fin g)) R).constantCoeff = 0 := fun j => constantCoeff_X _ have hc : ∀ j, (X (Sum.inr (Sum.inr j)) : MvPowerSeries (Fin g ⊕ (Fin g ⊕ Fin g)) R).constantCoeff = 0 := fun j => constantCoeff_X _ have hxa : (fun j => adicEval J (Sum.elim x.val (Sum.elim y.val z.val)) (X (Sum.inl j) : MvPowerSeries (Fin g ⊕ (Fin g ⊕ Fin g)) R)) = x.val := funext fun j => adicEval_X _ _ _ have hyb : (fun j => adicEval J (Sum.elim x.val (Sum.elim y.val z.val)) (X (Sum.inr (Sum.inl j)) : MvPowerSeries (Fin g ⊕ (Fin g ⊕ Fin g)) R)) = y.val := funext fun j => adicEval_X _ _ _ have hzc : (fun j => adicEval J (Sum.elim x.val (Sum.elim y.val z.val)) (X (Sum.inr (Sum.inr j)) : MvPowerSeries (Fin g ⊕ (Fin g ⊕ Fin g)) R)) = z.val := funext fun j => adicEval_X _ _ _ have hin1 : (fun j => adicEval J (Sum.elim x.val (Sum.elim y.val z.val)) (subst (Sum.elim (fun l => (X (Sum.inl l) : MvPowerSeries (Fin g ⊕ (Fin g ⊕ Fin g)) R)) fun l => X (Sum.inr (Sum.inl l))) (F.toPowerSeries j))) = fun j => adicEval J (Sum.elim x.val y.val) (F.toPowerSeries j) := by funext j rw [adicEval_subst_elim F J hw ha hb, hxa, hyb] have hin2 : (fun j => adicEval J (Sum.elim x.val (Sum.elim y.val z.val)) (subst (Sum.elim (fun l => (X (Sum.inr (Sum.inl l)) : MvPowerSeries (Fin g ⊕ (Fin g ⊕ Fin g)) R)) fun l => X (Sum.inr (Sum.inr l))) (F.toPowerSeries j))) = fun j => adicEval J (Sum.elim y.val z.val) (F.toPowerSeries j) := by funext j rw [adicEval_subst_elim F J hw hb hc, hyb, hzc] have key := congrArg (adicEval J (Sum.elim x.val (Sum.elim y.val z.val))) (subst_elim_assoc F ha hb hc i) rw [adicEval_subst_elim F J hw (constantCoeff_subst_elim F ha hb) hc, adicEval_subst_elim F J hw ha (constantCoeff_subst_elim F hb hc), hin1, hzc, hxa, hin2] at key exact key protected theorem zero_add (x : Points F S J) : 0 + x = x := by ext i show adicEval J (Sum.elim (fun _ => 0) x.val) (F.toPowerSeries i) = x.val i have h0 : ∀ j : Fin g, (0 : MvPowerSeries (Fin g) R).constantCoeff = 0 := fun _ => map_zero _ have hX : ∀ j : Fin g, (X j : MvPowerSeries (Fin g) R).constantCoeff = 0 := fun j => constantCoeff_X _ have hz : (fun _ : Fin g => adicEval J x.val (0 : MvPowerSeries (Fin g) R)) = fun _ => 0 := by funext j rw [← coe_adicEvalAlgHom J x.mem_radical, map_zero] have key := congrArg (adicEval J x.val) (subst_elim_zero_left F hX i) rw [adicEval_subst_elim F J x.mem_radical h0 hX, hz, adicEval_X_eq, adicEval_X] at key exact key protected theorem add_zero (x : Points F S J) : x + 0 = x := by ext i show adicEval J (Sum.elim x.val fun _ => 0) (F.toPowerSeries i) = x.val i have h0 : ∀ j : Fin g, (0 : MvPowerSeries (Fin g) R).constantCoeff = 0 := fun _ => map_zero _ have hX : ∀ j : Fin g, (X j : MvPowerSeries (Fin g) R).constantCoeff = 0 := fun j => constantCoeff_X _ have hz : (fun _ : Fin g => adicEval J x.val (0 : MvPowerSeries (Fin g) R)) = fun _ => 0 := by funext j rw [← coe_adicEvalAlgHom J x.mem_radical, map_zero] have key := congrArg (adicEval J x.val) (subst_elim_zero_right F hX i) rw [adicEval_subst_elim F J x.mem_radical hX h0, hz, adicEval_X_eq, adicEval_X] at key exact key protected theorem neg_add_cancel (x : Points F S J) : -x + x = 0 := by ext i show adicEval J (Sum.elim (fun j => adicEval J x.val (invSeries F j)) x.val) (F.toPowerSeries i) = 0 have hX : ∀ j : Fin g, (X j : MvPowerSeries (Fin g) R).constantCoeff = 0 := fun j => constantCoeff_X _ have hz : adicEval J x.val (0 : MvPowerSeries (Fin g) R) = 0 := by rw [← coe_adicEvalAlgHom J x.mem_radical, map_zero] have key := congrArg (adicEval J x.val) (subst_elim_invSeries_X F i) rw [adicEval_subst_elim F J x.mem_radical (constantCoeff_invSeries F) hX, adicEval_X_eq, hz] at key exact key instance instAddGroup : AddGroup (Points F S J) where add := (· + ·) zero := 0 neg := fun x => -x add_assoc := Points.add_assoc zero_add := Points.zero_add add_zero := Points.add_zero neg_add_cancel := Points.neg_add_cancel nsmul := nsmulRec zsmul := zsmulRec protected theorem add_comm [IsComm F] (x y : Points F S J) : x + y = y + x := by ext i show adicEval J (Sum.elim x.val y.val) (F.toPowerSeries i) = adicEval J (Sum.elim y.val x.val) (F.toPowerSeries i) have hw : ∀ t, Sum.elim x.val y.val t ∈ J.radical := forall_sumElim x.mem_radical y.mem_radical have ha : ∀ j, (X (Sum.inl j) : MvPowerSeries (Fin g ⊕ Fin g) R).constantCoeff = 0 := fun j => constantCoeff_X _ have hb : ∀ j, (X (Sum.inr j) : MvPowerSeries (Fin g ⊕ Fin g) R).constantCoeff = 0 := fun j => constantCoeff_X _ have hxa : (fun j => adicEval J (Sum.elim x.val y.val) (X (Sum.inl j) : MvPowerSeries (Fin g ⊕ Fin g) R)) = x.val := funext fun j => adicEval_X _ _ _ have hyb : (fun j => adicEval J (Sum.elim x.val y.val) (X (Sum.inr j) : MvPowerSeries (Fin g ⊕ Fin g) R)) = y.val := funext fun j => adicEval_X _ _ _ have key := congrArg (adicEval J (Sum.elim x.val y.val)) (subst_elim_comm F ha hb i) rw [adicEval_subst_elim F J hw ha hb, adicEval_subst_elim F J hw hb ha, hxa, hyb] at key exact key instance instAddCommGroup [IsComm F] : AddCommGroup (Points F S J) := { Points.instAddGroup with add_comm := Points.add_comm } theorem val_nsmul (n : ℕ) (x : Points F S J) : (n • x).val = fun i => adicEval J x.val (F.nthSeries n i) := by induction n with | zero => funext i rw [zero_nsmul] show (0 : S) = adicEval J x.val (0 : MvPowerSeries (Fin g) R) rw [← coe_adicEvalAlgHom J x.mem_radical, map_zero] | succ n ih => funext i rw [succ_nsmul] show adicEval J (Sum.elim (n • x).val x.val) (F.toPowerSeries i) = adicEval J x.val (subst (Sum.elim (F.nthSeries n) fun j => X j) (F.toPowerSeries i)) rw [adicEval_subst_elim F J x.mem_radical (constantCoeff_nthSeries F n) (fun j => constantCoeff_X j), ih, adicEval_X_eq] end Points namespace Hom variable {F : MvFormalGroup g R} {G : MvFormalGroup h R} {H : MvFormalGroup k R} {S : Type*} [CommRing S] [Algebra R S] {J : Ideal S} [IsAdicComplete J S] def evalPoints (φ : Hom F G) : Points F S J →+ Points G S J := AddMonoidHom.mk' (fun x => ⟨fun i => adicEval J x.val (φ.toPowerSeries i), fun i => adicEval_mem_radical J x.mem_radical (φ.constantCoeff_eq_zero i)⟩) (fun x y => by ext i show adicEval J (fun j => adicEval J (Sum.elim x.val y.val) (F.toPowerSeries j)) (φ.toPowerSeries i) = adicEval J (Sum.elim (fun j => adicEval J x.val (φ.toPowerSeries j)) fun j => adicEval J y.val (φ.toPowerSeries j)) (G.toPowerSeries i) have hw : ∀ t, Sum.elim x.val y.val t ∈ J.radical := forall_sumElim x.mem_radical y.mem_radical have hl : HasSubst (fun l : Fin g => (X (Sum.inl l) : MvPowerSeries (Fin g ⊕ Fin g) R)) := hasSubst_of_constantCoeff_zero fun l => constantCoeff_X _ have hr : HasSubst (fun l : Fin g => (X (Sum.inr l) : MvPowerSeries (Fin g ⊕ Fin g) R)) := hasSubst_of_constantCoeff_zero fun l => constantCoeff_X _ have hU : ∀ j, (subst (fun l : Fin g => (X (Sum.inl l) : MvPowerSeries (Fin g ⊕ Fin g) R)) (φ.toPowerSeries j)).constantCoeff = 0 := fun j => constantCoeff_subst_eq_zero hl (fun l => constantCoeff_X _) (φ.constantCoeff_eq_zero j) have hV : ∀ j, (subst (fun l : Fin g => (X (Sum.inr l) : MvPowerSeries (Fin g ⊕ Fin g) R)) (φ.toPowerSeries j)).constantCoeff = 0 := fun j => constantCoeff_subst_eq_zero hr (fun l => constantCoeff_X _) (φ.constantCoeff_eq_zero j) have hxa : (fun l => adicEval J (Sum.elim x.val y.val) (X (Sum.inl l) : MvPowerSeries (Fin g ⊕ Fin g) R)) = x.val := funext fun l => adicEval_X _ _ _ have hyb : (fun l => adicEval J (Sum.elim x.val y.val) (X (Sum.inr l) : MvPowerSeries (Fin g ⊕ Fin g) R)) = y.val := funext fun l => adicEval_X _ _ _ have hin1 : (fun j => adicEval J (Sum.elim x.val y.val) (subst (fun l : Fin g => (X (Sum.inl l) : MvPowerSeries (Fin g ⊕ Fin g) R)) (φ.toPowerSeries j))) = fun j => adicEval J x.val (φ.toPowerSeries j) := by funext j rw [adicEval_subst J hw hl, hxa] have hin2 : (fun j => adicEval J (Sum.elim x.val y.val) (subst (fun l : Fin g => (X (Sum.inr l) : MvPowerSeries (Fin g ⊕ Fin g) R)) (φ.toPowerSeries j))) = fun j => adicEval J y.val (φ.toPowerSeries j) := by funext j rw [adicEval_subst J hw hr, hyb] have key := congrArg (adicEval J (Sum.elim x.val y.val)) (φ.subst_eq i) rw [adicEval_subst J hw F.hasSubst_toPowerSeries, adicEval_subst_elim G J hw hU hV, hin1, hin2] at key exact key) theorem val_evalPoints (φ : Hom F G) (x : Points F S J) (i : Fin h) : (φ.evalPoints x).val i = adicEval J x.val (φ.toPowerSeries i) := rfl theorem evalPoints_id (x : Points F S J) : (Hom.id F).evalPoints x = x := by ext i exact adicEval_X J x.val i theorem evalPoints_comp (ψ : Hom G H) (φ : Hom F G) (x : Points F S J) : (ψ.comp φ).evalPoints x = ψ.evalPoints (φ.evalPoints x) := by ext i exact adicEval_subst J x.mem_radical φ.hasSubst_toPowerSeries (ψ.toPowerSeries i) theorem evalPoints_zero (x : Points F S J) : (0 : Hom F G).evalPoints x = 0 := by ext i show adicEval J x.val (0 : MvPowerSeries (Fin g) R) = 0 rw [← coe_adicEvalAlgHom J x.mem_radical, map_zero] theorem evalPoints_add [IsComm G] (φ ψ : Hom F G) (x : Points F S J) : (φ + ψ).evalPoints x = φ.evalPoints x + ψ.evalPoints x := by ext i exact adicEval_subst_elim G J x.mem_radical φ.constantCoeff_eq_zero ψ.constantCoeff_eq_zero i theorem evalPoints_one (x : Points F S J) : Hom.evalPoints (1 : End F) x = x := evalPoints_id x theorem evalPoints_mul (φ ψ : End F) (x : Points F S J) : Hom.evalPoints (φ * ψ) x = Hom.evalPoints φ (Hom.evalPoints ψ x) := evalPoints_comp φ ψ x theorem evalPoints_natCast [IsComm F] (n : ℕ) (x : Points F S J) : Hom.evalPoints (n : End F) x = n • x := by ext i show adicEval J x.val (Hom.toPowerSeries (n : End F) i) = (n • x).val i rw [End.toPowerSeries_natCast F n, Points.val_nsmul] end Hom namespace Points variable {F : MvFormalGroup g R} {S : Type*} [CommRing S] [Algebra R S] {J : Ideal S} [IsAdicComplete J S] {S' : Type*} [CommRing S'] [Algebra R S'] {J' : Ideal S'} [IsAdicComplete J' S'] def map (φ : S →ₐ[R] S') (hJ : J.FG) (hφ : ∀ s ∈ J, φ s ∈ J'.radical) : Points F S J →+ Points F S' J' := AddMonoidHom.mk' (fun x => ⟨fun i => φ (x.val i), fun i => map_mem_radical φ hφ (x.mem_radical i)⟩) (fun x y => by ext i show φ (adicEval J (Sum.elim x.val y.val) (F.toPowerSeries i)) = adicEval J' (Sum.elim (fun j => φ (x.val j)) fun j => φ (y.val j)) (F.toPowerSeries i) have hfam : (fun s => φ (Sum.elim x.val y.val s)) = Sum.elim (fun j => φ (x.val j)) fun j => φ (y.val j) := by funext s rcases s with j | j <;> rfl rw [map_adicEval J J' φ hJ hφ (forall_sumElim x.mem_radical y.mem_radical), hfam]) theorem val_map (φ : S →ₐ[R] S') (hJ : J.FG) (hφ : ∀ s ∈ J, φ s ∈ J'.radical) (x : Points F S J) (i : Fin g) : (map φ hJ hφ x).val i = φ (x.val i) := rfl end Points namespace Hom variable {F : MvFormalGroup g R} {G : MvFormalGroup h R} {S : Type*} [CommRing S] [Algebra R S] {J : Ideal S} [IsAdicComplete J S] {S' : Type*} [CommRing S'] [Algebra R S'] {J' : Ideal S'} [IsAdicComplete J' S'] theorem evalPoints_map (ψ : Hom F G) (φ : S →ₐ[R] S') (hJ : J.FG) (hφ : ∀ s ∈ J, φ s ∈ J'.radical) (x : Points F S J) : ψ.evalPoints (Points.map φ hJ hφ x) = Points.map φ hJ hφ (ψ.evalPoints x) := by ext i exact (map_adicEval J J' φ hJ hφ x.mem_radical (ψ.toPowerSeries i)).symm end Hom end MvFormalGroup
Statements phrased using this module (70)
- Fontaine's lifting criterion for maps from F[p^v]
Deformation.exists_algHom_baseChange_eq_of_forall_map_mem_fontaineKer_of_mvFormalGroup40 below · depth 21 - Integral rescaled exponential under a local Cartier dual
MvFormalGroup.exists_rescaledExp_tendsto_zero_of_isLocalRing_cartierDual25 below · depth 21 - Connected component of a level as formal group p^v-torsion
PDivisibleGroup.exists_connectedComponent_mvFormalGroup_of_isLocalRing_cartierDual77 below · depth 21 - Rescaled-logarithm Witt vectors lie in `wittHom` and `fontaineKer`
Deformation.exists_wittVector_ghostComponent_truncate_map_mem_wittHom_fontaineKer_of_mvFormalGroup37 below · depth 22 - Integral logarithm criterion for p^v-torsion congruence
MvFormalGroup.Points.exists_nsmul_eq_zero_and_sub_mem_iff_of_rescaledLog0 below · depth 22 - Box truncations of the logarithm lie in p^vY at w'
MvFormalGroup.eventually_aeval_boxTrunc_mem_of_forall_adicEval_scaledLogTrunc_mem0 below · depth 22 - Integral rescaled exponential for unipotent p^v-torsion, case p=2
MvFormalGroup.exists_rescaledExp_tendsto_zero_of_isLocalRing_cartierDual_of_eq_two22 below · depth 22 - Connected part of a unipotent p-divisible tower as a formal group
PDivisibleGroup.exists_mvFormalGroup_connectedComponent_tower_of_isLocalRing_cartierDual76 below · depth 22 - Scaled truncations of the logarithm land in p^N R
Deformation.map_scaledLogTrunc_mem_span_pow_of_mvFormalGroup1 below · depth 23 - Truncated logarithm covectors are additive modulo p
Deformation.truncate_map_mem_wittHom_of_forall_coeff_ghostComponent_eq_logCovector35 below · depth 23 - Nilpotence of the Hasse–Witt matrix of [p]_F
MvFormalGroup.isNilpotent_hasseWittMatrix_nthSeries_of_isLocalRing_cartierDual11 below · depth 23 - Formal group law from coordinates on a Hopf-algebra tower
PDivisibleGroup.exists_mvFormalGroup_comul_eq_adicEval_of_specialFibre_coordinates5 below · depth 23 - Kernel of the formal coordinates is the [p^v]-series ideal
PDivisibleGroup.ker_eq_span_range_nthSeries_of_comul_eq_adicEval8 below · depth 23 - Far Witt components of the logarithm covector lie in pR
Deformation.map_coeff_mem_span_of_forall_coeff_ghostComponent_eq_logCovector26 below · depth 24 - Algebra maps into J-adically complete rings are adic evaluation
MvFormalGroup.algHom_apply_eq_adicEval_of_forall_apply_X_mem_radical0 below · depth 24 - Hasse–Witt relation for point derivations on the Cartier dual
MvFormalGroup.exists_cartierDual_derivation_pow_eq_sum_hasseWitt_smul9 below · depth 24 - Cocommutativity from a commutative formal group law
MvFormalGroup.isCocomm_of_comul_eq_adicEval_toPowerSeries1 below · depth 24 - Power series presentation from special-fibre coordinates
MvPowerSeries.exists_algHom_adicEval_forall_comp_eq_of_specialFibre_coordinates2 below · depth 24 - Unique split coordinates of a continuous point of Fontaine's functor
Deformation.HondaSystem.existsUnique_coords_of_mem_fontaineFunctor_of_splitCoordinates70 below · depth 25 - Existence in Fontaine's functor with prescribed split coordinates
Deformation.HondaSystem.exists_mem_fontaineFunctor_of_coords_of_splitCoordinates61 below · depth 25 - Lifted formal group law and its extension cocycle
Deformation.HondaSystem.exists_mvFormalGroup_cocycle_of_splitCoordinates66 below · depth 25 - Fontaine's lifting theorem from split coordinates and a cocycle
Deformation.HondaSystem.exists_pDivisibleTower_bijective_map_mem_fontaineHodge_of_splitCoordinates_of_cocycle35 below · depth 25 - Existence of lawful split coordinates in normal form
Deformation.HondaSystem.exists_splitCoordinates_lawful_normalForm111 below · depth 25 - Uniqueness of a point derivation from its values on coordinates
MvFormalGroup.cartierDual_eq_of_forall_apply_tmul_eq_of_map_mul0 below · depth 25 - Convolution powers of a point derivation as iterated invariant derivatives
MvFormalGroup.cartierDual_pow_apply_tmul_eq_algebraMap_constantCoeff_iterate3 below · depth 25 - Vanishing of the counit on formal group coordinates
MvFormalGroup.counit_apply_eq_zero_of_comul_eq_adicEval0 below · depth 25 - Coordinate point derivations in the Cartier dual of 𝔽ₚ ⊗ R
MvFormalGroup.exists_cartierDual_apply_tmul_eq_and_map_mul_of_ker_eq_span_nthSeries3 below · depth 25 - Fontaine's unique lifting of logarithm-type coordinates
Deformation.FontaineLift.existsUnique_sub_mem_and_wSeries_adicEval_eq_of_isUnit_linearPart9 below · depth 26 - Convergence of Fontaine's w-series at nilpotent points
Deformation.FontaineLift.isPadicLimit_wPartialSum_adicEval0 below · depth 26 - Reduction of Φ modulo p equals Φ₀
Deformation.HondaSystem.SplitCoordinates.map_eq_phi0_of_forall_exists_convMul_apply_kappa_X0 below · depth 26 - Naturality of the Fontaine functor in the test algebra
Deformation.HondaSystem.SplitCoordinates.map_mem_fontaineFunctor_and_described2 below · depth 26 - Special fibre of the twisted tower: Gᶜᵥ⊗ G^eᵥ≅𝔽ₚ⊗ Lᵥ
Deformation.HondaSystem.exists_bijective_tensorProduct_specialFibre_of_cocycle2 below · depth 26 - Fontaine's normalised coordinates on the connected factor
Deformation.HondaSystem.exists_mvFormalGroup_basis_coeff_eq_normalForm93 below · depth 26 - Fontaine–Hodge membership at a twisted Tate level
Deformation.HondaSystem.map_apply_basis_mem_fontaineHodge_of_cocycle3 below · depth 26 - Natural group laws on p-adic test algebras come from a unique commutative formal group
MvFormalGroup.existsUnique_isComm_and_apply_eq_adicEval_toPowerSeries_of_natural_of_mem_radical1 below · depth 26 - Nilpotent tuples lie in ker[p^v] for large v
MvFormalGroup.exists_algHom_apply_eq_of_isNilpotent_of_ker_eq_span_nthSeries0 below · depth 26 - Twisted tower from a formal group and a 2-cocycle
MvFormalGroup.exists_pDivisibleTower_of_cocycle29 below · depth 26 - Continuity of the w-series in the evaluation point
Deformation.FontaineLift.wSeries_adicEval_sub_wSeries_adicEval_mem_powSub2 below · depth 27 - Newton step for Fontaine's w-series at p=2
Deformation.PLoc.wPartialSum_adicEval_add_sub_sub_algebraMap_mul_add_mem_powSub_two2 below · depth 27 - Newton linearisation of Fontaine's partial w-sums
Deformation.PLoc.wPartialSum_adicEval_add_sub_sub_algebraMap_mul_sum_mem_powSub2 below · depth 27 - Functorial group law on nilpotents is a unique commutative formal group
MvFormalGroup.existsUnique_isComm_and_apply_eq_adicEval_toPowerSeries_of_natural0 below · depth 27 - One level of the cocycle-twisted p-divisible tower
MvFormalGroup.exists_hopfAlgebra_presentation_comul_eq_of_cocycle_of_powerDefect24 below · depth 27 - Linear re-coordinatisation of a formal-group presentation
MvFormalGroup.exists_isComm_comp_substAlgHom_of_isUnit_matrix0 below · depth 27 - Power defects of a symmetric 2-cocycle over a p-divisible tower
MvFormalGroup.exists_powerDefect_map_comul_eq_adicEval_of_cocycle1 below · depth 27 - Transition maps for the twisted Tate tower of height h+hₑ
MvFormalGroup.exists_transition_ker_eq_torsionIdeal_of_presentation_of_powerDefect4 below · depth 27 - Formal group coordinates on a connected p-divisible tower over 𝔽ₚ
PDivisibleGroup.exists_mvFormalGroup_ker_eq_span_nthSeries_jointly_injective_surjective_of_isLocalRing_zmodp58 below · depth 27 - First-order Taylor expansion for adic evaluation of power series
MvFormalGroup.adicEval_add_sub_adicEval_sub_sum_mul_mem_span_sq0 below · depth 28 - Fibres of [p^v]_Φ are free of rank p^{vh}
MvFormalGroup.free_and_finrank_quotient_span_nthSeries_sub_C_eq_pow_of_nontrivial21 below · depth 28 - Freeness of 𝒪[[X]] under [p^v]_Φ-substitution
MvFormalGroup.exists_forall_existsUnique_eq_sum_subst_nthSeries_mul_of_finrank_eq_pow18 below · depth 29 - Truncated and J-adic evaluation agree when Jⁿ⁺¹=0
MvFormalGroup.nilEval_eq_adicEval_of_pow_succ_eq_bot0 below · depth 29 - Yoneda lemma for formal affine space on nilpotent ideals
MvPowerSeries.existsUnique_apply_eq_adicEval_of_natural_of_isNilpotent0 below · depth 29 - Rigidity for formal mathcal O_D-modules from p-adic density
CerednikDrinfeld.FormalODModule.existsUnique_hom_apply_eq_adicEval_of_natural_of_dense_of_isNilpotent2 below · depth 30 - Formal group of a smooth commutative relative group law
GoodReductionJacobian.RelativeGroupLaw.exists_mvFormalGroup_kernelOfReduction_of_smooth5 below · depth 30 - Natural additive maps on nilpotent points come from a unique homomorphism
MvFormalGroup.existsUnique_hom_apply_eq_adicEval_of_natural_of_isNilpotent0 below · depth 30 - Formal mathcal O_D-module homomorphisms from natural maps on nilpotent points
CerednikDrinfeld.FormalODModule.existsUnique_hom_apply_eq_adicEval_of_natural_of_isNilpotent1 below · depth 31 - Yoneda: natural group laws on nilpotent ideals are formal group laws
MvFormalGroup.existsUnique_isComm_and_apply_eq_adicEval_of_natural_of_isNilpotent0 below · depth 31 - Quotient by a finite free subgroup ideal is a Hopf algebra
CerednikDrinfeld.FormalODModule.exists_hopfAlgebra_ker_eq_of_subgroup_ideal1 below · depth 36 - Formal coordinates transported along an isomorphism of formal groups
GoodReductionJacobian.RelativeGroupLaw.isFormalCoordinates_comp_adicEval_of_hom1 below · depth 36 - Hopf algebra structure on the n-torsion of a formal group
MvFormalGroup.exists_hopfAlgebra_ker_eq_span_nthSeries_comul_eq_adicEval_of_isAdicComplete3 below · depth 36 - Base change of the coordinate presentation of Φ[p^N]
CerednikDrinfeld.FormalODModule.exists_family_algHom_tensorProduct_adicEval_surjective_ker_eq_span_act_pow_natural2 below · depth 37 - Φ[p^N] as a Hopf algebra with mathcal O_D-coaction
CerednikDrinfeld.FormalODModule.exists_hopfAlgebra_ker_eq_span_act_pow_and_forall_bialgHom_subst_act2 below · depth 37 - Vanishing in Q ⊗_S Q versus membership in (I(x), I(y))
MvFormalGroup.map_mkQ_adicEval_sumElim_tmul_eq_zero_iff_mem_span_image_subst0 below · depth 37 - Truncated formal group law as a finite Hopf algebra, nilpotent case
MvFormalGroup.exists_hopfAlgebra_surjective_ker_eq_span_nthSeries_comul_eq_adicEval_bot_of_isNilpotent1 below · depth 38 - Coaction of the subgroup Hopf algebra on the levels B[[x]]/I^N
CerednikDrinfeld.FormalODModule.exists_levelCoaction_of_subgroup_ideal_of_ne_zero0 below · depth 39 - One-step lift of an invariant element modulo I^{N+1}
CerednikDrinfeld.FormalODModule.exists_mem_pow_and_invariant_succ4 below · depth 39 - First-order invariant representatives modulo (x) I
CerednikDrinfeld.FormalODModule.exists_sub_mem_and_firstOrder_invariant5 below · depth 39 - Drinfeld bases lifting the origin as roots of g, naturally
ModularCurve.LevelModuliPackageAbs.exists_equiv_isDrinfeldBasisOver_subtype_eval_map_eq_zero_natural_of_nthSeries_eq_X_mul_mul_of_isDomain_adjoinRoot_rigidDataH1Pow951 below · depth 39 - Vanishing at all truncated points gives membership in I(y)
MvPowerSeries.mem_span_image_subst_inr_of_forall_adicEval_eq_zero_of_surjective1 below · depth 39 - Cocycles with values in a Hopf-module ideal are coboundaries
HopfAlgebra.exists_eq_coaction_sub_tmul_one_of_cocycle2 below · depth 40 - Relative fundamental theorem of Hopf modules for ideals
HopfAlgebra.le_span_coinvariant_and_exists_coinvariant_sub_mem1 below · depth 40