AlgebraicCurves.Geometry.Schemes.Proofs.existsUnique_lift_fromNormalization_kummer_of_isAffineOpen.KummerChart.existsUnique_algHom
Source context 15 commands
Surrounding namespaces, section variables, and local commands at this declaration.
section ProofImplementation
namespace AlgebraicCurves.Geometry.Schemes.Proofs
namespace existsUnique_lift_fromNormalization_kummer_of_isAffineOpen
universe u
open _root_.CategoryTheory
open _root_.CategoryTheory.Limits
open _root_.AlgebraicGeometry
open _root_.Polynomial
open _root_.TopologicalSpace
open _root_.Opposite
namespace KummerChart
variable {X : Scheme.{u}} [IsIntegral X]
section UP
variable (k : ℕ) (g : X.functionField)
variable (V : X.Opens) [Nonempty V] (hV : IsAffineOpen V)
Lean source · full declarationtheorem existsUnique_algHom (hnorm : ∀ x : X, IsIntegrallyClosed (X.presheaf.stalk x)) (hk : IsUnit
((k : ℕ) : Γ(X, V)))
(uV : Γ(X, V)) (hu : IsUnit uV) (h : X.functionField) (hh : h ≠ 0)
(huV : X.germToFunctionField V uV = g / h ^ k)
(T : Γ((fK k g).normalization, (fK k g).fromNormalization ⁻¹ᵁ V))
(hT : yval k g V hV T = algebraMap X.functionField (KA k g) h⁻¹ * AdjoinRoot.root _)
(C : Type u) [CommRing C] [Algebra Γ(X, V) C] (c : C) (hc : c ^ k = algebraMap Γ(X, V) C uV) :
letI := ((fK k g).fromNormalization.app V).hom.toAlgebra
∃! χ : Γ((fK k g).normalization, (fK k g).fromNormalization ⁻¹ᵁ V) →ₐ[Γ(X, V)] C, χ T = c := by
let algB := ((fK k g).fromNormalization.app V).hom.toAlgebra
let algS := ((fK k g).app V).hom.toAlgebra
have : IsIntegrallyClosed Γ(X, V) := isIntegrallyClosed_sections V hV hnorm
have : IsFractionRing Γ(X, V) X.functionField := functionField_isFractionRing_of_isAffineOpen X V
hV
have hk0 : k ≠ 0 := by
rintro rfl
rw [Nat.cast_zero, isUnit_zero_iff] at hk
exact zero_ne_one hk
set ρ : KA k g := algebraMap X.functionField (KA k g) h⁻¹ * AdjoinRoot.root _ with hρ
have hg : g = algebraMap Γ(X, V) X.functionField uV * h ^ k := by
change g = X.germToFunctionField V uV * h ^ k
rw [huV, div_mul_cancel₀ _ (pow_ne_zero _ hh)]
obtain ⟨hIC, -, -⟩ :=
IsIntegrallyClosed.integralClosure_eq_adjoin_and_etale_and_finite_of_eq_mul_pow
(B := Γ(X, V)) (F := X.functionField) k hk uV hu h hh g hg
obtain ⟨Ψ, hΨT⟩ : ∃ Ψ : Γ((fK k g).normalization, (fK k g).fromNormalization ⁻¹ᵁ V) ≃ₐ[Γ(X, V)]
Algebra.adjoin Γ(X, V) {ρ}, (Ψ T : KA k g) = ρ := by
let Ψ₁ : Γ((fK k g).normalization, (fK k g).fromNormalization ⁻¹ᵁ V) ≃ₐ[Γ(X, V)]
integralClosure Γ(X, V) Γ(Spec (CommRingCat.of (KA k g)), (fK k g) ⁻¹ᵁ V) :=
AlgEquiv.ofRingEquiv (f := ((fK k g).normalizationObjIso hV).commRingCatIsoToRingEquiv) (fun
a =>
normalizationObjIso_hom_app k g V hV a)
let e := secAlgEquiv k g V
let Ψ₂ : integralClosure Γ(X, V) Γ(Spec (CommRingCat.of (KA k g)), (fK k g) ⁻¹ᵁ V) ≃ₐ[Γ(X, V)]
integralClosure Γ(X, V) (KA k g) :=
(e.subalgebraMap _).trans (Subalgebra.equivOfEq _ _ (integralClosure_map_algEquiv e))
let Ψ₃ : integralClosure Γ(X, V) (KA k g) ≃ₐ[Γ(X, V)] Algebra.adjoin Γ(X, V) {ρ} :=
Subalgebra.equivOfEq _ _ hIC
exact ⟨Ψ₁.trans (Ψ₂.trans Ψ₃), hT⟩
suffices lift : ∀ (B₁ : Type u) [CommRing B₁] [Algebra Γ(X, V) B₁]
(T₁ : B₁) (Ψ₁ : B₁ ≃ₐ[Γ(X, V)] Algebra.adjoin Γ(X, V) {ρ}),
(Ψ₁ T₁ : KA k g) = ρ → ∃! χ : B₁ →ₐ[Γ(X, V)] C, χ T₁ = c by
exact lift _ T Ψ hΨT
intro B₁ instB₁ algB₁ T₁ Ψ₁ hΨT₁
obtain ⟨fu, hfu⟩ : ∃ fu : Γ(X, V)[X], fu = Polynomial.X ^ k - Polynomial.C uV := ⟨_, rfl⟩
have hρk : ρ ^ k = algebraMap Γ(X, V) (KA k g) uV := by
rw [hρ, root_div_pow, ← huV, IsScalarTower.algebraMap_apply Γ(X, V) X.functionField (KA k g)]
rfl
let ρ' : Algebra.adjoin Γ(X, V) {ρ} := ⟨ρ, Algebra.self_mem_adjoin_singleton Γ(X, V) ρ⟩
have hρ'root : fu.eval₂ (algebraMap Γ(X, V) (Algebra.adjoin Γ(X, V) {ρ})) ρ' = 0 := by
apply Subtype.ext
rw [← Polynomial.aeval_def, Polynomial.aeval_subalgebra_coe]
change Polynomial.aeval ρ fu = 0
rw [Polynomial.aeval_def, hfu, Polynomial.eval₂_sub, Polynomial.eval₂_X_pow,
Polynomial.eval₂_C, hρk, sub_self]
obtain ⟨θ, hθroot, hθinj, hθsurj⟩ :
∃ θ : AdjoinRoot fu →ₐ[Γ(X, V)] Algebra.adjoin Γ(X, V) {ρ},
θ (AdjoinRoot.root fu) = ρ' ∧ Function.Injective θ ∧ Function.Surjective θ := by
let θ : AdjoinRoot fu →ₐ[Γ(X, V)] Algebra.adjoin Γ(X, V) {ρ} :=
AdjoinRoot.liftAlgHom fu (Algebra.ofId _ _) ρ' hρ'root
have hθroot : θ (AdjoinRoot.root fu) = ρ' := AdjoinRoot.liftAlgHom_root _ _ _ _
have hθsurj : Function.Surjective θ := by
rintro ⟨y, hy⟩
rw [Algebra.adjoin_singleton_eq_range_aeval] at hy
obtain ⟨p, rfl⟩ := hy
refine ⟨AdjoinRoot.mk fu p, Subtype.ext ?_⟩
change ((AdjoinRoot.liftAlgHom fu (Algebra.ofId _ _) ρ' hρ'root (AdjoinRoot.mk fu p) :
Algebra.adjoin Γ(X, V) {ρ}) : KA k g) = _
refine (congrArg (fun y : Algebra.adjoin Γ(X, V) {ρ} => (y : KA k g))
(AdjoinRoot.liftAlgHom_mk fu (Algebra.ofId _ _) ρ' hρ'root p)).trans ?_
change ((Polynomial.eval₂ (algebraMap Γ(X, V) (Algebra.adjoin Γ(X, V) {ρ})) ρ' p :
Algebra.adjoin Γ(X, V) {ρ}) : KA k g) =
Polynomial.aeval ρ p
rw [← Polynomial.aeval_def, Polynomial.aeval_subalgebra_coe]
have hθinj : Function.Injective θ := by
rw [injective_iff_map_eq_zero]
intro x hx
induction x using AdjoinRoot.induction_on with
| ih p =>
rw [hfu]
apply mk_eq_zero_of_aeval_rho_eq_zero k g V hV hk0 h hh uV huV p
have hx' := congrArg (fun y : Algebra.adjoin Γ(X, V) {ρ} => (y : KA k g)) hx
change ((AdjoinRoot.liftAlgHom fu (Algebra.ofId _ _) ρ' hρ'root (AdjoinRoot.mk fu p) :
Algebra.adjoin Γ(X, V) {ρ}) : KA k g) = 0 at hx'
have hev := congrArg (fun y : Algebra.adjoin Γ(X, V) {ρ} => (y : KA k g))
(AdjoinRoot.liftAlgHom_mk fu (Algebra.ofId _ _) ρ' hρ'root p)
have hx'' := hev.symm.trans hx'
change ((Polynomial.eval₂ (algebraMap Γ(X, V) (Algebra.adjoin Γ(X, V) {ρ})) ρ' p :
Algebra.adjoin Γ(X, V) {ρ}) : KA k g) = 0
at hx''
rw [← Polynomial.aeval_def, Polynomial.aeval_subalgebra_coe] at hx''
exact hx''
exact ⟨θ, hθroot, hθinj, hθsurj⟩
obtain ⟨Θ, hΘ⟩ : ∃ Θ : B₁ ≃ₐ[Γ(X, V)] AdjoinRoot fu,
Θ = Ψ₁.trans (AlgEquiv.ofBijective θ ⟨hθinj, hθsurj⟩).symm := ⟨_, rfl⟩
have hΘT : Θ T₁ = AdjoinRoot.root fu := by
rw [hΘ, AlgEquiv.trans_apply]
rw [AlgEquiv.symm_apply_eq]
apply Subtype.ext
rw [hΨT₁]
change ρ = ((θ (AdjoinRoot.root fu) : Algebra.adjoin Γ(X, V) {ρ}) : KA k g)
rw [hθroot]
have hcroot : fu.eval₂ (algebraMap Γ(X, V) C) c = 0 := by
rw [hfu, Polynomial.eval₂_sub, Polynomial.eval₂_X_pow, Polynomial.eval₂_C, hc, sub_self]
refine ⟨(AdjoinRoot.liftAlgHom fu (Algebra.ofId _ _) c hcroot).comp Θ.toAlgHom, ?_, ?_⟩
· change AdjoinRoot.liftAlgHom fu (Algebra.ofId _ _) c hcroot (Θ T₁) = c
rw [hΘT]
exact AdjoinRoot.liftAlgHom_root fu (Algebra.ofId _ _) c hcroot
· intro χ hχ
have key : χ.comp Θ.symm.toAlgHom = AdjoinRoot.liftAlgHom fu (Algebra.ofId _ _) c hcroot := by
apply AdjoinRoot.algHom_ext
refine Eq.trans ?_ (AdjoinRoot.liftAlgHom_root fu (Algebra.ofId _ _) c hcroot).symm
change χ (Θ.symm (AdjoinRoot.root fu)) = c
rw [← hΘT, Θ.symm_apply_apply, hχ]
rw [← key]
ext x
change χ x = χ (Θ.symm (Θ x))
rw [Θ.symm_apply_apply]