Theorem: FiniteField.sum_subgroup_units_eq_zero
File: Mathlib/FieldTheory/Finite/Basic.lean

tactic: rw [Subgroup.ne_bot_iff_exists_ne_one] at hg
state_before: K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
hg : G ≠ ⊥
⊢ ∑ x : ↥G, ↑↑x = 0
state_after: K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
hg : ∃ a, a ≠ 1
⊢ ∑ x : ↥G, ↑↑x = 0

tactic: rcases hg with ⟨a, ha⟩
state_before: K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
hg : ∃ a, a ≠ 1
⊢ ∑ x : ↥G, ↑↑x = 0
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
⊢ ∑ x : ↥G, ↑↑x = 0

tactic: let a_mul_emb : G ↪ G := mulLeftEmbedding a
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
⊢ ∑ x : ↥G, ↑↑x = 0
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
⊢ ∑ x : ↥G, ↑↑x = 0

tactic: have h_unchanged : Finset.univ.map a_mul_emb = Finset.univ := by simp
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
⊢ ∑ x : ↥G, ↑↑x = 0
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
⊢ ∑ x : ↥G, ↑↑x = 0

tactic: have h_sum_map := Finset.univ.sum_map a_mul_emb fun x => ((x : Kˣ) : K)
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
⊢ ∑ x : ↥G, ↑↑x = 0
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x ∈ map a_mul_emb univ, ↑↑x = ∑ x : ↥G, ↑↑(a_mul_emb x)
⊢ ∑ x : ↥G, ↑↑x = 0

tactic: simp only [a_mul_emb, h_unchanged, Function.Embedding.coeFn_mk, Function.Embedding.toFun_eq_coe,
  mulLeftEmbedding_apply, Submonoid.coe_mul, Subgroup.coe_toSubmonoid, Units.val_mul,
  ← Finset.mul_sum] at h_sum_map
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x ∈ map a_mul_emb univ, ↑↑x = ∑ x : ↥G, ↑↑(a_mul_emb x)
⊢ ∑ x : ↥G, ↑↑x = 0
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x : ↥G, ↑↑x = ↑↑a * ∑ x : ↥G, ↑↑x
⊢ ∑ x : ↥G, ↑↑x = 0

tactic: have hzero : (((a : Kˣ) : K) - 1) = 0 ∨ ∑ x : ↥G, ((x : Kˣ) : K) = 0 := by
  rw [← mul_eq_zero, sub_mul, ← h_sum_map, one_mul, sub_self]
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x : ↥G, ↑↑x = ↑↑a * ∑ x : ↥G, ↑↑x
⊢ ∑ x : ↥G, ↑↑x = 0
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x : ↥G, ↑↑x = ↑↑a * ∑ x : ↥G, ↑↑x
hzero : ↑↑a - 1 = 0 ∨ ∑ x : ↥G, ↑↑x = 0
⊢ ∑ x : ↥G, ↑↑x = 0

tactic: apply Or.resolve_left hzero
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x : ↥G, ↑↑x = ↑↑a * ∑ x : ↥G, ↑↑x
hzero : ↑↑a - 1 = 0 ∨ ∑ x : ↥G, ↑↑x = 0
⊢ ∑ x : ↥G, ↑↑x = 0
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x : ↥G, ↑↑x = ↑↑a * ∑ x : ↥G, ↑↑x
hzero : ↑↑a - 1 = 0 ∨ ∑ x : ↥G, ↑↑x = 0
⊢ ¬↑↑a - 1 = 0

tactic: contrapose! ha
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x : ↥G, ↑↑x = ↑↑a * ∑ x : ↥G, ↑↑x
hzero : ↑↑a - 1 = 0 ∨ ∑ x : ↥G, ↑↑x = 0
⊢ ¬↑↑a - 1 = 0
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x : ↥G, ↑↑x = ↑↑a * ∑ x : ↥G, ↑↑x
hzero : ↑↑a - 1 = 0 ∨ ∑ x : ↥G, ↑↑x = 0
ha : ↑↑a - 1 = 0
⊢ a = 1

tactic: ext
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x : ↥G, ↑↑x = ↑↑a * ∑ x : ↥G, ↑↑x
hzero : ↑↑a - 1 = 0 ∨ ∑ x : ↥G, ↑↑x = 0
ha : ↑↑a - 1 = 0
⊢ a = 1
state_after: case intro.a.a
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x : ↥G, ↑↑x = ↑↑a * ∑ x : ↥G, ↑↑x
hzero : ↑↑a - 1 = 0 ∨ ∑ x : ↥G, ↑↑x = 0
ha : ↑↑a - 1 = 0
⊢ ↑↑a = ↑↑1

tactic: rwa [← sub_eq_zero]
state_before: case intro.a.a
K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x : ↥G, ↑↑x = ↑↑a * ∑ x : ↥G, ↑↑x
hzero : ↑↑a - 1 = 0 ∨ ∑ x : ↥G, ↑↑x = 0
ha : ↑↑a - 1 = 0
⊢ ↑↑a = ↑↑1
state_after: no goals

tactic: simp
state_before: K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
⊢ map a_mul_emb univ = univ
state_after: no goals

tactic: rw [← mul_eq_zero, sub_mul, ← h_sum_map, one_mul, sub_self]
state_before: K : Type u_1
R : Type u_2
inst✝² : Ring K
inst✝¹ : NoZeroDivisors K
G : Subgroup Kˣ
inst✝ : Fintype ↥G
a : ↥G
ha : a ≠ 1
a_mul_emb : ↥G ↪ ↥G := mulLeftEmbedding a
h_unchanged : map a_mul_emb univ = univ
h_sum_map : ∑ x : ↥G, ↑↑x = ↑↑a * ∑ x : ↥G, ↑↑x
⊢ ↑↑a - 1 = 0 ∨ ∑ x : ↥G, ↑↑x = 0
state_after: no goals