|
| 1 | +/- |
| 2 | +Copyright (c) 2025 Ruiqi Chen. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Ruiqi Chen |
| 5 | +-/ |
| 6 | +import Mathlib.Algebra.Category.Ring.Under.Basic |
| 7 | +import Mathlib.Algebra.MvPolynomial.Basic |
| 8 | +import Mathlib.RingTheory.TensorProduct.MvPolynomial |
| 9 | +import Mathlib.Algebra.MvPolynomial.CommRing |
| 10 | +import Mathlib.Algebra.Category.Ring.Adjunctions |
| 11 | + |
| 12 | +/-! |
| 13 | +# Adjunctions related to `Under (R : CommRingCat)` |
| 14 | +
|
| 15 | +In this file we provide functors `forgetRelative R S : Under S ⥤ Under R` for `S` an `R`-algebra, |
| 16 | +`freeAbsolute R : Type u ⥤ Under R` the free functor given by polynomials over `R` and |
| 17 | +`forget : Under R ⥤ Type u` the forgetful functor. And prove some basic facts including adjunctions |
| 18 | +`tensorProd R S ⊣ forgetRelative R S` and `freeAbsolute R ⊣ forget`. |
| 19 | +-/ |
| 20 | + |
| 21 | +noncomputable section |
| 22 | + |
| 23 | +open TensorProduct CategoryTheory |
| 24 | + |
| 25 | +universe u |
| 26 | +variable {R S : CommRingCat.{u}} |
| 27 | +variable [Algebra R S] |
| 28 | + |
| 29 | +namespace CommRingCat |
| 30 | + |
| 31 | +variable (R S) in |
| 32 | +/-- The forgetful base change functor. -/ |
| 33 | +@[simps! map_right] |
| 34 | +def forgetRelative : Under S ⥤ Under R := Under.map <| ofHom Algebra.algebraMap |
| 35 | + |
| 36 | +/-- The adjunction between `tensorProd R S` and `forgetRelative R S`. -/ |
| 37 | +@[simps! unit_app counit_app] |
| 38 | +def adjTensorForget : tensorProd R S ⊣ forgetRelative R S := |
| 39 | + (Under.mapPushoutAdj (ofHom <| algebraMap R S)).ofNatIsoLeft ((R.tensorProdIsoPushout S).symm) |
| 40 | + |
| 41 | +variable (R) in |
| 42 | +/-- The free functor given by polynomials. -/ |
| 43 | +@[simps! map_right] |
| 44 | +def freeAbsolute : Type u ⥤ Under R where |
| 45 | + obj σ := R.mkUnder <| MvPolynomial σ R |
| 46 | + map f := (MvPolynomial.rename f).toUnder |
| 47 | + map_id σ := congr_arg (fun x => x.toUnder) <| MvPolynomial.rename_id (σ := σ) (R := R) |
| 48 | + map_comp f g := congr_arg (fun x => x.toUnder) (MvPolynomial.rename_comp_rename (R := R) f g).symm |
| 49 | + |
| 50 | +@[simp] |
| 51 | +lemma freeAbsolute_obj (σ : Type u) : algebra ((freeAbsolute R).obj σ) = MvPolynomial.algebra := |
| 52 | + mkUnder_eq <| MvPolynomial σ R |
| 53 | + |
| 54 | +@[simp] |
| 55 | +lemma freeAbsolute_map {σ τ : Type u} (f : σ ⟶ τ) : |
| 56 | + toAlgHom ((freeAbsolute R).map f) = |
| 57 | + (cast <| congr_arg₂ |
| 58 | + (fun instA instB => @AlgHom R (MvPolynomial σ R) (MvPolynomial τ R) _ _ _ instA instB) |
| 59 | + (mkUnder_eq (MvPolynomial σ R)).symm |
| 60 | + (mkUnder_eq (MvPolynomial τ R)).symm) (MvPolynomial.rename f) |
| 61 | + := AlgHom.toUnder_eq (MvPolynomial.rename f) |
| 62 | + |
| 63 | +/-- The forgetful functor `Under R ⥤ CommRingCat ⥤ Type`. -/ |
| 64 | +def forget : Under R ⥤ Type u := Under.forget R ⋙ HasForget.forget |
| 65 | + |
| 66 | +lemma tensorProd_freeAbsolute_tauto : freeAbsolute R ⋙ R.tensorProd S = { |
| 67 | + obj σ := S.mkUnder <| S ⊗[R] (MvPolynomial σ R) |
| 68 | + map f := (Algebra.TensorProduct.map (AlgHom.id S S) (MvPolynomial.rename f)).toUnder |
| 69 | + map_id σ := by |
| 70 | + simp only |
| 71 | + have : MvPolynomial.rename (𝟙 σ) = AlgHom.id R (MvPolynomial σ R) := |
| 72 | + MvPolynomial.rename_id (R := R) (σ := σ) |
| 73 | + rw [this, Algebra.TensorProduct.map_id] |
| 74 | + rfl |
| 75 | + map_comp f g := by |
| 76 | + simp only |
| 77 | + have : MvPolynomial.rename (R := R) (f ≫ g) = |
| 78 | + (MvPolynomial.rename g).comp (MvPolynomial.rename f) := |
| 79 | + (MvPolynomial.rename_comp_rename f g).symm |
| 80 | + rw [this, Algebra.TensorProduct.map_id_comp, AlgHom.toUnder_comp] |
| 81 | + } := by |
| 82 | + apply CategoryTheory.Functor.ext |
| 83 | + · intro σ τ f |
| 84 | + unfold freeAbsolute tensorProd |
| 85 | + dsimp |
| 86 | + rw [AlgHom.toUnder_eq] |
| 87 | + -- find out the path induction |
| 88 | + have (ninstσ : Algebra R (MvPolynomial σ R)) (ninstτ : Algebra R (MvPolynomial τ R)) |
| 89 | + (eqσ : ninstσ = MvPolynomial.algebra) (eqτ : ninstτ = MvPolynomial.algebra) : |
| 90 | + (@Algebra.TensorProduct.map _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| 91 | + (ninstσ) _ _ _ _ _ (ninstτ) (AlgHom.id S S) |
| 92 | + ((cast <| congr_arg₂ (fun instσ instτ => @AlgHom R (MvPolynomial σ R) |
| 93 | + (MvPolynomial τ R) _ _ _ instσ instτ) |
| 94 | + eqσ.symm eqτ.symm) (MvPolynomial.rename f))).toUnder = |
| 95 | + eqToHom (congr_arg |
| 96 | + (fun inst => S.mkUnder <| @TensorProduct R _ S (MvPolynomial σ R) _ _ _ |
| 97 | + (@Algebra.toModule _ _ _ _ inst)) <| eqσ) ≫ |
| 98 | + (@Algebra.TensorProduct.map _ _ _ _ _ _ _ _ _ _ _ _ _ _ MvPolynomial.algebra _ _ _ _ _ |
| 99 | + MvPolynomial.algebra (AlgHom.id S S) (MvPolynomial.rename f)).toUnder ≫ |
| 100 | + eqToHom (congr_arg |
| 101 | + (fun inst => S.mkUnder <| @TensorProduct R _ S (MvPolynomial τ R) _ _ _ |
| 102 | + (@Algebra.toModule _ _ _ _ inst)) <| eqτ).symm := by |
| 103 | + subst eqσ eqτ |
| 104 | + rfl |
| 105 | + exact this (algebra (R.mkUnder (MvPolynomial σ R))) (algebra (R.mkUnder (MvPolynomial τ R))) |
| 106 | + (mkUnder_eq (MvPolynomial σ R)) (mkUnder_eq (MvPolynomial τ R)) |
| 107 | + |
| 108 | +/-- We obtain `freeAbsolute S` by base changing `freeAbsolute R` using `⊗[R] S`. -/ |
| 109 | +def tensorProd_freeAbsolute : freeAbsolute R ⋙ R.tensorProd S ≅ freeAbsolute S := by |
| 110 | + -- To get rid of algebra_eq |
| 111 | + rw [tensorProd_freeAbsolute_tauto] |
| 112 | + exact (NatIso.ofComponents |
| 113 | + (fun σ => (MvPolynomial.algebraTensorAlgEquiv (σ := σ) R S).symm.toUnder) |
| 114 | + (fun {σ τ} f => by |
| 115 | + show (MvPolynomial.rename f).toUnder ≫ |
| 116 | + (MvPolynomial.algebraTensorAlgEquiv R S).symm.toAlgHom.toUnder |
| 117 | + = (MvPolynomial.algebraTensorAlgEquiv R S).symm.toAlgHom.toUnder ≫ |
| 118 | + (Algebra.TensorProduct.map (AlgHom.id S S) (MvPolynomial.rename f)).toUnder |
| 119 | + suffices (MvPolynomial.algebraTensorAlgEquiv R S).symm.toAlgHom.comp (MvPolynomial.rename f) |
| 120 | + = (Algebra.TensorProduct.map (AlgHom.id S S) (MvPolynomial.rename f)).comp |
| 121 | + (MvPolynomial.algebraTensorAlgEquiv R S).symm.toAlgHom from |
| 122 | + congr_arg (fun f => f.toUnder) this |
| 123 | + suffices (e : σ) → |
| 124 | + (MvPolynomial.algebraTensorAlgEquiv R S).symm.toAlgHom |
| 125 | + ((MvPolynomial.rename f) (MvPolynomial.X e)) |
| 126 | + = (Algebra.TensorProduct.map (AlgHom.id S S) (MvPolynomial.rename f)) |
| 127 | + ((MvPolynomial.algebraTensorAlgEquiv R S).symm.toAlgHom (MvPolynomial.X e)) from by |
| 128 | + exact MvPolynomial.algHom_ext this |
| 129 | + unfold MvPolynomial.algebraTensorAlgEquiv |
| 130 | + simp only [AlgEquiv.toAlgHom_eq_coe, MvPolynomial.rename_X, AlgHom.coe_coe, |
| 131 | + AlgEquiv.ofAlgHom_symm_apply, MvPolynomial.aeval_X, Algebra.TensorProduct.map_tmul, |
| 132 | + AlgHom.coe_id, id_eq, implies_true] |
| 133 | + )).symm |
| 134 | + |
| 135 | +/-- A commutative ring is an algebra over `ℤ` which is commutative. -/ |
| 136 | +def Under_ℤ : Under (of (ULift.{u, 0} ℤ)) ≌ CommRingCat.{u} := |
| 137 | + Under.equivalenceOfIsInitial isInitial |
| 138 | + |
| 139 | +/-- The defined `freeAbsolute ℤ` is isomorphic to `free` -/ |
| 140 | +def freeAbsolute_ℤ_tauto : free ⋙ Under_ℤ.inverse ≅ freeAbsolute (of (ULift.{u, 0} ℤ)) where |
| 141 | + hom := { |
| 142 | + app σ := Under.homMk |
| 143 | + (CommRingCat.ofHom <| MvPolynomial.map <| Int.castRingHom (ULift.{u, 0} ℤ)) |
| 144 | + (Limits.IsInitial.hom_ext isInitial _ _) |
| 145 | + naturality {σ τ} f := by |
| 146 | + apply Under.UnderMorphism.ext |
| 147 | + exact hom_ext <| MvPolynomial.map_comp_rename (Int.castRingHom (ULift.{u, 0} ℤ)) f |
| 148 | + } |
| 149 | + inv := { |
| 150 | + app σ := Under.homMk (CommRingCat.ofHom <| MvPolynomial.map RingHom.smulOneHom) |
| 151 | + (Limits.IsInitial.hom_ext isInitial _ _) |
| 152 | + naturality {σ τ} f := by |
| 153 | + apply Under.UnderMorphism.ext |
| 154 | + exact hom_ext <| MvPolynomial.map_comp_rename RingHom.smulOneHom f |
| 155 | + } |
| 156 | + hom_inv_id := by |
| 157 | + ext σ (x : MvPolynomial σ ℤ) |
| 158 | + show (MvPolynomial.map RingHom.smulOneHom) |
| 159 | + ((MvPolynomial.map (Int.castRingHom (ULift.{u, 0} ℤ))) x) = x |
| 160 | + rw [MvPolynomial.map_map _ (RingHom.smulOneHom (R := (ULift.{u, 0} ℤ)))] |
| 161 | + have : RingHom.smulOneHom.comp (Int.castRingHom (ULift.{u, 0} ℤ)) = RingHom.id ℤ := by aesop_cat |
| 162 | + rw [this] |
| 163 | + exact MvPolynomial.map_id x |
| 164 | + inv_hom_id := by |
| 165 | + ext σ (x : MvPolynomial σ (ULift.{u, 0} ℤ)) |
| 166 | + show (MvPolynomial.map (Int.castRingHom (ULift.{u, 0} ℤ))) |
| 167 | + ((MvPolynomial.map RingHom.smulOneHom) x) = x |
| 168 | + rw [MvPolynomial.map_map] |
| 169 | + have : (Int.castRingHom (ULift.{u, 0} ℤ)).comp (RingHom.smulOneHom (R := ULift.{u, 0} ℤ)) |
| 170 | + = RingHom.id (ULift.{u, 0} ℤ) := by aesop_cat |
| 171 | + rw [this] |
| 172 | + exact MvPolynomial.map_id x |
| 173 | + |
| 174 | +instance (R : CommRingCat.{u}) : Algebra (of (ULift.{u, 0} ℤ)) R |
| 175 | + := RingHom.toAlgebra RingHom.smulOneHom |
| 176 | + |
| 177 | +/-- The free forgetful adjunction of `Under R`. -/ |
| 178 | +def adjFreeForget : freeAbsolute R ⊣ forget := |
| 179 | + (adj.comp (Under_ℤ.symm.toAdjunction.comp adjTensorForget)).ofNatIsoLeft |
| 180 | + (isoWhiskerRight freeAbsolute_ℤ_tauto ((of (ULift.{u, 0} ℤ)).tensorProd R) |
| 181 | + ≪≫ tensorProd_freeAbsolute) |
| 182 | + |
| 183 | +end CommRingCat |
0 commit comments