Files / lean / OAI / AlgebraicGeometry / AbhyankarSathaye / LinearPresentation.lean

6.2 kB · changed
import OAI.AlgebraicGeometry.AbhyankarSathaye.Lifting
import OAI.AlgebraicGeometry.AbhyankarSathaye.LinearElimination

namespace OAI

/-!
# The intermediate linear presentation

The relation `h * G - y * U = x` has parameter `α * U + β * G`.
The remaining compatible equations generate the principal ideal `(W - W₀)`.
-/

noncomputable section
namespace AbhyankarSathaye.LinearPresentation
open MvPolynomial

variable {B : Type*} [CommRing B]

def relation (h x y : B) : MvPolynomial (Fin 2) B := C h*X 1-C y*X 0-C x
def ideal (h x y : B) : Ideal (MvPolynomial (Fin 2) B) := Ideal.span {relation h x y}
abbrev A (h x y : B) := MvPolynomial (Fin 2) B ⧸ ideal h x y
def qmap (h x y : B) : MvPolynomial (Fin 2) B →ₐ[B] A h x y :=
  Ideal.Quotient.mkₐ B (ideal h x y)
def qvar (h x y : B) (i : Fin 2) : A h x y := qmap h x y (X i)
def coeff (h x y : B) : B →+* A h x y := algebraMap B _

theorem linear_relation (h x y : B) :
    coeff h x y h*qvar h x y 1-coeff h x y y*qvar h x y 0 = coeff h x y x := by
  have hz : qmap h x y (relation h x y) = 0 :=
    Ideal.Quotient.eq_zero_iff_mem.mpr (Ideal.subset_span (by simp))
  apply sub_eq_zero.mp
  simpa [relation, qvar, coeff] using hz

def values (h x y α β : B) : Fin 2 → Polynomial B :=
  ![Lifting.polyU h x β, Lifting.polyG x y α]

def forward (h x y α β : B) (hb : α*h+β*y = 1) : A h x y →ₐ[B] Polynomial B := by
  let ev : MvPolynomial (Fin 2) B →ₐ[B] Polynomial B := aeval (values h x y α β)
  have hb' : Polynomial.C α*Polynomial.C h+Polynomial.C β*Polynomial.C y = 1 := by
    simpa using congrArg (Polynomial.C : B →+* Polynomial B) hb
  have he : ev (relation h x y) = 0 := by
    simpa [ev, values, relation, Lifting.polyU, Lifting.polyG,
      Polynomial.algebraMap_eq, inverseU, inverseG] using
      sub_eq_zero.mpr (linear_parameter_relation (Polynomial.C h) (Polynomial.C x)
        (Polynomial.C y) (Polynomial.C α) (Polynomial.C β) Polynomial.X hb')
  have hi : ideal h x y ≤ RingHom.ker ev := by
    apply Ideal.span_le.mpr
    intro z hz
    simp only [Set.mem_singleton_iff] at hz
    subst z
    exact he
  exact Ideal.Quotient.liftₐ _ ev (fun z hz => hi hz)

@[simp] theorem forward_qvar (h x y α β : B) (hb) (i : Fin 2) :
    forward h x y α β hb (qvar h x y i) = values h x y α β i := by
  change (aeval (values h x y α β) : MvPolynomial (Fin 2) B →ₐ[B] Polynomial B) (X i) = _
  exact aeval_X _ _

def backward (h x y α β : B) : Polynomial B →ₐ[B] A h x y :=
  Polynomial.aeval (coeff h x y α*qvar h x y 0+coeff h x y β*qvar h x y 1)

theorem forward_backward (h x y α β : B) (hb) :
    (forward h x y α β hb).comp (backward h x y α β) = AlgHom.id B _ := by
  apply Polynomial.algHom_ext
  have hb' : Polynomial.C α*Polynomial.C h+Polynomial.C β*Polynomial.C y = 1 := by
    simpa using congrArg (Polynomial.C : B →+* Polynomial B) hb
  simpa [backward, coeff, values, Lifting.polyU, Lifting.polyG, inverseU, inverseG,
    Polynomial.algebraMap_eq] using
    linear_parameter_inverse (Polynomial.C h) (Polynomial.C x) (Polynomial.C y)
      (Polynomial.C α) (Polynomial.C β) Polynomial.X hb'

theorem backward_forward (h x y α β : B) (hb) :
    (backward h x y α β).comp (forward h x y α β hb) = AlgHom.id B _ := by
  apply Ideal.Quotient.algHom_ext
  apply MvPolynomial.algHom_ext
  intro i
  have hb' : coeff h x y α*coeff h x y h+coeff h x y β*coeff h x y y = 1 := by
    simpa using congrArg (coeff h x y) hb
  change backward h x y α β (forward h x y α β hb (qvar h x y i)) = qvar h x y i
  rw [forward_qvar]
  fin_cases i
  · simpa [backward, values, Lifting.polyU, inverseU, coeff] using
      recover_U (coeff h x y h) (coeff h x y x) (coeff h x y y)
        (coeff h x y α) (coeff h x y β) (qvar h x y 0) (qvar h x y 1)
        hb' (linear_relation h x y)
  · simpa [backward, values, Lifting.polyG, inverseG, coeff] using
      recover_G (coeff h x y h) (coeff h x y x) (coeff h x y y)
        (coeff h x y α) (coeff h x y β) (qvar h x y 0) (qvar h x y 1)
        hb' (linear_relation h x y)

def equivalence (h x y α β : B) (hb : α*h+β*y = 1) : A h x y ≃ₐ[B] Polynomial B :=
  AlgEquiv.ofAlgHom (forward h x y α β hb) (backward h x y α β)
    (forward_backward h x y α β hb) (backward_forward h x y α β hb)

def a (h x y : B) : A h x y := coeff h x y y+(qvar h x y 0)^2
def b (h x y s : B) : A h x y := coeff h x y s-coeff h x y h*(qvar h x y 1)^2+
  2*qvar h x y 0*coeff h x y y*qvar h x y 1
def r (h x y α β : B) : A h x y := coeff h x y α*(1+coeff h x y β*coeff h x y y)
def q (h x y β : B) : A h x y := (coeff h x y β)^2
def W0 (h x y s α β : B) : A h x y := r h x y α β*a h x y+q h x y β*b h x y s

theorem compatible (h x y s : B) (hc : x^2+y^3 = h*s) :
    (coeff h x y y)^2*a h x y = coeff h x y h*b h x y s := by
  have hc' : (coeff h x y x)^2+(coeff h x y y)^3 = coeff h x y h*coeff h x y s := by
    simpa using congrArg (coeff h x y) hc
  exact compatibility _ _ _ _ _ _ hc' (linear_relation h x y)

theorem bezout_squared (h x y α β : B) (hb : α*h+β*y = 1) :
    r h x y α β*coeff h x y h+q h x y β*(coeff h x y y)^2 = 1 := by
  have hb' : coeff h x y α*coeff h x y h+coeff h x y β*coeff h x y y = 1 := by
    simpa using congrArg (coeff h x y) hb
  exact squared_bezout _ _ _ _ hb'

theorem W_ideal (h x y s α β : B) (hc : x^2+y^3 = h*s) (hb : α*h+β*y = 1) :
    Ideal.span ({Polynomial.C (coeff h x y h)*Polynomial.X-Polynomial.C (a h x y),
      Polynomial.C ((coeff h x y y)^2)*Polynomial.X-Polynomial.C (b h x y s)} :
      Set (Polynomial (A h x y))) = Ideal.span {Polynomial.X-Polynomial.C (W0 h x y s α β)} := by
  have hc' := congrArg (Polynomial.C : A h x y →+* Polynomial (A h x y)) (compatible h x y s hc)
  have hb' := congrArg (Polynomial.C : A h x y →+* Polynomial (A h x y)) (bezout_squared h x y α β hb)
  simp only [map_mul, map_add, map_one] at hc' hb'
  simpa only [W0, map_add, map_mul] using
    linear_ideal (Polynomial.C (coeff h x y h)) (Polynomial.C ((coeff h x y y)^2))
      (Polynomial.C (a h x y)) (Polynomial.C (b h x y s))
      (Polynomial.C (r h x y α β)) (Polynomial.C (q h x y β)) Polynomial.X hc' hb'

end AbhyankarSathaye.LinearPresentation

end

end OAI

SHA-256 0bd3cd657eb53f988e3343a1671038c88117fa220a7cd9f85322c34fc35db8e8