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

tactic: intros
state_before: G : Type u
A : Type v
x y : G
a b : A
n m : ℕ
inst✝² : Monoid G
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
⊢ ∀ (x : ℕ),
    x ∈ Finset.filter (fun x => x ∣ n) (Finset.range (succ n)) →
      ∀ (y : ℕ),
        y ∈ Finset.filter (fun x => x ∣ n) (Finset.range (succ n)) →
          x ≠ y →
            Disjoint (Finset.filter (fun x_1 => orderOf x_1 = x) Finset.univ)
              (Finset.filter (fun x => orderOf x = y) Finset.univ)

tactic: apply Finset.disjoint_filter.2
state_before: G : Type u
A : Type v
x y : G
a b : A
n m : ℕ
inst✝² : Monoid G
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x✝ : ℕ
a✝² : x✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range (succ n))
y✝ : ℕ
a✝¹ : y✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range (succ n))
a✝ : x✝ ≠ y✝
⊢ Disjoint (Finset.filter (fun x => orderOf x = x✝) Finset.univ) (Finset.filter (fun x => orderOf x = y✝) Finset.univ)

tactic: rintro _ _ rfl
state_before: G : Type u
A : Type v
x y : G
a b : A
n m : ℕ
inst✝² : Monoid G
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x✝ : ℕ
a✝² : x✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range (succ n))
y✝ : ℕ
a✝¹ : y✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range (succ n))
a✝ : x✝ ≠ y✝
⊢ ∀ (x : G), x ∈ Finset.univ → orderOf x = x✝ → ¬orderOf x = y✝

tactic: assumption
state_before: G : Type u
A : Type v
x y : G
a b : A
n m : ℕ
inst✝² : Monoid G
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
y✝ : ℕ
a✝³ : y✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range (succ n))
x✝ : G
a✝² : x✝ ∈ Finset.univ
a✝¹ : orderOf x✝ ∈ Finset.filter (fun x => x ∣ n) (Finset.range (succ n))
a✝ : orderOf x✝ ≠ y✝
⊢ ¬orderOf x✝ = y✝

tactic: intro x
state_before: G : Type u
A : Type v
x y : G
a b : A
n m : ℕ
inst✝² : Monoid G
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
⊢ ∀ (a : G),
    (a ∈
        Finset.biUnion (Finset.filter (fun x => x ∣ n) (Finset.range (succ n))) fun m =>
          Finset.filter (fun x => orderOf x = m) Finset.univ) ↔
      a ∈ 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
A : Type v
x✝ y : G
a b : A
n m : ℕ
inst✝² : Monoid G
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x : G
⊢ (x ∈
      Finset.biUnion (Finset.filter (fun x => x ∣ n) (Finset.range (succ n))) fun m =>
        Finset.filter (fun x => orderOf x = m) Finset.univ) ↔
    x ∈ Finset.filter (fun x => x ^ n = 1) Finset.univ

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
A : Type v
x✝ y : G
a b : A
n m : ℕ
inst✝² : Monoid G
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x : G
⊢ orderOf x ≤ n ∧ orderOf x ∣ n ↔ x ^ n = 1

tactic: simpa [Nat.lt_succ_iff]
state_before: G : Type u
A : Type v
x✝ y : G
a b : A
n m : ℕ
inst✝² : Monoid G
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x : G
this : orderOf x ≤ n ∧ orderOf x ∣ n ↔ x ^ n = 1
⊢ (x ∈
      Finset.biUnion (Finset.filter (fun x => x ∣ n) (Finset.range (succ n))) fun m =>
        Finset.filter (fun x => orderOf x = m) Finset.univ) ↔
    x ∈ Finset.filter (fun x => x ^ n = 1) Finset.univ

tactic: let ⟨m, hm⟩ := h.2
state_before: G : Type u
A : Type v
x✝ y : G
a b : A
n m : ℕ
inst✝² : Monoid G
inst✝¹ : Fintype G
inst✝ : DecidableEq G
hn : n ≠ 0
x : G
h : orderOf x ≤ n ∧ orderOf x ∣ n
⊢ x ^ n = 1

tactic: rw [hm, pow_mul, pow_orderOf_eq_one, one_pow]
state_before: G : Type u
A : Type v
x✝ y : G
a b : A
n m✝ : ℕ
inst✝² : Monoid G
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