import Mathlib set_option autoImplicit false open scoped TensorProduct namespace HopfAlgebra universe u v w variable {R : Type u} [CommRing R] {A : Type v} [CommRing A] [Bialgebra R A] {B : Type w} [CommRing B] [Bialgebra R B] noncomputable def coaction (π : A →ₐc[R] B) : A →ₐ[R] A ⊗[R] B := (Algebra.TensorProduct.map (AlgHom.id R A) (π : A →ₐ[R] B)).comp (Bialgebra.comulAlgHom R A) theorem coaction_apply (π : A →ₐc[R] B) (a : A) : coaction π a = Algebra.TensorProduct.map (AlgHom.id R A) (π : A →ₐ[R] B) (Coalgebra.comul (R := R) a) := rfl noncomputable def hopfKer (π : A →ₐc[R] B) : Subalgebra R A := AlgHom.equalizer (coaction π) (Algebra.TensorProduct.includeLeft : A →ₐ[R] A ⊗[R] B) theorem mem_hopfKer_iff (π : A →ₐc[R] B) (a : A) : a ∈ hopfKer π ↔ coaction π a = a ⊗ₜ[R] 1 := Iff.rfl theorem coaction_eq_of_mem (π : A →ₐc[R] B) {a : A} (h : a ∈ hopfKer π) : coaction π a = a ⊗ₜ[R] 1 := h noncomputable def canAlgHom (π : A →ₐc[R] B) : A ⊗[R] A →ₐ[R] A ⊗[R] B := Algebra.TensorProduct.lift (Algebra.TensorProduct.includeLeft : A →ₐ[R] A ⊗[R] B) (coaction π) (fun _ _ => Commute.all _ _) @[simp] theorem canAlgHom_tmul (π : A →ₐc[R] B) (a a' : A) : canAlgHom π (a ⊗ₜ[R] a') = (a ⊗ₜ[R] (1 : B)) * coaction π a' := Algebra.TensorProduct.lift_tmul _ _ _ a a' noncomputable def canMap (π : A →ₐc[R] B) : A ⊗[R] A →ₗ[R] A ⊗[R] B := (canAlgHom π).toLinearMap theorem canMap_apply (π : A →ₐc[R] B) (z : A ⊗[R] A) : canMap π z = canAlgHom π z := rfl @[simp] theorem canMap_tmul (π : A →ₐc[R] B) (a a' : A) : canMap π (a ⊗ₜ[R] a') = (a ⊗ₜ[R] (1 : B)) * coaction π a' := canAlgHom_tmul π a a' theorem canMap_mul_tmul (π : A →ₐc[R] B) (a a' : A) {h : A} (hh : h ∈ hopfKer π) : canMap π ((a * h) ⊗ₜ[R] a') = canMap π (a ⊗ₜ[R] (h * a')) := by rw [canMap_tmul, canMap_tmul, map_mul, coaction_eq_of_mem π hh, ← mul_assoc, Algebra.TensorProduct.tmul_mul_tmul, mul_one] theorem canMap_tmul_one (π : A →ₐc[R] B) (a : A) : canMap π (a ⊗ₜ[R] 1) = a ⊗ₜ[R] 1 := by rw [canMap_tmul, map_one, mul_one] theorem canMap_one_tmul (π : A →ₐc[R] B) (a : A) : canMap π (1 ⊗ₜ[R] a) = coaction π a := by rw [canMap_tmul, ← Algebra.TensorProduct.one_def, one_mul] def balancingRelations (π : A →ₐc[R] B) : Set (A ⊗[R] A) := {x | ∃ (a h a' : A), h ∈ hopfKer π ∧ x = (a * h) ⊗ₜ[R] a' - a ⊗ₜ[R] (h * a')} theorem canMap_eq_zero_of_mem_span (π : A →ₐc[R] B) {z : A ⊗[R] A} (hz : z ∈ Submodule.span R (balancingRelations π)) : canMap π z = 0 := by induction hz using Submodule.span_induction with | mem x hx => obtain ⟨a, h, a', hh, rfl⟩ := hx rw [map_sub, canMap_mul_tmul π a a' hh, sub_self] | zero => exact map_zero _ | add x y _ _ hx hy => rw [map_add, hx, hy, add_zero] | smul r x _ hx => rw [map_smul, hx, smul_zero] def IsHopfGalois (π : A →ₐc[R] B) : Prop := Function.Surjective (canMap π) ∧ ∀ z, canMap π z = 0 → z ∈ Submodule.span R (balancingRelations π) end HopfAlgebra