diff --git a/Mathlib.lean b/Mathlib.lean index d03479050e91f0..481e001c2d5188 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -6588,6 +6588,7 @@ public import Mathlib.RingTheory.HopfAlgebra.Basic public import Mathlib.RingTheory.HopfAlgebra.Convolution public import Mathlib.RingTheory.HopfAlgebra.GroupLike public import Mathlib.RingTheory.HopfAlgebra.MonoidAlgebra +public import Mathlib.RingTheory.HopfAlgebra.Polynomial public import Mathlib.RingTheory.HopfAlgebra.Quotient public import Mathlib.RingTheory.HopfAlgebra.TensorProduct public import Mathlib.RingTheory.HopkinsLevitzki diff --git a/Mathlib/RingTheory/HopfAlgebra/Polynomial.lean b/Mathlib/RingTheory/HopfAlgebra/Polynomial.lean new file mode 100644 index 00000000000000..90d95486d76cf7 --- /dev/null +++ b/Mathlib/RingTheory/HopfAlgebra/Polynomial.lean @@ -0,0 +1,204 @@ +/- +Copyright (c) 2025 Robin Langer. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Robin Langer +-/ +module + +public import Mathlib.RingTheory.HopfAlgebra.Basic +public import Mathlib.Algebra.Polynomial.AlgebraMap +public import Mathlib.Algebra.Polynomial.Eval.SMul +public import Mathlib.RingTheory.TensorProduct.Maps + +/-! +# The Hopf algebra structure on polynomials (additive group scheme ๐”พโ‚) + +The polynomial ring `R[X]` carries a natural Hopf algebra structure encoding the +additive group scheme `๐”พโ‚`: +* comultiplication: `ฮ”(X) = X โŠ— 1 + 1 โŠ— X` (encoding `p(x) โ†ฆ p(x + x')`) +* counit: `ฮต(p) = p(0)` (evaluation at zero) +* antipode: `S(X) = -X` (requires `CommRing R`) + +This is dual to the multiplicative group scheme `๐”พโ‚˜` formalized via Laurent polynomials +in `Mathlib.RingTheory.HopfAlgebra.MonoidAlgebra`. + +## Main definitions + +* `Polynomial.instCoalgebraStruct`: the `R`-coalgebra structure data on `R[X]`. +* `Polynomial.instCoalgebra`: the `R`-coalgebra instance on `R[X]` with additive + comultiplication. +* `Polynomial.instBialgebra`: the `R`-bialgebra structure on `R[X]`. +* `Polynomial.instHopfAlgebra`: the `R`-Hopf algebra structure on `R[X]` when `R` is a + commutative ring. + +## Implementation notes + +The coalgebra axioms are equalities of linear maps out of `R[X]`. Since comultiplication +and counit are defined via `Polynomial.aeval`, each axiom reduces to checking on the +generator `X`, exploiting the universal property of the polynomial ring. + +## References + +* Langer, R., *Determinantal bases and the symmetric group*, arXiv:0907.3950, ยง1.2 +-/ + +public section + +noncomputable section + +open Polynomial TensorProduct + +open scoped Polynomial TensorProduct + +namespace Polynomial + +variable (R : Type*) [CommSemiring R] + +/-! ### Coalgebra structure and instance -/ + +/-- The `๐”พโ‚` coalgebra structure on `R[X]`. -/ +instance instCoalgebraStruct : CoalgebraStruct R R[X] where + comul := (Polynomial.aeval ((X : R[X]) โŠ—โ‚œ 1 + 1 โŠ—โ‚œ (X : R[X]))).toLinearMap + counit := (Polynomial.aeval (0 : R)).toLinearMap + +theorem comul_def : + (Coalgebra.comul : R[X] โ†’โ‚—[R] R[X] โŠ—[R] R[X]) = + (Polynomial.aeval ((X : R[X]) โŠ—โ‚œ 1 + 1 โŠ—โ‚œ (X : R[X]))).toLinearMap := rfl + +theorem counit_def : + (Coalgebra.counit : R[X] โ†’โ‚—[R] R) = (Polynomial.aeval (0 : R)).toLinearMap := rfl + +@[simp] +theorem comul_apply (p : R[X]) : + Coalgebra.comul (R := R) p = + Polynomial.aeval ((X : R[X]) โŠ—โ‚œ 1 + 1 โŠ—โ‚œ (X : R[X])) p := rfl + +@[simp] +theorem counit_apply (p : R[X]) : + Coalgebra.counit (R := R) p = Polynomial.aeval (0 : R) p := rfl + +-- Glue lemmas connecting rTensor/lTensor of AlgHom.toLinearMap to Algebra.TensorProduct.map +private theorem rTensor_toLinearMap_eq {A : Type*} [CommSemiring A] [Algebra R A] + (f : R[X] โ†’โ‚[R] A) : + f.toLinearMap.rTensor R[X] = + (Algebra.TensorProduct.map f (AlgHom.id R R[X])).toLinearMap := by + ext x y; simp [LinearMap.rTensor_tmul] + +private theorem lTensor_toLinearMap_eq {A : Type*} [CommSemiring A] [Algebra R A] + (f : R[X] โ†’โ‚[R] A) : + f.toLinearMap.lTensor R[X] = + (Algebra.TensorProduct.map (AlgHom.id R R[X]) f).toLinearMap := by + ext x y; simp [LinearMap.lTensor_tmul] + +/-- The `๐”พโ‚` coalgebra instance on `R[X]`. -/ +instance instCoalgebra : Coalgebra R R[X] where + rTensor_counit_comp_comul := by + rw [counit_def, comul_def, rTensor_toLinearMap_eq, โ† AlgHom.comp_toLinearMap, + โ† AlgebraTensorModule.mk_eq, โ† Algebra.TensorProduct.toLinearMap_includeRight] + congr 1; apply Polynomial.algHom_ext + simp + lTensor_counit_comp_comul := by + rw [counit_def, comul_def, lTensor_toLinearMap_eq, โ† AlgHom.comp_toLinearMap, + โ† AlgebraTensorModule.mk_eq, โ† Algebra.TensorProduct.toLinearMap_includeLeft] + congr 1; apply Polynomial.algHom_ext + simp + coassoc := by + rw [comul_def, rTensor_toLinearMap_eq, lTensor_toLinearMap_eq] + apply LinearMap.ext; intro p + simp only [LinearMap.comp_apply, AlgHom.toLinearMap_apply, LinearEquiv.coe_coe] + induction p using Polynomial.induction_on' with + | add p q hp hq => simp only [map_add] at hp hq โŠข; rw [hp, hq] + | monomial n r => + have hassoc : โˆ€ x, (TensorProduct.assoc R R[X] R[X] R[X]) x = + (Algebra.TensorProduct.assoc R R R[X] R[X] R[X] R[X]) x := fun _ => rfl + simp [โ† C_mul_X_pow_eq_monomial, hassoc, Algebra.TensorProduct.one_def, + TensorProduct.add_tmul, TensorProduct.tmul_add, add_assoc] + +/-! ### Bialgebra instance -/ + +/-- The `๐”พโ‚` bialgebra instance on `R[X]`. -/ +instance instBialgebra : Bialgebra R R[X] := + Bialgebra.mk' R R[X] + (by simp [counit_apply]) + (fun {a b} => by simp [counit_apply, map_mul]) + (by simp [comul_apply]) + (fun {a b} => by simp [comul_apply, map_mul]) + +end Polynomial + +end -- end CommSemiring section + +/-! ### Hopf algebra instance -/ + +noncomputable section + +open Polynomial TensorProduct + +open scoped Polynomial TensorProduct + +namespace Polynomial + +variable (R : Type*) [CommRing R] + +/-- The antipode on `R[X]` for the additive group scheme `๐”พโ‚`: +the unique `R`-algebra homomorphism sending `X โ†ฆ -X`. -/ +def antipodeAlgHom : R[X] โ†’โ‚[R] R[X] := + Polynomial.aeval (-X : R[X]) + +@[simp] +theorem antipodeAlgHom_X : + antipodeAlgHom R (X : R[X]) = -X := by + simp [antipodeAlgHom] + +@[simp] +theorem antipodeAlgHom_C (r : R) : + antipodeAlgHom R (C r) = C r := by + simp [antipodeAlgHom] + +/-- The `๐”พโ‚` Hopf algebra instance on `R[X]` (requires `CommRing R` for the antipode +`S(X) = -X`). The antipode axiom `m โˆ˜ (S โŠ— id) โˆ˜ ฮ” = ฮท โˆ˜ ฮต` holds because both sides +send `X` to `0`: `S(X) ยท 1 + 1 ยท X = -X + X = 0 = C(ฮต(X))`. -/ +instance instHopfAlgebra : HopfAlgebra R R[X] where + antipode := (antipodeAlgHom R).toLinearMap + mul_antipode_rTensor_comul := by + have rTensor_eq : (antipodeAlgHom R).toLinearMap.rTensor R[X] = + (Algebra.TensorProduct.map (antipodeAlgHom R) + (AlgHom.id R R[X])).toLinearMap := by + ext x y; simp [LinearMap.rTensor_tmul] + dsimp only [Coalgebra.comul, Coalgebra.counit, CoalgebraStruct.comul, + CoalgebraStruct.counit, Polynomial.instCoalgebraStruct] + rw [rTensor_eq, โ† Algebra.TensorProduct.lmul'_toLinearMap, + โ† AlgHom.comp_toLinearMap, โ† AlgHom.comp_toLinearMap] + have key : (Algebra.TensorProduct.lmul' R).comp + ((Algebra.TensorProduct.map (antipodeAlgHom R) (AlgHom.id R R[X])).comp + (Polynomial.aeval ((X : R[X]) โŠ—โ‚œ 1 + 1 โŠ—โ‚œ (X : R[X])))) = + (Algebra.ofId R R[X]).comp (Polynomial.aeval (0 : R)) := + Polynomial.algHom_ext (by + simp [antipodeAlgHom, + Algebra.TensorProduct.map_tmul, Algebra.TensorProduct.lmul'_apply_tmul, + Algebra.ofId_apply]) + rw [key, AlgHom.comp_toLinearMap] + ext p; simp [Algebra.linearMap_apply, Algebra.ofId_apply] + mul_antipode_lTensor_comul := by + have lTensor_eq : (antipodeAlgHom R).toLinearMap.lTensor R[X] = + (Algebra.TensorProduct.map (AlgHom.id R R[X]) + (antipodeAlgHom R)).toLinearMap := by + ext x y; simp [LinearMap.lTensor_tmul] + dsimp only [Coalgebra.comul, Coalgebra.counit, CoalgebraStruct.comul, + CoalgebraStruct.counit, Polynomial.instCoalgebraStruct] + rw [lTensor_eq, โ† Algebra.TensorProduct.lmul'_toLinearMap, + โ† AlgHom.comp_toLinearMap, โ† AlgHom.comp_toLinearMap] + have key : (Algebra.TensorProduct.lmul' R).comp + ((Algebra.TensorProduct.map (AlgHom.id R R[X]) (antipodeAlgHom R)).comp + (Polynomial.aeval ((X : R[X]) โŠ—โ‚œ 1 + 1 โŠ—โ‚œ (X : R[X])))) = + (Algebra.ofId R R[X]).comp (Polynomial.aeval (0 : R)) := + Polynomial.algHom_ext (by + simp [antipodeAlgHom, + Algebra.TensorProduct.map_tmul, Algebra.TensorProduct.lmul'_apply_tmul, + Algebra.ofId_apply]) + rw [key, AlgHom.comp_toLinearMap] + ext p; simp [Algebra.linearMap_apply, Algebra.ofId_apply] + +end Polynomial + +end