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

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
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
cases' Nat.eq_zero_or_pos n with hzero hpos
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
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
rw [eq_iff_le_not_lt]
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
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
use card_nthRoots n 1
no goals
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
simp only [hzero, Multiset.card_zero, nthRoots_zero]
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)
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
rw [not_lt]
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)
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)
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 _)
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)
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)
rw [Multiset.card_attach] at hcard
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)
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)
rw [← PNat.toPNat'_coe hpos] at hcard h ⊢
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)
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)
set m := Nat.toPNat' n
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)
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)
rw [← Fintype.card_congr (rootsOfUnityEquivNthRoots R m), card_rootsOfUnity h] at hcard
no goals
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)
exact hcard