Theorem: groupCohomology.isMulOneCoboundary_of_isMulOneCocycle_of_aut_to_units
File: Mathlib/RepresentationTheory/GroupCohomology/Hilbert90.lean

Proof steps:
state_before: K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
hf : IsMulOneCocycle f
⊢ IsMulOneCoboundary f
state_after: case intro
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
hf : IsMulOneCocycle f
z : L
hz : aux f z ≠ 0
⊢ IsMulOneCoboundary f
tactic: obtain ⟨z, hz⟩ : ∃ z, aux f z ≠ 0 :=
    not_forall.1 (fun H => aux_ne_zero f <| funext <| fun x => H x)
state_before: case intro
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
hf : IsMulOneCocycle f
z : L
hz : aux f z ≠ 0
⊢ IsMulOneCoboundary f
state_after: case intro
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
hf : IsMulOneCocycle f
z : L
hz : aux f z ≠ 0
this : aux f z = ∑ h : L ≃ₐ[K] L, ↑(f h) * h z
⊢ IsMulOneCoboundary f
tactic: have : aux f z = ∑ h, f h * h z := by simp [aux, Finsupp.total, Finsupp.sum_fintype]
state_before: case intro
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
hf : IsMulOneCocycle f
z : L
hz : aux f z ≠ 0
this : aux f z = ∑ h : L ≃ₐ[K] L, ↑(f h) * h z
⊢ IsMulOneCoboundary f
state_after: case h
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
hf : IsMulOneCocycle f
z : L
hz : aux f z ≠ 0
this : aux f z = ∑ h : L ≃ₐ[K] L, ↑(f h) * h z
⊢ ∀ (g : L ≃ₐ[K] L), g • (Units.mk0 (aux f z) hz)⁻¹ / (Units.mk0 (aux f z) hz)⁻¹ = f g
tactic: use (Units.mk0 (aux f z) hz)⁻¹
state_before: case h
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
hf : IsMulOneCocycle f
z : L
hz : aux f z ≠ 0
this : aux f z = ∑ h : L ≃ₐ[K] L, ↑(f h) * h z
⊢ ∀ (g : L ≃ₐ[K] L), g • (Units.mk0 (aux f z) hz)⁻¹ / (Units.mk0 (aux f z) hz)⁻¹ = f g
state_after: case h
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
hf : IsMulOneCocycle f
z : L
hz : aux f z ≠ 0
this : aux f z = ∑ h : L ≃ₐ[K] L, ↑(f h) * h z
g : L ≃ₐ[K] L
⊢ g • (Units.mk0 (aux f z) hz)⁻¹ / (Units.mk0 (aux f z) hz)⁻¹ = f g
tactic: intro g
state_before: case h
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
hf : IsMulOneCocycle f
z : L
hz : aux f z ≠ 0
this : aux f z = ∑ h : L ≃ₐ[K] L, ↑(f h) * h z
g : L ≃ₐ[K] L
⊢ g • (Units.mk0 (aux f z) hz)⁻¹ / (Units.mk0 (aux f z) hz)⁻¹ = f g
state_after: case h
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
z : L
hz : aux f z ≠ 0
this : aux f z = ∑ h : L ≃ₐ[K] L, ↑(f h) * h z
g : L ≃ₐ[K] L
hf : ∀ (g h : L ≃ₐ[K] L), ↑(f (g * h)) = g ↑(f h) * ↑(f g)
⊢ ∑ h : L ≃ₐ[K] L, ↑(f h) * h z = g (∑ h : L ≃ₐ[K] L, ↑(f h) * h z) * ↑(f g)
tactic: simp only [IsMulOneCocycle, IsMulOneCoboundary, AlgEquiv.smul_units_def,
    map_inv, div_inv_eq_mul, inv_mul_eq_iff_eq_mul, Units.ext_iff, this,
    Units.val_mul, Units.coe_map, Units.val_mk0, MonoidHom.coe_coe] at hf ⊢
state_before: case h
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
z : L
hz : aux f z ≠ 0
this : aux f z = ∑ h : L ≃ₐ[K] L, ↑(f h) * h z
g : L ≃ₐ[K] L
hf : ∀ (g h : L ≃ₐ[K] L), ↑(f (g * h)) = g ↑(f h) * ↑(f g)
⊢ ∑ h : L ≃ₐ[K] L, ↑(f h) * h z = g (∑ h : L ≃ₐ[K] L, ↑(f h) * h z) * ↑(f g)
state_after: case h
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
z : L
hz : aux f z ≠ 0
this : aux f z = ∑ h : L ≃ₐ[K] L, ↑(f h) * h z
g : L ≃ₐ[K] L
hf : ∀ (g h : L ≃ₐ[K] L), ↑(f (g * h)) = g ↑(f h) * ↑(f g)
⊢ ∑ h : L ≃ₐ[K] L, ↑(f h) * h z = ∑ x : L ≃ₐ[K] L, ↑(f (g * x)) * g (x z)
tactic: simp_rw [map_sum, map_mul, Finset.sum_mul, mul_assoc, mul_comm _ (f _ : L), ← mul_assoc, ← hf g]
state_before: case h
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : FiniteDimensional K L
f : (L ≃ₐ[K] L) → Lˣ
z : L
hz : aux f z ≠ 0
this : aux f z = ∑ h : L ≃ₐ[K] L, ↑(f h) * h z
g : L ≃ₐ[K] L
hf : ∀ (g h : L ≃ₐ[K] L), ↑(f (g * h)) = g ↑(f h) * ↑(f g)
⊢ ∑ h : L ≃ₐ[K] L, ↑(f h) * h z = ∑ x : L ≃ₐ[K] L, ↑(f (g * x)) * g (x z)
state_after: no goals
tactic: exact eq_comm.1 (Fintype.sum_bijective (fun i => g * i)
    (Group.mulLeft_bijective g) _ _ (fun i => rfl))