Skip to content

Commit be295dc

Browse files
kim-emclaude
andcommitted
feat(RingTheory/HopfAlgebra): prove antipode is antihomomorphism
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. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 98261a9 commit be295dc

1 file changed

Lines changed: 88 additions & 2 deletions

File tree

Mathlib/RingTheory/HopfAlgebra/Basic.lean

Lines changed: 88 additions & 2 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
@@ -19,13 +20,17 @@ In this file we define `HopfAlgebra`, and provide instances for:
1920
* `HopfAlgebra R A` : the Hopf algebra structure on an `R`-bialgebra `A`.
2021
* `HopfAlgebra.antipode` : The `R`-linear map `A →ₗ[R] A`.
2122
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)`.
27+
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,87 @@ 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+
-- Goal: ∑ S(x₁y₁) * (x₂y₂) = algebraMap (ε(x)ε(y))
161+
-- The counit on A ⊗ A: ε(x ⊗ y) = ε(y) • ε(x) = ε(x)ε(y) since R is commutative
162+
simp only [TensorProduct.counit_tmul, Algebra.algebraMap_eq_smul_one]
163+
-- Use the bialgebra comultiplication axiom: Δ(xy) = Δ(x)Δ(y)
164+
have key := mul_antipode_rTensor_comul_apply (R := R) (x * y)
165+
rw [Bialgebra.comul_mul, ← ℛx.eq, ← ℛy.eq] at key
166+
simp only [Finset.sum_mul, Finset.mul_sum, Algebra.TensorProduct.tmul_mul_tmul,
167+
map_sum, LinearMap.rTensor_tmul, LinearMap.mul'_apply, Bialgebra.counit_mul] at key
168+
rw [Finset.sum_comm] at key
169+
simp only [Algebra.algebraMap_eq_smul_one] at key
170+
rw [mul_comm (counit (R := R) x) (counit y)] at key
171+
exact key
172+
· -- Right inverse: μ * (μ ∘ (S ⊗ S) ∘ comm) = 1
173+
refine TensorProduct.ext' fun x y => ?_
174+
simp only [LinearMap.convMul_apply, LinearMap.convOne_apply]
175+
rw [TensorProduct.comul_tmul]
176+
let ℛx := ℛ R x; let ℛy := ℛ R y
177+
conv_lhs => rw [← ℛx.eq, ← ℛy.eq]
178+
simp only [TensorProduct.sum_tmul, TensorProduct.tmul_sum, map_sum,
179+
TensorProduct.AlgebraTensorModule.tensorTensorTensorComm_tmul, TensorProduct.map_tmul,
180+
LinearMap.mul'_apply, LinearMap.comp_apply]
181+
rw [Finset.sum_comm]
182+
simp only [TensorProduct.counit_tmul, Algebra.algebraMap_eq_smul_one]
183+
-- Goal: ∑ (x₁y₁) * S(y₂)S(x₂) = ε(x)ε(y) • 1
184+
-- Rearrange the sum using antipode axioms
185+
calc ∑ i ∈ ℛx.index, ∑ j ∈ ℛy.index,
186+
(ℛx.left i * ℛy.left j) * (antipode R (ℛy.right j) * antipode R (ℛx.right i))
187+
_ = ∑ i ∈ ℛx.index, ∑ j ∈ ℛy.index,
188+
ℛx.left i * (ℛy.left j * antipode R (ℛy.right j) * antipode R (ℛx.right i)) := by
189+
simp only [mul_assoc]
190+
_ = ∑ i ∈ ℛx.index, ℛx.left i *
191+
((∑ j ∈ ℛy.index, ℛy.left j * antipode R (ℛy.right j)) * antipode R (ℛx.right i)) := by
192+
simp only [Finset.sum_mul, Finset.mul_sum]
193+
_ = ∑ i ∈ ℛx.index, ℛx.left i *
194+
(counit (R := R) y • (1 : A) * antipode R (ℛx.right i)) := by
195+
rw [sum_mul_antipode_eq_smul ℛy]
196+
_ = ∑ i ∈ ℛx.index, ℛx.left i *
197+
(algebraMap R A (counit y) * antipode R (ℛx.right i)) := by
198+
simp only [Algebra.smul_def, mul_one]
199+
_ = ∑ i ∈ ℛx.index, algebraMap R A (counit y) * (ℛx.left i * antipode R (ℛx.right i)) := by
200+
congr 1; ext i; rw [← mul_assoc, ← mul_assoc, Algebra.commutes]
201+
_ = algebraMap R A (counit y) * ∑ i ∈ ℛx.index, ℛx.left i * antipode R (ℛx.right i) := by
202+
rw [← Finset.mul_sum]
203+
_ = algebraMap R A (counit y) * (counit (R := R) x • (1 : A)) := by
204+
rw [sum_mul_antipode_eq_smul ℛx]
205+
_ = (counit (R := R) x * counit y) • (1 : A) := by
206+
simp only [Algebra.smul_def, mul_one, ← map_mul, mul_comm (counit x)]
207+
_ = (counit (R := R) y • counit x) • (1 : A) := by
208+
simp only [smul_eq_mul, mul_comm (counit y)]
209+
124210
end HopfAlgebra
125211

126212
namespace CommSemiring

0 commit comments

Comments
 (0)