Classical Invariant Theory

This module lists classical invariants and covariants of homogeneous polynomials (also called algebraic forms) under the action of the special linear group. That is, we are dealing with polynomials of degree d in n variables. The special linear group SL(n,\CC) acts on the variables (x_1,\dots, x_n) linearly,

(x_1,\dots, x_n)^t \to A (x_1,\dots, x_n)^t
,\qquad
A \in SL(n,\CC)

The linear action on the variables transforms a polynomial p generally into a different polynomial gp. We can think of it as an action on the space of coefficients in p. An invariant is a polynomial in the coefficients that is invariant under this action. A covariant is a polynomial in the coefficients and the variables (x_1,\dots, x_n) that is invariant under the combined action.

For example, the binary quadric p(x,y) = a x^2 + b x y + c y^2 has as its invariant the discriminant \mathop{disc}(p) = b^2 - 4 a
c. This means that for any SL(2,\CC) coordinate change

\begin{pmatrix} x' \\ y' \end{pmatrix}
=
\begin{pmatrix} \alpha & \beta \\ \gamma & \delta \end{pmatrix}
\begin{pmatrix} x \\ y \end{pmatrix}
\qquad
\alpha\delta-\beta\gamma=1

the discriminant is invariant, \mathop{disc}\big(p(x',y')\big) =
\mathop{disc}\big(p(x,y)\big).

To use this module, you should use the factory object invariant_theory. For example, take the quartic:

sage: R.<x,y> = QQ[]
sage: q = x^4 + y^4
sage: quartic = invariant_theory.binary_quartic(q);  quartic
binary quartic with coefficients (1, 0, 0, 0, 1)

One invariant of a quartic is known as the Eisenstein D-invariant. Since it is an invariant, it is a polynomial in the coefficients (which are integers in this example):

sage: quartic.EisensteinD()
1

One example of a covariant of a quartic is the so-called g-covariant (actually, the Hessian). As with all covariants, it is a polynomial in x, y and the coefficients:

sage: quartic.g_covariant()
-x^2*y^2

As usual, use tab completion and the online help to discover the implemented invariants and covariants.

In general, the variables of the defining polynomial cannot be guessed. For example, the zero polynomial can be thought of as a homogeneous polynomial of any degree. Also, since we also want to allow polynomial coefficients we cannot just take all variables of the polynomial ring as the variables of the form. This is why you will have to specify the variables explicitly if there is any potential ambiguity. For example:

sage: invariant_theory.binary_quartic(R.zero(), [x,y])
binary quartic with coefficients (0, 0, 0, 0, 0)

sage: invariant_theory.binary_quartic(x^4, [x,y])
binary quartic with coefficients (0, 0, 0, 0, 1)

sage: R.<x,y,t> = QQ[]
sage: invariant_theory.binary_quartic(x^4 + y^4 + t*x^2*y^2, [x,y])
binary quartic with coefficients (1, 0, t, 0, 1)

Finally, it is often convenient to use inhomogeneous polynomials where it is understood that one wants to homogenize them. This is also supported, just define the form with an inhomogeneous polynomial and specify one less variable:

sage: R.<x,t> = QQ[]
sage: invariant_theory.binary_quartic(x^4 + 1 + t*x^2, [x])
binary quartic with coefficients (1, 0, t, 0, 1)

REFERENCES:

[WpInvariantTheory]http://en.wikipedia.org/wiki/Glossary_of_invariant_theory
class sage.rings.invariant_theory.AlgebraicForm(n, d, polynomial, *args, **kwds)

Bases: sage.structure.sage_object.SageObject

The base class of algebraic forms (i.e. homogeneous polynomials)

You should only instantiate the derived classes of this base class.

Derived classes must implement coeffs() and scaled_coeffs()

INPUT:

  • n – The number of variables.
  • d – The degree of the polynomial.
  • polynomial – The polynomial.
  • *args – The variables, as a single list/tuple, multiple arguments, or None to use all variables of the polynomial.

EXAMPLES:

sage: from sage.rings.invariant_theory import AlgebraicForm
sage: R.<x,y> = QQ[]
sage: p = x^2 + y^2
sage: AlgebraicForm(2, 2, p).variables()
(x, y)
sage: AlgebraicForm(2, 2, p, None).variables()
(x, y)
sage: AlgebraicForm(3, 2, p).variables()
(x, y, None)
sage: AlgebraicForm(3, 2, p, None).variables()
(x, y, None)

sage: from sage.rings.invariant_theory import AlgebraicForm
sage: R.<x,y,s,t> = QQ[]
sage: p = s*x^2 + t*y^2
sage: AlgebraicForm(2, 2, p, [x,y]).variables()
(x, y)
sage: AlgebraicForm(2, 2, p, x,y).variables()
(x, y)

sage: AlgebraicForm(3, 2, p, [x,y,None]).variables()
(x, y, None)
sage: AlgebraicForm(3, 2, p, x,y,None).variables()
(x, y, None)

sage: AlgebraicForm(2, 1, p, [x,y]).variables()
Traceback (most recent call last):
...
ValueError: polynomial is of the wrong degree

sage: AlgebraicForm(2, 2, x^2+y, [x,y]).variables()
Traceback (most recent call last):
...
ValueError: polynomial is not homogeneous
coefficients()

Alias for coeffs()

See the documentation for coeffs() for details.

EXAMPLES:

sage: R.<a,b,c,d,e,f,g, x,y,z> = QQ[]
sage: p = a*x^2 + b*y^2 + c*z^2 + d*x*y + e*x*z + f*y*z
sage: q = invariant_theory.quadratic_form(p, x,y,z)
sage: q.coefficients()
(a, b, c, d, e, f)
sage: q.coeffs()
(a, b, c, d, e, f)
form()

Return the defining polynomial

OUTPUT:

The polynomial used to define the algebraic form.

EXAMPLES:

sage: R.<x,y> = QQ[]
sage: quartic = invariant_theory.binary_quartic(x^4+y^4)
sage: quartic.form()
x^4 + y^4
variables()

Return the variables of the form

OUTPUT:

A tuple of variables. If inhomogeneous notation is use for the defining polynomial then the last entry will be None.

EXAMPLES:

sage: R.<x,y,t> = QQ[]
sage: quartic = invariant_theory.binary_quartic(x^4+y^4+t*x^2*y^2, [x,y])
sage: quartic.variables()
(x, y)

sage: R.<x,y,t> = QQ[]
sage: quartic = invariant_theory.binary_quartic(x^4+1+t*x^2, [x])
sage: quartic.variables()
(x, None)
class sage.rings.invariant_theory.BinaryQuartic(polynomial, *args)

Bases: sage.rings.invariant_theory.AlgebraicForm

Invariant theory of a binary quartic

You should use the invariant_theory factory object to contstruct instances of this class. See binary_quartic() for details.

TESTS:

sage: R.<a0, a1, a2, a3, a4, x0, x1> = QQ[]
sage: p = a0*x1^4 + a1*x1^3*x0 + a2*x1^2*x0^2 + a3*x1*x0^3 + a4*x0^4
sage: quartic = invariant_theory.binary_quartic(p, x0, x1)
sage: quartic._check_covariant('form')
sage: quartic._check_covariant('EisensteinD', invariant=True)
sage: quartic._check_covariant('EisensteinE', invariant=True)
sage: quartic._check_covariant('g_covariant')
sage: quartic._check_covariant('h_covariant')
sage: TestSuite(quartic).run()
EisensteinD()

One of the Eisenstein invariants of a binary quartic.

OUTPUT:

The Eisenstein D-invariant of the quadric.

f(x) = a_0 x_1^4 + 4 a_1 x_0 x_1^3 + 6 a_2 x_0^2 x_1^2 +
        4 a_3 x_0^3 x_1 + a_4 x_0^4
\\
\Rightarrow
D(f) = a_0 a_4+3 a_2^2-4 a_1 a_3

EXAMPLES:

sage: R.<a0, a1, a2, a3, a4, x0, x1> = QQ[]
sage: f = a0*x1^4+4*a1*x0*x1^3+6*a2*x0^2*x1^2+4*a3*x0^3*x1+a4*x0^4
sage: inv = invariant_theory.binary_quartic(f, x0, x1)
sage: inv.EisensteinD()
3*a2^2 - 4*a1*a3 + a0*a4
EisensteinE()

One of the Eisenstein invariants of a binary quartic.

OUTPUT:

The Eisenstein E-invariant of the quadric.

f(x) = a_0 x_1^4 + 4 a_1 x_0 x_1^3 + 6 a_2 x_0^2 x_1^2 +
       4 a_3 x_0^3 x_1 + a_4 x_0^4
\\ \Rightarrow
E(f) = a_0 a_3^2 +a_1^2 a_4 -a_0 a_2 a_4
-2 a_1 a_2 a_3 + a_2^3

EXAMPLES:

sage: R.<a0, a1, a2, a3, a4, x0, x1> = QQ[]
sage: f = a0*x1^4+4*a1*x0*x1^3+6*a2*x0^2*x1^2+4*a3*x0^3*x1+a4*x0^4
sage: inv = invariant_theory.binary_quartic(f, x0, x1)
sage: inv.EisensteinE()
a2^3 - 2*a1*a2*a3 + a0*a3^2 + a1^2*a4 - a0*a2*a4
coeffs()

The coefficients of a binary quartic.

Given

f(x) = a_0 x_1^4 + a_1 x_0 x_1^3 + a_2 x_0^2 x_1^2 +
       a_3 x_0^3 x_1 + a_4 x_0^4

this function returns a = (a_0, a_1, a_2, a_3, a_4)

EXAMPLES:

sage: R.<a0, a1, a2, a3, a4, x0, x1> = QQ[]
sage: p = a0*x1^4 + a1*x1^3*x0 + a2*x1^2*x0^2 + a3*x1*x0^3 + a4*x0^4
sage: quartic = invariant_theory.binary_quartic(p, x0, x1)
sage: quartic.coeffs()
(a0, a1, a2, a3, a4)

sage: R.<a0, a1, a2, a3, a4, x> = QQ[]
sage: p = a0 + a1*x + a2*x^2 + a3*x^3 + a4*x^4
sage: quartic = invariant_theory.binary_quartic(p, x)
sage: quartic.coeffs()
(a0, a1, a2, a3, a4)
g_covariant()

The g-covariant of a binary quartic.

OUTPUT:

The g-covariant of the quadric.

f(x) = a_0 x_1^4 + 4 a_1 x_0 x_1^3 + 6 a_2 x_0^2 x_1^2 +
        4 a_3 x_0^3 x_1 + a_4 x_0^4
\\
\Rightarrow
D(f) = \frac{1}{144}
\begin{pmatrix}
   \frac{\partial^2 f}{\partial x \partial x}
\end{pmatrix}

EXAMPLES:

sage: R.<a0, a1, a2, a3, a4, x, y> = QQ[]
sage: p = a0*x^4+4*a1*x^3*y+6*a2*x^2*y^2+4*a3*x*y^3+a4*y^4
sage: inv = invariant_theory.binary_quartic(p, x, y)
sage: g = inv.g_covariant();  g
a1^2*x^4 - a0*a2*x^4 + 2*a1*a2*x^3*y - 2*a0*a3*x^3*y + 3*a2^2*x^2*y^2
- 2*a1*a3*x^2*y^2 - a0*a4*x^2*y^2 + 2*a2*a3*x*y^3
- 2*a1*a4*x*y^3 + a3^2*y^4 - a2*a4*y^4

sage: inv_inhomogeneous = invariant_theory.binary_quartic(p.subs(y=1), x)
sage: inv_inhomogeneous.g_covariant()
a1^2*x^4 - a0*a2*x^4 + 2*a1*a2*x^3 - 2*a0*a3*x^3 + 3*a2^2*x^2
- 2*a1*a3*x^2 - a0*a4*x^2 + 2*a2*a3*x - 2*a1*a4*x + a3^2 - a2*a4

sage: g == 1/144 * (p.derivative(x,y)^2 - p.derivative(x,x)*p.derivative(y,y))
True
h_covariant()

The h-covariant of a binary quartic.

OUTPUT:

The h-covariant of the quadric.

f(x) = a_0 x_1^4 + 4 a_1 x_0 x_1^3 + 6 a_2 x_0^2 x_1^2 +
        4 a_3 x_0^3 x_1 + a_4 x_0^4
\\
\Rightarrow
D(f) = \frac{1}{144}
\begin{pmatrix}
   \frac{\partial^2 f}{\partial x \partial x}
\end{pmatrix}

EXAMPLES:

sage: R.<a0, a1, a2, a3, a4, x, y> = QQ[]
sage: p = a0*x^4+4*a1*x^3*y+6*a2*x^2*y^2+4*a3*x*y^3+a4*y^4
sage: inv = invariant_theory.binary_quartic(p, x, y)
sage: h = inv.h_covariant();   h
-2*a1^3*x^6 + 3*a0*a1*a2*x^6 - a0^2*a3*x^6 - 6*a1^2*a2*x^5*y + 9*a0*a2^2*x^5*y
- 2*a0*a1*a3*x^5*y - a0^2*a4*x^5*y - 10*a1^2*a3*x^4*y^2 + 15*a0*a2*a3*x^4*y^2
- 5*a0*a1*a4*x^4*y^2 + 10*a0*a3^2*x^3*y^3 - 10*a1^2*a4*x^3*y^3
+ 10*a1*a3^2*x^2*y^4 - 15*a1*a2*a4*x^2*y^4 + 5*a0*a3*a4*x^2*y^4
+ 6*a2*a3^2*x*y^5 - 9*a2^2*a4*x*y^5 + 2*a1*a3*a4*x*y^5 + a0*a4^2*x*y^5
+ 2*a3^3*y^6 - 3*a2*a3*a4*y^6 + a1*a4^2*y^6

sage: inv_inhomogeneous = invariant_theory.binary_quartic(p.subs(y=1), x)
sage: inv_inhomogeneous.h_covariant()
-2*a1^3*x^6 + 3*a0*a1*a2*x^6 - a0^2*a3*x^6 - 6*a1^2*a2*x^5 + 9*a0*a2^2*x^5
- 2*a0*a1*a3*x^5 - a0^2*a4*x^5 - 10*a1^2*a3*x^4 + 15*a0*a2*a3*x^4
- 5*a0*a1*a4*x^4 + 10*a0*a3^2*x^3 - 10*a1^2*a4*x^3 + 10*a1*a3^2*x^2
- 15*a1*a2*a4*x^2 + 5*a0*a3*a4*x^2 + 6*a2*a3^2*x - 9*a2^2*a4*x
+ 2*a1*a3*a4*x + a0*a4^2*x + 2*a3^3 - 3*a2*a3*a4 + a1*a4^2

sage: g = inv.g_covariant()
sage: h == 1/8 * (p.derivative(x)*g.derivative(y)-p.derivative(y)*g.derivative(x))
True
monomials()

List the basis monomials in the form.

OUTPUT:

A tuple of monomials. They are in the same order as coeffs().

EXAMPLES:

sage: R.<x,y> = QQ[]
sage: quartic = invariant_theory.binary_quartic(x^4+y^4)
sage: quartic.monomials()
(y^4, x*y^3, x^2*y^2, x^3*y, x^4)
scaled_coeffs()

The coefficients of a binary quartic.

Given

f(x) = a_0 x_1^4 + 4 a_1 x_0 x_1^3 + 6 a_2 x_0^2 x_1^2 +
       4 a_3 x_0^3 x_1 + a_4 x_0^4

this function returns a = (a_0, a_1, a_2, a_3, a_4)

EXAMPLES:

sage: R.<a0, a1, a2, a3, a4, x0, x1> = QQ[]
sage: quartic = a0*x1^4 + 4*a1*x1^3*x0 + 6*a2*x1^2*x0^2 + 4*a3*x1*x0^3 + a4*x0^4
sage: inv = invariant_theory.binary_quartic(quartic, x0, x1)
sage: inv.scaled_coeffs()
(a0, a1, a2, a3, a4)

sage: R.<a0, a1, a2, a3, a4, x> = QQ[]
sage: quartic = a0 + 4*a1*x + 6*a2*x^2 + 4*a3*x^3 + a4*x^4
sage: inv = invariant_theory.binary_quartic(quartic, x)
sage: inv.scaled_coeffs()
(a0, a1, a2, a3, a4)
class sage.rings.invariant_theory.InvariantTheoryFactory

Bases: sage.structure.sage_object.SageObject

Factory object for invariants of multilinear forms

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: invariant_theory.ternary_cubic(x^3+y^3+z^3)
ternary cubic with coefficients (1, 1, 1, 0, 0, 0, 0, 0, 0, 0)
binary_quartic(quartic, *args, **kwds)

Invariant theory of a quartic in two variables

The algebra of invariants of a quartic form is generated by invariants i, j of degrees 2, 3. This ring is naturally isomorphic to the ring of modular forms of level 1, with the two generators corresponding to the Eisenstein series E_4 (see EisensteinD()) and E_6 (see EisensteinE()). The algebra of covariants is generated by these two invariants together with the form f of degree 1 and order 4, the Hessian g (see g_covariant()) of degree 2 and order 4, and a covariant h (see h_covariant()) of degree 3 and order 6. They are related by a syzygy

j f^3 - g f^2 i + 4 g^3 + h^2 = 0

of degree 6 and order 12.

INPUT:

  • quartic – a quartic.
  • x, y – the homogeneous variables. If y is None, the quartic is assumed to be inhomogeneous.

REFERENCES:

[WpBinaryForm]http://en.wikipedia.org/wiki/Invariant_of_a_binary_form

EXAMPLES:

sage: R.<x,y> = QQ[]
sage: quartic = invariant_theory.binary_quartic(x^4+y^4)
sage: quartic
binary quartic with coefficients (1, 0, 0, 0, 1)
sage: type(quartic)
<class 'sage.rings.invariant_theory.BinaryQuartic'>
inhomogeneous_quadratic_form(polynomial, *args)

Invariants of an inhomogeneous quadratic form

INPUT:

  • polynomial – an inhomogenous quadratic form.
  • *args – the variables as multiple arguments, or as a single list/tuple.

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: quadratic = x^2+2*y^2+3*x*y+4*x+5*y+6
sage: inv = invariant_theory.inhomogeneous_quadratic_form(quadratic)
sage: type(inv)
<class 'sage.rings.invariant_theory.TernaryQuadratic'>
quadratic_form(polynomial, *args)

Invariants of a homogeneous quadratic form

INPUT:

  • polynomial – a homogeneous or inhomogenous quadratic form.
  • *args – the variables as multiple arguments, or as a single list/tuple. If the last argument is None, the cubic is assumed to be inhomogeneous.

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: quadratic = x^2+y^2+z^2
sage: inv = invariant_theory.quadratic_form(quadratic)
sage: type(inv)
<class 'sage.rings.invariant_theory.TernaryQuadratic'>

If some of the ring variables are to be treated as coefficients you need to specify the polynomial variables:

sage: R.<x,y,z, a,b> = QQ[]
sage: quadratic = a*x^2+b*y^2+z^2+2*y*z
sage: invariant_theory.quadratic_form(quadratic, x,y,z)
ternary quadratic with coefficients (a, b, 1, 0, 0, 2)
sage: invariant_theory.quadratic_form(quadratic, [x,y,z])   # alternate syntax
ternary quadratic with coefficients (a, b, 1, 0, 0, 2)

Inhomogeneous quadratic forms (see also inhomogeneous_quadratic_form()) can be specified by passing None as the last variable:

sage: inhom = quadratic.subs(z=1)
sage: invariant_theory.quadratic_form(inhom, x,y,None)
ternary quadratic with coefficients (a, b, 1, 0, 0, 2)
ternary_cubic(cubic, *args, **kwds)

Invariants of a cubic in three variables

The algebra of invariants of a ternary cubic under SL_3(\CC) is a polynomial algebra generated by two invariants S (see S_invariant()) and T (see T_invariant()) of degrees 4 and 6, called Aronhold invariants.

The ring of covariants is given as follows. The identity covariant U of a ternary cubic has degree 1 and order 3. The Hessian H (see Hessian()) is a covariant of ternary cubics of degree 3 and order 3. There is a covariant \Theta (see Theta_covariant()) of ternary cubics of degree 8 and order 6 that vanishes on points x lying on the Salmon conic of the polar of x with respect to the curve and its Hessian curve. The Brioschi covariant J (see J_covariant()) is the Jacobian of U, \Theta, and H of degree 12, order 9. The algebra of covariants of a ternary cubic is generated over the ring of invariants by U, \Theta, H, and J, with a relation

\begin{split}
  J^2 =& 4 \Theta^3 + T U^2 \Theta^2 +
  \Theta (-4 S^3 U^4 + 2 S T U^3 H
  - 72 S^2 U^2 H^2
  \\ &
  - 18 T U H^3 +  108 S H^4)
  -16 S^4 U^5 H - 11 S^2 T U^4 H^2
  \\ &
  -4 T^2 U^3 H^3
  +54 S T U^2 H^4 -432 S^2 U H^5 -27 T H^6
\end{split}

REFERENCES:

[WpTernaryCubic]http://en.wikipedia.org/wiki/Ternary_cubic

INPUT:

  • cubic – a homogeneous cubic in 3 homogeneous variables, or an inhomogeneous cubic in 2 variables.
  • x, y, z – the variables. If z is None, the cubic is assumed to be inhomogeneous.

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: cubic = invariant_theory.ternary_cubic(x^3+y^3+z^3)
sage: type(cubic)
<class 'sage.rings.invariant_theory.TernaryCubic'>

There is one syzygy of the covariants in degree 18, we use this to check that the expressions for the covariants are correct:

sage: R.<x,y,z> = QQ[]
sage: monomials = (x^3, y^3, z^3, x^2*y, x^2*z, x*y^2,
...                y^2*z, x*z^2, y*z^2, x*y*z)
sage: random_poly = sum([ randint(0,10000) * m for m in monomials ])
sage: cubic = invariant_theory.ternary_cubic(random_poly)
sage: U = cubic.form()
sage: S = cubic.S_invariant()
sage: T = cubic.T_invariant()
sage: H = cubic.Hessian()
sage: Theta = cubic.Theta_covariant()
sage: J = cubic.J_covariant()

sage: ( -J^2 + 4*Theta^3 + T*U^2*Theta^2 +
...     Theta*(-4*S^3*U^4 + 2*S*T*U^3*H - 72*S^2*U^2*H^2
...            - 18*T*U*H^3 +  108*S*H^4)
...     -16*S^4*U^5*H - 11*S^2*T*U^4*H^2 -4*T^2*U^3*H^3
...     +54*S*T*U^2*H^4 -432*S^2*U*H^5 -27*T*H^6 )
0
ternary_quadratic(quadratic, *args, **kwds)

Invariants of a quadratic in three variables

INPUT:

  • quadratic – a homogeneous quadratic in 3 homogeneous variables, or an inhomogeneous quadratic in 2 variables.
  • x, y, z – the variables. If z is None, the quadratic is assumed to be inhomogeneous.

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: cubic = x^2+y^2+z^2
sage: inv = invariant_theory.ternary_quadratic(cubic)
sage: type(inv)
<class 'sage.rings.invariant_theory.TernaryQuadratic'>
class sage.rings.invariant_theory.QuadraticForm(n, polynomial, *args)

Bases: sage.rings.invariant_theory.AlgebraicForm

Invariant theory of a multivariate quadratic form

You should use the invariant_theory factory object to contstruct instances of this class. See quadratic_form() for details.

TESTS:

sage: R.<a,b,c,d,e,f,g, x,y,z> = QQ[]
sage: p = a*x^2 + b*y^2 + c*z^2 + d*x*y + e*x*z + f*y*z
sage: invariant_theory.quadratic_form(p, x,y,z)
ternary quadratic with coefficients (a, b, c, d, e, f)
sage: type(_)
<class 'sage.rings.invariant_theory.TernaryQuadratic'>

sage: R.<a,b,c,d,e,f,g, x,y,z> = QQ[]
sage: p = a*x^2 + b*y^2 + c*z^2 + d*x*y + e*x*z + f*y*z
sage: invariant_theory.quadratic_form(p, x,y,z)
ternary quadratic with coefficients (a, b, c, d, e, f)
sage: type(_)
<class 'sage.rings.invariant_theory.TernaryQuadratic'>

Since we can not always decide whether the form is homogeneous or not based on the number of variables, you need to explicitly specify it if you want the variables to be treated as inhomogeneous:

sage: invariant_theory.inhomogeneous_quadratic_form(p.subs(z=1), x,y)
ternary quadratic with coefficients (a, b, c, d, e, f)
as_QuadraticForm()

Convert into a QuadraticForm.

OUTPUT:

Sage has a special quadratic forms subsystem. This method converts self into this QuadraticForm representation.

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: p = x^2+y^2+z^2+2*x*y+3*x*z
sage: quadratic = invariant_theory.ternary_quadratic(p)
sage: matrix(quadratic)
[  1   1 3/2]
[  1   1   0]
[3/2   0   1]
sage: quadratic.as_QuadraticForm()
Quadratic form in 3 variables over Multivariate Polynomial
Ring in x, y, z over Rational Field with coefficients:
[ 1/2 1 3/2 ]
[ * 1/2 0 ]
[ * * 1/2 ]
sage: _.polynomial('X,Y,Z')
X^2 + 2*X*Y + Y^2 + 3*X*Z + Z^2
coeffs()

The coefficients of a quadratic form.

Given

f(x) = \sum_{0\leq i<n} a_i x_i^2 + \sum_{0\leq j <k<n}
a_{jk} x_j x_k

this function returns a = (a_0, \dots, a_n, a_{00}, a_{01}, \dots, a_{n-1,n})

EXAMPLES:

sage: R.<a,b,c,d,e,f,g, x,y,z> = QQ[]
sage: p = a*x^2 + b*y^2 + c*z^2 + d*x*y + e*x*z + f*y*z
sage: inv = invariant_theory.quadratic_form(p, x,y,z); inv
ternary quadratic with coefficients (a, b, c, d, e, f)
sage: inv.coeffs()
(a, b, c, d, e, f)
sage: inv.scaled_coeffs()
(a, b, c, 1/2*d, 1/2*e, 1/2*f)
discriminant()

Return the discriminant of the quadratic form.

Up to an overall constant factor, this is just the determinant of the defining matrix, see matrix(). For a quadratic form in n variables, the overall constant is 2^{n-1} if n is odd and (-1)^{n/2} 2^n if n is even.

EXAMPLES:

sage: R.<a,b,c, x,y> = QQ[]
sage: p = a*x^2+b*x*y+c*y^2
sage: quadratic = invariant_theory.quadratic_form(p, x,y)
sage: quadratic.discriminant()
b^2 - 4*a*c

sage: R.<a,b,c,d,e,f,g, x,y,z> = QQ[]
sage: p = a*x^2 + b*y^2 + c*z^2 + d*x*y + e*x*z + f*y*z
sage: quadratic = invariant_theory.quadratic_form(p, x,y,z)
sage: quadratic.discriminant()
4*a*b*c - c*d^2 - b*e^2 + d*e*f - a*f^2
matrix()

Return the quadratic form as a symmetric matrix

OUTPUT:

This method returns a symmetric matrix A such that the quadratic Q equals

Q(x,y,z,\dots) = (x,y,\dots) A (x,y,\dots)^t

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: quadratic = invariant_theory.ternary_quadratic(x^2+y^2+z^2+x*y)
sage: matrix(quadratic)
[  1 1/2   0]
[1/2   1   0]
[  0   0   1]
sage: quadratic._matrix_() == matrix(quadratic)
True
monomials()

List the basis monomials in the form.

OUTPUT:

A tuple of monomials. They are in the same order as coeffs().

EXAMPLES:

sage: R.<x,y> = QQ[]
sage: quadratic = invariant_theory.quadratic_form(x^2+y^2)
sage: quadratic.monomials()
(x^2, y^2, x*y)

sage: quadratic = invariant_theory.inhomogeneous_quadratic_form(x^2+y^2)
sage: quadratic.monomials()
(x^2, y^2, 1, x*y, x, y)
scaled_coeffs()

The scaled coefficients of a quadratic form.

Given

f(x) = \sum_{0\leq i<n} a_i x_i^2 + \sum_{0\leq j <k<n}
2 a_{jk} x_j x_k

this function returns a = (a_0, \cdots, a_n, a_{00}, a_{01}, \dots, a_{n-1,n})

EXAMPLES:

sage: R.<a,b,c,d,e,f,g, x,y,z> = QQ[]
sage: p = a*x^2 + b*y^2 + c*z^2 + d*x*y + e*x*z + f*y*z
sage: inv = invariant_theory.quadratic_form(p, x,y,z); inv
ternary quadratic with coefficients (a, b, c, d, e, f)
sage: inv.coeffs()
(a, b, c, d, e, f)
sage: inv.scaled_coeffs()
(a, b, c, 1/2*d, 1/2*e, 1/2*f)
class sage.rings.invariant_theory.TernaryCubic(polynomial, *args)

Bases: sage.rings.invariant_theory.AlgebraicForm

Invariant theory of a ternary cubic

You should use the invariant_theory factory object to contstruct instances of this class. See ternary_cubic() for details.

TESTS:

sage: R.<x,y,z> = QQ[]
sage: cubic = invariant_theory.ternary_cubic(x^3+y^3+z^3)
sage: cubic
ternary cubic with coefficients (1, 1, 1, 0, 0, 0, 0, 0, 0, 0)
sage: TestSuite(cubic).run()
Hessian()

Return the Hessian covariant

OUTPUT:

The Hessian matrix multiplied with the conventional normalization factor 1/216.

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: cubic = invariant_theory.ternary_cubic(x^3+y^3+z^3)
sage: cubic.Hessian()
x*y*z

sage: R.<x,y> = QQ[]
sage: cubic = invariant_theory.ternary_cubic(x^3+y^3+1)
sage: cubic.Hessian()
x*y
J_covariant()

Return the J-covariant of the ternary cubic

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: cubic = invariant_theory.ternary_cubic(x^3+y^3+z^3)
sage: cubic.J_covariant()
x^6*y^3 - x^3*y^6 - x^6*z^3 + y^6*z^3 + x^3*z^6 - y^3*z^6

sage: R.<x,y> = QQ[]
sage: cubic = invariant_theory.ternary_cubic(x^3+y^3+1)
sage: cubic.J_covariant()
x^6*y^3 - x^3*y^6 - x^6 + y^6 + x^3 - y^3
S_invariant()

Return the S-invariant

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: cubic = invariant_theory.ternary_cubic(x^2*y+y^3+z^3+x*y*z)
sage: cubic.S_invariant()
-1/1296
T_invariant()

Return the T-invariant

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: cubic = invariant_theory.ternary_cubic(x^3+y^3+z^3)
sage: cubic.T_invariant()
1

sage: R.<x,y,z,t> = GF(7)[]
sage: cubic = invariant_theory.ternary_cubic(x^3+y^3+z^3+t*x*y*z, [x,y,z])
sage: cubic.T_invariant()
-t^6 - t^3 + 1
Theta_covariant()

Return the \Theta covariant

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: cubic = invariant_theory.ternary_cubic(x^3+y^3+z^3)
sage: cubic.Theta_covariant()
-x^3*y^3 - x^3*z^3 - y^3*z^3

sage: R.<x,y> = QQ[]
sage: cubic = invariant_theory.ternary_cubic(x^3+y^3+1)
sage: cubic.Theta_covariant()
-x^3*y^3 - x^3 - y^3

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: cubic = invariant_theory.ternary_cubic(p, x,y,z)
sage: len(list(cubic.Theta_covariant()))
6952
coeffs()

Return the coefficients of a cubic

Given

\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}

this function returns a = (a_{30}, a_{03}, a_{00}, a_{21}, a_{20}, a_{12}, a_{02}, a_{10}, a_{01}, a_{11})

EXAMPLES:

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: invariant_theory.ternary_cubic(p, x,y,z).coeffs()
(a30, a03, a00, a21, a20, a12, a02, a10, a01, a11)
sage: invariant_theory.ternary_cubic(p.subs(z=1), x, y).coeffs()
(a30, a03, a00, a21, a20, a12, a02, a10, a01, a11)
monomials()

List the basis monomials in the form.

OUTPUT:

A tuple of monomials. They are in the same order as coeffs().

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: cubic = invariant_theory.ternary_cubic(x^3+y*z^2)
sage: cubic.monomials()
(x^3, y^3, z^3, x^2*y, x^2*z, x*y^2, y^2*z, x*z^2, y*z^2, x*y*z)
polar_conic()

Return the polar conic of the cubic

OUTPUT:

Given the ternary cubic f(X,Y,Z), this method returns the symmetric matrix A(x,y,z) defined by

x f_X + y f_Y + z f_Z = (X,Y,Z) \cdot A(x,y,z) \cdot (X,Y,Z)^t

EXAMPLES:

sage: R.<x,y,z,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: cubic = invariant_theory.ternary_cubic(p, x,y,z)
sage: cubic.polar_conic()
[  3*x*a30 + y*a21 + z*a20 x*a21 + y*a12 + 1/2*z*a11 x*a20 + 1/2*y*a11 + z*a10]
[x*a21 + y*a12 + 1/2*z*a11   x*a12 + 3*y*a03 + z*a02 1/2*x*a11 + y*a02 + z*a01]
[x*a20 + 1/2*y*a11 + z*a10 1/2*x*a11 + y*a02 + z*a01   x*a10 + y*a01 + 3*z*a00]

sage: polar_eqn = X*p.derivative(x) + Y*p.derivative(y) + Z*p.derivative(z)
sage: polar = invariant_theory.ternary_quadratic(polar_eqn, [x,y,z])
sage: polar.matrix().subs(X=x,Y=y,Z=z) == cubic.polar_conic()
True
scaled_coeffs()

Return the coefficients of a cubic

Compared to coeffs(), this method returns rescaled coefficiens that are often used in invariant theory.

Given

\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}

this function returns a = (a_{30}, a_{03}, a_{00}, a_{21}/3, a_{20}/3, a_{12}/3, a_{02}/3, a_{10}/3, a_{01}/3, a_{11}/6)

EXAMPLES:

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: invariant_theory.ternary_cubic(p, x,y,z).scaled_coeffs()
(a30, a03, a00, 1/3*a21, 1/3*a20, 1/3*a12, 1/3*a02, 1/3*a10, 1/3*a01, 1/6*a11)
class sage.rings.invariant_theory.TernaryQuadratic(polynomial, *args)

Bases: sage.rings.invariant_theory.QuadraticForm

Invariant theory of a ternary quadratic

You should use the invariant_theory factory object to contstruct instances of this class. See ternary_quadratic() for details.

TESTS:

sage: R.<x,y,z> = QQ[]
sage: quadratic = invariant_theory.ternary_quadratic(x^2+y^2+z^2)
sage: quadratic
ternary quadratic with coefficients (1, 1, 1, 0, 0, 0)
sage: TestSuite(quadratic).run()
coeffs()

Return the coefficients of a quadratic

Given

p(x,y) =&\;
a_{20} x^{2} + a_{11} x y + a_{02} y^{2} +
a_{10} x + a_{01} y + a_{00}

this function returns a = (a_{20}, a_{02}, a_{00}, a_{11}, a_{10}, a_{01} )

EXAMPLES:

sage: R.<x,y,z,a20,a11,a02,a10,a01,a00> = QQ[]
sage: p = ( a20*x^2 + a11*x*y + a02*y^2 +
...         a10*x*z + a01*y*z + a00*z^2 )
sage: invariant_theory.ternary_quadratic(p, x,y,z).coeffs()
(a20, a02, a00, a11, a10, a01)
sage: invariant_theory.ternary_quadratic(p.subs(z=1), x, y).coeffs()
(a20, a02, a00, a11, a10, a01)
covariant_conic(other)

Returns the ternary quadratic covariant to self and other

INPUT:

  • other – Another ternary quadratic.

OUTPUT:

The so-called covariant conic, a ternary quadratic. It is symmetric under exchange of self and other.

EXAMPLES:

sage: ring.<x,y,z> = QQ[]
sage: Q = invariant_theory.ternary_quadratic(x^2+y^2+z^2)
sage: R = invariant_theory.ternary_quadratic(x*y+x*z+y*z)
sage: Q.covariant_conic(R)
-x*y - x*z - y*z
sage: R.covariant_conic(Q)
-x*y - x*z - y*z

TESTS:

sage: R.<a,a_,b,b_,c,c_,f,f_,g,g_,h,h_,x,y,z> = QQ[]
sage: p = ( a*x^2 + 2*h*x*y + b*y^2 +
...         2*g*x*z + 2*f*y*z + c*z^2 )
sage: Q = invariant_theory.ternary_quadratic(p, [x,y,z])
sage: Q.matrix()
[a h g]
[h b f]
[g f c]
sage: p = ( a_*x^2 + 2*h_*x*y + b_*y^2 +
...         2*g_*x*z + 2*f_*y*z + c_*z^2 )
sage: Q_ = invariant_theory.ternary_quadratic(p, [x,y,z])
sage: Q_.matrix()
[a_ h_ g_]
[h_ b_ f_]
[g_ f_ c_]
sage: QQ_ = Q.covariant_conic(Q_)
sage: invariant_theory.ternary_quadratic(QQ_, [x,y,z]).matrix()
[      b_*c + b*c_ - 2*f*f_  f_*g + f*g_ - c_*h - c*h_ -b_*g - b*g_ + f_*h + f*h_]
[ f_*g + f*g_ - c_*h - c*h_       a_*c + a*c_ - 2*g*g_ -a_*f - a*f_ + g_*h + g*h_]
[-b_*g - b*g_ + f_*h + f*h_ -a_*f - a*f_ + g_*h + g*h_       a_*b + a*b_ - 2*h*h_]
dual()

Return the dual ternary quadratic

EXAMPLES:

sage: R.<a,b,c,x,y,z> = QQ[]
sage: cubic = x^2+y^2+z^2
sage: quadratic = invariant_theory.ternary_quadratic(a*x^2+b*y^2+c*z^2, [x,y,z])
sage: quadratic.form()
a*x^2 + b*y^2 + c*z^2
sage: quadratic.dual().form()
b*c*x^2 + a*c*y^2 + a*b*z^2

sage: R.<x,y,z, t> = QQ[]
sage: cubic = x^2+y^2+z^2
sage: quadratic = invariant_theory.ternary_quadratic(x^2+y^2+z^2 + t*x*y, [x,y,z])
sage: quadratic.dual()
ternary quadratic with coefficients (1, 1, -1/4*t^2 + 1, -t, 0, 0)

sage: R.<x,y, t> = QQ[]
sage: quadratic = invariant_theory.ternary_quadratic(x^2+y^2+1 + t*x*y, [x,y])
sage: quadratic.dual()
ternary quadratic with coefficients (1, 1, -1/4*t^2 + 1, -t, 0, 0)

TESTS:

sage: R = PolynomialRing(QQ, 'a20,a11,a02,a10,a01,a00,x,y,z', order='lex')
sage: R.inject_variables()
Defining a20, a11, a02, a10, a01, a00, x, y, z
sage: p = ( a20*x^2 + a11*x*y + a02*y^2 +
...         a10*x*z + a01*y*z + a00*z^2 )
sage: quadratic = invariant_theory.ternary_quadratic(p, x,y,z)
sage: transformation = {x:x + 3*y, y:4*x + 13*y - z, z:-5*y + 6*z}
sage: inverse = {x:73*x - 18*y - 3*z, y:-24*x + 6*y + z, z:-20*x + 5*y + z}

quadratic.dual().form().subs(transformation)
quadratic.dual().form().subs(inverse)
monomials()

List the basis monomials in the form.

OUTPUT:

A tuple of monomials. They are in the same order as coeffs().

EXAMPLES:

sage: R.<x,y,z> = QQ[]
sage: quadratic = invariant_theory.ternary_quadratic(x^2+y*z)
sage: quadratic.monomials()
(x^2, y^2, z^2, x*y, x*z, y*z)
scaled_coeffs()

Return the scaled coefficients of a quadratic

Given

p(x,y) =&\;
a_{20} x^{2} + a_{11} x y + a_{02} y^{2} +
a_{10} x + a_{01} y + a_{00}

this function returns a = (a_{20}, a_{02}, a_{00}, a_{11}/2, a_{10}/2, a_{01}/2, )

EXAMPLES:

sage: R.<x,y,z,a20,a11,a02,a10,a01,a00> = QQ[]
sage: p = ( a20*x^2 + a11*x*y + a02*y^2 +
...         a10*x*z + a01*y*z + a00*z^2 )
sage: invariant_theory.ternary_quadratic(p, x,y,z).scaled_coeffs()
(a20, a02, a00, 1/2*a11, 1/2*a10, 1/2*a01)
sage: invariant_theory.ternary_quadratic(p.subs(z=1), x, y).scaled_coeffs()
(a20, a02, a00, 1/2*a11, 1/2*a10, 1/2*a01)

Previous topic

Quotient Ring Elements

This Page