Example #1
0
def WeierstrassMap_P1xP1(polynomial, variables=None):
    r"""
    Map an anticanonical hypersurface in
    `\mathbb{P}^1 \times \mathbb{P}^1` into Weierstrass form.

    Input/output is the same as :func:`WeierstrassMap`, except that
    the input polynomial must be a standard anticanonical hypersurface
    in the toric surface `\mathbb{P}^1 \times \mathbb{P}^1`:

    EXAMPLES::

        sage: from sage.schemes.toric.weierstrass_covering import WeierstrassMap_P1xP1
        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P1xP1
        sage: R.<x0,x1,y0,y1,a>= QQ[]
        sage: biquadric = ( x0^2*y0^2 + x1^2*y0^2 + x0^2*y1^2 + x1^2*y1^2 +
        ....:     a * x0*x1*y0*y1*5 )
        sage: f, g = WeierstrassForm_P1xP1(biquadric, [x0, x1, y0, y1]);  (f,g)
        (-625/48*a^4 + 25/3*a^2 - 16/3, 15625/864*a^6 - 625/36*a^4 - 100/9*a^2 + 128/27)
        sage: X, Y, Z = WeierstrassMap_P1xP1(biquadric, [x0, x1, y0, y1])
        sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(R.ideal(biquadric))
        0

        sage: R = PolynomialRing(QQ, 'x,y,s,t', order='lex')
        sage: R.inject_variables()
        Defining x, y, s, t
        sage: equation = ( s^2*(x^2+2*x*y+3*y^2) + s*t*(4*x^2+5*x*y+6*y^2)
        ....:              + t^2*(7*x^2+8*x*y+9*y^2) )
        sage: X, Y, Z = WeierstrassMap_P1xP1(equation, [x,y,s,t])
        sage: f, g = WeierstrassForm_P1xP1(equation, variables=[x,y,s,t])
        sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(R.ideal(equation))
        0

        sage: R = PolynomialRing(QQ, 'x,s', order='lex')
        sage: R.inject_variables()
        Defining x, s
        sage: equation = s^2*(x^2+2*x+3) + s*(4*x^2+5*x+6) + (7*x^2+8*x+9)
        sage: X, Y, Z = WeierstrassMap_P1xP1(equation)
        sage: f, g = WeierstrassForm_P1xP1(equation)
        sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(R.ideal(equation))
        0
    """
    x,y,s,t = _check_polynomial_P1xP1(polynomial, variables)
    a00 = polynomial.coefficient({s:2})
    V = polynomial.coefficient({s:1})
    U = - _partial_discriminant(polynomial, s, t) / 4
    Q = invariant_theory.binary_quartic(U, x, y)
    g = Q.g_covariant()
    h = Q.h_covariant()
    if t is None:
        t = 1
    return ( 4*g*t**2, 4*h*t**3, (a00*s+V/2) )
def WeierstrassMap_P1xP1(polynomial, variables=None):
    r"""
    Map an anticanonical hypersurface in
    `\mathbb{P}^1 \times \mathbb{P}^1` into Weierstrass form.

    Input/output is the same as :func:`WeierstrassMap`, except that
    the input polynomial must be a standard anticanonical hypersurface
    in the toric surface `\mathbb{P}^1 \times \mathbb{P}^1`:

    EXAMPLES::

        sage: from sage.schemes.toric.weierstrass_covering import WeierstrassMap_P1xP1
        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P1xP1
        sage: R.<x0,x1,y0,y1,a>= QQ[]
        sage: biquadric = ( x0^2*y0^2 + x1^2*y0^2 + x0^2*y1^2 + x1^2*y1^2 +
        ....:     a * x0*x1*y0*y1*5 )
        sage: f, g = WeierstrassForm_P1xP1(biquadric, [x0, x1, y0, y1]);  (f,g)
        (-625/48*a^4 + 25/3*a^2 - 16/3, 15625/864*a^6 - 625/36*a^4 - 100/9*a^2 + 128/27)
        sage: X, Y, Z = WeierstrassMap_P1xP1(biquadric, [x0, x1, y0, y1])
        sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(R.ideal(biquadric))
        0

        sage: R = PolynomialRing(QQ, 'x,y,s,t', order='lex')
        sage: R.inject_variables()
        Defining x, y, s, t
        sage: equation = ( s^2*(x^2+2*x*y+3*y^2) + s*t*(4*x^2+5*x*y+6*y^2)
        ....:              + t^2*(7*x^2+8*x*y+9*y^2) )
        sage: X, Y, Z = WeierstrassMap_P1xP1(equation, [x,y,s,t])
        sage: f, g = WeierstrassForm_P1xP1(equation, variables=[x,y,s,t])
        sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(R.ideal(equation))
        0

        sage: R = PolynomialRing(QQ, 'x,s', order='lex')
        sage: R.inject_variables()
        Defining x, s
        sage: equation = s^2*(x^2+2*x+3) + s*(4*x^2+5*x+6) + (7*x^2+8*x+9)
        sage: X, Y, Z = WeierstrassMap_P1xP1(equation)
        sage: f, g = WeierstrassForm_P1xP1(equation)
        sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(R.ideal(equation))
        0
    """
    x, y, s, t = _check_polynomial_P1xP1(polynomial, variables)
    a00 = polynomial.coefficient({s: 2})
    V = polynomial.coefficient({s: 1})
    U = -_partial_discriminant(polynomial, s, t) / 4
    Q = invariant_theory.binary_quartic(U, x, y)
    g = Q.g_covariant()
    h = Q.h_covariant()
    if t is None:
        t = 1
    return (4 * g * t**2, 4 * h * t**3, (a00 * s + V / 2))
Example #3
0
def WeierstrassForm_P1xP1(biquadric, variables=None):
    r"""
    Bring a biquadric into Weierstrass form

    Input/output is the same as :func:`WeierstrassForm`, except that
    the input polynomial must be a standard biquadric in `\mathbb{P}^2`,

    .. MATH::

        \begin{split}
          p(x,y) =&\;
          a_{40} x^4 +
          a_{30} x^3 +
          a_{21} x^2 y +
          a_{20} x^2 +
          \\ &\;
          a_{11} x y +
          a_{02} y^2 +
          a_{10} x +
          a_{01} y +
          a_{00}
        \end{split}

    EXAMPLES::

        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P1xP1
        sage: R.<x0,x1,y0,y1>= QQ[]
        sage: biquadric = ( x0^2*y0^2 + x0*x1*y0^2*2 + x1^2*y0^2*3
        ....:    + x0^2*y0*y1*4 + x0*x1*y0*y1*5 + x1^2*y0*y1*6
        ....:    + x0^2*y1^2*7 + x0*x1*y1^2*8 )
        sage: WeierstrassForm_P1xP1(biquadric, [x0, x1, y0, y1])
        (1581/16, -3529/32)

    Since there is no `x_1^2 y_1^2` term in ``biquadric``, we can
    dehomogenize it and get a cubic::

        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2
        sage: WeierstrassForm_P2(biquadric(x0=1,y0=1))
        (1581/16, -3529/32)

    TESTS::

        sage: R.<x0,x1,y0,y1,a00,a10,a20,a01,a11,a21,a02,a12,a22> = QQ[]
        sage: biquadric = ( x0^2*y0^2*a00 + x0*x1*y0^2*a10 + x1^2*y0^2*a20
        ....:    + x0^2*y0*y1*a01 + x0*x1*y0*y1*a11 + x1^2*y0*y1*a21
        ....:    + x0^2*y1^2*a02 + x0*x1*y1^2*a12 )
        sage: WeierstrassForm_P1xP1(biquadric, [x0, x1, y0, y1])
        (-1/48*a11^4 + 1/6*a01*a11^2*a21 - 1/3*a01^2*a21^2
         + 1/6*a20*a11^2*a02 + 1/3*a20*a01*a21*a02 - 1/2*a10*a11*a21*a02
         + a00*a21^2*a02 - 1/3*a20^2*a02^2 - 1/2*a20*a01*a11*a12
         + 1/6*a10*a11^2*a12 + 1/3*a10*a01*a21*a12 - 1/2*a00*a11*a21*a12
         + 1/3*a10*a20*a02*a12 - 1/3*a10^2*a12^2 + a00*a20*a12^2, 1/864*a11^6
         - 1/72*a01*a11^4*a21 + 1/18*a01^2*a11^2*a21^2 - 2/27*a01^3*a21^3
         - 1/72*a20*a11^4*a02 + 1/36*a20*a01*a11^2*a21*a02
         + 1/24*a10*a11^3*a21*a02 + 1/9*a20*a01^2*a21^2*a02
         - 1/6*a10*a01*a11*a21^2*a02 - 1/12*a00*a11^2*a21^2*a02
         + 1/3*a00*a01*a21^3*a02 + 1/18*a20^2*a11^2*a02^2
         + 1/9*a20^2*a01*a21*a02^2 - 1/6*a10*a20*a11*a21*a02^2
         + 1/4*a10^2*a21^2*a02^2 - 2/3*a00*a20*a21^2*a02^2 - 2/27*a20^3*a02^3
         + 1/24*a20*a01*a11^3*a12 - 1/72*a10*a11^4*a12
         - 1/6*a20*a01^2*a11*a21*a12 + 1/36*a10*a01*a11^2*a21*a12
         + 1/24*a00*a11^3*a21*a12 + 1/9*a10*a01^2*a21^2*a12
         - 1/6*a00*a01*a11*a21^2*a12 - 1/6*a20^2*a01*a11*a02*a12
         + 1/36*a10*a20*a11^2*a02*a12 + 1/18*a10*a20*a01*a21*a02*a12
         - 1/6*a10^2*a11*a21*a02*a12 + 5/6*a00*a20*a11*a21*a02*a12
         - 1/6*a00*a10*a21^2*a02*a12 + 1/9*a10*a20^2*a02^2*a12
         + 1/4*a20^2*a01^2*a12^2 - 1/6*a10*a20*a01*a11*a12^2
         + 1/18*a10^2*a11^2*a12^2 - 1/12*a00*a20*a11^2*a12^2
         + 1/9*a10^2*a01*a21*a12^2 - 1/6*a00*a20*a01*a21*a12^2
         - 1/6*a00*a10*a11*a21*a12^2 + 1/4*a00^2*a21^2*a12^2
         + 1/9*a10^2*a20*a02*a12^2 - 2/3*a00*a20^2*a02*a12^2
         - 2/27*a10^3*a12^3 + 1/3*a00*a10*a20*a12^3)

        sage: _ == WeierstrassForm_P1xP1(biquadric.subs(x1=1,y1=1), [x0, y0])
        True
    """
    x, y, s, t = _check_polynomial_P1xP1(biquadric, variables)
    delta = _partial_discriminant(biquadric, s, t)
    Q = invariant_theory.binary_quartic(delta, x, y)
    g2 = Q.EisensteinD()
    g3 = -Q.EisensteinE()
    return (-g2/4, -g3/4)
Example #4
0
def WeierstrassForm_P2_112(polynomial, variables=None):
    r"""
    Bring an anticanonical hypersurface in `\mathbb{P}^2[1,1,2]` into Weierstrass form.

    Input/output is the same as :func:`WeierstrassForm`, except that
    the input polynomial must be a standard anticanonical hypersurface
    in weighted projective space `\mathbb{P}^2[1,1,2]`:

    .. MATH::

        \begin{split}
          p(x,y) =&\;
          a_{40} x^4 +
          a_{30} x^3 +
          a_{21} x^2 y +
          a_{20} x^2 +
          \\ &\;
          a_{11} x y +
          a_{02} y^2 +
          a_{10} x +
          a_{01} y +
          a_{00}
        \end{split}

    EXAMPLES::

        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2_112
        sage: fan = Fan(rays=[(1,0),(0,1),(-1,-2),(0,-1)],cones=[[0,1],[1,2],[2,3],[3,0]])
        sage: P112.<x,y,z,t> = ToricVariety(fan)
        sage: (-P112.K()).sections_monomials()
        (z^4*t^2, x*z^3*t^2, x^2*z^2*t^2, x^3*z*t^2,
         x^4*t^2, y*z^2*t, x*y*z*t, x^2*y*t, y^2)
        sage: WeierstrassForm_P2_112(sum(_), [x,y,z,t])
        (-97/48, 17/864)

    TESTS::

        sage: R.<x,y,z,t,a40,a30,a20,a10,a00,a21,a11,a01,a02> = QQ[]
        sage: p = ( a40*x^4*t^2 + a30*x^3*z*t^2 + a20*x^2*z^2*t^2 + a10*x*z^3*t^2 +
        ....:       a00*z^4*t^2 + a21*x^2*y*t + a11*x*y*z*t + a01*y*z^2*t + a02*y^2 )
        sage: WeierstrassForm_P2_112(p, [x,y,z,t])
        (-1/48*a11^4 + 1/6*a21*a11^2*a01 - 1/3*a21^2*a01^2 + a00*a21^2*a02
         - 1/2*a10*a21*a11*a02 + 1/6*a20*a11^2*a02 + 1/3*a20*a21*a01*a02
         - 1/2*a30*a11*a01*a02 + a40*a01^2*a02 - 1/3*a20^2*a02^2 + a30*a10*a02^2
         - 4*a40*a00*a02^2, 1/864*a11^6 - 1/72*a21*a11^4*a01
         + 1/18*a21^2*a11^2*a01^2 - 2/27*a21^3*a01^3 - 1/12*a00*a21^2*a11^2*a02
         + 1/24*a10*a21*a11^3*a02 - 1/72*a20*a11^4*a02 + 1/3*a00*a21^3*a01*a02
         - 1/6*a10*a21^2*a11*a01*a02 + 1/36*a20*a21*a11^2*a01*a02
         + 1/24*a30*a11^3*a01*a02 + 1/9*a20*a21^2*a01^2*a02
         - 1/6*a30*a21*a11*a01^2*a02 - 1/12*a40*a11^2*a01^2*a02
         + 1/3*a40*a21*a01^3*a02 + 1/4*a10^2*a21^2*a02^2
         - 2/3*a20*a00*a21^2*a02^2 - 1/6*a20*a10*a21*a11*a02^2
         + a30*a00*a21*a11*a02^2 + 1/18*a20^2*a11^2*a02^2
         - 1/12*a30*a10*a11^2*a02^2 - 2/3*a40*a00*a11^2*a02^2
         + 1/9*a20^2*a21*a01*a02^2 - 1/6*a30*a10*a21*a01*a02^2
         - 4/3*a40*a00*a21*a01*a02^2 - 1/6*a30*a20*a11*a01*a02^2
         + a40*a10*a11*a01*a02^2 + 1/4*a30^2*a01^2*a02^2
         - 2/3*a40*a20*a01^2*a02^2 - 2/27*a20^3*a02^3
         + 1/3*a30*a20*a10*a02^3 - a40*a10^2*a02^3 - a30^2*a00*a02^3
         + 8/3*a40*a20*a00*a02^3)

        sage: _ == WeierstrassForm_P2_112(p.subs(z=1,t=1), [x,y])
        True

        sage: cubic = p.subs(a40=0)
        sage: a,b = WeierstrassForm_P2_112(cubic, [x,y,z,t])
        sage: a = a.subs(t=1,z=1)
        sage: b = b.subs(t=1,z=1)
        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2
        sage: (a,b) == WeierstrassForm_P2(cubic.subs(t=1,z=1), [x,y])
        True
    """
    x, y, z, t = _check_polynomial_P2_112(polynomial, variables)
    delta = _partial_discriminant(polynomial, y, t)
    Q = invariant_theory.binary_quartic(delta, x, z)
    g2 = Q.EisensteinD()
    g3 = -Q.EisensteinE()
    return (-g2/4, -g3/4)
Example #5
0
def WeierstrassForm_P1xP1(biquadric, variables=None):
    r"""
    Bring a biquadric into Weierstrass form

    Input/output is the same as :func:`WeierstrassForm`, except that
    the input polynomial must be a standard biquadric in `\mathbb{P}^2`,

    .. math::

        \begin{split}
          p(x,y) =&\;
          a_{40} x^4 +
          a_{30} x^3 +
          a_{21} x^2 y +
          a_{20} x^2 +
          \\ &\;
          a_{11} x y +
          a_{02} y^2 +
          a_{10} x +
          a_{01} y +
          a_{00}
        \end{split}

    EXAMPLES::

        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P1xP1
        sage: R.<x0,x1,y0,y1>= QQ[]
        sage: biquadric = ( x0^2*y0^2 + x0*x1*y0^2*2 + x1^2*y0^2*3
        ....:    + x0^2*y0*y1*4 + x0*x1*y0*y1*5 + x1^2*y0*y1*6
        ....:    + x0^2*y1^2*7 + x0*x1*y1^2*8 )
        sage: WeierstrassForm_P1xP1(biquadric, [x0, x1, y0, y1])
        (1581/16, -3529/32)

    Since there is no `x_1^2 y_1^2` term in ``biquadric``, we can
    dehomogenize it and get a cubic::

        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2
        sage: WeierstrassForm_P2(biquadric(x0=1,y0=1))
        (1581/16, -3529/32)

    TESTS::

        sage: R.<x0,x1,y0,y1,a00,a10,a20,a01,a11,a21,a02,a12,a22> = QQ[]
        sage: biquadric = ( x0^2*y0^2*a00 + x0*x1*y0^2*a10 + x1^2*y0^2*a20
        ....:    + x0^2*y0*y1*a01 + x0*x1*y0*y1*a11 + x1^2*y0*y1*a21
        ....:    + x0^2*y1^2*a02 + x0*x1*y1^2*a12 )
        sage: WeierstrassForm_P1xP1(biquadric, [x0, x1, y0, y1])
        (-1/48*a11^4 + 1/6*a01*a11^2*a21 - 1/3*a01^2*a21^2
         + 1/6*a20*a11^2*a02 + 1/3*a20*a01*a21*a02 - 1/2*a10*a11*a21*a02
         + a00*a21^2*a02 - 1/3*a20^2*a02^2 - 1/2*a20*a01*a11*a12
         + 1/6*a10*a11^2*a12 + 1/3*a10*a01*a21*a12 - 1/2*a00*a11*a21*a12
         + 1/3*a10*a20*a02*a12 - 1/3*a10^2*a12^2 + a00*a20*a12^2, 1/864*a11^6
         - 1/72*a01*a11^4*a21 + 1/18*a01^2*a11^2*a21^2 - 2/27*a01^3*a21^3
         - 1/72*a20*a11^4*a02 + 1/36*a20*a01*a11^2*a21*a02
         + 1/24*a10*a11^3*a21*a02 + 1/9*a20*a01^2*a21^2*a02
         - 1/6*a10*a01*a11*a21^2*a02 - 1/12*a00*a11^2*a21^2*a02
         + 1/3*a00*a01*a21^3*a02 + 1/18*a20^2*a11^2*a02^2
         + 1/9*a20^2*a01*a21*a02^2 - 1/6*a10*a20*a11*a21*a02^2
         + 1/4*a10^2*a21^2*a02^2 - 2/3*a00*a20*a21^2*a02^2 - 2/27*a20^3*a02^3
         + 1/24*a20*a01*a11^3*a12 - 1/72*a10*a11^4*a12
         - 1/6*a20*a01^2*a11*a21*a12 + 1/36*a10*a01*a11^2*a21*a12
         + 1/24*a00*a11^3*a21*a12 + 1/9*a10*a01^2*a21^2*a12
         - 1/6*a00*a01*a11*a21^2*a12 - 1/6*a20^2*a01*a11*a02*a12
         + 1/36*a10*a20*a11^2*a02*a12 + 1/18*a10*a20*a01*a21*a02*a12
         - 1/6*a10^2*a11*a21*a02*a12 + 5/6*a00*a20*a11*a21*a02*a12
         - 1/6*a00*a10*a21^2*a02*a12 + 1/9*a10*a20^2*a02^2*a12
         + 1/4*a20^2*a01^2*a12^2 - 1/6*a10*a20*a01*a11*a12^2
         + 1/18*a10^2*a11^2*a12^2 - 1/12*a00*a20*a11^2*a12^2
         + 1/9*a10^2*a01*a21*a12^2 - 1/6*a00*a20*a01*a21*a12^2
         - 1/6*a00*a10*a11*a21*a12^2 + 1/4*a00^2*a21^2*a12^2
         + 1/9*a10^2*a20*a02*a12^2 - 2/3*a00*a20^2*a02*a12^2
         - 2/27*a10^3*a12^3 + 1/3*a00*a10*a20*a12^3)

        sage: _ == WeierstrassForm_P1xP1(biquadric.subs(x1=1,y1=1), [x0, y0])
        True
    """
    x, y, s, t = _check_polynomial_P1xP1(biquadric, variables)
    delta = _partial_discriminant(biquadric, s, t)
    Q = invariant_theory.binary_quartic(delta, x, y)
    g2 = Q.EisensteinD()
    g3 = -Q.EisensteinE()
    return (-g2/4, -g3/4)
Example #6
0
def WeierstrassForm_P2_112(polynomial, variables=None):
    r"""
    Bring an anticanonical hypersurface in `\mathbb{P}^2[1,1,2]` into Weierstrass form.

    Input/output is the same as :func:`WeierstrassForm`, except that
    the input polynomial must be a standard anticanonical hypersurface
    in weighted projective space `\mathbb{P}^2[1,1,2]`:

    .. math::

        \begin{split}
          p(x,y) =&\;
          a_{40} x^4 +
          a_{30} x^3 +
          a_{21} x^2 y +
          a_{20} x^2 +
          \\ &\;
          a_{11} x y +
          a_{02} y^2 +
          a_{10} x +
          a_{01} y +
          a_{00}
        \end{split}

    EXAMPLES::

        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2_112
        sage: fan = Fan(rays=[(1,0),(0,1),(-1,-2),(0,-1)],cones=[[0,1],[1,2],[2,3],[3,0]])
        sage: P112.<x,y,z,t> = ToricVariety(fan)
        sage: (-P112.K()).sections_monomials()
        (z^4*t^2, x*z^3*t^2, x^2*z^2*t^2, x^3*z*t^2,
         x^4*t^2, y*z^2*t, x*y*z*t, x^2*y*t, y^2)
        sage: WeierstrassForm_P2_112(sum(_), [x,y,z,t])
        (-97/48, 17/864)

    TESTS::

        sage: R.<x,y,z,t,a40,a30,a20,a10,a00,a21,a11,a01,a02> = QQ[]
        sage: p = ( a40*x^4*t^2 + a30*x^3*z*t^2 + a20*x^2*z^2*t^2 + a10*x*z^3*t^2 +
        ....:       a00*z^4*t^2 + a21*x^2*y*t + a11*x*y*z*t + a01*y*z^2*t + a02*y^2 )
        sage: WeierstrassForm_P2_112(p, [x,y,z,t])
        (-1/48*a11^4 + 1/6*a21*a11^2*a01 - 1/3*a21^2*a01^2 + a00*a21^2*a02
         - 1/2*a10*a21*a11*a02 + 1/6*a20*a11^2*a02 + 1/3*a20*a21*a01*a02
         - 1/2*a30*a11*a01*a02 + a40*a01^2*a02 - 1/3*a20^2*a02^2 + a30*a10*a02^2
         - 4*a40*a00*a02^2, 1/864*a11^6 - 1/72*a21*a11^4*a01
         + 1/18*a21^2*a11^2*a01^2 - 2/27*a21^3*a01^3 - 1/12*a00*a21^2*a11^2*a02
         + 1/24*a10*a21*a11^3*a02 - 1/72*a20*a11^4*a02 + 1/3*a00*a21^3*a01*a02
         - 1/6*a10*a21^2*a11*a01*a02 + 1/36*a20*a21*a11^2*a01*a02
         + 1/24*a30*a11^3*a01*a02 + 1/9*a20*a21^2*a01^2*a02
         - 1/6*a30*a21*a11*a01^2*a02 - 1/12*a40*a11^2*a01^2*a02
         + 1/3*a40*a21*a01^3*a02 + 1/4*a10^2*a21^2*a02^2
         - 2/3*a20*a00*a21^2*a02^2 - 1/6*a20*a10*a21*a11*a02^2
         + a30*a00*a21*a11*a02^2 + 1/18*a20^2*a11^2*a02^2
         - 1/12*a30*a10*a11^2*a02^2 - 2/3*a40*a00*a11^2*a02^2
         + 1/9*a20^2*a21*a01*a02^2 - 1/6*a30*a10*a21*a01*a02^2
         - 4/3*a40*a00*a21*a01*a02^2 - 1/6*a30*a20*a11*a01*a02^2
         + a40*a10*a11*a01*a02^2 + 1/4*a30^2*a01^2*a02^2
         - 2/3*a40*a20*a01^2*a02^2 - 2/27*a20^3*a02^3
         + 1/3*a30*a20*a10*a02^3 - a40*a10^2*a02^3 - a30^2*a00*a02^3
         + 8/3*a40*a20*a00*a02^3)

        sage: _ == WeierstrassForm_P2_112(p.subs(z=1,t=1), [x,y])
        True

        sage: cubic = p.subs(a40=0)
        sage: a,b = WeierstrassForm_P2_112(cubic, [x,y,z,t])
        sage: a = a.subs(t=1,z=1)
        sage: b = b.subs(t=1,z=1)
        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2
        sage: (a,b) == WeierstrassForm_P2(cubic.subs(t=1,z=1), [x,y])
        True
    """
    x, y, z, t = _check_polynomial_P2_112(polynomial, variables)
    delta = _partial_discriminant(polynomial, y, t)
    Q = invariant_theory.binary_quartic(delta, x, z)
    g2 = Q.EisensteinD()
    g3 = -Q.EisensteinE()
    return (-g2/4, -g3/4)
Example #7
0
def WeierstrassMap_P2_112(polynomial, variables=None):
    r"""
    Map an anticanonical hypersurface in `\mathbb{P}^2[1,1,2]` into Weierstrass form.

    Input/output is the same as :func:`WeierstrassMap`, except that
    the input polynomial must be a standard anticanonical hypersurface
    in weighted projective space `\mathbb{P}^2[1,1,2]`:

    .. MATH::

        \begin{split}
          p(x,y) =&\;
          a_{40} x^4 +
          a_{30} x^3 +
          a_{21} x^2 y +
          a_{20} x^2 +
          \\ &\;
          a_{11} x y +
          a_{02} y^2 +
          a_{10} x +
          a_{01} y +
          a_{00}
        \end{split}

    EXAMPLES::

        sage: from sage.schemes.toric.weierstrass_covering import WeierstrassMap_P2_112
        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2_112
        sage: R = PolynomialRing(QQ, 'x,y,a0,a1,a2,a3,a4', order='lex')
        sage: R.inject_variables()
        Defining x, y, a0, a1, a2, a3, a4
        sage: equation = y^2 + a0*x^4 + 4*a1*x^3 + 6*a2*x^2 + 4*a3*x + a4
        sage: X, Y, Z = WeierstrassMap_P2_112(equation, [x,y])
        sage: f, g = WeierstrassForm_P2_112(equation, variables=[x,y])
        sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(R.ideal(equation))
        0

    Another example, this time in homogeneous coordinates::

        sage: fan = Fan(rays=[(1,0),(0,1),(-1,-2),(0,-1)],cones=[[0,1],[1,2],[2,3],[3,0]])
        sage: P112.<x,y,z,t> = ToricVariety(fan)
        sage: (-P112.K()).sections_monomials()
        (z^4*t^2, x*z^3*t^2, x^2*z^2*t^2, x^3*z*t^2,
         x^4*t^2, y*z^2*t, x*y*z*t, x^2*y*t, y^2)
        sage: C_eqn = sum(_)
        sage: C = P112.subscheme(C_eqn)
        sage: WeierstrassForm_P2_112(C_eqn, [x,y,z,t])
        (-97/48, 17/864)
        sage: X, Y, Z = WeierstrassMap_P2_112(C_eqn, [x,y,z,t])
        sage: (-Y^2 + X^3 - 97/48*X*Z^4 + 17/864*Z^6).reduce(C.defining_ideal())
        0
    """
    x,y,z,t = _check_polynomial_P2_112(polynomial, variables)
    a00 = polynomial.coefficient({y:2})
    V = polynomial.coefficient({y:1})
    U = - _partial_discriminant(polynomial, y, t) / 4
    Q = invariant_theory.binary_quartic(U, x, z)
    g = Q.g_covariant()
    h = Q.h_covariant()
    if t is None:
        t = 1
    return ( 4*g*t**2, 4*h*t**3, (a00*y+V/2) )
def WeierstrassMap_P2_112(polynomial, variables=None):
    r"""
    Map an anticanonical hypersurface in `\mathbb{P}^2[1,1,2]` into Weierstrass form.

    Input/output is the same as :func:`WeierstrassMap`, except that
    the input polynomial must be a standard anticanonical hypersurface
    in weighted projective space `\mathbb{P}^2[1,1,2]`:

    .. MATH::

        \begin{split}
          p(x,y) =&\;
          a_{40} x^4 +
          a_{30} x^3 +
          a_{21} x^2 y +
          a_{20} x^2 +
          \\ &\;
          a_{11} x y +
          a_{02} y^2 +
          a_{10} x +
          a_{01} y +
          a_{00}
        \end{split}

    EXAMPLES::

        sage: from sage.schemes.toric.weierstrass_covering import WeierstrassMap_P2_112
        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2_112
        sage: R = PolynomialRing(QQ, 'x,y,a0,a1,a2,a3,a4', order='lex')
        sage: R.inject_variables()
        Defining x, y, a0, a1, a2, a3, a4
        sage: equation = y^2 + a0*x^4 + 4*a1*x^3 + 6*a2*x^2 + 4*a3*x + a4
        sage: X, Y, Z = WeierstrassMap_P2_112(equation, [x,y])
        sage: f, g = WeierstrassForm_P2_112(equation, variables=[x,y])
        sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(R.ideal(equation))
        0

    Another example, this time in homogeneous coordinates::

        sage: fan = Fan(rays=[(1,0),(0,1),(-1,-2),(0,-1)],cones=[[0,1],[1,2],[2,3],[3,0]])
        sage: P112.<x,y,z,t> = ToricVariety(fan)
        sage: (-P112.K()).sections_monomials()
        (z^4*t^2, x*z^3*t^2, x^2*z^2*t^2, x^3*z*t^2,
         x^4*t^2, y*z^2*t, x*y*z*t, x^2*y*t, y^2)
        sage: C_eqn = sum(_)
        sage: C = P112.subscheme(C_eqn)
        sage: WeierstrassForm_P2_112(C_eqn, [x,y,z,t])
        (-97/48, 17/864)
        sage: X, Y, Z = WeierstrassMap_P2_112(C_eqn, [x,y,z,t])
        sage: (-Y^2 + X^3 - 97/48*X*Z^4 + 17/864*Z^6).reduce(C.defining_ideal())
        0
    """
    x, y, z, t = _check_polynomial_P2_112(polynomial, variables)
    a00 = polynomial.coefficient({y: 2})
    V = polynomial.coefficient({y: 1})
    U = -_partial_discriminant(polynomial, y, t) / 4
    Q = invariant_theory.binary_quartic(U, x, z)
    g = Q.g_covariant()
    h = Q.h_covariant()
    if t is None:
        t = 1
    return (4 * g * t**2, 4 * h * t**3, (a00 * y + V / 2))