Theorem: IsPrimitiveRoot.injOn_pow
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 : ℕ
ζ✝ : M
f : F
h : IsPrimitiveRoot ζ✝ k
n : ℕ
ζ : M
hζ : IsPrimitiveRoot ζ n
⊢ Set.InjOn (fun x => ζ ^ x) ↑(range n)
state_after: case inl
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 : ℕ
ζ✝ : M
f : F
h : IsPrimitiveRoot ζ✝ k
ζ : M
hζ : IsPrimitiveRoot ζ 0
⊢ Set.InjOn (fun x => ζ ^ x) ↑(range 0)

case inr
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 : ℕ
ζ✝ : M
f : F
h : IsPrimitiveRoot ζ✝ k
n : ℕ
ζ : M
hζ : IsPrimitiveRoot ζ n
hn : n > 0
⊢ Set.InjOn (fun x => ζ ^ x) ↑(range n)
tactic: obtain (rfl|hn) := n.eq_zero_or_pos
state_before: case inr
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 : ℕ
ζ✝ : M
f : F
h : IsPrimitiveRoot ζ✝ k
n : ℕ
ζ : M
hζ : IsPrimitiveRoot ζ n
hn : n > 0
⊢ Set.InjOn (fun x => ζ ^ x) ↑(range n)
state_after: case inr
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 : ℕ
ζ✝ : M
f : F
h : IsPrimitiveRoot ζ✝ k
n : ℕ
ζ : M
hζ : IsPrimitiveRoot ζ n
hn : n > 0
i : ℕ
hi : i ∈ ↑(range n)
j : ℕ
hj : j ∈ ↑(range n)
e : (fun x => ζ ^ x) i = (fun x => ζ ^ x) j
⊢ i = j
tactic: intros i hi j hj e
state_before: case inr
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 : ℕ
ζ✝ : M
f : F
h : IsPrimitiveRoot ζ✝ k
n : ℕ
ζ : M
hζ : IsPrimitiveRoot ζ n
hn : n > 0
i : ℕ
hi : i ∈ ↑(range n)
j : ℕ
hj : j ∈ ↑(range n)
e : (fun x => ζ ^ x) i = (fun x => ζ ^ x) j
⊢ i = j
state_after: case inr
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 : ℕ
ζ✝ : M
f : F
h : IsPrimitiveRoot ζ✝ k
n : ℕ
ζ : M
hζ : IsPrimitiveRoot ζ n
hn : n > 0
i : ℕ
hi : i < n
j : ℕ
hj : j < n
e : (fun x => ζ ^ x) i = (fun x => ζ ^ x) j
⊢ i = j
tactic: rw [Finset.coe_range, Set.mem_Iio] at hi hj
state_before: case inr
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 : ℕ
ζ✝ : M
f : F
h : IsPrimitiveRoot ζ✝ k
n : ℕ
ζ : M
hζ : IsPrimitiveRoot ζ n
hn : n > 0
i : ℕ
hi : i < n
j : ℕ
hj : j < n
e : (fun x => ζ ^ x) i = (fun x => ζ ^ x) j
⊢ i = j
state_after: case inr
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 : ℕ
ζ✝ : M
f : F
h : IsPrimitiveRoot ζ✝ k
n : ℕ
ζ : M
hζ : IsPrimitiveRoot ζ n
hn : n > 0
i : ℕ
hi : i < n
j : ℕ
hj : j < n
e : (fun x => ζ ^ x) i = (fun x => ζ ^ x) j
this : ⋯.unit ^ i = ⋯.unit ^ j
⊢ i = j
tactic: have : (hζ.isUnit hn).unit ^ i = (hζ.isUnit hn).unit ^ j := Units.ext (by simpa using e)
state_before: case inr
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 : ℕ
ζ✝ : M
f : F
h : IsPrimitiveRoot ζ✝ k
n : ℕ
ζ : M
hζ : IsPrimitiveRoot ζ n
hn : n > 0
i : ℕ
hi : i < n
j : ℕ
hj : j < n
e : (fun x => ζ ^ x) i = (fun x => ζ ^ x) j
this : ⋯.unit ^ i = ⋯.unit ^ j
⊢ i = j
state_after: case inr
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 : ℕ
ζ✝ : M
f : F
h : IsPrimitiveRoot ζ✝ k
n : ℕ
ζ : M
hζ : IsPrimitiveRoot ζ n
hn : n > 0
i : ℕ
hi : i < n
j : ℕ
hj : j < n
e : (fun x => ζ ^ x) i = (fun x => ζ ^ x) j
this :
  i % orderOf ({ toFun := Units.val, map_one' := ⋯, map_mul' := ⋯ } ⋯.unit) =
    j % orderOf ({ toFun := Units.val, map_one' := ⋯, map_mul' := ⋯ } ⋯.unit)
⊢ i = j
tactic: rw [pow_inj_mod, ← orderOf_injective ⟨⟨Units.val, Units.val_one⟩, Units.val_mul⟩
    Units.ext (hζ.isUnit hn).unit] at this
state_before: case inr
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 : ℕ
ζ✝ : M
f : F
h : IsPrimitiveRoot ζ✝ k
n : ℕ
ζ : M
hζ : IsPrimitiveRoot ζ n
hn : n > 0
i : ℕ
hi : i < n
j : ℕ
hj : j < n
e : (fun x => ζ ^ x) i = (fun x => ζ ^ x) j
this :
  i % orderOf ({ toFun := Units.val, map_one' := ⋯, map_mul' := ⋯ } ⋯.unit) =
    j % orderOf ({ toFun := Units.val, map_one' := ⋯, map_mul' := ⋯ } ⋯.unit)
⊢ i = j
state_after: no goals
tactic: simpa [← hζ.eq_orderOf, Nat.mod_eq_of_lt, hi, hj] using this