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

tactic: by_cases h0 : k = 0
state_before: M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
⊢ card (primitiveRoots k R) = φ k

tactic: symm
state_before: case neg
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
⊢ card (primitiveRoots k R) = φ k

tactic: refine' Finset.card_congr (fun i _ => ζ ^ i) _ _ _
state_before: case neg
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
⊢ φ k = card (primitiveRoots k R)

tactic: simp [h0]
state_before: case pos
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : k = 0
⊢ card (primitiveRoots k R) = φ k

tactic: simp only [true_and_iff, and_imp, mem_filter, mem_range, mem_univ]
state_before: case neg.refine'_1
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
⊢ ∀ (a : ℕ) (ha : a ∈ filter (Nat.coprime k) (range k)), (fun i x => ζ ^ i) a ha ∈ primitiveRoots k R

tactic: rintro i - hi
state_before: case neg.refine'_1
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
⊢ ∀ (a : ℕ), a < k → Nat.coprime k a → ζ ^ a ∈ primitiveRoots k R

tactic: rw [mem_primitiveRoots (Nat.pos_of_ne_zero h0)]
state_before: case neg.refine'_1
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
i : ℕ
hi : Nat.coprime k i
⊢ ζ ^ i ∈ primitiveRoots k R

tactic: exact h.pow_of_coprime i hi.symm
state_before: case neg.refine'_1
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
i : ℕ
hi : Nat.coprime k i
⊢ IsPrimitiveRoot (ζ ^ i) k

tactic: simp only [true_and_iff, and_imp, mem_filter, mem_range, mem_univ]
state_before: case neg.refine'_2
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
⊢ ∀ (a b : ℕ) (ha : a ∈ filter (Nat.coprime k) (range k)) (hb : b ∈ filter (Nat.coprime k) (range k)),
    (fun i x => ζ ^ i) a ha = (fun i x => ζ ^ i) b hb → a = b

tactic: rintro i j hi - hj - H
state_before: case neg.refine'_2
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
⊢ ∀ (a b : ℕ), a < k → Nat.coprime k a → b < k → Nat.coprime k b → ζ ^ a = ζ ^ b → a = b

tactic: exact h.pow_inj hi hj H
state_before: case neg.refine'_2
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
i j : ℕ
hi : i < k
hj : j < k
H : ζ ^ i = ζ ^ j
⊢ i = j

tactic: simp only [exists_prop, true_and_iff, mem_filter, mem_range, mem_univ]
state_before: case neg.refine'_3
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
⊢ ∀ (b : R), b ∈ primitiveRoots k R → ∃ a ha, (fun i x => ζ ^ i) a ha = b

tactic: intro ξ hξ
state_before: case neg.refine'_3
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
⊢ ∀ (b : R), b ∈ primitiveRoots k R → ∃ a, (a < k ∧ Nat.coprime k a) ∧ ζ ^ a = b

tactic: rw [mem_primitiveRoots (Nat.pos_of_ne_zero h0),
  h.isPrimitiveRoot_iff (Nat.pos_of_ne_zero h0)] at hξ
state_before: case neg.refine'_3
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
ξ : R
hξ : ξ ∈ primitiveRoots k R
⊢ ∃ a, (a < k ∧ Nat.coprime k a) ∧ ζ ^ a = ξ

tactic: rcases hξ with ⟨i, hin, hi, H⟩
state_before: case neg.refine'_3
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
ξ : R
hξ : ∃ i, i < k ∧ Nat.coprime i k ∧ ζ ^ i = ξ
⊢ ∃ a, (a < k ∧ Nat.coprime k a) ∧ ζ ^ a = ξ

tactic: exact ⟨i, ⟨hin, hi.symm⟩, H⟩
state_before: case neg.refine'_3.intro.intro.intro
M : Type ?u.3633248
N : Type ?u.3633251
G : Type ?u.3633254
R : Type u_1
S : Type ?u.3633260
F : Type ?u.3633263
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
h0 : ¬k = 0
ξ : R
i : ℕ
hin : i < k
hi : Nat.coprime i k
H : ζ ^ i = ξ
⊢ ∃ a, (a < k ∧ Nat.coprime k a) ∧ ζ ^ a = ξ