Theorem: IsPrimitiveRoot.self_sub_one_pow_dvd_order
File: Mathlib/RingTheory/RootsOfUnity/Lemmas.lean

tactic: let n' + 1 := n
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
hn : k < n
μ : R
hμ : IsPrimitiveRoot μ n
⊢ ∃ z ∈ adjoin ℤ {μ}, ↑n = z * (μ - 1) ^ k
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
n' : ℕ
hn : k < n' + 1
hμ : IsPrimitiveRoot μ (n' + 1)
⊢ ∃ z ∈ adjoin ℤ {μ}, ↑(n' + 1) = z * (μ - 1) ^ k

tactic: obtain ⟨m, rfl⟩ := Nat.exists_eq_add_of_le' (Nat.le_of_lt_succ hn)
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
n' : ℕ
hn : k < n' + 1
hμ : IsPrimitiveRoot μ (n' + 1)
⊢ ∃ z ∈ adjoin ℤ {μ}, ↑(n' + 1) = z * (μ - 1) ^ k
state_after: case intro
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
⊢ ∃ z ∈ adjoin ℤ {μ}, ↑(m + k + 1) = z * (μ - 1) ^ k

tactic: let Z k := Classical.choose <| hdvd k
state_before: case intro
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
⊢ ∃ z ∈ adjoin ℤ {μ}, ↑(m + k + 1) = z * (μ - 1) ^ k
state_after: case intro
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
⊢ ∃ z ∈ adjoin ℤ {μ}, ↑(m + k + 1) = z * (μ - 1) ^ k

tactic: have Zdef k : Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1) :=
  Classical.choose_spec <| hdvd k
state_before: case intro
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
⊢ ∃ z ∈ adjoin ℤ {μ}, ↑(m + k + 1) = z * (μ - 1) ^ k
state_after: case intro
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ ∃ z ∈ adjoin ℤ {μ}, ↑(m + k + 1) = z * (μ - 1) ^ k

tactic: refine ⟨(-1) ^ (m + k) * (∏ j ∈ range k, Z (j + 1)) * ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1),
  ?_, ?_⟩
state_before: case intro
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ ∃ z ∈ adjoin ℤ {μ}, ↑(m + k + 1) = z * (μ - 1) ^ k
state_after: case intro.refine_1
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ ((-1) ^ (m + k) * ∏ j ∈ range k, Z (j + 1)) * ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1) ∈ adjoin ℤ {μ}

case intro.refine_2
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ ↑(m + k + 1) = (((-1) ^ (m + k) * ∏ j ∈ range k, Z (j + 1)) * ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)) * (μ - 1) ^ k

tactic: exact Subalgebra.sum_mem _ fun m _ ↦ Subalgebra.pow_mem _ (self_mem_adjoin_singleton _ μ) _
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k✝ n : ℕ
μ : R
m : ℕ
hn : k✝ < m + k✝ + 1
hμ : IsPrimitiveRoot μ (m + k✝ + 1)
k : ℕ
⊢ ∑ x ∈ range k, μ ^ x ∈ adjoin ℤ {μ}
state_after: no goals

tactic: apply Subalgebra.mul_mem
state_before: case intro.refine_1
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ ((-1) ^ (m + k) * ∏ j ∈ range k, Z (j + 1)) * ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1) ∈ adjoin ℤ {μ}
state_after: case intro.refine_1.hx
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ (-1) ^ (m + k) * ∏ j ∈ range k, Z (j + 1) ∈ adjoin ℤ {μ}

case intro.refine_1.hy
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1) ∈ adjoin ℤ {μ}

tactic: apply Subalgebra.mul_mem
state_before: case intro.refine_1.hx
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ (-1) ^ (m + k) * ∏ j ∈ range k, Z (j + 1) ∈ adjoin ℤ {μ}
state_after: case intro.refine_1.hx.hx
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ (-1) ^ (m + k) ∈ adjoin ℤ {μ}

case intro.refine_1.hx.hy
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ ∏ j ∈ range k, Z (j + 1) ∈ adjoin ℤ {μ}

tactic: exact Subalgebra.pow_mem _ (Subalgebra.neg_mem _ <| Subalgebra.one_mem _) _
state_before: case intro.refine_1.hx.hx
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ (-1) ^ (m + k) ∈ adjoin ℤ {μ}
state_after: no goals

tactic: exact Subalgebra.prod_mem _ fun _ _ ↦ (Zdef _).1
state_before: case intro.refine_1.hx.hy
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ ∏ j ∈ range k, Z (j + 1) ∈ adjoin ℤ {μ}
state_after: no goals

tactic: refine Subalgebra.prod_mem _ fun _ _ ↦ ?_
state_before: case intro.refine_1.hy
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1) ∈ adjoin ℤ {μ}
state_after: case intro.refine_1.hy
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
x✝¹ : ℕ
x✝ : x✝¹ ∈ Ico k (m + k)
⊢ μ ^ (x✝¹ + 1) - 1 ∈ adjoin ℤ {μ}

tactic: apply Subalgebra.sub_mem
state_before: case intro.refine_1.hy
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
x✝¹ : ℕ
x✝ : x✝¹ ∈ Ico k (m + k)
⊢ μ ^ (x✝¹ + 1) - 1 ∈ adjoin ℤ {μ}
state_after: case intro.refine_1.hy.hx
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
x✝¹ : ℕ
x✝ : x✝¹ ∈ Ico k (m + k)
⊢ μ ^ (x✝¹ + 1) ∈ adjoin ℤ {μ}

case intro.refine_1.hy.hy
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
x✝¹ : ℕ
x✝ : x✝¹ ∈ Ico k (m + k)
⊢ 1 ∈ adjoin ℤ {μ}

tactic: exact Subalgebra.pow_mem _ (self_mem_adjoin_singleton ℤ μ) _
state_before: case intro.refine_1.hy.hx
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
x✝¹ : ℕ
x✝ : x✝¹ ∈ Ico k (m + k)
⊢ μ ^ (x✝¹ + 1) ∈ adjoin ℤ {μ}
state_after: no goals

tactic: exact Subalgebra.one_mem _
state_before: case intro.refine_1.hy.hy
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
x✝¹ : ℕ
x✝ : x✝¹ ∈ Ico k (m + k)
⊢ 1 ∈ adjoin ℤ {μ}
state_after: no goals

tactic: push_cast
state_before: case intro.refine_2
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ ↑(m + k + 1) = (((-1) ^ (m + k) * ∏ j ∈ range k, Z (j + 1)) * ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)) * (μ - 1) ^ k
state_after: case intro.refine_2
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ ↑m + ↑k + 1 = (((-1) ^ (m + k) * ∏ j ∈ range k, Z (j + 1)) * ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)) * (μ - 1) ^ k

tactic: have := Nat.cast_add (R := R) m k ▸ hμ.prod_pow_sub_one_eq_order
state_before: case intro.refine_2
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
⊢ ↑m + ↑k + 1 = (((-1) ^ (m + k) * ∏ j ∈ range k, Z (j + 1)) * ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)) * (μ - 1) ^ k
state_after: case intro.refine_2
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
this : (-1) ^ (m + k) * ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) = ↑m + ↑k + 1
⊢ ↑m + ↑k + 1 = (((-1) ^ (m + k) * ∏ j ∈ range k, Z (j + 1)) * ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)) * (μ - 1) ^ k

tactic: rw [← this, mul_assoc, mul_assoc]
state_before: case intro.refine_2
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
this : (-1) ^ (m + k) * ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) = ↑m + ↑k + 1
⊢ ↑m + ↑k + 1 = (((-1) ^ (m + k) * ∏ j ∈ range k, Z (j + 1)) * ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)) * (μ - 1) ^ k
state_after: case intro.refine_2
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
this : (-1) ^ (m + k) * ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) = ↑m + ↑k + 1
⊢ (-1) ^ (m + k) * ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) =
    (-1) ^ (m + k) * ((∏ j ∈ range k, Z (j + 1)) * ((∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)) * (μ - 1) ^ k))

tactic: congr 1
state_before: case intro.refine_2
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
this : (-1) ^ (m + k) * ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) = ↑m + ↑k + 1
⊢ (-1) ^ (m + k) * ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) =
    (-1) ^ (m + k) * ((∏ j ∈ range k, Z (j + 1)) * ((∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)) * (μ - 1) ^ k))
state_after: case intro.refine_2.e_a
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
this : (-1) ^ (m + k) * ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) = ↑m + ↑k + 1
⊢ ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) =
    (∏ j ∈ range k, Z (j + 1)) * ((∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)) * (μ - 1) ^ k)

tactic: conv => enter [2, 2, 2]; rw [← card_range k]
state_before: case intro.refine_2.e_a
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
this : (-1) ^ (m + k) * ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) = ↑m + ↑k + 1
⊢ ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) =
    (∏ j ∈ range k, Z (j + 1)) * ((∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)) * (μ - 1) ^ k)
state_after: case intro.refine_2.e_a
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
this : (-1) ^ (m + k) * ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) = ↑m + ↑k + 1
⊢ ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) =
    (∏ j ∈ range k, Z (j + 1)) * ((∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)) * (μ - 1) ^ (range k).card)

tactic: rw [← prod_range_mul_prod_Ico _ (Nat.le_add_left k m), mul_comm _ (_ ^ card _), ← mul_assoc,
  prod_mul_pow_card]
state_before: case intro.refine_2.e_a
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
this : (-1) ^ (m + k) * ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) = ↑m + ↑k + 1
⊢ ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) =
    (∏ j ∈ range k, Z (j + 1)) * ((∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)) * (μ - 1) ^ (range k).card)
state_after: case intro.refine_2.e_a
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
this : (-1) ^ (m + k) * ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) = ↑m + ↑k + 1
⊢ (∏ k ∈ range k, (μ ^ (k + 1) - 1)) * ∏ k ∈ Ico k (m + k), (μ ^ (k + 1) - 1) =
    (∏ a ∈ range k, Z (a + 1) * (μ - 1)) * ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)

tactic: conv => enter [2, 1, 2, j]; rw [← (Zdef _).2]
state_before: case intro.refine_2.e_a
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
k n : ℕ
μ : R
m : ℕ
hn : k < m + k + 1
hμ : IsPrimitiveRoot μ (m + k + 1)
hdvd : ∀ (k : ℕ), ∃ z ∈ adjoin ℤ {μ}, μ ^ k - 1 = z * (μ - 1)
Z : ℕ → R := fun k => Classical.choose ⋯
Zdef : ∀ (k : ℕ), Z k ∈ adjoin ℤ {μ} ∧ μ ^ k - 1 = Z k * (μ - 1)
this : (-1) ^ (m + k) * ∏ k ∈ range (m + k), (μ ^ (k + 1) - 1) = ↑m + ↑k + 1
⊢ (∏ k ∈ range k, (μ ^ (k + 1) - 1)) * ∏ k ∈ Ico k (m + k), (μ ^ (k + 1) - 1) =
    (∏ a ∈ range k, Z (a + 1) * (μ - 1)) * ∏ j ∈ Ico k (m + k), (μ ^ (j + 1) - 1)
state_after: no goals