Exemplo n.º 1
0
def WeierstrassMap_P2(polynomial, variables=None):
    r"""
    Map a cubic to its Weierstrass form

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

    .. MATH::

        \begin{split}
          p(x,y) =&\;
          a_{30} x^{3} + a_{21} x^{2} y + a_{12} x y^{2} +
          a_{03} y^{3} + 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
        sage: from sage.schemes.toric.weierstrass_covering import WeierstrassMap_P2
        sage: R.<x,y,z> = QQ[]
        sage: equation =  x^3+y^3+z^3+x*y*z
        sage: f, g = WeierstrassForm_P2(equation)
        sage: X,Y,Z = WeierstrassMap_P2(equation)
        sage: equation.divides(-Y^2 + X^3 + f*X*Z^4 + g*Z^6)
        True

        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2
        sage: from sage.schemes.toric.weierstrass_covering import WeierstrassMap_P2
        sage: R.<x,y> = QQ[]
        sage: equation =  x^3+y^3+1
        sage: f, g = WeierstrassForm_P2(equation)
        sage: X,Y,Z = WeierstrassMap_P2(equation)
        sage: equation.divides(-Y^2 + X^3 + f*X*Z^4 + g*Z^6)
        True
    """
    x,y,z = _check_polynomial_P2(polynomial, variables)
    cubic = invariant_theory.ternary_cubic(polynomial, x,y,z)
    H = cubic.Hessian()
    Theta = cubic.Theta_covariant()
    J = cubic.J_covariant()
    F = polynomial.parent().base_ring()
    return (Theta, J/F(2), H)
Exemplo n.º 2
0
def WeierstrassMap_P2(polynomial, variables=None):
    r"""
    Map a cubic to its Weierstrass form

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

    .. MATH::

        \begin{split}
          p(x,y) =&\;
          a_{30} x^{3} + a_{21} x^{2} y + a_{12} x y^{2} +
          a_{03} y^{3} + 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
        sage: from sage.schemes.toric.weierstrass_covering import WeierstrassMap_P2
        sage: R.<x,y,z> = QQ[]
        sage: equation =  x^3+y^3+z^3+x*y*z
        sage: f, g = WeierstrassForm_P2(equation)
        sage: X,Y,Z = WeierstrassMap_P2(equation)
        sage: equation.divides(-Y^2 + X^3 + f*X*Z^4 + g*Z^6)
        True

        sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2
        sage: from sage.schemes.toric.weierstrass_covering import WeierstrassMap_P2
        sage: R.<x,y> = QQ[]
        sage: equation =  x^3+y^3+1
        sage: f, g = WeierstrassForm_P2(equation)
        sage: X,Y,Z = WeierstrassMap_P2(equation)
        sage: equation.divides(-Y^2 + X^3 + f*X*Z^4 + g*Z^6)
        True
    """
    x, y, z = _check_polynomial_P2(polynomial, variables)
    cubic = invariant_theory.ternary_cubic(polynomial, x, y, z)
    H = cubic.Hessian()
    Theta = cubic.Theta_covariant()
    J = cubic.J_covariant()
    F = polynomial.parent().base_ring()
    return (Theta, J / F(2), H)
Exemplo n.º 3
0
def WeierstrassForm_P2(polynomial, variables=None):
    r"""
    Bring a cubic into Weierstrass form.

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

    .. MATH::

        \begin{split}
          p(x,y) =&\;
          a_{30} x^{3} + a_{21} x^{2} y + a_{12} x y^{2} +
          a_{03} y^{3} + 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
        sage: R.<x,y,z> = QQ[]
        sage: WeierstrassForm_P2( x^3+y^3+z^3 )
        (0, -27/4)

        sage: R.<x,y,z, a,b> = QQ[]
        sage: WeierstrassForm_P2( -y^2*z+x^3+a*x*z^2+b*z^3, [x,y,z] )
        (a, b)

    TESTS::

        sage: R.<x,y,z,a30,a21,a12,a03,a20,a11,a02,a10,a01,a00> = QQ[]
        sage: p = ( a30*x^3 + a21*x^2*y + a12*x*y^2 + a03*y^3 + a20*x^2*z +
        ....:       a11*x*y*z + a02*y^2*z + a10*x*z^2 + a01*y*z^2 + a00*z^3 )
        sage: WeierstrassForm_P2(p, [x,y,z])
        (-1/48*a11^4 + 1/6*a20*a11^2*a02 - 1/3*a20^2*a02^2 - 1/2*a03*a20*a11*a10
         + 1/6*a12*a11^2*a10 + 1/3*a12*a20*a02*a10 - 1/2*a21*a11*a02*a10
         + a30*a02^2*a10 - 1/3*a12^2*a10^2 + a21*a03*a10^2 + a03*a20^2*a01
         - 1/2*a12*a20*a11*a01 + 1/6*a21*a11^2*a01 + 1/3*a21*a20*a02*a01
         - 1/2*a30*a11*a02*a01 + 1/3*a21*a12*a10*a01 - 3*a30*a03*a10*a01
         - 1/3*a21^2*a01^2 + a30*a12*a01^2 + a12^2*a20*a00 - 3*a21*a03*a20*a00
         - 1/2*a21*a12*a11*a00 + 9/2*a30*a03*a11*a00 + a21^2*a02*a00
         - 3*a30*a12*a02*a00,
         1/864*a11^6 - 1/72*a20*a11^4*a02 + 1/18*a20^2*a11^2*a02^2
         - 2/27*a20^3*a02^3 + 1/24*a03*a20*a11^3*a10 - 1/72*a12*a11^4*a10
         - 1/6*a03*a20^2*a11*a02*a10 + 1/36*a12*a20*a11^2*a02*a10
         + 1/24*a21*a11^3*a02*a10 + 1/9*a12*a20^2*a02^2*a10
         - 1/6*a21*a20*a11*a02^2*a10 - 1/12*a30*a11^2*a02^2*a10
         + 1/3*a30*a20*a02^3*a10 + 1/4*a03^2*a20^2*a10^2
         - 1/6*a12*a03*a20*a11*a10^2 + 1/18*a12^2*a11^2*a10^2
         - 1/12*a21*a03*a11^2*a10^2 + 1/9*a12^2*a20*a02*a10^2
         - 1/6*a21*a03*a20*a02*a10^2 - 1/6*a21*a12*a11*a02*a10^2
         + a30*a03*a11*a02*a10^2 + 1/4*a21^2*a02^2*a10^2
         - 2/3*a30*a12*a02^2*a10^2 - 2/27*a12^3*a10^3 + 1/3*a21*a12*a03*a10^3
         - a30*a03^2*a10^3 - 1/12*a03*a20^2*a11^2*a01 + 1/24*a12*a20*a11^3*a01
         - 1/72*a21*a11^4*a01 + 1/3*a03*a20^3*a02*a01 - 1/6*a12*a20^2*a11*a02*a01
         + 1/36*a21*a20*a11^2*a02*a01 + 1/24*a30*a11^3*a02*a01
         + 1/9*a21*a20^2*a02^2*a01 - 1/6*a30*a20*a11*a02^2*a01
         - 1/6*a12*a03*a20^2*a10*a01 - 1/6*a12^2*a20*a11*a10*a01
         + 5/6*a21*a03*a20*a11*a10*a01 + 1/36*a21*a12*a11^2*a10*a01
         - 3/4*a30*a03*a11^2*a10*a01 + 1/18*a21*a12*a20*a02*a10*a01
         - 3/2*a30*a03*a20*a02*a10*a01 - 1/6*a21^2*a11*a02*a10*a01
         + 5/6*a30*a12*a11*a02*a10*a01 - 1/6*a30*a21*a02^2*a10*a01
         + 1/9*a21*a12^2*a10^2*a01 - 2/3*a21^2*a03*a10^2*a01
         + a30*a12*a03*a10^2*a01 + 1/4*a12^2*a20^2*a01^2
         - 2/3*a21*a03*a20^2*a01^2 - 1/6*a21*a12*a20*a11*a01^2
         + a30*a03*a20*a11*a01^2 + 1/18*a21^2*a11^2*a01^2
         - 1/12*a30*a12*a11^2*a01^2 + 1/9*a21^2*a20*a02*a01^2
         - 1/6*a30*a12*a20*a02*a01^2 - 1/6*a30*a21*a11*a02*a01^2
         + 1/4*a30^2*a02^2*a01^2 + 1/9*a21^2*a12*a10*a01^2
         - 2/3*a30*a12^2*a10*a01^2 + a30*a21*a03*a10*a01^2
         - 2/27*a21^3*a01^3 + 1/3*a30*a21*a12*a01^3 - a30^2*a03*a01^3
         - a03^2*a20^3*a00 + a12*a03*a20^2*a11*a00 - 1/12*a12^2*a20*a11^2*a00
         - 3/4*a21*a03*a20*a11^2*a00 + 1/24*a21*a12*a11^3*a00
         + 5/8*a30*a03*a11^3*a00 - 2/3*a12^2*a20^2*a02*a00
         + a21*a03*a20^2*a02*a00 + 5/6*a21*a12*a20*a11*a02*a00
         - 3/2*a30*a03*a20*a11*a02*a00 - 1/12*a21^2*a11^2*a02*a00
         - 3/4*a30*a12*a11^2*a02*a00 - 2/3*a21^2*a20*a02^2*a00
         + a30*a12*a20*a02^2*a00 + a30*a21*a11*a02^2*a00
         - a30^2*a02^3*a00 + 1/3*a12^3*a20*a10*a00
         - 3/2*a21*a12*a03*a20*a10*a00 + 9/2*a30*a03^2*a20*a10*a00
         - 1/6*a21*a12^2*a11*a10*a00 + a21^2*a03*a11*a10*a00
         - 3/2*a30*a12*a03*a11*a10*a00 - 1/6*a21^2*a12*a02*a10*a00
         + a30*a12^2*a02*a10*a00 - 3/2*a30*a21*a03*a02*a10*a00
         - 1/6*a21*a12^2*a20*a01*a00 + a21^2*a03*a20*a01*a00
         - 3/2*a30*a12*a03*a20*a01*a00 - 1/6*a21^2*a12*a11*a01*a00
         + a30*a12^2*a11*a01*a00 - 3/2*a30*a21*a03*a11*a01*a00
         + 1/3*a21^3*a02*a01*a00 - 3/2*a30*a21*a12*a02*a01*a00
         + 9/2*a30^2*a03*a02*a01*a00 + 1/4*a21^2*a12^2*a00^2
         - a30*a12^3*a00^2 - a21^3*a03*a00^2
         + 9/2*a30*a21*a12*a03*a00^2 - 27/4*a30^2*a03^2*a00^2)
    """
    x, y, z = _check_polynomial_P2(polynomial, variables)
    cubic = invariant_theory.ternary_cubic(polynomial, x, y, z)
    F = polynomial.base_ring()
    S = cubic.S_invariant()
    T = cubic.T_invariant()
    return (27*S, -27/F(4)*T)
Exemplo n.º 4
0
def WeierstrassForm_P2(polynomial, variables=None):
    r"""
    Bring a cubic into Weierstrass form.

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

    .. math::

        \begin{split}
          p(x,y) =&\;
          a_{30} x^{3} + a_{21} x^{2} y + a_{12} x y^{2} +
          a_{03} y^{3} + 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
        sage: R.<x,y,z> = QQ[]
        sage: WeierstrassForm_P2( x^3+y^3+z^3 )
        (0, -27/4)

        sage: R.<x,y,z, a,b> = QQ[]
        sage: WeierstrassForm_P2( -y^2*z+x^3+a*x*z^2+b*z^3, [x,y,z] )
        (a, b)

    TESTS::

        sage: R.<x,y,z,a30,a21,a12,a03,a20,a11,a02,a10,a01,a00> = QQ[]
        sage: p = ( a30*x^3 + a21*x^2*y + a12*x*y^2 + a03*y^3 + a20*x^2*z +
        ....:       a11*x*y*z + a02*y^2*z + a10*x*z^2 + a01*y*z^2 + a00*z^3 )
        sage: WeierstrassForm_P2(p, [x,y,z])
        (-1/48*a11^4 + 1/6*a20*a11^2*a02 - 1/3*a20^2*a02^2 - 1/2*a03*a20*a11*a10
         + 1/6*a12*a11^2*a10 + 1/3*a12*a20*a02*a10 - 1/2*a21*a11*a02*a10
         + a30*a02^2*a10 - 1/3*a12^2*a10^2 + a21*a03*a10^2 + a03*a20^2*a01
         - 1/2*a12*a20*a11*a01 + 1/6*a21*a11^2*a01 + 1/3*a21*a20*a02*a01
         - 1/2*a30*a11*a02*a01 + 1/3*a21*a12*a10*a01 - 3*a30*a03*a10*a01
         - 1/3*a21^2*a01^2 + a30*a12*a01^2 + a12^2*a20*a00 - 3*a21*a03*a20*a00
         - 1/2*a21*a12*a11*a00 + 9/2*a30*a03*a11*a00 + a21^2*a02*a00
         - 3*a30*a12*a02*a00,
         1/864*a11^6 - 1/72*a20*a11^4*a02 + 1/18*a20^2*a11^2*a02^2
         - 2/27*a20^3*a02^3 + 1/24*a03*a20*a11^3*a10 - 1/72*a12*a11^4*a10
         - 1/6*a03*a20^2*a11*a02*a10 + 1/36*a12*a20*a11^2*a02*a10
         + 1/24*a21*a11^3*a02*a10 + 1/9*a12*a20^2*a02^2*a10
         - 1/6*a21*a20*a11*a02^2*a10 - 1/12*a30*a11^2*a02^2*a10
         + 1/3*a30*a20*a02^3*a10 + 1/4*a03^2*a20^2*a10^2
         - 1/6*a12*a03*a20*a11*a10^2 + 1/18*a12^2*a11^2*a10^2
         - 1/12*a21*a03*a11^2*a10^2 + 1/9*a12^2*a20*a02*a10^2
         - 1/6*a21*a03*a20*a02*a10^2 - 1/6*a21*a12*a11*a02*a10^2
         + a30*a03*a11*a02*a10^2 + 1/4*a21^2*a02^2*a10^2
         - 2/3*a30*a12*a02^2*a10^2 - 2/27*a12^3*a10^3 + 1/3*a21*a12*a03*a10^3
         - a30*a03^2*a10^3 - 1/12*a03*a20^2*a11^2*a01 + 1/24*a12*a20*a11^3*a01
         - 1/72*a21*a11^4*a01 + 1/3*a03*a20^3*a02*a01 - 1/6*a12*a20^2*a11*a02*a01
         + 1/36*a21*a20*a11^2*a02*a01 + 1/24*a30*a11^3*a02*a01
         + 1/9*a21*a20^2*a02^2*a01 - 1/6*a30*a20*a11*a02^2*a01
         - 1/6*a12*a03*a20^2*a10*a01 - 1/6*a12^2*a20*a11*a10*a01
         + 5/6*a21*a03*a20*a11*a10*a01 + 1/36*a21*a12*a11^2*a10*a01
         - 3/4*a30*a03*a11^2*a10*a01 + 1/18*a21*a12*a20*a02*a10*a01
         - 3/2*a30*a03*a20*a02*a10*a01 - 1/6*a21^2*a11*a02*a10*a01
         + 5/6*a30*a12*a11*a02*a10*a01 - 1/6*a30*a21*a02^2*a10*a01
         + 1/9*a21*a12^2*a10^2*a01 - 2/3*a21^2*a03*a10^2*a01
         + a30*a12*a03*a10^2*a01 + 1/4*a12^2*a20^2*a01^2
         - 2/3*a21*a03*a20^2*a01^2 - 1/6*a21*a12*a20*a11*a01^2
         + a30*a03*a20*a11*a01^2 + 1/18*a21^2*a11^2*a01^2
         - 1/12*a30*a12*a11^2*a01^2 + 1/9*a21^2*a20*a02*a01^2
         - 1/6*a30*a12*a20*a02*a01^2 - 1/6*a30*a21*a11*a02*a01^2
         + 1/4*a30^2*a02^2*a01^2 + 1/9*a21^2*a12*a10*a01^2
         - 2/3*a30*a12^2*a10*a01^2 + a30*a21*a03*a10*a01^2
         - 2/27*a21^3*a01^3 + 1/3*a30*a21*a12*a01^3 - a30^2*a03*a01^3
         - a03^2*a20^3*a00 + a12*a03*a20^2*a11*a00 - 1/12*a12^2*a20*a11^2*a00
         - 3/4*a21*a03*a20*a11^2*a00 + 1/24*a21*a12*a11^3*a00
         + 5/8*a30*a03*a11^3*a00 - 2/3*a12^2*a20^2*a02*a00
         + a21*a03*a20^2*a02*a00 + 5/6*a21*a12*a20*a11*a02*a00
         - 3/2*a30*a03*a20*a11*a02*a00 - 1/12*a21^2*a11^2*a02*a00
         - 3/4*a30*a12*a11^2*a02*a00 - 2/3*a21^2*a20*a02^2*a00
         + a30*a12*a20*a02^2*a00 + a30*a21*a11*a02^2*a00
         - a30^2*a02^3*a00 + 1/3*a12^3*a20*a10*a00
         - 3/2*a21*a12*a03*a20*a10*a00 + 9/2*a30*a03^2*a20*a10*a00
         - 1/6*a21*a12^2*a11*a10*a00 + a21^2*a03*a11*a10*a00
         - 3/2*a30*a12*a03*a11*a10*a00 - 1/6*a21^2*a12*a02*a10*a00
         + a30*a12^2*a02*a10*a00 - 3/2*a30*a21*a03*a02*a10*a00
         - 1/6*a21*a12^2*a20*a01*a00 + a21^2*a03*a20*a01*a00
         - 3/2*a30*a12*a03*a20*a01*a00 - 1/6*a21^2*a12*a11*a01*a00
         + a30*a12^2*a11*a01*a00 - 3/2*a30*a21*a03*a11*a01*a00
         + 1/3*a21^3*a02*a01*a00 - 3/2*a30*a21*a12*a02*a01*a00
         + 9/2*a30^2*a03*a02*a01*a00 + 1/4*a21^2*a12^2*a00^2
         - a30*a12^3*a00^2 - a21^3*a03*a00^2
         + 9/2*a30*a21*a12*a03*a00^2 - 27/4*a30^2*a03^2*a00^2)
    """
    x, y, z = _check_polynomial_P2(polynomial, variables)
    cubic = invariant_theory.ternary_cubic(polynomial, x, y, z)
    F = polynomial.base_ring()
    S = cubic.S_invariant()
    T = cubic.T_invariant()
    return (27*S, -27/F(4)*T)