Theorem: IsPrimitiveRoot.zpow_eq_one_iff_dvd
File: Mathlib/RingTheory/RootsOfUnity/Basic.lean

tactic: by_cases h0 : 0 ≤ l
state_before: M : Type ?u.2651834
N : Type ?u.2651837
G : Type u_1
R : Type ?u.2651843
S : Type ?u.2651846
F : Type ?u.2651849
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l✝ : ℕ
ζ : G
h : IsPrimitiveRoot ζ k
l : ℤ
⊢ ζ ^ l = 1 ↔ ↑k ∣ l

tactic: lift l to ℕ using h0
state_before: case pos
M : Type ?u.2651834
N : Type ?u.2651837
G : Type u_1
R : Type ?u.2651843
S : Type ?u.2651846
F : Type ?u.2651849
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l✝ : ℕ
ζ : G
h : IsPrimitiveRoot ζ k
l : ℤ
h0 : 0 ≤ l
⊢ ζ ^ l = 1 ↔ ↑k ∣ l

tactic: rw [zpow_ofNat]
state_before: case pos.intro
M : Type ?u.2651834
N : Type ?u.2651837
G : Type u_1
R : Type ?u.2651843
S : Type ?u.2651846
F : Type ?u.2651849
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l✝ : ℕ
ζ : G
h : IsPrimitiveRoot ζ k
l : ℕ
⊢ ζ ^ ↑l = 1 ↔ ↑k ∣ ↑l

tactic: norm_cast
state_before: case pos.intro
M : Type ?u.2651834
N : Type ?u.2651837
G : Type u_1
R : Type ?u.2651843
S : Type ?u.2651846
F : Type ?u.2651849
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l✝ : ℕ
ζ : G
h : IsPrimitiveRoot ζ k
l : ℕ
⊢ ζ ^ l = 1 ↔ ↑k ∣ ↑l

tactic: exact h.pow_eq_one_iff_dvd l
state_before: case pos.intro
M : Type ?u.2651834
N : Type ?u.2651837
G : Type u_1
R : Type ?u.2651843
S : Type ?u.2651846
F : Type ?u.2651849
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l✝ : ℕ
ζ : G
h : IsPrimitiveRoot ζ k
l : ℕ
⊢ ζ ^ l = 1 ↔ k ∣ l

tactic: have : 0 ≤ -l := by simp only [not_le, neg_nonneg] at h0 ⊢; exact le_of_lt h0
state_before: case neg
M : Type ?u.2651834
N : Type ?u.2651837
G : Type u_1
R : Type ?u.2651843
S : Type ?u.2651846
F : Type ?u.2651849
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l✝ : ℕ
ζ : G
h : IsPrimitiveRoot ζ k
l : ℤ
h0 : ¬0 ≤ l
⊢ ζ ^ l = 1 ↔ ↑k ∣ l

tactic: lift -l to ℕ using this with l' hl'
state_before: case neg
M : Type ?u.2651834
N : Type ?u.2651837
G : Type u_1
R : Type ?u.2651843
S : Type ?u.2651846
F : Type ?u.2651849
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l✝ : ℕ
ζ : G
h : IsPrimitiveRoot ζ k
l : ℤ
h0 : ¬0 ≤ l
this : 0 ≤ -l
⊢ ζ ^ l = 1 ↔ ↑k ∣ l

tactic: rw [← dvd_neg, ← hl']
state_before: case neg.intro
M : Type ?u.2651834
N : Type ?u.2651837
G : Type u_1
R : Type ?u.2651843
S : Type ?u.2651846
F : Type ?u.2651849
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l✝ : ℕ
ζ : G
h : IsPrimitiveRoot ζ k
l : ℤ
h0 : ¬0 ≤ l
l' : ℕ
hl' : ↑l' = -l
⊢ ζ ^ l = 1 ↔ ↑k ∣ l

tactic: norm_cast
state_before: case neg.intro
M : Type ?u.2651834
N : Type ?u.2651837
G : Type u_1
R : Type ?u.2651843
S : Type ?u.2651846
F : Type ?u.2651849
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l✝ : ℕ
ζ : G
h : IsPrimitiveRoot ζ k
l : ℤ
h0 : ¬0 ≤ l
l' : ℕ
hl' : ↑l' = -l
⊢ ζ ^ l = 1 ↔ ↑k ∣ ↑l'

tactic: rw [← h.pow_eq_one_iff_dvd, ← inv_inj, ← zpow_neg, ← hl', zpow_ofNat, inv_one]
state_before: case neg.intro
M : Type ?u.2651834
N : Type ?u.2651837
G : Type u_1
R : Type ?u.2651843
S : Type ?u.2651846
F : Type ?u.2651849
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l✝ : ℕ
ζ : G
h : IsPrimitiveRoot ζ k
l : ℤ
h0 : ¬0 ≤ l
l' : ℕ
hl' : ↑l' = -l
⊢ ζ ^ l = 1 ↔ k ∣ l'

tactic: simp only [not_le, neg_nonneg] at h0 ⊢
state_before: M : Type ?u.2651834
N : Type ?u.2651837
G : Type u_1
R : Type ?u.2651843
S : Type ?u.2651846
F : Type ?u.2651849
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l✝ : ℕ
ζ : G
h : IsPrimitiveRoot ζ k
l : ℤ
h0 : ¬0 ≤ l
⊢ 0 ≤ -l

tactic: exact le_of_lt h0
state_before: M : Type ?u.2651834
N : Type ?u.2651837
G : Type u_1
R : Type ?u.2651843
S : Type ?u.2651846
F : Type ?u.2651849
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l✝ : ℕ
ζ : G
h : IsPrimitiveRoot ζ k
l : ℤ
h0 : l < 0
⊢ l ≤ 0