# Singular

#### D.7.1.6 invariant_algebra_perm

Procedure from library `finvar.lib` (see finvar_lib).

Usage:
invariant_algebra_perm(GEN[,v]);
GEN: a list of generators of a permutation group. It is given in disjoint cycle form, where trivial cycles can be omitted; e.g., the generator (1,2)(3,4)(5) is given by <list(list(1,2),list(3,4))>.
v: an optional <int>

Return:
A minimal homogeneous generating set of the invariant ring of the group presented by GEN, type <matrix>

Assume:
We are in the non-modular case, i.e., the characteristic of the basering does not divide the group order. Note that the function does not verify whether this assumption holds or not

Display:
Information on the progress of computations if v does not equal 0

Theory:
We do an incremental search in increasing degree d. Generators of the invariant ring are found among the orbit sums of degree d. The generators are chosen by Groebner basis techniques (see S. King: Minimal generating sets of non-modular invariant rings of finite groups).

Note:
invariant_algebra_perm should not be used in rings with weighted orders.

Example:
 ```LIB "finvar.lib"; ring R=0,(a,b,c,d),dp; def GEN=list(list(list(1,3),list(2,4))); matrix G = invariant_algebra_perm(GEN,1); ==> Searching generators in degree 1 ==> We have 2 orbit sums of degree 1 ==> We found generator number 1 in degree 1 ==> We found generator number 2 in degree 1 ==> Computing Groebner basis up to the new degree 2 ==> Searching generators in degree 2 ==> We have 3 orbit sums of degree 2 ==> We found generator number 3 in degree 2 ==> We found generator number 4 in degree 2 ==> We found generator number 5 in degree 2 ==> Computing Groebner basis up to the new degree 3 ==> We found the degree bound 2 ==> We went beyond the degree bound, so, we are done! G; ==> G[1,1]=b+d ==> G[1,2]=a+c ==> G[1,3]=b2+d2 ==> G[1,4]=ab+cd ==> G[1,5]=a2+c2 ```