Skip to content

Commit f03ae62

Browse files
committed
feat(RingTheory/HopfAlgebra): prove antipode is antihomomorphism (#34969)
This PR proves that the antipode of a Hopf algebra is an antihomomorphism: `antipode (a * b) = antipode b * antipode a`. The proof uses the convolution algebra structure on `(A ⊗ A) →ₗ[R] A` and shows that `S ∘ μ` and `μ ∘ (S ⊗ S) ∘ comm` are both convolution inverses of `μ`, hence they must be equal by uniqueness of inverses. This resolves a TODO listed in the file header. 🤖 Prepared with Claude Code
1 parent ee31368 commit f03ae62

File tree

1 file changed

+85
-3
lines changed

1 file changed

+85
-3
lines changed

Mathlib/RingTheory/HopfAlgebra/Basic.lean

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Ali Ramsey
66
module
77

88
public import Mathlib.RingTheory.Bialgebra.Basic
9+
public import Mathlib.RingTheory.Coalgebra.Convolution
910

1011
/-!
1112
# Hopf algebras
@@ -17,15 +18,19 @@ In this file we define `HopfAlgebra`, and provide instances for:
1718
## Main definitions
1819
1920
* `HopfAlgebra R A` : the Hopf algebra structure on an `R`-bialgebra `A`.
20-
* `HopfAlgebra.antipode` : The `R`-linear map `A →ₗ[R] A`.
21+
* `HopfAlgebra.antipode` : the `R`-linear map `A →ₗ[R] A`.
22+
23+
## Main results
24+
25+
* `HopfAlgebra.antipode_one` : the antipode of the unit is the unit.
26+
* `HopfAlgebra.antipode_mul` : the antipode is an antihomomorphism: `S(ab) = S(b)S(a)`.
2127
2228
## TODO
2329
2430
* Uniqueness of Hopf algebra structure on a bialgebra (i.e. if the algebra and coalgebra structures
2531
agree then the antipodes must also agree).
2632
27-
* `antipode 1 = 1` and `antipode (a * b) = antipode b * antipode a`, so in particular if `A` is
28-
commutative then `antipode` is an algebra homomorphism.
33+
* If `A` is commutative then `antipode` is an algebra homomorphism.
2934
3035
* If `A` is commutative then `antipode` is necessarily a bijection and its square is
3136
the identity.
@@ -121,6 +126,83 @@ lemma sum_mul_antipode_eq_smul (repr : Repr R a) :
121126
@[simp] lemma counit_comp_antipode : counit ∘ₗ antipode R = counit (A := A) := by
122127
ext; exact counit_antipode _
123128

129+
/-! ### The antipode is an antihomomorphism
130+
131+
We prove that `antipode (a * b) = antipode b * antipode a`. The proof uses the "left inverse
132+
equals right inverse" trick in the convolution algebra `(A ⊗ A) →ₗ[R] A`.
133+
-/
134+
135+
open scoped ConvolutionProduct TensorProduct
136+
137+
/-- The antipode reverses multiplication: `S(ab) = S(b)S(a)`. -/
138+
theorem antipode_mul (a b : A) :
139+
antipode R (a * b) = antipode R b * antipode R a := by
140+
-- We show that the linear maps `S ∘ μ` and `μ ∘ (S ⊗ S) ∘ comm` are equal,
141+
-- by proving they are both convolution inverses of `μ`.
142+
suffices h : antipode R ∘ₗ LinearMap.mul' R A =
143+
LinearMap.mul' R A ∘ₗ TensorProduct.map (antipode R) (antipode R) ∘ₗ
144+
TensorProduct.comm R A A by
145+
exact congr(($h) (a ⊗ₜ b))
146+
apply left_inv_eq_right_inv (a := LinearMap.mul' R A)
147+
· -- Left inverse: `(S ∘ μ) * μ = 1`.
148+
refine TensorProduct.ext' fun x y => ?_
149+
-- Unfold convolution product: `(f * g)(x ⊗ y) = μ(f ⊗ g)(Δ(x ⊗ y))`.
150+
simp only [LinearMap.convMul_apply, LinearMap.convOne_apply]
151+
-- The coalgebra on `A ⊗ A: Δ(x ⊗ y) = σ (Δx ⊗ Δy)` where `σ = tensorTensorTensorComm`.
152+
rw [TensorProduct.comul_tmul]
153+
-- Use Sweedler representations for `x` and `y`.
154+
let ℛx := ℛ R x; let ℛy := ℛ R y
155+
conv_lhs => rw [← ℛx.eq, ← ℛy.eq]
156+
simp only [TensorProduct.sum_tmul, TensorProduct.tmul_sum, map_sum,
157+
TensorProduct.AlgebraTensorModule.tensorTensorTensorComm_tmul, TensorProduct.map_tmul,
158+
LinearMap.mul'_apply, LinearMap.comp_apply]
159+
rw [Finset.sum_comm]
160+
-- The counit on `A ⊗ A`: `ε(x ⊗ y) = ε(y) • ε(x) = ε(x)ε(y)` since `R` is commutative.
161+
simp only [TensorProduct.counit_tmul, Algebra.algebraMap_eq_smul_one]
162+
-- Use the bialgebra comultiplication axiom: `Δ(xy) = Δ(x)Δ(y)`.
163+
have key := mul_antipode_rTensor_comul_apply (R := R) (x * y)
164+
rw [Bialgebra.comul_mul, ← ℛx.eq, ← ℛy.eq] at key
165+
simp only [Finset.sum_mul, Finset.mul_sum, Algebra.TensorProduct.tmul_mul_tmul,
166+
map_sum, LinearMap.rTensor_tmul, LinearMap.mul'_apply, Bialgebra.counit_mul] at key
167+
rw [Finset.sum_comm] at key
168+
simpa [Algebra.algebraMap_eq_smul_one, mul_comm (counit x) (counit y)] using key
169+
· -- Right inverse: `μ * (μ ∘ (S ⊗ S) ∘ comm) = 1`.
170+
refine TensorProduct.ext' fun x y => ?_
171+
simp only [LinearMap.convMul_apply, LinearMap.convOne_apply]
172+
rw [TensorProduct.comul_tmul]
173+
let ℛx := ℛ R x; let ℛy := ℛ R y
174+
conv_lhs => rw [← ℛx.eq, ← ℛy.eq]
175+
simp only [TensorProduct.sum_tmul, TensorProduct.tmul_sum, map_sum,
176+
TensorProduct.AlgebraTensorModule.tensorTensorTensorComm_tmul, TensorProduct.map_tmul,
177+
LinearMap.mul'_apply, LinearMap.comp_apply]
178+
rw [Finset.sum_comm]
179+
simp only [TensorProduct.counit_tmul, Algebra.algebraMap_eq_smul_one]
180+
-- Rearrange the sum using antipode axioms.
181+
calc ∑ i ∈ ℛx.index, ∑ j ∈ ℛy.index,
182+
(ℛx.left i * ℛy.left j) * (antipode R (ℛy.right j) * antipode R (ℛx.right i))
183+
_ = ∑ i ∈ ℛx.index, ∑ j ∈ ℛy.index,
184+
ℛx.left i * (ℛy.left j * antipode R (ℛy.right j) * antipode R (ℛx.right i)) := by
185+
simp [mul_assoc]
186+
_ = ∑ i ∈ ℛx.index, ℛx.left i *
187+
((∑ j ∈ ℛy.index, ℛy.left j * antipode R (ℛy.right j)) * antipode R (ℛx.right i)) := by
188+
simp [Finset.sum_mul, Finset.mul_sum]
189+
_ = ∑ i ∈ ℛx.index, ℛx.left i *
190+
(counit y • 1 * antipode R (ℛx.right i)) := by
191+
rw [sum_mul_antipode_eq_smul ℛy]
192+
_ = ∑ i ∈ ℛx.index, ℛx.left i *
193+
(algebraMap R A (counit y) * antipode R (ℛx.right i)) := by
194+
simp [Algebra.smul_def]
195+
_ = ∑ i ∈ ℛx.index, algebraMap R A (counit y) * (ℛx.left i * antipode R (ℛx.right i)) := by
196+
congr 1; ext i; rw [← mul_assoc, ← mul_assoc, Algebra.commutes]
197+
_ = algebraMap R A (counit y) * ∑ i ∈ ℛx.index, ℛx.left i * antipode R (ℛx.right i) := by
198+
rw [← Finset.mul_sum]
199+
_ = algebraMap R A (counit y) * (counit (R := R) x • (1 : A)) := by
200+
rw [sum_mul_antipode_eq_smul ℛx]
201+
_ = (counit (R := R) x * counit y) • (1 : A) := by
202+
simp only [Algebra.smul_def, mul_one, ← map_mul, mul_comm (counit x)]
203+
_ = (counit (R := R) y • counit x) • (1 : A) := by
204+
simp only [smul_eq_mul, mul_comm (counit y)]
205+
124206
end HopfAlgebra
125207

126208
namespace CommSemiring

0 commit comments

Comments
 (0)