Definitions/Def_MvFormalGroup_CartierModule.lean
Cartier modules of multivariate formal group laws
Fix a prime p, a commutative ring R and a d-dimensional formal group law \Phi over R (a d-tuple of power series in two blocks of d variables, with the unit, linearity and associativity axioms as fields). The Witt addition law is packaged as the family addFam p R n, the image in R of the Witt addition polynomial WittVector.wittAdd p n, read as a power series in the variables indexed by \mathrm{Fin}\,2\times\mathbb N (two blocks X_m, Y_m). That this family is substitutable rests on a weighted-homogeneity statement proved here for arbitrary Witt structure polynomials: giving the variable (i,m) the weight c_i p^m, wittStructureInt p Φ n is weighted homogeneous of degree k p^n whenever the n-th Witt-polynomial specialisation of \Phi is; applied to X_0+X_1 and X_0X_1 this gives homogeneity of degree p^n for wittAdd (weights 1,1) and for wittMul (weights 0,1).
CartierModule p Φ is then a structure whose data is a d-tuple f of power series in variables X_0,X_1,\dots over R, with fields asserting that each f_j has zero constant term and that substituting the Witt addition family into f_j equals substituting f in the first block and f in the second block into \Phi_j; that is, f is a homomorphism of formal groups from the p-typical Witt law to \Phi, presented on this model. For commutative \Phi the set carries an abelian group structure with addition f+g=\Phi(f,g), zero the tuple 0 and negation given by the inverse series of \Phi.
A predicate IsEndo p u records that a family u of series in X_0,X_1,\dots is substitutable, has zero constant terms, and commutes with the Witt addition family in the sense \,u_n(S_\bullet(X;Y))=S_n(u(X);u(Y)); each such u gives an additive precomposition operator precomp. Two instances are defined: verFam, the shift X_m\mapsto X_{m+1} read as (0,X_0,X_1,\dots), whose precomposition operator is named frobenius, and, over a base of characteristic p, frobFam, the family X_m^p, whose precomposition operator is named verschiebung and equals the p-th power expansion operator. The relations \;frobenius\circverschiebung=verschiebung\circfrobenius=p\cdot{} and injectivity of verschiebung are proved, the former via families nsmulFam computing multiplication by n on Witt vectors and the identity p\cdot x=(0,x_0^p,x_1^p,\dots) in characteristic p. Homomorphisms \varphi\colon\Phi\to\Phi' act by postcomposition (map), additively, functorially and commuting with the two operators, whence a ring homomorphism endAct from \mathrm{End}(\Phi) to the additive endomorphisms of the Cartier module, sending n to multiplication by n. Finally tangent takes the coefficient of X_0 in each component, an additive map to R^d killing verschiebung and intertwining map with the linear part of \varphi; curve substitutes X_0\mapsto X and X_m\mapsto 0 for m\ge 1, producing the associated d-tuple of one-variable curves, with \mathrm{coeff}_1 recovering tangent and verschiebung becoming X\mapsto X^p. An example constructs, for v\in R^d, the element v_i X_0 of the Cartier module of the additive law, with tangent v, so that tangent is surjective there.
Relation to Mathlib
Built on Mathlib's Witt vectors (WittVector.wittAdd, wittStructureInt, wittNSMul) and multivariate power-series substitution; Mathlib has no multivariate formal group laws, no Cartier (Dieudonné) modules, and no weighted-homogeneity statement for Witt structure polynomials, all of which are the project's own.
Where it is used
These definitions provide the carrier and elementary operator structure (F, V, the action of \mathrm{End}(\Phi), the tangent and curve maps) for the covariant Cartier–Dieudonné module of a formal group law, on which the structure theory of special formal modules used in the p-adic uniformisation of Shimura curves is then developed.
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
- J.-F. Boutot and H. Carayol, Uniformisation p-adique des courbes de Shimura: les théorèmes de Čerednik et de Drinfeld, Astérisque 196–197 (1991), 45–158
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 1,220 lines
- 134 declarations
- used in the statements of 173 theorems and imported by 182 proofs
- imports 1 definition modules
Source file: Definitions/Def_MvFormalGroup_CartierModule.lean
Imports
Imported by
Def_CerednikDrinfeld_CartierGradedPieceDef_CerednikDrinfeld_CartierLMapFibreDef_CerednikDrinfeld_CartierModuleModelDef_CerednikDrinfeld_CartierStructureConstantsDef_CerednikDrinfeld_CritChartEndMatrixDef_CerednikDrinfeld_CriticalIndexChartDef_CerednikDrinfeld_ODModuleFrobeniusTwistDef_MvFormalGroup_CartierModuleBaseChangeDef_MvFormalGroup_CartierModuleHomothetyDef_MvFormalGroup_CartierModuleIntVerschiebungDef_MvFormalGroup_CartierModuleWittActionDef_MvFormalGroup_WittPointFamilyDef_MvFormalGroup_WittPointFamilyInt
Declarations
- def
MvFormalGroup.WittLaw.weight - theorem
MvFormalGroup.WittLaw.weight_apply - theorem
MvFormalGroup.WittLaw.isWeightedHomogeneous_rename_wittPolynomial - theorem
MvFormalGroup.WittLaw.isWeightedHomogeneous_wittStructureInt - theorem
MvFormalGroup.WittLaw.isWeightedHomogeneous_wittAdd - theorem
MvFormalGroup.WittLaw.isWeightedHomogeneous_wittMul - def
MvFormalGroup.WittLaw.addFam - theorem
MvFormalGroup.WittLaw.constantCoeff_addFam - theorem
MvFormalGroup.WittLaw.weight_eq_of_coeff_addFam_ne_zero - theorem
MvFormalGroup.WittLaw.hasSubst_addFam - instance
MvFormalGroup.WittLaw.instTendstoCofiniteProdMk - def
MvFormalGroup.WittLaw.blk - theorem
MvFormalGroup.WittLaw.blk_apply - theorem
MvFormalGroup.WittLaw.constantCoeff_blk - theorem
MvFormalGroup.WittLaw.hasSubst_blk - theorem
MvFormalGroup.WittLaw.subst_blk_eq_rename - structure
MvFormalGroup.CartierModule - field
MvFormalGroup.CartierModule.toPowerSeries - field
MvFormalGroup.CartierModule.constantCoeff_eq_zero - field
MvFormalGroup.CartierModule.subst_eq - field
MvFormalGroup.CartierModule.subst - field
MvFormalGroup.CartierModule.subst - theorem
MvFormalGroup.CartierModule.ext - theorem
MvFormalGroup.CartierModule.hasSubst_toPowerSeries - def
MvFormalGroup.CartierModule.inBlk - theorem
MvFormalGroup.CartierModule.inBlk_apply - theorem
MvFormalGroup.CartierModule.constantCoeff_inBlk - theorem
MvFormalGroup.CartierModule.inBlk_zero - theorem
MvFormalGroup.CartierModule.inBlk_subst_elim - theorem
MvFormalGroup.CartierModule.inBlk_negSeries - theorem
MvFormalGroup.CartierModule.subst_addFam - def
MvFormalGroup.CartierModule.zero - instance
MvFormalGroup.CartierModule.instZero - theorem
MvFormalGroup.CartierModule.toPowerSeries_zero - def
MvFormalGroup.CartierModule.add - instance
MvFormalGroup.CartierModule.instAdd - theorem
MvFormalGroup.CartierModule.toPowerSeries_add - def
MvFormalGroup.CartierModule.neg - instance
MvFormalGroup.CartierModule.instNeg - theorem
MvFormalGroup.CartierModule.toPowerSeries_neg - instance
MvFormalGroup.CartierModule.instAddCommGroup - theorem
MvFormalGroup.CartierModule.toPowerSeries_sub - def
MvFormalGroup.WittLaw.pairFam - structure
MvFormalGroup.WittLaw.IsEndo - field
MvFormalGroup.WittLaw.IsEndo.hasSubst - field
MvFormalGroup.WittLaw.IsEndo.constantCoeff - field
MvFormalGroup.WittLaw.IsEndo.subst_addFam - theorem
MvFormalGroup.WittLaw.pairFam_apply - theorem
MvFormalGroup.WittLaw.constantCoeff_pairFam - theorem
MvFormalGroup.WittLaw.exists_coeff_ne_zero_of_coeff_subst_blk_ne_zero - theorem
MvFormalGroup.WittLaw.hasSubst_pairFam - theorem
MvFormalGroup.WittLaw.subst_pairFam_subst_blk - def
MvFormalGroup.WittLaw.verFam - theorem
MvFormalGroup.WittLaw.verFam_zero - theorem
MvFormalGroup.WittLaw.verFam_succ - theorem
MvFormalGroup.WittLaw.constantCoeff_verFam - theorem
MvFormalGroup.WittLaw.hasSubst_verFam - theorem
MvFormalGroup.WittLaw.aeval_verschiebung_wittAdd - theorem
MvFormalGroup.WittLaw.subst_coe_addFam - theorem
MvFormalGroup.WittLaw.isEndo_verFam - def
MvFormalGroup.WittLaw.frobFam - theorem
MvFormalGroup.WittLaw.frobFam_apply - theorem
MvFormalGroup.WittLaw.constantCoeff_frobFam - theorem
MvFormalGroup.WittLaw.hasSubst_frobFam - theorem
MvFormalGroup.WittLaw.subst_frobFam - theorem
MvFormalGroup.WittLaw.expand_map_wittAdd - theorem
MvFormalGroup.WittLaw.isEndo_frobFam - def
MvFormalGroup.CartierModule.precompFun - theorem
MvFormalGroup.CartierModule.toPowerSeries_precompFun - def
MvFormalGroup.CartierModule.precomp - theorem
MvFormalGroup.CartierModule.toPowerSeries_precomp - theorem
MvFormalGroup.CartierModule.precomp_precomp - def
MvFormalGroup.CartierModule.frobenius - theorem
MvFormalGroup.CartierModule.toPowerSeries_frobenius - def
MvFormalGroup.CartierModule.verschiebung - theorem
MvFormalGroup.CartierModule.toPowerSeries_verschiebung - theorem
MvFormalGroup.CartierModule.toPowerSeries_verschiebung_eq_expand - theorem
MvFormalGroup.CartierModule.frobenius_verschiebung - theorem
MvFormalGroup.CartierModule.verschiebung_injective - theorem
MvFormalGroup.Hom.subst_subst_elim - def
MvFormalGroup.CartierModule.mapFun - theorem
MvFormalGroup.CartierModule.toPowerSeries_mapFun - def
MvFormalGroup.CartierModule.map - theorem
MvFormalGroup.CartierModule.toPowerSeries_map - theorem
MvFormalGroup.CartierModule.map_id - theorem
MvFormalGroup.CartierModule.map_comp - theorem
MvFormalGroup.CartierModule.map_add_hom - theorem
MvFormalGroup.CartierModule.map_zero_hom - theorem
MvFormalGroup.CartierModule.map_precomp - theorem
MvFormalGroup.CartierModule.map_frobenius - theorem
MvFormalGroup.CartierModule.map_verschiebung - def
MvFormalGroup.CartierModule.endAct - theorem
MvFormalGroup.CartierModule.endAct_apply - theorem
MvFormalGroup.CartierModule.endAct_frobenius - theorem
MvFormalGroup.CartierModule.endAct_verschiebung - theorem
MvFormalGroup.CartierModule.endAct_natCast - def
MvFormalGroup.WittLaw.nsmulFam - theorem
MvFormalGroup.WittLaw.isWeightedHomogeneous_wittNSMul - theorem
MvFormalGroup.WittLaw.constantCoeff_nsmulFam - theorem
MvFormalGroup.WittLaw.weight_eq_of_coeff_nsmulFam_ne_zero - theorem
MvFormalGroup.WittLaw.hasSubst_nsmulFam - theorem
MvFormalGroup.WittLaw.peval_tautological - theorem
MvFormalGroup.WittLaw.wittNSMul_zero - theorem
MvFormalGroup.WittLaw.aeval_wittNSMul_wittAdd - theorem
MvFormalGroup.WittLaw.aeval_X_eq_map - theorem
MvFormalGroup.WittLaw.map_wittNSMul_self - theorem
MvFormalGroup.WittLaw.hasSubst_finCases - def
MvFormalGroup.WittLaw.stepFam - theorem
MvFormalGroup.WittLaw.hasSubst_stepFam - theorem
MvFormalGroup.WittLaw.stepFam_eq - theorem
MvFormalGroup.WittLaw.nsmulFam_succ - theorem
MvFormalGroup.WittLaw.nsmulFam_zero - theorem
MvFormalGroup.WittLaw.nsmulFam_self - theorem
MvFormalGroup.CartierModule.subst_nsmulFam - theorem
MvFormalGroup.CartierModule.verschiebung_frobenius - theorem
MvFormalGroup.CartierModule.frobenius_verschiebung_eq_nsmul - def
MvFormalGroup.CartierModule.tangent - theorem
MvFormalGroup.CartierModule.tangent_apply - theorem
MvFormalGroup.CartierModule.tangent_verschiebung - theorem
MvFormalGroup.CartierModule.tangent_map - def
MvFormalGroup.CartierModule.curveFam - theorem
MvFormalGroup.CartierModule.constantCoeff_curveFam - theorem
MvFormalGroup.CartierModule.hasSubst_curveFam - def
MvFormalGroup.CartierModule.curve - theorem
MvFormalGroup.CartierModule.curve_apply - theorem
MvFormalGroup.CartierModule.constantCoeff_curve - theorem
MvFormalGroup.CartierModule.curve_add - theorem
MvFormalGroup.CartierModule.curve_verschiebung - theorem
MvFormalGroup.CartierModule.coeff_one_curve - def
MvFormalGroup.CartierModule.Examples.addLinear - theorem
MvFormalGroup.CartierModule.Examples.toPowerSeries_addLinear - theorem
MvFormalGroup.CartierModule.Examples.tangent_addLinear - theorem
MvFormalGroup.CartierModule.Examples.tangent_surjective_addMv - theorem
MvFormalGroup.CartierModule.Examples.addLinear_ne_zero
Source
import Mathlib import Definitions.Def_MvFormalGroup_NegV2 set_option autoImplicit false noncomputable section universe u namespace MvFormalGroup namespace WittLaw open MvPolynomial variable (p : ℕ) [hp : Fact p.Prime] def weight {idx : Type*} (c : idx → ℕ) : idx × ℕ → ℕ := fun im => c im.1 * p ^ im.2 omit hp in @[simp] theorem weight_apply {idx : Type*} (c : idx → ℕ) (i : idx) (m : ℕ) : weight p c (i, m) = c i * p ^ m := rfl omit hp in theorem isWeightedHomogeneous_rename_wittPolynomial {idx : Type*} (c : idx → ℕ) (i : idx) (n : ℕ) : IsWeightedHomogeneous (weight p c) (rename (Prod.mk i) (wittPolynomial p ℤ n)) (c i * p ^ n) := by rw [wittPolynomial_eq_sum_C_mul_X_pow, map_sum] refine IsWeightedHomogeneous.sum _ _ _ fun j hj => ?_ rw [map_mul, rename_C, map_pow, map_pow, rename_X] have hj' : j ≤ n := Nat.lt_succ_iff.mp (Finset.mem_range.mp hj) have hX := (isWeightedHomogeneous_X (R := ℤ) (weight p c) (i, j)).pow (p ^ (n - j)) have hdeg : (p ^ (n - j)) • weight p c (i, j) = c i * p ^ n := by rw [weight_apply, smul_eq_mul, ← mul_assoc, mul_comm (p ^ (n - j)), mul_assoc, ← pow_add, Nat.sub_add_cancel hj'] rw [hdeg] at hX have := hX.C_mul ((p : ℤ) ^ j) rwa [map_pow] at this theorem isWeightedHomogeneous_wittStructureInt {idx : Type*} (c : idx → ℕ) (Φ : MvPolynomial idx ℤ) (k : ℕ) (hΦ : ∀ n, IsWeightedHomogeneous (weight p c) (bind₁ (fun i => rename (Prod.mk i) (wittPolynomial p ℤ n)) Φ) (k * p ^ n)) (n : ℕ) : IsWeightedHomogeneous (weight p c) (wittStructureInt p Φ n) (k * p ^ n) := by induction n using Nat.strong_induction_on with | _ n ih => have key := wittStructureInt_prop p Φ n rw [← aeval_eq_bind₁, aeval_wittPolynomial, Finset.sum_range_succ, Nat.sub_self, pow_zero, pow_one] at key have hsum : IsWeightedHomogeneous (weight p c) (∑ i ∈ Finset.range n, (p : MvPolynomial (idx × ℕ) ℤ) ^ i * wittStructureInt p Φ i ^ p ^ (n - i)) (k * p ^ n) := by refine IsWeightedHomogeneous.sum _ _ _ fun i hi => ?_ have hi' : i < n := Finset.mem_range.mp hi have h1 := (ih i hi').pow (p ^ (n - i)) have hdeg : (p ^ (n - i)) • (k * p ^ i) = k * p ^ n := by rw [smul_eq_mul, mul_left_comm, ← pow_add, Nat.sub_add_cancel hi'.le] rw [hdeg] at h1 have h2 := h1.C_mul ((p : ℤ) ^ i) rwa [map_pow, map_natCast] at h2 intro d hd by_contra hne have hcoeff : coeff d ((p : MvPolynomial (idx × ℕ) ℤ) ^ n * wittStructureInt p Φ n) = 0 := by have := congrArg (coeff d) key rw [coeff_add] at this have hR : coeff d (bind₁ (fun i => rename (Prod.mk i) (wittPolynomial p ℤ n)) Φ) = 0 := (hΦ n).coeff_eq_zero d hne have hS : coeff d (∑ i ∈ Finset.range n, (p : MvPolynomial (idx × ℕ) ℤ) ^ i * wittStructureInt p Φ i ^ p ^ (n - i)) = 0 := hsum.coeff_eq_zero d hne rw [hR, hS, zero_add] at this exact this have hC : (p : MvPolynomial (idx × ℕ) ℤ) ^ n = C ((p : ℤ) ^ n) := by rw [map_pow, map_natCast] rw [hC, coeff_C_mul] at hcoeff rcases mul_eq_zero.mp hcoeff with h | h · exact absurd h (pow_ne_zero _ (Int.natCast_ne_zero.mpr hp.out.ne_zero)) · exact hd h theorem isWeightedHomogeneous_wittAdd (n : ℕ) : IsWeightedHomogeneous (weight p fun _ : Fin 2 => 1) (WittVector.wittAdd p n) (p ^ n) := by have h := isWeightedHomogeneous_wittStructureInt p (fun _ : Fin 2 => 1) (X 0 + X 1) 1 (fun m => by rw [map_add, bind₁_X_right, bind₁_X_right, one_mul] have h0 := isWeightedHomogeneous_rename_wittPolynomial p (fun _ : Fin 2 => 1) 0 m have h1 := isWeightedHomogeneous_rename_wittPolynomial p (fun _ : Fin 2 => 1) 1 m rw [one_mul] at h0 h1 exact h0.add h1) n rwa [one_mul] at h theorem isWeightedHomogeneous_wittMul (n : ℕ) : IsWeightedHomogeneous (weight p ![0, 1]) (WittVector.wittMul p n) (p ^ n) := by have h := isWeightedHomogeneous_wittStructureInt p ![0, 1] (X 0 * X 1) 1 (fun m => by rw [map_mul, bind₁_X_right, bind₁_X_right, one_mul] have h0 := isWeightedHomogeneous_rename_wittPolynomial p ![0, 1] 0 m have h1 := isWeightedHomogeneous_rename_wittPolynomial p ![0, 1] 1 m simp only [Matrix.cons_val_zero, zero_mul, Matrix.cons_val_one, one_mul] at h0 h1 have := h0.mul h1 rwa [zero_add] at this) n rwa [one_mul] at h variable (R : Type u) [CommRing R] def addFam (n : ℕ) : MvPowerSeries (Fin 2 × ℕ) R := ↑(MvPolynomial.map (Int.castRingHom R) (WittVector.wittAdd p n)) theorem constantCoeff_addFam (n : ℕ) : MvPowerSeries.constantCoeff (addFam p R n) = 0 := by rw [addFam, ← MvPowerSeries.coeff_zero_eq_constantCoeff_apply, MvPolynomial.coeff_coe, coeff_map, ← constantCoeff_eq, WittVector.constantCoeff_wittAdd, map_zero] theorem weight_eq_of_coeff_addFam_ne_zero {n : ℕ} {d : Fin 2 × ℕ →₀ ℕ} (h : MvPowerSeries.coeff d (addFam p R n) ≠ 0) : Finsupp.weight (weight p fun _ : Fin 2 => 1) d = p ^ n := by rw [addFam, MvPolynomial.coeff_coe, coeff_map] at h have h' : coeff d (WittVector.wittAdd p n) ≠ 0 := fun h0 => h (by rw [h0, map_zero]) exact isWeightedHomogeneous_wittAdd p n h' theorem hasSubst_addFam : MvPowerSeries.HasSubst (addFam p R) := by refine ⟨fun n => by rw [constantCoeff_addFam]; exact IsNilpotent.zero, fun d => ?_⟩ · refine (Set.finite_lt_nat (Finsupp.weight (weight p fun _ : Fin 2 => 1) d)).subset ?_ intro n hn have hw := weight_eq_of_coeff_addFam_ne_zero p R hn show n < Finsupp.weight (weight p fun _ : Fin 2 => 1) d rw [hw] exact Nat.lt_pow_self hp.out.one_lt instance instTendstoCofiniteProdMk (i : Fin 2) : Filter.TendstoCofinite (Prod.mk i : ℕ → Fin 2 × ℕ) := Filter.tendstoCofinite_of_injective (Prod.mk_right_injective i) variable {R} def blk (i : Fin 2) : ℕ → MvPowerSeries (Fin 2 × ℕ) R := fun m => MvPowerSeries.X (i, m) omit hp in @[simp] theorem blk_apply (i : Fin 2) (m : ℕ) : blk (R := R) i m = MvPowerSeries.X (i, m) := rfl omit hp in theorem constantCoeff_blk (i : Fin 2) (m : ℕ) : MvPowerSeries.constantCoeff (blk (R := R) i m) = 0 := MvPowerSeries.constantCoeff_X _ omit hp in theorem hasSubst_blk (i : Fin 2) : MvPowerSeries.HasSubst (blk (R := R) i) := MvPowerSeries.HasSubst.X_comp (Prod.mk i) omit hp in theorem subst_blk_eq_rename (i : Fin 2) (f : MvPowerSeries ℕ R) : MvPowerSeries.subst (blk i) f = MvPowerSeries.rename (Prod.mk i) f := (MvPowerSeries.rename_eq_subst (Prod.mk i) f).symm end WittLaw open MvPowerSeries WittLaw variable {p : ℕ} [hp : Fact p.Prime] {d d' d'' : ℕ} {R : Type u} [CommRing R] structure CartierModule (p : ℕ) [Fact p.Prime] {d : ℕ} {R : Type u} [CommRing R] (Φ : MvFormalGroup d R) where toPowerSeries : Fin d → MvPowerSeries ℕ R constantCoeff_eq_zero : ∀ j, (toPowerSeries j).constantCoeff = 0 subst_eq : ∀ j, subst (WittLaw.addFam p R) (toPowerSeries j) = subst (Sum.elim (fun l => subst (fun m => (X (0, m) : MvPowerSeries (Fin 2 × ℕ) R)) (toPowerSeries l)) fun l => subst (fun m => (X (1, m) : MvPowerSeries (Fin 2 × ℕ) R)) (toPowerSeries l)) (Φ.toPowerSeries j) namespace CartierModule variable {Φ : MvFormalGroup d R} {Φ' : MvFormalGroup d' R} {Φ'' : MvFormalGroup d'' R} @[ext] theorem ext {f g : CartierModule p Φ} (h : f.toPowerSeries = g.toPowerSeries) : f = g := by cases f; cases g; cases h; rfl theorem hasSubst_toPowerSeries (f : CartierModule p Φ) : HasSubst f.toPowerSeries := hasSubst_of_constantCoeff_zero f.constantCoeff_eq_zero def inBlk (i : Fin 2) (a : Fin d → MvPowerSeries ℕ R) : Fin d → MvPowerSeries (Fin 2 × ℕ) R := fun l => subst (blk i) (a l) omit hp in @[simp] theorem inBlk_apply (i : Fin 2) (a : Fin d → MvPowerSeries ℕ R) (l : Fin d) : inBlk i a l = subst (blk i) (a l) := rfl omit hp in theorem constantCoeff_inBlk (i : Fin 2) {a : Fin d → MvPowerSeries ℕ R} (ha : ∀ l, (a l).constantCoeff = 0) (l : Fin d) : (inBlk i a l).constantCoeff = 0 := constantCoeff_subst_eq_zero (hasSubst_blk i) (constantCoeff_blk i) (ha l) omit hp in theorem inBlk_zero (i : Fin 2) : inBlk i (fun _ : Fin d => (0 : MvPowerSeries ℕ R)) = fun _ => 0 := by funext l show subst (blk i) (0 : MvPowerSeries ℕ R) = 0 rw [← coe_substAlgHom (hasSubst_blk i), map_zero] omit hp in theorem inBlk_subst_elim (G : MvFormalGroup d' R) (i : Fin 2) {a b : Fin d' → MvPowerSeries ℕ R} (ha : ∀ l, (a l).constantCoeff = 0) (hb : ∀ l, (b l).constantCoeff = 0) : inBlk i (fun l => subst (Sum.elim a b) (G.toPowerSeries l)) = fun l => subst (Sum.elim (inBlk i a) (inBlk i b)) (G.toPowerSeries l) := by funext l exact subst_subst_elim G ha hb (hasSubst_blk i) l omit hp in theorem inBlk_negSeries (G : MvFormalGroup d' R) (i : Fin 2) {a : Fin d' → MvPowerSeries ℕ R} (ha : ∀ l, (a l).constantCoeff = 0) : inBlk i (negSeries G a) = negSeries G (inBlk i a) := by have hneg : ∀ j, (negSeries G a j).constantCoeff = 0 := constantCoeff_negSeries G a refine negSeries_unique G (constantCoeff_inBlk i ha) (constantCoeff_inBlk i hneg) fun l => ?_ have h := congrFun (inBlk_subst_elim G i ha hneg) l rw [← h] show subst (blk i) (subst (Sum.elim a (negSeries G a)) (G.toPowerSeries l)) = 0 rw [subst_elim_negSeries G ha l, ← coe_substAlgHom (hasSubst_blk i), map_zero] theorem subst_addFam (f : CartierModule p Φ) (j : Fin d) : subst (WittLaw.addFam p R) (f.toPowerSeries j) = subst (Sum.elim (inBlk 0 f.toPowerSeries) (inBlk 1 f.toPowerSeries)) (Φ.toPowerSeries j) := f.subst_eq j protected def zero (Φ : MvFormalGroup d R) : CartierModule p Φ where toPowerSeries := fun _ => 0 constantCoeff_eq_zero := fun _ => map_zero _ subst_eq := by intro j rw [← coe_substAlgHom (hasSubst_addFam p R), map_zero] have h0 : (fun l : Fin d => subst (fun m => (X (0, m) : MvPowerSeries (Fin 2 × ℕ) R)) ((fun _ : Fin d => (0 : MvPowerSeries ℕ R)) l)) = fun _ => 0 := inBlk_zero 0 have h1 : (fun l : Fin d => subst (fun m => (X (1, m) : MvPowerSeries (Fin 2 × ℕ) R)) ((fun _ : Fin d => (0 : MvPowerSeries ℕ R)) l)) = fun _ => 0 := inBlk_zero 1 rw [h0, h1] exact (subst_elim_zero_right Φ (fun _ => map_zero _) j).symm instance instZero : Zero (CartierModule p Φ) := ⟨CartierModule.zero Φ⟩ @[simp] theorem toPowerSeries_zero : (0 : CartierModule p Φ).toPowerSeries = fun _ => 0 := rfl protected def add [Φ.IsComm] (f g : CartierModule p Φ) : CartierModule p Φ where toPowerSeries := fun j => subst (Sum.elim f.toPowerSeries g.toPowerSeries) (Φ.toPowerSeries j) constantCoeff_eq_zero := fun j => constantCoeff_subst_elim Φ f.constantCoeff_eq_zero g.constantCoeff_eq_zero j subst_eq := by intro j have hf := f.constantCoeff_eq_zero have hg := g.constantCoeff_eq_zero show subst (WittLaw.addFam p R) (subst (Sum.elim f.toPowerSeries g.toPowerSeries) (Φ.toPowerSeries j)) = subst (Sum.elim (inBlk 0 fun l => subst (Sum.elim f.toPowerSeries g.toPowerSeries) (Φ.toPowerSeries l)) (inBlk 1 fun l => subst (Sum.elim f.toPowerSeries g.toPowerSeries) (Φ.toPowerSeries l))) (Φ.toPowerSeries j) rw [subst_subst_elim Φ hf hg (hasSubst_addFam p R) j, inBlk_subst_elim Φ 0 hf hg, inBlk_subst_elim Φ 1 hf hg] have hfeq : (fun l => subst (WittLaw.addFam p R) (f.toPowerSeries l)) = fun l => subst (Sum.elim (inBlk 0 f.toPowerSeries) (inBlk 1 f.toPowerSeries)) (Φ.toPowerSeries l) := funext f.subst_addFam have hgeq : (fun l => subst (WittLaw.addFam p R) (g.toPowerSeries l)) = fun l => subst (Sum.elim (inBlk 0 g.toPowerSeries) (inBlk 1 g.toPowerSeries)) (Φ.toPowerSeries l) := funext g.subst_addFam rw [hfeq, hgeq] exact subst_elim_exchange Φ (constantCoeff_inBlk 0 hf) (constantCoeff_inBlk 1 hf) (constantCoeff_inBlk 0 hg) (constantCoeff_inBlk 1 hg) j instance instAdd [Φ.IsComm] : Add (CartierModule p Φ) := ⟨CartierModule.add⟩ @[simp] theorem toPowerSeries_add [Φ.IsComm] (f g : CartierModule p Φ) : (f + g).toPowerSeries = fun j => subst (Sum.elim f.toPowerSeries g.toPowerSeries) (Φ.toPowerSeries j) := rfl protected def neg [Φ.IsComm] (f : CartierModule p Φ) : CartierModule p Φ where toPowerSeries := negSeries Φ f.toPowerSeries constantCoeff_eq_zero := constantCoeff_negSeries Φ f.toPowerSeries subst_eq := by intro j have hf := f.constantCoeff_eq_zero have hneg : ∀ j, (negSeries Φ f.toPowerSeries j).constantCoeff = 0 := constantCoeff_negSeries Φ _ show subst (WittLaw.addFam p R) (negSeries Φ f.toPowerSeries j) = subst (Sum.elim (inBlk 0 (negSeries Φ f.toPowerSeries)) (inBlk 1 (negSeries Φ f.toPowerSeries))) (Φ.toPowerSeries j) have hS : (fun l => subst (WittLaw.addFam p R) (negSeries Φ f.toPowerSeries l)) = negSeries Φ fun l => subst (WittLaw.addFam p R) (f.toPowerSeries l) := by have hA := hasSubst_addFam p R have hA0 := constantCoeff_addFam p R refine negSeries_unique Φ (fun l => constantCoeff_subst_eq_zero hA hA0 (hf l)) (fun l => constantCoeff_subst_eq_zero hA hA0 (hneg l)) fun i => ?_ rw [← subst_subst_elim Φ hf hneg hA i, subst_elim_negSeries Φ hf i, ← coe_substAlgHom hA, map_zero] have h1 := congrFun hS j rw [h1] have hfeq : (fun l => subst (WittLaw.addFam p R) (f.toPowerSeries l)) = fun l => subst (Sum.elim (inBlk 0 f.toPowerSeries) (inBlk 1 f.toPowerSeries)) (Φ.toPowerSeries l) := funext f.subst_addFam rw [hfeq, negSeries_elim_add Φ (constantCoeff_inBlk 0 hf) (constantCoeff_inBlk 1 hf), ← inBlk_negSeries Φ 0 hf, ← inBlk_negSeries Φ 1 hf] instance instNeg [Φ.IsComm] : Neg (CartierModule p Φ) := ⟨CartierModule.neg⟩ @[simp] theorem toPowerSeries_neg [Φ.IsComm] (f : CartierModule p Φ) : (-f).toPowerSeries = negSeries Φ f.toPowerSeries := rfl instance instAddCommGroup [Φ.IsComm] : AddCommGroup (CartierModule p Φ) where add := (· + ·) zero := 0 neg := Neg.neg nsmul := nsmulRec zsmul := zsmulRec add_assoc a b c := CartierModule.ext (funext fun j => subst_elim_assoc Φ a.constantCoeff_eq_zero b.constantCoeff_eq_zero c.constantCoeff_eq_zero j) zero_add a := CartierModule.ext (funext fun j => subst_elim_zero_left Φ a.constantCoeff_eq_zero j) add_zero a := CartierModule.ext (funext fun j => subst_elim_zero_right Φ a.constantCoeff_eq_zero j) add_comm a b := CartierModule.ext (funext fun j => subst_elim_comm Φ a.constantCoeff_eq_zero b.constantCoeff_eq_zero j) neg_add_cancel a := CartierModule.ext (funext fun j => subst_elim_negSeries_left Φ a.constantCoeff_eq_zero j) @[simp] theorem toPowerSeries_sub [Φ.IsComm] (f g : CartierModule p Φ) : (f - g).toPowerSeries = fun j => subst (Sum.elim f.toPowerSeries (negSeries Φ g.toPowerSeries)) (Φ.toPowerSeries j) := by rw [sub_eq_add_neg]; rfl end CartierModule namespace WittLaw variable (p) def pairFam (u : ℕ → MvPowerSeries ℕ R) : Fin 2 × ℕ → MvPowerSeries (Fin 2 × ℕ) R := fun im => subst (blk im.1) (u im.2) structure IsEndo (u : ℕ → MvPowerSeries ℕ R) : Prop where hasSubst : HasSubst u constantCoeff : ∀ n, (u n).constantCoeff = 0 subst_addFam : ∀ n, subst (addFam p R) (u n) = subst (pairFam u) (addFam p R n) variable {p} omit hp in @[simp] theorem pairFam_apply (u : ℕ → MvPowerSeries ℕ R) (i : Fin 2) (m : ℕ) : pairFam u (i, m) = subst (blk i) (u m) := rfl omit hp in theorem constantCoeff_pairFam {u : ℕ → MvPowerSeries ℕ R} (hu : ∀ n, (u n).constantCoeff = 0) (im : Fin 2 × ℕ) : (pairFam u im).constantCoeff = 0 := constantCoeff_subst_eq_zero (hasSubst_blk im.1) (constantCoeff_blk im.1) (hu im.2) omit hp in theorem exists_coeff_ne_zero_of_coeff_subst_blk_ne_zero (i : Fin 2) (f : MvPowerSeries ℕ R) {e : Fin 2 × ℕ →₀ ℕ} (h : coeff e (subst (blk (R := R) i) f) ≠ 0) : ∃ x : ℕ →₀ ℕ, Finsupp.mapDomain (Prod.mk i) x = e ∧ coeff x f ≠ 0 := by rw [subst_blk_eq_rename, coeff_rename] at h obtain ⟨x, hx, hne⟩ := Finset.exists_ne_zero_of_sum_ne_zero h refine ⟨x, ?_, hne⟩ simpa using hx omit hp in theorem hasSubst_pairFam {u : ℕ → MvPowerSeries ℕ R} (hu : HasSubst u) (hu0 : ∀ n, (u n).constantCoeff = 0) : HasSubst (pairFam u) := by refine ⟨fun im => by rw [constantCoeff_pairFam hu0]; exact IsNilpotent.zero, fun e => ?_⟩ have hfin : ∀ i : Fin 2, {m : ℕ | coeff e (subst (blk (R := R) i) (u m)) ≠ 0}.Finite := by intro i by_cases hx : ∃ x : ℕ →₀ ℕ, Finsupp.mapDomain (Prod.mk i) x = e · obtain ⟨x, rfl⟩ := hx refine (hu.coeff_zero x).subset fun m hm => ?_ obtain ⟨y, hy, hne⟩ := exists_coeff_ne_zero_of_coeff_subst_blk_ne_zero i (u m) hm have hyx : y = x := Finsupp.mapDomain_injective (Prod.mk_right_injective i) hy rw [hyx] at hne exact hne · convert Set.finite_empty ext m simp only [Set.mem_setOf_eq, Set.mem_empty_iff_false, iff_false, not_not] by_contra hm obtain ⟨y, hy, -⟩ := exists_coeff_ne_zero_of_coeff_subst_blk_ne_zero i (u m) hm exact hx ⟨y, hy⟩ have hsub : {im : Fin 2 × ℕ | coeff e (pairFam u im) ≠ 0} ⊆ ⋃ i : Fin 2, Prod.mk i '' {m : ℕ | coeff e (subst (blk (R := R) i) (u m)) ≠ 0} := by rintro ⟨i, m⟩ him exact Set.mem_iUnion.mpr ⟨i, m, him, rfl⟩ exact (Set.finite_iUnion fun i => (hfin i).image _).subset hsub omit hp in theorem subst_pairFam_subst_blk {u : ℕ → MvPowerSeries ℕ R} (hu : HasSubst u) (hu0 : ∀ n, (u n).constantCoeff = 0) (i : Fin 2) (f : MvPowerSeries ℕ R) : subst (pairFam u) (subst (blk (R := R) i) f) = subst (blk (R := R) i) (subst u f) := by rw [subst_comp_subst_apply (hasSubst_blk i) (hasSubst_pairFam hu hu0), subst_comp_subst_apply hu (hasSubst_blk i)] congr 1 funext m show subst (pairFam u) (X (i, m)) = subst (blk i) (u m) rw [subst_X (hasSubst_pairFam hu hu0)] rfl variable (R) def verFam : ℕ → MvPowerSeries ℕ R | 0 => 0 | n + 1 => X n variable {R} omit hp in @[simp] theorem verFam_zero : verFam R 0 = 0 := rfl omit hp in @[simp] theorem verFam_succ (n : ℕ) : verFam R (n + 1) = X n := rfl omit hp in theorem constantCoeff_verFam (n : ℕ) : (verFam R n).constantCoeff = 0 := by cases n with | zero => exact map_zero _ | succ n => exact constantCoeff_X _ omit hp in theorem hasSubst_verFam : HasSubst (verFam R) := by classical refine ⟨fun n => by rw [constantCoeff_verFam]; exact IsNilpotent.zero, fun e => ?_⟩ refine (e.support.image Nat.succ).finite_toSet.subset fun n hn => ?_ cases n with | zero => exact absurd (by simp) hn | succ n => have h : coeff e (X n : MvPowerSeries ℕ R) ≠ 0 := hn rw [coeff_X] at h split_ifs at h with he · subst he simp · exact absurd rfl h theorem aeval_verschiebung_wittAdd (n : ℕ) : MvPolynomial.aeval (fun im : Fin 2 × ℕ => (Nat.casesOn im.2 0 fun m => MvPolynomial.X (im.1, m) : MvPolynomial (Fin 2 × ℕ) ℤ)) (WittVector.wittAdd p n) = Nat.casesOn n 0 fun m => WittVector.wittAdd p m := by let A := MvPolynomial (Fin 2 × ℕ) ℤ let x : WittVector p A := WittVector.mk p fun m => MvPolynomial.X (0, m) let y : WittVector p A := WittVector.mk p fun m => MvPolynomial.X (1, m) have key := congrArg (fun z : WittVector p A => z.coeff n) (WittVector.verschiebung.map_add x y).symm have hval : (fun im : Fin 2 × ℕ => (Nat.casesOn im.2 0 fun m => MvPolynomial.X (im.1, m) : A)) = Function.uncurry ![(WittVector.verschiebung x).coeff, (WittVector.verschiebung y).coeff] := by funext ⟨i, m⟩ fin_cases i <;> cases m <;> rfl rw [hval] change WittVector.peval (WittVector.wittAdd p n) ![(WittVector.verschiebung x).coeff, (WittVector.verschiebung y).coeff] = _ rw [← WittVector.add_coeff, key] cases n with | zero => exact WittVector.verschiebung_coeff_zero _ | succ m => rw [WittVector.verschiebung_coeff_succ, WittVector.add_coeff] show MvPolynomial.aeval (Function.uncurry ![x.coeff, y.coeff]) (WittVector.wittAdd p m) = _ have hid : Function.uncurry ![x.coeff, y.coeff] = (MvPolynomial.X : Fin 2 × ℕ → A) := by funext ⟨i, k⟩ fin_cases i <;> rfl rw [hid, MvPolynomial.aeval_X_left_apply] theorem subst_coe_addFam {τ : Type*} (g : Fin 2 × ℕ → MvPolynomial τ ℤ) (n : ℕ) : subst (fun im => ((MvPolynomial.map (Int.castRingHom R) (g im) : MvPolynomial τ R) : MvPowerSeries τ R)) (addFam p R n) = ((MvPolynomial.map (Int.castRingHom R) (MvPolynomial.aeval g (WittVector.wittAdd p n)) : MvPolynomial τ R) : MvPowerSeries τ R) := by rw [addFam, subst_coe] set G : Fin 2 × ℕ → MvPowerSeries τ R := fun im => ((MvPolynomial.map (Int.castRingHom R) (g im) : MvPolynomial τ R) : MvPowerSeries τ R) let ψ₁ : MvPolynomial (Fin 2 × ℕ) ℤ →+* MvPowerSeries τ R := (MvPolynomial.aeval G).toRingHom.comp (MvPolynomial.map (Int.castRingHom R)) let ψ₂ : MvPolynomial (Fin 2 × ℕ) ℤ →+* MvPowerSeries τ R := (MvPolynomial.coeToMvPowerSeries.ringHom (σ := τ) (R := R)).comp ((MvPolynomial.map (Int.castRingHom R)).comp (MvPolynomial.aeval g).toRingHom) have hψ : ψ₁ = ψ₂ := by refine MvPolynomial.ringHom_ext (fun r => ?_) (fun im => ?_) · have h1 := RingHom.ext_int (ψ₁.comp (MvPolynomial.C : ℤ →+* MvPolynomial (Fin 2 × ℕ) ℤ)) (ψ₂.comp (MvPolynomial.C : ℤ →+* MvPolynomial (Fin 2 × ℕ) ℤ)) exact RingHom.congr_fun h1 r · simp [ψ₁, ψ₂, G] exact RingHom.congr_fun hψ (WittVector.wittAdd p n) theorem isEndo_verFam : IsEndo p (verFam R) := by refine ⟨hasSubst_verFam, constantCoeff_verFam, fun n => ?_⟩ have hpair : pairFam (verFam R) = fun im : Fin 2 × ℕ => ((MvPolynomial.map (Int.castRingHom R) (Nat.casesOn im.2 0 fun m => MvPolynomial.X (im.1, m) : MvPolynomial (Fin 2 × ℕ) ℤ) : MvPolynomial (Fin 2 × ℕ) R) : MvPowerSeries (Fin 2 × ℕ) R) := by funext ⟨i, m⟩ cases m with | zero => show subst (blk i) (0 : MvPowerSeries ℕ R) = _ rw [← coe_substAlgHom (hasSubst_blk i), map_zero] simp | succ m => show subst (blk i) (X m : MvPowerSeries ℕ R) = _ rw [subst_X (hasSubst_blk i)] simp [blk] rw [hpair, subst_coe_addFam (fun im : Fin 2 × ℕ => (Nat.casesOn im.2 0 fun m => MvPolynomial.X (im.1, m) : MvPolynomial (Fin 2 × ℕ) ℤ)) n, aeval_verschiebung_wittAdd] cases n with | zero => show subst (addFam p R) (0 : MvPowerSeries ℕ R) = _ rw [← coe_substAlgHom (hasSubst_addFam p R), map_zero] simp | succ m => show subst (addFam p R) (X m : MvPowerSeries ℕ R) = _ rw [subst_X (hasSubst_addFam p R)] rfl variable (p R) def frobFam : ℕ → MvPowerSeries ℕ R := fun n => X n ^ p variable {p R} omit hp in @[simp] theorem frobFam_apply (n : ℕ) : frobFam p R n = X n ^ p := rfl theorem constantCoeff_frobFam (n : ℕ) : (frobFam p R n).constantCoeff = 0 := by rw [frobFam_apply, map_pow, constantCoeff_X, zero_pow hp.out.ne_zero] theorem hasSubst_frobFam : HasSubst (frobFam p R) := HasSubst.X_pow hp.out.ne_zero theorem subst_frobFam (f : MvPowerSeries ℕ R) : subst (frobFam p R) f = MvPowerSeries.expand p hp.out.ne_zero f := by rw [MvPowerSeries.expand, substAlgHom_apply] rfl theorem expand_map_wittAdd [CharP R p] (n : ℕ) : MvPolynomial.expand p (MvPolynomial.map (Int.castRingHom R) (WittVector.wittAdd p n)) = MvPolynomial.map (Int.castRingHom R) (WittVector.wittAdd p n) ^ p := by haveI : ExpChar R p := ExpChar.prime hp.out rw [← MvPolynomial.map_frobenius_expand p, MvPolynomial.map_expand, MvPolynomial.map_map, show (frobenius R p).comp (Int.castRingHom R) = Int.castRingHom R from RingHom.ext_int _ _] theorem isEndo_frobFam [CharP R p] : IsEndo p (frobFam p R) := by refine ⟨hasSubst_frobFam, constantCoeff_frobFam, fun n => ?_⟩ have hpair : pairFam (frobFam p R) = fun im : Fin 2 × ℕ => ((MvPolynomial.map (Int.castRingHom R) (MvPolynomial.X im ^ p : MvPolynomial (Fin 2 × ℕ) ℤ) : MvPolynomial (Fin 2 × ℕ) R) : MvPowerSeries (Fin 2 × ℕ) R) := by funext ⟨i, m⟩ show subst (blk i) (X m ^ p : MvPowerSeries ℕ R) = _ rw [subst_pow (hasSubst_blk i), subst_X (hasSubst_blk i), map_pow, MvPolynomial.map_X, MvPolynomial.coe_pow, MvPolynomial.coe_X] rfl rw [hpair, frobFam_apply, subst_pow (hasSubst_addFam p R), subst_X (hasSubst_addFam p R), subst_coe_addFam (fun im : Fin 2 × ℕ => (MvPolynomial.X im ^ p : MvPolynomial (Fin 2 × ℕ) ℤ)) n] have hexp : MvPolynomial.aeval (fun im : Fin 2 × ℕ => (MvPolynomial.X im ^ p : MvPolynomial (Fin 2 × ℕ) ℤ)) (WittVector.wittAdd p n) = MvPolynomial.expand p (WittVector.wittAdd p n) := by rw [MvPolynomial.expand, ← MvPolynomial.aeval_eq_bind₁] rw [hexp, MvPolynomial.map_expand, expand_map_wittAdd, MvPolynomial.coe_pow] rfl end WittLaw namespace CartierModule variable {Φ : MvFormalGroup d R} {Φ' : MvFormalGroup d' R} {Φ'' : MvFormalGroup d'' R} def precompFun {u : ℕ → MvPowerSeries ℕ R} (hu : WittLaw.IsEndo p u) (f : CartierModule p Φ) : CartierModule p Φ where toPowerSeries := fun j => subst u (f.toPowerSeries j) constantCoeff_eq_zero := fun j => constantCoeff_subst_eq_zero hu.hasSubst hu.constantCoeff (f.constantCoeff_eq_zero j) subst_eq := by intro j have hf := f.constantCoeff_eq_zero have hA := hasSubst_addFam p R have hP := hasSubst_pairFam hu.hasSubst hu.constantCoeff show subst (WittLaw.addFam p R) (subst u (f.toPowerSeries j)) = subst (Sum.elim (inBlk 0 fun l => subst u (f.toPowerSeries l)) (inBlk 1 fun l => subst u (f.toPowerSeries l))) (Φ.toPowerSeries j) rw [subst_comp_subst_apply hu.hasSubst hA] have hfam : (fun n => subst (WittLaw.addFam p R) (u n)) = fun n => subst (WittLaw.pairFam u) (WittLaw.addFam p R n) := funext hu.subst_addFam rw [hfam, ← subst_comp_subst_apply hA hP, f.subst_addFam, subst_subst_elim Φ (constantCoeff_inBlk 0 hf) (constantCoeff_inBlk 1 hf) hP] congr 1 funext s rcases s with l | l · exact WittLaw.subst_pairFam_subst_blk hu.hasSubst hu.constantCoeff 0 (f.toPowerSeries l) · exact WittLaw.subst_pairFam_subst_blk hu.hasSubst hu.constantCoeff 1 (f.toPowerSeries l) @[simp] theorem toPowerSeries_precompFun {u : ℕ → MvPowerSeries ℕ R} (hu : WittLaw.IsEndo p u) (f : CartierModule p Φ) : (precompFun hu f).toPowerSeries = fun j => subst u (f.toPowerSeries j) := rfl def precomp [Φ.IsComm] {u : ℕ → MvPowerSeries ℕ R} (hu : WittLaw.IsEndo p u) : CartierModule p Φ →+ CartierModule p Φ where toFun := precompFun hu map_zero' := CartierModule.ext (funext fun j => by show subst u (0 : MvPowerSeries ℕ R) = 0 rw [← coe_substAlgHom hu.hasSubst, map_zero]) map_add' f g := CartierModule.ext (funext fun j => subst_subst_elim Φ f.constantCoeff_eq_zero g.constantCoeff_eq_zero hu.hasSubst j) @[simp] theorem toPowerSeries_precomp [Φ.IsComm] {u : ℕ → MvPowerSeries ℕ R} (hu : WittLaw.IsEndo p u) (f : CartierModule p Φ) : (precomp hu f).toPowerSeries = fun j => subst u (f.toPowerSeries j) := rfl theorem precomp_precomp [Φ.IsComm] {u v : ℕ → MvPowerSeries ℕ R} (hu : WittLaw.IsEndo p u) (hv : WittLaw.IsEndo p v) (f : CartierModule p Φ) (j : Fin d) : (precomp hv (precomp hu f)).toPowerSeries j = subst (fun n => subst v (u n)) (f.toPowerSeries j) := by show subst v (subst u (f.toPowerSeries j)) = _ rw [subst_comp_subst_apply hu.hasSubst hv.hasSubst] def frobenius [Φ.IsComm] : CartierModule p Φ →+ CartierModule p Φ := precomp WittLaw.isEndo_verFam @[simp] theorem toPowerSeries_frobenius [Φ.IsComm] (f : CartierModule p Φ) : (frobenius f).toPowerSeries = fun j => subst (WittLaw.verFam R) (f.toPowerSeries j) := rfl def verschiebung [Φ.IsComm] [CharP R p] : CartierModule p Φ →+ CartierModule p Φ := precomp WittLaw.isEndo_frobFam @[simp] theorem toPowerSeries_verschiebung [Φ.IsComm] [CharP R p] (f : CartierModule p Φ) : (verschiebung f).toPowerSeries = fun j => subst (WittLaw.frobFam p R) (f.toPowerSeries j) := rfl theorem toPowerSeries_verschiebung_eq_expand [Φ.IsComm] [CharP R p] (f : CartierModule p Φ) (j : Fin d) : (verschiebung f).toPowerSeries j = MvPowerSeries.expand p hp.out.ne_zero (f.toPowerSeries j) := WittLaw.subst_frobFam _ theorem frobenius_verschiebung [Φ.IsComm] [CharP R p] (f : CartierModule p Φ) : frobenius (verschiebung f) = verschiebung (frobenius f) := by apply CartierModule.ext funext j rw [frobenius, verschiebung, precomp_precomp, precomp_precomp] congr 1 funext n cases n with | zero => show subst (WittLaw.verFam R) (X 0 ^ p : MvPowerSeries ℕ R) = subst (WittLaw.frobFam p R) (0 : MvPowerSeries ℕ R) rw [subst_pow WittLaw.hasSubst_verFam, subst_X WittLaw.hasSubst_verFam, ← coe_substAlgHom WittLaw.hasSubst_frobFam, map_zero, WittLaw.verFam_zero, zero_pow hp.out.ne_zero] | succ m => show subst (WittLaw.verFam R) (X (m + 1) ^ p : MvPowerSeries ℕ R) = subst (WittLaw.frobFam p R) (X m : MvPowerSeries ℕ R) rw [subst_pow WittLaw.hasSubst_verFam, subst_X WittLaw.hasSubst_verFam, subst_X WittLaw.hasSubst_frobFam, WittLaw.verFam_succ, WittLaw.frobFam_apply] theorem verschiebung_injective [Φ.IsComm] [CharP R p] : Function.Injective (verschiebung : CartierModule p Φ → CartierModule p Φ) := by intro f g h apply CartierModule.ext funext j ext m have hj := congrArg (fun k : CartierModule p Φ => coeff (p • m) (k.toPowerSeries j)) h simpa only [toPowerSeries_verschiebung_eq_expand, MvPowerSeries.coeff_expand_smul] using hj theorem _root_.MvFormalGroup.Hom.subst_subst_elim {τ : Type*} {F : MvFormalGroup d R} {G : MvFormalGroup d' R} (φ : F.Hom G) {a b : Fin d → MvPowerSeries τ R} (ha : ∀ j, (a j).constantCoeff = 0) (hb : ∀ j, (b j).constantCoeff = 0) (i : Fin d') : subst (fun j => subst (Sum.elim a b) (F.toPowerSeries j)) (φ.toPowerSeries i) = subst (Sum.elim (fun j => subst a (φ.toPowerSeries j)) fun j => subst b (φ.toPowerSeries j)) (G.toPowerSeries i) := by have hab : HasSubst (Sum.elim a b) := hasSubst_elim ha hb have hXl : HasSubst (fun l : Fin d => (X (Sum.inl l) : MvPowerSeries (Fin d ⊕ Fin d) R)) := hasSubst_of_constantCoeff_zero fun l => constantCoeff_X _ have hXr : HasSubst (fun l : Fin d => (X (Sum.inr l) : MvPowerSeries (Fin d ⊕ Fin d) R)) := hasSubst_of_constantCoeff_zero fun l => constantCoeff_X _ have hLR : HasSubst (Sum.elim (fun j => subst (fun l => (X (Sum.inl l) : MvPowerSeries (Fin d ⊕ Fin d) R)) (φ.toPowerSeries j)) fun j => subst (fun l => (X (Sum.inr l) : MvPowerSeries (Fin d ⊕ Fin d) R)) (φ.toPowerSeries j)) := hasSubst_elim (fun j => constantCoeff_subst_eq_zero hXl (fun l => constantCoeff_X _) (φ.constantCoeff_eq_zero j)) fun j => constantCoeff_subst_eq_zero hXr (fun l => constantCoeff_X _) (φ.constantCoeff_eq_zero j) have key := congrArg (subst (Sum.elim a b)) (φ.subst_eq i) rw [subst_comp_subst_apply F.hasSubst_toPowerSeries hab, subst_comp_subst_apply hLR hab] at key rw [key] congr 1 funext s rcases s with j | j · show subst (Sum.elim a b) (subst (fun l => (X (Sum.inl l) : MvPowerSeries (Fin d ⊕ Fin d) R)) (φ.toPowerSeries j)) = subst a (φ.toPowerSeries j) rw [subst_comp_subst_apply hXl hab] congr 1 funext l exact subst_X hab (Sum.inl l) · show subst (Sum.elim a b) (subst (fun l => (X (Sum.inr l) : MvPowerSeries (Fin d ⊕ Fin d) R)) (φ.toPowerSeries j)) = subst b (φ.toPowerSeries j) rw [subst_comp_subst_apply hXr hab] congr 1 funext l exact subst_X hab (Sum.inr l) def mapFun (φ : Φ.Hom Φ') (f : CartierModule p Φ) : CartierModule p Φ' where toPowerSeries := fun i => subst f.toPowerSeries (φ.toPowerSeries i) constantCoeff_eq_zero := fun i => constantCoeff_subst_eq_zero f.hasSubst_toPowerSeries f.constantCoeff_eq_zero (φ.constantCoeff_eq_zero i) subst_eq := by intro i have hf := f.constantCoeff_eq_zero show subst (WittLaw.addFam p R) (subst f.toPowerSeries (φ.toPowerSeries i)) = subst (Sum.elim (inBlk 0 fun l => subst f.toPowerSeries (φ.toPowerSeries l)) (inBlk 1 fun l => subst f.toPowerSeries (φ.toPowerSeries l))) (Φ'.toPowerSeries i) rw [subst_comp_subst_apply f.hasSubst_toPowerSeries (hasSubst_addFam p R)] have hfam : (fun l => subst (WittLaw.addFam p R) (f.toPowerSeries l)) = fun l => subst (Sum.elim (inBlk 0 f.toPowerSeries) (inBlk 1 f.toPowerSeries)) (Φ.toPowerSeries l) := funext f.subst_addFam rw [hfam, φ.subst_subst_elim (constantCoeff_inBlk 0 hf) (constantCoeff_inBlk 1 hf) i] congr 1 funext s rcases s with l | l · show subst (inBlk 0 f.toPowerSeries) (φ.toPowerSeries l) = subst (blk 0) (subst f.toPowerSeries (φ.toPowerSeries l)) rw [subst_comp_subst_apply f.hasSubst_toPowerSeries (hasSubst_blk 0)] rfl · show subst (inBlk 1 f.toPowerSeries) (φ.toPowerSeries l) = subst (blk 1) (subst f.toPowerSeries (φ.toPowerSeries l)) rw [subst_comp_subst_apply f.hasSubst_toPowerSeries (hasSubst_blk 1)] rfl @[simp] theorem toPowerSeries_mapFun (φ : Φ.Hom Φ') (f : CartierModule p Φ) : (mapFun φ f).toPowerSeries = fun i => subst f.toPowerSeries (φ.toPowerSeries i) := rfl def map [Φ.IsComm] [Φ'.IsComm] (φ : Φ.Hom Φ') : CartierModule p Φ →+ CartierModule p Φ' where toFun := mapFun φ map_zero' := CartierModule.ext (funext fun i => subst_zero_of_constantCoeff_eq_zero (φ.constantCoeff_eq_zero i)) map_add' f g := CartierModule.ext (funext fun i => φ.subst_subst_elim f.constantCoeff_eq_zero g.constantCoeff_eq_zero i) @[simp] theorem toPowerSeries_map [Φ.IsComm] [Φ'.IsComm] (φ : Φ.Hom Φ') (f : CartierModule p Φ) : (map φ f).toPowerSeries = fun i => subst f.toPowerSeries (φ.toPowerSeries i) := rfl theorem map_id [Φ.IsComm] (f : CartierModule p Φ) : map (MvFormalGroup.Hom.id Φ) f = f := CartierModule.ext (funext fun i => subst_X f.hasSubst_toPowerSeries i) theorem map_comp [Φ.IsComm] [Φ'.IsComm] [Φ''.IsComm] (ψ : Φ'.Hom Φ'') (φ : Φ.Hom Φ') (f : CartierModule p Φ) : map (ψ.comp φ) f = map ψ (map φ f) := CartierModule.ext (funext fun i => subst_comp_subst_apply φ.hasSubst_toPowerSeries f.hasSubst_toPowerSeries (ψ.toPowerSeries i)) theorem map_add_hom [Φ.IsComm] [Φ'.IsComm] (φ ψ : Φ.Hom Φ') (f : CartierModule p Φ) : map (φ + ψ) f = map φ f + map ψ f := CartierModule.ext (funext fun i => subst_subst_elim Φ' φ.constantCoeff_eq_zero ψ.constantCoeff_eq_zero f.hasSubst_toPowerSeries i) theorem map_zero_hom [Φ.IsComm] [Φ'.IsComm] (f : CartierModule p Φ) : map (0 : Φ.Hom Φ') f = 0 := CartierModule.ext (funext fun i => by show subst f.toPowerSeries (0 : MvPowerSeries (Fin d) R) = 0 rw [← coe_substAlgHom f.hasSubst_toPowerSeries, map_zero]) theorem map_precomp [Φ.IsComm] [Φ'.IsComm] (φ : Φ.Hom Φ') {u : ℕ → MvPowerSeries ℕ R} (hu : WittLaw.IsEndo p u) (f : CartierModule p Φ) : map φ (precomp hu f) = precomp hu (map φ f) := CartierModule.ext (funext fun i => (subst_comp_subst_apply f.hasSubst_toPowerSeries hu.hasSubst (φ.toPowerSeries i)).symm) theorem map_frobenius [Φ.IsComm] [Φ'.IsComm] (φ : Φ.Hom Φ') (f : CartierModule p Φ) : map φ (frobenius f) = frobenius (map φ f) := map_precomp φ _ f theorem map_verschiebung [Φ.IsComm] [Φ'.IsComm] [CharP R p] (φ : Φ.Hom Φ') (f : CartierModule p Φ) : map φ (verschiebung f) = verschiebung (map φ f) := map_precomp φ _ f def endAct [Φ.IsComm] : MvFormalGroup.End Φ →+* AddMonoid.End (CartierModule p Φ) where toFun φ := map φ map_one' := AddMonoidHom.ext map_id map_mul' φ ψ := AddMonoidHom.ext (map_comp φ ψ) map_zero' := AddMonoidHom.ext map_zero_hom map_add' φ ψ := AddMonoidHom.ext (map_add_hom φ ψ) @[simp] theorem endAct_apply [Φ.IsComm] (φ : MvFormalGroup.End Φ) (f : CartierModule p Φ) : endAct φ f = map φ f := rfl theorem endAct_frobenius [Φ.IsComm] (φ : MvFormalGroup.End Φ) (f : CartierModule p Φ) : endAct φ (frobenius f) = frobenius (endAct φ f) := map_frobenius φ f theorem endAct_verschiebung [Φ.IsComm] [CharP R p] (φ : MvFormalGroup.End Φ) (f : CartierModule p Φ) : endAct φ (verschiebung f) = verschiebung (endAct φ f) := map_verschiebung φ f theorem endAct_natCast [Φ.IsComm] (n : ℕ) (f : CartierModule p Φ) : endAct (n : MvFormalGroup.End Φ) f = n • f := by rw [map_natCast]; rfl end CartierModule namespace WittLaw def nsmulFam (p : ℕ) [Fact p.Prime] (R : Type u) [CommRing R] (n : ℕ) : ℕ → MvPowerSeries ℕ R := fun k => ((MvPolynomial.map (Int.castRingHom R) (MvPolynomial.rename Prod.snd (WittVector.wittNSMul p n k)) : MvPolynomial ℕ R) : MvPowerSeries ℕ R) theorem isWeightedHomogeneous_wittNSMul (n k : ℕ) : MvPolynomial.IsWeightedHomogeneous (weight p fun _ : Fin 1 => 1) (WittVector.wittNSMul p n k) (p ^ k) := by have h := isWeightedHomogeneous_wittStructureInt p (fun _ : Fin 1 => 1) (n • MvPolynomial.X (0 : Fin 1) : MvPolynomial (Fin 1) ℤ) 1 (fun m => by rw [map_nsmul, MvPolynomial.bind₁_X_right, one_mul, nsmul_eq_mul, ← map_natCast MvPolynomial.C] have h0 := isWeightedHomogeneous_rename_wittPolynomial p (fun _ : Fin 1 => 1) 0 m rw [one_mul] at h0 exact h0.C_mul _) k rwa [one_mul] at h theorem constantCoeff_nsmulFam (n k : ℕ) : (nsmulFam p R n k).constantCoeff = 0 := by rw [nsmulFam, ← MvPowerSeries.coeff_zero_eq_constantCoeff_apply, MvPolynomial.coeff_coe, MvPolynomial.coeff_map, ← MvPolynomial.constantCoeff_eq, MvPolynomial.constantCoeff_rename, WittVector.constantCoeff_wittNSMul, map_zero] theorem weight_eq_of_coeff_nsmulFam_ne_zero {n k : ℕ} {e : ℕ →₀ ℕ} (h : coeff e (nsmulFam p R n k) ≠ 0) : Finsupp.weight (fun m => p ^ m) e = p ^ k := by classical rw [nsmulFam, MvPolynomial.coeff_coe, MvPolynomial.coeff_map] at h have h' : MvPolynomial.coeff e (MvPolynomial.rename Prod.snd (WittVector.wittNSMul p n k)) ≠ 0 := fun h0 => h (by rw [h0, map_zero]) obtain ⟨x, hx, hne⟩ := MvPolynomial.coeff_rename_ne_zero _ _ _ h' have hw := isWeightedHomogeneous_wittNSMul (p := p) n k hne rw [← hx, ← hw, Finsupp.weight_apply, Finsupp.weight_apply, Finsupp.sum_mapDomain_index (h := fun i c => c • p ^ i) (fun _ => zero_smul ℕ _) (fun _ _ _ => add_smul _ _ _)] refine Finsupp.sum_congr fun im _ => ?_ simp [weight] theorem hasSubst_nsmulFam (n : ℕ) : HasSubst (nsmulFam p R n) := by refine ⟨fun k => by rw [constantCoeff_nsmulFam]; exact IsNilpotent.zero, fun e => ?_⟩ refine (Set.finite_lt_nat (Finsupp.weight (fun m => p ^ m) e)).subset fun k hk => ?_ have hw := weight_eq_of_coeff_nsmulFam_ne_zero (p := p) (R := R) hk show k < Finsupp.weight (fun m => p ^ m) e rw [hw] exact Nat.lt_pow_self hp.out.one_lt omit hp in private theorem peval_tautological (φ : MvPolynomial (Fin 1 × ℕ) ℤ) : WittVector.peval φ ![(WittVector.mk p fun m => (MvPolynomial.X (0, m) : MvPolynomial (Fin 1 × ℕ) ℤ)).coeff] = φ := by have hid : Function.uncurry ![(WittVector.mk p fun m => (MvPolynomial.X (0, m) : MvPolynomial (Fin 1 × ℕ) ℤ)).coeff] = (MvPolynomial.X : Fin 1 × ℕ → _) := by funext ⟨i, m⟩ fin_cases i; rfl show MvPolynomial.aeval _ φ = φ rw [hid, MvPolynomial.aeval_X_left_apply] theorem wittNSMul_zero (k : ℕ) : WittVector.wittNSMul p 0 k = 0 := by let x : WittVector p (MvPolynomial (Fin 1 × ℕ) ℤ) := WittVector.mk p fun m => MvPolynomial.X (0, m) have h := WittVector.nsmul_coeff 0 x k rw [zero_nsmul, WittVector.zero_coeff, peval_tautological] at h exact h.symm theorem aeval_wittNSMul_wittAdd (n k : ℕ) : MvPolynomial.aeval (fun im : Fin 2 × ℕ => (Fin.cases (WittVector.wittNSMul p n im.2) (fun _ => MvPolynomial.X (0, im.2)) im.1 : MvPolynomial (Fin 1 × ℕ) ℤ)) (WittVector.wittAdd p k) = WittVector.wittNSMul p (n + 1) k := by let x : WittVector p (MvPolynomial (Fin 1 × ℕ) ℤ) := WittVector.mk p fun m => MvPolynomial.X (0, m) have h := WittVector.nsmul_coeff (n + 1) x k rw [peval_tautological, succ_nsmul, WittVector.add_coeff] at h have hval : (fun im : Fin 2 × ℕ => (Fin.cases (WittVector.wittNSMul p n im.2) (fun _ => MvPolynomial.X (0, im.2)) im.1 : MvPolynomial (Fin 1 × ℕ) ℤ)) = Function.uncurry ![(n • x).coeff, x.coeff] := by funext ⟨i, m⟩ refine Fin.cases ?_ (fun l => ?_) i · show WittVector.wittNSMul p n m = (n • x).coeff m rw [WittVector.nsmul_coeff, peval_tautological] · fin_cases l; rfl rw [hval] exact h private theorem aeval_X_eq_map {σ : Type*} (S : Type*) [CommRing S] (φ : MvPolynomial σ ℤ) : MvPolynomial.aeval (MvPolynomial.X : σ → MvPolynomial σ S) φ = MvPolynomial.map (Int.castRingHom S) φ := by refine RingHom.congr_fun (?_ : (MvPolynomial.aeval (MvPolynomial.X : σ → MvPolynomial σ S)).toRingHom = MvPolynomial.map (Int.castRingHom S)) φ refine MvPolynomial.ringHom_ext (fun r => ?_) (fun i => ?_) · exact RingHom.congr_fun (RingHom.ext_int ((MvPolynomial.aeval (MvPolynomial.X : σ → MvPolynomial σ S)).toRingHom.comp (MvPolynomial.C : ℤ →+* MvPolynomial σ ℤ)) ((MvPolynomial.map (Int.castRingHom S)).comp (MvPolynomial.C : ℤ →+* MvPolynomial σ ℤ))) r · simp theorem map_wittNSMul_self (k : ℕ) : MvPolynomial.map (Int.castRingHom (ZMod p)) (WittVector.wittNSMul p p k) = Nat.casesOn k 0 fun m => MvPolynomial.X (0, m) ^ p := by let A := MvPolynomial (Fin 1 × ℕ) (ZMod p) let x : WittVector p A := WittVector.mk p fun m => MvPolynomial.X (0, m) have h := WittVector.nsmul_coeff p x k have hid : Function.uncurry ![x.coeff] = (MvPolynomial.X : Fin 1 × ℕ → A) := by funext ⟨i, m⟩ fin_cases i; rfl have hev : WittVector.peval (WittVector.wittNSMul p p k) ![x.coeff] = MvPolynomial.map (Int.castRingHom (ZMod p)) (WittVector.wittNSMul p p k) := by show MvPolynomial.aeval _ _ = _ rw [hid] exact aeval_X_eq_map (ZMod p) _ rw [← hev, ← h, nsmul_eq_mul, mul_comm] cases k with | zero => exact WittVector.mul_charP_coeff_zero x | succ m => exact WittVector.mul_charP_coeff_succ x m omit hp in theorem hasSubst_finCases {τ : Type*} {u₀ u₁ : ℕ → MvPowerSeries τ R} (h₀ : HasSubst u₀) (h₁ : HasSubst u₁) : HasSubst (fun im : Fin 2 × ℕ => (Fin.cases (u₀ im.2) (fun _ => u₁ im.2) im.1 : MvPowerSeries τ R)) := by refine ⟨fun ⟨i, m⟩ => Fin.cases (h₀.const_coeff m) (fun _ => h₁.const_coeff m) i, fun e => ?_⟩ refine (((h₀.coeff_zero e).image (Prod.mk 0)).union ((h₁.coeff_zero e).image (Prod.mk 1))).subset ?_ rintro ⟨i, m⟩ him revert him refine Fin.cases (fun him => Or.inl ⟨m, him, rfl⟩) (fun l him => Or.inr ⟨m, him, ?_⟩) i fin_cases l; rfl variable (p R) in def stepFam (n : ℕ) : Fin 2 × ℕ → MvPowerSeries ℕ R := fun im => Fin.cases (nsmulFam p R n im.2) (fun _ => X im.2) im.1 theorem hasSubst_stepFam (n : ℕ) : HasSubst (stepFam p R n) := hasSubst_finCases (hasSubst_nsmulFam n) HasSubst.X theorem stepFam_eq (n : ℕ) : stepFam p R n = fun im : Fin 2 × ℕ => ((MvPolynomial.map (Int.castRingHom R) (Fin.cases (MvPolynomial.rename Prod.snd (WittVector.wittNSMul p n im.2)) (fun _ => MvPolynomial.X im.2) im.1 : MvPolynomial ℕ ℤ) : MvPolynomial ℕ R) : MvPowerSeries ℕ R) := by funext ⟨i, m⟩ refine Fin.cases rfl (fun l => ?_) i simp [stepFam] theorem nsmulFam_succ (n k : ℕ) : nsmulFam p R (n + 1) k = subst (stepFam p R n) (addFam p R k) := by have hfun : (fun im : Fin 2 × ℕ => MvPolynomial.rename Prod.snd (Fin.cases (WittVector.wittNSMul p n im.2) (fun _ => MvPolynomial.X (0, im.2)) im.1 : MvPolynomial (Fin 1 × ℕ) ℤ)) = fun im => (Fin.cases (MvPolynomial.rename Prod.snd (WittVector.wittNSMul p n im.2)) (fun _ => MvPolynomial.X im.2) im.1 : MvPolynomial ℕ ℤ) := by funext ⟨i, m⟩ refine Fin.cases rfl (fun l => ?_) i simp rw [stepFam_eq, subst_coe_addFam, nsmulFam, ← aeval_wittNSMul_wittAdd, MvPolynomial.comp_aeval_apply, hfun] theorem nsmulFam_zero (k : ℕ) : nsmulFam p R 0 k = 0 := by rw [nsmulFam, wittNSMul_zero, map_zero, map_zero, MvPolynomial.coe_zero] theorem nsmulFam_self [CharP R p] (k : ℕ) : nsmulFam p R p k = subst (frobFam p R) (verFam R k) := by have hcast : Int.castRingHom R = (ZMod.castHom (dvd_refl p) R).comp (Int.castRingHom (ZMod p)) := RingHom.ext_int _ _ rw [nsmulFam, hcast, ← MvPolynomial.map_map, MvPolynomial.map_rename, map_wittNSMul_self] cases k with | zero => show ((MvPolynomial.map _ (MvPolynomial.rename Prod.snd (0 : MvPolynomial (Fin 1 × ℕ) (ZMod p))) : MvPolynomial ℕ R) : MvPowerSeries ℕ R) = subst (frobFam p R) 0 rw [map_zero, map_zero, MvPolynomial.coe_zero, ← coe_substAlgHom hasSubst_frobFam, map_zero] | succ m => show ((MvPolynomial.map _ (MvPolynomial.rename Prod.snd (MvPolynomial.X ((0 : Fin 1), m) ^ p : MvPolynomial (Fin 1 × ℕ) (ZMod p))) : MvPolynomial ℕ R) : MvPowerSeries ℕ R) = subst (frobFam p R) (X m) rw [map_pow, MvPolynomial.rename_X, map_pow, MvPolynomial.map_X, MvPolynomial.coe_pow, MvPolynomial.coe_X, subst_X hasSubst_frobFam] rfl end WittLaw namespace CartierModule variable {Φ : MvFormalGroup d R} {Φ' : MvFormalGroup d' R} {Φ'' : MvFormalGroup d'' R} theorem subst_nsmulFam [Φ.IsComm] (f : CartierModule p Φ) (n : ℕ) (j : Fin d) : subst (WittLaw.nsmulFam p R n) (f.toPowerSeries j) = (n • f).toPowerSeries j := by induction n generalizing j with | zero => rw [zero_nsmul] have h0 : WittLaw.nsmulFam p R 0 = fun _ => 0 := funext WittLaw.nsmulFam_zero rw [h0] exact subst_zero_of_constantCoeff_eq_zero (f.constantCoeff_eq_zero j) | succ n ih => have hf := f.constantCoeff_eq_zero have hS := WittLaw.hasSubst_stepFam (p := p) (R := R) n have hfam : WittLaw.nsmulFam p R (n + 1) = fun k => subst (WittLaw.stepFam p R n) (WittLaw.addFam p R k) := funext (WittLaw.nsmulFam_succ n) 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, succ_nsmul, toPowerSeries_add] congr 1 funext s rcases s with l | l · show subst (WittLaw.stepFam p R n) (subst (blk 0) (f.toPowerSeries l)) = (n • f).toPowerSeries l rw [subst_comp_subst_apply (hasSubst_blk 0) hS, ← ih l] congr 1 funext m exact subst_X hS ((0 : Fin 2), m) · show subst (WittLaw.stepFam p R n) (subst (blk 1) (f.toPowerSeries l)) = f.toPowerSeries l rw [subst_comp_subst_apply (hasSubst_blk 1) hS] have hX : (fun m => subst (WittLaw.stepFam p R n) (blk (R := R) 1 m)) = fun m => (X m : MvPowerSeries ℕ R) := by funext m exact subst_X hS ((1 : Fin 2), m) rw [hX] exact congrFun subst_self _ theorem verschiebung_frobenius [Φ.IsComm] [CharP R p] (f : CartierModule p Φ) : verschiebung (frobenius f) = (p : ℕ) • f := by apply CartierModule.ext funext j rw [verschiebung, frobenius, precomp_precomp, ← subst_nsmulFam] congr 1 funext k exact (WittLaw.nsmulFam_self k).symm theorem frobenius_verschiebung_eq_nsmul [Φ.IsComm] [CharP R p] (f : CartierModule p Φ) : frobenius (verschiebung f) = (p : ℕ) • f := by rw [frobenius_verschiebung, verschiebung_frobenius] def tangent [Φ.IsComm] : CartierModule p Φ →+ (Fin d → R) where toFun f := fun j => coeff (Finsupp.single 0 1) (f.toPowerSeries j) map_zero' := by funext j simp map_add' f g := by funext j show coeff (Finsupp.single 0 1) (subst (Sum.elim f.toPowerSeries g.toPowerSeries) (Φ.toPowerSeries j)) = _ have h0 : ∀ s, ((Sum.elim f.toPowerSeries g.toPowerSeries) s).constantCoeff = 0 := by rintro (l | l) exacts [f.constantCoeff_eq_zero l, g.constantCoeff_eq_zero l] rw [coeff_single_subst h0, Fintype.sum_sum_type] simp only [Sum.elim_inl, Sum.elim_inr, Φ.coeff_single_inl, Φ.coeff_single_inr, ite_mul, one_mul, zero_mul, Finset.sum_ite_eq, Finset.mem_univ, if_true] rfl @[simp] theorem tangent_apply [Φ.IsComm] (f : CartierModule p Φ) (j : Fin d) : tangent f j = coeff (Finsupp.single 0 1) (f.toPowerSeries j) := rfl theorem tangent_verschiebung [Φ.IsComm] [CharP R p] (f : CartierModule p Φ) : tangent (verschiebung f) = 0 := by funext j rw [tangent_apply, toPowerSeries_verschiebung_eq_expand] exact MvPowerSeries.coeff_expand_of_not_dvd p hp.out.ne_zero _ (i := 0) (by simpa using hp.out.one_lt.ne') theorem tangent_map [Φ.IsComm] [Φ'.IsComm] (φ : Φ.Hom Φ') (f : CartierModule p Φ) : tangent (map φ f) = (MvFormalGroup.linearPart φ.toPowerSeries).mulVec (tangent f) := by funext i show coeff (Finsupp.single 0 1) (subst f.toPowerSeries (φ.toPowerSeries i)) = _ rw [coeff_single_subst f.constantCoeff_eq_zero, Matrix.mulVec] rfl def curveFam (R : Type u) [CommRing R] : ℕ → PowerSeries R | 0 => PowerSeries.X | _ + 1 => 0 omit hp in theorem constantCoeff_curveFam (n : ℕ) : MvPowerSeries.constantCoeff (curveFam R n) = 0 := by cases n with | zero => exact MvPowerSeries.constantCoeff_X _ | succ n => exact map_zero _ omit hp in theorem hasSubst_curveFam : HasSubst (curveFam R) := by refine ⟨fun n => by rw [constantCoeff_curveFam]; exact IsNilpotent.zero, fun e => ?_⟩ refine (Set.finite_singleton 0).subset fun n hn => ?_ cases n with | zero => rfl | succ n => exact absurd (by simp [curveFam]) hn def curve (f : CartierModule p Φ) : Fin d → PowerSeries R := fun j => subst (curveFam R) (f.toPowerSeries j) theorem curve_apply (f : CartierModule p Φ) (j : Fin d) : curve f j = subst (curveFam R) (f.toPowerSeries j) := rfl theorem constantCoeff_curve (f : CartierModule p Φ) (j : Fin d) : PowerSeries.constantCoeff (curve f j) = 0 := constantCoeff_subst_eq_zero hasSubst_curveFam constantCoeff_curveFam (f.constantCoeff_eq_zero j) theorem curve_add [Φ.IsComm] (f g : CartierModule p Φ) (j : Fin d) : curve (f + g) j = subst (Sum.elim (curve f) (curve g)) (Φ.toPowerSeries j) := subst_subst_elim Φ f.constantCoeff_eq_zero g.constantCoeff_eq_zero hasSubst_curveFam j theorem curve_verschiebung [Φ.IsComm] [CharP R p] (f : CartierModule p Φ) (j : Fin d) : curve (verschiebung f) j = PowerSeries.expand p hp.out.ne_zero (curve f j) := by show subst (curveFam R) (subst (WittLaw.frobFam p R) (f.toPowerSeries j)) = MvPowerSeries.expand p hp.out.ne_zero (subst (curveFam R) (f.toPowerSeries j)) rw [MvPowerSeries.expand, substAlgHom_apply, subst_comp_subst_apply WittLaw.hasSubst_frobFam hasSubst_curveFam, subst_comp_subst_apply hasSubst_curveFam (HasSubst.X_pow hp.out.ne_zero)] congr 1 funext n cases n with | zero => show subst (curveFam R) (X 0 ^ p : MvPowerSeries ℕ R) = subst (fun s : Unit => (X s : MvPowerSeries Unit R) ^ p) PowerSeries.X rw [subst_pow hasSubst_curveFam, subst_X hasSubst_curveFam, PowerSeries.X, subst_X (HasSubst.X_pow hp.out.ne_zero)] rfl | succ m => show subst (curveFam R) (X (m + 1) ^ p : MvPowerSeries ℕ R) = subst (fun s : Unit => (X s : MvPowerSeries Unit R) ^ p) (0 : PowerSeries R) rw [subst_pow hasSubst_curveFam, subst_X hasSubst_curveFam, ← coe_substAlgHom (HasSubst.X_pow hp.out.ne_zero), map_zero] exact zero_pow hp.out.ne_zero theorem coeff_one_curve [Φ.IsComm] (f : CartierModule p Φ) (j : Fin d) : PowerSeries.coeff 1 (curve f j) = tangent f j := by classical rw [tangent_apply, curve_apply] show MvPowerSeries.coeff (Finsupp.single () 1) (subst (curveFam R) (f.toPowerSeries j)) = _ rw [coeff_subst hasSubst_curveFam] have hterm : ∀ e : ℕ →₀ ℕ, e ≠ Finsupp.single 0 1 → coeff e (f.toPowerSeries j) • coeff (Finsupp.single () 1) (e.prod fun n k => curveFam R n ^ k) = 0 := by intro e he by_cases hsupp : ∃ n ∈ e.support, n ≠ 0 · obtain ⟨n, hn, hn0⟩ := hsupp have hzero : (e.prod fun n k => curveFam R n ^ k) = 0 := by rw [Finsupp.prod] refine Finset.prod_eq_zero hn ?_ obtain ⟨m, rfl⟩ := Nat.exists_eq_succ_of_ne_zero hn0 show (0 : PowerSeries R) ^ e (m + 1) = 0 exact zero_pow (Finsupp.mem_support_iff.mp hn) rw [hzero, map_zero, smul_zero] · push Not at hsupp have he0 : 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 hk : e 0 ≠ 1 := fun h1 => he (by rw [he0, h1]) rw [he0, Finsupp.prod_single_index (by simp)] show coeff _ (f.toPowerSeries j) • coeff (Finsupp.single () 1) ((PowerSeries.X : PowerSeries R) ^ e 0) = 0 rw [PowerSeries.X, coeff_X_pow, if_neg, smul_zero] intro h exact hk ((Finsupp.single_injective ()) h).symm rw [finsum_eq_single _ (Finsupp.single 0 1) hterm, Finsupp.prod_single_index (by simp)] show coeff _ (f.toPowerSeries j) • coeff (Finsupp.single () 1) ((PowerSeries.X : PowerSeries R) ^ 1) = _ rw [pow_one, PowerSeries.X, coeff_X, if_pos rfl, smul_eq_mul, mul_one] namespace Examples def addLinear (p : ℕ) [Fact p.Prime] {d : ℕ} {R : Type u} [CommRing R] (v : Fin d → R) : CartierModule p (addMv d R) where toPowerSeries := fun i => v i • (X 0 : MvPowerSeries ℕ R) constantCoeff_eq_zero := fun i => by simp subst_eq := by intro i have hc : ∀ l, ((fun l => v l • (X 0 : MvPowerSeries ℕ R)) l).constantCoeff = 0 := fun l => by simp have h0 : ∀ s, ((Sum.elim (inBlk 0 fun l => v l • (X 0 : MvPowerSeries ℕ R)) (inBlk 1 fun l => v l • (X 0 : MvPowerSeries ℕ R))) s).constantCoeff = 0 := by rintro (l | l) exacts [constantCoeff_inBlk 0 hc l, constantCoeff_inBlk 1 hc l] show subst (WittLaw.addFam p R) (v i • (X 0 : MvPowerSeries ℕ R)) = subst (Sum.elim (inBlk 0 fun l => v l • (X 0 : MvPowerSeries ℕ R)) (inBlk 1 fun l => v l • (X 0 : MvPowerSeries ℕ R))) ((X (Sum.inl i) : MvPowerSeries (Fin d ⊕ Fin d) R) + X (Sum.inr i)) rw [subst_X_add_X h0] simp only [Sum.elim_inl, Sum.elim_inr, inBlk_apply] rw [← coe_substAlgHom (hasSubst_addFam p R), ← coe_substAlgHom (hasSubst_blk 0), ← coe_substAlgHom (hasSubst_blk 1), AlgHom.map_smul_of_tower, AlgHom.map_smul_of_tower, AlgHom.map_smul_of_tower, coe_substAlgHom, coe_substAlgHom, coe_substAlgHom, subst_X (hasSubst_addFam p R), subst_X (hasSubst_blk 0), subst_X (hasSubst_blk 1), WittLaw.addFam, WittVector.wittAdd_zero, ← smul_add] congr 1 simp [WittLaw.blk] @[simp] theorem toPowerSeries_addLinear (v : Fin d → R) (i : Fin d) : (addLinear p v).toPowerSeries i = v i • (X 0 : MvPowerSeries ℕ R) := rfl theorem tangent_addLinear (v : Fin d → R) : tangent (addLinear p v) = v := by classical funext i rw [tangent_apply, toPowerSeries_addLinear, map_smul, coeff_X, if_pos rfl, smul_eq_mul, mul_one] theorem tangent_surjective_addMv : Function.Surjective (tangent : CartierModule p (addMv d R) → Fin d → R) := fun v => ⟨addLinear p v, tangent_addLinear v⟩ theorem addLinear_ne_zero [Nontrivial R] {v : Fin d → R} (hv : v ≠ 0) : addLinear p v ≠ 0 := by intro h apply hv have := tangent_addLinear (p := p) v rw [h, map_zero] at this exact this.symm end Examples end CartierModule end MvFormalGroup end
Statements phrased using this module (173)
- ℤ/2-grading of the Cartier module of a formal mathcal O_D-module
CerednikDrinfeld.FormalODModule.isCompl_gradedPiece_zero_one_of_isCompl_lieZero_lieOne7 below · depth 30 - Cartier modules of special formal mathcal O_D-modules are isogenous
CerednikDrinfeld.SpecialFormalODModule.exists_addMonoidHom_cartierModule_injective_of_isAlgClosed35 below · depth 30 - A special formal mathcal O_D-module whose endomorphism ring is an order
CerednikDrinfeld.SpecialFormalODModule.exists_forall_nsmul_eq_zero_imp_and_exists_ringHom_centralizer_injective6 below · depth 30 - Faithfulness of the Cartier module functor in characteristic p
MvFormalGroup.CartierModule.eq_of_map_eq5 below · depth 30 - Fullness of the Cartier module functor over a perfect field
MvFormalGroup.CartierModule.exists_hom_map_eq_of_perfectRing10 below · depth 30 - Degree formula: colength of the Cartier module of an isogeny
MvFormalGroup.CartierModule.length_quotient_range_mapLinear_eq_of_finrank_eq_pow22 below · depth 30 - Injectivity on Cartier modules for finite-kernel homomorphisms
MvFormalGroup.CartierModule.map_injective_of_finite_quotient0 below · depth 30 - Kernel of the tangent map is V M in characteristic p
MvFormalGroup.CartierModule.tangent_eq_zero_iff_exists_verschiebung_eq1 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 - Unique finite V-expansion along a tangent basis
MvFormalGroup.CartierModule.existsUnique_eq_sum_verschiebung_homothety_add2 below · depth 31 - V-adic completeness of the Cartier module of a formal group
MvFormalGroup.CartierModule.existsUnique_forall_eq_sum_range_verschiebung_iterate_add0 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 - Surjectivity of the tangent map of a Cartier module
MvFormalGroup.CartierModule.tangent_surjective3 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 - Artin–Hasse family carries Witt addition to big Witt addition
MvFormalGroup.ArtinHasse.subst_addFam_fam1 below · depth 32 - Every curve arises from a big Witt homomorphism
MvFormalGroup.BigWittLaw.exists_hom_subst_curveFam_eq0 below · depth 32 - V-adic completeness and separatedness of the Cartier module
MvFormalGroup.CartierModule.existsUnique_forall_eq_sum_range_verschiebungInt_iterate_add0 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 - Homogeneous V-bases have unit tangent determinant
CerednikDrinfeld.FormalODModule.isHomogeneousVBasis_of_isHomogeneousVBasis_toGradedCartierModuleData3 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 - Tangent map sends Cartier graded pieces into Lie pieces
CerednikDrinfeld.FormalODModule.tangent_mem_lieZero_and_lieOne_of_mem_gradedPiece_of_isNilpotent0 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 - V-reducedness of the Cartier module over a ℤₚ-algebra
MvFormalGroup.CartierModule.tangent_eq_zero_iff_exists_verschiebungInt_eq15 below · depth 34 - Cartier's tangent map: surjectivity and kernel VM
MvFormalGroup.CartierModule.tangent_surjective_and_tangent_eq_zero_iff_exists_verschiebung_eq6 below · depth 34 - Surjectivity of the tangent map of a Cartier module
MvFormalGroup.CartierModule.tangent_surjective_of_algebra_padicInt2 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 - Graded pieces are preserved by 𝒪_D-linear homomorphisms
CerednikDrinfeld.FormalODModule.IsODHom.map_mem_gradedPiece0 below · depth 35 - Injectivity of varpi on Cartier modules over reduced bases
CerednikDrinfeld.FormalODModule.eq_zero_of_endAct_varpiEnd_eq_zero_of_isReduced33 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 - Zero tangent vector implies being a Verschiebung value
MvFormalGroup.CartierModule.exists_verschiebungInt_eq_of_tangent_eq_zero_of_algebra_padicInt14 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 - Homomorphisms agreeing on p-typical curves agree on all curves
MvFormalGroup.CartierModule.subst_curve_eq_of_forall_map_eq_of_algebra_padicInt5 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 - Injectivity of Verschiebung over a ℤₚ-algebra
MvFormalGroup.CartierModule.verschiebungInt_injective_of_algebra_padicInt1 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 - Artin–Hasse coordinates are additive over a ℤₚ-algebra
MvFormalGroup.ArtinHasse.subst_addFam_map_coord1 below · depth 36 - Low-weight coefficients vanish for big-Witt homomorphisms
MvFormalGroup.BigWittLaw.coeff_eq_zero_of_coeff_subst_pow_eq_zero0 below · depth 36 - Cartier's first theorem, ω-curve form
MvFormalGroup.BigWittLaw.exists_hom_subst_pow_eq1 below · depth 36 - Cartier splitting of the big Witt law over a ℤₚ-algebra
MvFormalGroup.BigWittLaw.exists_proj_trunc_genSeries_eq_trunc_prod_of_algebra_padicInt2 below · depth 36 - Frobenius family mathbf Fₙ is additive for the big Witt law
MvFormalGroup.BigWittLaw.subst_addFam_frobFam0 below · depth 36 - Additivity of `projFam` and splitting of Artin–Hasse
MvFormalGroup.BigWittLaw.subst_addFam_projFam_and_subst_artinHasse_projFam2 below · depth 36 - Verschiebung commutes with the big Witt addition law
MvFormalGroup.BigWittLaw.subst_addFam_verschiebungFam0 below · depth 36 - Artin–Hasse coordinates intertwine the big Witt and Witt Frobenii
MvFormalGroup.BigWittLaw.subst_artinHasse_frobFam1 below · depth 36 - Artin–Hasse projector kills non-p-power Frobenii, commutes with mathbf Fₚ
MvFormalGroup.BigWittLaw.subst_artinHasse_projFam_frobFam1 below · depth 36 - Difference of two big Witt homomorphisms agreeing to order n
MvFormalGroup.BigWittLaw.subst_elim_negSeries_hom_and_coeff_eq_zero0 below · depth 36 - Frobenius mathbf Fₙ of the big Witt law on ω-curves
MvFormalGroup.BigWittLaw.subst_pow_subst_frobFam0 below · depth 36 - The ω-curve of f∘π is the standard curve of f
MvFormalGroup.BigWittLaw.subst_pow_subst_projFam0 below · depth 36 - Cartier module elements are determined by their curves
MvFormalGroup.CartierModule.curve_injective_of_algebra_padicInt0 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 - Weight-adic convergence of sums in the Cartier module
MvFormalGroup.CartierModule.exists_forall_coeff_sub_sum_eq_zero0 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-module criterion for isomorphism of rigidified formal mathcal O_D-modules
CerednikDrinfeld.SpecialFormal.Rigidified.isIsomorphic_of_bijective_cartierModule_of_map_nsmul_eq12 below · depth 37 - 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 - Cartier module elements with prescribed ghost logarithm
MvFormalGroup.CartierModule.exists_tangent_eq_and_coeff_subst_eq_ghost_of_log1 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 - Special formal mathcal O_D-module of height 4 over the edge chart
CerednikDrinfeld.FormalODModule.exists_isHomogeneousVBasis_hasStructureConstants_edgeRingConstants_isSpecial_hasHeight_of_isAlgClosed101 below · depth 40 - 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 - Ghost series are additive for the Witt addition law
MvFormalGroup.WittLaw.subst_addFam_eq_add_of_coeff_eq_ghost0 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 - Height four from the edge structure constants
CerednikDrinfeld.FormalODModule.hasHeight_four_of_hasStructureConstants_edgeRingConstants_of_isAlgClosed92 below · depth 41 - Base change of Cartier modules along a surjection is surjective
MvFormalGroup.CartierModule.baseChange_surjective_of_surjective18 below · depth 41 - Cartier modules are exact along a Milnor square of base rings
MvFormalGroup.CartierModule.exists_baseChangeEq_eq_and_of_baseChangeEq_eq_of_milnor0 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 - Edge structure constants force nilpotent coordinates modulo [p]
CerednikDrinfeld.FormalODModule.exists_X_pow_mem_span_act_of_hasStructureConstants_edgeConstants48 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 - Degree p⁴ for [p] on the edge-family formal 𝒪_D-module
CerednikDrinfeld.FormalODModule.finrank_kerAlgebra_map_act_eq_pow_four_of_hasStructureConstants_edgeRingConstants_of_isAlgClosed90 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 - Nilpotent coordinates on X[p] for a pure edge branch
CerednikDrinfeld.FormalODModule.exists_X_pow_mem_span_act_of_hasStructureConstants_edgeConstants_zero47 below · depth 43 - Edge-family Cartier module is free of rank 4 on γ, Vγ
CerednikDrinfeld.FormalODModule.exists_basis_cartierModule_eq_of_hasStructureConstants_edgeConstants25 below · depth 43
… and 23 more statements (search for the module name to find them).