import OAI.AlgebraicGeometry.AbhyankarSathaye.Quotient
import Mathlib.Data.Fin.VecNotation
import Mathlib.Tactic.FinCases
namespace OAI
/-!
# A polynomial presentation of the affine plane
The relations `h = 1 + P x y s` and `x² + y³ = h * s` give a polynomial
algebra with coordinates `x + s³` and `y - s²`. The auxiliary variables are
ordered as `h, x, y, s`.
-/
noncomputable section
namespace AbhyankarSathaye.Plane
open MvPolynomial
variable (K : Type*) [CommRing K]
def relH : MvPolynomial (Fin 4) K := X 0-1-P (X 1) (X 2) (X 3)
def relCusp : MvPolynomial (Fin 4) K := X 1^2+X 2^3-X 3*X 0
def ideal : Ideal (MvPolynomial (Fin 4) K) := Ideal.span {relH K, relCusp K}
abbrev Q := MvPolynomial (Fin 4) K ⧸ ideal K
def qmap : MvPolynomial (Fin 4) K →ₐ[K] Q K := Ideal.Quotient.mkₐ K (ideal K)
def qvar (i : Fin 4) : Q K := qmap K (X i)
theorem relation_h : qvar K 0 = 1+P (qvar K 1) (qvar K 2) (qvar K 3) := by
have hz : qmap K (relH K) = 0 := quotient_pair_left (relH K) (relCusp K)
have hh : qvar K 0-1-P (qvar K 1) (qvar K 2) (qvar K 3) = 0 := by
simpa [relH, qvar] using hz
calc
_ = (qvar K 0-1-P (qvar K 1) (qvar K 2) (qvar K 3))+
(1+P (qvar K 1) (qvar K 2) (qvar K 3)) := by ring
_ = _ := by rw [hh, zero_add]
theorem relation_cusp : (qvar K 1)^2+(qvar K 2)^3 = qvar K 0*qvar K 3 := by
have hz : qmap K (relCusp K) = 0 := quotient_pair_right (relH K) (relCusp K)
have hh : (qvar K 1)^2+(qvar K 2)^3-qvar K 3*qvar K 0 = 0 := by
simpa [relCusp, qvar] using hz
simpa [mul_comm] using sub_eq_zero.mp hh
theorem shift_s : (qvar K 1+(qvar K 3)^3)^2+(qvar K 2-(qvar K 3)^2)^3 = qvar K 3 := by
rw [shift_universal, relation_cusp, relation_h]
ring
theorem bezout : Alpha (qvar K 1) (qvar K 3)*qvar K 0+
Beta (qvar K 1) (qvar K 2) (qvar K 3)*qvar K 2 = 1 := by
have he := bezout_certificate (qvar K 0) (qvar K 1) (qvar K 2) (qvar K 3)
have hh : qvar K 0-1-P (qvar K 1) (qvar K 2) (qvar K 3) = 0 := by
rw [relation_h]; ring
have hc : (qvar K 1)^2+(qvar K 2)^3-qvar K 3*qvar K 0 = 0 := by
rw [relation_cusp]; ring
rw [hh, hc, mul_zero, mul_zero, sub_zero] at he
exact sub_eq_zero.mp he
def planeS : MvPolynomial (Fin 2) K := X 0^2+X 1^3
def planeX : MvPolynomial (Fin 2) K := X 0-(planeS K)^3
def planeY : MvPolynomial (Fin 2) K := X 1+(planeS K)^2
def planeH : MvPolynomial (Fin 2) K := 1+P (planeX K) (planeY K) (planeS K)
def values : Fin 4 → MvPolynomial (Fin 2) K :=
![planeH K, planeX K, planeY K, planeS K]
theorem plane_cusp : (planeX K)^2+(planeY K)^3 = planeH K*planeS K := by
have he := shift_universal (planeX K) (planeY K) (planeS K)
have hx : planeX K+(planeS K)^3 = X 0 := by unfold planeX; ring
have hy : planeY K-(planeS K)^2 = X 1 := by unfold planeY; ring
rw [hx, hy] at he
change planeS K = (planeX K)^2+(planeY K)^3-planeS K*P (planeX K) (planeY K) (planeS K) at he
calc
_ = (planeS K)+planeS K*P (planeX K) (planeY K) (planeS K) := by
exact (eq_sub_iff_add_eq.mp he).symm
_ = _ := by unfold planeH; ring
def forward : Q K →ₐ[K] MvPolynomial (Fin 2) K :=
lift_pair (relH K) (relCusp K) (aeval (values K))
(by simp [relH, values, planeH])
(by simp [relCusp, values, plane_cusp, mul_comm])
@[simp] theorem forward_qvar (i : Fin 4) : forward K (qvar K i) = values K i := by
change aeval (values K) (X i) = values K i
exact aeval_X _ _
def backward : MvPolynomial (Fin 2) K →ₐ[K] Q K :=
aeval ![qvar K 1+(qvar K 3)^3, qvar K 2-(qvar K 3)^2]
@[simp] theorem backward_planeS : backward K (planeS K) = qvar K 3 := by
simpa [backward, planeS] using shift_s K
@[simp] theorem backward_planeX : backward K (planeX K) = qvar K 1 := by
simp only [planeX, map_sub, map_pow, backward_planeS]
simp [backward]
@[simp] theorem backward_planeY : backward K (planeY K) = qvar K 2 := by
simp only [planeY, map_add, map_pow, backward_planeS]
simp [backward]
@[simp] theorem backward_planeH : backward K (planeH K) = qvar K 0 := by
simpa [planeH] using (relation_h K).symm
theorem forward_backward : (forward K).comp (backward K) = AlgHom.id K _ := by
apply MvPolynomial.algHom_ext
intro i
fin_cases i <;> simp [backward, values, planeX, planeY]
theorem backward_forward : (backward K).comp (forward K) = AlgHom.id K _ := by
apply Ideal.Quotient.algHom_ext
apply MvPolynomial.algHom_ext
intro i
change backward K (forward K (qvar K i)) = qvar K i
rw [forward_qvar]
fin_cases i <;> simp [values]
def equivalence : Q K ≃ₐ[K] MvPolynomial (Fin 2) K :=
AlgEquiv.ofAlgHom (forward K) (backward K) (forward_backward K) (backward_forward K)
end AbhyankarSathaye.Plane
end
end OAI
SHA-256 048bdff674496e8f346f41c505a1f3ff74f2e29d3a50f12e005efe2ab6f82ed3