Next: Bibliography Up: Splitting algorithm for vector Previous: 7. Finiteness

# 8. APPENDIX: The Algorithm

For any strict subset J of , we have to apply the following sequence of procedures. Again, we assume for simplicity . If J allows no splitting, we can omit the test for its complement J'.

First prepare the input matrix Q according to (5.2):

INPUT: Q - a representation matrix of the module, k - an integer.
OUTPUT: L=A,B,C,D - a list of matrices presenting the blocks of a good
presentation matrix (B is a zero matrix).

Q := std_base(Q)
Q := min_base(Q,k)
L := find_blocks(Q,k)
return L

The next procedure computes generators of the module of J-row reductions of Q:

INPUT: L=A,B,C,D - a list of matrices.
OUTPUT: - a list of constant matrices corresponding to generators of .

ko_hom(A,cols(C)+cols(D))
kontra_hom(concat(C,D),rows(A))
syz(concat( ))
sub_matrix( cols cols )
i := 1
WHILE i<=cols() DO
matrix_of_column ,cols(A),cols(C))
modulo maxideal
IF
next i
END
return

Here ko_hom computes the matrix of the map defined by inserting the matrix in the first place of the Hom-functor and kontra_hom does the same with the second argument.

Next we will test J-row-minimality and possibly find a row-reduction of Q:

INPUT: L=A,B,C,D - a list of block matrices of Q,
- a list of constant matrices
OUTPUT: Q - a presentation matrix,
bool= FALSE if Q was J-row-minimal,
break= FALSE if there is no unique J-row-minimal.

bool := FALSE
break := TRUE
N* := unit_matrix(rows(
i := 1
WHILE i<=cols() DO
minor := minor_of_first_rows(N*,i)
minor := std_base(minor)
IF ( TRUE; EXIT}
next i
END
IF (is_not_linear(minor)) break:= FALSE
IF (break) z:= find_zero(minor)
N := N*(z)
A,B := A*N

return Q,bool,break

In the main loop a J-row-minimal presentation matrix is iterated or we obtain the answer, according to Proposition 13, that there is no J-row-splitting of the module.

INPUT: as above
OUTPUT: Q - a matrix being J-row-minimal if bool = TRUE
or Q does not have a unique J-row-minimal presenatation matrix otherwise.

bool := TRUE
break := TRUE
WHILE bool and break DO
L := prepare(Q,k)
:= list_of_reductions(L)
Q,bool,break := find_reduction( )
END
return Q,break

If break = TRUE, a final test, which uses Corollary 8, must be preformed to determine whether the presentation matrix allows a J-splitting. Otherwise we shall take the next subset J.

INPUT: as above
OUTPUT: Q0 - a block diagonal presentation matrix if bool = TRUE

L := prepare(Q,k)
:= kontra_hom(A,rows(D))
:= ko_hom(D,cols(A))
:= concat( )
:= matrix_to_vector(C)
bool := is_liftable( )

return Q0,bool

Remarks:

1.
It may happen that the procedure find_reduction will not give a result in a reasonable amount of time for J, but for the complement J'. Therefore, it is worth finding good strategies for the algorithm.
2.
The procedures and algorithms described here are implemented in the library module.lib of the Computer Algebra system SINGULAR [GPS97]. See the accompanying documentation for more details. module.lib will be included in a forthcoming new release of SINGULAR and, in the meantime, may be obtained directly from the authors.

Next: Bibliography Up: Splitting algorithm for vector Previous: 7. Finiteness
| ZCA Home | Reports |