Invariants of Tori
In this section, with notation as in the introduction to this chapter, $T = (K^{\ast})^m$ will be a torus of rank $m$ over an algebraically closed field $K$, acting diagonally on $V$. As for linearly reductive groups, $T$ and its representation are defined over a subfield $k$ of $K$ supported by OSCAR, and all computations are performed over $k$.
In principle, invariants of diagonal torus actions can be computed with Derksen's algorithm from the previous section. OSCAR instead uses Algorithm 4.3.1 in [DK15], which relies on polyhedral geometry and, as the authors put it, "is simpler and more efficient".
Creating Invariant Rings
How Tori and Their Representations are Given
torus_group — Method
torus_group(k::Field, m::Int)Return the torus $(K^{\ast})^m$ defined over k, where $K$ is an algebraic closure of k.
In the context of computing invariant rings, there is no need to deal with the group structure of a torus: The torus $(K^{\ast})^m$ is specified by just giving $k$ and $m$.
Examples
julia> T = torus_group(QQ,2)
Torus of rank 2
defined over QQThis function is part of the experimental code in Oscar. Please read here for more details.
representation_from_weights — Method
representation_from_weights(T::TorusGroup, W::Union{ZZMatrix, Matrix{<:IntegerUnion}, Vector{<:IntegerUnion}})Return the diagonal action of T with weights given by W.
The matrix W has one row for each coordinate of the vector space on which T acts, and $m$ = rank(T) columns: if the $i$-th row is $(w_1, \dots, w_m)$, then $t = (t_1, \dots, t_m) \in T$ multiplies the $i$-th coordinate by $t_1^{w_1} \cdots t_m^{w_m}$. If $m = 1$, then W may also be a vector.
Examples
julia> T = torus_group(QQ,2);
julia> r = representation_from_weights(T, [-1 1; -1 1; 2 -2; 0 -1])
Representation
of torus of rank 2 defined over QQ
with weights Vector{ZZRingElem}[[-1, 1], [-1, 1], [2, -2], [0, -1]]This function is part of the experimental code in Oscar. Please read here for more details.
weights — Method
weights(r::RepresentationTorusGroup)Return the weights of r, one for each coordinate of the vector space on which the torus acts diagonally.
Examples
julia> T = torus_group(QQ,2);
julia> r = representation_from_weights(T, [-1 1; -1 1; 2 -2; 0 -1]);
julia> weights(r)
4-element Vector{Vector{ZZRingElem}}:
[-1, 1]
[-1, 1]
[2, -2]
[0, -1]This function is part of the experimental code in Oscar. Please read here for more details.
group — Method
group(r::RepresentationTorusGroup)Return the torus group represented by r.
Examples
julia> T = torus_group(QQ,2);
julia> r = representation_from_weights(T, [-1 1; -1 1; 2 -2; 0 -1]);
julia> group(r)
Torus of rank 2
defined over QQThis function is part of the experimental code in Oscar. Please read here for more details.
If r is a representation of a torus on $V$, then degree(r) and vector_space_dim(r) refer to the dimension $n$ of $V$.
Constructor for Invariant Rings
invariant_ring — Method
invariant_ring(r::RepresentationTorusGroup)Return the invariant ring of the torus group represented by r.
The creation of invariant rings is lazy in the sense that no explicit computations are done until specifically invoked (for example, by the fundamental_invariants function).
Examples
julia> T = torus_group(QQ,2);
julia> r = representation_from_weights(T, [-1 1; -1 1; 2 -2; 0 -1]);
julia> RT = invariant_ring(r)
Invariant ring
of graded multivariate polynomial ring in 4 variables over QQ
under group action of torus of rank 2 defined over QQThis function is part of the experimental code in Oscar. Please read here for more details.
Basic Data Associated to Invariant Rings
If RT is the invariant ring $k[x_1, \dots, x_n]^T$ of a torus $T$, then
group(RT)refers to $T$,coefficient_ring(RT)to $k$, andpolynomial_ring(RT)to $k[x_1, \dots, x_n]$.
The Reynolds Operator
reynolds_operator — Method
reynolds_operator(RT::TorGroupInvarRing, f::MPolyRingElem)Return the image of f under the Reynolds operator corresponding to RT.
This is the projection onto the invariant polynomials: it keeps the terms of f whose monomial $x^a$ has weight $\sum_i a_i w_i = 0$, where $w_i$ is the weight of $x_i$, and drops the others.
Examples
julia> T = torus_group(QQ,2);
julia> r = representation_from_weights(T, [-1 1; -1 1; 2 -2; 0 -1]);
julia> RT = invariant_ring(r);
julia> X = gens(polynomial_ring(RT));
julia> reynolds_operator(RT, (X[1] + X[2] + X[3] + X[4])^3)
3*X[1]^2*X[3] + 6*X[1]*X[2]*X[3] + 3*X[2]^2*X[3]This function is part of the experimental code in Oscar. Please read here for more details.
The Null Cone
null_cone_ideal — Method
null_cone_ideal(RG::RedGroupInvarRing)Return Hilbert's ideal, the ideal of polynomial_ring(RG) generated by the invariants of positive degree.
Its zero set is the null cone, the set of all $v \in V$ such that the closure of the orbit $G v$ contains $0$. The generators are computed as in Derksen's algorithm [Der99] and need not be invariants.
Examples
For binary quartics, the second generator is not invariant:
julia> G = linearly_reductive_group(:SL, 2, QQ);
julia> RG = invariant_ring(representation_on_forms(G, 4));
julia> null_cone_ideal(RG)
Ideal generated by
X[1]*X[5] - 4*X[2]*X[4] + 3*X[3]^2
4*X[1]*X[3]*X[5] - 3*X[1]*X[4]^2 - 3*X[2]^2*X[5] + 2*X[2]*X[3]*X[4]This function is part of the experimental code in Oscar. Please read here for more details.
null_cone_ideal(RT::TorGroupInvarRing)Return Hilbert's ideal, the ideal of polynomial_ring(RT) generated by the invariants of positive degree.
Its zero set is the null cone, the set of all $v \in V$ such that the closure of the orbit $T v$ contains $0$. The generators are the fundamental invariants of RT.
Examples
julia> T = torus_group(QQ,2);
julia> r = representation_from_weights(T, [-1 1; -1 1; 2 -2; 0 -1]);
julia> RT = invariant_ring(r);
julia> null_cone_ideal(RT)
Ideal generated by
X[1]^2*X[3]
X[1]*X[2]*X[3]
X[2]^2*X[3]This function is part of the experimental code in Oscar. Please read here for more details.
Fundamental Systems of Invariants
fundamental_invariants — Method
fundamental_invariants(RT::TorGroupInvarRing)Return a system of fundamental invariants for RT.
Examples
julia> T = torus_group(QQ,2);
julia> r = representation_from_weights(T, [-1 1; -1 1; 2 -2; 0 -1]);
julia> RT = invariant_ring(r);
julia> fundamental_invariants(RT)
3-element Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}:
X[1]^2*X[3]
X[1]*X[2]*X[3]
X[2]^2*X[3]This function is part of the experimental code in Oscar. Please read here for more details.
Invariant Rings as Affine Algebras
affine_algebra — Method
affine_algebra(RG::RedGroupInvarRing)
affine_algebra(RG::TorGroupInvarRing)Return the invariant ring RG as an affine algebra (this amounts to compute the algebra syzygies among the fundamental invariants of RG).
In addition, if A is this algebra, and R is the polynomial ring of which RG is a subalgebra, return the inclusion homomorphism A $\hookrightarrow$ R whose image is RG.
Examples
julia> G = linearly_reductive_group(:SL, 2, QQ);
julia> r = representation_on_forms(G, 2);
julia> S, x = graded_polynomial_ring(QQ, :x => 1:3);
julia> RG = invariant_ring(S, r);
julia> A, AtoS = affine_algebra(RG)
(Quotient of multivariate polynomial ring by ideal (0), Hom: A -> S)julia> T = torus_group(QQ,2);
julia> r = representation_from_weights(T, [-1 1; -1 1; 2 -2; 0 -1]);
julia> RT = invariant_ring(r);
julia> fundamental_invariants(RT)
3-element Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}:
X[1]^2*X[3]
X[1]*X[2]*X[3]
X[2]^2*X[3]
julia> affine_algebra(RT)
(Quotient of multivariate polynomial ring by ideal (-t[1]*t[3] + t[2]^2), Hom: quotient of multivariate polynomial ring -> graded multivariate polynomial ring)This function is part of the experimental code in Oscar. Please read here for more details.
The Hilbert Series
hilbert_series — Method
hilbert_series(RG::RedGroupInvarRing)
hilbert_series(RG::TorGroupInvarRing)Return the Hilbert series of RG as hilbert_series does for the graded affine algebra returned by affine_algebra(RG): a pair $(p, q)$ of univariate polynomials such that $p/q$ is the Hilbert series, where $q = (1-t^{d_1}) \cdots (1-t^{d_s})$ and $d_1, \dots, d_s$ are the degrees of the fundamental invariants.
Examples
julia> G = linearly_reductive_group(:SL, 2, QQ);
julia> RG = invariant_ring(representation_on_forms(G, 4));
julia> hilbert_series(RG)
(1, (-t^2 + 1)^1*(-t^3 + 1)^1)julia> T = torus_group(QQ,2);
julia> r = representation_from_weights(T, [-1 1; -1 1; 2 -2; 0 -1]);
julia> RT = invariant_ring(r);
julia> hilbert_series(RT)
(-t^6 + 1, (-t^3 + 1)^3)This function is part of the experimental code in Oscar. Please read here for more details.