Theorem: sum_card_orderOf_eq_card_pow_eq_one
File: Mathlib/GroupTheory/OrderOfElement.lean

tactic: intros
state_before: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
⊢ ∀ x ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ),
    ∀ y ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ),
      x ≠ y →
        Disjoint (Finset.filter (fun x_1 => orderOf x_1 = x) Finset.univ)
          (Finset.filter (fun x => orderOf x = y) Finset.univ)
state_after: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x✝ : ℕ
a✝² : x✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ)
y✝ : ℕ
a✝¹ : y✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ)
a✝ : x✝ ≠ y✝
⊢ Disjoint (Finset.filter (fun x => orderOf x = x✝) Finset.univ) (Finset.filter (fun x => orderOf x = y✝) Finset.univ)

tactic: apply Finset.disjoint_filter.2
state_before: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x✝ : ℕ
a✝² : x✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ)
y✝ : ℕ
a✝¹ : y✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ)
a✝ : x✝ ≠ y✝
⊢ Disjoint (Finset.filter (fun x => orderOf x = x✝) Finset.univ) (Finset.filter (fun x => orderOf x = y✝) Finset.univ)
state_after: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x✝ : ℕ
a✝² : x✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ)
y✝ : ℕ
a✝¹ : y✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ)
a✝ : x✝ ≠ y✝
⊢ ∀ x ∈ Finset.univ, orderOf x = x✝ → ¬orderOf x = y✝

tactic: rintro _ _ rfl
state_before: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x✝ : ℕ
a✝² : x✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ)
y✝ : ℕ
a✝¹ : y✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ)
a✝ : x✝ ≠ y✝
⊢ ∀ x ∈ Finset.univ, orderOf x = x✝ → ¬orderOf x = y✝
state_after: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
y✝ : ℕ
a✝³ : y✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ)
x✝ : G
a✝² : x✝ ∈ Finset.univ
a✝¹ : orderOf x✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ)
a✝ : orderOf x✝ ≠ y✝
⊢ ¬orderOf x✝ = y✝

tactic: assumption
state_before: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
y✝ : ℕ
a✝³ : y✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ)
x✝ : G
a✝² : x✝ ∈ Finset.univ
a✝¹ : orderOf x✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range n.succ)
a✝ : orderOf x✝ ≠ y✝
⊢ ¬orderOf x✝ = y✝
state_after: no goals

tactic: intro x
state_before: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
⊢ ∀ (a : G),
    (a ∈
        (Finset.filter (fun x => x ∣ n) (Finset.range n.succ)).biUnion fun m =>
          Finset.filter (fun x => orderOf x = m) Finset.univ) ↔
      a ∈ Finset.filter (fun x => x ^ n = 1) Finset.univ
state_after: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x✝ : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x : G
⊢ (x ∈
      (Finset.filter (fun x => x ∣ n) (Finset.range n.succ)).biUnion fun m =>
        Finset.filter (fun x => orderOf x = m) Finset.univ) ↔
    x ∈ Finset.filter (fun x => x ^ n = 1) Finset.univ

tactic: suffices orderOf x ≤ n ∧ orderOf x ∣ n ↔ x ^ n = 1 by simpa [Nat.lt_succ_iff]
state_before: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x✝ : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x : G
⊢ (x ∈
      (Finset.filter (fun x => x ∣ n) (Finset.range n.succ)).biUnion fun m =>
        Finset.filter (fun x => orderOf x = m) Finset.univ) ↔
    x ∈ Finset.filter (fun x => x ^ n = 1) Finset.univ
state_after: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x✝ : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x : G
⊢ orderOf x ≤ n ∧ orderOf x ∣ n ↔ x ^ n = 1

tactic: exact
  ⟨fun h => by
    let ⟨m, hm⟩ := h.2
    rw [hm, pow_mul, pow_orderOf_eq_one, one_pow], fun h =>
    ⟨orderOf_le_of_pow_eq_one hn.bot_lt h, orderOf_dvd_of_pow_eq_one h⟩⟩
state_before: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x✝ : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x : G
⊢ orderOf x ≤ n ∧ orderOf x ∣ n ↔ x ^ n = 1
state_after: no goals

tactic: simpa [Nat.lt_succ_iff]
state_before: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x✝ : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x : G
this : orderOf x ≤ n ∧ orderOf x ∣ n ↔ x ^ n = 1
⊢ (x ∈
      (Finset.filter (fun x => x ∣ n) (Finset.range n.succ)).biUnion fun m =>
        Finset.filter (fun x => orderOf x = m) Finset.univ) ↔
    x ∈ Finset.filter (fun x => x ^ n = 1) Finset.univ
state_after: no goals

tactic: let ⟨m, hm⟩ := h.2
state_before: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x✝ : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x : G
h : orderOf x ≤ n ∧ orderOf x ∣ n
⊢ x ^ n = 1
state_after: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x✝ : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x : G
h : orderOf x ≤ n ∧ orderOf x ∣ n
m : ℕ
hm : n = orderOf x * m
⊢ x ^ n = 1

tactic: rw [hm, pow_mul, pow_orderOf_eq_one, one_pow]
state_before: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝² : Monoid G
x✝ : G
n : ℕ
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x : G
h : orderOf x ≤ n ∧ orderOf x ∣ n
m : ℕ
hm : n = orderOf x * m
⊢ x ^ n = 1
state_after: no goals