diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index 81ee93e..5bcf68b 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -54300,7 +54300,6 @@ IntegerNumberTheoryFunctions(): Exports == Implementation where
     l := (#B) :: I
     n < l => B(n)
     concat_!(B, new((n+1-l)::NNI, 0)$IndexedFlexibleArray(RN,0))
-    for i in 1 .. l by 2 repeat B(i) := 0
     -- compute B(i) i = l+2,l+4,...,n given B(j) j = 0,2,...,i-2
     for i in l+1 .. n by 2 repeat
       t:I := 1
@@ -69124,12 +69123,41 @@ zero?(blockConcat(%) - E)
 
 --S 44 of 44
 )show MatrixManipulation
+--R 
+--R MatrixManipulation(R: Field,Row: FiniteLinearAggregate(R),Col: FiniteLinearAggregate(R),M: MatrixCategory(R,Row,Col))  is a package constructor
+--R Abbreviation for MatrixManipulation is MAMA 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.4.pamphlet to see algebra source code for MAMA 
+--R
+--R------------------------------- Operations --------------------------------
+--R aColumn : (M,PositiveInteger) -> M    aRow : (M,PositiveInteger) -> M
+--R blockConcat : List(List(M)) -> M      diagonalMatrix : (M,Integer) -> M
+--R diagonalMatrix : M -> M               horizConcat : List(M) -> M
+--R vertConcat : List(M) -> M            
+--R bandMatrix : (M,List(Integer)) -> M
+--R bandMatrix : (M,Segment(Integer)) -> M
+--R blockSplit : (M,PositiveInteger,PositiveInteger) -> List(List(M))
+--R blockSplit : (M,List(PositiveInteger),PositiveInteger) -> List(List(M))
+--R blockSplit : (M,PositiveInteger,List(PositiveInteger)) -> List(List(M))
+--R blockSplit : (M,List(PositiveInteger),List(PositiveInteger)) -> List(List(M))
+--R columns : (M,List(PositiveInteger)) -> M
+--R columns : (M,Segment(PositiveInteger)) -> M
+--R element : (M,PositiveInteger,PositiveInteger) -> M
+--R horizSplit : (M,PositiveInteger) -> List(M)
+--R horizSplit : (M,List(PositiveInteger)) -> List(M)
+--R rows : (M,List(PositiveInteger)) -> M
+--R rows : (M,Segment(PositiveInteger)) -> M
+--R subMatrix : (M,List(PositiveInteger),List(PositiveInteger)) -> M
+--R subMatrix : (M,Segment(PositiveInteger),Segment(PositiveInteger)) -> M
+--R vertSplit : (M,PositiveInteger) -> List(M)
+--R vertSplit : (M,List(PositiveInteger)) -> List(M)
+--R
 --E 44
 
-
 )spool
 )lisp (bye)
 \end{chunk}
+
 \begin{chunk}{MatrixManipulation.help}
 ====================================================================
 MatrixManipulation examples
@@ -69424,8 +69452,1361 @@ zero?(blockConcat(%) - E)
 
 See Also:
 o )show MatrixManipulation
+o )help element
+o )d op element
+o )help aRow
+o )d op aRow
+o )help rows
+o )d op rows
+o )help aColumn
+o )d op aColumn
+o )help columns
+o )d op columns
+o )help subMatrix
+o )d op subMatrix
+o )help diagonalMatrix
+o )d op diagonalMatrix
+o )help bandMatrix
+o )d op bandMatrix
+o )help horizConcat
+o )d op horizConcat
+o )help vertConcat
+o )d op vertConcat
+o )help blockConcat
+o )d op blockConcat
+o )help vertSplit
+o )d op vertSplit
+o )help horizSplit
+o )d op horizSplit
+o )help blockSplit
+o )d op blockSplit
+
+\end{chunk}
+
+\begin{chunk}{element.help}
+====================================================================
+element from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  element 
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+  element : (M, PositiveInteger, PositiveInteger) -> M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+
+DESCRIPTION
+===========
+
+  element returns a single element out of a matrix.
+  The element is put into a one by one matrix.
+
+ARGUMENTS
+=========
+
+  The first argument is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+  The second element is a member of PositiveInteger
+
+  The third element is a member of PositiveInteger
+
+RETURN VALUE
+============
+
+  The result is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+
+  element(M,2,2)
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show PositiveInteger
+o )d op element
+
+\end{chunk}
+
+\begin{chunk}{aRow.help}
+====================================================================
+aRow from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  aRow
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+  aRow : (M, PositiveInteger) -> M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+DESCRIPTION
+===========
+
+  aRow returns a single row out of a matrix.
+  The row is put into a one by N matrix.
+
+ARGUMENTS
+=========
+
+  The first argument is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+  The second element is a member of PositiveInteger
+
+RETURN VALUE
+============
+
+  The result is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+
+  aRow(M, 1)
+
+  aRow(M, 2)
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show PositiveInteger
+o )d op aRow
+
+\end{chunk}
+
+\begin{chunk}{rows.help}
+====================================================================
+rows from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  rows
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+  rows : (M, List PositiveInteger) -> M
+  rows : (M, Segment PositiveInteger) -> M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+DESCRIPTION
+===========
+
+  rows returns several rows out of a matrix.
+  The rows are stacked into a matrix.
+
+ARGUMENTS
+=========
+
+  rows : (M, List PositiveInteger) -> M
+
+    The first argument is an element of M 
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second element is a List of PositiveInteger
+
+  rows : (M, Segment PositiveInteger) -> M
+
+    The first argument is an element of M 
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second element is a Segment of PositiveInteger
+
+RETURN VALUE
+============
+
+  The result is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+
+  rows(M, [1,2])
+
+  rows(M, [3,2])
+
+  rows(M, 2..3)
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show PositiveInteger
+o )show List
+o )show Segment
+o )d op rows
+
+\end{chunk}
+
+\begin{chunk}{aColumn.help}
+====================================================================
+aColumn from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  aColumn
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+  aColumn : (M, PositiveInteger) -> M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+
+DESCRIPTION
+===========
+
+  aColumn returns a single column out of a matrix.
+  The column is put into a one by N matrix.
+
+ARGUMENTS
+=========
+
+  The first argument is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+  The second element is a member of PositiveInteger
+
+RETURN VALUE
+============
+
+  The result is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+
+  aColumn(M, 2)
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show PositiveInteger
+o )d op aColumn
+
+\end{chunk}
+
+\begin{chunk}{columns.help}
+====================================================================
+columns from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  columns
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+  columns : (M, List PositiveInteger) -> M
+  columns : (M, Segment PositiveInteger) -> M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+
+DESCRIPTION
+===========
+
+  columns returns several columns out of a matrix.
+  The columns are stacked into a matrix.
+
+ARGUMENTS
+=========
+
+  columns : (M, List PositiveInteger) -> M
+
+    The first argument is an element of M 
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second element is a List of PositiveInteger
+
+  columns : (M, Segment PositiveInteger) -> M
+
+    The first argument is an element of M 
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second element is a Segment of PositiveInteger
+
+RETURN VALUE
+============
+
+  The result is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+
+  columns(M, [1,2])
+
+  columns(M, [3,2])
+
+  columns(M, 2..3)
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show PositiveInteger
+o )show List
+o )show Segment
+o )d op columns
+
+\end{chunk}
+
+\begin{chunk}{subMatrix.help}
+====================================================================
+subMatrix from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  subMatrix
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+  subMatrix : (M, List PositiveInteger, List PositiveInteger) -> M
+  subMatrix : (M, Segment PositiveInteger, Segment PositiveInteger) -> M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+DESCRIPTION
+===========
+
+  subMatrix returns several elements out of a matrix.
+  The elements are stacked into a submatrix.
+
+ARGUMENTS
+=========
+
+  subMatrix : (M, List PositiveInteger, List PositiveInteger) -> M
+
+    The first argument is an element of M 
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second element is a List of PositiveInteger
+
+    The third element is a List of PositiveInteger
+
+  subMatrix : (M, Segment PositiveInteger, Segment PositiveInteger) -> M
+
+    The first argument is an element of M 
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second element is a Segment of PositiveInteger
+
+    The third element is a Segment of PositiveInteger
+
+RETURN VALUE
+============
+
+  The result is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+  subMatrix(M, [1,2],[1,2])
+  subMatrix(M, [1,3],[1,3])
+
+  M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+  subMatrix(M, 1..2,2..3)
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show PositiveInteger
+o )show List
+o )show Segment
+o )d op subMatrix
+
+\end{chunk}
+
+\begin{chunk}{diagonalMatrix.help}
+====================================================================
+diagonalMatrix from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  diagonalMatrix
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+  diagonalMatrix : (M, Integer) -> M
+  diagonalMatrix : M -> M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+DESCRIPTION
+===========
+
+  diagonalMatrix : (M, Integer) -> M
+
+    diagonalMatrix returns a diagonal out of a matrix.
+    The diagonal is put into a matrix of same shape as the
+    original one. Positive integer arguments select upper
+    off-diagonals, negative ones lower off-diagonals.
+
+  diagonalMatrix : M -> M
+
+    diagonalMatrix returns the main diagonal out of
+    a matrix. The diagonal is put into a matrix of same shape
+    as the original one.
+
+ARGUMENTS
+=========
+
+  diagonalMatrix : (M, Integer) -> M
+
+    The first argument is an element of M 
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second element is an Integer
+
+  diagonalMatrix : M -> M
+
+    The first argument is an element of M 
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+RETURN VALUE
+============
+
+  The result is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+
+  diagonalMatrix(M, 1)
+
+  diagonalMatrix(M, 2)
+
+  diagonalMatrix(M, -1)
+
+  diagonalMatrix(M)
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show Integer
+o )d op diagonalMatrix
+
+\end{chunk}
+
+\begin{chunk}{bandMatrix.help}
+====================================================================
+bandMatrix from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  bandMatrix
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+  bandMatrix : (M, List Integer) -> M
+  bandMatrix : (M, Segment Integer) -> M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+DESCRIPTION
+===========
+
+  bandMatrix : (M, List Integer) -> M
+
+    bandMatrix returns multiple diagonals out of a matrix.
+    The diagonals are put into a matrix of same shape as the
+    original one. Positive integer arguments select upper
+    off-diagonals, negative ones lower off-diagonals.
+
+  bandMatrix : (M, Segment Integer) -> M
+
+    bandMatrix returns multiple diagonals out of a matrix.
+    The diagonals are put into a matrix of same shape as the
+    original one. Positive integer arguments select upper
+    off-diagonals, negative ones lower off-diagonals.
+
+
+ARGUMENTS
+=========
+
+  bandMatrix : (M, List Integer) -> M
+
+    The first argument is an element of M 
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second element is an List of Integer
+
+  bandMatrix : (M, Segment Integer) -> M
+
+    The first argument is an element of M 
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second element is a Segment of Integer
+
+RETURN VALUE
+============
+
+  The result is an element of M 
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+
+  bandMatrix(M, [-1,1])
+
+  bandMatrix(M, [-1,0,1])
+
+  bandMatrix(M, -1..1)
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show Integer
+o )show List
+o )show Segment
+o )d op bandMatrix
 
 \end{chunk}
+
+\begin{chunk}{horizConcat.help}
+====================================================================
+horizConcat from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  horizConcat
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+    horizConcat : (List M) -> M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+DESCRIPTION
+===========
+
+  horizConcat concatenates matrices column wise.
+
+ARGUMENTS
+=========
+
+    The first argument is a List of elements of M 
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+RETURN VALUE
+============
+
+  The result is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  A := matrix([[a]])
+  B := matrix([[b]])
+  C := matrix([[c]])
+  A12 := horizConcat([A,B,C])
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show List
+o )d op horizConcat
+
+\end{chunk}
+
+\begin{chunk}{vertConcat.help}
+====================================================================
+vertConcat from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  vertConcat
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+    vertConcat : (List M) -> M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+DESCRIPTION
+===========
+
+  vertConcat concatenates matrices row wise.
+
+ARGUMENTS
+=========
+
+  The first argument is a list of elements of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+RETURN VALUE
+============
+
+  The result is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  A := matrix([[a]])
+  B := matrix([[b]])
+  C := matrix([[c]])
+  A21 := vertConcat([A,B,C])
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show List
+o )d op vertConcat
+
+\end{chunk}
+
+\begin{chunk}{blockConcat.help}
+====================================================================
+blockConcat from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  blockConcat
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+  blockConcat : (List List M) -> M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+DESCRIPTION
+===========
+
+  blockConcat concatenates matrices row and
+  column wise, building a block matrix. The order
+  is row major as in matrix.
+
+ARGUMENTS
+=========
+
+  The first argument is a list of lists of elements of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+RETURN VALUE
+============
+
+  The result is an element of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  A := matrix([[a]])
+  B := matrix([[b]])
+  C := matrix([[c]])
+  A11 := element(M, 3,3)
+  A12 := horizConcat([A,B,C])
+  A21 := vertConcat([A,B,C])
+  M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+
+  E := blockConcat([[A11,A12],[A21,M]])
+
+  t1 := blockSplit(E, 4, [2,2])
+  t2 := blockConcat t1
+  zero?(E-t2)
+
+  t3 := blockSplit(E, [1,2,1], [2,2])
+  t4 := blockConcat t3
+  zero?(E-t4)
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show List
+o )d op blockConcat
+
+\end{chunk}
+
+\begin{chunk}{vertSplit.help}
+====================================================================
+vertSplit from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  vertSplit
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+  vertSplit : (M, PositiveInteger) -> List M
+  vertSplit : (M, List PositiveInteger) -> List M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+DESCRIPTION
+===========
+
+  vertSplit splits a matrix into multiple submatrices row wise.
+
+ARGUMENTS
+=========
+
+  vertSplit : (M, PositiveInteger) -> List M
+
+    The first argument is an element of M
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second argument is a PositiveInteger
+
+  vertSplit : (M, List PositiveInteger) -> List M
+
+    The first argument is an element of M
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second argument is a List of PositiveInteger
+
+RETURN VALUE
+============
+
+  The result is an List of elements of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  E := matrix([[i,a,b,c],[a,a,b,c],[b,d,e,f],[c,g,h,i]])
+
+  t1:= vertSplit(E, 2)
+
+  t2:= vertSplit(E, [1,2,1])
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show List
+o )show PositiveInteger
+o )d op vertSplit
+
+\end{chunk}
+
+\begin{chunk}{horizSplit.help}
+====================================================================
+horizSplit from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  horizSplit
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+  horizSplit : (M, PositiveInteger) -> List M
+  horizSplit : (M, List PositiveInteger) -> List M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+DESCRIPTION
+===========
+
+  horizSplit splits a matrix into multiple submatrices column wise.
+
+ARGUMENTS
+=========
+
+  horizSplit : (M, PositiveInteger) -> List M
+
+    The first argument is an element of M
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second argument is a PositiveInteger
+
+  horizSplit : (M, List PositiveInteger) -> List M
+
+    The first argument is an element of M
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second argument is a List of PositiveInteger
+
+RETURN VALUE
+============
+
+  The result is an List of elements of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  E := matrix([[i,a,b,c],[a,a,b,c],[b,d,e,f],[c,g,h,i]])
+
+  t1:= horizSplit(E, 2)
+
+  t2:= horizSplit(E, [2,2])
+
+  t3:= horizSplit(E, [1,2,1])
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show List
+o )show PositiveInteger
+o )d op horizSplit
+
+\end{chunk}
+
+\begin{chunk}{blockSplit.help}
+====================================================================
+blockSplit from MatrixManipulation (MAMA)
+====================================================================
+
+NAME
+====
+
+  blockSplit
+
+DOMAIN
+======
+
+  MatrixManipulation (MAMA)
+
+SYNOPSYS
+========
+
+  blockSplit : (M, PositiveInteger, PositiveInteger) -> List List M
+  blockSplit : (M, List PositiveInteger, PositiveInteger) -> List List M
+  blockSplit : (M, PositiveInteger, List PositiveInteger) -> List List M
+  blockSplit : (M, List PositiveInteger, List PositiveInteger) -> List List M
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+DESCRIPTION
+===========
+
+  blockSplit splits a matrix into multiple submatrices row and column
+  wise, dividing a matrix into blocks.
+
+ARGUMENTS
+=========
+
+  blockSplit : (M, PositiveInteger, PositiveInteger) -> List List M
+
+    The first argument is an element of M
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second argument is a PositiveInteger
+
+    The third argument is a PositiveInteger
+
+  blockSplit : (M, List PositiveInteger, PositiveInteger) -> List List M
+
+    The first argument is an element of M
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second argument is a List of PositiveInteger
+
+    The third argument is a PositiveInteger
+
+  blockSplit : (M, PositiveInteger, List PositiveInteger) -> List List M
+
+    The first argument is an element of M
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second argument is a PositiveInteger
+
+    The third argument is a List of PositiveInteger
+
+  blockSplit : (M, List PositiveInteger, List PositiveInteger) -> List List M
+
+    The first argument is an element of M
+
+      where
+         R : Field
+         Row : FiniteLinearAggregate R
+         Col : FiniteLinearAggregate R
+         M : MatrixCategory(R, Row, Col)
+
+    The second argument is a List of PositiveInteger
+
+    The third argument is a List of PositiveInteger
+
+
+RETURN VALUE
+============
+
+  The result is an List of Lists of elements of M 
+
+    where
+       R : Field
+       Row : FiniteLinearAggregate R
+       Col : FiniteLinearAggregate R
+       M : MatrixCategory(R, Row, Col)
+
+EXAMPLES
+========
+
+  E := matrix([[i,a,b,c],[a,a,b,c],[b,d,e,f],[c,g,h,i]])
+
+  t1:= blockSplit(E,2,2)
+
+  t2:= blockSplit(E, [2,1,1], 2)
+
+  t3:= blockSplit(E, 4, [2,2])
+
+  t4:= blockSplit(E, [1,2,1], [2,2])
+
+NOTES
+=====
+
+REFERENCES
+==========
+
+SEE ALSO
+========
+
+o )show MatrixManipulation
+o )show List
+o )show PositiveInteger
+o )d op blockSplit
+
+\end{chunk}
+
 \pagehead{MatrixManipulation}{MAMA}
 \pagepic{ps/v104matrixmanipulation.eps}{MAMA}{1.00}
 
@@ -69480,112 +70861,208 @@ MatrixManipulation(R, Row, Col, M) : Exports == Implementation where
     element : (M, PI, PI) -> M
       ++ \spad{element} returns a single element out of a matrix.
       ++ The element is put into a one by one matrix.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X element(M,2,2)
 
     aRow : (M, PI) -> M
       ++ \spad{aRow} returns a single row out of a matrix.
       ++ The row is put into a one by N matrix.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X aRow(M, 1)
+      ++X aRow(M, 2)
 
     rows : (M, LPI) -> M
       ++ \spad{rows} returns several rows out of a matrix.
       ++ The rows are stacked into a matrix.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X rows(M, [1,2])
+      ++X rows(M, [3,2])
 
     rows : (M, SPI) -> M
       ++ \spad{rows} returns several rows out of a matrix.
       ++ The rows are stacked into a matrix.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X rows(M, 2..3)
 
     aColumn : (M, PI) -> M
       ++ \spad{aColumn} returns a single column out of a matrix.
       ++ The column is put into a one by N matrix.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X aColumn(M, 2)
 
     columns : (M, LPI) -> M
       ++ \spad{columns} returns several columns out of a matrix.
       ++ The columns are stacked into a matrix.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X columns(M, [1,2])
+      ++X columns(M, [3,2])
 
     columns : (M, SPI) -> M
       ++ \spad{columns} returns several columns out of a matrix.
       ++ The columns are stacked into a matrix.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X columns(M, 1..2)
 
     subMatrix : (M, LPI, LPI) -> M
       ++ \spad{subMatrix} returns several elements out of a matrix.
       ++ The elements are stacked into a submatrix.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X subMatrix(M, [1,2],[1,2])
+      ++X subMatrix(M, [1,3],[1,3])
 
     subMatrix : (M, SPI, SPI) -> M
       ++ \spad{subMatrix} returns several elements out of a matrix.
       ++ The elements are stacked into a submatrix.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X subMatrix(M, 1..2,2..3)
 
     diagonalMatrix : (M, I) -> M
       ++ \spad{diagonalMatrix} returns a diagonal out of a matrix.
       ++ The diagonal is put into a matrix of same shape as the
       ++ original one. Positive integer arguments select upper
       ++ off-diagonals, negative ones lower off-diagonals.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X diagonalMatrix(M, 1)
+      ++X diagonalMatrix(M, 2)
+      ++X diagonalMatrix(M, -1)
 
     diagonalMatrix : M -> M
       ++ \spad{diagonalMatrix} returns the main diagonal out of
       ++ a matrix. The diagonal is put into a matrix of same shape
       ++ as the original one.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X diagonalMatrix(M)
 
     bandMatrix : (M, LI) -> M
       ++ \spad{bandMatrix} returns multiple diagonals out of a matrix.
       ++ The diagonals are put into a matrix of same shape as the
       ++ original one. Positive integer arguments select upper
       ++ off-diagonals, negative ones lower off-diagonals.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X bandMatrix(M, [-1,1])
+      ++X bandMatrix(M, [-1,0,1])
 
     bandMatrix : (M, SI) -> M
       ++ \spad{bandMatrix} returns multiple diagonals out of a matrix.
       ++ The diagonals are put into a matrix of same shape as the
       ++ original one. Positive integer arguments select upper
       ++ off-diagonals, negative ones lower off-diagonals.
+      ++
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X bandMatrix(M, -1..1)
 
     -- Stacking matrices
 
     horizConcat : (List M) -> M
       ++ \spad{horizConcat} concatenates matrices column wise.
+      ++
+      ++X A := matrix([[a]])
+      ++X B := matrix([[b]])
+      ++X C := matrix([[c]])
+      ++X A12 := horizConcat([A,B,C])
 
     vertConcat : (List M) -> M
       ++ \spad{vertConcat} concatenates matrices row wise.
+      ++
+      ++X A := matrix([[a]])
+      ++X B := matrix([[b]])
+      ++X C := matrix([[c]])
+      ++X A21 := vertConcat([A,B,C])
 
     blockConcat : (List List M) -> M
       ++ \spad{blockConcat} concatenates matrices row and
       ++ column wise, building a block matrix. The order
       ++ is row major as in \spad{matrix}.
+      ++
+      ++X A := matrix([[a]])
+      ++X B := matrix([[b]])
+      ++X C := matrix([[c]])
+      ++X A11 := element(M, 3,3)
+      ++X A12 := horizConcat([A,B,C])
+      ++X A21 := vertConcat([A,B,C])
+      ++X M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+      ++X E := blockConcat([[A11,A12],[A21,M]])
+      ++X t1 := blockSplit(E, 4, [2,2])
+      ++X t2 := blockConcat t1
+      ++X zero?(E-t2)
+      ++X t3 := blockSplit(E, [1,2,1], [2,2])
+      ++X t4 := blockConcat t3
+      ++X zero?(E-t4)
 
     -- Splitting matrices
 
     vertSplit : (M, PI) -> List M
       ++ \spad{vertSplit} splits a matrix into multiple
       ++ submatrices row wise.
+      ++
+      ++X E := matrix([[i,a,b,c],[a,a,b,c],[b,d,e,f],[c,g,h,i]])
+      ++X t1:= vertSplit(E, 2)
 
     vertSplit : (M, LPI) -> List M
       ++ \spad{vertSplit} splits a matrix into multiple
       ++ submatrices row wise.
+      ++
+      ++X E := matrix([[i,a,b,c],[a,a,b,c],[b,d,e,f],[c,g,h,i]])
+      ++X t1:= vertSplit(E, [1,2,1])
 
     horizSplit : (M, PI) -> List M
       ++ \spad{horizSplit} splits a matrix into multiple
       ++ submatrices column wise.
+      ++
+      ++X E := matrix([[i,a,b,c],[a,a,b,c],[b,d,e,f],[c,g,h,i]])
+      ++X t1:= horizSplit(E, 2)
 
     horizSplit : (M, LPI) -> List M
       ++ \spad{horizSplit} splits a matrix into multiple
       ++ submatrices column wise.
+      ++
+      ++X E := matrix([[i,a,b,c],[a,a,b,c],[b,d,e,f],[c,g,h,i]])
+      ++X t1:= horizSplit(E, [2,2])
+      ++X t2:= horizSplit(E, [1,2,1])
 
     blockSplit : (M, PI, PI) -> List List M
       ++ \spad{blockSplit} splits a matrix into multiple
       ++ submatrices row and column wise, dividing
       ++ a matrix into blocks.
+      ++
+      ++X E := matrix([[i,a,b,c],[a,a,b,c],[b,d,e,f],[c,g,h,i]])
+      ++X t1:= blockSplit(E,2,2)
 
     blockSplit : (M, LPI, PI) -> List List M
       ++ \spad{blockSplit} splits a matrix into multiple
       ++ submatrices row and column wise, dividing
       ++ a matrix into blocks.
+      ++
+      ++X E := matrix([[i,a,b,c],[a,a,b,c],[b,d,e,f],[c,g,h,i]])
+      ++X t1:= blockSplit(E, [2,1,1], 2)
 
     blockSplit : (M, PI, LPI) -> List List M
       ++ \spad{blockSplit} splits a matrix into multiple
       ++ submatrices row and column wise, dividing
       ++ a matrix into blocks.
+      ++
+      ++X E := matrix([[i,a,b,c],[a,a,b,c],[b,d,e,f],[c,g,h,i]])
+      ++X t1:= blockSplit(E, 4, [2,2])
 
     blockSplit : (M, LPI, LPI) -> List List M
       ++ \spad{blockSplit} splits a matrix into multiple
       ++ submatrices row and column wise, dividing
       ++ a matrix into blocks.
+      ++
+      ++X E := matrix([[i,a,b,c],[a,a,b,c],[b,d,e,f],[c,g,h,i]])
+      ++X t1:= blockSplit(E, [1,2,1], [2,2])
 
   Implementation ==> add
 
@@ -168137,7 +169614,8 @@ UnivariatePolynomialCommonDenominator(R, Q, UP): Exports == Impl where
       ++ clearDenominator(q) returns p such that \spad{q = p/d} where d is
       ++ a common denominator for the coefficients of q.
     splitDenominator : UP -> Record(num: UP, den: R)
-      ++ splitDenominator(q) returns \spad{[p, d]} such that \spad{q = p/d} and d
+      ++ splitDenominator(q) returns \spad{[p, d]} such that 
+      ++ \spad{q = p/d} and d
       ++ is a common denominator for the coefficients of q.
  
   Impl ==> add
diff --git a/changelog b/changelog
index 7f6f18b..0f3d9c2 100644
--- a/changelog
+++ b/changelog
@@ -1,4 +1,6 @@
-20141123 rhx src/axiom-website/patches.html 20141124.01.rhx.patch
+20141124 tpd src/axiom-website/patches.html 20141124.02.rhx.patch
+20141124 tpd books/bookvol10.4 help docs for MatrixManipulation
+20141124 rhx src/axiom-website/patches.html 20141124.01.rhx.patch
 20141124 rhx buglist bug 7265: interpreter does early retract to Taylor series
 20141123 tpd src/axiom-website/patches.html 20141123.04.tpd.patch
 20141123 tpd buglist bug 7264: 2.7@DoubleFloat failed to DoubleFloat
diff --git a/patch b/patch
index 5db73bd..c4f8880 100644
--- a/patch
+++ b/patch
@@ -1,15 +1,7 @@
-buglist bug 7265: interpreter does early retract to Taylor series
+books/bookvol10.4 help docs for MatrixManipulation
 
-Z ==> Integer
-Q ==> Fraction Z
-z:Symbol := 'z
-L ==> UnivariateLaurentSeries(Q,z,0)
-q:L := z::Variable(z)::L
-t1:L := (1/((1-q)*(1-q^2)))
-t2 := t1-1
-recip t2
-t3 := recip t2
-t4:Union(L,"failed") := recip t2  -- bug in interpreter
-t5:Union(L,"failed") := (recip t2)$L
-t6:Union(L,"failed") := t3
+add )help and )d op documentation for
 
+MatrixManipulation, element, aRow, rows, aColumn, columns, subMatrix,
+diagonalMatrix, bandMatrix, horizConcat, vertConcat, blockConcat,
+vertSplit, horizSplit, blockSplit
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 880a1cb..f637d7d 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -4728,6 +4728,8 @@ books/bookvol10.3 fix iOrder in ISUPS for finite args<br/>
 buglist bug 7264: 2.7@DoubleFloat failed to coerce to DoubleFloat<br/>
 <a href="patches/20141124.01.rhx.patch">20141124.01.rhx.patch</a>
 buglist bug 7265: interpreter does early retract to Taylor series
+<a href="patches/20141124.02.tpd.patch">20141124.02.tpd.patch</a>
+books/bookvol10.4 help docs for MatrixManipulation<br/>
  </body>
 </html>
 
