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

Proof steps:
state_before: M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
k : ℕ
ζ ξ : R
h : IsPrimitiveRoot ζ k
hξ : ξ ^ k = 1
h0 : 0 < k
⊢ ∃ i < k, ζ ^ i = ξ
state_after: case intro
M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
k : ℕ
ξ : R
hξ : ξ ^ k = 1
h0 : 0 < k
ζ : Rˣ
h : IsPrimitiveRoot (↑ζ) k
⊢ ∃ i < k, ↑ζ ^ i = ξ
tactic: lift ζ to Rˣ using h.isUnit h0
state_before: case intro
M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
k : ℕ
ξ : R
hξ : ξ ^ k = 1
h0 : 0 < k
ζ : Rˣ
h : IsPrimitiveRoot (↑ζ) k
⊢ ∃ i < k, ↑ζ ^ i = ξ
state_after: case intro.intro
M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
k : ℕ
h0 : 0 < k
ζ : Rˣ
h : IsPrimitiveRoot (↑ζ) k
ξ : Rˣ
hξ : ↑ξ ^ k = 1
⊢ ∃ i < k, ↑ζ ^ i = ↑ξ
tactic: lift ξ to Rˣ using isUnit_ofPowEqOne hξ h0.ne'
state_before: case intro.intro
M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
k : ℕ
h0 : 0 < k
ζ : Rˣ
h : IsPrimitiveRoot (↑ζ) k
ξ : Rˣ
hξ : ↑ξ ^ k = 1
⊢ ∃ i < k, ↑ζ ^ i = ↑ξ
state_after: case intro.intro.intro
M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
ζ ξ : Rˣ
k : ℕ+
h : IsPrimitiveRoot ↑ζ ↑k
hξ : ↑ξ ^ ↑k = 1
⊢ ∃ i < ↑k, ↑ζ ^ i = ↑ξ
tactic: lift k to ℕ+ using h0
state_before: case intro.intro.intro
M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
ζ ξ : Rˣ
k : ℕ+
h : IsPrimitiveRoot ↑ζ ↑k
hξ : ↑ξ ^ ↑k = 1
⊢ ∃ i < ↑k, ↑ζ ^ i = ↑ξ
state_after: case intro.intro.intro
M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
ζ ξ : Rˣ
k : ℕ+
h : IsPrimitiveRoot ↑ζ ↑k
hξ : ↑ξ ^ ↑k = 1
⊢ ∃ i < ↑k, ζ ^ i = ξ
tactic: simp only [← Units.val_pow_eq_pow_val, ← Units.ext_iff]
state_before: case intro.intro.intro
M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
ζ ξ : Rˣ
k : ℕ+
h : IsPrimitiveRoot ↑ζ ↑k
hξ : ↑ξ ^ ↑k = 1
⊢ ∃ i < ↑k, ζ ^ i = ξ
state_after: case intro.intro.intro
M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
ζ ξ : Rˣ
k : ℕ+
h : IsPrimitiveRoot ζ ↑k
hξ : ↑ξ ^ ↑k = 1
⊢ ∃ i < ↑k, ζ ^ i = ξ
tactic: rw [coe_units_iff] at h
state_before: case intro.intro.intro
M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
ζ ξ : Rˣ
k : ℕ+
h : IsPrimitiveRoot ζ ↑k
hξ : ↑ξ ^ ↑k = 1
⊢ ∃ i < ↑k, ζ ^ i = ξ
state_after: case intro.intro.intro
M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
ζ ξ : Rˣ
k : ℕ+
h : IsPrimitiveRoot ζ ↑k
hξ : ↑ξ ^ ↑k = 1
⊢ ξ ∈ rootsOfUnity k R
tactic: apply h.eq_pow_of_mem_rootsOfUnity
state_before: case intro.intro.intro
M : Type u_1
N : Type u_2
G : Type u_3
R : Type u_4
S : Type u_5
F : Type u_6
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k✝
inst✝ : IsDomain R
ζ ξ : Rˣ
k : ℕ+
h : IsPrimitiveRoot ζ ↑k
hξ : ↑ξ ^ ↑k = 1
⊢ ξ ∈ rootsOfUnity k R
state_after: no goals
tactic: rw [mem_rootsOfUnity, Units.ext_iff, Units.val_pow_eq_pow_val, hξ, Units.val_one]