# Singular

#### D.7.1.9 molien

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

Usage:
molien(G1,G2,...[,ringname,lcm,flags]);
G1,G2,...: nxn <matrices>, all elements of a finite matrix group, ringname: a <string> giving a name for a new ring of characteristic 0 for the Molien series in case of prime characteristic, lcm: an <int> giving the lowest common multiple of the elements' orders in case of prime characteristic, minpoly==0 and a non-cyclic group, flags: an optional <intvec> with three components: if the first element is not equal to 0 characteristic 0 is simulated, i.e. the Molien series is computed as if the base field were characteristic 0 (the user must choose a field of large prime characteristic, e.g. 32003), the second component should give the size of intervals between canceling common factors in the expansion of the Molien series, 0 (the default) means only once after generating all terms, in prime characteristic also a negative number can be given to indicate that common factors should always be canceled when the expansion is simple (the root of the extension field does not occur among the coefficients)

Assume:
n is the number of variables of the basering, G1,G2... are the group elements generated by group_reynolds(), lcm is the second return value of group_reynolds()

Return:
in case of characteristic 0 a 1x2 <matrix> giving enumerator and denominator of Molien series; in case of prime characteristic a ring with the name `ringname` of characteristic 0 is created where the same Molien series (named M) is stored

Display:
information if the third component of flags does not equal 0

Theory:
In characteristic 0 the terms 1/det(1-xE) for all group elements of the Molien series are computed in a straight forward way. In prime characteristic a Brauer lift is involved. The returned matrix gives enumerator and denominator of the expanded version where common factors have been canceled.

Example:
 ```LIB "finvar.lib"; " note the case of prime characteristic"; ==> note the case of prime characteristic ring R=0,(x,y,z),dp; matrix A[3][3]=0,1,0,-1,0,0,0,0,-1; list L=group_reynolds(A); matrix M=molien(L[2..size(L)]); print(M); ==> x3+x2-x+1,-x7+x6+x5-x4+x3-x2-x+1 ring S=3,(x,y,z),dp; string newring="alksdfjlaskdjf"; matrix A[3][3]=0,1,0,-1,0,0,0,0,-1; list L=group_reynolds(A); molien(L[2..size(L)],newring); setring Finvar::alksdfjlaskdjf; print(M); ==> x3+x2-x+1,-x7+x6+x5-x4+x3-x2-x+1 setring S; kill Finvar::alksdfjlaskdjf; ```