| ### 2.3.5 Modules and their annihilator Now we shall give 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 provide 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 matrices).
    ring r =0,(x,y,z),dp;
    module MD = [x,0,x],[y,z,-y],[0,z,-2y];
    matrix MM = MD;
    print(MM);
    ==> x,y,0,
    ==> 0,z,z,
    ==> x,-y,-2y
However the submodule may also be considered as the module of relations of the factor module .In this way, SINGULAR can treat arbitrary finitely generated modules over the basering (see Representation of mathematical objects). In order to get the module of relations of , we use the command `syz`.
    syz(MD);
    ==> _[1]=x*gen(3)-x*gen(2)+y*gen(1)
We want to calculate, as an application, the annihilator of a given module. Let ,where U is our defining module of relations for the module .
    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 which is, by definition of M, the same as .Hence we have to calculate the quotient .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 retrieved 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.

User manual for Singular version 4-0-2, 2015, generated by texi2html.