|
| 1 | +/- |
| 2 | +Copyright (c) 2025 Yaël Dillies, Michał Mrugała. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Yaël Dillies, Michał Mrugała |
| 5 | +-/ |
| 6 | +module |
| 7 | + |
| 8 | +public import Mathlib.RingTheory.Bialgebra.TensorProduct |
| 9 | +public import Mathlib.RingTheory.Coalgebra.Convolution |
| 10 | + |
| 11 | +/-! |
| 12 | +# Convolution product on bialgebra homs |
| 13 | +
|
| 14 | +This file constructs the ring structure on algebra homs `C → A` where `C` is a bialgebra and `A` an |
| 15 | +algebra, and also the ring structure on bialgebra homs `C → A` where `C` and `A` are bialgebras. |
| 16 | +Both multiplications are given by |
| 17 | +``` |
| 18 | + | |
| 19 | + μ |
| 20 | +| | / \ |
| 21 | +f * g = f g |
| 22 | +| | \ / |
| 23 | + δ |
| 24 | + | |
| 25 | +``` |
| 26 | +diagrammatically, where `μ` stands for multiplication and `δ` for comultiplication. |
| 27 | +-/ |
| 28 | + |
| 29 | +public section |
| 30 | + |
| 31 | +suppress_compilation |
| 32 | + |
| 33 | +open Algebra Coalgebra Bialgebra TensorProduct WithConv |
| 34 | + |
| 35 | +variable {R A B C : Type*} [CommSemiring R] |
| 36 | + |
| 37 | +namespace AlgHom |
| 38 | +variable [CommSemiring A] [CommSemiring B] [Semiring C] [Bialgebra R C] [Algebra R A] |
| 39 | + |
| 40 | +instance : One (WithConv <| C →ₐ[R] A) where |
| 41 | + one := toConv <| (Algebra.ofId R A).comp <| counitAlgHom R C |
| 42 | + |
| 43 | +instance : Mul (WithConv <| C →ₐ[R] A) where |
| 44 | + mul f g := toConv <| .comp (lmul' R) <| .comp (map f.ofConv g.ofConv) <| comulAlgHom R C |
| 45 | + |
| 46 | +instance : Pow (WithConv <| C →ₐ[R] A) ℕ := ⟨fun f n ↦ npowRec n f⟩ |
| 47 | + |
| 48 | +lemma convOne_def : 1 = toConv ((Algebra.ofId R A).comp (counitAlgHom R C)) := rfl |
| 49 | + |
| 50 | +lemma convMul_def (f g : WithConv <| C →ₐ[R] A) : |
| 51 | + f * g = toConv (.comp (lmul' R) <| .comp (map f.ofConv g.ofConv) <| comulAlgHom R C) := rfl |
| 52 | + |
| 53 | +private lemma convPow_succ (f : WithConv <| C →ₐ[R] A) (n : ℕ) : f ^ (n + 1) = (f ^ n) * f := rfl |
| 54 | + |
| 55 | +@[simp] |
| 56 | +lemma convOne_apply (c : C) : (1 : WithConv <| C →ₐ[R] A) c = algebraMap R A (counit c) := rfl |
| 57 | + |
| 58 | +lemma convMul_apply (f g : WithConv <| C →ₐ[R] A) (c : C) : |
| 59 | + (f * g) c = lift f.ofConv g.ofConv (fun _ _ ↦ .all ..) (comul c) := by |
| 60 | + simp only [convMul_def, coe_comp, Function.comp_apply, Bialgebra.comulAlgHom_apply] |
| 61 | + rw [← comp_apply] |
| 62 | + congr 1 |
| 63 | + ext <;> simp |
| 64 | + |
| 65 | +@[simp] |
| 66 | +lemma toLinearMap_convOne : toConv (1 : WithConv <| C →ₐ[R] A).ofConv.toLinearMap = 1 := rfl |
| 67 | + |
| 68 | +@[simp] |
| 69 | +lemma toLinearMap_convMul (f g : WithConv <| C →ₐ[R] A) : |
| 70 | + toConv (f * g).ofConv.toLinearMap = toConv f.ofConv.toLinearMap * toConv g.ofConv.toLinearMap := |
| 71 | + rfl |
| 72 | + |
| 73 | +@[simp] |
| 74 | +lemma toLinearMap_convPow (f : WithConv <| C →ₐ[R] A) : |
| 75 | + ∀ n : ℕ, toConv (f ^ n).ofConv.toLinearMap = toConv f.ofConv.toLinearMap ^ n |
| 76 | + | 0 => rfl |
| 77 | + | n + 1 => by simp only [convPow_succ, toLinearMap_convMul, toLinearMap_convPow, pow_succ] |
| 78 | + |
| 79 | +lemma convMul_comp_bialgHom_distrib [Bialgebra R B] (f g : WithConv <| C →ₐ[R] A) (h : B →ₐc[R] C) : |
| 80 | + AlgHom.comp (f * g).ofConv (h : B →ₐ[R] C) = |
| 81 | + ofConv (toConv (f.ofConv.comp h) * toConv (g.ofConv.comp h)) := by |
| 82 | + simp [convMul_def, comp_assoc, Algebra.TensorProduct.map_comp] |
| 83 | + |
| 84 | +lemma comp_convMul_distrib [Algebra R B] (h : A →ₐ[R] B) (f g : WithConv <| C →ₐ[R] A) : |
| 85 | + h.comp (f * g).ofConv = ofConv (toConv (h.comp f.ofConv) * toConv (h.comp g.ofConv)) := by |
| 86 | + apply toLinearMap_injective |
| 87 | + apply WithConv.toConv_injective |
| 88 | + rw [AlgHom.comp_toLinearMap, ← ofConv_toConv (f * g).ofConv.toLinearMap, toLinearMap_convMul] |
| 89 | + simp [LinearMap.algHom_comp_convMul_distrib, toLinearMap_convMul] |
| 90 | + |
| 91 | +instance : Monoid (WithConv <| C →ₐ[R] A) := fast_instance% |
| 92 | + (toConv_injective.comp <| toLinearMap_injective.comp ofConv_injective).monoid _ |
| 93 | + toLinearMap_convOne toLinearMap_convMul toLinearMap_convPow |
| 94 | + |
| 95 | +variable [IsCocomm R C] |
| 96 | + |
| 97 | +instance : CommMonoid (WithConv <| C →ₐ[R] A) := fast_instance% |
| 98 | + (toConv_injective.comp <| toLinearMap_injective.comp ofConv_injective).commMonoid _ |
| 99 | + toLinearMap_convOne toLinearMap_convMul toLinearMap_convPow |
| 100 | + |
| 101 | +end AlgHom |
| 102 | + |
| 103 | +namespace BialgHom |
| 104 | +variable [CommSemiring A] [Semiring C] [Bialgebra R A] [Bialgebra R C] |
| 105 | + |
| 106 | +instance : One (WithConv <| C →ₐc[R] A) where |
| 107 | + one := toConv <| (unitBialgHom R A).comp <| counitBialgHom R C |
| 108 | + |
| 109 | +lemma convOne_def : 1 = toConv ((unitBialgHom R A).comp (counitBialgHom R C)) := rfl |
| 110 | + |
| 111 | +@[simp] |
| 112 | +lemma convOne_apply (c : C) : (1 : WithConv <| C →ₐc[R] A) c = algebraMap R A (counit c) := rfl |
| 113 | + |
| 114 | +@[simp] |
| 115 | +lemma toLinearMap_convOne : |
| 116 | + toConv (SemilinearMapClass.semilinearMap (1 : WithConv <| C →ₐc[R] A).ofConv) = 1 := rfl |
| 117 | + |
| 118 | +@[simp] lemma toAlgHom_convOne : toConv (1 : WithConv <| C →ₐc[R] A).ofConv.toAlgHom = 1 := rfl |
| 119 | + |
| 120 | +variable [IsCocomm R C] |
| 121 | + |
| 122 | +instance : Mul (WithConv <| C →ₐc[R] A) where |
| 123 | + mul f g := toConv <| .comp (mulBialgHom R A) <| .comp (map f.ofConv g.ofConv) <| comulBialgHom R C |
| 124 | + |
| 125 | +instance : Pow (WithConv <| C →ₐc[R] A) ℕ := ⟨fun f n ↦ npowRec n f⟩ |
| 126 | + |
| 127 | +lemma convMul_def (f g : WithConv <| C →ₐc[R] A) : |
| 128 | + f * g = |
| 129 | + toConv (.comp (mulBialgHom R A) <| .comp (map f.ofConv g.ofConv) <| comulBialgHom R C) := |
| 130 | + rfl |
| 131 | + |
| 132 | +private lemma convPow_succ (f : WithConv <| C →ₐc[R] A) (n : ℕ) : f ^ (n + 1) = (f ^ n) * f := rfl |
| 133 | + |
| 134 | +-- TODO: Make simp once `SemilinearMapClass.semilinearMap` is not simp nf anymore. |
| 135 | +-- @[simp] |
| 136 | +lemma toLinearMap_convMul (f g : WithConv <| C →ₐc[R] A) : |
| 137 | + toConv (f * g).ofConv.toLinearMap = toConv f.ofConv.toLinearMap * toConv g.ofConv.toLinearMap := |
| 138 | + rfl |
| 139 | + |
| 140 | +@[simp] |
| 141 | +lemma toAlgHom_convMul (f g : WithConv <| C →ₐc[R] A) : |
| 142 | + toConv (f * g).ofConv.toAlgHom = toConv f.ofConv.toAlgHom * toConv g.ofConv.toAlgHom := |
| 143 | + rfl |
| 144 | + |
| 145 | +-- TODO: Make simp once `SemilinearMapClass.semilinearMap` is not simp nf anymore. |
| 146 | +-- @[simp] |
| 147 | +lemma toLinearMap_convPow (f : WithConv <| C →ₐc[R] A) : |
| 148 | + ∀ n, toConv (f ^ n).ofConv.toLinearMap = toConv f.ofConv.toLinearMap ^ n |
| 149 | + | 0 => rfl |
| 150 | + | n + 1 => by simp only [convPow_succ, pow_succ, toLinearMap_convMul, toLinearMap_convPow] |
| 151 | + |
| 152 | +@[simp] |
| 153 | +lemma toAlgHom_convPow (f : WithConv <| C →ₐc[R] A) : |
| 154 | + ∀ n, toConv (f ^ n).ofConv.toAlgHom = toConv f.ofConv.toAlgHom ^ n |
| 155 | + | 0 => rfl |
| 156 | + | n + 1 => by simp only [convPow_succ, pow_succ, toAlgHom_convMul, toAlgHom_convPow] |
| 157 | + |
| 158 | +instance : CommMonoid (WithConv <| C →ₐc[R] A) := fast_instance% |
| 159 | + (toConv_injective.comp <| coe_linearMap_injective.comp ofConv_injective).commMonoid _ |
| 160 | + toLinearMap_convOne toLinearMap_convMul toLinearMap_convPow |
| 161 | + |
| 162 | +end BialgHom |
0 commit comments