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

tactic: refine (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
H : 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 A B
s : ℕ+
hs : s ∈ S ∪ {n}
⊢ ∃ 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 A B
⊢ adjoin A {b | ∃ n_1 ∈ S ∪ {n}, b ^ ↑n_1 = 1} = ⊤

tactic: rw [mem_union, mem_singleton_iff] at 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 A B
s : ℕ+
hs : s ∈ S ∪ {n}
⊢ ∃ r, IsPrimitiveRoot r ↑s
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 A B
s : ℕ+
hs : s ∈ S ∨ s = n
⊢ ∃ r, IsPrimitiveRoot r ↑s

tactic: obtain hs | rfl := 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 A B
s : ℕ+
hs : s ∈ S ∨ s = n
⊢ ∃ r, IsPrimitiveRoot r ↑s
state_after: case refine_1.inl
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 A B
s : ℕ+
hs : s ∈ S
⊢ ∃ r, IsPrimitiveRoot r ↑s

case refine_1.inr
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
H : IsCyclotomicExtension S A B
s : ℕ+
h : ∀ s_1 ∈ S, s ∣ s_1
⊢ ∃ r, IsPrimitiveRoot r ↑s

tactic: exact H.exists_prim_root hs
state_before: case refine_1.inl
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 A B
s : ℕ+
hs : s ∈ S
⊢ ∃ r, IsPrimitiveRoot r ↑s
state_after: no goals

tactic: obtain ⟨m, hm⟩ := hS
state_before: case refine_1.inr
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
H : IsCyclotomicExtension S A B
s : ℕ+
h : ∀ s_1 ∈ S, s ∣ s_1
⊢ ∃ r, IsPrimitiveRoot r ↑s
state_after: case refine_1.inr.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
H : IsCyclotomicExtension S A B
s : ℕ+
h : ∀ s_1 ∈ S, s ∣ s_1
m : ℕ+
hm : m ∈ S
⊢ ∃ r, IsPrimitiveRoot r ↑s

tactic: obtain ⟨x, rfl⟩ := h m hm
state_before: case refine_1.inr.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
H : IsCyclotomicExtension S A B
s : ℕ+
h : ∀ s_1 ∈ S, s ∣ s_1
m : ℕ+
hm : m ∈ S
⊢ ∃ r, IsPrimitiveRoot r ↑s
state_after: case refine_1.inr.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
H : IsCyclotomicExtension S A B
s : ℕ+
h : ∀ s_1 ∈ S, s ∣ s_1
x : ℕ+
hm : s * x ∈ S
⊢ ∃ r, IsPrimitiveRoot r ↑s

tactic: obtain ⟨ζ, hζ⟩ := H.exists_prim_root hm
state_before: case refine_1.inr.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
H : IsCyclotomicExtension S A B
s : ℕ+
h : ∀ s_1 ∈ S, s ∣ s_1
x : ℕ+
hm : s * x ∈ S
⊢ ∃ r, IsPrimitiveRoot r ↑s
state_after: case refine_1.inr.intro.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
H : IsCyclotomicExtension S A B
s : ℕ+
h : ∀ s_1 ∈ S, s ∣ s_1
x : ℕ+
hm : s * x ∈ S
ζ : B
hζ : IsPrimitiveRoot ζ ↑(s * x)
⊢ ∃ r, IsPrimitiveRoot r ↑s

tactic: refine ⟨ζ ^ (x : ℕ), ?_⟩
state_before: case refine_1.inr.intro.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
H : IsCyclotomicExtension S A B
s : ℕ+
h : ∀ s_1 ∈ S, s ∣ s_1
x : ℕ+
hm : s * x ∈ S
ζ : B
hζ : IsPrimitiveRoot ζ ↑(s * x)
⊢ ∃ r, IsPrimitiveRoot r ↑s
state_after: case refine_1.inr.intro.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
H : IsCyclotomicExtension S A B
s : ℕ+
h : ∀ s_1 ∈ S, s ∣ s_1
x : ℕ+
hm : s * x ∈ S
ζ : B
hζ : IsPrimitiveRoot ζ ↑(s * x)
⊢ IsPrimitiveRoot (ζ ^ ↑x) ↑s

tactic: convert hζ.pow_of_dvd x.ne_zero (dvd_mul_left (x : ℕ) s)
state_before: case refine_1.inr.intro.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
H : IsCyclotomicExtension S A B
s : ℕ+
h : ∀ s_1 ∈ S, s ∣ s_1
x : ℕ+
hm : s * x ∈ S
ζ : B
hζ : IsPrimitiveRoot ζ ↑(s * x)
⊢ IsPrimitiveRoot (ζ ^ ↑x) ↑s
state_after: case h.e'_4
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 : IsCyclotomicExtension S A B
s : ℕ+
h : ∀ s_1 ∈ S, s ∣ s_1
x : ℕ+
hm : s * x ∈ S
ζ : B
hζ : IsPrimitiveRoot ζ ↑(s * x)
⊢ ↑s = ↑(s * x) / ↑x

tactic: simp only [PNat.mul_coe, Nat.mul_div_left, PNat.pos]
state_before: case h.e'_4
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 : IsCyclotomicExtension S A B
s : ℕ+
h : ∀ s_1 ∈ S, s ∣ s_1
x : ℕ+
hm : s * x ∈ S
ζ : B
hζ : IsPrimitiveRoot ζ ↑(s * x)
⊢ ↑s = ↑(s * x) / ↑x
state_after: no goals

tactic: refine _root_.eq_top_iff.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 A B
⊢ adjoin A {b | ∃ n_1 ∈ S ∪ {n}, b ^ ↑n_1 = 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 A B
⊢ ⊤ ≤ adjoin A {b | ∃ n_1 ∈ S ∪ {n}, b ^ ↑n_1 = 1}

tactic: rw [← ((iff_adjoin_eq_top S 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 A B
⊢ ⊤ ≤ adjoin A {b | ∃ n_1 ∈ S ∪ {n}, b ^ ↑n_1 = 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 A B
⊢ adjoin A {b | ∃ n ∈ S, b ^ ↑n = 1} ≤ adjoin A {b | ∃ n_1 ∈ S ∪ {n}, b ^ ↑n_1 = 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 A B
⊢ adjoin A {b | ∃ n ∈ S, b ^ ↑n = 1} ≤ adjoin A {b | ∃ n_1 ∈ S ∪ {n}, b ^ ↑n_1 = 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 A B
x : B
hx : x ∈ {b | ∃ n ∈ S, b ^ ↑n = 1}
⊢ x ∈ {b | ∃ n_1 ∈ S ∪ {n}, b ^ ↑n_1 = 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 A B
x : B
hx : x ∈ {b | ∃ n ∈ S, b ^ ↑n = 1}
⊢ x ∈ {b | ∃ n_1 ∈ S ∪ {n}, b ^ ↑n_1 = 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 A B
x : B
hx : ∃ n ∈ S, x ^ ↑n = 1
⊢ ∃ n_1, (n_1 = n ∨ n_1 ∈ S) ∧ x ^ ↑n_1 = 1

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

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