Theorem: IsPrimitiveRoot.nthRoots_one_eq_biUnion_primitiveRoots'
File: Mathlib/RingTheory/RootsOfUnity/Basic.lean

tactic: symm
state_before: M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
⊢ nthRootsFinset (↑n) R = Finset.biUnion (Nat.divisors ↑n) fun i => primitiveRoots i R

tactic: apply Finset.eq_of_subset_of_card_le
state_before: M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
⊢ (Finset.biUnion (Nat.divisors ↑n) fun i => primitiveRoots i R) = nthRootsFinset (↑n) R

tactic: intro x
state_before: case h
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
⊢ (Finset.biUnion (Nat.divisors ↑n) fun i => primitiveRoots i R) ⊆ nthRootsFinset (↑n) R

tactic: simp only [nthRootsFinset, ← Multiset.toFinset_eq (nthRoots_nodup h), exists_prop,
  Finset.mem_biUnion, Finset.mem_filter, Finset.mem_range, mem_nthRoots, Finset.mem_mk,
  Nat.mem_divisors, and_true_iff, Ne.def, PNat.ne_zero, PNat.pos, not_false_iff]
state_before: case h
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
x : R
⊢ (x ∈ Finset.biUnion (Nat.divisors ↑n) fun i => primitiveRoots i R) → x ∈ nthRootsFinset (↑n) R

tactic: rintro ⟨a, ⟨d, hd⟩, ha⟩
state_before: case h
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
x : R
⊢ (∃ a, a ∣ ↑n ∧ x ∈ primitiveRoots a R) → x ^ ↑n = 1

tactic: have hazero : 0 < a := by
  contrapose! hd with ha0
  simp_all only [nonpos_iff_eq_zero, MulZeroClass.zero_mul]
  exact n.ne_zero
state_before: case h.intro.intro.intro
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
x : R
a : ℕ
ha : x ∈ primitiveRoots a R
d : ℕ
hd : ↑n = a * d
⊢ x ^ ↑n = 1

tactic: rw [mem_primitiveRoots hazero] at ha
state_before: case h.intro.intro.intro
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
x : R
a : ℕ
ha : x ∈ primitiveRoots a R
d : ℕ
hd : ↑n = a * d
hazero : 0 < a
⊢ x ^ ↑n = 1

tactic: rw [hd, pow_mul, ha.pow_eq_one, one_pow]
state_before: case h.intro.intro.intro
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
x : R
a : ℕ
ha : IsPrimitiveRoot x a
d : ℕ
hd : ↑n = a * d
hazero : 0 < a
⊢ x ^ ↑n = 1

tactic: contrapose! hd with ha0
state_before: M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
x : R
a : ℕ
ha : x ∈ primitiveRoots a R
d : ℕ
hd : ↑n = a * d
⊢ 0 < a

tactic: simp_all only [nonpos_iff_eq_zero, MulZeroClass.zero_mul]
state_before: M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
x : R
a : ℕ
ha : x ∈ primitiveRoots a R
d : ℕ
ha0 : a ≤ 0
⊢ ↑n ≠ a * d

tactic: exact n.ne_zero
state_before: M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
inst✝¹ : CommRing R
ζ✝ : Rˣ
inst✝ : IsDomain R
ζ : R
n : ℕ+
x : R
a d : ℕ
h✝ : IsPrimitiveRoot ζ✝ k
h : IsPrimitiveRoot ζ ↑n
ha : x ∈ primitiveRoots 0 R
ha0 : a = 0
⊢ ↑n ≠ 0

tactic: apply le_of_eq
state_before: case h₂
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
⊢ card (nthRootsFinset (↑n) R) ≤ card (Finset.biUnion (Nat.divisors ↑n) fun i => primitiveRoots i R)

tactic: rw [h.card_nthRootsFinset, Finset.card_biUnion]
state_before: case h₂.a
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
⊢ card (nthRootsFinset (↑n) R) = card (Finset.biUnion (Nat.divisors ↑n) fun i => primitiveRoots i R)

tactic: nth_rw 1 [← Nat.sum_totient n]
state_before: case h₂.a
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
⊢ ↑n = ∑ u in Nat.divisors ↑n, card (primitiveRoots u R)

tactic: refine' sum_congr rfl _
state_before: case h₂.a
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
⊢ Finset.sum (Nat.divisors ↑n) φ = ∑ u in Nat.divisors ↑n, card (primitiveRoots u R)

tactic: simp only [Nat.mem_divisors]
state_before: case h₂.a
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
⊢ ∀ (x : ℕ), x ∈ Nat.divisors ↑n → φ x = card (primitiveRoots x R)

tactic: rintro k ⟨⟨d, hd⟩, -⟩
state_before: case h₂.a
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
⊢ ∀ (x : ℕ), x ∣ ↑n ∧ ↑n ≠ 0 → φ x = card (primitiveRoots x R)

tactic: rw [mul_comm] at hd
state_before: case h₂.a.intro.intro
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
k d : ℕ
hd : ↑n = k * d
⊢ φ k = card (primitiveRoots k R)

tactic: rw [(h.pow n.pos hd).card_primitiveRoots]
state_before: case h₂.a.intro.intro
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
k d : ℕ
hd : ↑n = d * k
⊢ φ k = card (primitiveRoots k R)

tactic: intro i _ j _ hdiff
state_before: case h₂.a
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
⊢ ∀ (x : ℕ),
    x ∈ Nat.divisors ↑n → ∀ (y : ℕ), y ∈ Nat.divisors ↑n → x ≠ y → Disjoint (primitiveRoots x R) (primitiveRoots y R)

tactic: exact disjoint hdiff
state_before: case h₂.a
M : Type ?u.3637929
N : Type ?u.3637932
G : Type ?u.3637935
R : Type u_1
S : Type ?u.3637941
F : Type ?u.3637944
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
i : ℕ
a✝¹ : i ∈ Nat.divisors ↑n
j : ℕ
a✝ : j ∈ Nat.divisors ↑n
hdiff : i ≠ j
⊢ Disjoint (primitiveRoots i R) (primitiveRoots j R)