Theorem: Subgroup.smul_diff_smul'
File: Mathlib/GroupTheory/SchurZassenhaus.lean

tactic: letI := H.fintypeQuotientOfFiniteIndex
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
inst✝¹ : IsCommutative H
inst✝ : FiniteIndex H
α β : ↑(leftTransversals ↑H)
hH : Normal H
g : Gᵐᵒᵖ
⊢ diff (MonoidHom.id { x // x ∈ H }) (g • α) (g • β) =
    { val := (unop g)⁻¹ * ↑(diff (MonoidHom.id { x // x ∈ H }) α β) * unop g,
      property := (_ : (unop g)⁻¹ * ↑(diff (MonoidHom.id { x // x ∈ H }) α β) * unop g ∈ H) }

tactic: refine'
  Eq.trans
    (Finset.prod_bij' (fun q _ => g⁻¹ • q) (fun q _ => Finset.mem_univ _)
      (fun q _ => Subtype.ext _) (fun q _ => g • q) (fun q _ => Finset.mem_univ _)
      (fun q _ => smul_inv_smul g q) fun q _ => inv_smul_smul g q)
    (map_prod ϕ _ _).symm
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
inst✝¹ : IsCommutative H
inst✝ : FiniteIndex H
α β : ↑(leftTransversals ↑H)
hH : Normal H
g : Gᵐᵒᵖ
this : Fintype (G ⧸ H) := fintypeQuotientOfFiniteIndex H
ϕ : { x // x ∈ H } →* { x // x ∈ H } :=
  {
    toOneHom :=
      { toFun := fun h => { val := (unop g)⁻¹ * ↑h * unop g, property := (_ : (unop g)⁻¹ * ↑h * unop g ∈ H) },
        map_one' :=
          (_ : (fun h => { val := (unop g)⁻¹ * ↑h * unop g, property := (_ : (unop g)⁻¹ * ↑h * unop g ∈ H) }) 1 = 1) },
    map_mul' :=
      (_ :
        ∀ (h₁ h₂ : { x // x ∈ H }),
          { val := (unop g)⁻¹ * ↑(h₁ * h₂) * unop g, property := (_ : (unop g)⁻¹ * ↑(h₁ * h₂) * unop g ∈ H) } =
            { val := (unop g)⁻¹ * ↑h₁ * unop g, property := (_ : (unop g)⁻¹ * ↑h₁ * unop g ∈ H) } *
              { val := (unop g)⁻¹ * ↑h₂ * unop g, property := (_ : (unop g)⁻¹ * ↑h₂ * unop g ∈ H) }) }
⊢ diff (MonoidHom.id { x // x ∈ H }) (g • α) (g • β) =
    { val := (unop g)⁻¹ * ↑(diff (MonoidHom.id { x // x ∈ H }) α β) * unop g,
      property := (_ : (unop g)⁻¹ * ↑(diff (MonoidHom.id { x // x ∈ H }) α β) * unop g ∈ H) }

tactic: simp only [MonoidHom.id_apply, MonoidHom.coe_mk, OneHom.coe_mk,
  smul_apply_eq_smul_apply_inv_smul, smul_eq_mul_unop, mul_inv_rev, mul_assoc]
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
inst✝¹ : IsCommutative H
inst✝ : FiniteIndex H
α β : ↑(leftTransversals ↑H)
hH : Normal H
g : Gᵐᵒᵖ
this : Fintype (G ⧸ H) := fintypeQuotientOfFiniteIndex H
ϕ : { x // x ∈ H } →* { x // x ∈ H } :=
  {
    toOneHom :=
      { toFun := fun h => { val := (unop g)⁻¹ * ↑h * unop g, property := (_ : (unop g)⁻¹ * ↑h * unop g ∈ H) },
        map_one' :=
          (_ : (fun h => { val := (unop g)⁻¹ * ↑h * unop g, property := (_ : (unop g)⁻¹ * ↑h * unop g ∈ H) }) 1 = 1) },
    map_mul' :=
      (_ :
        ∀ (h₁ h₂ : { x // x ∈ H }),
          { val := (unop g)⁻¹ * ↑(h₁ * h₂) * unop g, property := (_ : (unop g)⁻¹ * ↑(h₁ * h₂) * unop g ∈ H) } =
            { val := (unop g)⁻¹ * ↑h₁ * unop g, property := (_ : (unop g)⁻¹ * ↑h₁ * unop g ∈ H) } *
              { val := (unop g)⁻¹ * ↑h₂ * unop g, property := (_ : (unop g)⁻¹ * ↑h₂ * unop g ∈ H) }) }
q : G ⧸ H
x✝ : q ∈ Finset.univ
⊢ ↑(↑(MonoidHom.id { x // x ∈ H })
        {
          val :=
            (↑(↑(toEquiv (_ : ↑(g • α) ∈ leftTransversals ↑H)) q))⁻¹ *
              ↑(↑(toEquiv (_ : ↑(g • β) ∈ leftTransversals ↑H)) q),
          property :=
            (_ :
              (↑(↑(toEquiv (_ : ↑(g • α) ∈ leftTransversals ↑H)) q))⁻¹ *
                  ↑(↑(toEquiv (_ : ↑(g • β) ∈ leftTransversals ↑H)) q) ∈
                H) }) =
    ↑(↑ϕ
        (↑(MonoidHom.id { x // x ∈ H })
          {
            val :=
              (↑(↑(toEquiv (_ : ↑α ∈ leftTransversals ↑H)) ((fun q x => g⁻¹ • q) q x✝)))⁻¹ *
                ↑(↑(toEquiv (_ : ↑β ∈ leftTransversals ↑H)) ((fun q x => g⁻¹ • q) q x✝)),
            property :=
              (_ :
                (↑(↑(toEquiv (_ : ↑α ∈ leftTransversals ↑H)) ((fun q x => g⁻¹ • q) q x✝)))⁻¹ *
                    ↑(↑(toEquiv (_ : ↑β ∈ leftTransversals ↑H)) ((fun q x => g⁻¹ • q) q x✝)) ∈
                  H) }))

tactic: rw [Subtype.ext_iff, coe_mk, coe_one, mul_one, inv_mul_self]
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
inst✝¹ : IsCommutative H
inst✝ : FiniteIndex H
α β : ↑(leftTransversals ↑H)
hH : Normal H
g : Gᵐᵒᵖ
this : Fintype (G ⧸ H) := fintypeQuotientOfFiniteIndex H
⊢ (fun h => { val := (unop g)⁻¹ * ↑h * unop g, property := (_ : (unop g)⁻¹ * ↑h * unop g ∈ H) }) 1 = 1

tactic: simp only [Subtype.ext_iff, coe_mk, coe_mul, mul_assoc, mul_inv_cancel_left]
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
inst✝¹ : IsCommutative H
inst✝ : FiniteIndex H
α β : ↑(leftTransversals ↑H)
hH : Normal H
g : Gᵐᵒᵖ
this : Fintype (G ⧸ H) := fintypeQuotientOfFiniteIndex H
h₁ h₂ : { x // x ∈ H }
⊢ OneHom.toFun
      { toFun := fun h => { val := (unop g)⁻¹ * ↑h * unop g, property := (_ : (unop g)⁻¹ * ↑h * unop g ∈ H) },
        map_one' :=
          (_ : (fun h => { val := (unop g)⁻¹ * ↑h * unop g, property := (_ : (unop g)⁻¹ * ↑h * unop g ∈ H) }) 1 = 1) }
      (h₁ * h₂) =
    OneHom.toFun
        { toFun := fun h => { val := (unop g)⁻¹ * ↑h * unop g, property := (_ : (unop g)⁻¹ * ↑h * unop g ∈ H) },
          map_one' :=
            (_ : (fun h => { val := (unop g)⁻¹ * ↑h * unop g, property := (_ : (unop g)⁻¹ * ↑h * unop g ∈ H) }) 1 = 1) }
        h₁ *
      OneHom.toFun
        { toFun := fun h => { val := (unop g)⁻¹ * ↑h * unop g, property := (_ : (unop g)⁻¹ * ↑h * unop g ∈ H) },
          map_one' :=
            (_ : (fun h => { val := (unop g)⁻¹ * ↑h * unop g, property := (_ : (unop g)⁻¹ * ↑h * unop g ∈ H) }) 1 = 1) }
        h₂