|
| 1 | +/- |
| 2 | +Copyright (c) 2025 Robin Langer. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Robin Langer |
| 5 | +-/ |
| 6 | +import Mathlib.RingTheory.HopfAlgebra.Basic |
| 7 | +import Mathlib.Algebra.Polynomial.AlgebraMap |
| 8 | +import Mathlib.Algebra.Polynomial.Eval.SMul |
| 9 | +import Mathlib.RingTheory.TensorProduct.Maps |
| 10 | + |
| 11 | +/-! |
| 12 | +# The Hopf algebra structure on polynomials (additive group scheme 𝔾ₐ) |
| 13 | +
|
| 14 | +The polynomial ring `R[X]` carries a natural Hopf algebra structure encoding the |
| 15 | +additive group scheme `𝔾ₐ`: |
| 16 | +* comultiplication: `Δ(X) = X ⊗ 1 + 1 ⊗ X` (encoding `p(x) ↦ p(x + x')`) |
| 17 | +* counit: `ε(p) = p(0)` (evaluation at zero) |
| 18 | +* antipode: `S(X) = -X` (requires `CommRing R`) |
| 19 | +
|
| 20 | +This is dual to the multiplicative group scheme `𝔾ₘ` formalized via Laurent polynomials |
| 21 | +in `Mathlib.RingTheory.HopfAlgebra.MonoidAlgebra`. |
| 22 | +
|
| 23 | +## Main definitions |
| 24 | +
|
| 25 | +* `Polynomial.instCoalgebra`: the `R`-coalgebra structure on `R[X]` with additive |
| 26 | + comultiplication. |
| 27 | +* `Polynomial.instBialgebra`: the `R`-bialgebra structure on `R[X]`. |
| 28 | +* `Polynomial.instHopfAlgebra`: the `R`-Hopf algebra structure on `R[X]` when `R` is a |
| 29 | + commutative ring. |
| 30 | +
|
| 31 | +## Implementation notes |
| 32 | +
|
| 33 | +The coalgebra axioms are equalities of linear maps, but both sides factor through |
| 34 | +algebra homomorphisms out of `R[X]`. Since `R[X]` is free on `X`, algebra hom equality |
| 35 | +reduces to checking on `X` alone (`Polynomial.algHom_ext`). The proofs convert between the |
| 36 | +linear map API (`rTensor`, `lTensor`, `TensorProduct.assoc`) and the algebra hom API |
| 37 | +(`Algebra.TensorProduct.map`, `includeRight`, `Algebra.TensorProduct.assoc`) via |
| 38 | +auxiliary lemmas, then apply `algHom_ext`. |
| 39 | +
|
| 40 | +## References |
| 41 | +
|
| 42 | +* Langer, R., *Determinantal bases and the symmetric group*, arXiv:0907.3950, §1.2 |
| 43 | +-/ |
| 44 | + |
| 45 | +noncomputable section |
| 46 | + |
| 47 | +open Polynomial TensorProduct |
| 48 | + |
| 49 | +open scoped Polynomial TensorProduct |
| 50 | + |
| 51 | +namespace Polynomial |
| 52 | + |
| 53 | +variable (R : Type*) [CommSemiring R] |
| 54 | + |
| 55 | +/-! ### Comultiplication and counit -/ |
| 56 | + |
| 57 | +/-- The comultiplication on `R[X]` for the additive group scheme `𝔾ₐ`: |
| 58 | +the unique `R`-algebra homomorphism sending `X ↦ X ⊗ 1 + 1 ⊗ X`. |
| 59 | +As a linear map, this encodes `Δ(p(x)) = p(x + x')`. -/ |
| 60 | +def comulAdditiveAlgHom : R[X] →ₐ[R] R[X] ⊗[R] R[X] := |
| 61 | + Polynomial.aeval ((X : R[X]) ⊗ₜ 1 + 1 ⊗ₜ (X : R[X])) |
| 62 | + |
| 63 | +/-- The counit on `R[X]` for the additive group scheme `𝔾ₐ`: |
| 64 | +evaluation at `0`, as an `R`-algebra homomorphism. This is `ε(p) = p(0)`. -/ |
| 65 | +def counitAdditiveAlgHom : R[X] →ₐ[R] R := |
| 66 | + Polynomial.aeval (0 : R) |
| 67 | + |
| 68 | +@[simp] |
| 69 | +theorem comulAdditiveAlgHom_X : |
| 70 | + comulAdditiveAlgHom R (X : R[X]) = (X : R[X]) ⊗ₜ 1 + 1 ⊗ₜ (X : R[X]) := by |
| 71 | + simp [comulAdditiveAlgHom] |
| 72 | + |
| 73 | +@[simp] |
| 74 | +theorem comulAdditiveAlgHom_C (r : R) : |
| 75 | + comulAdditiveAlgHom R (C r) = (C r) ⊗ₜ 1 := by |
| 76 | + simp [comulAdditiveAlgHom] |
| 77 | + |
| 78 | +@[simp] |
| 79 | +theorem counitAdditiveAlgHom_X : |
| 80 | + counitAdditiveAlgHom R (X : R[X]) = 0 := by |
| 81 | + simp [counitAdditiveAlgHom] |
| 82 | + |
| 83 | +@[simp] |
| 84 | +theorem counitAdditiveAlgHom_C (r : R) : |
| 85 | + counitAdditiveAlgHom R (C r) = r := by |
| 86 | + simp [counitAdditiveAlgHom] |
| 87 | + |
| 88 | +/-! ### Coalgebra instance |
| 89 | +
|
| 90 | +The three coalgebra axioms (coassociativity, left counitality, right counitality) |
| 91 | +reduce to checking equality of `R`-algebra hom compositions on the generator `X`. |
| 92 | +-/ |
| 93 | + |
| 94 | +/-- The `𝔾ₐ` coalgebra structure on `R[X]`. -/ |
| 95 | +instance instCoalgebraStruct : CoalgebraStruct R R[X] where |
| 96 | + comul := (comulAdditiveAlgHom R).toLinearMap |
| 97 | + counit := (counitAdditiveAlgHom R).toLinearMap |
| 98 | + |
| 99 | +-- Auxiliary equations for unfolding the CoalgebraStruct fields |
| 100 | +theorem comul_eq : (CoalgebraStruct.comul : R[X] →ₗ[R] _) = |
| 101 | + (comulAdditiveAlgHom R).toLinearMap := rfl |
| 102 | + |
| 103 | +theorem counit_eq : (CoalgebraStruct.counit : R[X] →ₗ[R] _) = |
| 104 | + (counitAdditiveAlgHom R).toLinearMap := rfl |
| 105 | + |
| 106 | +-- Glue lemmas connecting rTensor/lTensor to Algebra.TensorProduct.map |
| 107 | +theorem rTensor_counit_eq : |
| 108 | + (counitAdditiveAlgHom R).toLinearMap.rTensor R[X] = |
| 109 | + (Algebra.TensorProduct.map (counitAdditiveAlgHom R) |
| 110 | + (AlgHom.id R R[X])).toLinearMap := by |
| 111 | + ext x y; simp [LinearMap.rTensor_tmul] |
| 112 | + |
| 113 | +theorem lTensor_counit_eq : |
| 114 | + (counitAdditiveAlgHom R).toLinearMap.lTensor R[X] = |
| 115 | + (Algebra.TensorProduct.map (AlgHom.id R R[X]) |
| 116 | + (counitAdditiveAlgHom R)).toLinearMap := by |
| 117 | + ext x y; simp [LinearMap.lTensor_tmul] |
| 118 | + |
| 119 | +theorem mk_one_eq_includeRight : |
| 120 | + TensorProduct.mk R R R[X] 1 = |
| 121 | + (Algebra.TensorProduct.includeRight : R[X] →ₐ[R] R ⊗[R] R[X]).toLinearMap := by |
| 122 | + ext y; simp [Algebra.TensorProduct.includeRight_apply] |
| 123 | + |
| 124 | +theorem mk_flip_one_eq_includeLeft : |
| 125 | + (TensorProduct.mk R R[X] R).flip 1 = |
| 126 | + (Algebra.TensorProduct.includeLeft : R[X] →ₐ[R] R[X] ⊗[R] R).toLinearMap := by |
| 127 | + ext y; simp [Algebra.TensorProduct.includeLeft_apply, LinearMap.flip_apply] |
| 128 | + |
| 129 | +theorem rTensor_comul_eq : |
| 130 | + (comulAdditiveAlgHom R).toLinearMap.rTensor R[X] = |
| 131 | + (Algebra.TensorProduct.map (comulAdditiveAlgHom R) |
| 132 | + (AlgHom.id R R[X])).toLinearMap := by |
| 133 | + ext x y; simp [LinearMap.rTensor_tmul] |
| 134 | + |
| 135 | +theorem lTensor_comul_eq : |
| 136 | + (comulAdditiveAlgHom R).toLinearMap.lTensor R[X] = |
| 137 | + (Algebra.TensorProduct.map (AlgHom.id R R[X]) |
| 138 | + (comulAdditiveAlgHom R)).toLinearMap := by |
| 139 | + ext x y; simp [LinearMap.lTensor_tmul] |
| 140 | + |
| 141 | +/-- The `𝔾ₐ` coalgebra instance on `R[X]`: coassociativity holds because both |
| 142 | +`(Δ ⊗ id) ∘ Δ` and `(id ⊗ Δ) ∘ Δ` send `X` to `X⊗1⊗1 + 1⊗X⊗1 + 1⊗1⊗X`. -/ |
| 143 | +instance instCoalgebra : Coalgebra R R[X] := |
| 144 | + { instCoalgebraStruct R with |
| 145 | + rTensor_counit_comp_comul := by |
| 146 | + rw [counit_eq, comul_eq, rTensor_counit_eq, mk_one_eq_includeRight] |
| 147 | + change ((Algebra.TensorProduct.map (counitAdditiveAlgHom R) |
| 148 | + (AlgHom.id R R[X])).comp (comulAdditiveAlgHom R)).toLinearMap = _ |
| 149 | + congr 1 |
| 150 | + apply Polynomial.algHom_ext |
| 151 | + simp [comulAdditiveAlgHom, counitAdditiveAlgHom, |
| 152 | + Algebra.TensorProduct.map_tmul, Algebra.TensorProduct.includeRight_apply] |
| 153 | + lTensor_counit_comp_comul := by |
| 154 | + rw [counit_eq, comul_eq, lTensor_counit_eq, mk_flip_one_eq_includeLeft] |
| 155 | + change ((Algebra.TensorProduct.map (AlgHom.id R R[X]) |
| 156 | + (counitAdditiveAlgHom R)).comp (comulAdditiveAlgHom R)).toLinearMap = _ |
| 157 | + congr 1 |
| 158 | + apply Polynomial.algHom_ext |
| 159 | + simp [comulAdditiveAlgHom, counitAdditiveAlgHom, |
| 160 | + Algebra.TensorProduct.map_tmul, Algebra.TensorProduct.includeLeft_apply] |
| 161 | + coassoc := by |
| 162 | + rw [comul_eq, rTensor_comul_eq, lTensor_comul_eq] |
| 163 | + change ((Algebra.TensorProduct.assoc R R R R[X] R[X] R[X]).toAlgHom.comp |
| 164 | + ((Algebra.TensorProduct.map (comulAdditiveAlgHom R) |
| 165 | + (AlgHom.id R R[X])).comp |
| 166 | + (comulAdditiveAlgHom R))).toLinearMap = |
| 167 | + ((Algebra.TensorProduct.map (AlgHom.id R R[X]) |
| 168 | + (comulAdditiveAlgHom R)).comp |
| 169 | + (comulAdditiveAlgHom R)).toLinearMap |
| 170 | + congr 1 |
| 171 | + apply Polynomial.algHom_ext |
| 172 | + simp only [comulAdditiveAlgHom, AlgHom.comp_apply, AlgEquiv.toAlgHom_eq_coe, |
| 173 | + AlgHom.coe_coe, Algebra.TensorProduct.map_tmul, AlgHom.id_apply, aeval_X, |
| 174 | + map_add, map_one, Algebra.TensorProduct.one_def, |
| 175 | + Algebra.TensorProduct.assoc_tmul, |
| 176 | + TensorProduct.add_tmul, TensorProduct.tmul_add] |
| 177 | + abel } |
| 178 | + |
| 179 | +/-! ### Bialgebra instance -/ |
| 180 | + |
| 181 | +/-- The `𝔾ₐ` bialgebra instance on `R[X]`: the comultiplication and counit are algebra |
| 182 | +homomorphisms by construction. -/ |
| 183 | +instance instBialgebra : Bialgebra R R[X] := |
| 184 | + Bialgebra.mk' R R[X] |
| 185 | + (by simp [counit_eq]) |
| 186 | + (by intro a b; simp [counit_eq, map_mul]) |
| 187 | + (by simp [comul_eq]) |
| 188 | + (by intro a b; simp [comul_eq, map_mul]) |
| 189 | + |
| 190 | +end Polynomial |
| 191 | + |
| 192 | +end -- end CommSemiring section |
| 193 | + |
| 194 | +/-! ### Hopf algebra instance -/ |
| 195 | + |
| 196 | +noncomputable section |
| 197 | + |
| 198 | +open Polynomial TensorProduct |
| 199 | + |
| 200 | +open scoped Polynomial TensorProduct |
| 201 | + |
| 202 | +namespace Polynomial |
| 203 | + |
| 204 | +variable (R : Type*) [CommRing R] |
| 205 | + |
| 206 | +/-- The antipode on `R[X]` for the additive group scheme `𝔾ₐ`: |
| 207 | +the unique `R`-algebra homomorphism sending `X ↦ -X`. |
| 208 | +This is "inversion" on `𝔾ₐ`: if `Δ` encodes addition (`x ↦ x + x'`), |
| 209 | +then `S` encodes negation (`x ↦ -x`). -/ |
| 210 | +def antipodeAdditiveAlgHom : R[X] →ₐ[R] R[X] := |
| 211 | + Polynomial.aeval (-X : R[X]) |
| 212 | + |
| 213 | +@[simp] |
| 214 | +theorem antipodeAdditiveAlgHom_X : |
| 215 | + antipodeAdditiveAlgHom R (X : R[X]) = -X := by |
| 216 | + simp [antipodeAdditiveAlgHom] |
| 217 | + |
| 218 | +@[simp] |
| 219 | +theorem antipodeAdditiveAlgHom_C (r : R) : |
| 220 | + antipodeAdditiveAlgHom R (C r) = C r := by |
| 221 | + simp [antipodeAdditiveAlgHom] |
| 222 | + |
| 223 | +/-- The `𝔾ₐ` Hopf algebra instance on `R[X]` (requires `CommRing R` for the antipode |
| 224 | +`S(X) = -X`). The antipode axiom `m ∘ (S ⊗ id) ∘ Δ = η ∘ ε` holds because both sides |
| 225 | +send `X` to `0`: `S(X) · 1 + 1 · X = -X + X = 0 = C(ε(X))`. -/ |
| 226 | +instance instHopfAlgebra : HopfAlgebra R R[X] where |
| 227 | + antipode := (antipodeAdditiveAlgHom R).toLinearMap |
| 228 | + mul_antipode_rTensor_comul := by |
| 229 | + have rTensor_eq : (antipodeAdditiveAlgHom R).toLinearMap.rTensor R[X] = |
| 230 | + (Algebra.TensorProduct.map (antipodeAdditiveAlgHom R) |
| 231 | + (AlgHom.id R R[X])).toLinearMap := by |
| 232 | + ext x y; simp [LinearMap.rTensor_tmul] |
| 233 | + rw [comul_eq, counit_eq, rTensor_eq, ← Algebra.TensorProduct.lmul'_toLinearMap] |
| 234 | + -- Both sides are toLinearMap of algebra hom compositions. Convert and check on X. |
| 235 | + change ((Algebra.TensorProduct.lmul' R : R[X] ⊗[R] R[X] →ₐ[R] R[X]).comp |
| 236 | + ((Algebra.TensorProduct.map (antipodeAdditiveAlgHom R) |
| 237 | + (AlgHom.id R R[X])).comp (comulAdditiveAlgHom R))).toLinearMap = |
| 238 | + ((Algebra.ofId R R[X]).comp (counitAdditiveAlgHom R)).toLinearMap |
| 239 | + congr 1; apply Polynomial.algHom_ext |
| 240 | + simp [comulAdditiveAlgHom, antipodeAdditiveAlgHom, counitAdditiveAlgHom, |
| 241 | + Algebra.TensorProduct.map_tmul, Algebra.TensorProduct.lmul'_apply_tmul, |
| 242 | + Algebra.ofId_apply] |
| 243 | + mul_antipode_lTensor_comul := by |
| 244 | + have lTensor_eq : (antipodeAdditiveAlgHom R).toLinearMap.lTensor R[X] = |
| 245 | + (Algebra.TensorProduct.map (AlgHom.id R R[X]) |
| 246 | + (antipodeAdditiveAlgHom R)).toLinearMap := by |
| 247 | + ext x y; simp [LinearMap.lTensor_tmul] |
| 248 | + rw [comul_eq, counit_eq, lTensor_eq, ← Algebra.TensorProduct.lmul'_toLinearMap] |
| 249 | + change ((Algebra.TensorProduct.lmul' R : R[X] ⊗[R] R[X] →ₐ[R] R[X]).comp |
| 250 | + ((Algebra.TensorProduct.map (AlgHom.id R R[X]) |
| 251 | + (antipodeAdditiveAlgHom R)).comp (comulAdditiveAlgHom R))).toLinearMap = |
| 252 | + ((Algebra.ofId R R[X]).comp (counitAdditiveAlgHom R)).toLinearMap |
| 253 | + congr 1; apply Polynomial.algHom_ext |
| 254 | + simp [comulAdditiveAlgHom, antipodeAdditiveAlgHom, counitAdditiveAlgHom, |
| 255 | + Algebra.TensorProduct.map_tmul, Algebra.TensorProduct.lmul'_apply_tmul, |
| 256 | + Algebra.ofId_apply] |
| 257 | + |
| 258 | +end Polynomial |
| 259 | + |
| 260 | +end |
0 commit comments