Source context 7 commands
Surrounding namespaces, section variables, and local commands at this declaration.
noncomputable section
namespace FieldArithmetic
namespace Chapter06
namespace AffinePlaneCurve
open MvPolynomial
universe u
variable {K : Type u} [Field K]theorem not_coordinateX_dvd_coordinateY_of_partialAt_eq_zero
{f : BivariatePolynomial K} (hf : Irreducible f)
(p : RationalPoint f) (hpartial : partialAt p 1 = 0) :
letI : IsDomain (CoordinateRing f) := coordinateRing_isDomain hf
letI : (pointIdeal p).IsPrime := (pointIdeal_isMaximal p).isPrime
¬ algebraMap (CoordinateRing f) (PointLocalRing p)
(coordinate f 0 -
algebraMap K (CoordinateRing f) (p.coords 0)) ∣
algebraMap (CoordinateRing f) (PointLocalRing p)
(coordinate f 1 -
algebraMap K (CoordinateRing f) (p.coords 1)) := by
let : IsDomain (CoordinateRing f) := coordinateRing_isDomain hf
let : (pointIdeal p).IsPrime := (pointIdeal_isMaximal p).isPrime
let xA : CoordinateRing f :=
coordinate f 0 - algebraMap K (CoordinateRing f) (p.coords 0)
let yA : CoordinateRing f :=
coordinate f 1 - algebraMap K (CoordinateRing f) (p.coords 1)
let xP : BivariatePolynomial K :=
MvPolynomial.X 0 - MvPolynomial.C (p.coords 0)
let yP : BivariatePolynomial K :=
MvPolynomial.X 1 - MvPolynomial.C (p.coords 1)
intro hdiv
obtain ⟨q, hq⟩ := hdiv
obtain ⟨⟨h, s⟩, hs⟩ :=
IsLocalization.surj (pointIdeal p).primeCompl q
have hlocal :
algebraMap (CoordinateRing f) (PointLocalRing p)
(yA * (s : CoordinateRing f)) =
algebraMap (CoordinateRing f) (PointLocalRing p) (xA * h) := by
simp only [map_mul]
rw [hq, mul_assoc, hs]
have hcoordinate :
yA * (s : CoordinateRing f) = xA * h :=
IsLocalization.injective
(S := PointLocalRing p)
(pointIdeal p).primeCompl_le_nonZeroDivisors hlocal
obtain ⟨S, hS⟩ :=
Ideal.Quotient.mk_surjective
(I := equationIdeal f) (s : CoordinateRing f)
obtain ⟨H, hH⟩ :=
Ideal.Quotient.mk_surjective (I := equationIdeal f) h
have hquotient :
Ideal.Quotient.mk (equationIdeal f) (yP * S - xP * H) = 0 := by
simp only [map_sub, map_mul]
rw [hS, hH]
change yA * (s : CoordinateRing f) - xA * h = 0
rw [hcoordinate, sub_self]
have hmem :
yP * S - xP * H ∈ equationIdeal f :=
Ideal.Quotient.eq_zero_iff_mem.mp hquotient
have hfdvd : f ∣ yP * S - xP * H := by
apply Ideal.mem_span_singleton.mp
simpa [equationIdeal] using hmem
obtain ⟨G, hG⟩ := hfdvd
have hderiv :=
congrArg
(fun z : BivariatePolynomial K =>
polynomialEval p (MvPolynomial.pderiv 1 z))
hG
have hfzero : polynomialEval p f = 0 := by
simpa [polynomialEval] using p.isZero
have hpartial' :
polynomialEval p (MvPolynomial.pderiv 1 f) = 0 := by
simpa [partialAt] using hpartial
have hSzero : polynomialEval p S = 0 := by
simpa [xP, yP, MvPolynomial.pderiv_mul, hpartial',
hfzero] using hderiv
have hsPoint : (s : CoordinateRing f) ∈ pointIdeal p := by
change pointEval p (s : CoordinateRing f) = 0
rw [← hS]
simpa [polynomialEval] using hSzero
exact s.property hsPoint