Theorem: FixedPoints.minpoly.of_eval₂
File: Mathlib/FieldTheory/Fixed.lean

tactic: have : (subfield G F).subtype = (subfield G F).toSubring.subtype := rfl
state_before: M : Type u
inst✝⁵ : Monoid M
G : Type u
inst✝⁴ : Group G
F : Type v
inst✝³ : Field F
inst✝² : MulSemiringAction M F
inst✝¹ : MulSemiringAction G F
m : M
inst✝ : Fintype G
x : F
f : Polynomial { x // x ∈ subfield G F }
hf : Polynomial.eval₂ (Subfield.subtype (subfield G F)) x f = 0
⊢ minpoly G F x ∣ f

tactic: have h : Polynomial.map (MulSemiringActionHom.toRingHom (IsInvariantSubring.subtypeHom G
  (subfield G F).toSubring)) f = Polynomial.map
  ((IsInvariantSubring.subtypeHom G (subfield G F).toSubring)) f := rfl
state_before: M : Type u
inst✝⁵ : Monoid M
G : Type u
inst✝⁴ : Group G
F : Type v
inst✝³ : Field F
inst✝² : MulSemiringAction M F
inst✝¹ : MulSemiringAction G F
m : M
inst✝ : Fintype G
x : F
f : Polynomial { x // x ∈ subfield G F }
hf : Polynomial.eval₂ (Subfield.subtype (subfield G F)) x f = 0
this : Subfield.subtype (subfield G F) = Subring.subtype (subfield G F).toSubring
⊢ minpoly G F x ∣ f

tactic: erw [← Polynomial.map_dvd_map' (Subfield.subtype <| FixedPoints.subfield G F), minpoly, this,
  Polynomial.map_toSubring _ _, prodXSubSmul]
state_before: M : Type u
inst✝⁵ : Monoid M
G : Type u
inst✝⁴ : Group G
F : Type v
inst✝³ : Field F
inst✝² : MulSemiringAction M F
inst✝¹ : MulSemiringAction G F
m : M
inst✝ : Fintype G
x : F
f : Polynomial { x // x ∈ subfield G F }
hf : Polynomial.eval₂ (Subfield.subtype (subfield G F)) x f = 0
this : Subfield.subtype (subfield G F) = Subring.subtype (subfield G F).toSubring
h :
  Polynomial.map (MulSemiringActionHom.toRingHom (IsInvariantSubring.subtypeHom G (subfield G F).toSubring)) f =
    Polynomial.map (↑(IsInvariantSubring.subtypeHom G (subfield G F).toSubring)) f
⊢ minpoly G F x ∣ f

tactic: refine'
  Fintype.prod_dvd_of_coprime
    (Polynomial.pairwise_coprime_X_sub_C <| MulAction.injective_ofQuotientStabilizer G x) fun y =>
    QuotientGroup.induction_on y fun g => _
state_before: M : Type u
inst✝⁵ : Monoid M
G : Type u
inst✝⁴ : Group G
F : Type v
inst✝³ : Field F
inst✝² : MulSemiringAction M F
inst✝¹ : MulSemiringAction G F
m : M
inst✝ : Fintype G
x : F
f : Polynomial { x // x ∈ subfield G F }
hf : Polynomial.eval₂ (Subfield.subtype (subfield G F)) x f = 0
this : Subfield.subtype (subfield G F) = Subring.subtype (subfield G F).toSubring
h :
  Polynomial.map (MulSemiringActionHom.toRingHom (IsInvariantSubring.subtypeHom G (subfield G F).toSubring)) f =
    Polynomial.map (↑(IsInvariantSubring.subtypeHom G (subfield G F).toSubring)) f
⊢ ∏ g : G ⧸ stabilizer G x, (Polynomial.X - ↑Polynomial.C (ofQuotientStabilizer G x g)) ∣
    Polynomial.map (Subring.subtype (subfield G F).toSubring) f

tactic: rw [Polynomial.dvd_iff_isRoot, Polynomial.IsRoot.def, MulAction.ofQuotientStabilizer_mk,
  Polynomial.eval_smul', ← this, ← Subfield.toSubring_subtype_eq_subtype, ←
  IsInvariantSubring.coe_subtypeHom' G (FixedPoints.subfield G F).toSubring, h,
  ← MulSemiringActionHom.coe_polynomial, ← MulSemiringActionHom.map_smul, smul_polynomial,
  MulSemiringActionHom.coe_polynomial, ← h, IsInvariantSubring.coe_subtypeHom',
  Polynomial.eval_map, Subfield.toSubring_subtype_eq_subtype, hf, smul_zero]
state_before: M : Type u
inst✝⁵ : Monoid M
G : Type u
inst✝⁴ : Group G
F : Type v
inst✝³ : Field F
inst✝² : MulSemiringAction M F
inst✝¹ : MulSemiringAction G F
m : M
inst✝ : Fintype G
x : F
f : Polynomial { x // x ∈ subfield G F }
hf : Polynomial.eval₂ (Subfield.subtype (subfield G F)) x f = 0
this : Subfield.subtype (subfield G F) = Subring.subtype (subfield G F).toSubring
h :
  Polynomial.map (MulSemiringActionHom.toRingHom (IsInvariantSubring.subtypeHom G (subfield G F).toSubring)) f =
    Polynomial.map (↑(IsInvariantSubring.subtypeHom G (subfield G F).toSubring)) f
y : G ⧸ stabilizer G x
g : G
⊢ Polynomial.X - ↑Polynomial.C (ofQuotientStabilizer G x ↑g) ∣
    Polynomial.map (Subring.subtype (subfield G F).toSubring) f