Definitions/Def_MvFormalGroup_CartierModuleWittAction.lean
Witt vector action on Cartier modules of formal groups
Fix a prime p and a commutative ring R. The first half of the module produces, for each Witt vector w \in W(R), the family of polynomials giving multiplication by w on the Witt formal group. Writing \mathrm{cVec}\,w for the image of w under the coefficientwise map C \colon R \to R[X_0,X_1,\dots], the polynomial mulPoly p w n is the n-th Witt coordinate of the product of \mathrm{cVec}\,w with the tautological Witt vector (X_0,X_1,\dots), i.e. the Witt multiplication polynomial M_n(w_0,\dots,w_n;X_0,\dots,X_n); mulFam p w is the induced family of power series in R[[X_0,X_1,\dots]]. Its basic identities are established: additivity in w through the Witt addition polynomials, multiplicativity as composition of families, w=1 giving X_n, w=0 giving 0, value C(w_0)X_0 in degree 0, and C(a^{p^n})X_n for a Teichmüller representative (this last resting on WittVector.teichmuller_mul_coeff, proved for Witt vectors over an arbitrary commutative ring: ([a]\cdot y)_n = a^{p^n}y_n). Each mulPoly p w n is weighted homogeneous of degree p^n for the weights m \mapsto p^m; hence it has zero constant term and the family is substitutable, and isEndo_mulFam records that mulFam p w satisfies the project's predicate IsEndo p, namely substitutability, vanishing constant terms, and compatibility with the Witt addition family.
The second half uses this to define, for a commutative formal group law \Phi of dimension d over R, the additive endomorphism wittSMul w of CartierModule p Φ by precomposition with mulFam p w, and registers the resulting Module (WittVector p R) (CartierModule p Φ) instance; on the defining power series, (w \bullet f)_j = f_j(w \cdot X). The relations with the other operators are then proved: Teichmüller representatives act as the homotheties of the companion module, homotheties commute with the action, natural number scalars agree with the additive \mathbb{N}-action, F(w \bullet f) = \sigma(w) \bullet F f, w \bullet Vf = V(\sigma(w) \bullet f) and, over a perfect ring of characteristic p, V(w \bullet f) = \sigma^{-1}(w) \bullet Vf, together with VF = p in the module sense. Homomorphisms of formal groups induce W(R)-linear maps (mapLinear), the endomorphism action commutes with the Witt action, the tangent map satisfies \mathrm{tangent}(w \bullet f) = w_0 \cdot \mathrm{tangent}(f) (with a supporting lemma computing the degree-one coefficient of a substitution into a weight-graded family), and on the linear curves of the examples namespace the action is w \bullet \mathrm{addLinear}(v) = \mathrm{addLinear}(w_0 v).
Relation to Mathlib
Mathlib supplies the Witt vectors with their ring structure, Teichmüller representatives, Frobenius, Verschiebung and the IsPoly/IsPoly₂ machinery used here; the auxiliary lemmas WittVector.teichmuller_mul_coeff, WittVector.mk_coeff_eq, WittVector.map_peval and WittVector.peval_X are additions to that namespace. The Cartier module of a multivariate formal group law and its Witt vector module structure are the project's own.
Where it is used
The W(R)-module structure makes the Cartier module of a commutative formal group law an object of W(R)-linear algebra, with F semilinear for the Frobenius of W(R) and V for its inverse; this is the form in which Dieudonné-theoretic statements about formal groups are used in the study of special formal modules entering the construction of the relevant Shimura-type objects.
References
- M. Hazewinkel, Formal Groups and Applications, Pure and Applied Mathematics 78, Academic Press, 1978
- T. Zink, Cartiertheorie kommutativer formaler Gruppen, Teubner-Texte zur Mathematik 68, Teubner, 1984
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 677 lines
- 75 declarations
- used in the statements of 125 theorems and imported by 138 proofs
- imports 3 definition modules
Source file: Definitions/Def_MvFormalGroup_CartierModuleWittAction.lean
Imports
Imported by
Def_CerednikDrinfeld_CartierLMapFibreDef_CerednikDrinfeld_CartierModuleModelDef_CerednikDrinfeld_CartierStructureConstantsDef_CerednikDrinfeld_CritChartEndMatrixDef_CerednikDrinfeld_CriticalIndexChartDef_MvFormalGroup_CartierModuleBaseChangeDef_MvFormalGroup_CartierModuleIntVerschiebungDef_MvFormalGroup_WittPointFamilyDef_MvFormalGroup_WittPointFamilyInt
Declarations
- theorem
WittVector.teichmuller_mul_coeff - theorem
WittVector.mk_coeff_eq - theorem
WittVector.map_peval - theorem
WittVector.peval_X - abbrev
MvFormalGroup.WittLaw.cVec - def
MvFormalGroup.WittLaw.mulPoly - def
MvFormalGroup.WittLaw.mulFam - theorem
MvFormalGroup.WittLaw.mulFam_apply - theorem
MvFormalGroup.WittLaw.coe_aeval - theorem
MvFormalGroup.WittLaw.coe_peval - theorem
MvFormalGroup.WittLaw.cVec_coeff - theorem
MvFormalGroup.WittLaw.cVec_add - theorem
MvFormalGroup.WittLaw.cVec_mul - theorem
MvFormalGroup.WittLaw.cVec_one - theorem
MvFormalGroup.WittLaw.cVec_zero - theorem
MvFormalGroup.WittLaw.mulPoly_eq_peval - theorem
MvFormalGroup.WittLaw.aeval_mulPoly - theorem
MvFormalGroup.WittLaw.mulPoly_add - theorem
MvFormalGroup.WittLaw.mulPoly_mul - theorem
MvFormalGroup.WittLaw.mulPoly_one - theorem
MvFormalGroup.WittLaw.mulPoly_zero - theorem
MvFormalGroup.WittLaw.mulPoly_at_zero - theorem
MvFormalGroup.WittLaw.mulPoly_teichmuller - def
MvFormalGroup.WittLaw.verPoly - theorem
MvFormalGroup.WittLaw.verPoly_zero - theorem
MvFormalGroup.WittLaw.verPoly_succ - theorem
MvFormalGroup.WittLaw.coe_verPoly - theorem
MvFormalGroup.WittLaw.frobenius_cVec - theorem
MvFormalGroup.WittLaw.aeval_verPoly_mulPoly - theorem
MvFormalGroup.WittLaw.mulPoly_pow_char - theorem
MvFormalGroup.WittLaw.isWeightedHomogeneous_peval_C_X - theorem
MvFormalGroup.WittLaw.isWeightedHomogeneous_mulPoly - theorem
MvFormalGroup.WittLaw.weight_eq_of_coeff_mulFam_ne_zero - theorem
MvFormalGroup.WittLaw.constantCoeff_mulFam - theorem
MvFormalGroup.WittLaw.constantCoeff_mulPoly - theorem
MvFormalGroup.WittLaw.hasSubst_mulFam - def
MvFormalGroup.WittLaw.xVec - def
MvFormalGroup.WittLaw.addPolyR - theorem
MvFormalGroup.WittLaw.coe_addPolyR - theorem
MvFormalGroup.WittLaw.xVec_coeff - theorem
MvFormalGroup.WittLaw.xVec_add - theorem
MvFormalGroup.WittLaw.pairFam_mulFam - theorem
MvFormalGroup.WittLaw.subst_addFam_mulFam - theorem
MvFormalGroup.WittLaw.isEndo_mulFam - theorem
MvFormalGroup.WittLaw.subst_mulFam_mulFam - theorem
MvFormalGroup.WittLaw.mulFam_add - theorem
MvFormalGroup.WittLaw.mulFam_one - theorem
MvFormalGroup.WittLaw.mulFam_zero - theorem
MvFormalGroup.WittLaw.mulFam_teichmuller - theorem
MvFormalGroup.WittLaw.subst_verFam_mulFam - theorem
MvFormalGroup.WittLaw.subst_mulFam_frobFam - def
MvFormalGroup.CartierModule.wittSMul - theorem
MvFormalGroup.CartierModule.toPowerSeries_wittSMul - theorem
MvFormalGroup.CartierModule.wittSMul_one - theorem
MvFormalGroup.CartierModule.wittSMul_zero_left - theorem
MvFormalGroup.CartierModule.wittSMul_mul - theorem
MvFormalGroup.CartierModule.wittSMul_add_left - instance
MvFormalGroup.CartierModule.instModuleWittVector - theorem
MvFormalGroup.CartierModule.smul_def - theorem
MvFormalGroup.CartierModule.smul_eq_precomp - theorem
MvFormalGroup.CartierModule.toPowerSeries_smul_witt - theorem
MvFormalGroup.CartierModule.teichmuller_smul - theorem
MvFormalGroup.CartierModule.homothety_smul_witt - theorem
MvFormalGroup.CartierModule.natCast_smul_eq_nsmul' - theorem
MvFormalGroup.CartierModule.frobenius_smul - theorem
MvFormalGroup.CartierModule.smul_verschiebung - theorem
MvFormalGroup.CartierModule.verschiebung_smul - theorem
MvFormalGroup.CartierModule.verschiebung_frobenius_eq_smul - theorem
MvFormalGroup.CartierModule.map_smul_witt - theorem
MvFormalGroup.CartierModule.endAct_smul_witt - def
MvFormalGroup.CartierModule.mapLinear - theorem
MvFormalGroup.CartierModule.mapLinear_apply - theorem
MvFormalGroup.CartierModule.coeff_single_zero_subst_of_weight - theorem
MvFormalGroup.CartierModule.tangent_smul_witt - theorem
MvFormalGroup.CartierModule.Examples.smul_addLinear
Source
import Mathlib import Definitions.Def_MvFormalGroup_NegV2 import Definitions.Def_MvFormalGroup_CartierModule import Definitions.Def_MvFormalGroup_CartierModuleHomothety set_option autoImplicit false noncomputable section universe u open MvPolynomial in theorem WittVector.teichmuller_mul_coeff (p : ℕ) [hp : Fact p.Prime] {A : Type u} [CommRing A] (a : A) (y : WittVector p A) (n : ℕ) : (WittVector.teichmuller p a * y).coeff n = a ^ p ^ n * y.coeff n := by let f : ∀ ⦃S : Type u⦄ [CommRing S], WittVector p S → WittVector p S → WittVector p S := fun S _ x y => WittVector.teichmuller p (x.coeff 0) * y let g : ∀ ⦃S : Type u⦄ [CommRing S], WittVector p S → WittVector p S → WittVector p S := fun S _ x y => WittVector.mk p fun n => x.coeff 0 ^ p ^ n * y.coeff n have hteich : WittVector.IsPoly p fun S _ (x : WittVector p S) => WittVector.teichmuller p (x.coeff 0) := by refine ⟨⟨fun n => if n = 0 then X 0 else 0, ?_⟩⟩ intro S _ x funext n cases n with | zero => simp [WittVector.teichmuller_coeff_zero] | succ n => simp [WittVector.teichmuller_coeff_pos p _ _ (Nat.succ_pos n)] have hf : WittVector.IsPoly₂ p f := @WittVector.IsPoly₂.comp p _ _ _ WittVector.mulIsPoly₂ hteich (WittVector.idIsPolyI' p) have hg : WittVector.IsPoly₂ p g := by refine ⟨⟨fun n => X ((0 : Fin 2), 0) ^ p ^ n * X ((1 : Fin 2), n), ?_⟩⟩ intro S _ x y funext n simp [g, WittVector.peval, Function.uncurry] have key := WittVector.IsPoly₂.ext hf hg (fun S _ x y n => by simp only [f, g, map_mul, WittVector.ghostComponent_teichmuller] rw [WittVector.ghostComponent_apply, WittVector.ghostComponent_apply, aeval_wittPolynomial, aeval_wittPolynomial, Finset.mul_sum] refine Finset.sum_congr rfl fun i hi => ?_ have hi' : i ≤ n := Nat.lt_succ_iff.mp (Finset.mem_range.mp hi) simp only [WittVector.coeff_mk] rw [mul_pow, ← pow_mul, ← pow_add, Nat.add_sub_cancel' hi'] ring) A (WittVector.mk p fun n => if n = 0 then a else 0) y have h0 : (WittVector.mk p fun n => if n = 0 then a else (0 : A)).coeff 0 = a := by simp simp only [f, g, h0] at key rw [key, WittVector.coeff_mk] namespace MvFormalGroup open MvPowerSeries WittLaw theorem _root_.WittVector.mk_coeff_eq {p : ℕ} {A : Type*} [CommRing A] (x : WittVector p A) : WittVector.mk p (fun m => x.coeff m) = x := by ext m; rfl theorem _root_.WittVector.map_peval {k : ℕ} {A B : Type*} [CommRing A] [CommRing B] {F : Type*} [FunLike F A B] [RingHomClass F A B] (φ : F) (Q : MvPolynomial (Fin k × ℕ) ℤ) (x : Fin k → ℕ → A) : φ (WittVector.peval Q x) = WittVector.peval Q fun i m => φ (x i m) := by unfold WittVector.peval let φ' : A →+* B := RingHomClass.toRingHom φ show φ' _ = _ let ψ₁ : MvPolynomial (Fin k × ℕ) ℤ →+* B := φ'.comp (MvPolynomial.aeval (Function.uncurry x)).toRingHom let ψ₂ : MvPolynomial (Fin k × ℕ) ℤ →+* B := (MvPolynomial.aeval (Function.uncurry fun i m => φ (x i m))).toRingHom have hψ : ψ₁ = ψ₂ := by refine MvPolynomial.ringHom_ext (fun r => ?_) (fun im => ?_) · exact RingHom.congr_fun (RingHom.ext_int (ψ₁.comp MvPolynomial.C) (ψ₂.comp MvPolynomial.C)) r · rcases im with ⟨i, m⟩ simp [ψ₁, ψ₂, φ', Function.uncurry] exact RingHom.congr_fun hψ Q theorem _root_.WittVector.peval_X {k : ℕ} (R : Type*) [CommRing R] (Q : MvPolynomial (Fin k × ℕ) ℤ) : WittVector.peval Q (fun i m => (MvPolynomial.X (i, m) : MvPolynomial (Fin k × ℕ) R)) = MvPolynomial.map (Int.castRingHom R) Q := by unfold WittVector.peval let ψ₁ : MvPolynomial (Fin k × ℕ) ℤ →+* MvPolynomial (Fin k × ℕ) R := (MvPolynomial.aeval (Function.uncurry fun i m => (MvPolynomial.X (i, m) : MvPolynomial (Fin k × ℕ) R))).toRingHom have hψ : ψ₁ = MvPolynomial.map (Int.castRingHom R) := by refine MvPolynomial.ringHom_ext (fun r => ?_) (fun im => ?_) · exact RingHom.congr_fun (RingHom.ext_int (ψ₁.comp MvPolynomial.C) ((MvPolynomial.map (Int.castRingHom R)).comp MvPolynomial.C)) r · rcases im with ⟨i, m⟩ simp [ψ₁, Function.uncurry] exact RingHom.congr_fun hψ Q namespace WittLaw variable (p : ℕ) [hp : Fact p.Prime] {R : Type u} [CommRing R] abbrev cVec {τ : Type} (w : WittVector p R) : WittVector p (MvPolynomial τ R) := WittVector.map (MvPolynomial.C : R →+* MvPolynomial τ R) w def mulPoly (w : WittVector p R) (n : ℕ) : MvPolynomial ℕ R := (cVec p w * WittVector.mk p (MvPolynomial.X : ℕ → MvPolynomial ℕ R)).coeff n def mulFam (w : WittVector p R) : ℕ → MvPowerSeries ℕ R := fun n => (mulPoly p w n : MvPowerSeries ℕ R) variable {p} @[simp] theorem mulFam_apply (w : WittVector p R) (n : ℕ) : mulFam p w n = (mulPoly p w n : MvPowerSeries ℕ R) := rfl omit hp in theorem coe_aeval {σ τ : Type*} (y : σ → MvPolynomial τ R) (P : MvPolynomial σ R) : ((MvPolynomial.aeval y P : MvPolynomial τ R) : MvPowerSeries τ R) = subst (fun i => (y i : MvPowerSeries τ R)) (P : MvPowerSeries σ R) := by rw [subst_coe] let ψ₁ : MvPolynomial σ R →ₐ[R] MvPowerSeries τ R := (MvPolynomial.coeToMvPowerSeries.algHom R).comp (MvPolynomial.aeval y) let ψ₂ : MvPolynomial σ R →ₐ[R] MvPowerSeries τ R := MvPolynomial.aeval fun i => (y i : MvPowerSeries τ R) have hψ : ψ₁ = ψ₂ := MvPolynomial.algHom_ext fun i => by simp [ψ₁, ψ₂] exact AlgHom.congr_fun hψ P omit hp in theorem coe_peval {k : ℕ} {τ : Type*} (Q : MvPolynomial (Fin k × ℕ) ℤ) (x : Fin k → ℕ → MvPolynomial τ R) : subst (fun im : Fin k × ℕ => (x im.1 im.2 : MvPowerSeries τ R)) ((MvPolynomial.map (Int.castRingHom R) Q : MvPolynomial (Fin k × ℕ) R) : MvPowerSeries (Fin k × ℕ) R) = ((WittVector.peval Q x : MvPolynomial τ R) : MvPowerSeries τ R) := by rw [subst_coe] unfold WittVector.peval let ψ₁ : MvPolynomial (Fin k × ℕ) ℤ →+* MvPowerSeries τ R := (MvPolynomial.aeval fun im : Fin k × ℕ => (x im.1 im.2 : MvPowerSeries τ R)).toRingHom.comp (MvPolynomial.map (Int.castRingHom R)) let ψ₂ : MvPolynomial (Fin k × ℕ) ℤ →+* MvPowerSeries τ R := (MvPolynomial.coeToMvPowerSeries.ringHom (σ := τ) (R := R)).comp (MvPolynomial.aeval (Function.uncurry x)).toRingHom have hψ : ψ₁ = ψ₂ := by refine MvPolynomial.ringHom_ext (fun r => ?_) (fun im => ?_) · exact RingHom.congr_fun (RingHom.ext_int (ψ₁.comp MvPolynomial.C) (ψ₂.comp MvPolynomial.C)) r · rcases im with ⟨i, m⟩ simp [ψ₁, ψ₂, Function.uncurry] exact RingHom.congr_fun hψ Q @[simp] theorem cVec_coeff {τ : Type} (w : WittVector p R) (m : ℕ) : (cVec p (τ := τ) w).coeff m = MvPolynomial.C (w.coeff m) := WittVector.map_coeff _ _ _ @[simp] theorem cVec_add {τ : Type} (w₁ w₂ : WittVector p R) : cVec p (τ := τ) (w₁ + w₂) = cVec p w₁ + cVec p w₂ := map_add _ _ _ @[simp] theorem cVec_mul {τ : Type} (w₁ w₂ : WittVector p R) : cVec p (τ := τ) (w₁ * w₂) = cVec p w₁ * cVec p w₂ := map_mul _ _ _ @[simp] theorem cVec_one {τ : Type} : cVec p (τ := τ) (1 : WittVector p R) = 1 := map_one _ @[simp] theorem cVec_zero {τ : Type} : cVec p (τ := τ) (0 : WittVector p R) = 0 := map_zero _ theorem mulPoly_eq_peval (w : WittVector p R) (n : ℕ) : mulPoly p w n = WittVector.peval (WittVector.wittMul p n) ![fun m => MvPolynomial.C (w.coeff m), MvPolynomial.X] := by rw [mulPoly, WittVector.mul_coeff] congr 1 theorem aeval_mulPoly {τ : Type} (w : WittVector p R) (y : ℕ → MvPolynomial τ R) (n : ℕ) : MvPolynomial.aeval y (mulPoly p w n) = (cVec p w * WittVector.mk p y).coeff n := by rw [mulPoly, WittVector.mul_coeff, WittVector.mul_coeff, WittVector.map_peval (MvPolynomial.aeval y : MvPolynomial ℕ R →ₐ[R] MvPolynomial τ R)] congr 1 funext i m fin_cases i · show MvPolynomial.aeval y ((cVec p (τ := ℕ) w).coeff m) = (cVec p (τ := τ) w).coeff m rw [cVec_coeff, cVec_coeff, MvPolynomial.aeval_C] rfl · show MvPolynomial.aeval y ((WittVector.mk p MvPolynomial.X).coeff m) = (WittVector.mk p y).coeff m rw [WittVector.coeff_mk, WittVector.coeff_mk, MvPolynomial.aeval_X] theorem mulPoly_add (w₁ w₂ : WittVector p R) (n : ℕ) : mulPoly p (w₁ + w₂) n = WittVector.peval (WittVector.wittAdd p n) ![mulPoly p w₁, mulPoly p w₂] := by rw [mulPoly, cVec_add, add_mul, WittVector.add_coeff] rfl theorem mulPoly_mul (w₁ w₂ : WittVector p R) (n : ℕ) : mulPoly p (w₁ * w₂) n = MvPolynomial.aeval (mulPoly p w₂) (mulPoly p w₁ n) := by rw [aeval_mulPoly, mulPoly, cVec_mul, mul_assoc] show _ = (cVec p w₁ * WittVector.mk p (fun m => (cVec p w₂ * WittVector.mk p (MvPolynomial.X : ℕ → MvPolynomial ℕ R)).coeff m)).coeff n rw [WittVector.mk_coeff_eq] theorem mulPoly_one (n : ℕ) : mulPoly p (1 : WittVector p R) n = MvPolynomial.X n := by rw [mulPoly, cVec_one, one_mul, WittVector.coeff_mk] theorem mulPoly_zero (n : ℕ) : mulPoly p (0 : WittVector p R) n = 0 := by rw [mulPoly, cVec_zero, zero_mul, WittVector.zero_coeff] theorem mulPoly_at_zero (w : WittVector p R) : mulPoly p w 0 = MvPolynomial.C (w.coeff 0) * MvPolynomial.X 0 := by rw [mulPoly, WittVector.mul_coeff_zero, cVec_coeff, WittVector.coeff_mk] theorem mulPoly_teichmuller (a : R) (n : ℕ) : mulPoly p (WittVector.teichmuller p a) n = MvPolynomial.C (a ^ p ^ n) * MvPolynomial.X n := by rw [mulPoly, cVec, WittVector.map_teichmuller, WittVector.teichmuller_mul_coeff, WittVector.coeff_mk, map_pow] def verPoly (R : Type u) [CommRing R] : ℕ → MvPolynomial ℕ R | 0 => 0 | n + 1 => MvPolynomial.X n omit hp in @[simp] theorem verPoly_zero : verPoly R 0 = 0 := rfl omit hp in @[simp] theorem verPoly_succ (n : ℕ) : verPoly R (n + 1) = MvPolynomial.X n := rfl omit hp in theorem coe_verPoly (n : ℕ) : (verPoly R n : MvPowerSeries ℕ R) = verFam R n := by cases n with | zero => exact MvPolynomial.coe_zero | succ n => exact MvPolynomial.coe_X _ theorem frobenius_cVec {τ : Type} (w : WittVector p R) : WittVector.frobenius (cVec p (τ := τ) w) = cVec p (WittVector.frobenius w) := (WittVector.IsPoly.map (WittVector.frobenius_isPoly p) _ w).symm theorem aeval_verPoly_mulPoly (w : WittVector p R) (n : ℕ) : MvPolynomial.aeval (verPoly R) (mulPoly p w n) = Nat.casesOn n 0 fun k => mulPoly p (WittVector.frobenius w) k := by rw [aeval_mulPoly] have hV : WittVector.mk p (verPoly R) = WittVector.verschiebung (WittVector.mk p (MvPolynomial.X : ℕ → MvPolynomial ℕ R)) := by refine WittVector.ext fun m => ?_ cases m with | zero => rw [WittVector.coeff_mk, WittVector.verschiebung_coeff_zero]; rfl | succ m => rw [WittVector.coeff_mk, WittVector.verschiebung_coeff_succ, WittVector.coeff_mk]; rfl rw [hV, mul_comm, ← WittVector.verschiebung_mul_frobenius, mul_comm, frobenius_cVec] cases n with | zero => exact WittVector.verschiebung_coeff_zero _ | succ k => rw [WittVector.verschiebung_coeff_succ]; rfl theorem mulPoly_pow_char [CharP R p] (w : WittVector p R) (n : ℕ) : mulPoly p w n ^ p = MvPolynomial.aeval (fun m => (MvPolynomial.X m : MvPolynomial ℕ R) ^ p) (mulPoly p (WittVector.frobenius w) n) := by rw [aeval_mulPoly, mulPoly, ← WittVector.coeff_frobenius_charP, map_mul, frobenius_cVec] congr 2 refine WittVector.ext fun m => ?_ rw [WittVector.coeff_frobenius_charP, WittVector.coeff_mk, WittVector.coeff_mk] omit hp in theorem isWeightedHomogeneous_peval_C_X {N : ℕ} {Q : MvPolynomial (Fin 2 × ℕ) ℤ} (hQ : MvPolynomial.IsWeightedHomogeneous (weight p ![0, 1]) Q N) (c : ℕ → R) : MvPolynomial.IsWeightedHomogeneous (fun m => p ^ m) (WittVector.peval Q ![fun m => MvPolynomial.C (c m), (MvPolynomial.X : ℕ → MvPolynomial ℕ R)]) N := by classical unfold WittVector.peval set g : Fin 2 × ℕ → MvPolynomial ℕ R := Function.uncurry ![fun m => MvPolynomial.C (c m), (MvPolynomial.X : ℕ → MvPolynomial ℕ R)] with hg rw [MvPolynomial.as_sum Q, map_sum] refine MvPolynomial.IsWeightedHomogeneous.sum _ _ _ fun e he => ?_ have hwe : Finsupp.weight (weight p ![0, 1]) e = N := hQ (MvPolynomial.mem_support_iff.mp he) rw [MvPolynomial.aeval_monomial, eq_intCast, ← map_intCast (MvPolynomial.C (σ := ℕ) (R := R))] have hprod : MvPolynomial.IsWeightedHomogeneous (fun m => p ^ m) (e.prod fun im k => g im ^ k) N := by rw [Finsupp.prod, ← hwe, Finsupp.weight_apply, Finsupp.sum] refine MvPolynomial.IsWeightedHomogeneous.prod _ _ _ fun im _ => ?_ rcases im with ⟨i, m⟩ fin_cases i · have h := (MvPolynomial.isWeightedHomogeneous_C (fun m => p ^ m) (c m)).pow (e (0, m)) simp only [smul_zero] at h simpa [g, weight] using h · have h := (MvPolynomial.isWeightedHomogeneous_X (R := R) (fun m => p ^ m) m).pow (e (1, m)) simpa [g, weight, smul_eq_mul, mul_comm] using h have := (MvPolynomial.isWeightedHomogeneous_C (fun m => p ^ m) ((MvPolynomial.coeff e Q : ℤ) : R)).mul hprod rwa [zero_add] at this theorem isWeightedHomogeneous_mulPoly (w : WittVector p R) (n : ℕ) : MvPolynomial.IsWeightedHomogeneous (fun m => p ^ m) (mulPoly p w n) (p ^ n) := by rw [mulPoly_eq_peval] exact isWeightedHomogeneous_peval_C_X (isWeightedHomogeneous_wittMul p n) _ theorem weight_eq_of_coeff_mulFam_ne_zero (w : WittVector p R) {n : ℕ} {e : ℕ →₀ ℕ} (h : coeff e (mulFam p w n) ≠ 0) : Finsupp.weight (fun m => p ^ m) e = p ^ n := by rw [mulFam_apply, MvPolynomial.coeff_coe] at h exact isWeightedHomogeneous_mulPoly w n h theorem constantCoeff_mulFam (w : WittVector p R) (n : ℕ) : (mulFam p w n).constantCoeff = 0 := by by_contra h have h' : coeff (0 : ℕ →₀ ℕ) (mulFam p w n) ≠ 0 := by rwa [coeff_zero_eq_constantCoeff_apply] have hw := weight_eq_of_coeff_mulFam_ne_zero w h' rw [map_zero] at hw exact absurd hw.symm (pow_ne_zero n hp.out.ne_zero) theorem constantCoeff_mulPoly (w : WittVector p R) (n : ℕ) : MvPolynomial.constantCoeff (mulPoly p w n) = 0 := by have h := constantCoeff_mulFam w n rwa [mulFam_apply, ← coeff_zero_eq_constantCoeff_apply, MvPolynomial.coeff_coe, ← MvPolynomial.constantCoeff_eq] at h theorem hasSubst_mulFam (w : WittVector p R) : HasSubst (mulFam p w) := by refine ⟨fun n => by rw [constantCoeff_mulFam]; exact IsNilpotent.zero, fun e => ?_⟩ refine (Set.finite_lt_nat (Finsupp.weight (fun m => p ^ m) e)).subset fun n hn => ?_ have hw := weight_eq_of_coeff_mulFam_ne_zero w hn show n < Finsupp.weight (fun m => p ^ m) e rw [hw] exact Nat.lt_pow_self hp.out.one_lt def xVec (R : Type u) [CommRing R] (i : Fin 2) : WittVector p (MvPolynomial (Fin 2 × ℕ) R) := WittVector.mk p fun m => MvPolynomial.X (i, m) def addPolyR (R : Type u) [CommRing R] (m : ℕ) : MvPolynomial (Fin 2 × ℕ) R := MvPolynomial.map (Int.castRingHom R) (WittVector.wittAdd p m) theorem coe_addPolyR (m : ℕ) : (addPolyR (p := p) R m : MvPowerSeries (Fin 2 × ℕ) R) = addFam p R m := rfl omit hp in @[simp] theorem xVec_coeff (i : Fin 2) (m : ℕ) : (xVec (p := p) R i).coeff m = MvPolynomial.X (i, m) := rfl theorem xVec_add : xVec (p := p) R 0 + xVec R 1 = WittVector.mk p (addPolyR (p := p) R) := by refine WittVector.ext fun m => ?_ rw [WittVector.add_coeff] show WittVector.peval (WittVector.wittAdd p m) ![(xVec (p := p) R 0).coeff, (xVec (p := p) R 1).coeff] = addPolyR (p := p) R m rw [addPolyR, ← WittVector.peval_X R (WittVector.wittAdd p m)] congr 1 funext i k fin_cases i <;> rfl theorem pairFam_mulFam (w : WittVector p R) : pairFam (mulFam p w) = fun im : Fin 2 × ℕ => (((cVec p w * xVec R im.1).coeff im.2 : MvPolynomial (Fin 2 × ℕ) R) : MvPowerSeries (Fin 2 × ℕ) R) := by funext ⟨i, m⟩ rw [pairFam_apply, mulFam_apply, xVec, ← aeval_mulPoly, coe_aeval] congr 1 funext k exact (MvPolynomial.coe_X _).symm theorem subst_addFam_mulFam (w : WittVector p R) (n : ℕ) : subst (addFam p R) (mulFam p w n) = (((cVec p w * (xVec R 0 + xVec R 1)).coeff n : MvPolynomial (Fin 2 × ℕ) R) : MvPowerSeries (Fin 2 × ℕ) R) := by have h : addFam p R = fun i => (addPolyR (p := p) R i : MvPowerSeries (Fin 2 × ℕ) R) := rfl rw [h, mulFam_apply, ← coe_aeval, aeval_mulPoly, xVec_add] theorem isEndo_mulFam (w : WittVector p R) : IsEndo p (mulFam p w) := by refine ⟨hasSubst_mulFam w, constantCoeff_mulFam w, fun n => ?_⟩ have hR : subst (pairFam (mulFam p w)) (addFam p R n) = (((cVec p w * xVec R 0 + cVec p w * xVec R 1).coeff n : MvPolynomial (Fin 2 × ℕ) R) : MvPowerSeries (Fin 2 × ℕ) R) := by have key := coe_peval (R := R) (WittVector.wittAdd p n) (fun i m => (cVec p w * xVec (p := p) R i).coeff m) rw [WittVector.add_coeff, pairFam_mulFam, ← coe_addPolyR, addPolyR] refine key.trans ?_ congr 2 funext i fin_cases i <;> rfl rw [subst_addFam_mulFam, hR, mul_add] theorem subst_mulFam_mulFam (w₁ w₂ : WittVector p R) (n : ℕ) : subst (mulFam p w₂) (mulFam p w₁ n) = mulFam p (w₁ * w₂) n := by rw [mulFam_apply, mulFam_apply, mulPoly_mul, coe_aeval] rfl theorem mulFam_add (w₁ w₂ : WittVector p R) (n : ℕ) : mulFam p (w₁ + w₂) n = subst (fun im : Fin 2 × ℕ => (Fin.cases (mulFam p w₁ im.2) (fun _ => mulFam p w₂ im.2) im.1 : MvPowerSeries ℕ R)) (addFam p R n) := by have hfun : (fun im : Fin 2 × ℕ => (Fin.cases (mulFam p w₁ im.2) (fun _ => mulFam p w₂ im.2) im.1 : MvPowerSeries ℕ R)) = fun im : Fin 2 × ℕ => ((![mulPoly p w₁, mulPoly p w₂] im.1 im.2 : MvPolynomial ℕ R) : MvPowerSeries ℕ R) := by funext ⟨i, m⟩ fin_cases i <;> rfl rw [hfun, addFam, coe_peval, mulFam_apply, mulPoly_add] theorem mulFam_one : mulFam p (1 : WittVector p R) = fun n => X n := by funext n rw [mulFam_apply, mulPoly_one, MvPolynomial.coe_X] theorem mulFam_zero : mulFam p (0 : WittVector p R) = fun _ => 0 := by funext n rw [mulFam_apply, mulPoly_zero, MvPolynomial.coe_zero] theorem mulFam_teichmuller (a : R) : mulFam p (WittVector.teichmuller p a) = teichFam p a := by funext n rw [mulFam_apply, mulPoly_teichmuller, MvPolynomial.coe_mul, MvPolynomial.coe_C, MvPolynomial.coe_X, teichFam_apply, smul_eq_C_mul] theorem subst_verFam_mulFam (w : WittVector p R) (n : ℕ) : subst (verFam R) (mulFam p w n) = subst (mulFam p (WittVector.frobenius w)) (verFam R n) := by have hv : (verFam R) = fun m => (verPoly R m : MvPowerSeries ℕ R) := funext fun m => (coe_verPoly m).symm rw [mulFam_apply, hv, ← coe_aeval, aeval_verPoly_mulPoly] cases n with | zero => show ((0 : MvPolynomial ℕ R) : MvPowerSeries ℕ R) = subst _ ((verPoly R 0 : MvPolynomial ℕ R) : MvPowerSeries ℕ R) rw [verPoly_zero, MvPolynomial.coe_zero, ← coe_substAlgHom (hasSubst_mulFam _), map_zero] | succ k => show ((mulPoly p (WittVector.frobenius w) k : MvPolynomial ℕ R) : MvPowerSeries ℕ R) = subst _ ((verPoly R (k + 1) : MvPolynomial ℕ R) : MvPowerSeries ℕ R) rw [verPoly_succ, MvPolynomial.coe_X, subst_X (hasSubst_mulFam _), mulFam_apply] theorem subst_mulFam_frobFam [CharP R p] (w : WittVector p R) (n : ℕ) : subst (mulFam p w) (frobFam p R n) = subst (frobFam p R) (mulFam p (WittVector.frobenius w) n) := by rw [frobFam_apply, subst_pow (hasSubst_mulFam w), subst_X (hasSubst_mulFam w), mulFam_apply, ← MvPolynomial.coe_pow, mulPoly_pow_char, coe_aeval, mulFam_apply] congr 1 funext m rw [MvPolynomial.coe_pow, MvPolynomial.coe_X, frobFam_apply] end WittLaw namespace CartierModule variable {p : ℕ} [hp : Fact p.Prime] {d d' : ℕ} {R : Type u} [CommRing R] variable {Φ : MvFormalGroup d R} {Φ' : MvFormalGroup d' R} def wittSMul [Φ.IsComm] (w : WittVector p R) : CartierModule p Φ →+ CartierModule p Φ := precomp (WittLaw.isEndo_mulFam w) @[simp] theorem toPowerSeries_wittSMul [Φ.IsComm] (w : WittVector p R) (f : CartierModule p Φ) : (wittSMul w f).toPowerSeries = fun j => subst (WittLaw.mulFam p w) (f.toPowerSeries j) := rfl theorem wittSMul_one [Φ.IsComm] (f : CartierModule p Φ) : wittSMul (1 : WittVector p R) f = f := by apply CartierModule.ext funext j rw [toPowerSeries_wittSMul, WittLaw.mulFam_one] exact congrFun subst_self _ theorem wittSMul_zero_left [Φ.IsComm] (f : CartierModule p Φ) : wittSMul (0 : WittVector p R) f = 0 := by apply CartierModule.ext funext j rw [toPowerSeries_wittSMul, WittLaw.mulFam_zero] exact subst_zero_of_constantCoeff_eq_zero (f.constantCoeff_eq_zero j) theorem wittSMul_mul [Φ.IsComm] (w₁ w₂ : WittVector p R) (f : CartierModule p Φ) : wittSMul (w₁ * w₂) f = wittSMul w₁ (wittSMul w₂ f) := by apply CartierModule.ext funext j show (precomp _ f).toPowerSeries j = (precomp _ (precomp _ f)).toPowerSeries j rw [precomp_precomp, toPowerSeries_precomp] show subst (WittLaw.mulFam p (w₁ * w₂)) (f.toPowerSeries j) = _ congr 1 funext n rw [WittLaw.subst_mulFam_mulFam, mul_comm] theorem wittSMul_add_left [Φ.IsComm] (w₁ w₂ : WittVector p R) (f : CartierModule p Φ) : wittSMul (w₁ + w₂) f = wittSMul w₁ f + wittSMul w₂ f := by apply CartierModule.ext funext j have hf := f.constantCoeff_eq_zero have hS : HasSubst (fun im : Fin 2 × ℕ => (Fin.cases (WittLaw.mulFam p w₁ im.2) (fun _ => WittLaw.mulFam p w₂ im.2) im.1 : MvPowerSeries ℕ R)) := WittLaw.hasSubst_finCases (WittLaw.hasSubst_mulFam w₁) (WittLaw.hasSubst_mulFam w₂) have hfam : WittLaw.mulFam p (w₁ + w₂) = fun k => subst (fun im : Fin 2 × ℕ => (Fin.cases (WittLaw.mulFam p w₁ im.2) (fun _ => WittLaw.mulFam p w₂ im.2) im.1 : MvPowerSeries ℕ R)) (WittLaw.addFam p R k) := funext (WittLaw.mulFam_add w₁ w₂) rw [toPowerSeries_wittSMul, toPowerSeries_add] show subst (WittLaw.mulFam p (w₁ + w₂)) (f.toPowerSeries j) = _ rw [hfam, ← subst_comp_subst_apply (hasSubst_addFam p R) hS, f.subst_addFam, subst_subst_elim Φ (constantCoeff_inBlk 0 hf) (constantCoeff_inBlk 1 hf) hS] congr 1 funext s rcases s with l | l · show subst _ (subst (blk 0) (f.toPowerSeries l)) = (wittSMul w₁ f).toPowerSeries l rw [subst_comp_subst_apply (hasSubst_blk 0) hS] congr 1 funext m exact subst_X hS ((0 : Fin 2), m) · show subst _ (subst (blk 1) (f.toPowerSeries l)) = (wittSMul w₂ f).toPowerSeries l rw [subst_comp_subst_apply (hasSubst_blk 1) hS] congr 1 funext m exact subst_X hS ((1 : Fin 2), m) instance instModuleWittVector [Φ.IsComm] : Module (WittVector p R) (CartierModule p Φ) where smul w f := wittSMul w f one_smul := wittSMul_one mul_smul := wittSMul_mul smul_zero w := map_zero (wittSMul w) smul_add w := map_add (wittSMul w) add_smul := wittSMul_add_left zero_smul := wittSMul_zero_left theorem smul_def [Φ.IsComm] (w : WittVector p R) (f : CartierModule p Φ) : w • f = wittSMul w f := rfl theorem smul_eq_precomp [Φ.IsComm] (w : WittVector p R) (f : CartierModule p Φ) : w • f = precomp (WittLaw.isEndo_mulFam w) f := rfl @[simp] theorem toPowerSeries_smul_witt [Φ.IsComm] (w : WittVector p R) (f : CartierModule p Φ) : (w • f).toPowerSeries = fun j => subst (WittLaw.mulFam p w) (f.toPowerSeries j) := rfl theorem teichmuller_smul [Φ.IsComm] (a : R) (f : CartierModule p Φ) : WittVector.teichmuller p a • f = homothety a f := by apply CartierModule.ext funext j rw [toPowerSeries_smul_witt, toPowerSeries_homothety, WittLaw.mulFam_teichmuller] theorem homothety_smul_witt [Φ.IsComm] (a : R) (w : WittVector p R) (f : CartierModule p Φ) : homothety a (w • f) = w • homothety a f := by rw [← teichmuller_smul, ← teichmuller_smul, smul_smul, smul_smul, mul_comm] theorem natCast_smul_eq_nsmul' [Φ.IsComm] (n : ℕ) (f : CartierModule p Φ) : (n : WittVector p R) • f = n • f := Nat.cast_smul_eq_nsmul _ n f theorem frobenius_smul [Φ.IsComm] (w : WittVector p R) (f : CartierModule p Φ) : frobenius (w • f) = WittVector.frobenius w • frobenius f := by apply CartierModule.ext funext j show (precomp _ (precomp _ f)).toPowerSeries j = (precomp _ (precomp _ f)).toPowerSeries j rw [precomp_precomp, precomp_precomp] congr 1 funext n exact WittLaw.subst_verFam_mulFam w n theorem smul_verschiebung [Φ.IsComm] [CharP R p] (w : WittVector p R) (f : CartierModule p Φ) : w • verschiebung f = verschiebung (WittVector.frobenius w • f) := by apply CartierModule.ext funext j show (precomp _ (precomp _ f)).toPowerSeries j = (precomp _ (precomp _ f)).toPowerSeries j rw [precomp_precomp, precomp_precomp] congr 1 funext n exact WittLaw.subst_mulFam_frobFam w n theorem verschiebung_smul [Φ.IsComm] [CharP R p] [PerfectRing R p] (w : WittVector p R) (f : CartierModule p Φ) : verschiebung (w • f) = (WittVector.frobeniusEquiv p R).symm w • verschiebung f := by have hw : WittVector.frobenius ((WittVector.frobeniusEquiv p R).symm w) = w := by rw [← WittVector.frobeniusEquiv_apply] exact (WittVector.frobeniusEquiv p R).apply_symm_apply w rw [smul_verschiebung, hw] theorem verschiebung_frobenius_eq_smul [Φ.IsComm] [CharP R p] (f : CartierModule p Φ) : verschiebung (frobenius f) = (p : WittVector p R) • f := by rw [verschiebung_frobenius, natCast_smul_eq_nsmul'] theorem map_smul_witt [Φ.IsComm] [Φ'.IsComm] (φ : Φ.Hom Φ') (w : WittVector p R) (f : CartierModule p Φ) : map φ (w • f) = w • map φ f := map_precomp φ _ f theorem endAct_smul_witt [Φ.IsComm] (φ : MvFormalGroup.End Φ) (w : WittVector p R) (f : CartierModule p Φ) : endAct φ (w • f) = w • endAct φ f := map_precomp φ _ f def mapLinear [Φ.IsComm] [Φ'.IsComm] (φ : Φ.Hom Φ') : CartierModule p Φ →ₗ[WittVector p R] CartierModule p Φ' := { map φ with map_smul' := fun w f => map_smul_witt φ w f } @[simp] theorem mapLinear_apply [Φ.IsComm] [Φ'.IsComm] (φ : Φ.Hom Φ') (f : CartierModule p Φ) : mapLinear φ f = map φ f := rfl theorem coeff_single_zero_subst_of_weight {u : ℕ → MvPowerSeries ℕ R} (hu : ∀ n (e : ℕ →₀ ℕ), coeff e (u n) ≠ 0 → Finsupp.weight (fun m => p ^ m) e = p ^ n) (g : MvPowerSeries ℕ R) (hg : g.constantCoeff = 0) : coeff (Finsupp.single 0 1) (subst u g) = coeff (Finsupp.single 0 1) g * coeff (Finsupp.single 0 1) (u 0) := by classical have hu0 : ∀ n, (u n).constantCoeff = 0 := by intro n by_contra h have h' : coeff (0 : ℕ →₀ ℕ) (u n) ≠ 0 := by rwa [coeff_zero_eq_constantCoeff_apply] have hw := hu n 0 h' rw [map_zero] at hw exact absurd hw.symm (pow_ne_zero n hp.out.ne_zero) have hus : HasSubst u := by refine ⟨fun n => by rw [hu0]; exact IsNilpotent.zero, fun e => ?_⟩ refine (Set.finite_lt_nat (Finsupp.weight (fun m => p ^ m) e)).subset fun n hn => ?_ have hw := hu n e hn show n < Finsupp.weight (fun m => p ^ m) e rw [hw] exact Nat.lt_pow_self hp.out.one_lt have hord : ∀ n, ((p ^ n : ℕ) : ℕ∞) ≤ (u n).weightedOrder (fun m => p ^ m) := by intro n refine nat_le_weightedOrder (fun m => p ^ m) fun e he => ?_ by_contra hne have hw := hu n e hne rw [hw] at he exact lt_irrefl _ he rw [coeff_subst hus] have hterm : ∀ e : ℕ →₀ ℕ, e ≠ Finsupp.single 0 1 → coeff e g • coeff (Finsupp.single 0 1) (e.prod fun n k => u n ^ k) = 0 := by intro e he by_cases he0 : e = 0 · subst he0 rw [coeff_zero_eq_constantCoeff_apply, hg, zero_smul] · have hwt : (2 : ℕ∞) ≤ (e.prod fun n k => u n ^ k).weightedOrder (fun m => p ^ m) := by rw [Finsupp.prod] refine le_trans ?_ (le_weightedOrder_prod _ _ _) have hle : ∀ n ∈ e.support, ((e n * p ^ n : ℕ) : ℕ∞) ≤ (u n ^ e n).weightedOrder (fun m => p ^ m) := by intro n _ refine le_trans ?_ (le_weightedOrder_pow _ _) rw [Nat.cast_mul] calc ((e n : ℕ) : ℕ∞) * ((p ^ n : ℕ) : ℕ∞) = (e n) • ((p ^ n : ℕ) : ℕ∞) := by rw [nsmul_eq_mul] _ ≤ (e n) • (u n).weightedOrder (fun m => p ^ m) := nsmul_le_nsmul_right (hord n) _ refine le_trans ?_ (Finset.sum_le_sum hle) rw [← Nat.cast_sum] have h2 : 2 ≤ ∑ n ∈ e.support, e n * p ^ n := by by_cases hsupp : ∃ n ∈ e.support, n ≠ 0 · obtain ⟨n, hn, hn0⟩ := hsupp refine le_trans ?_ (Finset.single_le_sum (fun _ _ => Nat.zero_le _) hn) have hen : 1 ≤ e n := Nat.one_le_iff_ne_zero.mpr (Finsupp.mem_support_iff.mp hn) have hpn : 2 ≤ p ^ n := le_trans hp.out.two_le (Nat.le_self_pow hn0 p) calc 2 ≤ 1 * p ^ n := by omega _ ≤ e n * p ^ n := Nat.mul_le_mul_right _ hen · push Not at hsupp have hes : e = Finsupp.single 0 (e 0) := by ext n by_cases hn : n = 0 · subst hn; simp · rw [Finsupp.single_apply, if_neg (Ne.symm hn)] by_contra hne exact hn (hsupp n (Finsupp.mem_support_iff.mpr hne)) have hk0 : e 0 ≠ 0 := fun h => he0 (by rw [hes, h, Finsupp.single_zero]) have hk1 : e 0 ≠ 1 := fun h => he (by rw [hes, h]) have hk : 2 ≤ e 0 := by omega have h0 : (0 : ℕ) ∈ e.support := Finsupp.mem_support_iff.mpr (by omega) refine le_trans ?_ (Finset.single_le_sum (fun _ _ => Nat.zero_le _) h0) simpa using hk exact_mod_cast h2 have hzero : coeff (Finsupp.single 0 1) (e.prod fun n k => u n ^ k) = 0 := by refine coeff_eq_zero_of_lt_weightedOrder (fun m => p ^ m) (lt_of_lt_of_le ?_ hwt) rw [Finsupp.weight_apply, Finsupp.sum_single_index (by simp)] simp rw [hzero, smul_zero] rw [finsum_eq_single _ (Finsupp.single 0 1) hterm, Finsupp.prod_single_index (by simp), pow_one, smul_eq_mul] theorem tangent_smul_witt [Φ.IsComm] (w : WittVector p R) (f : CartierModule p Φ) : tangent (w • f) = w.coeff 0 • tangent f := by classical funext j rw [tangent_apply, toPowerSeries_smul_witt, Pi.smul_apply, tangent_apply, smul_eq_mul] show coeff (Finsupp.single 0 1) (subst (WittLaw.mulFam p w) (f.toPowerSeries j)) = _ rw [coeff_single_zero_subst_of_weight (fun n e h => WittLaw.weight_eq_of_coeff_mulFam_ne_zero w h) _ (f.constantCoeff_eq_zero j), WittLaw.mulFam_apply, WittLaw.mulPoly_at_zero, MvPolynomial.coeff_coe, MvPolynomial.coeff_C_mul, MvPolynomial.coeff_X_same, mul_one, mul_comm] namespace Examples theorem smul_addLinear (w : WittVector p R) (v : Fin d → R) : w • addLinear p v = addLinear p (w.coeff 0 • v) := by apply CartierModule.ext funext i rw [toPowerSeries_smul_witt, toPowerSeries_addLinear] show subst (WittLaw.mulFam p w) ((addLinear p v).toPowerSeries i) = _ rw [toPowerSeries_addLinear, subst_smul (WittLaw.hasSubst_mulFam w), subst_X (WittLaw.hasSubst_mulFam w), WittLaw.mulFam_apply, WittLaw.mulPoly_at_zero, MvPolynomial.coe_mul, MvPolynomial.coe_C, MvPolynomial.coe_X, Pi.smul_apply, smul_eq_mul, ← smul_eq_C_mul, smul_smul, mul_comm] end Examples end CartierModule end MvFormalGroup end
Statements phrased using this module (125)
- Degree formula: colength of the Cartier module of an isogeny
MvFormalGroup.CartierModule.length_quotient_range_mapLinear_eq_of_finrank_eq_pow22 below · depth 30 - Rank-two lattice with Pi = V in M₀
CerednikDrinfeld.SpecialFormalODModule.exists_fin_two_endAct_varpiEnd_eq_verschiebung_of_isAlgClosed34 below · depth 31 - Approximate exactness of the Cartier presentation map
MvFormalGroup.CartierModule.exists_forall_le_order_coeff_sub_of_forall_le_order_presPi1 below · depth 31 - Cokernel of π_* on Cartier modules has rank rank dρ
MvFormalGroup.CartierModule.nonempty_basis_quotient_span_range_map_of_comp_eq_X_pow7 below · depth 31 - Existence of a canonical L-map for formal mathcal O_D-modules
CerednikDrinfeld.FormalODModule.exists_isCanonicalLMap_toGradedCartierModuleData73 below · depth 32 - Homogeneous V-basis for a special formal mathcal O_D-module with free Lie lines
CerednikDrinfeld.FormalODModule.exists_isHomogeneousVBasis_of_isSpecial_of_free8 below · depth 32 - Splitting of the Cartier module into graded pieces 0 and 1
CerednikDrinfeld.FormalODModule.isCompl_gradedPiece_zero_one_of_isNilpotent5 below · depth 32 - Graded pieces of a special formal mathcal O_D-module: free of rank 2
CerednikDrinfeld.SpecialFormalODModule.exists_fin_two_forall_mem_gradedPiece_existsUnique_eq_sum_smul31 below · depth 32 - Cartier relation points lie in the kernel of Pi_f
MvFormalGroup.CartierModule.presPi_verPt_sub_sum_teichPt_frobPt_eq_presPi_frobPt_iterate0 below · depth 32 - Isomorphisms of formal mathcal O_D-modules induce graded Cartier isomorphisms
CerednikDrinfeld.FormalODModule.Hom.bijective_map_and_forall_map_eq_of_isIso0 below · depth 33 - Frobenius-fixed scalars act through W(j)∘θ on Cartier modules
CerednikDrinfeld.FormalODModule.endAct_actEnd_eq_map_smul_of_frobenius_eq_of_isNilpotent3 below · depth 33 - Structure constants of a homogeneous V-basis, with a₀₀a₀₁=p
CerednikDrinfeld.FormalODModule.exists_hasStructureConstants_mul_eq_of_isHomogeneousVBasis18 below · depth 33 - Formal mathcal O_D-modules lift to the universal p-torsion-free base
CerednikDrinfeld.FormalODModule.exists_liftRing_isHomogeneousVBasis_hasStructureConstants_liftConstants_and_isIso_of_isHausdorff59 below · depth 33 - Base change of the graded Cartier datum of X
CerednikDrinfeld.FormalODModule.isBaseChangeAlong_toGradedCartierModuleData_baseChange18 below · depth 33 - Homogeneous V-basis splits the Cartier module into graded pieces
CerednikDrinfeld.FormalODModule.isCompl_gradedPiece_zero_one_of_isHomogeneousVBasis21 below · depth 33 - Homogeneous V-basis makes the graded Cartier datum special
CerednikDrinfeld.FormalODModule.isSpecialCartierModule_toGradedCartierModuleData19 below · depth 33 - Frobenius-fixed W(k)-basis at a critical index
CerednikDrinfeld.SpecialFormalODModule.exists_fin_two_mem_invariants_forall_existsUnique_eq_sum_smul_of_isCritical34 below · depth 33 - Each index critical or Pi-bijective over a field
CerednikDrinfeld.SpecialFormalODModule.isCritical_or_isPiBijective_of_field9 below · depth 33 - Freeness of the Cartier module of a height-h formal group
MvFormalGroup.CartierModule.nonempty_basis_of_finrank_eq_pow29 below · depth 33 - Tangent vectors of a homogeneous V-basis grade LieX
CerednikDrinfeld.FormalODModule.IsHomogeneousVBasis.tangent_mem_and_existsUnique_smul_of_isNilpotent0 below · depth 34 - Matching homogeneous V-bases give an isomorphism of formal mathcal O_D-modules
CerednikDrinfeld.FormalODModule.exists_hom_isIso_forall_map_eq_of_hasStructureConstants37 below · depth 34 - Prescribed structure constants are realised by a formal mathcal O_D-module
CerednikDrinfeld.FormalODModule.exists_isHomogeneousVBasis_and_hasStructureConstants_of_mul_eq31 below · depth 34 - Lifting a formal mathcal O_D-module by lifting its structure constants
CerednikDrinfeld.FormalODModule.exists_isHomogeneousVBasis_hasStructureConstants_and_isIso_map_of_forall_apply_eq59 below · depth 34 - Zariski-local homogeneous V-bases for special formal 𝒪_D-modules
CerednikDrinfeld.FormalODModule.exists_isHomogeneousVBasis_map_of_isSpecial_of_isNilpotent29 below · depth 34 - Transport of homogeneous V-bases and structure constants along an isomorphism
CerednikDrinfeld.FormalODModule.isHomogeneousVBasis_map_and_hasStructureConstants_map_of_hom_of_isIso0 below · depth 34 - Abstract homogeneous V-basis is a law-level V-basis
CerednikDrinfeld.FormalODModule.isHomogeneousVBasis_of_toGradedCartierModuleData_of_algebra_padicInt20 below · depth 34 - Base change of the graded pieces of Lie
CerednikDrinfeld.FormalODModule.lieZero_lieOne_map_eq_span_image0 below · depth 34 - Order-zero structure constants give the tangent action of varpi
CerednikDrinfeld.FormalODModule.linearPart_varpi_mulVec_tangent_eq_smul_of_hasStructureConstants0 below · depth 34 - Frobenius twist of the labelling: N, pieces, η, canonicity
CerednikDrinfeld.FormalODModule.nMap_id_bijective_and_nPiece_and_eta_and_isCanonicalLMap_comp_frobenius1 below · depth 34 - Classes modulo VM have equal tangent vectors
CerednikDrinfeld.FormalODModule.tangent_eq_of_mkQ_eq0 below · depth 34 - Every special graded Cartier datum comes from a formal 𝒪_D-module
CerednikDrinfeld.GradedCartierModuleData.exists_formalODModule_bijective_of_isSpecialCartierModule_of_torsionFree51 below · depth 34 - First-order obstruction to structure constants at a smooth point
CerednikDrinfeld.SpecialFormalODModule.exists_forall_not_hasStructureConstants_add_smul_eps_of_not_and19 below · depth 34 - Critical index, mathbb Zₚ-basis and order embedding of End_{mathcal O_D}Φ
CerednikDrinfeld.SpecialFormalODModule.exists_isCritical_and_exists_basis_injective_endMatrixQ_and_exists_pow_smul_of_isAlgClosed61 below · depth 34 - Faithfulness of the Cartier module functor over ℤₚ-algebras
MvFormalGroup.CartierModule.eq_of_forall_map_eq_of_algebra_padicInt7 below · depth 34 - Unique finite V-expansion along a tangent basis
MvFormalGroup.CartierModule.existsUnique_eq_sum_verschiebungInt_iterate_homothety_add17 below · depth 34 - Cartier module modulo p is free of rank h
MvFormalGroup.CartierModule.nonempty_basis_quotient_smul_top_of_finrank_eq_pow25 below · depth 34 - Invariant frame yields ℤₚ-basis and injective endomorphism matrix
CerednikDrinfeld.FormalODModule.CritChart.exists_basis_coe_eq_and_injective_endMatrix_of_forall_existsUnique_of_isCompl9 below · depth 35 - Equal Pi-structure constants force an isomorphism of Cartier modules
CerednikDrinfeld.FormalODModule.exists_addMonoidHom_bijective_map_eq_of_hasStructureConstants28 below · depth 35 - Digit shape of a homogeneous V-basis over k[ε]
CerednikDrinfeld.FormalODModule.exists_eq_sum_verschiebungInt_iterate_homothety_baseChange_of_baseChangeEq_eq11 below · depth 35 - Local freeness of the Lie eigenlines of a special formal mathcal O_D-module
CerednikDrinfeld.FormalODModule.exists_free_lieZero_map_and_free_lieOne_map_of_isSpecial1 below · depth 35 - Frobenius lands in VM when a_{0,i_0}=0
CerednikDrinfeld.FormalODModule.exists_frobenius_eq_verschiebungInt_of_hasStructureConstants_of_apply_zero_eq_zero0 below · depth 35 - Cartier-module isomorphisms come from formal mathcal O_D-module isomorphisms
CerednikDrinfeld.FormalODModule.exists_hom_isIso_forall_map_eq_of_bijective28 below · depth 35 - Universal formal mathcal O_D-module with homogeneous V-basis
CerednikDrinfeld.FormalODModule.exists_isHomogeneousVBasis_and_hasStructureConstants_liftVar30 below · depth 35 - Existence of a homogeneous V-basis for special formal 𝒪_D-modules
CerednikDrinfeld.FormalODModule.exists_isHomogeneousVBasis_of_isSpecial_of_free_of_isNilpotent25 below · depth 35 - First-order structure constants of a reshaped V-basis over k[ε]
CerednikDrinfeld.FormalODModule.hasStructureConstants_dualNumber_apply_eq_of_eq_sum_verschiebungInt_iterate_homothety3 below · depth 35 - Canonicity of L-maps under the σ-shift of the grading
CerednikDrinfeld.FormalODModule.isCanonicalLMap_iff_isCanonicalLMap_comp_of_comp_frobenius0 below · depth 35 - Homogeneous V-basis implies the formal mathcal O_D-module is special
CerednikDrinfeld.FormalODModule.isSpecial_of_isHomogeneousVBasis0 below · depth 35 - Exactly one vanishing order-zero structure constant at a smooth point
CerednikDrinfeld.SpecialFormalODModule.exists_apply_zero_eq_zero_and_ne_zero_of_not_and1 below · depth 35 - Height equals dimension plus codimension, Cartier module form
MvFormalGroup.CartierModule.exists_add_eq_and_nonempty_basis_quotient_span_frobenius_of_finrank_eq_pow24 below · depth 35 - Frobenius image in M/pM is free of rank d
MvFormalGroup.CartierModule.nonempty_basis_span_frobenius_of_finite_quotient7 below · depth 35 - Cartier module over a ℤₚ-algebra is reduced
MvFormalGroup.CartierModule.verschiebungInt_injective_and_tangent_surjective_and_ker_and_complete_of_algebra_padicInt19 below · depth 35 - Universal digits forcing the relation p fᵢ=[p]fᵢ+sum_k V^k(d_{k,i}f)
CerednikDrinfeld.CartierLift.exists_digits_forall_smul_eq_teichmuller_smul_add_sum_verschiebungInt3 below · depth 36 - Graded finite V-adic expansion in a homogeneous V-basis
CerednikDrinfeld.FormalODModule.existsUnique_eq_sum_verschiebung_iterate_homothety_add_of_mem_gradedPiece9 below · depth 36 - Universal structure constants for Frobenius in a homogeneous V-basis
CerednikDrinfeld.FormalODModule.exists_forall_hasStructureConstants_frobenius_eq_sum4 below · depth 36 - Cartier modules: maps determined by a V-basis
MvFormalGroup.CartierModule.existsUnique_addMonoidHom_apply_eq_of_frobenius_expansion25 below · depth 36 - Unique finite V-adic expansion in characteristic p
MvFormalGroup.CartierModule.existsUnique_eq_sum_verschiebungInt_iterate_homothety_add_of_charP2 below · depth 36 - Cartier module maps commuting with F, V, ⟨ a⟩ are induced
MvFormalGroup.CartierModule.exists_hom_forall_map_eq_of_algebra_padicInt22 below · depth 36 - Cartier presentation: a homomorphism matching prescribed curves
MvFormalGroup.CartierModule.exists_hom_forall_map_eq_of_forall_frobenius_eq_sum_verschiebungInt_iterate_smul3 below · depth 36 - Graded Frobenius expansion yields a ℤ_{p²}-action on Φ
MvFormalGroup.CartierModule.exists_zp2Action_of_graded_frobenius_expansion9 below · depth 36 - Cokernel of a degree p^e isogeny on Cartier modules
MvFormalGroup.CartierModule.nonempty_basis_quotient_span_range_map_of_finrank_eq_pow22 below · depth 36 - The varpi-relation passes to varpi f, and varpi g ≡ p f
MvFormalGroup.CartierModule.varpiTuple_rel_and_sum_eq_of_rel0 below · depth 36 - Arbitrary structure constants arise from a Cartier-module V-basis
MvFormalGroup.exists_cartierModule_vBasis_of_frobenius_expansion13 below · depth 36 - Normalising tangents of a V-basis by coordinate change
MvFormalGroup.exists_hom_comp_eq_id_tangent_map_eq_of_isUnit_det0 below · depth 36 - Cartier presentation: relations to every order over arbitrary base
MvFormalGroup.CartierModule.exists_forall_le_order_coeff_sub_and_frobIntPt_iterate_of_forall_le_order_presPi1 below · depth 37 - Homomorphism of formal groups from matching V-adic expansions
MvFormalGroup.CartierModule.exists_hom_forall_map_eq_of_forall_frobenius_eq_sum_verschiebungInt_iterate_homothety_add4 below · depth 37 - Universal Teichmüller-digit normal form in Cartier modules
MvFormalGroup.CartierModule.exists_sum_verschiebungInt_iterate_smul_eq_sum_homothety_teichmuellerDigit_add0 below · depth 37 - Twisting a graded F-expansion by Frobenius-exchanged Witt scalars
MvFormalGroup.CartierModule.frobenius_smul_eq_of_graded_frobenius_expansion_of_frobenius_eq0 below · depth 37 - Base change of a V-basis with structure constants
MvFormalGroup.CartierModule.isUnit_det_tangent_and_frobenius_expansion_baseChange0 below · depth 37 - Universal p-typical law with variables as structure constants
MvFormalGroup.exists_cartierModule_vBasis_mvPolynomial_X12 below · depth 37 - Critical index criterion on the Lie algebra for special formal mathcal O_D-modules
CerednikDrinfeld.FormalODModule.CritChart.isCritical_iff_le_ker_lieVarpi_of_isSpecial11 below · depth 38 - Critical index and its invariants under algebraically closed base change
CerednikDrinfeld.FormalODModule.CritChart.isCritical_map_and_surjOn_baseChange_invariants_of_isAlgClosed44 below · depth 38 - Homogeneous V-basis for special formal mathcal O_D-modules over a field
CerednikDrinfeld.FormalODModule.exists_isHomogeneousVBasis_of_isSpecial_field9 below · depth 38 - Tangent line of η_{i_0} over κ[ε] and its period equation
CerednikDrinfeld.FormalODModule.exists_tangent_eq_smul_and_forall_fst_snd_eq_of_mem_etaPiece_of_hasStructureConstants_dualNumber32 below · depth 38 - Homomorphisms from X.F determined on a homogeneous V-basis
CerednikDrinfeld.FormalODModule.hom_eq_of_forall_map_apply_eq_of_isHomogeneousVBasis9 below · depth 38 - Tangent variation on η_{i_0} is no rescaling outside windows
CerednikDrinfeld.FormalODModule.not_exists_forall_period_variation_eq_mul_of_mem_etaPiece_of_hasStructureConstants_dualNumber159 below · depth 38 - First-order versality of a structure-constant line at a smooth point
CerednikDrinfeld.SpecialFormalODModule.exists_isHomogeneousVBasis_hasStructureConstants_add_mul_smul_eps_of_forall_not_hasStructureConstants_of_not_and125 below · depth 38 - Unrealisable first-order variation of three structure constants
CerednikDrinfeld.SpecialFormalODModule.forall_not_hasStructureConstants_add_ite_smul_eps_of_forall_ne_add_smul17 below · depth 38 - Presentation map kills Cartier relation points up to remainder
MvFormalGroup.CartierModule.presPi_verPt_sub_sum_wittSMulPt_frobIntPt_eq_presPi_frobIntPt_iterate0 below · depth 38 - V-basis with variable structure constants from a functional-equation logarithm
MvFormalGroup.exists_cartierModule_vBasis_mvPolynomial_X_of_log7 below · depth 38 - Commutative law with functional-equation logarithm over ℚₚ[V]
MvFormalGroup.exists_isComm_log_mvPolynomial_padic1 below · depth 38 - Functional-equation integrality for the universal p-typical law
MvFormalGroup.exists_map_padicInt_eq_of_log0 below · depth 38 - Commutativity of a formal group law descends along injective base change
MvFormalGroup.isComm_of_isComm_map_of_injective0 below · depth 38 - Digit relations for a Pi=V invariant over dual numbers
CerednikDrinfeld.FormalODModule.exists_digits_tangent_eq_and_fst_snd_eq_of_varpiEnd_eq_verschiebungInt_of_hasStructureConstants_dualNumber25 below · depth 39 - Two η_{i_0}-elements with 𝔽ₚ-independent tangent parts over κ[ε]
CerednikDrinfeld.FormalODModule.exists_mem_etaPiece_tangent_eq_smul_forall_dvd_of_isAlgClosed_dualNumber154 below · depth 39 - Descent of a Cartier element with ghost logarithm
MvFormalGroup.CartierModule.exists_baseChange_eq_of_coeff_subst_eq_ghost_of_functionalEquation1 below · depth 39 - Verschiebung is topologically nilpotent in finite height
MvFormalGroup.CartierModule.exists_forall_iterate_verschiebung_eq_smul_of_finrank_eq_pow15 below · depth 39 - Injectivity of Verschiebung when p is nilpotent
MvFormalGroup.CartierModule.verschiebungInt_injective_of_isNilpotent0 below · depth 39 - Ghost read-out of Verschiebung, Frobenius and Teichmüller substitutions
MvFormalGroup.WittLaw.coeff_subst_verFam_frobPolyFam_teichFam_of_coeff_eq_ghost0 below · depth 39 - Two η-elements at a critical index with 𝔽ₚ-independent tangents
CerednikDrinfeld.FormalODModule.exists_nMk_mem_etaPiece_tangent_eq_smul_forall_dvd_of_isAlgClosed66 below · depth 40 - Explicit height-4 edge isogeny between special formal mathcal O_D-modules
CerednikDrinfeld.FormalODModule.exists_hom_map_eq_sub_verschiebungInt_and_isIsogenyOfHeight_of_hasStructureConstants_edgeConstants64 below · depth 41 - Normalised node isogeny onto the edge family's node fibre
CerednikDrinfeld.FormalODModule.exists_isIsogenyOfHeight_map_node_rigidNum_single_eq199 below · depth 41 - Cartier quadruples at geometric points of the edge family
CerednikDrinfeld.FormalODModule.forall_isCartierQuadruple_map_line_eq_of_rigidNum_single_eq_of_edge_isogeny346 below · depth 41 - Base change of Cartier modules along a surjection is surjective
MvFormalGroup.CartierModule.baseChange_surjective_of_surjective18 below · depth 41 - Closed Witt form of the edge structure constants
CerednikDrinfeld.FormalODModule.endAct_varpiEnd_eq_teichmuller_sub_smul_add_verschiebungInt_of_hasStructureConstants_edgeConstants4 below · depth 42 - Explicit homomorphism of special formal modules from Witt edge relations
CerednikDrinfeld.FormalODModule.exists_hom_map_eq_sub_verschiebungInt_of_endAct_varpiEnd_eq_teichmuller33 below · depth 42 - Cartier quadruple of the edge family at a node point
CerednikDrinfeld.FormalODModule.exists_isCartierQuadruple_map_line_eq_of_edge_isogeny_of_apply_xi_eq_zero_of_apply_eta_eq_zero331 below · depth 42 - Geometric fibre of the edge family on the η-branch
CerednikDrinfeld.FormalODModule.exists_isCartierQuadruple_map_line_eq_of_edge_isogeny_of_apply_xi_eq_zero_of_apply_eta_ne_zero319 below · depth 42 - Cartier quadruple and Deligne lines at a point with y(ξ)≠ 0
CerednikDrinfeld.FormalODModule.exists_isCartierQuadruple_map_line_eq_of_edge_isogeny_of_apply_xi_ne_zero320 below · depth 42 - Explicit edge homomorphism is an isogeny of height 4
CerednikDrinfeld.FormalODModule.isIsogenyOfHeight_four_of_map_eq_sub_verschiebungInt_edgeRingCharP61 below · depth 42 - Node determinant det A = u p^{2m} for rigidified data
CerednikDrinfeld.SpecialFormal.Rigidified.exists_det_eq_mul_pow_of_rigidNum_eq_sum_smul_map_node140 below · depth 42 - Integral p-adic matrix for the rigidification numerator at a node
CerednikDrinfeld.SpecialFormal.Rigidified.exists_rigidNum_eq_sum_smul_of_isIsogenyOfHeight_map_node123 below · depth 42 - Height and rigidification numerator under composition with a central endomorphism
CerednikDrinfeld.SpecialFormal.Rigidified.isIsogenyOfHeight_comp_and_rigidNum_comp_eq_rigidNum_mulVec_of_centralizer22 below · depth 42 - Node witnesses: mathcal O_D-linearity and graded reductions
CerednikDrinfeld.SpecialFormal.Rigidified.isODHom_and_isGradedSbar_and_isGradedPhiS_map_node6 below · depth 42 - Dual edge homomorphism ρᵈagger: X→ Y on Cartier modules
CerednikDrinfeld.FormalODModule.exists_hom_map_eq_add_verschiebungInt_of_endAct_varpiEnd_eq_teichmuller34 below · depth 43 - Transporting homogeneous V-bases with Pi = V
CerednikDrinfeld.FormalODModule.exists_hom_map_eq_of_endAct_varpiEnd_eq_verschiebungInt33 below · depth 43 - Node case: Cartier quadruple with node Deligne lines
CerednikDrinfeld.FormalODModule.forall_isCartierQuadruple_map_node_line_eq_of_rigidNum_single_eq309 below · depth 43 - Stalk kernels at an η-branch point of the edge family
CerednikDrinfeld.FormalODModule.ker_eq_span_of_lattice_eq_of_isCartierQuadruple_map_edge_of_apply_xi_eq_zero_of_apply_eta_ne_zero120 below · depth 43 - Kernels of u₀ and u₁ at a ξ-point
CerednikDrinfeld.FormalODModule.ker_eq_span_of_lattice_eq_of_isCartierQuadruple_map_edge_of_apply_xi_ne_zero121 below · depth 43 - η-branch: both Drinfeld lattices equal p⁻¹ diag(p,1) ℤₚ²
CerednikDrinfeld.FormalODModule.lattice_eq_of_isCartierQuadruple_map_edge_of_apply_xi_eq_zero_of_apply_eta_ne_zero89 below · depth 43 - Lattices of a Cartier quadruple at a ξ-point
CerednikDrinfeld.FormalODModule.lattice_eq_of_isCartierQuadruple_map_edge_of_apply_xi_ne_zero90 below · depth 43 - Admissibility of a composed rigidification over the edge-chart ring
CerednikDrinfeld.SpecialFormal.Rigidified.isAdmissible_mk_edgeRingCharP_comp_of_isIsogenyOfHeight23 below · depth 43 - Degree-one η-sections with tangent ratio -y(η)
CerednikDrinfeld.FormalODModule.exists_isEtaSection_one_tangent_eq_neg_mul_of_edge_isogeny_of_apply_xi_eq_zero_of_apply_eta_ne_zero114 below · depth 44 - Degree-one eta-sections on the ξ-branch of the edge family
CerednikDrinfeld.FormalODModule.exists_isEtaSection_one_tangent_eq_neg_mul_of_edge_isogeny_of_apply_xi_ne_zero115 below · depth 44 - Degree-zero η-sections on the η-branch: tangent ratio -y(η)
CerednikDrinfeld.FormalODModule.exists_isEtaSection_zero_tangent_eq_neg_mul_of_edge_isogeny_of_apply_xi_eq_zero_of_apply_eta_ne_zero115 below · depth 44 - Degree-zero η-sections of the edge family where y(ξ)≠ 0
CerednikDrinfeld.FormalODModule.exists_isEtaSection_zero_tangent_eq_neg_mul_of_edge_isogeny_of_apply_xi_ne_zero115 below · depth 44 - Height 4 from a rank-4 Cartier module and nilpotent [p]-coordinates
CerednikDrinfeld.FormalODModule.hasHeight_four_of_basis_cartierModule_of_X_pow_mem_span38 below · depth 44 - Node stalks of a Cartier quadruple: lattices and kernel lines
CerednikDrinfeld.FormalODModule.lattice_eq_and_ker_eq_span_of_isCartierQuadruple_map_node_of_rigidNum_single_eq97 below · depth 44 - Rigidification numerator of the edge family at an arbitrary base point
CerednikDrinfeld.FormalODModule.smul_rigidNum_map_single_eq_smul_baseChange_of_rigidNum_single_eq_of_edge_isogeny0 below · depth 44 - Cartier curves with Fγ=Vγ descend to a one-dimensional law
MvFormalGroup.CartierModule.exists_hom_map_eq_of_frobenius_eq_verschiebungInt41 below · depth 44 - Rank of the Cartier module equals the height
CerednikDrinfeld.FormalODModule.eq_four_of_basis_cartierModule_of_finrank_eq_pow26 below · depth 45 - Node kernels of a Cartier quadruple are coordinate lines
CerednikDrinfeld.FormalODModule.ker_eq_span_of_lattice_eq_of_isCartierQuadruple_map_node_of_rigidNum_single_eq94 below · depth 45 - Node lattices of the Cartier quadruple of the normalised node triple
CerednikDrinfeld.FormalODModule.lattice_eq_of_isCartierQuadruple_map_node_of_rigidNum_single_eq91 below · depth 45 - Degree-one η-sections at the node of the standard edge
CerednikDrinfeld.FormalODModule.exists_isEtaSection_one_tangent_eq_neg_mul_map_node_of_rigidNum_single_eq90 below · depth 46 - Degree-zero η-sections at the node of the standard edge
CerednikDrinfeld.FormalODModule.exists_isEtaSection_zero_tangent_eq_neg_mul_map_node_of_rigidNum_single_eq90 below · depth 46 - Node normalisation of the rigidification numerator propagates under base change
CerednikDrinfeld.FormalODModule.smul_rigidNum_map_node_single_eq_smul_baseChange_of_rigidNum_single_eq0 below · depth 46