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

tactic: refine
  ⟨fun H => of_union_of_dvd A B h hS, fun H => (iff_adjoin_eq_top _ A _).2 ⟨fun s hs => ?_, ?_⟩⟩
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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
⊢ IsCyclotomicExtension S A B ↔ IsCyclotomicExtension (S ∪ {n}) A B
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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
H : IsCyclotomicExtension (S ∪ {n}) A B
s : ℕ+
hs : s ∈ S
⊢ ∃ r, IsPrimitiveRoot r ↑s

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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
H : IsCyclotomicExtension (S ∪ {n}) A B
⊢ adjoin A {b | ∃ n ∈ S, b ^ ↑n = 1} = ⊤

tactic: exact H.exists_prim_root (subset_union_left hs)
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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
H : IsCyclotomicExtension (S ∪ {n}) A B
s : ℕ+
hs : s ∈ S
⊢ ∃ r, IsPrimitiveRoot r ↑s
state_after: no goals

tactic: rw [_root_.eq_top_iff, ← ((iff_adjoin_eq_top _ A B).1 H).2]
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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
H : IsCyclotomicExtension (S ∪ {n}) A B
⊢ adjoin A {b | ∃ n ∈ S, b ^ ↑n = 1} = ⊤
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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
H : IsCyclotomicExtension (S ∪ {n}) A B
⊢ adjoin A {b | ∃ n_1 ∈ S ∪ {n}, b ^ ↑n_1 = 1} ≤ adjoin A {b | ∃ n ∈ S, b ^ ↑n = 1}

tactic: refine adjoin_mono fun x 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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
H : IsCyclotomicExtension (S ∪ {n}) A B
⊢ adjoin A {b | ∃ n_1 ∈ S ∪ {n}, b ^ ↑n_1 = 1} ≤ adjoin A {b | ∃ n ∈ S, b ^ ↑n = 1}
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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
H : IsCyclotomicExtension (S ∪ {n}) A B
x : B
hx : x ∈ {b | ∃ n_1 ∈ S ∪ {n}, b ^ ↑n_1 = 1}
⊢ x ∈ {b | ∃ n ∈ S, b ^ ↑n = 1}

tactic: simp only [union_singleton, mem_insert_iff, 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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
H : IsCyclotomicExtension (S ∪ {n}) A B
x : B
hx : x ∈ {b | ∃ n_1 ∈ S ∪ {n}, b ^ ↑n_1 = 1}
⊢ x ∈ {b | ∃ n ∈ S, b ^ ↑n = 1}
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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
H : IsCyclotomicExtension (S ∪ {n}) A B
x : B
hx : ∃ n_1, (n_1 = n ∨ n_1 ∈ S) ∧ x ^ ↑n_1 = 1
⊢ ∃ n ∈ S, x ^ ↑n = 1

tactic: obtain ⟨m, rfl | hm, hxpow⟩ := 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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
H : IsCyclotomicExtension (S ∪ {n}) A B
x : B
hx : ∃ n_1, (n_1 = n ∨ n_1 ∈ S) ∧ x ^ ↑n_1 = 1
⊢ ∃ n ∈ S, x ^ ↑n = 1
state_after: case refine_2.intro.intro.inl
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
hS : S.Nonempty
x : B
m : ℕ+
hxpow : x ^ ↑m = 1
h : ∀ s ∈ S, m ∣ s
H : IsCyclotomicExtension (S ∪ {m}) A B
⊢ ∃ n ∈ S, x ^ ↑n = 1

case refine_2.intro.intro.inr
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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
H : IsCyclotomicExtension (S ∪ {n}) A B
x : B
m : ℕ+
hxpow : x ^ ↑m = 1
hm : m ∈ S
⊢ ∃ n ∈ S, x ^ ↑n = 1

tactic: obtain ⟨y, hy⟩ := hS
state_before: case refine_2.intro.intro.inl
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
hS : S.Nonempty
x : B
m : ℕ+
hxpow : x ^ ↑m = 1
h : ∀ s ∈ S, m ∣ s
H : IsCyclotomicExtension (S ∪ {m}) A B
⊢ ∃ n ∈ S, x ^ ↑n = 1
state_after: case refine_2.intro.intro.inl.intro
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
x : B
m : ℕ+
hxpow : x ^ ↑m = 1
h : ∀ s ∈ S, m ∣ s
H : IsCyclotomicExtension (S ∪ {m}) A B
y : ℕ+
hy : y ∈ S
⊢ ∃ n ∈ S, x ^ ↑n = 1

tactic: refine ⟨y, ⟨hy, ?_⟩⟩
state_before: case refine_2.intro.intro.inl.intro
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
x : B
m : ℕ+
hxpow : x ^ ↑m = 1
h : ∀ s ∈ S, m ∣ s
H : IsCyclotomicExtension (S ∪ {m}) A B
y : ℕ+
hy : y ∈ S
⊢ ∃ n ∈ S, x ^ ↑n = 1
state_after: case refine_2.intro.intro.inl.intro
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
x : B
m : ℕ+
hxpow : x ^ ↑m = 1
h : ∀ s ∈ S, m ∣ s
H : IsCyclotomicExtension (S ∪ {m}) A B
y : ℕ+
hy : y ∈ S
⊢ x ^ ↑y = 1

tactic: obtain ⟨z, rfl⟩ := h y hy
state_before: case refine_2.intro.intro.inl.intro
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
x : B
m : ℕ+
hxpow : x ^ ↑m = 1
h : ∀ s ∈ S, m ∣ s
H : IsCyclotomicExtension (S ∪ {m}) A B
y : ℕ+
hy : y ∈ S
⊢ x ^ ↑y = 1
state_after: case refine_2.intro.intro.inl.intro.intro
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
x : B
m : ℕ+
hxpow : x ^ ↑m = 1
h : ∀ s ∈ S, m ∣ s
H : IsCyclotomicExtension (S ∪ {m}) A B
z : ℕ+
hy : m * z ∈ S
⊢ x ^ ↑(m * z) = 1

tactic: simp only [PNat.mul_coe, pow_mul, hxpow, one_pow]
state_before: case refine_2.intro.intro.inl.intro.intro
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
x : B
m : ℕ+
hxpow : x ^ ↑m = 1
h : ∀ s ∈ S, m ∣ s
H : IsCyclotomicExtension (S ∪ {m}) A B
z : ℕ+
hy : m * z ∈ S
⊢ x ^ ↑(m * z) = 1
state_after: no goals

tactic: exact ⟨m, ⟨hm, hxpow⟩⟩
state_before: case refine_2.intro.intro.inr
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
h : ∀ s ∈ S, n ∣ s
hS : S.Nonempty
H : IsCyclotomicExtension (S ∪ {n}) A B
x : B
m : ℕ+
hxpow : x ^ ↑m = 1
hm : m ∈ S
⊢ ∃ n ∈ S, x ^ ↑n = 1
state_after: no goals