-- Mathlib/FieldTheory/Finite/Basic.lean
theorem sum_subgroup_pow_eq_zero [CommRing K] [NoZeroDivisors K]
    {G : Subgroup Kˣ} [Fintype G] {k : ℕ} (k_pos : k ≠ 0) (k_lt_card_G : k < Fintype.card G) :
    ∑ x : G, ((x : Kˣ) : K) ^ k = 0

Proof state:
case intro
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
h_multiset_map : Multiset.map (fun x => ↑↑x ^ k) univ.val = Multiset.map (fun x => ↑↑x ^ k * ↑↑a ^ k) univ.val
h_multiset_map_sum :
  (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum * ↑↑a ^ k
hzero : (↑↑a ^ k - 1) * (Multiset.map (fun i => ↑↑i ^ k) univ.val).sum = 0
⊢ (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = 0

Tactic:
rw [mul_eq_zero] at hzero

Result:
case intro
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
h_multiset_map : Multiset.map (fun x => ↑↑x ^ k) univ.val = Multiset.map (fun x => ↑↑x ^ k * ↑↑a ^ k) univ.val
h_multiset_map_sum :
  (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum * ↑↑a ^ k
hzero : ↑↑a ^ k - 1 = 0 ∨ (Multiset.map (fun i => ↑↑i ^ k) univ.val).sum = 0
⊢ (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = 0

Proof state:
case intro
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
h_multiset_map : Multiset.map (fun x => ↑↑x ^ k) univ.val = Multiset.map (fun x => ↑↑x ^ k * ↑↑a ^ k) univ.val
h_multiset_map_sum :
  (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = (Multiset.map (fun x => ↑↑x ^ k * ↑↑a ^ k) univ.val).sum
⊢ (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = 0

Tactic:
rw [Multiset.sum_map_mul_right] at h_multiset_map_sum

Result:
case intro
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
h_multiset_map : Multiset.map (fun x => ↑↑x ^ k) univ.val = Multiset.map (fun x => ↑↑x ^ k * ↑↑a ^ k) univ.val
h_multiset_map_sum :
  (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum * ↑↑a ^ k
⊢ (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = 0

Proof state:
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
⊢ Multiset.map (fun x => ↑↑x ^ k) univ.val = Multiset.map (fun x => ↑↑x ^ k * ↑↑a ^ k) univ.val

Tactic:
simp_rw [← mul_pow]

Result:
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
⊢ Multiset.map (fun x => ↑↑x ^ k) univ.val = Multiset.map (fun x => (↑↑x * ↑↑a) ^ k) univ.val

Proof state:
case intro
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
⊢ (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = 0

Tactic:
have h_multiset_map :
  Finset.univ.val.map (fun x : G => ((x : Kˣ) : K) ^ k) =
    Finset.univ.val.map (fun x : G => ((x : Kˣ) : K) ^ k * ((a : Kˣ) : K) ^ k) := by
  simp_rw [← mul_pow]
  have as_comp :
    (fun x : ↥G => (((x : Kˣ) : K) * ((a : Kˣ) : K)) ^ k)
      = (fun x : ↥G => ((x : Kˣ) : K) ^ k) ∘ fun x : ↥G => x * a := by
    funext x
    simp only [Function.comp_apply, Subgroup.coe_mul, Units.val_mul]
  rw [as_comp, ← Multiset.map_map]
  congr
  rw [eq_comm]
  exact Multiset.map_univ_val_equiv (Equiv.mulRight a)

Result:
case intro
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
h_multiset_map : Multiset.map (fun x => ↑↑x ^ k) univ.val = Multiset.map (fun x => ↑↑x ^ k * ↑↑a ^ k) univ.val
⊢ (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = 0

Proof state:
case intro
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
h_multiset_map : Multiset.map (fun x => ↑↑x ^ k) univ.val = Multiset.map (fun x => ↑↑x ^ k * ↑↑a ^ k) univ.val
h_multiset_map_sum :
  (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum * ↑↑a ^ k
hzero : ↑↑a ^ k - 1 = 0 ∨ (Multiset.map (fun i => ↑↑i ^ k) univ.val).sum = 0
h : ↑↑a ^ k - 1 = 0
⊢ a ^ k = 1

Tactic:
ext

Result:
case intro.a.a
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
h_multiset_map : Multiset.map (fun x => ↑↑x ^ k) univ.val = Multiset.map (fun x => ↑↑x ^ k * ↑↑a ^ k) univ.val
h_multiset_map_sum :
  (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum * ↑↑a ^ k
hzero : ↑↑a ^ k - 1 = 0 ∨ (Multiset.map (fun i => ↑↑i ^ k) univ.val).sum = 0
h : ↑↑a ^ k - 1 = 0
⊢ ↑↑(a ^ k) = ↑↑1

Proof state:
case h
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
x : ↥G
⊢ (↑↑x * ↑↑a) ^ k = ((fun x => ↑↑x ^ k) ∘ fun x => x * a) x

Tactic:
simp only [Function.comp_apply, Subgroup.coe_mul, Units.val_mul]

Result:
no goals

Proof state:
case intro
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
h_multiset_map : Multiset.map (fun x => ↑↑x ^ k) univ.val = Multiset.map (fun x => ↑↑x ^ k * ↑↑a ^ k) univ.val
h_multiset_map_sum :
  (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum * ↑↑a ^ k
hzero : ↑↑a ^ k - 1 = 0 ∨ (Multiset.map (fun i => ↑↑i ^ k) univ.val).sum = 0
⊢ (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = 0

Tactic:
refine hzero.resolve_left fun h => ha ?_

Result:
case intro
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
h_multiset_map : Multiset.map (fun x => ↑↑x ^ k) univ.val = Multiset.map (fun x => ↑↑x ^ k * ↑↑a ^ k) univ.val
h_multiset_map_sum :
  (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum * ↑↑a ^ k
hzero : ↑↑a ^ k - 1 = 0 ∨ (Multiset.map (fun i => ↑↑i ^ k) univ.val).sum = 0
h : ↑↑a ^ k - 1 = 0
⊢ a ^ k = 1

Proof state:
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
as_comp : (fun x => (↑↑x * ↑↑a) ^ k) = (fun x => ↑↑x ^ k) ∘ fun x => x * a
⊢ Multiset.map (fun x => ↑↑x ^ k) univ.val = Multiset.map (fun x => ↑↑x ^ k) (Multiset.map (fun x => x * a) univ.val)

Tactic:
congr

Result:
case e_s
K : Type u_1
inst✝² : CommRing K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
k : ℕ
k_pos : k ≠ 0
k_lt_card_G : k < Nat.card ↥G
a✝ : Nontrivial K
this : IsDomain K
a : ↥G
ha : a ^ k ≠ 1
as_comp : (fun x => (↑↑x * ↑↑a) ^ k) = (fun x => ↑↑x ^ k) ∘ fun x => x * a
⊢ univ.val = Multiset.map (fun x => x * a) univ.val