3.5 Modules and their annihilator

Now we shall give now three more advanced examples.

SINGULAR is able to handle modules over all the rings, which can be defined as a basering. A free module of rank n is defined as follows:

ring rr;
int n = 4;
freemodule(4);
==> _[1]=gen(1)
==> _[2]=gen(2)
==> _[3]=gen(3)
==> _[4]=gen(4)
typeof(_);
==> module
print(freemodule(4));
==> 1,0,0,0,
==> 0,1,0,0,
==> 0,0,1,0,
==> 0,0,0,1

To define a module, we give a list of vectors generating a submodule of a free module. Then this set of vectors may be identified with the columns of a matrix. For that reason in SINGULAR matrices and modules may be interchanged. However, the representation is different (modules may be considered as sparse represented matrices).

ring r =0,(x,y,z),dp;
module MD = [x,0,x],[y,z,-y];
matrix MM = MD;
print(MM);
==> x,y,
==> 0,z,
==> x,-y

However the submodule MD may also be considered as the module of relations of the factor module r^3/MD. In this way, SINGULAR can treat arbitrary finitely generated modules over the basering.

In order to get the module of relations of MD, we use the command syz.

syz(MD);
==> _[1]=x*gen(2)+y*gen(1)

We want to calculate, as an application, the annihilator of a given module. Let M = r^3/U, where U is our defining module of relations for the module M.

module U = [z3,xy2,x3],[yz2,1,xy5z+z3],[y2z,0,x3],[xyz+x2,y2,0],[xyz,x2y,1];

Then, by definition, the annihilator of M is the ideal ann(M) = {a | aM = 0 } which is by the description of M the same as { a | ar^3 contained in U}. Hence we have to calculate the quotient { a | a in U:r^3}. The rank of the free module is determined by the choice of U and is the number of rows of the corresponding matrix. This may be determined by the function nrows. All we have to do now is the following:

quotient(U,freemodule(nrows(U)));

The result is too big to be shown here.