5. Module Polynomials
In this chapter we consider finitely generated modules over the monoid rings considered previously. We call an element of this module a module polynomial, and we describe functions to construct module polynomials and the standard algebraic operations for such polynomials.
A module polynomial modpoly
is recorded as a list of pairs, [ gen, monpoly ]
, where gen
is a module generator (basis element), and monpoly
is a monoid polynomial. The module polynomial is printed as the formal sum of monoid polynomial multiples of the generators. Note that the monoid polynomials are the coefficients of the module polynomials and appear to the right of the generator, as we choose to work with right modules.
The examples we are aiming for are the identities among the relators of a finitely presented group (see section 5.4).
5.1 Construction of module polynomials
5.1-1 ModulePoly
> ModulePoly ( gens, monpolys ) | ( operation ) |
> ModulePoly ( args ) | ( operation ) |
This function returns a module polynomial. The terms of the polynomial maybe input as a list of generators followed by a list of monoid polynomials or as one list of [generator, monoid polynomial]
pairs.
gap> frq8 := FreeRelatorGroup( q8 );
q8_R
gap> genfrq8 := GeneratorsOfGroup( frq8 );
[ q8_R1, q8_R2, q8_R3, q8_R4 ]
gap> mp1 := MonoidPolyFromCoeffsWords( [3,2,-5], [M[1]*M[3], M[2]^4, M[1] ] );
<monpoly>
gap> Print( mp1 );
2*q8_M2^4 + 3*q8_M1*q8_M3 _ 5*q8_M1
gap> mp2 := MonoidPolyFromCoeffsWords( [1,-4,-1,2],
[ M[2]*M[3]*M[1], M[3]^3, M[1]*M[2], M[4] ]
<monpoly>
gap> Print( mp2 );
- 4*q8_M3^3 + q8_M2*q8_M3*q8_M1 - q8_M1*q8_M2 + 2*q8_M4
gap> s1 := ModulePoly( [ genfrq8[4] , genfrq8[1] ], [mp1, mp2 ] );
<modpoly>
gap> Print( s1 );
q8_R1*( - 4*q8_M3^3 + q8_M2*q8_M3*q8_M1 - q8_M1*q8_M2 + 2*q8_M4)
+ q8_R4*( 2*q8_M2^4 + 3*q8_M1*q8_M3 - 5*q8_M1)
gap> s2 := ModulePoly( [ genfrq8[3], genfrq8[2], genfrq8[1] ], [3*mp1, -1*mp2,\
(mp1+mp2) ] );
<modpoly>
gap> Print( s2 );
q8_R1*(2*q8_M2^4 - 4*q8_M3^3 + q8_M2*q8_M3*q8_M1 + 3*q8_M1*q8_M3
- q8_M1*q8_M2 + 2*q8_M4 - 5*q8_M1) + q8_R2*(4*q8_M3^3 - q8_M2*q8_M3*q8_M1
+ q8_M1*q8_M2 - 2*q8_M4) + q8_R3*(6*q8_M2^4 + 9*q8_M1*q8_M3 - 15*q8_M1)
|
5.2 Components of a module polynomial
5.2-1 Terms
> Terms ( modpoly ) | ( attribute ) |
> LeadTerm ( modpoly ) | ( attribute ) |
> LeadMonoidPoly ( modpoly ) | ( attribute ) |
> One ( modpoly ) | ( attribute ) |
> Length ( modpoly ) | ( attribute ) |
The first function counts the number of module generators which occur in modpoly
(a generator occurs in a polynomial if it has nonzero coefficient). The function One
returns the identity in the free group on the generators.
The function Terms
returns the terms of a module polynomial as a list of pairs. In LeadTerm
, the generators are ordered, and the term of modpoly
with the highest value generator is defined to be the leading term. The monoid polynomial (coefficient) part of the leading term is returned by the function LeadMonoidPoly
.
gap> Length(s1);
2
gap> Length(s2);
3
gap> One( s1 );
<identity ...>
gap> Terms( s1 );
[ [ q8_R1, - 4*q8_M3^3 + q8_M2*q8_M3*q8_M1 - q8_M1*q8_M2 + 2*q8_M4 ],
[ q8_R4, 2*q8_M2^4 + 3*q8_M1*q8_M3 - 5*q8_M1 ] ]
gap> Terms( s2 );
[ [ q8_R1, 2*q8_M2^4 - 4*q8_M3^3 + q8_M2*q8_M3*q8_M1 + 3*q8_M1*q8_M3 - q8_M1*q8_M\
2 + 2*q8_M4 - 5*q8_M1 ],
[ q8_R2, 4*q8_M3^3 - q8_M2*q8_M3*q8_M1 + q8_M1*q8_M2 - 2*q8_M4 ],
[ q8_R3, 6*q8_M2^4 + 9*q8_M1*q8_M3 - 15*q8_M1 ] ]
gap> LeadTerm( s1 );
[ q8_R4, <monpoly> ]
gap> LeadTerm( s2 );
[ q8_R3, <monpoly> ]
gap> Print( LeadMonoidPoly( s1 ) );
2*q8_M2^4 + 3*q8_M1*q8_M3 - 5*q8_M1
gap> Print( LeadMonoidPoly( s2 ) );
6*q8_M2^4 + 9*q8_M1*q8_M3 - 15*q8_M1
|
5.2-2 ZeroModulePoly
> ZeroModulePoly ( Fgens, Fmon ) | ( operation ) |
Assuming that Fgens
is the free group on the module generators and Fmon
is the free group on the monoid generators, then this function returns the zero module polynomial, which has no terms, and is an element of the module.
gap> zeromp := ZeroModulePoly( frel, freeq8 );
<modpoly>
gap> Print( zeromp );
zero modpoly
|
5.2-3 AddTermModulePoly
> AddTermModulePoly ( modpoly, gen, monpoly ) | ( operation ) |
This function adds a term [gen, monpoly]
to a module polynomial modpoly
.
gap> s3 := AddTermModulePoly( s1, frelgen[3], mp1 );
<modpoly>
gap> Print( s3 );
q8_Rl*( - 4*q8_M3^3 + q8_M2*q8_M3*q8_Ml - q8_Ml*q8_M2 + 2*q8_M4)
+ q8_R3*( 2*q8_M2^4 + 3*q8_Ml*q8_M3 - 5*q8_Ml)
+ q8_R4*(2*q8_M2^4 + 3*q8_Ml*q8_M35*q8_Ml)
|
5.3 Module Polynomial Operations
Tests for equality and arithmetic operations are performed in the usual way. Module polynomials may be added or subtracted. A module polynomial can also be multiplied on the right by a word or by a scalar. The effect of this is to multiply the monoid polynomial parts of each term by the word or scalar. This is made clearer in the example.
gap> Print( s1 );
q8_Rl*( - 4*q8_M3^3 + q8_M2*q8_M3*q8_Ml - q8_Ml*q8_M2 + 2*q8_M4)
+ q8_R4*( 2*q8_M2^4 + 3*q8_Ml*q8_M3 _ 5*q8_Ml)
gap> Print( s2 );
q8_Rl*(2*q8_M2^4 - 4*q8_M3^3 + q8_M2*q8_M3*q8_Ml + 3*q8_Ml*q8_M3
- q8_Ml*q8_M2 + 2*q8_M4 - 5*q8_Ml)
+ q8_R2*(4*q8_M3^ 3 - q8_M2*q8_M3*q8_Ml + q8_Ml*q8_M2 - 2*q8_M4)
+ q8_R3*(6*q8_M2^4 + 9*q8_Ml*q8_M3 - 15*q8_Ml)
gap> Print( s1+s2 );
q8_Rl*(2*q8_M2^4 - 8*q8_M3^3 + 2*q8_M2*q8_M3*q8_Ml
+ 3*q8_Ml*q8_M32*q8_Ml*q8_M2 + 4*q8_M4 - 5*q8_Ml)
+ q8_R2*(4*q8_M3^ 3 - q8_M2*q8_M3*q8_Ml + q8_Ml*q8_M2 - 2*q8_M4)
+ q8_R3*(6*q8_M2^4 + 9*q8_Ml*q8_M3 - 15*q8_Ml)
+ q8_R4*(2*q8_M2^4 + 3*q8_Ml*q8_M3 - 5*q8_Ml)
gap> Print( s1 - s2 );
q8_Rl*( - 2*q8_M2^4 - 3*q8_Ml*q8_M3 + 5*q8_Ml)
+ q8_R2*( - 4*q8_M3^3 + q8_M2*q8_M3*q8_Ml - q8_Ml*q8_M2 + 2*q8_M4)
+ q8_R3*( - 6*q8_M2^49*q8_Ml*q8_M3 + 15*q8_Ml) + q8_R4*(2*q8_M2^4
+ 3*q8_Ml*q8_M3 - 5*q8_Ml)
gap> Print( s1*1/2 );
q8_R1*( - 2*q8_M3^3 + 1/2*q8_M2*q8_M3*q8_M1 - 1/2*q8_M1*q8_M2 + q8_M4)
+ q8_R4*( q8_M2^4 + 3/2*q8_M1*q8_M3 - 5/2*q8_M1)
gap> M[1];
q8_M1
gap> Print( s1*M[1] );
q8_R1*( - 4*q8_M3^3_q8_M1 + q8_M2*q8_M3*q8_M1^2 - q8_M1*q8_M2*q8_M1
+ 2*q8_M4*q8_M1) + q8_R4*( 2*q8_M2^4*q8_M1 + 3*q8_M1*q8_M3*q8_M1 - 5*q8_M1^2)
gap> Length( s3 );
3
|
5.4 Identities among relators
5.4-1 IdentitiesAmongRelators
> IdentitiesAmongRelators ( grp ) | ( attribute ) |
The identities among the relators for a finitely presented group are logged module polynomials.
gap> idsq8 := IdentitiesAmongRelators( q8 );
[ [ ( q8_Y3*( q8_M1*q8_M4), q8_R1*( q8_M1 - <identity ...>) ),
( q8_Y10*( -q8_M1*q8_M4), q8_R2*( q8_M2 - <identity ...>) ),
( q8_Y17*( <identity ...>), q8_R1*( -q8_M3 - q8_M2) + q8_R3*( q8_M1^
2 + q8_M3 + q8_M1 + <identity ...>) ),
( q8_Y31*( q8_M1*q8_M4), q8_R3*( q8_M3 - q8_M2) + q8_R4*( q8_M1 - <identity\
...>) ), ( q8_Y32*( -q8_M1*q8_M4), q8_R2*( -q8_M1^
2) + q8_R3*( -q8_M3 - <identity ...>) + q8_R4*( q8_M2 + <identity ...>) )
,
( q8_Y12*( q8_M1*q8_M4), q8_R1*( -q8_M2) + q8_R3*( q8_M1*q8_M2 + q8_M4) + q\
8_R4*( q8_M2 - <identity ...>) ),
( q8_Y16*( -<identity ...>), q8_R1*( -<identity ...>) + q8_R2*( -q8_M1) + q\
8_R4*( q8_M3 + q8_M1) ) ],
[ ( q8_Y3*( q8_M1*q8_M4), q8_R1*( q8_M1 - <identity ...>) ),
( q8_Y10*( -q8_M1*q8_M4), q8_R2*( q8_M2 - <identity ...>) ),
( q8_Y3*( -q8_M1*q8_M4*q8_M3) + q8_Y17*( <identity ...>), q8_R1*( -q8_M2 - \
<identity ...>) + q8_R3*( q8_M1^2 + q8_M3 + q8_M1 + <identity ...>) ),
( q8_Y31*( q8_M1*q8_M4), q8_R3*( q8_M3 - q8_M2) + q8_R4*( q8_M1 - <identity\
...>) ),
( q8_Y10*( -q8_M1*q8_M4*q8_M2 - q8_M1*q8_M4) + q8_Y32*( -q8_M1*q8_M4), q8_R\
2*( -<identity ...>) + q8_R3*( -q8_M3 - <identity ...>) + q8_R4*( q8_M2 + <identi\
ty ...>) ),
( q8_Y12*( q8_M1*q8_M4), q8_R1*( -q8_M2) + q8_R3*( q8_M1*q8_M2 + q8_M4) + q\
8_R4*( q8_M2 - <identity ...>) ),
( q8_Y16*( -<identity ...>), q8_R1*( -<identity ...>) + q8_R2*( -q8_M1) + q\
8_R4*( q8_M3 + q8_M1) ) ] ]
gap> RootIdentities( q8 );
[ ( q8_Y3*( q8_M1*q8_M4), q8_R1*( q8_M1 - <identity ...>) ),
( q8_Y3*( q8_M1*q8_M4), q8_R1*( q8_M1 - <identity ...>) ) ]
|
5.4-2 RootIdentities
> RootIdentities ( grp ) | ( attribute ) |
The root identities are identities of the form r^wr^-1 where r = w^n is a relator and n>1.
gap> RootIdentities( q8 );
[ ( q8_Y3*( q8_M1*q8_M4), q8_R1*( q8_M1 - <identity ...>) ),
( q8_Y3*( q8_M1*q8_M4), q8_R1*( q8_M1 - <identity ...>) ) ]
|