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

tactic: cases' Nat.eq_zero_or_pos n with hzero hpos
state_before: M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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.Nodup (nthRoots n 1)

tactic: apply (Multiset.dedup_eq_self (α := R)).1
state_before: case inr
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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.Nodup (nthRoots n 1)

tactic: rw [eq_iff_le_not_lt]
state_before: case inr
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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.dedup (nthRoots n 1) = nthRoots n 1

tactic: constructor
state_before: case inr
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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.dedup (nthRoots n 1) ≤ nthRoots n 1 ∧ ¬Multiset.dedup (nthRoots n 1) < nthRoots n 1

tactic: simp only [hzero, Multiset.nodup_zero, nthRoots_zero]
state_before: case inl
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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.Nodup (nthRoots n 1)

tactic: exact Multiset.dedup_le (nthRoots n (1 : R))
state_before: case inr.left
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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.dedup (nthRoots n 1) ≤ nthRoots n 1

tactic: by_contra ha
state_before: case inr.right
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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.dedup (nthRoots n 1) < nthRoots n 1

tactic: replace ha := Multiset.card_lt_of_lt ha
state_before: case inr.right
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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
ha : Multiset.dedup (nthRoots n 1) < nthRoots n 1
⊢ False

tactic: rw [card_nthRoots h] at ha
state_before: case inr.right
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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
ha : ↑Multiset.card (Multiset.dedup (nthRoots n 1)) < ↑Multiset.card (nthRoots n 1)
⊢ False

tactic: have hrw : Multiset.card (nthRoots n (1 : R)).dedup =
    Fintype.card { x // x ∈ nthRoots n (1 : R) } := by
  set fs := (⟨(nthRoots n (1 : R)).dedup, Multiset.nodup_dedup _⟩ : Finset R)
  rw [← Finset.card_mk, Fintype.card_of_subtype fs _]
  intro x
  simp only [Multiset.mem_dedup, Finset.mem_mk]
state_before: case inr.right
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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
ha : ↑Multiset.card (Multiset.dedup (nthRoots n 1)) < n
⊢ False

tactic: rw [← PNat.toPNat'_coe hpos] at h hrw ha
state_before: case inr.right
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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
ha : ↑Multiset.card (Multiset.dedup (nthRoots n 1)) < n
hrw : ↑Multiset.card (Multiset.dedup (nthRoots n 1)) = Fintype.card { x // x ∈ nthRoots n 1 }
⊢ False

tactic: set m := Nat.toPNat' n
state_before: case inr.right
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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
ha : ↑Multiset.card (Multiset.dedup (nthRoots (↑(Nat.toPNat' n)) 1)) < ↑(Nat.toPNat' n)
hrw :
  ↑Multiset.card (Multiset.dedup (nthRoots (↑(Nat.toPNat' n)) 1)) =
    Fintype.card { x // x ∈ nthRoots (↑(Nat.toPNat' n)) 1 }
⊢ False

tactic: rw [hrw, ← Fintype.card_congr (rootsOfUnityEquivNthRoots R m), card_rootsOfUnity h] at ha
state_before: case inr.right
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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
ha : ↑Multiset.card (Multiset.dedup (nthRoots (↑m) 1)) < ↑m
hrw : ↑Multiset.card (Multiset.dedup (nthRoots (↑m) 1)) = Fintype.card { x // x ∈ nthRoots (↑m) 1 }
⊢ False

tactic: exact Nat.lt_asymm ha ha
state_before: case inr.right
M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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
ha : ↑m < ↑m
hrw : ↑Multiset.card (Multiset.dedup (nthRoots (↑m) 1)) = Fintype.card { x // x ∈ nthRoots (↑m) 1 }
⊢ False

tactic: set fs := (⟨(nthRoots n (1 : R)).dedup, Multiset.nodup_dedup _⟩ : Finset R)
state_before: M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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
ha : ↑Multiset.card (Multiset.dedup (nthRoots n 1)) < n
⊢ ↑Multiset.card (Multiset.dedup (nthRoots n 1)) = Fintype.card { x // x ∈ nthRoots n 1 }

tactic: rw [← Finset.card_mk, Fintype.card_of_subtype fs _]
state_before: M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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
ha : ↑Multiset.card (Multiset.dedup (nthRoots n 1)) < n
fs : Finset R := { val := Multiset.dedup (nthRoots n 1), nodup := (_ : Multiset.Nodup (Multiset.dedup (nthRoots n 1))) }
⊢ ↑Multiset.card (Multiset.dedup (nthRoots n 1)) = Fintype.card { x // x ∈ nthRoots n 1 }

tactic: intro x
state_before: M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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
ha : ↑Multiset.card (Multiset.dedup (nthRoots n 1)) < n
fs : Finset R := { val := Multiset.dedup (nthRoots n 1), nodup := (_ : Multiset.Nodup (Multiset.dedup (nthRoots n 1))) }
⊢ ∀ (x : R), x ∈ fs ↔ x ∈ nthRoots n 1

tactic: simp only [Multiset.mem_dedup, Finset.mem_mk]
state_before: M : Type ?u.3600187
N : Type ?u.3600190
G : Type ?u.3600193
R : Type u_1
S : Type ?u.3600199
F : Type ?u.3600202
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
ha : ↑Multiset.card (Multiset.dedup (nthRoots n 1)) < n
fs : Finset R := { val := Multiset.dedup (nthRoots n 1), nodup := (_ : Multiset.Nodup (Multiset.dedup (nthRoots n 1))) }
x : R
⊢ x ∈ fs ↔ x ∈ nthRoots n 1