Theorem: Polynomial.splits_of_comp
File: Mathlib/Algebra/Polynomial/Splits.lean

tactic: choose lift lift_eq using roots_mem_range
state_before: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝³ : CommRing R
inst✝² : Field K
inst✝¹ : Field L
inst✝ : Field F
i : K →+* L
j : L →+* F
f : K[X]
h : Splits (j.comp i) f
roots_mem_range : ∀ a ∈ (map (j.comp i) f).roots, a ∈ j.range
⊢ Splits i f
state_after: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝³ : CommRing R
inst✝² : Field K
inst✝¹ : Field L
inst✝ : Field F
i : K →+* L
j : L →+* F
f : K[X]
h : Splits (j.comp i) f
lift : (a : F) → a ∈ (map (j.comp i) f).roots → L
lift_eq : ∀ (a : F) (a_1 : a ∈ (map (j.comp i) f).roots), j (lift a a_1) = a
⊢ Splits i f

tactic: rw [splits_iff_exists_multiset]
state_before: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝³ : CommRing R
inst✝² : Field K
inst✝¹ : Field L
inst✝ : Field F
i : K →+* L
j : L →+* F
f : K[X]
h : Splits (j.comp i) f
lift : (a : F) → a ∈ (map (j.comp i) f).roots → L
lift_eq : ∀ (a : F) (a_1 : a ∈ (map (j.comp i) f).roots), j (lift a a_1) = a
⊢ Splits i f
state_after: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝³ : CommRing R
inst✝² : Field K
inst✝¹ : Field L
inst✝ : Field F
i : K →+* L
j : L →+* F
f : K[X]
h : Splits (j.comp i) f
lift : (a : F) → a ∈ (map (j.comp i) f).roots → L
lift_eq : ∀ (a : F) (a_1 : a ∈ (map (j.comp i) f).roots), j (lift a a_1) = a
⊢ ∃ s, map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod

tactic: refine ⟨(f.map (j.comp i)).roots.pmap lift fun _ ↦ id, map_injective _ j.injective ?_⟩
state_before: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝³ : CommRing R
inst✝² : Field K
inst✝¹ : Field L
inst✝ : Field F
i : K →+* L
j : L →+* F
f : K[X]
h : Splits (j.comp i) f
lift : (a : F) → a ∈ (map (j.comp i) f).roots → L
lift_eq : ∀ (a : F) (a_1 : a ∈ (map (j.comp i) f).roots), j (lift a a_1) = a
⊢ ∃ s, map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
state_after: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝³ : CommRing R
inst✝² : Field K
inst✝¹ : Field L
inst✝ : Field F
i : K →+* L
j : L →+* F
f : K[X]
h : Splits (j.comp i) f
lift : (a : F) → a ∈ (map (j.comp i) f).roots → L
lift_eq : ∀ (a : F) (a_1 : a ∈ (map (j.comp i) f).roots), j (lift a a_1) = a
⊢ map j (map i f) =
    map j
      (C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) (Multiset.pmap lift (map (j.comp i) f).roots ⋯)).prod)

tactic: conv_lhs => rw [Polynomial.map_map, eq_prod_roots_of_splits h]
state_before: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝³ : CommRing R
inst✝² : Field K
inst✝¹ : Field L
inst✝ : Field F
i : K →+* L
j : L →+* F
f : K[X]
h : Splits (j.comp i) f
lift : (a : F) → a ∈ (map (j.comp i) f).roots → L
lift_eq : ∀ (a : F) (a_1 : a ∈ (map (j.comp i) f).roots), j (lift a a_1) = a
⊢ map j (map i f) =
    map j
      (C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) (Multiset.pmap lift (map (j.comp i) f).roots ⋯)).prod)
state_after: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝³ : CommRing R
inst✝² : Field K
inst✝¹ : Field L
inst✝ : Field F
i : K →+* L
j : L →+* F
f : K[X]
h : Splits (j.comp i) f
lift : (a : F) → a ∈ (map (j.comp i) f).roots → L
lift_eq : ∀ (a : F) (a_1 : a ∈ (map (j.comp i) f).roots), j (lift a a_1) = a
⊢ C ((j.comp i) f.leadingCoeff) * (Multiset.map (fun a => X - C a) (map (j.comp i) f).roots).prod =
    map j
      (C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) (Multiset.pmap lift (map (j.comp i) f).roots ⋯)).prod)

tactic: simp_rw [Polynomial.map_mul, Polynomial.map_multiset_prod, Multiset.map_pmap, Polynomial.map_sub,
  map_C, map_X, lift_eq, Multiset.pmap_eq_map]
state_before: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝³ : CommRing R
inst✝² : Field K
inst✝¹ : Field L
inst✝ : Field F
i : K →+* L
j : L →+* F
f : K[X]
h : Splits (j.comp i) f
lift : (a : F) → a ∈ (map (j.comp i) f).roots → L
lift_eq : ∀ (a : F) (a_1 : a ∈ (map (j.comp i) f).roots), j (lift a a_1) = a
⊢ C ((j.comp i) f.leadingCoeff) * (Multiset.map (fun a => X - C a) (map (j.comp i) f).roots).prod =
    map j
      (C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) (Multiset.pmap lift (map (j.comp i) f).roots ⋯)).prod)
state_after: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝³ : CommRing R
inst✝² : Field K
inst✝¹ : Field L
inst✝ : Field F
i : K →+* L
j : L →+* F
f : K[X]
h : Splits (j.comp i) f
lift : (a : F) → a ∈ (map (j.comp i) f).roots → L
lift_eq : ∀ (a : F) (a_1 : a ∈ (map (j.comp i) f).roots), j (lift a a_1) = a
⊢ C ((j.comp i) f.leadingCoeff) * (Multiset.map (fun a => X - C a) (map (j.comp i) f).roots).prod =
    C (j (i f.leadingCoeff)) * (Multiset.map (fun a => X - C a) (map (j.comp i) f).roots).prod

tactic: rfl
state_before: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝³ : CommRing R
inst✝² : Field K
inst✝¹ : Field L
inst✝ : Field F
i : K →+* L
j : L →+* F
f : K[X]
h : Splits (j.comp i) f
lift : (a : F) → a ∈ (map (j.comp i) f).roots → L
lift_eq : ∀ (a : F) (a_1 : a ∈ (map (j.comp i) f).roots), j (lift a a_1) = a
⊢ C ((j.comp i) f.leadingCoeff) * (Multiset.map (fun a => X - C a) (map (j.comp i) f).roots).prod =
    C (j (i f.leadingCoeff)) * (Multiset.map (fun a => X - C a) (map (j.comp i) f).roots).prod
state_after: no goals