# Singular

#### D.7.3.5 InvariantRing

Procedure from library `rinvar.lib` (see rinvar_lib).

Usage:
InvariantRing(G, Gact [, opt]); ideal G, Gact; int opt

Purpose:
compute generators of the invariant ring of G w.r.t. the action 'Gact'

Assume:
G is a finite group and 'Gact' is a linear action.

Return:
ring R; this ring comes with the ideals 'invars' and 'groupid' and with the poly 'newA':
- 'invars' contains the algebra generators of the invariant ring - 'groupid' is the ideal of G in the new ring
- 'newA' is the new representation of the primitive root of the minimal polynomial of the ring which was active when calling the procedure (if the minpoly did not change, 'newA' is set to 'a').

Note:
the minimal polynomial of the output ring depends on some random choices

Example:
 ```LIB "rinvar.lib"; ring B = 0, (s(1..2), t(1..2)), dp; ideal G = -s(1)+s(2)^3, s(1)^4-1; ideal action = s(1)*t(1), s(2)*t(2); def R = InvariantRing(std(G), action); ==> ==> // 'InvariantRing' created a new ring. ==> // To see the ring, type (if the name 'R' was assigned to the return valu\ e): ==> show(R); ==> // To access the generators of the invariant ring type ==> setring R; invars; ==> // Note that the input group G is stored in R as the ideal 'groupid'; to ==> // see it, type ==> groupid; ==> // Note that 'InvariantRing' might change the minimal polynomial ==> // The representation of the algebraic number is given by 'newA' ==> setring R; invars; ==> invars[1]=t(1)^4 ==> invars[2]=t(1)^3*t(2)^3 ==> invars[3]=t(1)^2*t(2)^6 ==> invars[4]=t(1)*t(2)^9 ==> invars[5]=t(2)^12 ```