A separable ambient residue element is the residue of an actual root of a monic lift of its base minimal polynomial.
Source context 7 commands
Surrounding namespaces, section variables, and local commands at this declaration.
noncomputable section
universe u
namespace AlgebraicNumberTheory
namespace Valuations
section SeparableResidueLift
variable {K L : Type u} [Field K] [Field L] [Algebra K L]
variable [Algebra.IsAlgebraic K L]theorem exists_integral_root_lifting_separable_residue_element
(v : LubinTate.Valuations.ExponentialValuation K)
(w : LubinTate.Valuations.ExponentialValuation L)
(hExt : ∀ a : K, w (algebraMap K L a) = v a)
(hhens : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization
(LubinTate.Valuations.exponentialValuationSubringAsValuationSubring v).valuation) :
let V := LubinTate.Valuations.exponentialValuationSubring v
let W := LubinTate.Valuations.exponentialValuationSubring w
let i := unramifiedValuationRingValuationRingMap v w hExt
letI : IsLocalHom i :=
unramifiedValuationRingValuationRingMap_isLocalHom v w hExt
let k := IsLocalRing.ResidueField V
let ell := IsLocalRing.ResidueField W
letI : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra
∀ alpha : ell, IsSeparable k alpha →
∃ F : Polynomial V,
∃ beta : W,
F.Monic ∧
F.map (IsLocalRing.residue V) = minpoly k alpha ∧
(F.map ((algebraMap K L).comp
V.subtype)).eval (beta : L) = 0 ∧
IsLocalRing.residue W beta = alpha := by
classical
simp only
intro alpha halpha
let V := LubinTate.Valuations.exponentialValuationSubring v
let W := LubinTate.Valuations.exponentialValuationSubring w
let i := unramifiedValuationRingValuationRingMap v w hExt
let : IsLocalHom i :=
unramifiedValuationRingValuationRingMap_isLocalHom v w hExt
let k := IsLocalRing.ResidueField V
let ell := IsLocalRing.ResidueField W
let : Algebra k ell := (IsLocalRing.ResidueField.map i).toAlgebra
let fbar : Polynomial k := minpoly k alpha
have hfbarMonic : fbar.Monic := minpoly.monic halpha.isIntegral
have hfbarSep : fbar.Separable := halpha
have hlifts : fbar ∈ Polynomial.lifts (IsLocalRing.residue V) := by
rw [Polynomial.lifts_iff_coeff_lifts]
intro n
exact IsLocalRing.residue_surjective (fbar.coeff n)
obtain ⟨F, hFmap, _hFdegree, hFmonic⟩ :=
Polynomial.lifts_and_natDegree_eq_and_monic hlifts hfbarMonic
let FW : Polynomial W := F.map i
let pbar : Polynomial ell := fbar.map (algebraMap k ell)
have hFWmonic : FW.Monic := hFmonic.map i
have hFWmap : FW.map (IsLocalRing.residue W) = pbar := by
have hred := unramifiedValuationRing_polynomial_target_reduction_eq
v w hExt F
change (F.map i).map (IsLocalRing.residue W) =
(F.map (IsLocalRing.residue V)).map (algebraMap k ell) at hred
rw [hred, hFmap]
have hpbarMonic : pbar.Monic := hfbarMonic.map (algebraMap k ell)
have hpbarSep : pbar.Separable := hfbarSep.map
have hpbarRoot : pbar.eval alpha = 0 := by
have hroot := minpoly.aeval k alpha
rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map] at hroot
exact hroot
have hpbarDerivative : pbar.derivative.eval alpha ≠ 0 := by
exact hpbarSep.eval₂_derivative_ne_zero (RingHom.id ell) (by
simpa using hpbarRoot)
let gbar : Polynomial ell := Polynomial.X - Polynomial.C alpha
let hbar : Polynomial ell := pbar /ₘ gbar
have hgbarMonic : gbar.Monic := Polynomial.monic_X_sub_C alpha
have hfactor : pbar = gbar * hbar := by
have hdivision :=
Polynomial.X_sub_C_mul_divByMonic_eq_sub_modByMonic pbar alpha
have hmod : pbar %ₘ (Polynomial.X - Polynomial.C alpha) = 0 := by
rw [Polynomial.modByMonic_X_sub_C_eq_C_eval, hpbarRoot,
Polynomial.C_0]
rw [hmod, sub_zero] at hdivision
simpa [gbar, hbar] using hdivision.symm
have hhbarMonic : hbar.Monic := by
exact hgbarMonic.of_mul_monic_left (hfactor ▸ hpbarMonic)
have hcoprime : IsCoprime gbar hbar := by
exact Polynomial.isCoprime_of_is_root_of_eval_derivative_ne_zero
pbar alpha hpbarDerivative
have hHenselianW : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization
(LubinTate.Valuations.exponentialValuationSubringAsValuationSubring w).valuation :=
henselianValuation_of_algebraic_extension v w hExt hhens
let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring w
have hfactorization : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty Wv := by
change ValuationTheory.DiscreteValuationField.HenselFactorizationProperty
Wv.valuation.valuationSubring at hHenselianW
rw [ValuationSubring.valuationSubring_valuation] at hHenselianW
exact hHenselianW
have hlift : DiscreteValuationField.MonicResidualCoprimeFactorLifting Wv :=
DiscreteValuationField.monicResidualCoprimeFactorLifting_of_henselFactorization
hfactorization
have hFWfactor : FW.map (IsLocalRing.residue W) = gbar * hbar :=
hFWmap.trans hfactor
rcases hlift hFWmonic hgbarMonic hhbarMonic hFWfactor hcoprime with
⟨G, H, hGmonic, _hHmonic, hGH, hGmap, _hHmap⟩
have hGdegree : G.natDegree = 1 := by
calc
G.natDegree = (G.map (IsLocalRing.residue W)).natDegree :=
(hGmonic.natDegree_map (IsLocalRing.residue W)).symm
_ = gbar.natDegree := congrArg Polynomial.natDegree hGmap
_ = 1 := Polynomial.natDegree_X_sub_C alpha
let betaV : Wv := -G.coeff 0
let beta : W := ⟨betaV.1, betaV.2⟩
have hGform : G = Polynomial.X - Polynomial.C betaV := by
simpa [betaV, sub_eq_add_neg] using hGmonic.eq_X_add_C hGdegree
have hbetaResidue : IsLocalRing.residue W beta = alpha := by
have hcoeff := congrArg (fun P ↦ P.coeff 0) hGmap
rw [Polynomial.coeff_map] at hcoeff
have hC : (Polynomial.C alpha : Polynomial ell).coeff 0 = alpha :=
Polynomial.coeff_C_zero
have hg0 : gbar.coeff 0 = -alpha := by
rw [show gbar = Polynomial.X - Polynomial.C alpha from rfl,
Polynomial.coeff_sub, Polynomial.coeff_X_zero, hC, zero_sub]
have hcoeffNeg := hcoeff.trans hg0
let coeffW : W := ⟨G.coeff 0, (G.coeff 0).property⟩
have hresCoeff :
IsLocalRing.residue W coeffW =
IsLocalRing.residue Wv (G.coeff 0) := by
rfl
have hcoeffWNeg :
IsLocalRing.residue W coeffW = -alpha :=
hresCoeff.trans hcoeffNeg
calc
IsLocalRing.residue W beta =
-(IsLocalRing.residue W coeffW) := by rfl
_ = -(-alpha) := congrArg Neg.neg hcoeffWNeg
_ = alpha := neg_neg alpha
have hbetaRootV : (G * H).IsRoot betaV := by
apply Polynomial.dvd_iff_isRoot.mp
refine ⟨H, ?_⟩
rw [hGform]
have hbetaRootL :
(F.map ((algebraMap K L).comp V.subtype)).eval (beta : L) = 0 := by
change (F.map ((algebraMap K L).comp V.subtype)).eval (betaV : L) = 0
have hpoly :
F.map ((algebraMap K L).comp V.subtype) =
(G * H).map Wv.subtype := by
apply Polynomial.ext
intro n
rw [Polynomial.coeff_map, Polynomial.coeff_map]
calc
(algebraMap K L) ↑(F.coeff n) =
Wv.subtype (show Wv from FW.coeff n) := by
rw [show FW.coeff n = i (F.coeff n) by
simp [FW]]
exact (unramifiedValuationRingValuationRingMap_apply
v w hExt (F.coeff n)).symm
_ = Wv.subtype ((G * H).coeff n) := by
exact congrArg Wv.subtype
(congrArg (fun P : Polynomial Wv => P.coeff n) hGH)
rw [hpoly]
calc
_ = Wv.subtype ((G * H).eval betaV) :=
Polynomial.eval_map_apply Wv.subtype betaV
_ = Wv.subtype 0 := congrArg Wv.subtype hbetaRootV
_ = 0 := map_zero Wv.subtype
exact ⟨F, beta, hFmonic, hFmap, hbetaRootL, hbetaResidue⟩