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

tactic: obtain (rfl|hn) := n.eq_zero_or_pos
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: 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
⊢ 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: 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 ∈ ↑(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: 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
⊢ 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: 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 : ⋯.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: simpa [← hζ.eq_orderOf, Nat.mod_eq_of_lt, hi, hj] using 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: simp
state_before: 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)
state_after: no goals

tactic: simpa using e
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
hn : n > 0
i : ℕ
hi : i < n
j : ℕ
hj : j < n
e : (fun x => ζ ^ x) i = (fun x => ζ ^ x) j
⊢ ↑(⋯.unit ^ i) = ↑(⋯.unit ^ j)
state_after: no goals