Skip to content

Commit 3c356d7

Browse files
committed
feat(RingTheory/HopfAlgebra): construct from anti-algebra hom
Generalize `ofAlgHom` to take `A →ₐ[R] Aᵐᵒᵖ` (non-commutative case via the opposite ring), and add `rTensor/lTensorAntipodeEqualizer` subalgebras + `mul_*_comul_eq_of_mem_adjoin` corollaries that let consumers verify the antipode axiom on a generating set (Takeuchi 1971, Lemma 1). Motivates leanprover-community#31898: the TensorAlgebra Hopf instance reduces from a ~100-line Sweedler proof to a ~16-line application of the new API.
1 parent 3ed173e commit 3c356d7

2 files changed

Lines changed: 141 additions & 20 deletions

File tree

Mathlib/RingTheory/HopfAlgebra/Basic.lean

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,18 @@ In this file we define `HopfAlgebra`, and provide instances for:
1919
2020
* `HopfAlgebra R A` : the Hopf algebra structure on an `R`-bialgebra `A`.
2121
* `HopfAlgebra.antipode` : the `R`-linear map `A →ₗ[R] A`.
22+
* `HopfAlgebra.ofAlgHom` : construct a Hopf algebra structure from an algebra hom
23+
`A →ₐ[R] Aᵐᵒᵖ` satisfying the antipode identities.
24+
* `HopfAlgebra.rTensorAntipodeEqualizer`, `HopfAlgebra.lTensorAntipodeEqualizer` : the
25+
subalgebras of `A` on which a candidate antipode satisfies the antipode identity.
2226
2327
## Main results
2428
2529
* `HopfAlgebra.antipode_one` : the antipode of the unit is the unit.
2630
* `HopfAlgebra.antipode_mul` : the antipode is an antihomomorphism: `S(ab) = S(b)S(a)`.
31+
* `HopfAlgebra.mul_rTensor_comul_eq_of_mem_adjoin`,
32+
`HopfAlgebra.mul_lTensor_comul_eq_of_mem_adjoin` : the antipode identity propagates
33+
from a generating set of `A` to all of `Algebra.adjoin R s`.
2734
2835
## TODO
2936
@@ -229,3 +236,136 @@ instance toHopfAlgebra : HopfAlgebra R R where
229236
theorem antipode_eq_id : antipode R (A := R) = .id := rfl
230237

231238
end CommSemiring
239+
240+
namespace HopfAlgebra
241+
242+
variable {R A : Type*} [CommSemiring R] [Semiring A] [Bialgebra R A]
243+
244+
open Coalgebra MulOpposite
245+
246+
/-- Upgrade a bialgebra to a Hopf algebra by specifying the antipode as an algebra map
247+
`A →ₐ[R] Aᵐᵒᵖ` with appropriate conditions. -/
248+
noncomputable abbrev ofAlgHom (antipode : A →ₐ[R] Aᵐᵒᵖ)
249+
(mul_antipode_rTensor_comul :
250+
LinearMap.mul' R A ∘ₗ ((opLinearEquiv R).symm.toLinearMap ∘ₗ
251+
antipode.toLinearMap).rTensor A ∘ₗ comul = Algebra.linearMap R A ∘ₗ counit)
252+
(mul_antipode_lTensor_comul :
253+
LinearMap.mul' R A ∘ₗ ((opLinearEquiv R).symm.toLinearMap ∘ₗ
254+
antipode.toLinearMap).lTensor A ∘ₗ comul = Algebra.linearMap R A ∘ₗ counit) :
255+
HopfAlgebra R A where
256+
antipode := (opLinearEquiv R).symm.toLinearMap ∘ₗ antipode.toLinearMap
257+
mul_antipode_rTensor_comul := mul_antipode_rTensor_comul
258+
mul_antipode_lTensor_comul := mul_antipode_lTensor_comul
259+
260+
/-- The subalgebra of `a : A` where the `rTensor` antipode identity holds for a candidate
261+
anti-algebra hom `S : A →ₐ[R] Aᵐᵒᵖ`. Following Takeuchi (1971), Lemma 1, this set is closed
262+
under the algebra operations on `A`, with the multiplicative closure step being the
263+
Sweedler `comul_mul` calculation using anti-multiplicativity of `S`. -/
264+
noncomputable def rTensorAntipodeEqualizer (S : A →ₐ[R] Aᵐᵒᵖ) : Subalgebra R A where
265+
carrier := {a | LinearMap.mul' R A
266+
(((opLinearEquiv R).symm.toLinearMap ∘ₗ S.toLinearMap).rTensor A (comul a))
267+
= algebraMap R A (counit (R := R) a)}
268+
add_mem' {x y} (hx : _ = _) (hy : _ = _) := by simp [map_add, hx, hy]
269+
mul_mem' {x y} (hx : _ = _) (hy : _ = _) := by
270+
set Ŝ : A →ₗ[R] A := (opLinearEquiv R).symm.toLinearMap ∘ₗ S.toLinearMap
271+
have antihom : ∀ a b : A, Ŝ (a * b) = Ŝ b * Ŝ a := fun a b => by simp [Ŝ]
272+
let ℛx := ℛ R x
273+
let ℛy := ℛ R y
274+
have hx' : ∑ i ∈ ℛx.index, Ŝ (ℛx.left i) * ℛx.right i = algebraMap R A (counit x) := by
275+
simpa [← ℛx.eq, map_sum, LinearMap.rTensor_tmul, LinearMap.mul'_apply] using hx
276+
have hy' : ∑ j ∈ ℛy.index, Ŝ (ℛy.left j) * ℛy.right j = algebraMap R A (counit y) := by
277+
simpa [← ℛy.eq, map_sum, LinearMap.rTensor_tmul, LinearMap.mul'_apply] using hy
278+
change LinearMap.mul' R A _ = _
279+
rw [Bialgebra.comul_mul]
280+
conv_lhs => rw [← ℛx.eq, ← ℛy.eq]
281+
simp only [Finset.sum_mul, Finset.mul_sum, Algebra.TensorProduct.tmul_mul_tmul,
282+
map_sum, LinearMap.rTensor_tmul, LinearMap.mul'_apply, antihom]
283+
calc ∑ j ∈ ℛy.index, ∑ i ∈ ℛx.index,
284+
Ŝ (ℛy.left j) * Ŝ (ℛx.left i) * (ℛx.right i * ℛy.right j)
285+
= ∑ j ∈ ℛy.index,
286+
Ŝ (ℛy.left j) * (∑ i ∈ ℛx.index, Ŝ (ℛx.left i) * ℛx.right i) * ℛy.right j := by
287+
simp [mul_assoc, Finset.sum_mul, Finset.mul_sum]
288+
_ = ∑ j ∈ ℛy.index,
289+
algebraMap R A (counit x) * (Ŝ (ℛy.left j) * ℛy.right j) := by
290+
simp [hx', ← Algebra.commutes, mul_assoc]
291+
_ = algebraMap R A (counit (x * y)) := by
292+
rw [← Finset.mul_sum, hy', ← map_mul, ← Bialgebra.counit_mul]
293+
algebraMap_mem' r := by simp
294+
295+
@[simp]
296+
theorem mem_rTensorAntipodeEqualizer (S : A →ₐ[R] Aᵐᵒᵖ) (a : A) :
297+
a ∈ rTensorAntipodeEqualizer S ↔
298+
LinearMap.mul' R A
299+
(((opLinearEquiv R).symm.toLinearMap ∘ₗ S.toLinearMap).rTensor A (comul a))
300+
= algebraMap R A (counit (R := R) a) :=
301+
Iff.rfl
302+
303+
/-- The subalgebra of `a : A` where the `lTensor` antipode identity holds for a candidate
304+
anti-algebra hom `S : A →ₐ[R] Aᵐᵒᵖ`. The mirror image of `rTensorAntipodeEqualizer`. -/
305+
noncomputable def lTensorAntipodeEqualizer (S : A →ₐ[R] Aᵐᵒᵖ) : Subalgebra R A where
306+
carrier := {a | LinearMap.mul' R A
307+
(((opLinearEquiv R).symm.toLinearMap ∘ₗ S.toLinearMap).lTensor A (comul a))
308+
= algebraMap R A (counit (R := R) a)}
309+
add_mem' {x y} (hx : _ = _) (hy : _ = _) := by simp [map_add, hx, hy]
310+
mul_mem' {x y} (hx : _ = _) (hy : _ = _) := by
311+
set Ŝ : A →ₗ[R] A := (opLinearEquiv R).symm.toLinearMap ∘ₗ S.toLinearMap
312+
have antihom : ∀ a b : A, Ŝ (a * b) = Ŝ b * Ŝ a := fun a b => by simp [Ŝ]
313+
let ℛx := ℛ R x
314+
let ℛy := ℛ R y
315+
have hx' : ∑ i ∈ ℛx.index, ℛx.left i * Ŝ (ℛx.right i) = algebraMap R A (counit x) := by
316+
simpa [← ℛx.eq, map_sum, LinearMap.lTensor_tmul, LinearMap.mul'_apply] using hx
317+
have hy' : ∑ j ∈ ℛy.index, ℛy.left j * Ŝ (ℛy.right j) = algebraMap R A (counit y) := by
318+
simpa [← ℛy.eq, map_sum, LinearMap.lTensor_tmul, LinearMap.mul'_apply] using hy
319+
change LinearMap.mul' R A _ = _
320+
rw [Bialgebra.comul_mul]
321+
conv_lhs => rw [← ℛx.eq, ← ℛy.eq]
322+
simp only [Finset.sum_mul, Finset.mul_sum, Algebra.TensorProduct.tmul_mul_tmul,
323+
map_sum, LinearMap.lTensor_tmul, LinearMap.mul'_apply, antihom]
324+
rw [Finset.sum_comm]
325+
calc ∑ i ∈ ℛx.index, ∑ j ∈ ℛy.index,
326+
(ℛx.left i * ℛy.left j) * (Ŝ (ℛy.right j) * Ŝ (ℛx.right i))
327+
= ∑ i ∈ ℛx.index,
328+
ℛx.left i * (∑ j ∈ ℛy.index, ℛy.left j * Ŝ (ℛy.right j)) * Ŝ (ℛx.right i) := by
329+
simp [mul_assoc, Finset.sum_mul, Finset.mul_sum]
330+
_ = ∑ i ∈ ℛx.index,
331+
algebraMap R A (counit y) * (ℛx.left i * Ŝ (ℛx.right i)) := by
332+
simp [hy', ← Algebra.commutes, mul_assoc]
333+
_ = algebraMap R A (counit (x * y)) := by
334+
rw [← Finset.mul_sum, hx', ← map_mul, mul_comm, ← Bialgebra.counit_mul]
335+
algebraMap_mem' r := by simp
336+
337+
@[simp]
338+
theorem mem_lTensorAntipodeEqualizer (S : A →ₐ[R] Aᵐᵒᵖ) (a : A) :
339+
a ∈ lTensorAntipodeEqualizer S ↔
340+
LinearMap.mul' R A
341+
(((opLinearEquiv R).symm.toLinearMap ∘ₗ S.toLinearMap).lTensor A (comul a))
342+
= algebraMap R A (counit (R := R) a) :=
343+
Iff.rfl
344+
345+
/-- If `S : A →ₐ[R] Aᵐᵒᵖ` satisfies the `rTensor` antipode identity on a generating set
346+
`s`, then it satisfies it on the whole algebra generated by `s`. -/
347+
theorem mul_rTensor_comul_eq_of_mem_adjoin
348+
(S : A →ₐ[R] Aᵐᵒᵖ) {s : Set A}
349+
(h : ∀ ⦃x⦄, x ∈ s → LinearMap.mul' R A
350+
(((opLinearEquiv R).symm.toLinearMap ∘ₗ S.toLinearMap).rTensor A (comul x))
351+
= algebraMap R A (counit (R := R) x))
352+
{x : A} (hx : x ∈ Algebra.adjoin R s) :
353+
LinearMap.mul' R A
354+
(((opLinearEquiv R).symm.toLinearMap ∘ₗ S.toLinearMap).rTensor A (comul x))
355+
= algebraMap R A (counit (R := R) x) :=
356+
Algebra.adjoin_le (S := rTensorAntipodeEqualizer S) h hx
357+
358+
/-- If `S : A →ₐ[R] Aᵐᵒᵖ` satisfies the `lTensor` antipode identity on a generating set
359+
`s`, then it satisfies it on the whole algebra generated by `s`. -/
360+
theorem mul_lTensor_comul_eq_of_mem_adjoin
361+
(S : A →ₐ[R] Aᵐᵒᵖ) {s : Set A}
362+
(h : ∀ ⦃x⦄, x ∈ s → LinearMap.mul' R A
363+
(((opLinearEquiv R).symm.toLinearMap ∘ₗ S.toLinearMap).lTensor A (comul x))
364+
= algebraMap R A (counit (R := R) x))
365+
{x : A} (hx : x ∈ Algebra.adjoin R s) :
366+
LinearMap.mul' R A
367+
(((opLinearEquiv R).symm.toLinearMap ∘ₗ S.toLinearMap).lTensor A (comul x))
368+
= algebraMap R A (counit (R := R) x) :=
369+
Algebra.adjoin_le (S := lTensorAntipodeEqualizer S) h hx
370+
371+
end HopfAlgebra

Mathlib/RingTheory/HopfAlgebra/TensorProduct.lean

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,7 @@ We define the Hopf algebra instance on the tensor product of two Hopf algebras.
1717

1818
@[expose] public section
1919

20-
open Coalgebra TensorProduct HopfAlgebra
21-
22-
/-- Upgrade a bialgebra to a Hopf algebra by specifying the antipode as an algebra map with
23-
appropriate conditions. -/
24-
noncomputable abbrev HopfAlgebra.ofAlgHom {R A : Type*} [CommSemiring R] [CommSemiring A]
25-
[Bialgebra R A] (antipode : A →ₐ[R] A)
26-
(mul_antipode_rTensor_comul :
27-
((Algebra.TensorProduct.lift antipode (.id R A) fun _ ↦ .all _).comp
28-
(Bialgebra.comulAlgHom R A)) = (Algebra.ofId R A).comp (Bialgebra.counitAlgHom R A))
29-
(mul_antipode_lTensor_comul :
30-
(Algebra.TensorProduct.lift (.id R A) antipode fun _ _ ↦ .all _ _).comp
31-
(Bialgebra.comulAlgHom R A) = (Algebra.ofId R A).comp (Bialgebra.counitAlgHom R A)) :
32-
HopfAlgebra R A where
33-
antipode := antipode
34-
mul_antipode_rTensor_comul := by
35-
rw [← Algebra.TensorProduct.lmul'_comp_map] at mul_antipode_rTensor_comul
36-
exact congr(($mul_antipode_rTensor_comul).toLinearMap)
37-
mul_antipode_lTensor_comul := by
38-
rw [← Algebra.TensorProduct.lmul'_comp_map] at mul_antipode_lTensor_comul
39-
exact congr(($mul_antipode_lTensor_comul).toLinearMap)
20+
open Coalgebra HopfAlgebra
4021

4122
namespace TensorProduct
4223

0 commit comments

Comments
 (0)