#### D.7.2.1 invariantRing

Procedure from library `ainvar.lib` (see ainvar_lib).

Usage:
  invariantRing(m,p,q,b[,r,pa]); m matrix, p,q poly, b,r int, pa string

Assume:
  p,q variables with m(p)=q and q invariant under m
  i.e. if p=x(i) and q=x(j) then m[j,1]=0 and m[i,1]=x(j)

Return:
  ideal, containing generators of the ring of invariants of the additive group (K,+) given by the vector field

               m = m[1,1]*d/dx(1) +...+ m[n,1]*d/dx(n).

  If b>0 the computation stops after all invariants of degree <= b (and at least one of higher degree) are found or when all invariants are computed.
  If b<=0, the computation continues until all generators of the ring of invariants are computed (should be used only if the ring of invariants is known to be finitely generated, otherwise the algorithm might not stop).
  If r=1 a different reduction is used which is sometimes faster (default r=0).

Display:
  if pa is given (any string as 5th or 6th argument), the computation pauses whenever new invariants are found and displays them

Theory:
  The algorithm for computing the ring of invariants works in char 0 or sufficiently large characteristic.
  (K,+) acts as the exponential of the vector field defined by the matrix m.
  For background see G.-M. Greuel, G. Pfister,
  Geometric quotients of unipotent group actions, Proc. London Math. Soc. (3) 67, 75-105 (1993).

Example:

    LIB "ainvar.lib";
    //Winkelmann: free action but Spec(k[x(1),...,x(5)]) --> Spec(invariant ring)
    //is not surjective
    ring rw=0,(x(1..5)),dp;
    matrix m[5][1];
    m[3,1]=x(1);
    m[4,1]=x(2);
    m[5,1]=1+x(1)*x(4)+x(2)*x(3);
    ideal in=invariantRing(m,x(3),x(1),0);      //compute full invarint ring
    in;
    ==> in[1]=x(1)
    ==> in[2]=x(2)
    ==> in[3]=x(2)*x(3)*x(4)-x(2)*x(5)+x(4)
    ==> in[4]=x(1)*x(3)*x(4)-x(1)*x(5)+x(3)
    //Deveney/Finston: The ring of invariants is not finitely generated
    ring rf=0,(x(1..7)),dp;
    matrix m[7][1];
    m[4,1]=x(1)^3;
    m[5,1]=x(2)^3;
    m[6,1]=x(3)^3;
    m[7,1]=(x(1)*x(2)*x(3))^2;
    ideal in=invariantRing(m,x(4),x(1),6);      //all invariants up to degree 6
    in;
    ==> in[1]=x(1)
    ==> in[2]=x(3)
    ==> in[3]=x(2)
    ==> in[4]=x(3)^3*x(4)-x(1)^3*x(6)
    ==> in[5]=x(2)^3*x(4)-x(1)^3*x(5)
    ==> in[6]=x(2)^2*x(3)^2*x(4)-x(1)*x(7)
    ==> in[7]=x(1)^2*x(2)^2*x(6)-x(3)*x(7)
    ==> in[8]=x(1)^2*x(3)^2*x(5)-x(2)*x(7)
    ==> in[9]=x(1)^2*x(2)*x(3)^4*x(4)*x(5)+x(1)^2*x(2)^4*x(3)*x(4)*x(6)-x(1)^5*x(\
       2)*x(3)*x(5)*x(6)-2*x(2)^2*x(3)^2*x(4)*x(7)+x(1)*x(7)^2

User manual for Singular version 4.4.1, 2025, generated by texi2html.