# Singular

#### D.3.1.23 rowred

Procedure from library `matrix.lib` (see matrix_lib).

Usage:
rowred(A[,e]); A matrix, e any type

Return:
- a matrix B, being the row reduced form of A, if rowred is called with one argument.
(as far as this is possible over the polynomial ring; no division by polynomials)
- a list L of two matrices, such that L[1] = L[2] * A with L[1] the row-reduced form of A and L[2] the transformation matrix (if rowred is called with two arguments).

Assume:
The entries of A are in the base field. It is not verified whether this assumption holds.

Note:
* This procedure is designed for teaching purposes mainly.
* The straight forward Gaussian algorithm is implemented in the library (no standard basis computation).
The transformation matrix is obtained by concatenating a unit matrix to A. proc gauss_row should be faster.
* It should only be used with exact coefficient field (there is no pivoting) over the polynomial ring (ordering lp or dp).
* Parameters are allowed. Hence, if the entries of A are parameters the computation takes place over the field of rational functions.

Example:
 ```LIB "matrix.lib"; ring r=(0,a,b),(A,B,C),dp; matrix m[6][8]= 0, 0, b*B, -A,-4C,2A,0, 0, 2C,-4C,-A,B, 0, B, 3B,AB, 0,a*A, 0, 0, B, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2A, 0, 0, 0, 0, 0, 0, 2b, A, 0, 0, 0, 0, 0, 0, 0, 2a;""; ==> print(rowred(m));""; ==> 0, 0, 0, 0, 1,0, 0,0, ==> 0, 0, 0, 0, 0,0, 1,0, ==> 0, 0, 0, 0, 0,0, 0,1, ==> 0, 0, (b)*B,-A,0,2*A,0,0, ==> 2*C,-4*C, -A, B, 0,B, 0,0, ==> 0, (a)*A,0, 0, 0,0, 0,0 ==> list L=rowred(m,1); print(L[1]); ==> 0, 0, 0, 0, 1,0, 0,0, ==> 0, 0, 0, 0, 0,0, 1,0, ==> 0, 0, 0, 0, 0,0, 0,1, ==> 0, 0, (b)*B,-A,0,2*A,0,0, ==> 2*C,-4*C, -A, B, 0,B, 0,0, ==> 0, (a)*A,0, 0, 0,0, 0,0 print(L[2]); ==> 0,0,0,1/2, 0, -1/(2a)*A, ==> 0,0,0,0, 1/(2b), -1/(4ab)*A, ==> 0,0,0,0, 0, 1/(2a), ==> 1,0,0,2*C, 0, -2/(a)*AC, ==> 0,1,0,0, -3/(2b)*B,(-2b+3)/(4ab)*AB, ==> 0,0,1,-1/2*B,0, 1/(2a)*AB ```