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

tactic: cases' Nat.eq_zero_or_pos n with hzero hpos
state_before: M : Type ?u.3547388
N : Type ?u.3547391
G : Type ?u.3547394
R : Type u_1
S : Type ?u.3547400
F : Type ?u.3547403
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k
inst✝ : IsDomain R
ζ : R
n : ℕ
h : IsPrimitiveRoot ζ n
⊢ ↑Multiset.card (nthRoots n 1) = n

tactic: rw [eq_iff_le_not_lt]
state_before: case inr
M : Type ?u.3547388
N : Type ?u.3547391
G : Type ?u.3547394
R : Type u_1
S : Type ?u.3547400
F : Type ?u.3547403
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k
inst✝ : IsDomain R
ζ : R
n : ℕ
h : IsPrimitiveRoot ζ n
hpos : n > 0
⊢ ↑Multiset.card (nthRoots n 1) = n

tactic: use card_nthRoots n 1
state_before: case inr
M : Type ?u.3547388
N : Type ?u.3547391
G : Type ?u.3547394
R : Type u_1
S : Type ?u.3547400
F : Type ?u.3547403
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k
inst✝ : IsDomain R
ζ : R
n : ℕ
h : IsPrimitiveRoot ζ n
hpos : n > 0
⊢ ↑Multiset.card (nthRoots n 1) ≤ n ∧ ¬↑Multiset.card (nthRoots n 1) < n

tactic: simp only [hzero, Multiset.card_zero, nthRoots_zero]
state_before: case inl
M : Type ?u.3547388
N : Type ?u.3547391
G : Type ?u.3547394
R : Type u_1
S : Type ?u.3547400
F : Type ?u.3547403
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k
inst✝ : IsDomain R
ζ : R
n : ℕ
h : IsPrimitiveRoot ζ n
hzero : n = 0
⊢ ↑Multiset.card (nthRoots n 1) = n

tactic: rw [not_lt]
state_before: case inr
M : Type ?u.3547388
N : Type ?u.3547391
G : Type ?u.3547394
R : Type u_1
S : Type ?u.3547400
F : Type ?u.3547403
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k
inst✝ : IsDomain R
ζ : R
n : ℕ
h : IsPrimitiveRoot ζ n
hpos : n > 0
⊢ ¬↑Multiset.card (nthRoots n 1) < n

tactic: have hcard :
    Fintype.card { x // x ∈ nthRoots n (1 : R) } ≤ Multiset.card (nthRoots n (1 : R)).attach :=
  Multiset.card_le_of_le (Multiset.dedup_le _)
state_before: case inr
M : Type ?u.3547388
N : Type ?u.3547391
G : Type ?u.3547394
R : Type u_1
S : Type ?u.3547400
F : Type ?u.3547403
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k
inst✝ : IsDomain R
ζ : R
n : ℕ
h : IsPrimitiveRoot ζ n
hpos : n > 0
⊢ n ≤ ↑Multiset.card (nthRoots n 1)

tactic: rw [Multiset.card_attach] at hcard
state_before: case inr
M : Type ?u.3547388
N : Type ?u.3547391
G : Type ?u.3547394
R : Type u_1
S : Type ?u.3547400
F : Type ?u.3547403
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k
inst✝ : IsDomain R
ζ : R
n : ℕ
h : IsPrimitiveRoot ζ n
hpos : n > 0
hcard : Fintype.card { x // x ∈ nthRoots n 1 } ≤ ↑Multiset.card (Multiset.attach (nthRoots n 1))
⊢ n ≤ ↑Multiset.card (nthRoots n 1)

tactic: rw [← PNat.toPNat'_coe hpos] at hcard h ⊢
state_before: case inr
M : Type ?u.3547388
N : Type ?u.3547391
G : Type ?u.3547394
R : Type u_1
S : Type ?u.3547400
F : Type ?u.3547403
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k
inst✝ : IsDomain R
ζ : R
n : ℕ
h : IsPrimitiveRoot ζ n
hpos : n > 0
hcard : Fintype.card { x // x ∈ nthRoots n 1 } ≤ ↑Multiset.card (nthRoots n 1)
⊢ n ≤ ↑Multiset.card (nthRoots n 1)

tactic: set m := Nat.toPNat' n
state_before: case inr
M : Type ?u.3547388
N : Type ?u.3547391
G : Type ?u.3547394
R : Type u_1
S : Type ?u.3547400
F : Type ?u.3547403
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k
inst✝ : IsDomain R
ζ : R
n : ℕ
h : IsPrimitiveRoot ζ ↑(Nat.toPNat' n)
hpos : n > 0
hcard : Fintype.card { x // x ∈ nthRoots (↑(Nat.toPNat' n)) 1 } ≤ ↑Multiset.card (nthRoots (↑(Nat.toPNat' n)) 1)
⊢ ↑(Nat.toPNat' n) ≤ ↑Multiset.card (nthRoots (↑(Nat.toPNat' n)) 1)

tactic: rw [← Fintype.card_congr (rootsOfUnityEquivNthRoots R m), card_rootsOfUnity h] at hcard
state_before: case inr
M : Type ?u.3547388
N : Type ?u.3547391
G : Type ?u.3547394
R : Type u_1
S : Type ?u.3547400
F : Type ?u.3547403
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k
inst✝ : IsDomain R
ζ : R
n : ℕ
hpos : n > 0
m : ℕ+ := Nat.toPNat' n
h : IsPrimitiveRoot ζ ↑m
hcard : Fintype.card { x // x ∈ nthRoots (↑m) 1 } ≤ ↑Multiset.card (nthRoots (↑m) 1)
⊢ ↑m ≤ ↑Multiset.card (nthRoots (↑m) 1)

tactic: exact hcard
state_before: case inr
M : Type ?u.3547388
N : Type ?u.3547391
G : Type ?u.3547394
R : Type u_1
S : Type ?u.3547400
F : Type ?u.3547403
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
h✝ : IsPrimitiveRoot ζ✝ k
inst✝ : IsDomain R
ζ : R
n : ℕ
hpos : n > 0
m : ℕ+ := Nat.toPNat' n
h : IsPrimitiveRoot ζ ↑m
hcard : ↑m ≤ ↑Multiset.card (nthRoots (↑m) 1)
⊢ ↑m ≤ ↑Multiset.card (nthRoots (↑m) 1)