@@ -5,6 +5,7 @@ Authors: Antoine Chambert-Loir, María Inés de Frutos—Fernández
55-/
66module
77
8+ public import Mathlib.Algebra.MvPolynomial.Eval
89public import Mathlib.Algebra.RingQuot
910public import Mathlib.RingTheory.DividedPowers.Basic
1011
@@ -16,7 +17,7 @@ the universal divided power algebra of `M`, as the ring quotient of the polynomi
1617in the variables `ℕ × M` by the relation `DividedPowerAlgebra.Rel`.
1718
1819`DividedPowerAlgebra R M` satisfies a weak universal property for morphisms to rings with
19- divided powers.
20+ divided powers (`DividedPowerAlgebra.lift`) .
2021
2122## Main definitions
2223
@@ -35,6 +36,14 @@ divided powers.
3536
3637 The API will be setup so that it is never (never say never…) necessary to lift to `MvPolynomial`.
3738
39+ * `DividedPowerAlgebra.lift`: the weak universal property of `DividedPowerAlgebra R M`.
40+
41+ * `DividedPowerAlgebra.map`: the functoriality map between divided power algebras
42+ associated with a linear map of the underlying modules.
43+ Given an `R`-algebra `S`, an `S`-module `N` and an `R`-linear map `f : M →ₗ[R] N`,
44+ this is the map `DividedPowerAlgebra R M →ₐ[R] DividedPowerAlgebra S N`
45+ sending `dp R n m` to `dp S n (f m)`.
46+
3847 ## References
3948
4049* [P. Berthelot (1974), *Cohomologie cristalline des schémas de
@@ -50,7 +59,6 @@ divided powers.
5059
5160 ## TODO
5261
53- * Add the weak universal property of `DividedPowerAlgebra R M`.
5462* Show in upcoming files that `DividedPowerAlgebra R M` has divided powers.
5563
5664
@@ -73,7 +81,7 @@ inductive Rel : MvPolynomial (ℕ × M) R → MvPolynomial (ℕ × M) R → Prop
7381 | smul {r : R} {n : ℕ} {a : M} : Rel (X (n, r • a)) (r ^ n • X (n, a))
7482 | mul {m n : ℕ} {a : M} : Rel (X (m, a) * X (n, a)) (Nat.choose (m + n) m • X (m + n, a))
7583 | add {n : ℕ} {a b : M} :
76- Rel (X (n, a + b)) ((Finset.antidiagonal n).sum fun k => X (k.1 , a) * X (k.2 , b))
84+ Rel (X (n, a + b)) ((Finset.antidiagonal n).sum fun k ↦ X (k.1 , a) * X (k.2 , b))
7785
7886/-- The ideal of `MvPolynomial (ℕ × M) R` generated by `Rel`. -/
7987def RelI : Ideal (MvPolynomial (ℕ × M) R) := ofRel (DividedPowerAlgebra.Rel R M)
@@ -132,13 +140,12 @@ protected theorem induction_on' {P : DividedPowerAlgebra R M → Prop} (f : Divi
132140protected theorem induction_on {P : DividedPowerAlgebra R M → Prop } (f : DividedPowerAlgebra R M)
133141 (C : ∀ a, P (algebraMap R _ a)) (add : ∀ f g, P f → P g → P (f + g))
134142 (dp : ∀ (f : DividedPowerAlgebra R M) (n : ℕ) (m : M), P f → P (f * dp R n m)) : P f :=
135- DividedPowerAlgebra.induction_on' f (fun a => by rw [mkAlgHom_C]; exact C a) add dp
143+ DividedPowerAlgebra.induction_on' f (fun a ↦ by rw [mkAlgHom_C]; exact C a) add dp
136144
137145theorem dp_eq_mkRingHom (n : ℕ) (m : M) :
138146 dp R n m = mkRingHom (Rel R M) (X (⟨n, m⟩)) := by
139147 simp [dp, mkRingHom, mkAlgHom]
140148
141- @[simp]
142149theorem dp_zero {m : M} : dp R 0 m = 1 := by
143150 rw [dp_def, ← map_one (mkAlgHom R (Rel R M))]
144151 exact RingQuot.mkAlgHom_rel R Rel.zero
@@ -164,22 +171,22 @@ theorem dp_mul {n p : ℕ} {m : M} :
164171 exact mkAlgHom_rel R Rel.mul
165172
166173theorem dp_add {n : ℕ} {x y : M} :
167- dp R n (x + y) = (antidiagonal n).sum fun k => dp R k.1 x * dp R k.2 y := by
174+ dp R n (x + y) = (antidiagonal n).sum fun k ↦ dp R k.1 x * dp R k.2 y := by
168175 simp only [dp_def]
169176 rw [mkAlgHom_rel (A := MvPolynomial (ℕ × M) R) R Rel.add, map_sum,
170177 Finset.sum_congr rfl (fun k _ ↦ by rw [_root_.map_mul])]
171178
172179theorem dp_sum {ι : Type *} [DecidableEq ι] (s : Finset ι) (q : ℕ) (x : ι → M) :
173180 dp R q (s.sum x) =
174- (Finset.sym s q).sum fun k => s.prod fun i => dp R (Multiset.count i k) (x i) :=
181+ (Finset.sym s q).sum fun k ↦ s.prod fun i ↦ dp R (Multiset.count i k) (x i) :=
175182 DividedPowers.dpow_sum' (I := ⊤) _ (fun _ ↦ dp_zero)
176183 (fun _ _ ↦ dp_add) dp_null_of_ne_zero (fun _ _ ↦ trivial)
177184
178185theorem dp_sum_smul {ι : Type *} [DecidableEq ι] (s : Finset ι) (q : ℕ) (a : ι → R) (x : ι → M) :
179- dp R q (s.sum fun i => a i • x i) =
180- (Finset.sym s q).sum fun k =>
181- (s.prod fun i => a i ^ Multiset.count i k) •
182- s.prod fun i => dp R (Multiset.count i k) (x i) := by
186+ dp R q (s.sum fun i ↦ a i • x i) =
187+ (Finset.sym s q).sum fun k ↦
188+ (s.prod fun i ↦ a i ^ Multiset.count i k) •
189+ s.prod fun i ↦ dp R (Multiset.count i k) (x i) := by
183190 simp_rw [dp_sum, dp_smul, Algebra.smul_def, map_prod, ← Finset.prod_mul_distrib]
184191
185192open Nat in
@@ -220,7 +227,7 @@ theorem algHom_ext_iff {A : Type*} [CommSemiring A] [Algebra R A]
220227 refine ⟨fun h _ _ ↦ by rw [h], fun h ↦ ?_⟩
221228 rw [DFunLike.ext'_iff]
222229 apply Function.Surjective.injective_comp_right mkAlgHom_surjective
223- simpa [← AlgHom.coe_comp] using MvPolynomial.algHom_ext fun ⟨n, m⟩ => h n m
230+ simpa [← AlgHom.coe_comp] using MvPolynomial.algHom_ext fun ⟨n, m⟩ ↦ h n m
224231
225232@[ext]
226233theorem algHom_ext {A : Type *} [CommSemiring A] [Algebra R A]
@@ -281,4 +288,211 @@ theorem submodule_span_prod_dp_eq_top (hv : span R (Set.range v) = ⊤) :
281288
282289end
283290
291+ section UniversalProperty
292+
293+ variable (R M)
294+
295+ variable {A : Type *} [CommSemiring A] [Algebra R A]
296+
297+ private theorem lift'_imp {f : ℕ × M → A} (hf_zero : ∀ m, f (0 , m) = 1 )
298+ (hf_smul : ∀ (n : ℕ) (r : R) (m : M), f ⟨n, r • m⟩ = r ^ n • f ⟨n, m⟩)
299+ (hf_mul : ∀ n p m, f ⟨n, m⟩ * f ⟨p, m⟩ = (n + p).choose n • f ⟨n + p, m⟩)
300+ (hf_add : ∀ n u v, f ⟨n, u + v⟩ = (antidiagonal n).sum fun (k, l) ↦ f ⟨k, u⟩ * f ⟨l, v⟩)
301+ (p q : MvPolynomial (ℕ × M) R) (h : (Rel R M) p q) :
302+ eval₂AlgHom R f p = eval₂AlgHom R f q := by
303+ rcases h <;>
304+ simp_all
305+
306+ variable {R M}
307+
308+ /-- The weak universal property of `DividedPowerAlgebra R M`. -/
309+ def lift' {f : ℕ × M → A} (hf_zero : ∀ m, f (0 , m) = 1 )
310+ (hf_smul : ∀ (n : ℕ) (r : R) (m : M), f ⟨n, r • m⟩ = r ^ n • f ⟨n, m⟩)
311+ (hf_mul : ∀ n p m, f ⟨n, m⟩ * f ⟨p, m⟩ = (n + p).choose n • f ⟨n + p, m⟩)
312+ (hf_add : ∀ n u v, f ⟨n, u + v⟩ = (antidiagonal n).sum fun (k, l) ↦ f ⟨k, u⟩ * f ⟨l, v⟩) :
313+ DividedPowerAlgebra R M →ₐ[R] A :=
314+ RingQuot.liftAlgHom R ⟨eval₂AlgHom R f, by exact lift'_imp R M hf_zero hf_smul hf_mul hf_add⟩
315+
316+ @[simp]
317+ theorem lift'_apply {f : ℕ × M → A} (hf_zero : ∀ m, f (0 , m) = 1 )
318+ (hf_smul : ∀ (n : ℕ) (r : R) (m : M), f ⟨n, r • m⟩ = r ^ n • f ⟨n, m⟩)
319+ (hf_mul : ∀ n p m, f ⟨n, m⟩ * f ⟨p, m⟩ = (n + p).choose n • f ⟨n + p, m⟩)
320+ (hf_add : ∀ n u v, f ⟨n, u + v⟩ = (antidiagonal n).sum fun (k, l) ↦ f ⟨k, u⟩ * f ⟨l, v⟩)
321+ (p : MvPolynomial (ℕ × M) R) :
322+ lift' hf_zero hf_smul hf_mul hf_add (mkAlgHom R (Rel R M) p) = aeval f p := by
323+ simp [lift', aeval_eq_eval₂Hom]
324+
325+ @[simp]
326+ theorem lift'_apply_dp {f : ℕ × M → A} (hf_zero : ∀ m, f (0 , m) = 1 )
327+ (hf_smul : ∀ (n : ℕ) (r : R) (m : M), f ⟨n, r • m⟩ = r ^ n • f ⟨n, m⟩)
328+ (hf_mul : ∀ n p m, f ⟨n, m⟩ * f ⟨p, m⟩ = (n + p).choose n • f ⟨n + p, m⟩)
329+ (hf_add : ∀ n u v, f ⟨n, u + v⟩ = (antidiagonal n).sum fun (k, l) ↦ f ⟨k, u⟩ * f ⟨l, v⟩)
330+ (n : ℕ) (m : M) :
331+ lift' hf_zero hf_smul hf_mul hf_add (dp R n m) = f ⟨n, m⟩ := by
332+ rw [dp_def, lift'_apply hf_zero hf_smul hf_mul hf_add, aeval_X]
333+
334+ variable {I : Ideal A} (hI : DividedPowers I) (g : M →ₗ[R] A) (hg : ∀ m, g m ∈ I)
335+
336+ /-- The weak universal property of a divided power algebra for morphisms to divided power rings -/
337+ def lift : DividedPowerAlgebra R M →ₐ[R] A :=
338+ lift' (f := fun nm ↦ hI.dpow nm.1 (g nm.2 ))
339+ (fun m ↦ hI.dpow_zero (hg m))
340+ (fun n r m ↦ by
341+ dsimp only
342+ rw [LinearMap.map_smulₛₗ, RingHom.id_apply, ← algebraMap_smul A r (g m), smul_eq_mul,
343+ hI.dpow_mul (hg m), ← smul_eq_mul, ← map_pow, algebraMap_smul])
344+ (fun n p m ↦ by rw [hI.mul_dpow (hg m), ← nsmul_eq_mul])
345+ (fun n u v ↦ by simp [hI.dpow_add (hg u) (hg v)])
346+
347+ variable {g}
348+
349+ @[simp]
350+ theorem lift_apply (p : MvPolynomial (ℕ × M) R) :
351+ lift hI g hg (mkAlgHom R (Rel R M) p) = aeval (fun nm : ℕ × M ↦ hI.dpow nm.1 (g nm.2 )) p := by
352+ rw [lift, lift'_apply]
353+
354+ @[simp]
355+ theorem lift_apply_dp (n : ℕ) (m : M) :
356+ lift hI g hg (dp R n m) = hI.dpow n (g m) := by rw [lift, lift'_apply_dp]
357+
358+ theorem lift_unique {f : DividedPowerAlgebra R M →ₐ[R] A}
359+ (hf : ∀ n m, f (dp R n m) = hI.dpow n (g m)) : f = lift hI g hg :=
360+ algHom_ext (fun _ _ ↦ by rw [lift_apply_dp, hf])
361+
362+ @[simp]
363+ theorem lift_embed_apply (m : M) : lift hI g hg (embed R M m) = g m := by
364+ simp [embed_def, hI.dpow_one (hg m)]
365+
366+ @[simp]
367+ theorem embed_comp_lift : (lift hI g hg).toLinearMap.comp (embed R M) = g := by
368+ ext; simp
369+
370+ end UniversalProperty
371+
372+ section Functoriality
373+
374+ section Map
375+
376+ variable {S : Type *} [CommSemiring S] {N : Type *} [AddCommMonoid N] [Module R N] [Module S N]
377+ (f : M →ₗ[R] N)
378+
379+ namespace LinearMap
380+
381+ @[simp]
382+ lemma dp_zero {a : M} : dp S 0 (f a) = 1 := DividedPowerAlgebra.dp_zero
383+
384+ lemma dp_mul {m n : ℕ} {a : M} :
385+ dp S m (f a) * dp S n (f a) = (Nat.choose (m + n) m) • dp S (m + n) (f a) :=
386+ DividedPowerAlgebra.dp_mul
387+
388+ lemma dp_add {n : ℕ} {a b : M} :
389+ dp S n (f (a + b)) = (Finset.antidiagonal n).sum fun k ↦ dp S k.1 (f a) * dp S k.2 (f b) := by
390+ rw [map_add, DividedPowerAlgebra.dp_add]
391+
392+ end LinearMap
393+
394+ section IsScalarTower
395+
396+ variable (S)
397+
398+ variable [Algebra R S] [IsScalarTower R S N]
399+
400+ lemma LinearMap.dp_smul {n : ℕ} {r : R} {a : M} : dp S n (f (r • a)) = r ^ n • dp S n (f a) := by
401+ rw [f.map_smul, algebra_compatible_smul S r (f a),
402+ DividedPowerAlgebra.dp_smul, ← map_pow, algebraMap_smul]
403+
404+ /-- The functoriality map between divided power algebras associated with a linear map of the
405+ underlying modules.
406+ Given an `R`-algebra `S`, an `S`-module `N` and an `R`-linear map `f : M →ₗ[R] N`,
407+ this is the map `DividedPowerAlgebra R M →ₐ[R] DividedPowerAlgebra S N`
408+ sending `dp R n m` to `dp S n (f m)`. -/
409+ def map : DividedPowerAlgebra R M →ₐ[R] DividedPowerAlgebra S N :=
410+ DividedPowerAlgebra.lift' (f := fun nm ↦ dp S nm.fst (f nm.snd))
411+ (fun _ ↦ LinearMap.dp_zero f)
412+ (fun _ _ _ ↦ LinearMap.dp_smul S f)
413+ (fun _ _ _ ↦ LinearMap.dp_mul f)
414+ (fun _ _ _ ↦ LinearMap.dp_add f)
415+
416+ @[simp]
417+ theorem map_apply {p : MvPolynomial (ℕ × M) R} :
418+ map S f (mkAlgHom R (Rel R M) p) = aeval (fun nm ↦ dp S nm.fst (f nm.snd)) p := by
419+ rw [map, lift'_apply]
420+
421+ @[simp]
422+ theorem map_apply_dp {n : ℕ} {a : M} : map S f (dp R n a) = dp S n (f a) := by
423+ rw [map, lift'_apply_dp]
424+
425+ @[simp]
426+ theorem map_embed_apply {m : M} : map S f (embed R M m) = embed S N (f m) := by
427+ simp [embed_def, map_apply_dp]
428+
429+ theorem lift_comp_embed :
430+ (map S f).toLinearMap.comp (embed R M) = ((embed S N).restrictScalars R).comp f := by
431+ ext; simp
432+
433+ theorem lift_surjective {f : M →ₗ[R] N} (hf : Function.Surjective f) :
434+ Function.Surjective (map R f) := by
435+ rw [← AlgHom.range_eq_top, ← Algebra.map_top (map R f), eq_top_iff,
436+ ← (AlgHom.range_eq_top (mkAlgHom R (Rel R N))).mpr mkAlgHom_surjective,
437+ ← Algebra.map_top, (Subalgebra.gc_map_comap _).le_iff_le, ← MvPolynomial.adjoin_range_X,
438+ Algebra.adjoin_le_iff]
439+ intro
440+ simp only [Set.mem_range, Prod.exists]
441+ rintro ⟨n, m, rfl⟩
442+ obtain ⟨l, rfl⟩ := hf m
443+ simp only [Algebra.map_top, Subalgebra.coe_comap, AlgHom.coe_range, Set.mem_preimage,
444+ Set.mem_range]
445+ use dp R n l
446+ rw [map_apply_dp, dp]
447+
448+ end IsScalarTower
449+
450+ end Map
451+
452+ variable (S : Type *) [CommSemiring S] {N : Type *} [AddCommMonoid N] [Module R N] [Module S N]
453+ (f : M →ₗ[R] N)
454+
455+ section IsScalarTower
456+
457+ variable [Algebra R S] [IsScalarTower R S N] {P : Type *} [AddCommMonoid P] [Module R P]
458+
459+ lemma map_comp (f : M →ₗ[R] N) (g : N →ₗ[R] P) :
460+ map R (g.comp f) = (map R g).comp (map R f) := by
461+ rw [algHom_ext_iff]
462+ intros; simp [map_apply_dp]
463+
464+ @[simp]
465+ lemma map_id : map R (LinearMap.id (R := R) (M := M)) = AlgHom.id R _ := by
466+ rw [algHom_ext_iff]
467+ intros
468+ simp [map_apply_dp]
469+
470+ /-- The functoriality map between divided power algebras associated with a linear equivalence of
471+ the underlying modules. Given an `R`-algebra `S`, an `S`-module `N` and an `R`-linear equivalence
472+ `f : M →ₗ[R] N`, this is the map `DividedPowerAlgebra R M →ₐ[R] DividedPowerAlgebra S N`
473+ sending `dp R n m` to `dp S n (f m)`. -/
474+ @[simps!]
475+ def mapEquiv (g : M ≃ₗ[R] N) :
476+ DividedPowerAlgebra R M ≃ₐ[R] DividedPowerAlgebra R N :=
477+ AlgEquiv.ofAlgHom (map R g.toLinearMap) (map R g.symm.toLinearMap)
478+ (by simp [← map_comp, map_id]) (by simp [← map_comp, map_id])
479+
480+ theorem mapEquiv_symm (g : M ≃ₗ[R] N) : (mapEquiv g).symm = mapEquiv g.symm := rfl
481+
482+ theorem LinearEquiv.coe_lift (g : M ≃ₗ[R] N) : mapEquiv g = map R g.toLinearMap := rfl
483+
484+ theorem LinearEquiv.coe_lift_symm (g : M ≃ₗ[R] N) :
485+ (mapEquiv g).symm = map R g.symm.toLinearMap := rfl
486+
487+ theorem mapEquiv_refl : mapEquiv (LinearEquiv.refl R M) = AlgEquiv.refl :=
488+ AlgEquiv.coe_algHom_injective map_id
489+
490+ theorem mapEquiv_trans (g : M ≃ₗ[R] N) (h : N ≃ₗ[R] P) :
491+ (mapEquiv g).trans (mapEquiv h) = mapEquiv (g.trans h) :=
492+ AlgEquiv.coe_algHom_injective (map_comp _ _).symm
493+
494+ end IsScalarTower
495+
496+ end Functoriality
497+
284498end DividedPowerAlgebra
0 commit comments