Skip to content

Commit bb88d2c

Browse files
committed
feat(RingTheory.DividedPowerAlgebra.Init.lean): add weak universal property and functoriality (leanprover-community#36434)
Co-authored by @AntoineChambert-Loir. Co-authored-by: mariainesdff <mariaines.dff@gmail.com>
1 parent a421825 commit bb88d2c

1 file changed

Lines changed: 226 additions & 12 deletions

File tree

  • Mathlib/RingTheory/DividedPowerAlgebra

Mathlib/RingTheory/DividedPowerAlgebra/Init.lean

Lines changed: 226 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Antoine Chambert-Loir, María Inés de Frutos—Fernández
55
-/
66
module
77

8+
public import Mathlib.Algebra.MvPolynomial.Eval
89
public import Mathlib.Algebra.RingQuot
910
public import Mathlib.RingTheory.DividedPowers.Basic
1011

@@ -16,7 +17,7 @@ the universal divided power algebra of `M`, as the ring quotient of the polynomi
1617
in 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`. -/
7987
def 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
132140
protected 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

137145
theorem 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]
142149
theorem 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

166173
theorem 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

172179
theorem 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

178185
theorem 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

185192
open 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]
226233
theorem 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

282289
end
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+
284498
end DividedPowerAlgebra

0 commit comments

Comments
 (0)