-- 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
⊢ (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = 0

Tactic:
have h_multiset_map_sum : (Multiset.map (fun x : G => ((x : Kˣ) : K) ^ k) Finset.univ.val).sum =
  (Multiset.map (fun x : G => ((x : Kˣ) : K) ^ k * ((a : Kˣ) : K) ^ k) Finset.univ.val).sum := by
  rw [h_multiset_map]

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 * ↑↑a ^ k) univ.val).sum
⊢ (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
⊢ ∑ x : ↥G, ↑↑x ^ k = 0

Tactic:
rcases (exists_pow_ne_one_of_isCyclic k_pos k_lt_card_G) with ⟨a, 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
⊢ ∑ x : ↥G, ↑↑x ^ k = 0

Proof state:
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

Tactic:
rw [← sub_eq_zero]

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 = 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
⊢ (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = 0

Tactic:
have hzero : (((a : Kˣ) : K) ^ k - 1 : K)
                * (Multiset.map (fun i : G => (i.val : K) ^ k) Finset.univ.val).sum = 0 := by
  rw [sub_mul, mul_comm, ← h_multiset_map_sum, one_mul, sub_self]

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) * (Multiset.map (fun i => ↑↑i ^ k) univ.val).sum = 0
⊢ (Multiset.map (fun x => ↑↑x ^ k) univ.val).sum = 0

Proof state:
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
⊢ Multiset.map (fun x => x * a) univ.val = univ.val

Tactic:
exact Multiset.map_univ_val_equiv (Equiv.mulRight a)

Result:
no goals

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 < Fintype.card ↥G
⊢ ∑ x : ↥G, ↑↑x ^ k = 0

Tactic:
rw [← Nat.card_eq_fintype_card] at k_lt_card_G

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
⊢ ∑ x : ↥G, ↑↑x ^ k = 0

Proof state:
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

Tactic:
rw [eq_comm]

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
⊢ Multiset.map (fun x => x * a) univ.val = univ.val

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
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
⊢ (↑↑a ^ k - 1) * (Multiset.map (fun i => ↑↑i ^ k) univ.val).sum = 0

Tactic:
rw [sub_mul, mul_comm, ← h_multiset_map_sum, one_mul, sub_self]

Result:
no goals

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
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 = (Multiset.map (fun x => ↑↑x ^ k * ↑↑a ^ k) univ.val).sum

Tactic:
rw [h_multiset_map]

Result:
no goals