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

tactic: cases' exists_eq_mul_right_of_dvd (orderOf_dvd_of_pow_eq_one hx) with a ha
state_before: G : Type u
A : Type v
x y : G
a b : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
⊢ orderOf x = n

tactic: suffices a = 1 by simp [this, ha]
state_before: case intro
G : Type u
A : Type v
x y : G
a✝ b : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
a : ℕ
ha : n = orderOf x * a
⊢ orderOf x = n

tactic: by_contra h
state_before: case intro
G : Type u
A : Type v
x y : G
a✝ b : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
a : ℕ
ha : n = orderOf x * a
⊢ a = 1

tactic: have a_min_fac_dvd_p_sub_one : a.minFac ∣ n := by
  obtain ⟨b, hb⟩ : ∃ b : ℕ, a = b * a.minFac := exists_eq_mul_left_of_dvd a.minFac_dvd
  rw [hb, ← mul_assoc] at ha
  exact Dvd.intro_left (orderOf x * b) ha.symm
state_before: case intro
G : Type u
A : Type v
x y : G
a✝ b : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
a : ℕ
ha : n = orderOf x * a
h : ¬a = 1
⊢ False

tactic: refine' hd a.minFac (Nat.minFac_prime h) a_min_fac_dvd_p_sub_one _
state_before: case intro
G : Type u
A : Type v
x y : G
a✝ b : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
a : ℕ
ha : n = orderOf x * a
h : ¬a = 1
a_min_fac_dvd_p_sub_one : minFac a ∣ n
⊢ False

tactic: rw [← orderOf_dvd_iff_pow_eq_one, Nat.dvd_div_iff a_min_fac_dvd_p_sub_one, ha, mul_comm,
  Nat.mul_dvd_mul_iff_left (orderOf_pos' _)]
state_before: case intro
G : Type u
A : Type v
x y : G
a✝ b : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
a : ℕ
ha : n = orderOf x * a
h : ¬a = 1
a_min_fac_dvd_p_sub_one : minFac a ∣ n
⊢ x ^ (n / minFac a) = 1

tactic: simp [this, ha]
state_before: G : Type u
A : Type v
x y : G
a✝ b : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
a : ℕ
ha : n = orderOf x * a
this : a = 1
⊢ orderOf x = n

tactic: obtain ⟨b, hb⟩ : ∃ b : ℕ, a = b * a.minFac := exists_eq_mul_left_of_dvd a.minFac_dvd
state_before: G : Type u
A : Type v
x y : G
a✝ b : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
a : ℕ
ha : n = orderOf x * a
h : ¬a = 1
⊢ minFac a ∣ n

tactic: rw [hb, ← mul_assoc] at ha
state_before: case intro
G : Type u
A : Type v
x y : G
a✝ b✝ : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
a : ℕ
ha : n = orderOf x * a
h : ¬a = 1
b : ℕ
hb : a = b * minFac a
⊢ minFac a ∣ n

tactic: exact Dvd.intro_left (orderOf x * b) ha.symm
state_before: case intro
G : Type u
A : Type v
x y : G
a✝ b✝ : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
a : ℕ
h : ¬a = 1
b : ℕ
ha : n = orderOf x * b * minFac a
hb : a = b * minFac a
⊢ minFac a ∣ n

tactic: exact Nat.minFac_dvd a
state_before: case intro
G : Type u
A : Type v
x y : G
a✝ b : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
a : ℕ
ha : n = orderOf x * a
h : ¬a = 1
a_min_fac_dvd_p_sub_one : minFac a ∣ n
⊢ minFac a ∣ a

tactic: rw [isOfFinOrder_iff_pow_eq_one]
state_before: G : Type u
A : Type v
x y : G
a✝ b : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
a : ℕ
ha : n = orderOf x * a
h : ¬a = 1
a_min_fac_dvd_p_sub_one : minFac a ∣ n
⊢ IsOfFinOrder x

tactic: exact Exists.intro n (id ⟨hn, hx⟩)
state_before: G : Type u
A : Type v
x y : G
a✝ b : A
n m : ℕ
inst✝¹ : Monoid G
inst✝ : AddMonoid A
hn : 0 < n
hx : x ^ n = 1
hd : ∀ (p : ℕ), Nat.Prime p → p ∣ n → x ^ (n / p) ≠ 1
a : ℕ
ha : n = orderOf x * a
h : ¬a = 1
a_min_fac_dvd_p_sub_one : minFac a ∣ n
⊢ ∃ n, 0 < n ∧ x ^ n = 1