Skip to content

Commit ccfd155

Browse files
committed
feat(RingTheory/HopfAlgebra): Hopf algebra structure on polynomials (G_a)
Add the Coalgebra, Bialgebra, and HopfAlgebra instances on `R[X]` with additive comultiplication `Δ(X) = X ⊗ 1 + 1 ⊗ X`, counit `ε(p) = p(0)`, and antipode `S(X) = -X`. This is the coordinate ring of the additive group scheme 𝔾_a, dual to the multiplicative 𝔾_m already formalized via Laurent polynomials.
1 parent c4dcaea commit ccfd155

2 files changed

Lines changed: 261 additions & 0 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6498,6 +6498,7 @@ public import Mathlib.RingTheory.Henselian
64986498
public import Mathlib.RingTheory.HopfAlgebra.Basic
64996499
public import Mathlib.RingTheory.HopfAlgebra.GroupLike
65006500
public import Mathlib.RingTheory.HopfAlgebra.MonoidAlgebra
6501+
public import Mathlib.RingTheory.HopfAlgebra.Polynomial
65016502
public import Mathlib.RingTheory.HopfAlgebra.TensorProduct
65026503
public import Mathlib.RingTheory.HopkinsLevitzki
65036504
public import Mathlib.RingTheory.Ideal.AssociatedPrime.Basic
Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
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

Comments
 (0)