Theorem: IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots
File: Mathlib/NumberTheory/Cyclotomic/Basic.lean

tactic: simp only [mem_singleton_iff, exists_eq_left, map_cyclotomic]
state_before: n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
⊢ adjoin A ((cyclotomic (↑n) A).rootSet B) = adjoin A {b | ∃ a ∈ {n}, b ^ ↑a = 1}
state_after: n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
⊢ adjoin A ((cyclotomic (↑n) A).rootSet B) = adjoin A {b | b ^ ↑n = 1}

tactic: refine le_antisymm (adjoin_mono fun x hx => ?_) (adjoin_le fun x hx => ?_)
state_before: n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
⊢ adjoin A ((cyclotomic (↑n) A).rootSet B) = adjoin A {b | b ^ ↑n = 1}
state_after: case refine_1
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : x ∈ (cyclotomic (↑n) A).rootSet B
⊢ x ∈ {b | b ^ ↑n = 1}

case refine_2
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : x ∈ {b | b ^ ↑n = 1}
⊢ x ∈ ↑(adjoin A ((cyclotomic (↑n) A).rootSet B))

tactic: rw [mem_rootSet'] at hx
state_before: case refine_1
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : x ∈ (cyclotomic (↑n) A).rootSet B
⊢ x ∈ {b | b ^ ↑n = 1}
state_after: case refine_1
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : map (algebraMap A B) (cyclotomic (↑n) A) ≠ 0 ∧ (aeval x) (cyclotomic (↑n) A) = 0
⊢ x ∈ {b | b ^ ↑n = 1}

tactic: simp only [mem_singleton_iff, exists_eq_left, mem_setOf_eq]
state_before: case refine_1
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : map (algebraMap A B) (cyclotomic (↑n) A) ≠ 0 ∧ (aeval x) (cyclotomic (↑n) A) = 0
⊢ x ∈ {b | b ^ ↑n = 1}
state_after: case refine_1
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : map (algebraMap A B) (cyclotomic (↑n) A) ≠ 0 ∧ (aeval x) (cyclotomic (↑n) A) = 0
⊢ x ^ ↑n = 1

tactic: rw [isRoot_of_unity_iff n.pos]
state_before: case refine_1
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : map (algebraMap A B) (cyclotomic (↑n) A) ≠ 0 ∧ (aeval x) (cyclotomic (↑n) A) = 0
⊢ x ^ ↑n = 1
state_after: case refine_1
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : map (algebraMap A B) (cyclotomic (↑n) A) ≠ 0 ∧ (aeval x) (cyclotomic (↑n) A) = 0
⊢ ∃ i ∈ (↑n).divisors, (cyclotomic i B).IsRoot x

tactic: refine ⟨n, Nat.mem_divisors_self n n.ne_zero, ?_⟩
state_before: case refine_1
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : map (algebraMap A B) (cyclotomic (↑n) A) ≠ 0 ∧ (aeval x) (cyclotomic (↑n) A) = 0
⊢ ∃ i ∈ (↑n).divisors, (cyclotomic i B).IsRoot x
state_after: case refine_1
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : map (algebraMap A B) (cyclotomic (↑n) A) ≠ 0 ∧ (aeval x) (cyclotomic (↑n) A) = 0
⊢ (cyclotomic (↑n) B).IsRoot x

tactic: rw [IsRoot.def, ← map_cyclotomic n (algebraMap A B), eval_map, ← aeval_def]
state_before: case refine_1
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : map (algebraMap A B) (cyclotomic (↑n) A) ≠ 0 ∧ (aeval x) (cyclotomic (↑n) A) = 0
⊢ (cyclotomic (↑n) B).IsRoot x
state_after: case refine_1
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : map (algebraMap A B) (cyclotomic (↑n) A) ≠ 0 ∧ (aeval x) (cyclotomic (↑n) A) = 0
⊢ (aeval x) (cyclotomic (↑n) A) = 0

tactic: exact hx.2
state_before: case refine_1
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : map (algebraMap A B) (cyclotomic (↑n) A) ≠ 0 ∧ (aeval x) (cyclotomic (↑n) A) = 0
⊢ (aeval x) (cyclotomic (↑n) A) = 0
state_after: no goals

tactic: simp only [mem_singleton_iff, exists_eq_left, mem_setOf_eq] at hx
state_before: case refine_2
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : x ∈ {b | b ^ ↑n = 1}
⊢ x ∈ ↑(adjoin A ((cyclotomic (↑n) A).rootSet B))
state_after: case refine_2
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : x ^ ↑n = 1
⊢ x ∈ ↑(adjoin A ((cyclotomic (↑n) A).rootSet B))

tactic: obtain ⟨i, _, rfl⟩ := hζ.eq_pow_of_pow_eq_one hx n.pos
state_before: case refine_2
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
x : B
hx : x ^ ↑n = 1
⊢ x ∈ ↑(adjoin A ((cyclotomic (↑n) A).rootSet B))
state_after: case refine_2.intro.intro
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
i : ℕ
left✝ : i < ↑n
hx : (ζ ^ i) ^ ↑n = 1
⊢ ζ ^ i ∈ ↑(adjoin A ((cyclotomic (↑n) A).rootSet B))

tactic: refine SetLike.mem_coe.2 (Subalgebra.pow_mem _ (subset_adjoin ?_) _)
state_before: case refine_2.intro.intro
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
i : ℕ
left✝ : i < ↑n
hx : (ζ ^ i) ^ ↑n = 1
⊢ ζ ^ i ∈ ↑(adjoin A ((cyclotomic (↑n) A).rootSet B))
state_after: case refine_2.intro.intro
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
i : ℕ
left✝ : i < ↑n
hx : (ζ ^ i) ^ ↑n = 1
⊢ ζ ∈ (cyclotomic (↑n) A).rootSet B

tactic: rw [mem_rootSet', map_cyclotomic, aeval_def, ← eval_map, map_cyclotomic, ← IsRoot]
state_before: case refine_2.intro.intro
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
i : ℕ
left✝ : i < ↑n
hx : (ζ ^ i) ^ ↑n = 1
⊢ ζ ∈ (cyclotomic (↑n) A).rootSet B
state_after: case refine_2.intro.intro
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
i : ℕ
left✝ : i < ↑n
hx : (ζ ^ i) ^ ↑n = 1
⊢ cyclotomic (↑n) B ≠ 0 ∧ (cyclotomic (↑n) B).IsRoot ζ

tactic: exact ⟨cyclotomic_ne_zero n B, hζ.isRoot_cyclotomic n.pos⟩
state_before: case refine_2.intro.intro
n✝ : ℕ+
S T : Set ℕ+
A : Type u
B : Type v
K : Type w
L : Type z
inst✝⁶ : CommRing A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra A B
inst✝³ : Field K
inst✝² : Field L
inst✝¹ : Algebra K L
inst✝ : IsDomain B
ζ : B
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
i : ℕ
left✝ : i < ↑n
hx : (ζ ^ i) ^ ↑n = 1
⊢ cyclotomic (↑n) B ≠ 0 ∧ (cyclotomic (↑n) B).IsRoot ζ
state_after: no goals