diff --git a/books/Makefile.pamphlet b/books/Makefile.pamphlet
index d5e906d..28b6176 100644
--- a/books/Makefile.pamphlet
+++ b/books/Makefile.pamphlet
@@ -11,8 +11,14 @@ as pdf files in the final output tree.
 \eject
 \tableofcontents
 \eject
+Note that we need to set the SHELL variable here because the
+default shell appears to be /bin/sh which does not follow the
+semantics of echo used by /bin/bash. Thus, while trying to 
+write the backslash-newpage lines the backslash-n gets interpreted
+as a newline.
 \section{The Makefile}
 <<*>>=
+SHELL=bash
 PDF=${AXIOM}/doc
 IN=${SPD}/books
 LATEX=latex
diff --git a/books/bookvol10.3.pamphlet b/books/bookvol10.3.pamphlet
index 919003f..3510eef 100644
--- a/books/bookvol10.3.pamphlet
+++ b/books/bookvol10.3.pamphlet
@@ -12999,6 +12999,83 @@ DifferentialSparseMultivariatePolynomial(R, S, V):
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain DPMM DirectProductMatrixModule}
+\pagehead{DirectProductMatrixModule}{DPMM}
+\pagepic{ps/v103directproductmatrixmodule.ps}{DPMM}{1.00}
+See also:\\
+\refto{OppositeMonogenicLinearOperator}{OMLO}
+\refto{OrdinaryDifferentialRing}{ODR}
+\refto{DirectProductModule}{DPMO}
+<<domain DPMM DirectProductMatrixModule>>=
+)abbrev domain DPMM DirectProductMatrixModule
+++ Author:  Stephen M. Watt
+++ Date Created: 1986
+++ Date Last Updated: June 4, 1991
+++ Basic Operations:
+++ Related Domains:
+++ Also See:
+++ AMS Classifications:
+++ Keywords: equation
+++ Examples:
+++ References:
+++ Description:
+++   This constructor provides a direct product type with a
+++   left matrix-module view.
+
+DirectProductMatrixModule(n, R, M, S): DPcategory == DPcapsule where
+    n: PositiveInteger
+    R: Ring
+    RowCol ==> DirectProduct(n,R)
+    M: SquareMatrixCategory(n,R,RowCol,RowCol)
+    S: LeftModule(R)
+
+    DPcategory == Join(DirectProductCategory(n,S), LeftModule(R), LeftModule(M))
+
+    DPcapsule == DirectProduct(n, S) add
+        Rep := Vector(S)
+        r:R * x:$ == [r*x.i for i in 1..n]
+        m:M * x:$ == [ +/[m(i,j)*x.j for j in 1..n] for i in 1..n]
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain DPMO DirectProductModule}
+\pagehead{DirectProductModule}{DPMO}
+\pagepic{ps/v103directproductmodule.ps}{DPMO}{1.00}
+See also:\\
+\refto{OppositeMonogenicLinearOperator}{OMLO}
+\refto{OrdinaryDifferentialRing}{ODR}
+\refto{DirectProductMatrixModule}{DPMM}
+<<domain DPMO DirectProductModule>>=
+)abbrev domain DPMO DirectProductModule
+++ Author:  Stephen M. Watt
+++ Date Created: 1986
+++ Date Last Updated: June 4, 1991
+++ Basic Operations:
+++ Related Domains:
+++ Also See:
+++ AMS Classifications:
+++ Keywords: equation
+++ Examples:
+++ References:
+++ Description:
+++   This constructor provides a direct product of R-modules
+++   with an R-module view.
+
+DirectProductModule(n, R, S): DPcategory == DPcapsule where
+    n: NonNegativeInteger
+    R: Ring
+    S: LeftModule(R)
+
+    DPcategory == Join(DirectProductCategory(n,S), LeftModule(R))
+    --  with if S has Algebra(R) then Algebra(R)
+    --  <above line leads to matchMmCond: unknown form of condition>
+
+    DPcapsule == DirectProduct(n,S) add
+        Rep := Vector(S)
+        r:R * x:$ == [r * x.i for i in 1..n]
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{domain DMP DistributedMultivariatePolynomial}
 <<DistributedMultivariatePolynomial.input>>=
 -- gdpoly.spad.pamphlet DistributedMultivariatePolynomial.input
@@ -31820,6 +31897,1600 @@ Library(): TableAggregate(String, Any) with
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain LSQM LieSquareMatrix}
+\pagehead{LieSquareMatrix}{LSQM}
+\pagepic{ps/v103liesquarematrix.ps}{LSQM}{1.00}
+See also:\\
+\refto{AssociatedLieAlgebra}{LIE}
+\refto{AssociatedJordanAlgebra}{JORDAN}
+<<domain LSQM LieSquareMatrix>>=
+)abbrev domain LSQM LieSquareMatrix
+++ Author: J. Grabmeier
+++ Date Created: 07 March 1991
+++ Date Last Updated: 08 March 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++   LieSquareMatrix(n,R) implements the Lie algebra of the n by n
+++   matrices over the commutative ring R.
+++   The Lie bracket (commutator) of the algebra is given by
+++   \spad{a*b := (a *$SQMATRIX(n,R) b - b *$SQMATRIX(n,R) a)},
+++   where \spadfun{*$SQMATRIX(n,R)} is the usual matrix multiplication.
+LieSquareMatrix(n,R): Exports == Implementation where
+
+  n    : PositiveInteger
+  R    : CommutativeRing
+
+  Row ==> DirectProduct(n,R)
+  Col ==> DirectProduct(n,R)
+
+  Exports ==> Join(SquareMatrixCategory(n,R,Row,Col), CoercibleTo Matrix R,_
+      FramedNonAssociativeAlgebra R) --with
+
+  Implementation ==> AssociatedLieAlgebra (R,SquareMatrix(n, R)) add
+
+    Rep :=  AssociatedLieAlgebra (R,SquareMatrix(n, R))
+      -- local functions
+    n2 : PositiveInteger := n*n
+
+    convDM : DirectProduct(n2,R) -> %
+    conv : DirectProduct(n2,R) ->  SquareMatrix(n,R)
+      --++ converts n2-vector to (n,n)-matrix row by row
+    conv v  ==
+      cond : Matrix(R) := new(n,n,0$R)$Matrix(R)
+      z : Integer := 0
+      for i in 1..n repeat
+        for j in 1..n  repeat
+          z := z+1
+          setelt(cond,i,j,v.z)
+      squareMatrix(cond)$SquareMatrix(n, R)
+
+
+    coordinates(a:%,b:Vector(%)):Vector(R) ==
+      -- only valid for b canonicalBasis
+      res : Vector R := new(n2,0$R)
+      z : Integer := 0
+      for i in 1..n repeat
+        for j in 1..n repeat
+          z := z+1
+          res.z := elt(a,i,j)$%
+      res
+
+
+    convDM v ==
+      sq := conv v
+      coerce(sq)$Rep :: %
+
+    basis() ==
+      n2 : PositiveInteger := n*n
+      ldp : List DirectProduct(n2,R) :=
+        [unitVector(i::PositiveInteger)$DirectProduct(n2,R) for i in 1..n2]
+      res:Vector % := vector map(convDM,_
+        ldp)$ListFunctions2(DirectProduct(n2,R), %)
+
+    someBasis() == basis()
+    rank() == n*n
+
+
+--    transpose: % -> %
+--      ++ computes the transpose of a matrix
+--    squareMatrix: Matrix R -> %
+--      ++ converts a Matrix to a LieSquareMatrix
+--    coerce: % -> Matrix R
+--      ++ converts a LieSquareMatrix to a Matrix
+--    symdecomp : % -> Record(sym:%,antisym:%)
+--    if R has commutative("*") then
+--      minorsVect: -> Vector(Union(R,"uncomputed")) --range: 1..2**n-1
+--    if R has commutative("*") then central
+--    if R has commutative("*") and R has unitsKnown then unitsKnown
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain LODO LinearOrdinaryDifferentialOperator}
+<<LinearOrdinaryDifferentialOperator.input>>=
+-- lodo.spad.pamphlet LinearOrdinaryDifferentialOperator.input
+)spool LinearOrdinaryDifferentialOperator.output
+)set message test on
+)set message auto off
+)clear all
+--S 1 of 16
+Dx: LODO(EXPR INT, f +-> D(f, x))
+--R 
+--R                                                                   Type: Void
+--E 1
+
+--S 2 of 16
+Dx := D()
+--R 
+--R
+--R   (2)  D
+--IType: LinearOrdinaryDifferentialOperator(Expression Integer,theMap LAMBDA-CLOSURE(NIL,NIL,NIL,G1404 envArg,SPADCALL(G1404,QUOTE x,ELT(*1;anonymousFunction;0;frame0;internal;MV,0))))
+--E 2
+
+--S 3 of 16
+Dop:= Dx^3 + G/x^2*Dx + H/x^3 - 1
+--R 
+--R
+--R                       3
+--R         3    G     - x  + H
+--R   (3)  D  + -- D + --------
+--R              2         3
+--R             x         x
+--IType: LinearOrdinaryDifferentialOperator(Expression Integer,theMap LAMBDA-CLOSURE(NIL,NIL,NIL,G1404 envArg,SPADCALL(G1404,QUOTE x,ELT(*1;anonymousFunction;0;frame0;internal;MV,0))))
+--E 3
+
+--S 4 of 16
+n == 3
+--R 
+--R                                                                   Type: Void
+--E 4
+
+--S 5 of 16
+phi == reduce(+,[subscript(s,[i])*exp(x)/x^i for i in 0..n])
+--R 
+--R                                                                   Type: Void
+--E 5
+
+--S 6 of 16
+phi1 ==  Dop(phi) / exp x
+--R 
+--R                                                                   Type: Void
+--E 6
+
+--S 7 of 16
+phi2 == phi1 *x**(n+3)
+--R 
+--R                                                                   Type: Void
+--E 7
+
+--S 8 of 16
+phi3 == retract(phi2)@(POLY INT)
+--R 
+--R                                                                   Type: Void
+--E 8
+
+--S 9 of 16
+pans == phi3 ::UP(x,POLY INT)
+--R 
+--R                                                                   Type: Void
+--E 9
+
+--S 10 of 16
+pans1 == [coefficient(pans, (n+3-i) :: NNI) for i in 2..n+1]
+--R 
+--R                                                                   Type: Void
+--E 10
+
+--S 11 of 16
+leq == solve(pans1,[subscript(s,[i]) for i in 1..n])
+--R 
+--R                                                                   Type: Void
+--E 11
+
+--S 12 of 16
+leq
+--R 
+--R   Compiling body of rule n to compute value of type PositiveInteger 
+--R   Compiling body of rule phi to compute value of type Expression 
+--R      Integer 
+--R   Compiling body of rule phi1 to compute value of type Expression 
+--R      Integer 
+--R   Compiling body of rule phi2 to compute value of type Expression 
+--R      Integer 
+--R   Compiling body of rule phi3 to compute value of type Polynomial 
+--R      Integer 
+--R   Compiling body of rule pans to compute value of type 
+--R      UnivariatePolynomial(x,Polynomial Integer) 
+--R   Compiling body of rule pans1 to compute value of type List 
+--R      Polynomial Integer 
+--R   Compiling body of rule leq to compute value of type List List 
+--R      Equation Fraction Polynomial Integer 
+--I   Compiling function G3349 with type Integer -> Boolean 
+--R
+--R   (12)
+--R                           2                                3        2
+--R         s G     3s H + s G  + 6s G     (9s G + 54s )H + s G  + 18s G  + 72s G
+--R          0        0     0       0         0       0      0        0        0
+--R   [[s = ---,s = ------------------,s = --------------------------------------]]
+--R      1   3   2          18          3                    162
+--R                         Type: List List Equation Fraction Polynomial Integer
+--E 12
+
+--S 13 of 16
+n==4
+--R 
+--R   Compiled code for n has been cleared.
+--R   Compiled code for leq has been cleared.
+--R   Compiled code for pans1 has been cleared.
+--R   Compiled code for phi2 has been cleared.
+--R   Compiled code for phi has been cleared.
+--R   Compiled code for phi3 has been cleared.
+--R   Compiled code for phi1 has been cleared.
+--R   Compiled code for pans has been cleared.
+--R   1 old definition(s) deleted for function or rule n 
+--R                                                                   Type: Void
+--E 13
+
+--S 14 of 16
+leq
+--R 
+--R   Compiling body of rule n to compute value of type PositiveInteger 
+--R   Compiling body of rule phi to compute value of type Expression 
+--R      Integer 
+--R   Compiling body of rule phi1 to compute value of type Expression 
+--R      Integer 
+--R   Compiling body of rule phi2 to compute value of type Expression 
+--R      Integer 
+--R   Compiling body of rule phi3 to compute value of type Polynomial 
+--R      Integer 
+--R   Compiling body of rule pans to compute value of type 
+--R      UnivariatePolynomial(x,Polynomial Integer) 
+--R   Compiling body of rule pans1 to compute value of type List 
+--R      Polynomial Integer 
+--R   Compiling body of rule leq to compute value of type List List 
+--R      Equation Fraction Polynomial Integer 
+--R
+--R   (14)
+--R   [
+--R                             2
+--R          s G      3s H + s G  + 6s G
+--R           0         0     0       0
+--R     [s = ---, s = ------------------,
+--R       1   3    2          18
+--R                              3        2
+--R          (9s G + 54s )H + s G  + 18s G  + 72s G
+--R             0       0      0        0        0
+--R      s = --------------------------------------,
+--R       3                    162
+--R
+--R       s  =
+--R        4
+--R                  2         2                          4        3         2
+--R             27s H  + (18s G  + 378s G + 1296s )H + s G  + 36s G  + 396s G
+--R                0         0         0         0      0        0         0
+--R           + 
+--R             1296s G
+--R                  0
+--R        /
+--R           1944
+--R       ]
+--R     ]
+--R                         Type: List List Equation Fraction Polynomial Integer
+--E 14
+
+--S 15 of 16
+n==7
+--R 
+--R   Compiled code for n has been cleared.
+--R   Compiled code for leq has been cleared.
+--R   Compiled code for pans1 has been cleared.
+--R   Compiled code for phi2 has been cleared.
+--R   Compiled code for phi has been cleared.
+--R   Compiled code for phi3 has been cleared.
+--R   Compiled code for phi1 has been cleared.
+--R   Compiled code for pans has been cleared.
+--R   1 old definition(s) deleted for function or rule n 
+--R                                                                   Type: Void
+--E 15
+
+--S 16 of 16
+leq
+--R 
+--R   Compiling body of rule n to compute value of type PositiveInteger 
+--R   Compiling body of rule phi to compute value of type Expression 
+--R      Integer 
+--R   Compiling body of rule phi1 to compute value of type Expression 
+--R      Integer 
+--R   Compiling body of rule phi2 to compute value of type Expression 
+--R      Integer 
+--R   Compiling body of rule phi3 to compute value of type Polynomial 
+--R      Integer 
+--R   Compiling body of rule pans to compute value of type 
+--R      UnivariatePolynomial(x,Polynomial Integer) 
+--R   Compiling body of rule pans1 to compute value of type List 
+--R      Polynomial Integer 
+--R   Compiling body of rule leq to compute value of type List List 
+--R      Equation Fraction Polynomial Integer 
+--R
+--R   (16)
+--R   [
+--R                             2
+--R          s G      3s H + s G  + 6s G
+--R           0         0     0       0
+--R     [s = ---, s = ------------------,
+--R       1   3    2          18
+--R                              3        2
+--R          (9s G + 54s )H + s G  + 18s G  + 72s G
+--R             0       0      0        0        0
+--R      s = --------------------------------------,
+--R       3                    162
+--R
+--R       s  =
+--R        4
+--R                  2         2                          4        3         2
+--R             27s H  + (18s G  + 378s G + 1296s )H + s G  + 36s G  + 396s G
+--R                0         0         0         0      0        0         0
+--R           + 
+--R             1296s G
+--R                  0
+--R        /
+--R           1944
+--R       ,
+--R
+--R       s  =
+--R        5
+--R                               2         3          2
+--R             (135s G + 2268s )H  + (30s G  + 1350s G  + 16416s G + 38880s )H
+--R                  0         0          0          0           0          0
+--R           + 
+--R                5        4          3          2
+--R             s G  + 60s G  + 1188s G  + 9504s G  + 25920s G
+--R              0        0          0          0           0
+--R        /
+--R           29160
+--R       ,
+--R
+--R       s  =
+--R        6
+--R                   3          2                        2
+--R             405s H  + (405s G  + 18468s G + 174960s )H
+--R                 0          0           0           0
+--R           + 
+--R                   4          3           2                                6
+--R             (45s G  + 3510s G  + 88776s G  + 777600s G + 1166400s )H + s G
+--R                 0          0           0            0            0      0
+--R           + 
+--R                  5          4           3           2
+--R             90s G  + 2628s G  + 27864s G  + 90720s G
+--R                0          0           0           0
+--R        /
+--R           524880
+--R       ,
+--R
+--R       s  =
+--R        7
+--R                                 3
+--R             (2835s G + 91854s )H
+--R                   0          0
+--R           + 
+--R                    3           2                            2
+--R             (945s G  + 81648s G  + 2082996s G + 14171760s )H
+--R                  0           0             0             0
+--R           + 
+--R                   5          4            3             2
+--R             (63s G  + 7560s G  + 317520s G  + 5554008s G  + 34058880s G)H
+--R                 0          0            0             0              0
+--R           + 
+--R                7         6          5           4             3              2
+--R             s G  + 126s G  + 4788s G  + 25272s G  - 1744416s G  - 26827200s G
+--R              0         0          0           0             0              0
+--R           + 
+--R             - 97977600s G
+--R                        0
+--R        /
+--R           11022480
+--R       ]
+--R     ]
+--R                         Type: List List Equation Fraction Polynomial Integer
+--E 16
+)spool
+ 
+Dx: LODO(EXPR INT, f +-> D(f, x))
+Dx := D()
+Dop:= Dx^3 + G/x^2*Dx + H/x^3 - 1
+n == 3
+phi == reduce(+,[subscript(s,[i])*exp(x)/x^i for i in 0..n])
+phi1 ==  Dop(phi) / exp x
+phi2 == phi1 *x**(n+3)
+phi3 == retract(phi2)@(POLY INT)
+pans == phi3 ::UP(x,POLY INT)
+pans1 == [coefficient(pans, (n+3-i) :: NNI) for i in 2..n+1]
+leq == solve(pans1,[subscript(s,[i]) for i in 1..n])
+leq
+n==4
+leq
+n==7
+leq
+)spool
+)lisp (bye)
+@
+<<LinearOrdinaryDifferentialOperator.help>>=
+====================================================================
+LinearOrdinaryDifferentialOperator examples
+====================================================================
+
+LinearOrdinaryDifferentialOperator(A, diff) is the domain of linear
+ordinary differential operators with coefficients in a ring A with a
+given derivation.
+
+====================================================================
+Differential Operators with Series Coefficients
+====================================================================
+
+Problem:
+  Find the first few coefficients of exp(x)/x^i of Dop phi where
+
+    Dop := D^3 + G/x^2 * D + H/x^3 - 1
+    phi := sum(s[i]*exp(x)/x^i, i = 0..)
+
+Solution:
+
+Define the differential.
+
+  Dx: LODO(EXPR INT, f +-> D(f, x))
+                         Type: Void
+
+  Dx := D()
+   D
+     Type: LinearOrdinaryDifferentialOperator(Expression Integer,
+      theMap LAMBDA-CLOSURE(NIL,NIL,NIL,G1404 envArg,
+              SPADCALL(G1404,QUOTE x,
+               ELT(*1;anonymousFunction;0;frame0;internal;MV,0))))
+
+Now define the differential operator Dop.
+
+  Dop:= Dx^3 + G/x^2*Dx + H/x^3 - 1
+                       3
+     3    G     - x  + H
+    D  + -- D + --------
+          2         3
+         x         x
+     Type: LinearOrdinaryDifferentialOperator(Expression Integer,
+      theMap LAMBDA-CLOSURE(NIL,NIL,NIL,G1404 envArg,
+              SPADCALL(G1404,QUOTE x,
+               ELT(*1;anonymousFunction;0;frame0;internal;MV,0))))
+
+  n == 3
+                          Type: Void
+
+  phi == reduce(+,[subscript(s,[i])*exp(x)/x^i for i in 0..n])
+                          Type: Void
+
+  phi1 ==  Dop(phi) / exp x
+                          Type: Void
+
+  phi2 == phi1 *x**(n+3)
+                          Type: Void
+
+  phi3 == retract(phi2)@(POLY INT)
+                          Type: Void
+
+  pans == phi3 ::UP(x,POLY INT)
+                          Type: Void
+
+  pans1 == [coefficient(pans, (n+3-i) :: NNI) for i in 2..n+1]
+                          Type: Void
+
+  leq == solve(pans1,[subscript(s,[i]) for i in 1..n])
+                          Type: Void
+
+Evaluate this for several values of n.
+
+  leq
+                          2                                3        2
+        s G     3s H + s G  + 6s G     (9s G + 54s )H + s G  + 18s G  + 72s G
+         0        0     0       0         0       0      0        0        0
+  [[s = ---,s = ------------------,s = --------------------------------------]]
+     1   3   2          18          3                    162
+                         Type: List List Equation Fraction Polynomial Integer
+
+  n==4
+                          Type: Void
+
+  leq
+   [
+                             2
+          s G      3s H + s G  + 6s G
+           0         0     0       0
+     [s = ---, s = ------------------,
+       1   3    2          18
+                              3        2
+          (9s G + 54s )H + s G  + 18s G  + 72s G
+             0       0      0        0        0
+      s = --------------------------------------,
+       3                    162
+
+       s  =
+        4
+                  2         2                          4        3         2
+             27s H  + (18s G  + 378s G + 1296s )H + s G  + 36s G  + 396s G
+                0         0         0         0      0        0         0
+           + 
+             1296s G
+                  0
+        /
+           1944
+       ]
+     ]
+                         Type: List List Equation Fraction Polynomial Integer
+
+  n==7
+                          Type: Void
+
+  leq
+   [
+                             2
+          s G      3s H + s G  + 6s G
+           0         0     0       0
+     [s = ---, s = ------------------,
+       1   3    2          18
+                              3        2
+          (9s G + 54s )H + s G  + 18s G  + 72s G
+             0       0      0        0        0
+      s = --------------------------------------,
+       3                    162
+
+       s  =
+        4
+                  2         2                          4        3         2
+             27s H  + (18s G  + 378s G + 1296s )H + s G  + 36s G  + 396s G
+                0         0         0         0      0        0         0
+           + 
+             1296s G
+                  0
+        /
+           1944
+       ,
+
+       s  =
+        5
+                               2         3          2
+             (135s G + 2268s )H  + (30s G  + 1350s G  + 16416s G + 38880s )H
+                  0         0          0          0           0          0
+           + 
+                5        4          3          2
+             s G  + 60s G  + 1188s G  + 9504s G  + 25920s G
+              0        0          0          0           0
+        /
+           29160
+       ,
+
+       s  =
+        6
+                   3          2                        2
+             405s H  + (405s G  + 18468s G + 174960s )H
+                 0          0           0           0
+           + 
+                   4          3           2                                6
+             (45s G  + 3510s G  + 88776s G  + 777600s G + 1166400s )H + s G
+                 0          0           0            0            0      0
+           + 
+                  5          4           3           2
+             90s G  + 2628s G  + 27864s G  + 90720s G
+                0          0           0           0
+        /
+           524880
+       ,
+
+       s  =
+        7
+                                 3
+             (2835s G + 91854s )H
+                   0          0
+           + 
+                    3           2                            2
+             (945s G  + 81648s G  + 2082996s G + 14171760s )H
+                  0           0             0             0
+           + 
+                   5          4            3             2
+             (63s G  + 7560s G  + 317520s G  + 5554008s G  + 34058880s G)H
+                 0          0            0             0              0
+           + 
+                7         6          5           4             3              2
+             s G  + 126s G  + 4788s G  + 25272s G  - 1744416s G  - 26827200s G
+              0         0          0           0             0              0
+           + 
+             - 97977600s G
+                        0
+        /
+           11022480
+       ]
+     ]
+                         Type: List List Equation Fraction Polynomial Integer
+
+See Also:
+o )show LinearOrdinaryDifferentialOperator
+o $AXIOM/doc/src/algebra/lodo.spad.dvi
+
+@
+\pagehead{LinearOrdinaryDifferentialOperator}{LODO}
+\pagepic{ps/v103linearordinarydifferentialoperator.ps}{LODO}{1.00}
+<<domain LODO LinearOrdinaryDifferentialOperator>>=
+)abbrev domain LODO LinearOrdinaryDifferentialOperator
+++ Author: Manuel Bronstein
+++ Date Created: 9 December 1993
+++ Date Last Updated: 15 April 1994
+++ Keywords: differential operator
+++ Description:
+++   \spad{LinearOrdinaryDifferentialOperator} defines a ring of
+++   differential operators with coefficients in a ring A with a given
+++   derivation.
+++   Multiplication of operators corresponds to functional composition:
+++       \spad{(L1 * L2).(f) = L1 L2 f}
+LinearOrdinaryDifferentialOperator(A:Ring, diff: A -> A):
+    LinearOrdinaryDifferentialOperatorCategory A
+      == SparseUnivariateSkewPolynomial(A, 1, diff) add
+        Rep := SparseUnivariateSkewPolynomial(A, 1, diff)
+
+        outputD := "D"@String :: Symbol :: OutputForm
+
+        coerce(l:%):OutputForm == outputForm(l, outputD)
+        elt(p:%, a:A):A        == apply(p, 0, a)
+
+        if A has Field then
+            import LinearOrdinaryDifferentialOperatorsOps(A, %)
+
+            symmetricProduct(a, b) == symmetricProduct(a, b, diff)
+            symmetricPower(a, n)   == symmetricPower(a, n, diff)
+            directSum(a, b)        == directSum(a, b, diff)
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain LODO1 LinearOrdinaryDifferentialOperator1}
+<<LinearOrdinaryDifferentialOperator1.input>>=
+-- lodo.spad.pamphlet LinearOrdinaryDifferentialOperator1.input
+)spool LinearOrdinaryDifferentialOperator1.output
+)set message test on
+)set message auto off
+)clear all
+--S 1 of 20
+RFZ := Fraction UnivariatePolynomial('x, Integer)
+--R 
+--R
+--R   (1)  Fraction UnivariatePolynomial(x,Integer)
+--R                                                                 Type: Domain
+--E 1
+
+--S 2 of 20
+x : RFZ := 'x
+--R 
+--R
+--R   (2)  x
+--R                               Type: Fraction UnivariatePolynomial(x,Integer)
+--E 2
+
+--S 3 of 20
+Dx : LODO1 RFZ := D()
+--R 
+--R
+--R   (3)  D
+--RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 3
+
+--S 4 of 20
+b : LODO1 RFZ := 3*x**2*Dx**2 + 2*Dx + 1/x
+--R 
+--R
+--R          2 2        1
+--R   (4)  3x D  + 2D + -
+--R                     x
+--RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 4
+
+--S 5 of 20
+a : LODO1 RFZ := b*(5*x*Dx + 7)
+--R 
+--R
+--R           3 3       2        2         7
+--R   (5)  15x D  + (51x  + 10x)D  + 29D + -
+--R                                        x
+--RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 5
+
+--S 6 of 20
+p := x**2 + 1/x**2
+--R 
+--R
+--R         4
+--R        x  + 1
+--R   (6)  ------
+--R           2
+--R          x
+--R                               Type: Fraction UnivariatePolynomial(x,Integer)
+--E 6
+
+--S 7 of 20
+(a*b - b*a) p
+--R 
+--R
+--R             4
+--R        - 75x  + 540x - 75
+--R   (7)  ------------------
+--R                 4
+--R                x
+--R                               Type: Fraction UnivariatePolynomial(x,Integer)
+--E 7
+
+--S 8 of 20
+ld := leftDivide(a,b)
+--R 
+--R
+--R   (8)  [quotient= 5x D + 7,remainder= 0]
+--RType: Record(quotient: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer),remainder: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer))
+--E 8
+
+--S 9 of 20
+a = b * ld.quotient + ld.remainder
+--R 
+--R
+--R           3 3       2        2         7     3 3       2        2         7
+--R   (9)  15x D  + (51x  + 10x)D  + 29D + -= 15x D  + (51x  + 10x)D  + 29D + -
+--R                                        x                                  x
+--RType: Equation LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 9
+
+--S 10 of 20
+rd := rightDivide(a,b)
+--R 
+--R
+--R                                              5
+--R   (10)  [quotient= 5x D + 7,remainder= 10D + -]
+--R                                              x
+--RType: Record(quotient: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer),remainder: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer))
+--E 10
+
+--S 11 of 20
+a = rd.quotient * b + rd.remainder
+--R 
+--R
+--R            3 3       2        2         7     3 3       2        2         7
+--R   (11)  15x D  + (51x  + 10x)D  + 29D + -= 15x D  + (51x  + 10x)D  + 29D + -
+--R                                         x                                  x
+--RType: Equation LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 11
+
+--S 12 of 20
+rightQuotient(a,b)
+--R 
+--R
+--R   (12)  5x D + 7
+--RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 12
+
+--S 13 of 20
+rightRemainder(a,b)
+--R 
+--R
+--R               5
+--R   (13)  10D + -
+--R               x
+--RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 13
+
+--S 14 of 20
+leftExactQuotient(a,b)
+--R 
+--R
+--R   (14)  5x D + 7
+--RType: Union(LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer),...)
+--E 14
+
+--S 15 of 20
+e := leftGcd(a,b)
+--R 
+--R
+--R           2 2        1
+--R   (15)  3x D  + 2D + -
+--R                      x
+--RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 15
+
+--S 16 of 20
+leftRemainder(a, e)
+--R 
+--R
+--R   (16)  0
+--RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 16
+
+--S 17 of 20
+rightRemainder(a, e)
+--R 
+--R
+--R               5
+--R   (17)  10D + -
+--R               x
+--RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 17
+
+--S 18 of 20
+f := rightLcm(a,b)
+--R 
+--R
+--R            3 3       2        2         7
+--R   (18)  15x D  + (51x  + 10x)D  + 29D + -
+--R                                         x
+--RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 18
+
+--S 19 of 20
+rightRemainder(f, b)
+--R 
+--R
+--R               5
+--R   (19)  10D + -
+--R               x
+--RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 19
+
+--S 20 of 20
+leftRemainder(f, b)
+--R 
+--R
+--R   (20)  0
+--RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
+--E 20
+)spool
+)lisp (bye)
+@
+
+<<LinearOrdinaryDifferentialOperator1.help>>=
+====================================================================
+LinearOrdinaryDifferentialOperator1 example
+====================================================================
+
+LinearOrdinaryDifferentialOperator1(A) is the domain of linear
+ordinary differential operators with coefficients in the differential
+ring A.
+
+====================================================================
+Differential Operators with Rational Function Coefficients
+====================================================================
+
+This example shows differential operators with rational function
+coefficients.  In this case operator multiplication is non-commutative and,
+since the coefficients form a field, an operator division algorithm exists.
+
+We begin by defining RFZ to be the rational functions in x with
+integer coefficients and Dx to be the differential operator for d/dx.
+
+  RFZ := Fraction UnivariatePolynomial('x, Integer)
+    Fraction UnivariatePolynomial(x,Integer)
+                         Type: Domain
+
+  x : RFZ := 'x
+    x
+                         Type: Fraction UnivariatePolynomial(x,Integer)
+
+  Dx : LODO1 RFZ := D()
+    D
+                         Type: LinearOrdinaryDifferentialOperator1 
+                                 Fraction UnivariatePolynomial(x,Integer)
+
+Operators are created using the usual arithmetic operations.
+
+  b : LODO1 RFZ := 3*x**2*Dx**2 + 2*Dx + 1/x
+      2 2        1
+    3x D  + 2D + -
+                 x
+                         Type: LinearOrdinaryDifferentialOperator1 
+                                Fraction UnivariatePolynomial(x,Integer)
+
+  a : LODO1 RFZ := b*(5*x*Dx + 7)
+       3 3       2        2         7
+    15x D  + (51x  + 10x)D  + 29D + -
+                                    x
+                        Type: LinearOrdinaryDifferentialOperator1 
+                                Fraction UnivariatePolynomial(x,Integer)
+
+Operator multiplication corresponds to functional composition.
+
+  p := x**2 + 1/x**2
+     4
+    x  + 1
+    ------
+       2
+      x
+                        Type: Fraction UnivariatePolynomial(x,Integer)
+
+Since operator coefficients depend on x, the multiplication is not
+commutative.
+
+  (a*b - b*a) p
+         4
+    - 75x  + 540x - 75
+    ------------------
+             4
+            x
+                        Type: Fraction UnivariatePolynomial(x,Integer)
+
+When the coefficients of operator polynomials come from a field, as in
+this case, it is possible to define operator division.  Division on
+the left and division on the right yield different results when the
+multiplication is non-commutative.
+
+The results of leftDivide and rightDivide are quotient-remainder pairs
+satisfying:
+
+  leftDivide(a,b) = [q, r] such that  a = b*q + r
+  rightDivide(a,b) = [q, r] such that a = q*b + r
+
+In both cases, the degree of the remainder, r, is less than the degree
+of b.
+
+  ld := leftDivide(a,b)
+    [quotient= 5x D + 7,remainder= 0]
+      Type: Record(quotient: LinearOrdinaryDifferentialOperator1 
+                               Fraction UnivariatePolynomial(x,Integer),
+                   remainder: LinearOrdinaryDifferentialOperator1 
+                               Fraction UnivariatePolynomial(x,Integer))
+
+  a = b * ld.quotient + ld.remainder
+       3 3       2        2         7     3 3       2        2         7
+    15x D  + (51x  + 10x)D  + 29D + -= 15x D  + (51x  + 10x)D  + 29D + -
+      Type: Equation LinearOrdinaryDifferentialOperator1 
+                       Fraction UnivariatePolynomial(x,Integer)
+
+The operations of left and right division are so-called because the
+quotient is obtained by dividing a on that side by b.
+
+  rd := rightDivide(a,b)
+    [quotient= 5x D + 7,remainder= 10D + -]
+      Type: Record(quotient: LinearOrdinaryDifferentialOperator1 
+                               Fraction UnivariatePolynomial(x,Integer),
+                   remainder: LinearOrdinaryDifferentialOperator1 
+                               Fraction UnivariatePolynomial(x,Integer))
+
+  a = rd.quotient * b + rd.remainder
+       3 3       2        2         7     3 3       2        2         7
+    15x D  + (51x  + 10x)D  + 29D + -= 15x D  + (51x  + 10x)D  + 29D + -
+     Type: Equation LinearOrdinaryDifferentialOperator1 
+                      Fraction UnivariatePolynomial(x,Integer)
+
+Operations rightQuotient and rightRemainder are available if only one
+of the quotient or remainder are of interest to you.  This is the
+quotient from right division.
+
+  rightQuotient(a,b)
+    5x D + 7
+     Type: LinearOrdinaryDifferentialOperator1 
+             Fraction UnivariatePolynomial(x,Integer)
+
+This is the remainder from right division.  The corresponding "left"
+functions, leftQuotient and leftRemainder are also available.
+
+  rightRemainder(a,b)
+          5
+    10D + -
+          x
+      Type: LinearOrdinaryDifferentialOperator1 
+              Fraction UnivariatePolynomial(x,Integer)
+
+For exact division, operations leftExactQuotient and rightExactQuotient 
+are supplied.  These return the quotient but only if the remainder is zero.  
+The call rightExactQuotient(a,b) would yield an error.
+
+  leftExactQuotient(a,b)
+    5x D + 7
+     Type: Union(LinearOrdinaryDifferentialOperator1 
+                   Fraction UnivariatePolynomial(x,Integer),...)
+
+The division operations allow the computation of left and right greatest
+common divisors, leftGcd and rightGcd via remainder sequences, and 
+consequently the computation of left and right least common multiples,
+rightLcm and leftLcm.
+
+  e := leftGcd(a,b)
+      2 2        1
+    3x D  + 2D + -
+                 x
+     Type: LinearOrdinaryDifferentialOperator1 
+             Fraction UnivariatePolynomial(x,Integer)
+
+Note that a greatest common divisor doesn't necessarily divide a and b
+on both sides.  Here the left greatest common divisor does not divide
+a on the right.
+
+  leftRemainder(a, e)
+    0
+      Type: LinearOrdinaryDifferentialOperator1 
+              Fraction UnivariatePolynomial(x,Integer)
+
+  rightRemainder(a, e)
+          5
+    10D + -
+          x
+      Type: LinearOrdinaryDifferentialOperator1 
+              Fraction UnivariatePolynomial(x,Integer)
+
+Similarly, a least common multiple is not necessarily divisible from
+both sides.
+
+  f := rightLcm(a,b)
+       3 3       2        2         7
+    15x D  + (51x  + 10x)D  + 29D + -
+      Type: LinearOrdinaryDifferentialOperator1 
+              Fraction UnivariatePolynomial(x,Integer)
+
+  rightRemainder(f, b)
+          5
+    10D + -
+          x
+      Type: LinearOrdinaryDifferentialOperator1 
+              Fraction UnivariatePolynomial(x,Integer)
+
+  leftRemainder(f, b)
+    0
+      Type: LinearOrdinaryDifferentialOperator1 
+              Fraction UnivariatePolynomial(x,Integer)
+
+See Also:
+o )show LinearOrdinaryDifferentialOperator1
+o $AXIOM/doc/src/algebra/lodo.spad.dvi
+
+@
+\pagehead{LinearOrdinaryDifferentialOperator1}{LODO1}
+\pagepic{ps/v103linearordinarydifferentialoperator1.ps}{LODO1}{1.00}
+<<domain LODO1 LinearOrdinaryDifferentialOperator1>>=
+)abbrev domain LODO1 LinearOrdinaryDifferentialOperator1
+++ Author: Manuel Bronstein
+++ Date Created: 9 December 1993
+++ Date Last Updated: 31 January 1994
+++ Keywords: differential operator
+++ Description:
+++   \spad{LinearOrdinaryDifferentialOperator1} defines a ring of
+++   differential operators with coefficients in a differential ring A.
+++   Multiplication of operators corresponds to functional composition:
+++       \spad{(L1 * L2).(f) = L1 L2 f}
+LinearOrdinaryDifferentialOperator1(A:DifferentialRing) ==
+  LinearOrdinaryDifferentialOperator(A, differentiate$A)
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain LODO2 LinearOrdinaryDifferentialOperator2}
+<<LinearOrdinaryDifferentialOperator2.input>>=
+-- lodo.spad.pamphlet LinearOrdinaryDifferentialOperator2.input
+)spool LinearOrdinaryDifferentialOperator2.output
+)set message test on
+)set message auto off
+)clear all
+--S 1 of 26
+Q  := Fraction Integer
+--R 
+--R
+--R   (1)  Fraction Integer
+--R                                                                 Type: Domain
+--E 1
+
+--S 2 of 26
+PQ := UnivariatePolynomial('x, Q)
+--R 
+--R
+--R   (2)  UnivariatePolynomial(x,Fraction Integer)
+--R                                                                 Type: Domain
+--E 2
+
+--S 3 of 26
+x: PQ := 'x
+--R 
+--R
+--R   (3)  x
+--R                               Type: UnivariatePolynomial(x,Fraction Integer)
+--E 3
+
+--S 4 of 26
+Dx: LODO2(Q, PQ) := D()
+--R 
+--R
+--R   (4)  D
+--RType: LinearOrdinaryDifferentialOperator2(Fraction Integer,UnivariatePolynomial(x,Fraction Integer))
+--E 4
+
+--S 5 of 26
+a := Dx  + 1
+--R 
+--R
+--R   (5)  D + 1
+--RType: LinearOrdinaryDifferentialOperator2(Fraction Integer,UnivariatePolynomial(x,Fraction Integer))
+--E 5
+
+--S 6 of 26
+b := a + 1/2*Dx**2 - 1/2
+--R 
+--R
+--R        1  2       1
+--R   (6)  - D  + D + -
+--R        2          2
+--RType: LinearOrdinaryDifferentialOperator2(Fraction Integer,UnivariatePolynomial(x,Fraction Integer))
+--E 6
+
+--S 7 of 26
+p := 4*x**2 + 2/3
+--R 
+--R
+--R          2   2
+--R   (7)  4x  + -
+--R              3
+--R                               Type: UnivariatePolynomial(x,Fraction Integer)
+--E 7
+
+--S 8 of 26
+a p 
+--R 
+--R
+--R          2        2
+--R   (8)  4x  + 8x + -
+--R                   3
+--R                               Type: UnivariatePolynomial(x,Fraction Integer)
+--E 8
+
+--S 9 of 26
+(a * b) p = a b p
+--R 
+--R
+--R          2         37    2         37
+--R   (9)  2x  + 12x + --= 2x  + 12x + --
+--R                     3               3
+--R                      Type: Equation UnivariatePolynomial(x,Fraction Integer)
+--E 9
+
+--S 10 of 26
+c := (1/9)*b*(a + b)^2
+--R 
+--R
+--R          1  6    5  5   13  4   19  3   79  2    7     1
+--R   (10)  -- D  + -- D  + -- D  + -- D  + -- D  + -- D + -
+--R         72      36      24      18      72      12     8
+--RType: LinearOrdinaryDifferentialOperator2(Fraction Integer,UnivariatePolynomial(x,Fraction Integer))
+--E 10
+
+--S 11 of 26
+(a**2 - 3/4*b + c) (p + 1)
+--R 
+--R
+--R           2   44     541
+--R   (11)  3x  + -- x + ---
+--R                3      36
+--R                               Type: UnivariatePolynomial(x,Fraction Integer)
+--E 11
+)clear all
+--S 12 of 26
+PZ := UnivariatePolynomial(x,Integer)
+--R 
+--R
+--R   (1)  UnivariatePolynomial(x,Integer)
+--R                                                                 Type: Domain
+--E 12
+
+--S 13 of 26
+x:PZ := 'x
+--R 
+--R
+--R   (2)  x
+--R                                        Type: UnivariatePolynomial(x,Integer)
+--E 13
+
+--S 14 of 26
+Mat  := SquareMatrix(3,PZ)
+--R 
+--R
+--R   (3)  SquareMatrix(3,UnivariatePolynomial(x,Integer))
+--R                                                                 Type: Domain
+--E 14
+
+--S 15 of 26
+Vect := DPMM(3, PZ, Mat, PZ)
+--R 
+--R
+--R   (4)
+--R  DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,Un
+--R  ivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
+--R                                                                 Type: Domain
+--E 15
+
+--S 16 of 26
+Modo := LODO2(Mat, Vect)
+--R 
+--R
+--R   (5)
+--R  LinearOrdinaryDifferentialOperator2(SquareMatrix(3,UnivariatePolynomial(x,Int
+--R  eger)),DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatr
+--R  ix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer)))
+--R                                                                 Type: Domain
+--E 16
+
+--S 17 of 26
+m:Mat := matrix [ [x^2,1,0],[1,x^4,0],[0,0,4*x^2] ]
+--R 
+--R
+--R        + 2         +
+--R        |x   1    0 |
+--R        |           |
+--R   (6)  |     4     |
+--R        |1   x    0 |
+--R        |           |
+--R        |          2|
+--R        +0   0   4x +
+--R                        Type: SquareMatrix(3,UnivariatePolynomial(x,Integer))
+--E 17
+
+--S 18 of 26
+p:Vect := directProduct [3*x^2+1,2*x,7*x^3+2*x]
+--R 
+--R
+--R           2          3
+--R   (7)  [3x  + 1,2x,7x  + 2x]
+--RType: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
+--E 18
+
+--S 19 of 26
+q: Vect := m * p
+--R 
+--R
+--R           4    2        5     2        5     3
+--R   (8)  [3x  + x  + 2x,2x  + 3x  + 1,28x  + 8x ]
+--RType: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
+--E 19
+
+--S 20 of 26
+Dx : Modo := D()
+--R 
+--R
+--R   (9)  D
+--RType: LinearOrdinaryDifferentialOperator2(SquareMatrix(3,UnivariatePolynomial(x,Integer)),DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer)))
+--E 20
+
+--S 21 of 26
+a : Modo := Dx  + m
+--R 
+--R
+--R             + 2         +
+--R             |x   1    0 |
+--R             |           |
+--R   (10)  D + |     4     |
+--R             |1   x    0 |
+--R             |           |
+--R             |          2|
+--R             +0   0   4x +
+--RType: LinearOrdinaryDifferentialOperator2(SquareMatrix(3,UnivariatePolynomial(x,Integer)),DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer)))
+--E 21
+
+--S 22 of 26
+b : Modo := m*Dx  + 1
+--R 
+--R
+--R         + 2         +
+--R         |x   1    0 |    +1  0  0+
+--R         |           |    |       |
+--R   (11)  |     4     |D + |0  1  0|
+--R         |1   x    0 |    |       |
+--R         |           |    +0  0  1+
+--R         |          2|
+--R         +0   0   4x +
+--RType: LinearOrdinaryDifferentialOperator2(SquareMatrix(3,UnivariatePolynomial(x,Integer)),DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer)))
+--E 22
+
+--S 23 of 26
+c := a*b
+--R 
+--R
+--R   (12)
+--R   + 2         +     + 4              4    2                  +    + 2         +
+--R   |x   1    0 |     |x  + 2x + 2    x  + x            0      |    |x   1    0 |
+--R   |           | 2   |                                        |    |           |
+--R   |     4     |D  + |   4    2     8     3                   |D + |     4     |
+--R   |1   x    0 |     |  x  + x     x  + 4x  + 2        0      |    |1   x    0 |
+--R   |           |     |                                        |    |           |
+--R   |          2|     |                              4         |    |          2|
+--R   +0   0   4x +     +     0            0        16x  + 8x + 1+    +0   0   4x +
+--RType: LinearOrdinaryDifferentialOperator2(SquareMatrix(3,UnivariatePolynomial(x,Integer)),DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer)))
+--E 23
+
+--S 24 of 26
+a p
+--R 
+--R
+--R            4    2        5     2        5     3      2
+--R   (13)  [3x  + x  + 8x,2x  + 3x  + 3,28x  + 8x  + 21x  + 2]
+--RType: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
+--E 24
+
+--S 25 of 26
+b p
+--R 
+--R
+--R            3     2       4         4     3     2
+--R   (14)  [6x  + 3x  + 3,2x  + 8x,84x  + 7x  + 8x  + 2x]
+--RType: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
+--E 25
+
+--S 26 of 26
+(a + b + c) (p + q)
+--R 
+--R
+--R   (15)
+--R       8      7      6      5      4      3      2
+--R   [10x  + 12x  + 16x  + 30x  + 85x  + 94x  + 40x  + 40x + 17,
+--R       12      9      8      7     6      5      4      3      2
+--R    10x   + 10x  + 12x  + 92x  + 6x  + 32x  + 72x  + 28x  + 49x  + 32x + 19,
+--R         8       7        6        5       4       3      2
+--R    2240x  + 224x  + 1280x  + 3508x  + 492x  + 751x  + 98x  + 18x + 4]
+--RType: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
+--E 26
+)spool
+)lisp (bye)
+@
+<<LinearOrdinaryDifferentialOperator2.help>>=
+====================================================================
+LinearOrdinaryDifferentialOperator2
+====================================================================
+
+LinearOrdinaryDifferentialOperator2(A, M) is the domain of linear
+ordinary differential operators with coefficients in the differential
+ring A and operating on M, an A-module.  This includes the cases of
+operators which are polynomials in D acting upon scalar or vector
+expressions of a single variable.  The coefficients of the operator
+polynomials can be integers, rational functions, matrices or elements
+of other domains.
+
+====================================================================
+Differential Operators with Constant Coefficients
+====================================================================
+
+This example shows differential operators with rational number
+coefficients operating on univariate polynomials.
+
+We begin by making type assignments so we can conveniently refer
+to univariate polynomials in x over the rationals.
+
+  Q  := Fraction Integer
+    Fraction Integer
+                         Type: Domain
+
+  PQ := UnivariatePolynomial('x, Q)
+    UnivariatePolynomial(x,Fraction Integer)
+                         Type: Domain
+
+  x: PQ := 'x
+    x
+                         Type: UnivariatePolynomial(x,Fraction Integer)
+
+Now we assign Dx to be the differential operator D corresponding to d/dx.
+
+  Dx: LODO2(Q, PQ) := D()
+    D
+     Type: LinearOrdinaryDifferentialOperator2(Fraction Integer,
+             UnivariatePolynomial(x,Fraction Integer))
+
+New operators are created as polynomials in D().
+
+  a := Dx  + 1
+    D + 1
+     Type: LinearOrdinaryDifferentialOperator2(Fraction Integer,
+             UnivariatePolynomial(x,Fraction Integer))
+
+  b := a + 1/2*Dx**2 - 1/2
+    1  2       1
+    - D  + D + -
+    2          2
+      Type: LinearOrdinaryDifferentialOperator2(Fraction Integer,
+              UnivariatePolynomial(x,Fraction Integer))
+
+To apply the operator a to the value p the usual function call syntax
+is used.
+
+  p := 4*x**2 + 2/3
+      2   2
+    4x  + -
+          3
+                     Type: UnivariatePolynomial(x,Fraction Integer)
+
+  a p 
+      2        2
+    4x  + 8x + -
+               3
+                     Type: UnivariatePolynomial(x,Fraction Integer)
+
+Operator multiplication is defined by the identity (a*b)p = a(b(p))
+
+  (a * b) p = a b p
+      2         37    2         37
+    2x  + 12x + --= 2x  + 12x + --
+                 3               3
+                     Type: Equation UnivariatePolynomial(x,Fraction Integer)
+
+Exponentiation follows from multiplication.
+
+  c := (1/9)*b*(a + b)^2
+      1  6    5  5   13  4   19  3   79  2    7     1
+     -- D  + -- D  + -- D  + -- D  + -- D  + -- D + -
+     72      36      24      18      72      12     8
+      Type: LinearOrdinaryDifferentialOperator2(Fraction Integer,
+              UnivariatePolynomial(x,Fraction Integer))
+
+Finally, note that operator expressions may be applied directly.
+
+  (a**2 - 3/4*b + c) (p + 1)
+       2   44     541
+     3x  + -- x + ---
+            3      36
+                     Type: UnivariatePolynomial(x,Fraction Integer)
+
+====================================================================
+Differential Operators with Matrix Coefficients Operating on Vectors}
+====================================================================
+
+This is another example of linear ordinary differential operators with
+non-commutative multiplication.  Unlike the rational function case,
+the differential ring of square matrices (of a given dimension) with
+univariate polynomial entries does not form a field.  Thus the number
+of operations available is more limited.
+
+In this section, the operators have three by three matrix coefficients
+with polynomial entries.
+
+  PZ := UnivariatePolynomial(x,Integer)
+    UnivariatePolynomial(x,Integer)
+                           Type: Domain
+
+  x:PZ := 'x
+    x
+                           Type: UnivariatePolynomial(x,Integer)
+
+  Mat  := SquareMatrix(3,PZ)
+    SquareMatrix(3,UnivariatePolynomial(x,Integer))
+                           Type: Domain
+
+The operators act on the vectors considered as a Mat-module.
+
+  Vect := DPMM(3, PZ, Mat, PZ)
+  DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,Un
+  ivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
+                           Type: Domain
+
+  Modo := LODO2(Mat, Vect)
+  LinearOrdinaryDifferentialOperator2(SquareMatrix(3,UnivariatePolynomial(x,Int
+  eger)),DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatr
+  ix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer)))
+                           Type: Domain
+
+The matrix m is used as a coefficient and the vectors p and q are
+operated upon.
+
+  m:Mat := matrix [ [x^2,1,0],[1,x^4,0],[0,0,4*x^2] ]
+        + 2         +
+        |x   1    0 |
+        |           |
+        |     4     |
+        |1   x    0 |
+        |           |
+        |          2|
+        +0   0   4x +
+                        Type: SquareMatrix(3,UnivariatePolynomial(x,Integer))
+
+  p:Vect := directProduct [3*x^2+1,2*x,7*x^3+2*x]
+       2          3
+    [3x  + 1,2x,7x  + 2x]
+    Type: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
+             SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+                UnivariatePolynomial(x,Integer))
+
+  q: Vect := m * p
+       4    2        5     2        5     3
+    [3x  + x  + 2x,2x  + 3x  + 1,28x  + 8x ]
+      Type: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
+         SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+            UnivariatePolynomial(x,Integer))
+
+Now form a few operators.
+
+  Dx : Modo := D()
+    D
+      Type: LinearOrdinaryDifferentialOperator2(
+             SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+             DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
+             SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+             UnivariatePolynomial(x,Integer)))
+
+  a : Modo := Dx  + m
+             + 2         +
+             |x   1    0 |
+             |           |
+         D + |     4     |
+             |1   x    0 |
+             |           |
+             |          2|
+             +0   0   4x +
+    Type: LinearOrdinaryDifferentialOperator2(
+             SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+             DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
+             SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+             UnivariatePolynomial(x,Integer)))
+
+  b : Modo := m*Dx  + 1
+         + 2         +
+         |x   1    0 |    +1  0  0+
+         |           |    |       |
+         |     4     |D + |0  1  0|
+         |1   x    0 |    |       |
+         |           |    +0  0  1+
+         |          2|
+         +0   0   4x +
+     Type: LinearOrdinaryDifferentialOperator2(
+              SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+              DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
+              SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+              UnivariatePolynomial(x,Integer)))
+
+  c := a*b
+  + 2         +     + 4              4    2                  +    + 2         +
+  |x   1    0 |     |x  + 2x + 2    x  + x            0      |    |x   1    0 |
+  |           | 2   |                                        |    |           |
+  |     4     |D  + |   4    2     8     3                   |D + |     4     |
+  |1   x    0 |     |  x  + x     x  + 4x  + 2        0      |    |1   x    0 |
+  |           |     |                                        |    |           |
+  |          2|     |                              4         |    |          2|
+  +0   0   4x +     +     0            0        16x  + 8x + 1+    +0   0   4x +
+    Type: LinearOrdinaryDifferentialOperator2(
+            SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+            DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
+            SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+            UnivariatePolynomial(x,Integer)))
+
+These operators can be applied to vector values.
+
+  a p
+        4    2        5     2        5     3      2
+     [3x  + x  + 8x,2x  + 3x  + 3,28x  + 8x  + 21x  + 2]
+       Type: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
+               SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+                  UnivariatePolynomial(x,Integer))
+
+  b p
+        3     2       4         4     3     2
+     [6x  + 3x  + 3,2x  + 8x,84x  + 7x  + 8x  + 2x]
+        Type: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
+                SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+                  UnivariatePolynomial(x,Integer))
+
+  (a + b + c) (p + q)
+       8      7      6      5      4      3      2
+   [10x  + 12x  + 16x  + 30x  + 85x  + 94x  + 40x  + 40x + 17,
+       12      9      8      7     6      5      4      3      2
+    10x   + 10x  + 12x  + 92x  + 6x  + 32x  + 72x  + 28x  + 49x  + 32x + 19,
+         8       7        6        5       4       3      2
+    2240x  + 224x  + 1280x  + 3508x  + 492x  + 751x  + 98x  + 18x + 4]
+     Type: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
+             SquareMatrix(3,UnivariatePolynomial(x,Integer)),
+               UnivariatePolynomial(x,Integer))
+
+See Also:
+o )show LinearOrdinaryDifferentialOperator2
+o $AXIOM/doc/src/algebra/lodo.spad.dvi
+
+@
+\pagehead{LinearOrdinaryDifferentialOperator2}{LODO2}
+\pagepic{ps/v103linearordinarydifferentialoperator2.ps}{LODO2}{1.00}
+<<domain LODO2 LinearOrdinaryDifferentialOperator2>>=
+)abbrev domain LODO2 LinearOrdinaryDifferentialOperator2
+++ Author: Stephen M. Watt, Manuel Bronstein
+++ Date Created: 1986
+++ Date Last Updated: 1 February 1994
+++ Keywords: differential operator
+++ Description:
+++   \spad{LinearOrdinaryDifferentialOperator2} defines a ring of
+++   differential operators with coefficients in a differential ring A
+++   and acting on an A-module M.
+++   Multiplication of operators corresponds to functional composition:
+++       \spad{(L1 * L2).(f) = L1 L2 f}
+LinearOrdinaryDifferentialOperator2(A, M): Exports == Implementation where
+  A: DifferentialRing
+  M: LeftModule A with 
+	differentiate: $ -> $
+		++ differentiate(x) returns the derivative of x
+
+  Exports ==> Join(LinearOrdinaryDifferentialOperatorCategory A, Eltable(M, M))
+
+  Implementation ==> LinearOrdinaryDifferentialOperator(A, differentiate$A) add
+      elt(p:%, m:M):M ==
+        apply(p, differentiate, m)$ApplyUnivariateSkewPolynomial(A, M, %)
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{domain LIST List}
 <<List.input>>=
 -- list.spad.pamphlet List.input
@@ -32521,99 +34192,6 @@ List(S:Type): Exports == Implementation where
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{domain LSQM LieSquareMatrix}
-\pagehead{LieSquareMatrix}{LSQM}
-\pagepic{ps/v103liesquarematrix.ps}{LSQM}{1.00}
-See also:\\
-\refto{AssociatedLieAlgebra}{LIE}
-\refto{AssociatedJordanAlgebra}{JORDAN}
-<<domain LSQM LieSquareMatrix>>=
-)abbrev domain LSQM LieSquareMatrix
-++ Author: J. Grabmeier
-++ Date Created: 07 March 1991
-++ Date Last Updated: 08 March 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++   LieSquareMatrix(n,R) implements the Lie algebra of the n by n
-++   matrices over the commutative ring R.
-++   The Lie bracket (commutator) of the algebra is given by
-++   \spad{a*b := (a *$SQMATRIX(n,R) b - b *$SQMATRIX(n,R) a)},
-++   where \spadfun{*$SQMATRIX(n,R)} is the usual matrix multiplication.
-LieSquareMatrix(n,R): Exports == Implementation where
-
-  n    : PositiveInteger
-  R    : CommutativeRing
-
-  Row ==> DirectProduct(n,R)
-  Col ==> DirectProduct(n,R)
-
-  Exports ==> Join(SquareMatrixCategory(n,R,Row,Col), CoercibleTo Matrix R,_
-      FramedNonAssociativeAlgebra R) --with
-
-  Implementation ==> AssociatedLieAlgebra (R,SquareMatrix(n, R)) add
-
-    Rep :=  AssociatedLieAlgebra (R,SquareMatrix(n, R))
-      -- local functions
-    n2 : PositiveInteger := n*n
-
-    convDM : DirectProduct(n2,R) -> %
-    conv : DirectProduct(n2,R) ->  SquareMatrix(n,R)
-      --++ converts n2-vector to (n,n)-matrix row by row
-    conv v  ==
-      cond : Matrix(R) := new(n,n,0$R)$Matrix(R)
-      z : Integer := 0
-      for i in 1..n repeat
-        for j in 1..n  repeat
-          z := z+1
-          setelt(cond,i,j,v.z)
-      squareMatrix(cond)$SquareMatrix(n, R)
-
-
-    coordinates(a:%,b:Vector(%)):Vector(R) ==
-      -- only valid for b canonicalBasis
-      res : Vector R := new(n2,0$R)
-      z : Integer := 0
-      for i in 1..n repeat
-        for j in 1..n repeat
-          z := z+1
-          res.z := elt(a,i,j)$%
-      res
-
-
-    convDM v ==
-      sq := conv v
-      coerce(sq)$Rep :: %
-
-    basis() ==
-      n2 : PositiveInteger := n*n
-      ldp : List DirectProduct(n2,R) :=
-        [unitVector(i::PositiveInteger)$DirectProduct(n2,R) for i in 1..n2]
-      res:Vector % := vector map(convDM,_
-        ldp)$ListFunctions2(DirectProduct(n2,R), %)
-
-    someBasis() == basis()
-    rank() == n*n
-
-
---    transpose: % -> %
---      ++ computes the transpose of a matrix
---    squareMatrix: Matrix R -> %
---      ++ converts a Matrix to a LieSquareMatrix
---    coerce: % -> Matrix R
---      ++ converts a LieSquareMatrix to a Matrix
---    symdecomp : % -> Record(sym:%,antisym:%)
---    if R has commutative("*") then
---      minorsVect: -> Vector(Union(R,"uncomputed")) --range: 1..2**n-1
---    if R has commutative("*") then central
---    if R has commutative("*") and R has unitsKnown then unitsKnown
-
-@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{domain LMOPS ListMonoidOps}
 \pagehead{ListMonoidOps}{LMOPS}
 \pagepic{ps/v103listmonoidops.ps}{LMOPS}{1.00}
@@ -32778,6 +34356,155 @@ ListMonoidOps(S, E, un): Exports == Implementation where
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain LMDICT ListMultiDictionary}
+\pagehead{ListMultiDictionary}{LMDICT}
+\pagepic{ps/v103listmultidictionary.ps}{LMDICT}{1.00}
+<<domain LMDICT ListMultiDictionary>>=
+)abbrev domain LMDICT ListMultiDictionary
+++ Author: MBM Nov/87, MB Oct/89
+++ Date Created:
+++ Date Last Updated: 13 June 1994 Frederic Lehobey
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description: The \spadtype{ListMultiDictionary} domain implements a
+++ dictionary with duplicates
+++ allowed.  The representation is a list with duplicates represented
+++ explicitly.  Hence most operations will be relatively inefficient
+++ when the number of entries in the dictionary becomes large.
+-- The operations \spadfun{pick}, \spadfun{count} and \spadfun{delete} can be used to iterate
+-- over the objects in the dictionary.
+-- [FDLL : those functions have not been implemented in the parent Categories]
+++ If the objects in the
+++ dictionary belong to an ordered set, the entries are maintained in
+++ ascending order.
+
+NNI ==> NonNegativeInteger
+D ==> Record(entry:S, count:NonNegativeInteger)
+
+ListMultiDictionary(S:SetCategory): MultiDictionary(S) with
+   finiteAggregate
+   duplicates?: % -> Boolean
+     ++ duplicates?(d) tests if dictionary d has duplicate entries.
+   substitute : (S, S, %) -> %
+     ++ substitute(x,y,d) replace x's with y's in dictionary d.
+ == add
+   Rep := Reference List S
+
+   sub: (S, S, S) -> S
+
+   coerce(s:%):OutputForm ==
+     prefix("dictionary"::OutputForm, [x::OutputForm for x in parts s])
+
+   #s                 == # parts s
+   copy s             == dictionary copy parts s
+   empty? s           == empty? parts s
+   bag l              == dictionary l
+   dictionary()       == dictionary empty()
+
+   empty():% == ref empty()
+
+   dictionary(ls:List S):% ==
+     empty? ls => empty()
+     lmd := empty()
+     for x in ls repeat insert_!(x,lmd)
+     lmd
+
+   if S has ConvertibleTo InputForm then
+     convert(lmd:%):InputForm ==
+       convert [convert("dictionary"::Symbol)@InputForm,
+        convert(parts lmd)@InputForm]
+
+   map(f, s)          == dictionary map(f, parts s)
+   map_!(f, s)        == dictionary map_!(f, parts s)
+   parts s            == deref s
+   sub(x, y, z)       == (z = x => y; z)
+   insert_!(x, s, n)  == (for i in 1..n repeat insert_!(x, s); s)
+   substitute(x, y, s) == dictionary map(sub(x, y, #1), parts s)
+   removeDuplicates_! s == dictionary removeDuplicates_! parts s
+
+   inspect s ==
+     empty? s => error "empty dictionary"
+     first parts s
+
+   extract_! s ==
+     empty? s => error "empty dictionary"
+     x := first(p := parts s)
+     setref(s, rest p)
+     x
+
+   duplicates? s ==
+     empty?(p := parts s) => false
+     q := rest p
+     while not empty? q repeat
+       first p = first q => return true
+       p := q
+       q := rest q
+     false
+
+   remove_!(p: S->Boolean, lmd:%):% ==
+     for x in removeDuplicates parts lmd | p(x) repeat remove_!(x,lmd)
+     lmd
+
+   select_!(p: S->Boolean, lmd:%):% == remove_!(not p(#1), lmd)
+
+   duplicates(lmd:%):List D ==
+     ld: List D := empty()
+     for x in removeDuplicates parts lmd | (n := count(x, lmd)) >
+      1$NonNegativeInteger repeat
+       ld := cons([x, n], ld)
+     ld
+
+   if S has OrderedSet then
+      s = t == parts s = parts t
+
+      remove_!(x:S, s:%) ==
+         p := deref s
+         while not empty? p and x = first p repeat p := rest p
+         setref(s, p)
+         empty? p => s
+         q := rest p
+         while not empty? q and x > first q repeat (p := q; q := rest q)
+         while not empty? q and x = first q repeat q := rest q
+         p.rest := q
+         s
+
+      insert_!(x, s) ==
+         p := deref s
+         empty? p or x < first p =>
+            setref(s, concat(x, p))
+            s
+         q := rest p
+         while not empty? q and x > first q repeat (p := q; q := rest q)
+         p.rest := concat(x, q)
+         s
+
+   else
+      remove_!(x:S, s:%) == (setref(s, remove_!(x, parts s)); s)
+
+      s = t ==
+         a := copy s
+         while not empty? a repeat
+            x := inspect a
+            count(x, s) ^= count(x, t) => return false
+            remove_!(x, a)
+         true
+
+      insert_!(x, s) ==
+         p := deref s
+         while not empty? p repeat
+            x = first p =>
+               p.rest := concat(x, rest p)
+               s
+            p := rest p
+         setref(s, concat(x, deref s))
+         s
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{domain LA LocalAlgebra}
 \pagehead{LocalAlgebra}{LA}
 \pagepic{ps/v103localalgebra.ps}{LA}{1.00}
@@ -34153,6 +35880,51 @@ OnePointCompletion(R:SetCategory): Exports == Implementation where
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain OMLO OppositeMonogenicLinearOperator}
+\pagehead{OppositeMonogenicLinearOperator}{OMLO}
+\pagepic{ps/v103oppositemonogeniclinearoperator.ps}{OMLO}{1.00}
+See also:\\
+\refto{OrdinaryDifferentialRing}{ODR}
+\refto{DirectProductModule}{DPMO}
+\refto{DirectProductMatrixModule}{DPMM}
+<<domain OMLO OppositeMonogenicLinearOperator>>=
+)abbrev domain OMLO OppositeMonogenicLinearOperator
+++ Author: Stephen M. Watt
+++ Date Created: 1986
+++ Date Last Updated: May 30, 1991
+++ Basic Operations:
+++ Related Domains: MonogenicLinearOperator
+++ Also See:
+++ AMS Classifications:
+++ Keywords: opposite ring
+++ Examples:
+++ References:
+++ Description:
+++   This constructor creates the \spadtype{MonogenicLinearOperator} domain
+++   which is ``opposite'' in the ring sense to P.
+++   That is, as sets \spad{P = $} but \spad{a * b} in \spad{$} is equal to
+++   \spad{b * a} in P.
+
+OppositeMonogenicLinearOperator(P, R): OPRcat == OPRdef where
+   P: MonogenicLinearOperator(R)
+   R: Ring
+
+   OPRcat == MonogenicLinearOperator(R) with
+        if P has DifferentialRing then DifferentialRing
+        op: P -> $  ++ op(p) creates a value in $ equal to p in P.
+        po: $ -> P  ++ po(q) creates a value in P equal to q in $.
+
+   OPRdef  == P add
+        Rep := P
+        x, y: $
+        a: P
+        op a == a: $
+        po x == x: P
+        x*y == (y:P) *$P (x:P)
+        coerce(x): OutputForm == prefix(op::OutputForm, [coerce(x:P)$P])
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{domain ORDCOMP OrderedCompletion}
 <<dot>>=
 "ORDCOMP" -> "SETCAT"
@@ -35070,6 +36842,53 @@ OrderlyDifferentialVariable(S:OrderedSet):DifferentialVariableCategory(S)
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain ODR OrdinaryDifferentialRing}
+\pagehead{OrdinaryDifferentialRing}{ODR}
+\pagepic{ps/v103ordinarydifferentialring.ps}{ODR}{1.00}
+See also:\\
+\refto{OppositeMonogenicLinearOperator}{OMLO}
+\refto{DirectProductModule}{DPMO}
+\refto{DirectProductMatrixModule}{DPMM}
+<<domain ODR OrdinaryDifferentialRing>>=
+)abbrev domain ODR OrdinaryDifferentialRing
+++ Author: Stephen M. Watt
+++ Date Created: 1986
+++ Date Last Updated: June 3, 1991
+++ Basic Operations:
+++ Related Domains:
+++ Also See:
+++ AMS Classifications:
+++ Keywords: differential ring
+++ Examples:
+++ References:
+++ Description:
+++   This constructor produces an ordinary differential ring from
+++   a partial differential ring by specifying a variable.
+
+OrdinaryDifferentialRing(Kernels,R,var): DRcategory == DRcapsule where
+    Kernels:SetCategory
+    R: PartialDifferentialRing(Kernels)
+    var : Kernels
+    DRcategory == Join(BiModule($,$), DifferentialRing) with
+        if R has Field then Field
+        coerce: R -> $
+            ++ coerce(r) views r as a value in the ordinary differential ring.
+        coerce: $ -> R
+            ++ coerce(p) views p as a valie in the partial differential ring.
+    DRcapsule == R add
+        n: Integer
+        Rep := R
+        coerce(u:R):$ == u::Rep::$
+        coerce(p:$):R == p::Rep::R
+        differentiate p       == differentiate(p, var)
+
+        if R has Field then
+            p / q     == ((p::R) /$R (q::R))::$
+            p ** n    == ((p::R) **$R n)::$
+            inv(p)    == (inv(p::R)$R)::$
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{domain OSI OrdSetInts}
 \pagehead{OrdSetInts}{OSI}
 \pagepic{ps/v103ordsetints.ps}{OSI}{1.00}
@@ -38259,6 +40078,156 @@ ScriptFormulaFormat(): public == private where
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain SETMN SetOfMIntegersInOneToN}
+\pagehead{SetOfMIntegersInOneToN}{SETMN}
+\pagepic{ps/v103setofmintegersinoneton.ps}{SETMN}{1.00}
+<<domain SETMN SetOfMIntegersInOneToN>>=
+)abbrev domain SETMN SetOfMIntegersInOneToN
+++ Author: Manuel Bronstein
+++ Date Created: 10 January 1994
+++ Date Last Updated: 10 January 1994
+++ Description:
+++ \spadtype{SetOfMIntegersInOneToN} implements the subsets of M integers
+++ in the interval \spad{[1..n]}
+SetOfMIntegersInOneToN(m, n): Exports == Implementation where
+  PI ==> PositiveInteger
+  N  ==> NonNegativeInteger
+  U  ==> Union(%, "failed")
+  n,m: PI
+ 
+  Exports ==> Finite with
+    incrementKthElement: (%, PI) -> U
+      ++ incrementKthElement(S,k) increments the k^{th} element of S,
+      ++ and returns "failed" if the result is not a set of M integers
+      ++ in \spad{1..n} any more.
+    replaceKthElement:   (%, PI, PI) -> U
+      ++ replaceKthElement(S,k,p) replaces the k^{th} element of S by p,
+      ++ and returns "failed" if the result is not a set of M integers
+      ++ in \spad{1..n} any more.
+    elements: % -> List PI
+      ++ elements(S) returns the list of the elements of S in increasing order.
+    setOfMinN: List PI -> %
+      ++ setOfMinN([a_1,...,a_m]) returns the set {a_1,...,a_m}.
+      ++ Error if {a_1,...,a_m} is not a set of M integers in \spad{1..n}.
+    enumerate: () -> Vector %
+      ++ enumerate() returns a vector of all the sets of M integers in
+      ++ \spad{1..n}.
+    member?:   (PI, %) -> Boolean
+      ++ member?(p, s) returns true is p is in s, false otherwise.
+    delta: (%, PI, PI) -> N
+      ++ delta(S,k,p) returns the number of elements of S which are strictly
+      ++ between p and the k^{th} element of S.
+ 
+  Implementation ==> add
+    Rep := Record(bits:Bits, pos:N)
+ 
+    reallyEnumerate: () -> Vector %
+    enum: (N, N, PI) -> List Bits
+ 
+    all:Reference Vector % := ref empty()
+    sz:Reference N := ref 0
+ 
+    s1 = s2                == s1.bits =$Bits s2.bits
+    coerce(s:%):OutputForm == brace [i::OutputForm for i in elements s]
+    random()               == index((1 + (random()$Integer rem size()))::PI)
+    reallyEnumerate()      == [[b, i] for b in enum(m, n, n) for i in 1..]
+    member?(p, s)          == s.bits.p
+ 
+    enumerate() ==
+      if empty? all() then all() := reallyEnumerate()
+      all()
+ 
+-- enumerates the sets of p integers in 1..q, returns them as sets in 1..n
+-- must have p <= q
+    enum(p, q, n) ==
+      zero? p or zero? q => empty()
+      p = q =>
+        b := new(n, false)$Bits
+        for i in 1..p repeat b.i := true
+        [b]
+      q1 := (q - 1)::N
+      l := enum((p - 1)::N, q1, n)
+      if empty? l then l := [new(n, false)$Bits]
+      for s in l repeat s.q := true
+      concat_!(enum(p, q1, n), l)
+ 
+    size() ==
+      if zero? sz() then
+         sz() := binomial(n, m)$IntegerCombinatoricFunctions(Integer) :: N
+      sz()
+ 
+    lookup s ==
+      if empty? all() then all() := reallyEnumerate()
+      if zero?(s.pos) then s.pos := position(s, all()) :: N
+      s.pos :: PI
+      
+    index p ==
+      p > size() => error "index: argument too large"
+      if empty? all() then all() := reallyEnumerate()
+      all().p
+ 
+    setOfMinN l ==
+      s := new(n, false)$Bits
+      count:N := 0
+      for i in l repeat
+        count := count + 1
+        count > m or zero? i or i > n or s.i =>
+          error "setOfMinN: improper set of integers"
+        s.i := true
+      count < m => error "setOfMinN: improper set of integers"
+      [s, 0]
+ 
+    elements s ==
+      b := s.bits
+      l:List PI := empty()
+      found:N := 0
+      i:PI := 1
+      while found < m repeat
+          if b.i then
+              l := concat(i, l)
+              found := found + 1
+          i := i + 1
+      reverse_! l
+ 
+    incrementKthElement(s, k) ==
+      b := s.bits
+      found:N := 0
+      i:N := 1
+      while found < k repeat
+          if b.i then found := found + 1
+          i := i + 1
+      i > n or b.i => "failed"
+      newb := copy b
+      newb.i := true
+      newb.((i-1)::N) := false
+      [newb, 0]
+ 
+    delta(s, k, p) ==
+      b := s.bits
+      count:N := found:N := 0
+      i:PI := 1
+      while found < k repeat
+          if b.i then
+             found := found + 1
+             if i > p and found < k then count := count + 1
+          i := i + 1
+      count
+ 
+    replaceKthElement(s, k, p) ==
+      b := s.bits
+      found:N := 0
+      i:PI := 1
+      while found < k repeat
+          if b.i then found := found + 1
+          if found < k then i := i + 1
+      b.p and i ^= p => "failed"
+      newb := copy b
+      newb.p := true
+      newb.i := false
+      [newb, (i = p => s.pos; 0)]
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{domain SDPOL SequentialDifferentialPolynomial}
 \pagehead{SequentialDifferentialPolynomial}{SDPOL}
 \pagepic{ps/v103sequentialdifferentialpolynomial.ps}{SDPOL}{1.00}
@@ -43412,6 +45381,8 @@ Note that this code is not included in the generated catdef.spad file.
 <<domain DEQUEUE Dequeue>>
 <<domain DERHAM DeRhamComplex>>
 <<domain DSMP DifferentialSparseMultivariatePolynomial>>
+<<domain DPMM DirectProductMatrixModule>>
+<<domain DPMO DirectProductModule>>
 <<domain DMP DistributedMultivariatePolynomial>>
 <<domain DROPT DrawOption>>
 <<domain D01AJFA d01ajfAnnaType>>
@@ -43515,8 +45486,12 @@ Note that this code is not included in the generated catdef.spad file.
 <<domain LAUPOL LaurentPolynomial>>
 <<domain LIB Library>>
 <<domain LSQM LieSquareMatrix>>
+<<domain LODO LinearOrdinaryDifferentialOperator>>
+<<domain LODO1 LinearOrdinaryDifferentialOperator1>>
+<<domain LODO2 LinearOrdinaryDifferentialOperator2>>
 <<domain LIST List>>
 <<domain LMOPS ListMonoidOps>>
+<<domain LMDICT ListMultiDictionary>>
 <<domain LA LocalAlgebra>>
 <<domain LO Localize>>
 
@@ -43535,10 +45510,12 @@ Note that this code is not included in the generated catdef.spad file.
 <<domain ODEIFTBL ODEIntensityFunctionsTable>>
 <<domain ARRAY1 OneDimensionalArray>>
 <<domain ONECOMP OnePointCompletion>>
+<<domain OMLO OppositeMonogenicLinearOperator>>
 <<domain ORDCOMP OrderedCompletion>>
 <<domain ODP OrderedDirectProduct>>
 <<domain ODPOL OrderlyDifferentialPolynomial>>
 <<domain ODVAR OrderlyDifferentialVariable>>
+<<domain ODR OrdinaryDifferentialRing>>
 <<domain OSI OrdSetInts>>
 
 <<domain ACPLOT PlaneAlgebraicCurvePlot>>
@@ -43562,6 +45539,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<domain SFORT SimpleFortranProgram>>
 <<domain SDPOL SequentialDifferentialPolynomial>>
 <<domain SDVAR SequentialDifferentialVariable>>
+<<domain SETMN SetOfMIntegersInOneToN>>
 <<domain SHDP SplitHomogeneousDirectProduct>>
 <<domain STACK Stack>>
 <<domain SWITCH Switch>>
diff --git a/books/ps/v103directproductmatrixmodule.ps b/books/ps/v103directproductmatrixmodule.ps
new file mode 100644
index 0000000..131df11
--- /dev/null
+++ b/books/ps/v103directproductmatrixmodule.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 222 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 222 80
+%%PageOrientation: Portrait
+gsave
+36 36 186 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+184 42 lineto
+184 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+184 42 lineto
+184 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% DirectProductMatrixModule
+[ /Rect [ 0 0 178 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=DPMM) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 178 36 moveto
+0 36 lineto
+0 0 lineto
+178 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 178 36 moveto
+0 36 lineto
+0 0 lineto
+178 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(DirectProductMatrixModule)
+[10.08 3.84 4.8 6.24 6.24 3.84 7.68 4.8 6.96 6.96 6.96 6.24 3.84 12.48 6.24 3.84 5.04 3.84 6.96 12.48 6.96 6.96 6.96 3.84 6.24]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103directproductmodule.ps b/books/ps/v103directproductmodule.ps
new file mode 100644
index 0000000..b1a3360
--- /dev/null
+++ b/books/ps/v103directproductmodule.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 184 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 184 80
+%%PageOrientation: Portrait
+gsave
+36 36 148 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+146 42 lineto
+146 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+146 42 lineto
+146 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% DirectProductModule
+[ /Rect [ 0 0 140 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=DPMO) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 140 36 moveto
+0 36 lineto
+0 0 lineto
+140 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 140 36 moveto
+0 36 lineto
+0 0 lineto
+140 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(DirectProductModule)
+[10.08 3.84 4.8 6.24 6.24 3.84 7.68 4.8 6.96 6.96 6.96 6.24 3.84 12.48 6.96 6.96 6.96 3.84 6.24]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103euclideanmodularring.ps b/books/ps/v103euclideanmodularring.ps
new file mode 100644
index 0000000..c55b2b8
--- /dev/null
+++ b/books/ps/v103euclideanmodularring.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 192 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 192 80
+%%PageOrientation: Portrait
+gsave
+36 36 156 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+154 42 lineto
+154 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+154 42 lineto
+154 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% EuclideanModularRing
+[ /Rect [ 0 0 148 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=EMR) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 148 36 moveto
+0 36 lineto
+0 0 lineto
+148 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 148 36 moveto
+0 36 lineto
+0 0 lineto
+148 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(EuclideanModularRing)
+[8.64 6.96 6.24 3.84 3.84 6.96 6.24 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.24 4.8 9.36 3.84 6.96 6.96]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103generalmodulepolynomial.ps b/books/ps/v103generalmodulepolynomial.ps
new file mode 100644
index 0000000..663dd2e
--- /dev/null
+++ b/books/ps/v103generalmodulepolynomial.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 212 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 212 80
+%%PageOrientation: Portrait
+gsave
+36 36 176 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+174 42 lineto
+174 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+174 42 lineto
+174 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% GeneralModulePolynomial
+[ /Rect [ 0 0 168 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=GMODPOL) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 168 36 moveto
+0 36 lineto
+0 0 lineto
+168 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 168 36 moveto
+0 36 lineto
+0 0 lineto
+168 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(GeneralModulePolynomial)
+[10.08 6.24 6.96 6.24 4.8 6.24 3.84 12.48 6.96 6.96 6.96 3.84 6.24 7.44 6.96 3.6 6.96 6.96 6.96 10.8 3.84 6.24 3.84]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103indexedexponents.ps b/books/ps/v103indexedexponents.ps
new file mode 100644
index 0000000..553681a
--- /dev/null
+++ b/books/ps/v103indexedexponents.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 164 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 164 80
+%%PageOrientation: Portrait
+gsave
+36 36 128 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+126 42 lineto
+126 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+126 42 lineto
+126 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% IndexedExponents
+[ /Rect [ 0 0 120 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=INDE) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 120 36 moveto
+0 36 lineto
+0 0 lineto
+120 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 120 36 moveto
+0 36 lineto
+0 0 lineto
+120 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(IndexedExponents)
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 8.64 6.96 6.96 6.96 6.96 6.24 6.96 3.84 5.52]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103indexedmatrix.ps b/books/ps/v103indexedmatrix.ps
new file mode 100644
index 0000000..e89036e
--- /dev/null
+++ b/books/ps/v103indexedmatrix.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 144 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 144 80
+%%PageOrientation: Portrait
+gsave
+36 36 108 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+106 42 lineto
+106 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+106 42 lineto
+106 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% IndexedMatrix
+[ /Rect [ 0 0 100 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=IMATRIX) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 100 36 moveto
+0 36 lineto
+0 0 lineto
+100 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 100 36 moveto
+0 36 lineto
+0 0 lineto
+100 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(IndexedMatrix)
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 12.48 6.24 3.84 5.04 3.84 6.96]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103inputform.ps b/books/ps/v103inputform.ps
new file mode 100644
index 0000000..8f75926
--- /dev/null
+++ b/books/ps/v103inputform.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 120 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 120 80
+%%PageOrientation: Portrait
+gsave
+36 36 84 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+82 42 lineto
+82 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+82 42 lineto
+82 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% InputForm
+[ /Rect [ 0 0 76 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=INFORM) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 76 36 moveto
+0 36 lineto
+0 0 lineto
+76 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 76 36 moveto
+0 36 lineto
+0 0 lineto
+76 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(InputForm)
+[4.56 6.72 6.96 6.96 3.84 7.44 6.96 5.04 10.8]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103linearordinarydifferentialoperator.ps b/books/ps/v103linearordinarydifferentialoperator.ps
new file mode 100644
index 0000000..140fdfd
--- /dev/null
+++ b/books/ps/v103linearordinarydifferentialoperator.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 262 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 262 80
+%%PageOrientation: Portrait
+gsave
+36 36 226 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+224 42 lineto
+224 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+224 42 lineto
+224 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% LinearOrdinaryDifferentialOperator
+[ /Rect [ 0 0 218 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=LODO) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 218 36 moveto
+0 36 lineto
+0 0 lineto
+218 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 218 36 moveto
+0 36 lineto
+0 0 lineto
+218 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(LinearOrdinaryDifferentialOperator)
+[8.64 3.84 6.96 6.24 6.24 4.8 10.08 4.56 6.96 3.84 6.96 6.24 5.04 6.96 10.08 3.84 4.56 4.08 6.24 4.8 6.24 6.96 3.84 3.84 6.24 3.84 10.08 6.96 6.24 4.8 6.24 3.84 6.96 4.8]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103linearordinarydifferentialoperator1.ps b/books/ps/v103linearordinarydifferentialoperator1.ps
new file mode 100644
index 0000000..48736c5
--- /dev/null
+++ b/books/ps/v103linearordinarydifferentialoperator1.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 268 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 268 80
+%%PageOrientation: Portrait
+gsave
+36 36 232 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+230 42 lineto
+230 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+230 42 lineto
+230 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% LinearOrdinaryDifferentialOperator1
+[ /Rect [ 0 0 224 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=LODO1) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 224 36 moveto
+0 36 lineto
+0 0 lineto
+224 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 224 36 moveto
+0 36 lineto
+0 0 lineto
+224 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(LinearOrdinaryDifferentialOperator1)
+[8.64 3.84 6.96 6.24 6.24 4.8 10.08 4.56 6.96 3.84 6.96 6.24 5.04 6.96 10.08 3.84 4.56 4.08 6.24 4.8 6.24 6.96 3.84 3.84 6.24 3.84 10.08 6.96 6.24 4.8 6.24 3.84 6.96 4.8 6.96]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103linearordinarydifferentialoperator2.ps b/books/ps/v103linearordinarydifferentialoperator2.ps
new file mode 100644
index 0000000..681db13
--- /dev/null
+++ b/books/ps/v103linearordinarydifferentialoperator2.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 268 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 268 80
+%%PageOrientation: Portrait
+gsave
+36 36 232 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+230 42 lineto
+230 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+230 42 lineto
+230 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% LinearOrdinaryDifferentialOperator2
+[ /Rect [ 0 0 224 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=LODO2) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 224 36 moveto
+0 36 lineto
+0 0 lineto
+224 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 224 36 moveto
+0 36 lineto
+0 0 lineto
+224 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(LinearOrdinaryDifferentialOperator2)
+[8.64 3.84 6.96 6.24 6.24 4.8 10.08 4.56 6.96 3.84 6.96 6.24 5.04 6.96 10.08 3.84 4.56 4.08 6.24 4.8 6.24 6.96 3.84 3.84 6.24 3.84 10.08 6.96 6.24 4.8 6.24 3.84 6.96 4.8 6.96]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103listmultidictionary.ps b/books/ps/v103listmultidictionary.ps
new file mode 100644
index 0000000..42d381f
--- /dev/null
+++ b/books/ps/v103listmultidictionary.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 172 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 172 80
+%%PageOrientation: Portrait
+gsave
+36 36 136 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+134 42 lineto
+134 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+134 42 lineto
+134 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% ListMultiDictionary
+[ /Rect [ 0 0 128 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=LMDICT) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 36 moveto
+0 36 lineto
+0 0 lineto
+128 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 36 moveto
+0 36 lineto
+0 0 lineto
+128 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(ListMultiDictionary)
+[8.64 3.84 5.28 3.84 12.48 6.96 3.84 3.84 3.84 10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103matrix.ps b/books/ps/v103matrix.ps
new file mode 100644
index 0000000..b74dc5e
--- /dev/null
+++ b/books/ps/v103matrix.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 100 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 100 80
+%%PageOrientation: Portrait
+gsave
+36 36 64 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+62 42 lineto
+62 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+62 42 lineto
+62 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Matrix
+[ /Rect [ 0 0 56 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=MATRIX) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 56 36 moveto
+0 36 lineto
+0 0 lineto
+56 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 56 36 moveto
+0 36 lineto
+0 0 lineto
+56 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(Matrix)
+[12.48 6.24 3.84 5.04 3.84 6.96]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103modmonic.ps b/books/ps/v103modmonic.ps
new file mode 100644
index 0000000..5dffe18
--- /dev/null
+++ b/books/ps/v103modmonic.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 124 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 124 80
+%%PageOrientation: Portrait
+gsave
+36 36 88 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+86 42 lineto
+86 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+86 42 lineto
+86 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% ModMonic
+[ /Rect [ 0 0 80 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=MODMON) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 80 36 moveto
+0 36 lineto
+0 0 lineto
+80 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 80 36 moveto
+0 36 lineto
+0 0 lineto
+80 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(ModMonic)
+[12.48 6.96 6.96 12.48 6.96 6.96 3.84 6.24]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103modularfield.ps b/books/ps/v103modularfield.ps
new file mode 100644
index 0000000..c55b2b8
--- /dev/null
+++ b/books/ps/v103modularfield.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 192 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 192 80
+%%PageOrientation: Portrait
+gsave
+36 36 156 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+154 42 lineto
+154 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+154 42 lineto
+154 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% EuclideanModularRing
+[ /Rect [ 0 0 148 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=EMR) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 148 36 moveto
+0 36 lineto
+0 0 lineto
+148 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 148 36 moveto
+0 36 lineto
+0 0 lineto
+148 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(EuclideanModularRing)
+[8.64 6.96 6.24 3.84 3.84 6.96 6.24 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.24 4.8 9.36 3.84 6.96 6.96]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103modularring.ps b/books/ps/v103modularring.ps
new file mode 100644
index 0000000..747abc9
--- /dev/null
+++ b/books/ps/v103modularring.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 136 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 136 80
+%%PageOrientation: Portrait
+gsave
+36 36 100 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+98 42 lineto
+98 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+98 42 lineto
+98 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% ModularRing
+[ /Rect [ 0 0 92 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=MODRING) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 92 36 moveto
+0 36 lineto
+0 0 lineto
+92 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 92 36 moveto
+0 36 lineto
+0 0 lineto
+92 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(ModularRing)
+[12.48 6.96 6.96 6.96 3.84 6.24 4.8 9.36 3.84 6.96 6.96]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103modulemonomial.ps b/books/ps/v103modulemonomial.ps
new file mode 100644
index 0000000..2bb0f3f
--- /dev/null
+++ b/books/ps/v103modulemonomial.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 162 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 162 80
+%%PageOrientation: Portrait
+gsave
+36 36 126 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+124 42 lineto
+124 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+124 42 lineto
+124 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% ModuleMonomial
+[ /Rect [ 0 0 118 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=MODMONOM) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 118 36 moveto
+0 36 lineto
+0 0 lineto
+118 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 118 36 moveto
+0 36 lineto
+0 0 lineto
+118 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(ModuleMonomial)
+[12.48 6.96 6.96 6.96 3.84 6.24 12.48 6.96 6.96 6.96 10.8 3.84 6.24 3.84]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103moebiustransform.ps b/books/ps/v103moebiustransform.ps
new file mode 100644
index 0000000..23c47f3
--- /dev/null
+++ b/books/ps/v103moebiustransform.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 168 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 168 80
+%%PageOrientation: Portrait
+gsave
+36 36 132 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+130 42 lineto
+130 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+130 42 lineto
+130 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% MoebiusTransform
+[ /Rect [ 0 0 124 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=MOEBIUS) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 124 36 moveto
+0 36 lineto
+0 0 lineto
+124 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 124 36 moveto
+0 36 lineto
+0 0 lineto
+124 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(MoebiusTransform)
+[12.48 6.96 6.24 6.96 3.84 6.96 5.52 7.92 4.8 6.24 6.96 5.52 4.08 6.96 5.04 10.8]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103monoidring.ps b/books/ps/v103monoidring.ps
new file mode 100644
index 0000000..97cbaac
--- /dev/null
+++ b/books/ps/v103monoidring.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 132 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 132 80
+%%PageOrientation: Portrait
+gsave
+36 36 96 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+94 42 lineto
+94 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+94 42 lineto
+94 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% MonoidRing
+[ /Rect [ 0 0 88 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=MRING) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 88 36 moveto
+0 36 lineto
+0 0 lineto
+88 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 88 36 moveto
+0 36 lineto
+0 0 lineto
+88 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(MonoidRing)
+[12.48 6.96 6.96 6.96 3.84 6.96 9.36 3.84 6.96 6.96]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103multiset.ps b/books/ps/v103multiset.ps
new file mode 100644
index 0000000..bdb126f
--- /dev/null
+++ b/books/ps/v103multiset.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 108 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 108 80
+%%PageOrientation: Portrait
+gsave
+36 36 72 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+70 42 lineto
+70 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+70 42 lineto
+70 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Multiset
+[ /Rect [ 0 0 64 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=MSET) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 64 36 moveto
+0 36 lineto
+0 0 lineto
+64 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 64 36 moveto
+0 36 lineto
+0 0 lineto
+64 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(Multiset)
+[12.48 6.96 3.84 3.84 3.84 5.52 6 3.84]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103multivariatepolynomial.ps b/books/ps/v103multivariatepolynomial.ps
new file mode 100644
index 0000000..b4d53cd
--- /dev/null
+++ b/books/ps/v103multivariatepolynomial.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 194 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 194 80
+%%PageOrientation: Portrait
+gsave
+36 36 158 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+156 42 lineto
+156 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+156 42 lineto
+156 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% MultivariatePolynomial
+[ /Rect [ 0 0 150 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=MPOLY) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 150 36 moveto
+0 36 lineto
+0 0 lineto
+150 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 150 36 moveto
+0 36 lineto
+0 0 lineto
+150 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(MultivariatePolynomial)
+[12.48 6.96 3.84 3.84 3.84 6.72 6.24 5.04 3.84 6.24 3.84 6.24 7.44 6.96 3.6 6.96 6.96 6.96 10.8 3.84 6.24 3.84]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103oppositemonogeniclinearoperator.ps b/books/ps/v103oppositemonogeniclinearoperator.ps
new file mode 100644
index 0000000..22788ce
--- /dev/null
+++ b/books/ps/v103oppositemonogeniclinearoperator.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 260 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 260 80
+%%PageOrientation: Portrait
+gsave
+36 36 224 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+222 42 lineto
+222 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+222 42 lineto
+222 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OppositeMonogenicLinearOperator
+[ /Rect [ 0 0 216 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=OMLO) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 216 36 moveto
+0 36 lineto
+0 0 lineto
+216 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 216 36 moveto
+0 36 lineto
+0 0 lineto
+216 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(OppositeMonogenicLinearOperator)
+[10.08 6.96 6.96 6.96 5.52 3.84 3.84 6.24 12.48 6.96 6.96 6.96 6.72 6.24 6.96 3.84 6.24 8.64 3.84 6.96 6.24 6.24 4.8 10.08 6.96 6.24 4.8 6.24 3.84 6.96 4.8]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103ordinarydifferentialring.ps b/books/ps/v103ordinarydifferentialring.ps
new file mode 100644
index 0000000..8f6603e
--- /dev/null
+++ b/books/ps/v103ordinarydifferentialring.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 202 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 202 80
+%%PageOrientation: Portrait
+gsave
+36 36 166 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+164 42 lineto
+164 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+164 42 lineto
+164 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OrdinaryDifferentialRing
+[ /Rect [ 0 0 158 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=ODR) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 158 36 moveto
+0 36 lineto
+0 0 lineto
+158 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 158 36 moveto
+0 36 lineto
+0 0 lineto
+158 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(OrdinaryDifferentialRing)
+[10.08 4.56 6.96 3.84 6.96 6.24 5.04 6.96 10.08 3.84 4.56 4.08 6.24 4.8 6.24 6.96 3.84 3.84 6.24 3.84 9.36 3.84 6.96 6.96]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103polynomial.ps b/books/ps/v103polynomial.ps
new file mode 100644
index 0000000..0c89b02
--- /dev/null
+++ b/books/ps/v103polynomial.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 124 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 124 80
+%%PageOrientation: Portrait
+gsave
+36 36 88 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+86 42 lineto
+86 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+86 42 lineto
+86 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Polynomial
+[ /Rect [ 0 0 80 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=POLY) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 80 36 moveto
+0 36 lineto
+0 0 lineto
+80 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 80 36 moveto
+0 36 lineto
+0 0 lineto
+80 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(Polynomial)
+[7.44 6.96 3.6 6.96 6.96 6.96 10.8 3.84 6.24 3.84]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103rectangularmatrix.ps b/books/ps/v103rectangularmatrix.ps
new file mode 100644
index 0000000..f78067c
--- /dev/null
+++ b/books/ps/v103rectangularmatrix.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 166 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 166 80
+%%PageOrientation: Portrait
+gsave
+36 36 130 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+128 42 lineto
+128 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+128 42 lineto
+128 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% RectangularMatrix
+[ /Rect [ 0 0 122 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=RMATRIX) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 122 36 moveto
+0 36 lineto
+0 0 lineto
+122 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 122 36 moveto
+0 36 lineto
+0 0 lineto
+122 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(RectangularMatrix)
+[9.12 6.24 6.24 4.08 6.24 6.96 6.96 6.96 3.84 6.24 4.8 12.48 6.24 3.84 5.04 3.84 6.96]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103setofmintegersinoneton.ps b/books/ps/v103setofmintegersinoneton.ps
new file mode 100644
index 0000000..e0a245a
--- /dev/null
+++ b/books/ps/v103setofmintegersinoneton.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 208 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 208 80
+%%PageOrientation: Portrait
+gsave
+36 36 172 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+170 42 lineto
+170 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+170 42 lineto
+170 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% SetOfMIntegersInOneToN
+[ /Rect [ 0 0 164 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=SETMN) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 164 36 moveto
+0 36 lineto
+0 0 lineto
+164 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 164 36 moveto
+0 36 lineto
+0 0 lineto
+164 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(SetOfMIntegersInOneToN)
+[7.68 6 3.84 10.08 4.56 12.48 4.56 6.96 3.84 6.24 6.72 6.24 4.8 5.52 4.56 6.96 10.08 6.96 6.24 7.44 6.96 10.08]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103singletonasorderedset.ps b/books/ps/v103singletonasorderedset.ps
new file mode 100644
index 0000000..0c54f67
--- /dev/null
+++ b/books/ps/v103singletonasorderedset.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 192 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 192 80
+%%PageOrientation: Portrait
+gsave
+36 36 156 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+154 42 lineto
+154 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+154 42 lineto
+154 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% SingletonAsOrderedSet
+[ /Rect [ 0 0 148 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=SAOS) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 148 36 moveto
+0 36 lineto
+0 0 lineto
+148 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 148 36 moveto
+0 36 lineto
+0 0 lineto
+148 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(SingletonAsOrderedSet)
+[7.68 3.84 6.96 6.96 3.84 6 3.84 6.96 6.96 10.08 5.52 10.08 4.56 6.96 6.24 4.8 6.24 6.96 7.68 6 3.84]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103sparsemultivariatepolynomial.ps b/books/ps/v103sparsemultivariatepolynomial.ps
new file mode 100644
index 0000000..e5010de
--- /dev/null
+++ b/books/ps/v103sparsemultivariatepolynomial.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 230 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 230 80
+%%PageOrientation: Portrait
+gsave
+36 36 194 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+192 42 lineto
+192 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+192 42 lineto
+192 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% SparseMultivariatePolynomial
+[ /Rect [ 0 0 186 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=SMP) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 186 36 moveto
+0 36 lineto
+0 0 lineto
+186 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 186 36 moveto
+0 36 lineto
+0 0 lineto
+186 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(SparseMultivariatePolynomial)
+[7.68 6.96 6.24 4.8 5.52 6.24 12.48 6.96 3.84 3.84 3.84 6.72 6.24 5.04 3.84 6.24 3.84 6.24 7.44 6.96 3.6 6.96 6.96 6.96 10.8 3.84 6.24 3.84]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103sparsemultivariatetaylorseries.ps b/books/ps/v103sparsemultivariatetaylorseries.ps
new file mode 100644
index 0000000..c5fda05
--- /dev/null
+++ b/books/ps/v103sparsemultivariatetaylorseries.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 236 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 236 80
+%%PageOrientation: Portrait
+gsave
+36 36 200 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+198 42 lineto
+198 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+198 42 lineto
+198 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% SparseMultivariateTaylorSeries
+[ /Rect [ 0 0 192 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=SMTS) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 192 36 moveto
+0 36 lineto
+0 0 lineto
+192 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 192 36 moveto
+0 36 lineto
+0 0 lineto
+192 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(SparseMultivariateTaylorSeries)
+[7.68 6.96 6.24 4.8 5.52 6.24 12.48 6.96 3.84 3.84 3.84 6.72 6.24 5.04 3.84 6.24 3.84 6.24 7.68 5.76 6.48 3.84 6.96 4.8 7.68 6.24 5.04 3.84 6.24 5.52]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103squarematrix.ps b/books/ps/v103squarematrix.ps
new file mode 100644
index 0000000..7ebd1ed
--- /dev/null
+++ b/books/ps/v103squarematrix.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 138 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 138 80
+%%PageOrientation: Portrait
+gsave
+36 36 102 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+100 42 lineto
+100 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+100 42 lineto
+100 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% SquareMatrix
+[ /Rect [ 0 0 94 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=SQMATRIX) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 94 36 moveto
+0 36 lineto
+0 0 lineto
+94 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 94 36 moveto
+0 36 lineto
+0 0 lineto
+94 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(SquareMatrix)
+[7.68 6.72 6.96 6.24 4.8 6.24 12.48 6.24 3.84 5.04 3.84 6.96]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v103taylorseries.ps b/books/ps/v103taylorseries.ps
new file mode 100644
index 0000000..e9b78ba
--- /dev/null
+++ b/books/ps/v103taylorseries.ps
@@ -0,0 +1,248 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 130 80
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 130 80
+%%PageOrientation: Portrait
+gsave
+36 36 94 44 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+92 42 lineto
+92 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 42 lineto
+92 42 lineto
+92 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% TaylorSeries
+[ /Rect [ 0 0 86 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=TS) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 86 36 moveto
+0 36 lineto
+0 0 lineto
+86 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 86 36 moveto
+0 36 lineto
+0 0 lineto
+86 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 13 moveto
+(TaylorSeries)
+[7.68 5.76 6.48 3.84 6.96 4.8 7.68 6.24 5.04 3.84 6.24 5.52]
+xshow
+end grestore
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 7a891b5..b949a12 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,40 @@
+20081210 tpd src/input/test.input fix reference to multpoly.spad
+20081210 tpd books/Makefile set SHELL to bash to fix echo behavior in toc
+20081210 tpd src/algebra/multpoly.spad moved domains to bookvol10.3
+20081210 tpd src/algebra/Makefile remove mts.spad
+20081210 tpd src/algebra/mts.spad removed, moved domains to bookvol10.3
+20081210 tpd src/algebra/Makefile remove mset.spad
+20081210 tpd src/algebra/mset.spad removed, moved domains to bookvol10.3
+20081210 tpd src/algebra/mring.spad moved domains to bookvol10.3
+20081210 tpd src/algebra/Makefile remove moebius.spad
+20081210 tpd src/algebra/moebius.spad removed, moved domains to bookvol10.3
+20081210 tpd src/algebra/Makefile remove modring.spad
+20081210 tpd src/algebra/modring.spad removed, moved domains to bookvol10.3
+20081210 tpd src/algebra/Makefile remove modmon.spad
+20081210 tpd src/algebra/modmon.spad removed, moved domains to bookvol10.3
+20081210 tpd src/algebra/Makefile remove monmonom.spad
+20081210 tpd src/algebra/modmonom.spad removed, moved domains to bookvol10.3
+20081210 tpd src/algebra/mkfunc.spad move domains to bookvol10.3
+20081210 tpd src/algebra/Makefile remove misc.spad
+20081210 tpd src/algebra/misc.spad removed, moved domains to bookvol10.3
+20081210 tpd src/input/Makefile remove matrix.spad
+20081210 tpd src/algebra/Makefile remove matrix.spad
+20081210 tpd src/algebra/matrix.spad removed, moved domains to bookvol10.3
+20081210 tpd books/ps/v103setofmintegersinoneton.ps added
+20081210 tpd books/ps/v103ordinarydifferentialring.ps added
+20081210 tpd books/ps/v103oppositemonogeniclinearoperator.ps added
+20081210 tpd books/ps/v103listmultidictionary.ps added
+20081210 tpd books/ps/v103linearordinarydifferentialoperator2.ps added
+20081210 tpd books/ps/v103linearordinarydifferentialoperator1.ps added
+20081210 tpd books/ps/v103linearordinarydifferentialoperator.ps added
+20081210 tpd books/ps/v103directproductmodule.ps added
+20081210 tpd books/ps/v103directproductmatrixmodule.ps added
+20081210 tpd src/algebra/Makefile convert lodo help files
+20081210 tpd src/algebra/lodo.spad move domains to bookvol10.3
+20081210 tpd src/algebra/lodop.spad move domains to bookvol10.3
+20081210 tpd src/algebra/lodof.spad move domain to bookvol10.3
+20081210 tpd src/algebra/Makefile remove lmdict.spad
+20081210 tpd src/algebra/lmdict.spad removed, move domain to bookvol10.3
 20081209 tpd books/ps/v103univariatelaurentseriesconstructor.ps added
 20081209 tpd books/ps/v103univariatelaurentseries.ps added
 20081209 tpd books/ps/v103splithomogeneousdirectproduct.ps added
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index f7366c5..8c74041 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -368,8 +368,6 @@ drawpak.spad.pamphlet (DRAWCX)
 mappkg.spad.pamphlet (MAPHACK1 MAPHACK2 MAPHACK3 MAPHACK4
                       MAPPKG1 MAPPKG2 MAPPKG3 MAPPKG4)
 mesh.spad.pamphlet (MESH)
-moebius.spad.pamphlet (MOEBIUS)
-mring.spad.pamphlet (MRING MRF2)
 opalg.spad.pamphlet (MODOP OP)
 partperm.spad.pamphlet (PARTPERM)
 pgrobner.spad.pamphlet (PGROEB)
@@ -538,9 +536,6 @@ matfuns.spad.pamphlet (IMATLIN MATCAT2 RMCAT2 IMATQF MATLIN)
 mfinfact.spad.pamphlet (MFINFACT)
 mlift.spad.pamphlet (MLIST)
 moddfact.spad.pamphlet (MDDFACT)
-modmon.spad.pamphlet (MODMON)
-modring.spad.pamphlet (MODRING EMR MODFIELD)
-mts.spad.pamphlet (SMTS TS)
 multsqfr.spad.pamphlet (MULTSQFR)
 newpoint.spad.pamphlet (PTCAT POINT COMPPROP SUBSPACE PTPACK PTFUNC2)
 numtheor.spad.pamphlet (INTHEORY PNTHEORY)
@@ -756,12 +751,8 @@ intaux.spad.pamphlet (IR IR2)
 intclos.spad.pamphlet (TRIMAT IBATOOL FFINTBAS WFFINTBS NFINTBAS)
 integer.spad.pamphlet (INTSLPE INT NNI PI ROMAN)
 kl.spad.pamphlet (CACHSET SCACHE MKCHSET KERNEL KERNEL2)
-lmdict.spad.pamphlet (LMDICT)
-matrix.spad.pamphlet (IMATRIX MATRIX RMATRIX SQMATRIX)
-misc.spad.pamphlet (SAOS)
 mkfunc.spad.pamphlet (INFORM INFORM1 MKFUNC MKUCFUNC MKBCFUNC MKFLCFN)
 modgcd.spad.pamphlet (INMODGCD)
-mset.spad.pamphlet (MSET)
 multpoly.spad.pamphlet (POLY POLY2 MPOLY SMP INDE)
 newdata.spad.pamphlet (IPRNTPK TBCMPPK SPLNODE SPLTREE)
 omerror.spad.pamphlet (OMERRK OMERR)
@@ -1181,17 +1172,15 @@ SPADFILES= \
  ${OUTSRC}/laplace.spad ${OUTSRC}/laurent.spad ${OUTSRC}/leadcdet.spad \
  ${OUTSRC}/limitps.spad ${OUTSRC}/lindep.spad \
  ${OUTSRC}/lingrob.spad ${OUTSRC}/liouv.spad ${OUTSRC}/listgcd.spad \
- ${OUTSRC}/list.spad ${OUTSRC}/lmdict.spad ${OUTSRC}/lodof.spad \
+ ${OUTSRC}/list.spad ${OUTSRC}/lodof.spad \
  ${OUTSRC}/lodop.spad ${OUTSRC}/lodo.spad \
  ${OUTSRC}/manip.spad ${OUTSRC}/mappkg.spad \
  ${OUTSRC}/matfuns.spad ${OUTSRC}/mathml.spad \
- ${OUTSRC}/matrix.spad ${OUTSRC}/matstor.spad \
- ${OUTSRC}/mesh.spad ${OUTSRC}/mfinfact.spad ${OUTSRC}/misc.spad \
+ ${OUTSRC}/matstor.spad \
+ ${OUTSRC}/mesh.spad ${OUTSRC}/mfinfact.spad \
  ${OUTSRC}/mkfunc.spad ${OUTSRC}/mkrecord.spad \
  ${OUTSRC}/mlift.spad ${OUTSRC}/moddfact.spad ${OUTSRC}/modgcd.spad \
- ${OUTSRC}/modmonom.spad ${OUTSRC}/modmon.spad ${OUTSRC}/modring.spad \
- ${OUTSRC}/moebius.spad ${OUTSRC}/mring.spad ${OUTSRC}/mset.spad \
- ${OUTSRC}/mts.spad ${OUTSRC}/multfact.spad ${OUTSRC}/multpoly.spad \
+ ${OUTSRC}/multfact.spad ${OUTSRC}/multpoly.spad \
  ${OUTSRC}/multsqfr.spad \
  ${OUTSRC}/naalg.spad \
  ${OUTSRC}/newdata.spad ${OUTSRC}/newpoint.spad \
@@ -1337,17 +1326,15 @@ DOCFILES= \
  ${DOC}/laplace.spad.dvi ${DOC}/laurent.spad.dvi ${DOC}/leadcdet.spad.dvi \
  ${DOC}/limitps.spad.dvi ${DOC}/lindep.spad.dvi \
  ${DOC}/lingrob.spad.dvi ${DOC}/liouv.spad.dvi ${DOC}/listgcd.spad.dvi \
- ${DOC}/list.spad.dvi ${DOC}/lmdict.spad.dvi ${DOC}/lodof.spad.dvi \
+ ${DOC}/list.spad.dvi ${DOC}/lodof.spad.dvi \
  ${DOC}/lodop.spad.dvi ${DOC}/lodo.spad.dvi \
  ${DOC}/manip.spad.dvi ${DOC}/mappkg.spad.dvi \
  ${DOC}/matfuns.spad.dvi ${DOC}/mathml.spad.dvi \
- ${DOC}/matrix.spad.dvi ${DOC}/matstor.spad.dvi \
- ${DOC}/mesh.spad.dvi ${DOC}/mfinfact.spad.dvi ${DOC}/misc.spad.dvi \
+ ${DOC}/matstor.spad.dvi \
+ ${DOC}/mesh.spad.dvi ${DOC}/mfinfact.spad.dvi \
  ${DOC}/mkfunc.spad.dvi ${DOC}/mkrecord.spad.dvi ${DOC}/mlift.spad.jhd.dvi \
  ${DOC}/mlift.spad.dvi ${DOC}/moddfact.spad.dvi ${DOC}/modgcd.spad.dvi \
- ${DOC}/modmonom.spad.dvi ${DOC}/modmon.spad.dvi ${DOC}/modring.spad.dvi \
- ${DOC}/moebius.spad.dvi ${DOC}/mring.spad.dvi ${DOC}/mset.spad.dvi \
- ${DOC}/mts.spad.dvi ${DOC}/multfact.spad.dvi ${DOC}/multpoly.spad.dvi \
+ ${DOC}/multfact.spad.dvi ${DOC}/multpoly.spad.dvi \
  ${DOC}/multsqfr.spad.dvi \
  ${DOC}/naalg.spad.dvi ${DOC}/ndftip.as.dvi \
  ${DOC}/nepip.as.dvi ${DOC}/newdata.spad.dvi ${DOC}/newpoint.spad.dvi \
@@ -1943,12 +1930,13 @@ which is essentially a list of all of the algebra help files. Each item
 in this list refers to a stanza that looks like:
 
 \begin{verbatim}
-${HELP}/AssociationList.help: ${IN}/list.spad.pamphlet
-	@echo 7000 create AssociationList.help from ${IN}/list.spad.pamphlet
-	@${TANGLE} -R"AssociationList.help" ${IN}/list.spad.pamphlet \
+${HELP}/AssociationList.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7000 create AssociationList.help from \
+           ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"AssociationList.help" ${BOOKS}/bookvol10.3.pamphlet \
             >${HELP}/AssociationList.help
 	@cp ${HELP}/AssociationList.help ${HELP}/ALIST.help
-	@${TANGLE} -R"AssociationList.input" ${IN}/list.spad.pamphlet \
+	@${TANGLE} -R"AssociationList.input" ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/AssociationList.input
 \end{verbatim}
 
@@ -2148,12 +2136,13 @@ all: ${REGRESS}
 	@echo algebra test cases complete.
 @
 <<spadhelp>>=
-${HELP}/AssociationList.help: ${IN}/list.spad.pamphlet
-	@echo 7000 create AssociationList.help from ${IN}/list.spad.pamphlet
-	@${TANGLE} -R"AssociationList.help" ${IN}/list.spad.pamphlet \
+${HELP}/AssociationList.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7000 create AssociationList.help from \
+           ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"AssociationList.help" ${BOOKS}/bookvol10.3.pamphlet \
             >${HELP}/AssociationList.help
 	@cp ${HELP}/AssociationList.help ${HELP}/ALIST.help
-	@${TANGLE} -R"AssociationList.input" ${IN}/list.spad.pamphlet \
+	@${TANGLE} -R"AssociationList.input" ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/AssociationList.input
 
 ${HELP}/BalancedBinaryTree.help: ${IN}/tree.spad.pamphlet
@@ -2231,12 +2220,12 @@ ${HELP}/CliffordAlgebra.help: ${BOOKS}/bookvol10.3.pamphlet
 	@${TANGLE} -R"CliffordAlgebra.input" ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/CliffordAlgebra.input
 
-${HELP}/Complex.help: ${IN}/gaussian.spad.pamphlet
-	@echo 7010 create Complex.help from ${IN}/gaussian.spad.pamphlet
-	@${TANGLE} -R"Complex.help" ${IN}/gaussian.spad.pamphlet \
+${HELP}/Complex.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7010 create Complex.help from ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"Complex.help" ${BOOKS}/bookvol10.3.pamphlet \
             >${HELP}/Complex.help
 	@-cp ${HELP}/Complex.help ${HELP}/COMPLEX.help
-	@${TANGLE} -R"Complex.input" ${IN}/gaussian.spad.pamphlet \
+	@${TANGLE} -R"Complex.input" ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/Complex.input
 
 ${HELP}/ContinuedFraction.help: ${BOOKS}/bookvol10.3.pamphlet
@@ -2447,12 +2436,12 @@ ${HELP}/HomogeneousDistributedMultivariatePolynomial.help: \
            ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/HomogeneousDistributedMultivariatePolynomial.input
 
-${HELP}/Integer.help: ${IN}/integer.spad.pamphlet
-	@echo 7033 create Integer.help from ${IN}/integer.spad.pamphlet
-	@${TANGLE} -R"Integer.help" ${IN}/integer.spad.pamphlet \
+${HELP}/Integer.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7033 create Integer.help from ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"Integer.help" ${BOOKS}/bookvol10.3.pamphlet \
            >${HELP}/Integer.help
 	@cp ${HELP}/Integer.help ${HELP}/INT.help
-	@${TANGLE} -R"Integer.input" ${IN}/integer.spad.pamphlet \
+	@${TANGLE} -R"Integer.input" ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/Integer.input
 
 ${HELP}/IntegerLinearDependence.help: ${IN}/lindep.spad.pamphlet
@@ -2478,12 +2467,12 @@ ${HELP}/IntegerNumberTheoryFunctions.help: ${IN}/numtheor.spad.pamphlet
            ${IN}/numtheor.spad.pamphlet \
             >${INPUT}/IntegerNumberTheoryFunctions.input
 
-${HELP}/Kernel.help: ${IN}/kl.spad.pamphlet
-	@echo 7036 create Kernel.help from ${IN}/kl.spad.pamphlet
-	@${TANGLE} -R"Kernel.help" ${IN}/kl.spad.pamphlet \
+${HELP}/Kernel.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7036 create Kernel.help from ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"Kernel.help" ${BOOKS}/bookvol10.3.pamphlet \
            >${HELP}/Kernel.help
 	@-cp ${HELP}/Kernel.help ${HELP}/KERNEL.help
-	@${TANGLE} -R"Kernel.input" ${IN}/kl.spad.pamphlet \
+	@${TANGLE} -R"Kernel.input" ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/Kernel.input
 
 ${HELP}/KeyedAccessFile.help: ${BOOKS}/bookvol10.3.pamphlet
@@ -2528,45 +2517,47 @@ ${HELP}/LiePolynomial.help: ${IN}/xlpoly.spad.pamphlet
 	@${TANGLE} -R"LiePolynomial.input" ${IN}/xlpoly.spad.pamphlet \
             >${INPUT}/LiePolynomial.input
 
-${HELP}/LinearOrdinaryDifferentialOperator.help: ${IN}/lodo.spad.pamphlet
+${HELP}/LinearOrdinaryDifferentialOperator.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7042 create LinearOrdinaryDifferentialOperator.help \
-           from ${IN}/lodo.spad.pamphlet
+           from ${BOOKS}/bookvol10.3.pamphlet
 	@${TANGLE} -R"LinearOrdinaryDifferentialOperator.help" \
-          ${IN}/lodo.spad.pamphlet \
+          ${BOOKS}/bookvol10.3.pamphlet \
            >${HELP}/LinearOrdinaryDifferentialOperator.help
 	@cp ${HELP}/LinearOrdinaryDifferentialOperator.help ${HELP}/LODO.help
 	@${TANGLE} -R"LinearOrdinaryDifferentialOperator.input" \
-           ${IN}/lodo.spad.pamphlet \
+           ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/LinearOrdinaryDifferentialOperator.input
 
-${HELP}/LinearOrdinaryDifferentialOperator1.help: ${IN}/lodo.spad.pamphlet
+${HELP}/LinearOrdinaryDifferentialOperator1.help: \
+      ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7043 create LinearOrdinaryDifferentialOperator1.help \
-           from ${IN}/lodo.spad.pamphlet
+           from ${BOOKS}/bookvol10.3.pamphlet
 	@${TANGLE} -R"LinearOrdinaryDifferentialOperator1.help" \
-          ${IN}/lodo.spad.pamphlet \
+          ${BOOKS}/bookvol10.3.pamphlet \
            >${HELP}/LinearOrdinaryDifferentialOperator1.help
 	@cp ${HELP}/LinearOrdinaryDifferentialOperator1.help ${HELP}/LODO1.help
 	@${TANGLE} -R"LinearOrdinaryDifferentialOperator1.input" \
-           ${IN}/lodo.spad.pamphlet \
+           ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/LinearOrdinaryDifferentialOperator1.input
 
-${HELP}/LinearOrdinaryDifferentialOperator2.help: ${IN}/lodo.spad.pamphlet
+${HELP}/LinearOrdinaryDifferentialOperator2.help: \
+     ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7044 create LinearOrdinaryDifferentialOperator2.help \
-           from ${IN}/lodo.spad.pamphlet
+           from ${BOOKS}/bookvol10.3.pamphlet
 	@${TANGLE} -R"LinearOrdinaryDifferentialOperator2.help" \
-          ${IN}/lodo.spad.pamphlet \
+          ${BOOKS}/bookvol10.3.pamphlet \
            >${HELP}/LinearOrdinaryDifferentialOperator2.help
 	@cp ${HELP}/LinearOrdinaryDifferentialOperator2.help ${HELP}/LODO2.help
 	@${TANGLE} -R"LinearOrdinaryDifferentialOperator2.input" \
-           ${IN}/lodo.spad.pamphlet \
+           ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/LinearOrdinaryDifferentialOperator2.input
 
-${HELP}/List.help: ${IN}/list.spad.pamphlet
-	@echo 7045 create List.help from ${IN}/list.spad.pamphlet
-	@${TANGLE} -R"List.help" ${IN}/list.spad.pamphlet \
+${HELP}/List.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7045 create List.help from ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"List.help" ${BOOKS}/bookvol10.3.pamphlet \
            >${HELP}/List.help
 	@-cp ${HELP}/List.help ${HELP}/LIST.help
-	@${TANGLE} -R"List.input" ${IN}/list.spad.pamphlet \
+	@${TANGLE} -R"List.input" ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/List.input
 
 ${HELP}/LyndonWord.help: ${IN}/xlpoly.spad.pamphlet
@@ -2617,31 +2608,31 @@ ${HELP}/MappingPackage3.help: ${IN}/mappkg.spad.pamphlet
 	@${TANGLE} -R"MappingPackage3.input" ${IN}/mappkg.spad.pamphlet \
             >${INPUT}/MappingPackage3.input
 
-${HELP}/Matrix.help: ${IN}/matrix.spad.pamphlet
-	@echo 7052 create Matrix.help from ${IN}/matrix.spad.pamphlet
-	@${TANGLE} -R"Matrix.help" ${IN}/matrix.spad.pamphlet \
+${HELP}/Matrix.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7052 create Matrix.help from ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"Matrix.help" ${BOOKS}/bookvol10.3.pamphlet \
            >${HELP}/Matrix.help
 	@-cp ${HELP}/Matrix.help ${HELP}/MATRIX.help
-	@${TANGLE} -R"Matrix.input" ${IN}/matrix.spad.pamphlet \
+	@${TANGLE} -R"Matrix.input" ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/Matrix.input
 
-${HELP}/Multiset.help: ${IN}/mset.spad.pamphlet
-	@echo 7053 create Multiset.help from ${IN}/mset.spad.pamphlet
-	@${TANGLE} -R"Multiset.help" ${IN}/mset.spad.pamphlet \
+${HELP}/Multiset.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7053 create Multiset.help from ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"Multiset.help" ${BOOKS}/bookvol10.3.pamphlet \
            >${HELP}/Multiset.help
 	@cp ${HELP}/Multiset.help ${HELP}/MSET.help
-	@${TANGLE} -R"Multiset.input" ${IN}/mset.spad.pamphlet \
+	@${TANGLE} -R"Multiset.input" ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/Multiset.input
 
-${HELP}/MultivariatePolynomial.help: ${IN}/multpoly.spad.pamphlet
+${HELP}/MultivariatePolynomial.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7054 create MultivariatePolynomial.help from \
-           ${IN}/multpoly.spad.pamphlet
+           ${BOOKS}/bookvol10.3.pamphlet
 	@${TANGLE} -R"MultivariatePolynomial.help" \
-           ${IN}/multpoly.spad.pamphlet \
+           ${BOOKS}/bookvol10.3.pamphlet \
            >${HELP}/MultivariatePolynomial.help
 	@cp ${HELP}/MultivariatePolynomial.help ${HELP}/MPOLY.help
 	@${TANGLE} -R"MultivariatePolynomial.input" \
-            ${IN}/multpoly.spad.pamphlet \
+            ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/MultivariatePolynomial.input
 
 ${HELP}/None.help: ${BOOKS}/bookvol10.3.pamphlet
@@ -2739,12 +2730,12 @@ ${HELP}/Plot.help: ${IN}/plot.spad.pamphlet
 	@-cp ${HELP}/Plot.help ${HELP}/PLOT.help
 	@${TANGLE} -R"Plot.input" ${IN}/plot.spad.pamphlet >${INPUT}/Plot.input
 
-${HELP}/Polynomial.help: ${IN}/multpoly.spad.pamphlet
-	@echo 7065 create Polynomial.help from ${IN}/multpoly.spad.pamphlet
-	@${TANGLE} -R"Polynomial.help" ${IN}/multpoly.spad.pamphlet \
+${HELP}/Polynomial.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7065 create Polynomial.help from ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"Polynomial.help" ${BOOKS}/bookvol10.3.pamphlet \
            >${HELP}/Polynomial.help
 	@cp ${HELP}/Polynomial.help ${HELP}/POLY.help
-	@${TANGLE} -R"Polynomial.input" ${IN}/multpoly.spad.pamphlet \
+	@${TANGLE} -R"Polynomial.input" ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/Polynomial.input
 
 ${HELP}/Quaternion.help: ${IN}/quat.spad.pamphlet
@@ -2788,12 +2779,12 @@ ${HELP}/RegularTriangularSet.help: ${IN}/regset.spad.pamphlet
 	@${TANGLE} -R"RegularTriangularSet.input" ${IN}/regset.spad.pamphlet \
             >${INPUT}/RegularTriangularSet.input
 
-${HELP}/RomanNumeral.help: ${IN}/integer.spad.pamphlet
-	@echo 7071 create RomanNumeral.help from ${IN}/integer.spad.pamphlet
-	@${TANGLE} -R"RomanNumeral.help" ${IN}/integer.spad.pamphlet \
+${HELP}/RomanNumeral.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7071 create RomanNumeral.help from ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"RomanNumeral.help" ${BOOKS}/bookvol10.3.pamphlet \
            >${HELP}/RomanNumeral.help
 	@cp ${HELP}/RomanNumeral.help ${HELP}/ROMAN.help
-	@${TANGLE} -R"RomanNumeral.input" ${IN}/integer.spad.pamphlet \
+	@${TANGLE} -R"RomanNumeral.input" ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/RomanNumeral.input
 
 ${HELP}/Segment.help: ${IN}/seg.spad.pamphlet
@@ -2828,12 +2819,12 @@ ${HELP}/SparseTable.help: ${IN}/table.spad.pamphlet
 	@${TANGLE} -R"SparseTable.input" ${IN}/table.spad.pamphlet \
             >${INPUT}/SparseTable.input
 
-${HELP}/SquareMatrix.help: ${IN}/matrix.spad.pamphlet
-	@echo 7076 create SquareMatrix.help from ${IN}/matrix.spad.pamphlet
-	@${TANGLE} -R"SquareMatrix.help" ${IN}/matrix.spad.pamphlet \
+${HELP}/SquareMatrix.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7076 create SquareMatrix.help from ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"SquareMatrix.help" ${BOOKS}/bookvol10.3.pamphlet \
            >${HELP}/SquareMatrix.help
 	@cp ${HELP}/SquareMatrix.help ${HELP}/SQMATRIX.help
-	@${TANGLE} -R"SquareMatrix.input" ${IN}/matrix.spad.pamphlet \
+	@${TANGLE} -R"SquareMatrix.input" ${BOOKS}/bookvol10.3.pamphlet \
             >${INPUT}/SquareMatrix.input
 
 ${HELP}/SquareFreeRegularTriangularSet.help: ${IN}/sregset.spad.pamphlet
diff --git a/src/algebra/lmdict.spad.pamphlet b/src/algebra/lmdict.spad.pamphlet
deleted file mode 100644
index cba196e..0000000
--- a/src/algebra/lmdict.spad.pamphlet
+++ /dev/null
@@ -1,200 +0,0 @@
-\documentclass{article}
-\usepackage{axiom}
-\begin{document}
-\title{\$SPAD/src/algebra lmdict.spad}
-\author{Michael Monagan, Frederic Lehobey}
-\maketitle
-\begin{abstract}
-\end{abstract}
-\eject
-\tableofcontents
-\eject
-\section{domain LMDICT ListMultiDictionary}
-<<domain LMDICT ListMultiDictionary>>=
-)abbrev domain LMDICT ListMultiDictionary
-++ Author: MBM Nov/87, MB Oct/89
-++ Date Created:
-++ Date Last Updated: 13 June 1994 Frederic Lehobey
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description: The \spadtype{ListMultiDictionary} domain implements a
-++ dictionary with duplicates
-++ allowed.  The representation is a list with duplicates represented
-++ explicitly.  Hence most operations will be relatively inefficient
-++ when the number of entries in the dictionary becomes large.
--- The operations \spadfun{pick}, \spadfun{count} and \spadfun{delete} can be used to iterate
--- over the objects in the dictionary.
--- [FDLL : those functions have not been implemented in the parent Categories]
-++ If the objects in the
-++ dictionary belong to an ordered set, the entries are maintained in
-++ ascending order.
-
-NNI ==> NonNegativeInteger
-D ==> Record(entry:S, count:NonNegativeInteger)
-
-ListMultiDictionary(S:SetCategory): MultiDictionary(S) with
-   finiteAggregate
-   duplicates?: % -> Boolean
-     ++ duplicates?(d) tests if dictionary d has duplicate entries.
-   substitute : (S, S, %) -> %
-     ++ substitute(x,y,d) replace x's with y's in dictionary d.
- == add
-   Rep := Reference List S
-
-   sub: (S, S, S) -> S
-
-   coerce(s:%):OutputForm ==
-     prefix("dictionary"::OutputForm, [x::OutputForm for x in parts s])
-
-   #s                 == # parts s
-   copy s             == dictionary copy parts s
-   empty? s           == empty? parts s
-   bag l              == dictionary l
-   dictionary()       == dictionary empty()
-
-   empty():% == ref empty()
-
-   dictionary(ls:List S):% ==
-     empty? ls => empty()
-     lmd := empty()
-     for x in ls repeat insert_!(x,lmd)
-     lmd
-
-   if S has ConvertibleTo InputForm then
-     convert(lmd:%):InputForm ==
-       convert [convert("dictionary"::Symbol)@InputForm,
-        convert(parts lmd)@InputForm]
-
-   map(f, s)          == dictionary map(f, parts s)
-   map_!(f, s)        == dictionary map_!(f, parts s)
-   parts s            == deref s
-   sub(x, y, z)       == (z = x => y; z)
-   insert_!(x, s, n)  == (for i in 1..n repeat insert_!(x, s); s)
-   substitute(x, y, s) == dictionary map(sub(x, y, #1), parts s)
-   removeDuplicates_! s == dictionary removeDuplicates_! parts s
-
-   inspect s ==
-     empty? s => error "empty dictionary"
-     first parts s
-
-   extract_! s ==
-     empty? s => error "empty dictionary"
-     x := first(p := parts s)
-     setref(s, rest p)
-     x
-
-   duplicates? s ==
-     empty?(p := parts s) => false
-     q := rest p
-     while not empty? q repeat
-       first p = first q => return true
-       p := q
-       q := rest q
-     false
-
-   remove_!(p: S->Boolean, lmd:%):% ==
-     for x in removeDuplicates parts lmd | p(x) repeat remove_!(x,lmd)
-     lmd
-
-   select_!(p: S->Boolean, lmd:%):% == remove_!(not p(#1), lmd)
-
-   duplicates(lmd:%):List D ==
-     ld: List D := empty()
-     for x in removeDuplicates parts lmd | (n := count(x, lmd)) >
-      1$NonNegativeInteger repeat
-       ld := cons([x, n], ld)
-     ld
-
-   if S has OrderedSet then
-      s = t == parts s = parts t
-
-      remove_!(x:S, s:%) ==
-         p := deref s
-         while not empty? p and x = first p repeat p := rest p
-         setref(s, p)
-         empty? p => s
-         q := rest p
-         while not empty? q and x > first q repeat (p := q; q := rest q)
-         while not empty? q and x = first q repeat q := rest q
-         p.rest := q
-         s
-
-      insert_!(x, s) ==
-         p := deref s
-         empty? p or x < first p =>
-            setref(s, concat(x, p))
-            s
-         q := rest p
-         while not empty? q and x > first q repeat (p := q; q := rest q)
-         p.rest := concat(x, q)
-         s
-
-   else
-      remove_!(x:S, s:%) == (setref(s, remove_!(x, parts s)); s)
-
-      s = t ==
-         a := copy s
-         while not empty? a repeat
-            x := inspect a
-            count(x, s) ^= count(x, t) => return false
-            remove_!(x, a)
-         true
-
-      insert_!(x, s) ==
-         p := deref s
-         while not empty? p repeat
-            x = first p =>
-               p.rest := concat(x, rest p)
-               s
-            p := rest p
-         setref(s, concat(x, deref s))
-         s
-
-@
-\section{License}
-<<license>>=
---Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
---All rights reserved.
---
---Redistribution and use in source and binary forms, with or without
---modification, are permitted provided that the following conditions are
---met:
---
---    - Redistributions of source code must retain the above copyright
---      notice, this list of conditions and the following disclaimer.
---
---    - Redistributions in binary form must reproduce the above copyright
---      notice, this list of conditions and the following disclaimer in
---      the documentation and/or other materials provided with the
---      distribution.
---
---    - Neither the name of The Numerical ALgorithms Group Ltd. nor the
---      names of its contributors may be used to endorse or promote products
---      derived from this software without specific prior written permission.
---
---THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
---IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
---TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
---PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
---OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
---EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
---PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
---PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
---LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
---NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
---SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-@
-<<*>>=
-<<license>>
-
-<<domain LMDICT ListMultiDictionary>>
-@
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} nothing
-\end{thebibliography}
-\end{document}
diff --git a/src/algebra/lodo.spad.pamphlet b/src/algebra/lodo.spad.pamphlet
index fd3136a..939f355 100644
--- a/src/algebra/lodo.spad.pamphlet
+++ b/src/algebra/lodo.spad.pamphlet
@@ -113,1498 +113,6 @@ LinearOrdinaryDifferentialOperatorsOps(A, L): Exports == Implementation where
             p
 
 @
-\section{domain LODO LinearOrdinaryDifferentialOperator}
-<<LinearOrdinaryDifferentialOperator.input>>=
--- lodo.spad.pamphlet LinearOrdinaryDifferentialOperator.input
-)spool LinearOrdinaryDifferentialOperator.output
-)set message test on
-)set message auto off
-)clear all
---S 1 of 16
-Dx: LODO(EXPR INT, f +-> D(f, x))
---R 
---R                                                                   Type: Void
---E 1
-
---S 2 of 16
-Dx := D()
---R 
---R
---R   (2)  D
---IType: LinearOrdinaryDifferentialOperator(Expression Integer,theMap LAMBDA-CLOSURE(NIL,NIL,NIL,G1404 envArg,SPADCALL(G1404,QUOTE x,ELT(*1;anonymousFunction;0;frame0;internal;MV,0))))
---E 2
-
---S 3 of 16
-Dop:= Dx^3 + G/x^2*Dx + H/x^3 - 1
---R 
---R
---R                       3
---R         3    G     - x  + H
---R   (3)  D  + -- D + --------
---R              2         3
---R             x         x
---IType: LinearOrdinaryDifferentialOperator(Expression Integer,theMap LAMBDA-CLOSURE(NIL,NIL,NIL,G1404 envArg,SPADCALL(G1404,QUOTE x,ELT(*1;anonymousFunction;0;frame0;internal;MV,0))))
---E 3
-
---S 4 of 16
-n == 3
---R 
---R                                                                   Type: Void
---E 4
-
---S 5 of 16
-phi == reduce(+,[subscript(s,[i])*exp(x)/x^i for i in 0..n])
---R 
---R                                                                   Type: Void
---E 5
-
---S 6 of 16
-phi1 ==  Dop(phi) / exp x
---R 
---R                                                                   Type: Void
---E 6
-
---S 7 of 16
-phi2 == phi1 *x**(n+3)
---R 
---R                                                                   Type: Void
---E 7
-
---S 8 of 16
-phi3 == retract(phi2)@(POLY INT)
---R 
---R                                                                   Type: Void
---E 8
-
---S 9 of 16
-pans == phi3 ::UP(x,POLY INT)
---R 
---R                                                                   Type: Void
---E 9
-
---S 10 of 16
-pans1 == [coefficient(pans, (n+3-i) :: NNI) for i in 2..n+1]
---R 
---R                                                                   Type: Void
---E 10
-
---S 11 of 16
-leq == solve(pans1,[subscript(s,[i]) for i in 1..n])
---R 
---R                                                                   Type: Void
---E 11
-
---S 12 of 16
-leq
---R 
---R   Compiling body of rule n to compute value of type PositiveInteger 
---R   Compiling body of rule phi to compute value of type Expression 
---R      Integer 
---R   Compiling body of rule phi1 to compute value of type Expression 
---R      Integer 
---R   Compiling body of rule phi2 to compute value of type Expression 
---R      Integer 
---R   Compiling body of rule phi3 to compute value of type Polynomial 
---R      Integer 
---R   Compiling body of rule pans to compute value of type 
---R      UnivariatePolynomial(x,Polynomial Integer) 
---R   Compiling body of rule pans1 to compute value of type List 
---R      Polynomial Integer 
---R   Compiling body of rule leq to compute value of type List List 
---R      Equation Fraction Polynomial Integer 
---I   Compiling function G3349 with type Integer -> Boolean 
---R
---R   (12)
---R                           2                                3        2
---R         s G     3s H + s G  + 6s G     (9s G + 54s )H + s G  + 18s G  + 72s G
---R          0        0     0       0         0       0      0        0        0
---R   [[s = ---,s = ------------------,s = --------------------------------------]]
---R      1   3   2          18          3                    162
---R                         Type: List List Equation Fraction Polynomial Integer
---E 12
-
---S 13 of 16
-n==4
---R 
---R   Compiled code for n has been cleared.
---R   Compiled code for leq has been cleared.
---R   Compiled code for pans1 has been cleared.
---R   Compiled code for phi2 has been cleared.
---R   Compiled code for phi has been cleared.
---R   Compiled code for phi3 has been cleared.
---R   Compiled code for phi1 has been cleared.
---R   Compiled code for pans has been cleared.
---R   1 old definition(s) deleted for function or rule n 
---R                                                                   Type: Void
---E 13
-
---S 14 of 16
-leq
---R 
---R   Compiling body of rule n to compute value of type PositiveInteger 
---R   Compiling body of rule phi to compute value of type Expression 
---R      Integer 
---R   Compiling body of rule phi1 to compute value of type Expression 
---R      Integer 
---R   Compiling body of rule phi2 to compute value of type Expression 
---R      Integer 
---R   Compiling body of rule phi3 to compute value of type Polynomial 
---R      Integer 
---R   Compiling body of rule pans to compute value of type 
---R      UnivariatePolynomial(x,Polynomial Integer) 
---R   Compiling body of rule pans1 to compute value of type List 
---R      Polynomial Integer 
---R   Compiling body of rule leq to compute value of type List List 
---R      Equation Fraction Polynomial Integer 
---R
---R   (14)
---R   [
---R                             2
---R          s G      3s H + s G  + 6s G
---R           0         0     0       0
---R     [s = ---, s = ------------------,
---R       1   3    2          18
---R                              3        2
---R          (9s G + 54s )H + s G  + 18s G  + 72s G
---R             0       0      0        0        0
---R      s = --------------------------------------,
---R       3                    162
---R
---R       s  =
---R        4
---R                  2         2                          4        3         2
---R             27s H  + (18s G  + 378s G + 1296s )H + s G  + 36s G  + 396s G
---R                0         0         0         0      0        0         0
---R           + 
---R             1296s G
---R                  0
---R        /
---R           1944
---R       ]
---R     ]
---R                         Type: List List Equation Fraction Polynomial Integer
---E 14
-
---S 15 of 16
-n==7
---R 
---R   Compiled code for n has been cleared.
---R   Compiled code for leq has been cleared.
---R   Compiled code for pans1 has been cleared.
---R   Compiled code for phi2 has been cleared.
---R   Compiled code for phi has been cleared.
---R   Compiled code for phi3 has been cleared.
---R   Compiled code for phi1 has been cleared.
---R   Compiled code for pans has been cleared.
---R   1 old definition(s) deleted for function or rule n 
---R                                                                   Type: Void
---E 15
-
---S 16 of 16
-leq
---R 
---R   Compiling body of rule n to compute value of type PositiveInteger 
---R   Compiling body of rule phi to compute value of type Expression 
---R      Integer 
---R   Compiling body of rule phi1 to compute value of type Expression 
---R      Integer 
---R   Compiling body of rule phi2 to compute value of type Expression 
---R      Integer 
---R   Compiling body of rule phi3 to compute value of type Polynomial 
---R      Integer 
---R   Compiling body of rule pans to compute value of type 
---R      UnivariatePolynomial(x,Polynomial Integer) 
---R   Compiling body of rule pans1 to compute value of type List 
---R      Polynomial Integer 
---R   Compiling body of rule leq to compute value of type List List 
---R      Equation Fraction Polynomial Integer 
---R
---R   (16)
---R   [
---R                             2
---R          s G      3s H + s G  + 6s G
---R           0         0     0       0
---R     [s = ---, s = ------------------,
---R       1   3    2          18
---R                              3        2
---R          (9s G + 54s )H + s G  + 18s G  + 72s G
---R             0       0      0        0        0
---R      s = --------------------------------------,
---R       3                    162
---R
---R       s  =
---R        4
---R                  2         2                          4        3         2
---R             27s H  + (18s G  + 378s G + 1296s )H + s G  + 36s G  + 396s G
---R                0         0         0         0      0        0         0
---R           + 
---R             1296s G
---R                  0
---R        /
---R           1944
---R       ,
---R
---R       s  =
---R        5
---R                               2         3          2
---R             (135s G + 2268s )H  + (30s G  + 1350s G  + 16416s G + 38880s )H
---R                  0         0          0          0           0          0
---R           + 
---R                5        4          3          2
---R             s G  + 60s G  + 1188s G  + 9504s G  + 25920s G
---R              0        0          0          0           0
---R        /
---R           29160
---R       ,
---R
---R       s  =
---R        6
---R                   3          2                        2
---R             405s H  + (405s G  + 18468s G + 174960s )H
---R                 0          0           0           0
---R           + 
---R                   4          3           2                                6
---R             (45s G  + 3510s G  + 88776s G  + 777600s G + 1166400s )H + s G
---R                 0          0           0            0            0      0
---R           + 
---R                  5          4           3           2
---R             90s G  + 2628s G  + 27864s G  + 90720s G
---R                0          0           0           0
---R        /
---R           524880
---R       ,
---R
---R       s  =
---R        7
---R                                 3
---R             (2835s G + 91854s )H
---R                   0          0
---R           + 
---R                    3           2                            2
---R             (945s G  + 81648s G  + 2082996s G + 14171760s )H
---R                  0           0             0             0
---R           + 
---R                   5          4            3             2
---R             (63s G  + 7560s G  + 317520s G  + 5554008s G  + 34058880s G)H
---R                 0          0            0             0              0
---R           + 
---R                7         6          5           4             3              2
---R             s G  + 126s G  + 4788s G  + 25272s G  - 1744416s G  - 26827200s G
---R              0         0          0           0             0              0
---R           + 
---R             - 97977600s G
---R                        0
---R        /
---R           11022480
---R       ]
---R     ]
---R                         Type: List List Equation Fraction Polynomial Integer
---E 16
-)spool
- 
-Dx: LODO(EXPR INT, f +-> D(f, x))
-Dx := D()
-Dop:= Dx^3 + G/x^2*Dx + H/x^3 - 1
-n == 3
-phi == reduce(+,[subscript(s,[i])*exp(x)/x^i for i in 0..n])
-phi1 ==  Dop(phi) / exp x
-phi2 == phi1 *x**(n+3)
-phi3 == retract(phi2)@(POLY INT)
-pans == phi3 ::UP(x,POLY INT)
-pans1 == [coefficient(pans, (n+3-i) :: NNI) for i in 2..n+1]
-leq == solve(pans1,[subscript(s,[i]) for i in 1..n])
-leq
-n==4
-leq
-n==7
-leq
-)spool
-)lisp (bye)
-@
-<<LinearOrdinaryDifferentialOperator.help>>=
-====================================================================
-LinearOrdinaryDifferentialOperator examples
-====================================================================
-
-LinearOrdinaryDifferentialOperator(A, diff) is the domain of linear
-ordinary differential operators with coefficients in a ring A with a
-given derivation.
-
-====================================================================
-Differential Operators with Series Coefficients
-====================================================================
-
-Problem:
-  Find the first few coefficients of exp(x)/x^i of Dop phi where
-
-    Dop := D^3 + G/x^2 * D + H/x^3 - 1
-    phi := sum(s[i]*exp(x)/x^i, i = 0..)
-
-Solution:
-
-Define the differential.
-
-  Dx: LODO(EXPR INT, f +-> D(f, x))
-                         Type: Void
-
-  Dx := D()
-   D
-     Type: LinearOrdinaryDifferentialOperator(Expression Integer,
-      theMap LAMBDA-CLOSURE(NIL,NIL,NIL,G1404 envArg,
-              SPADCALL(G1404,QUOTE x,
-               ELT(*1;anonymousFunction;0;frame0;internal;MV,0))))
-
-Now define the differential operator Dop.
-
-  Dop:= Dx^3 + G/x^2*Dx + H/x^3 - 1
-                       3
-     3    G     - x  + H
-    D  + -- D + --------
-          2         3
-         x         x
-     Type: LinearOrdinaryDifferentialOperator(Expression Integer,
-      theMap LAMBDA-CLOSURE(NIL,NIL,NIL,G1404 envArg,
-              SPADCALL(G1404,QUOTE x,
-               ELT(*1;anonymousFunction;0;frame0;internal;MV,0))))
-
-  n == 3
-                          Type: Void
-
-  phi == reduce(+,[subscript(s,[i])*exp(x)/x^i for i in 0..n])
-                          Type: Void
-
-  phi1 ==  Dop(phi) / exp x
-                          Type: Void
-
-  phi2 == phi1 *x**(n+3)
-                          Type: Void
-
-  phi3 == retract(phi2)@(POLY INT)
-                          Type: Void
-
-  pans == phi3 ::UP(x,POLY INT)
-                          Type: Void
-
-  pans1 == [coefficient(pans, (n+3-i) :: NNI) for i in 2..n+1]
-                          Type: Void
-
-  leq == solve(pans1,[subscript(s,[i]) for i in 1..n])
-                          Type: Void
-
-Evaluate this for several values of n.
-
-  leq
-                          2                                3        2
-        s G     3s H + s G  + 6s G     (9s G + 54s )H + s G  + 18s G  + 72s G
-         0        0     0       0         0       0      0        0        0
-  [[s = ---,s = ------------------,s = --------------------------------------]]
-     1   3   2          18          3                    162
-                         Type: List List Equation Fraction Polynomial Integer
-
-  n==4
-                          Type: Void
-
-  leq
-   [
-                             2
-          s G      3s H + s G  + 6s G
-           0         0     0       0
-     [s = ---, s = ------------------,
-       1   3    2          18
-                              3        2
-          (9s G + 54s )H + s G  + 18s G  + 72s G
-             0       0      0        0        0
-      s = --------------------------------------,
-       3                    162
-
-       s  =
-        4
-                  2         2                          4        3         2
-             27s H  + (18s G  + 378s G + 1296s )H + s G  + 36s G  + 396s G
-                0         0         0         0      0        0         0
-           + 
-             1296s G
-                  0
-        /
-           1944
-       ]
-     ]
-                         Type: List List Equation Fraction Polynomial Integer
-
-  n==7
-                          Type: Void
-
-  leq
-   [
-                             2
-          s G      3s H + s G  + 6s G
-           0         0     0       0
-     [s = ---, s = ------------------,
-       1   3    2          18
-                              3        2
-          (9s G + 54s )H + s G  + 18s G  + 72s G
-             0       0      0        0        0
-      s = --------------------------------------,
-       3                    162
-
-       s  =
-        4
-                  2         2                          4        3         2
-             27s H  + (18s G  + 378s G + 1296s )H + s G  + 36s G  + 396s G
-                0         0         0         0      0        0         0
-           + 
-             1296s G
-                  0
-        /
-           1944
-       ,
-
-       s  =
-        5
-                               2         3          2
-             (135s G + 2268s )H  + (30s G  + 1350s G  + 16416s G + 38880s )H
-                  0         0          0          0           0          0
-           + 
-                5        4          3          2
-             s G  + 60s G  + 1188s G  + 9504s G  + 25920s G
-              0        0          0          0           0
-        /
-           29160
-       ,
-
-       s  =
-        6
-                   3          2                        2
-             405s H  + (405s G  + 18468s G + 174960s )H
-                 0          0           0           0
-           + 
-                   4          3           2                                6
-             (45s G  + 3510s G  + 88776s G  + 777600s G + 1166400s )H + s G
-                 0          0           0            0            0      0
-           + 
-                  5          4           3           2
-             90s G  + 2628s G  + 27864s G  + 90720s G
-                0          0           0           0
-        /
-           524880
-       ,
-
-       s  =
-        7
-                                 3
-             (2835s G + 91854s )H
-                   0          0
-           + 
-                    3           2                            2
-             (945s G  + 81648s G  + 2082996s G + 14171760s )H
-                  0           0             0             0
-           + 
-                   5          4            3             2
-             (63s G  + 7560s G  + 317520s G  + 5554008s G  + 34058880s G)H
-                 0          0            0             0              0
-           + 
-                7         6          5           4             3              2
-             s G  + 126s G  + 4788s G  + 25272s G  - 1744416s G  - 26827200s G
-              0         0          0           0             0              0
-           + 
-             - 97977600s G
-                        0
-        /
-           11022480
-       ]
-     ]
-                         Type: List List Equation Fraction Polynomial Integer
-
-See Also:
-o )show LinearOrdinaryDifferentialOperator
-o $AXIOM/doc/src/algebra/lodo.spad.dvi
-
-@
-<<domain LODO LinearOrdinaryDifferentialOperator>>=
-)abbrev domain LODO LinearOrdinaryDifferentialOperator
-++ Author: Manuel Bronstein
-++ Date Created: 9 December 1993
-++ Date Last Updated: 15 April 1994
-++ Keywords: differential operator
-++ Description:
-++   \spad{LinearOrdinaryDifferentialOperator} defines a ring of
-++   differential operators with coefficients in a ring A with a given
-++   derivation.
-++   Multiplication of operators corresponds to functional composition:
-++       \spad{(L1 * L2).(f) = L1 L2 f}
-LinearOrdinaryDifferentialOperator(A:Ring, diff: A -> A):
-    LinearOrdinaryDifferentialOperatorCategory A
-      == SparseUnivariateSkewPolynomial(A, 1, diff) add
-        Rep := SparseUnivariateSkewPolynomial(A, 1, diff)
-
-        outputD := "D"@String :: Symbol :: OutputForm
-
-        coerce(l:%):OutputForm == outputForm(l, outputD)
-        elt(p:%, a:A):A        == apply(p, 0, a)
-
-        if A has Field then
-            import LinearOrdinaryDifferentialOperatorsOps(A, %)
-
-            symmetricProduct(a, b) == symmetricProduct(a, b, diff)
-            symmetricPower(a, n)   == symmetricPower(a, n, diff)
-            directSum(a, b)        == directSum(a, b, diff)
-
-@
-\section{domain LODO1 LinearOrdinaryDifferentialOperator1}
-<<LinearOrdinaryDifferentialOperator1.input>>=
--- lodo.spad.pamphlet LinearOrdinaryDifferentialOperator1.input
-)spool LinearOrdinaryDifferentialOperator1.output
-)set message test on
-)set message auto off
-)clear all
---S 1 of 20
-RFZ := Fraction UnivariatePolynomial('x, Integer)
---R 
---R
---R   (1)  Fraction UnivariatePolynomial(x,Integer)
---R                                                                 Type: Domain
---E 1
-
---S 2 of 20
-x : RFZ := 'x
---R 
---R
---R   (2)  x
---R                               Type: Fraction UnivariatePolynomial(x,Integer)
---E 2
-
---S 3 of 20
-Dx : LODO1 RFZ := D()
---R 
---R
---R   (3)  D
---RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 3
-
---S 4 of 20
-b : LODO1 RFZ := 3*x**2*Dx**2 + 2*Dx + 1/x
---R 
---R
---R          2 2        1
---R   (4)  3x D  + 2D + -
---R                     x
---RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 4
-
---S 5 of 20
-a : LODO1 RFZ := b*(5*x*Dx + 7)
---R 
---R
---R           3 3       2        2         7
---R   (5)  15x D  + (51x  + 10x)D  + 29D + -
---R                                        x
---RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 5
-
---S 6 of 20
-p := x**2 + 1/x**2
---R 
---R
---R         4
---R        x  + 1
---R   (6)  ------
---R           2
---R          x
---R                               Type: Fraction UnivariatePolynomial(x,Integer)
---E 6
-
---S 7 of 20
-(a*b - b*a) p
---R 
---R
---R             4
---R        - 75x  + 540x - 75
---R   (7)  ------------------
---R                 4
---R                x
---R                               Type: Fraction UnivariatePolynomial(x,Integer)
---E 7
-
---S 8 of 20
-ld := leftDivide(a,b)
---R 
---R
---R   (8)  [quotient= 5x D + 7,remainder= 0]
---RType: Record(quotient: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer),remainder: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer))
---E 8
-
---S 9 of 20
-a = b * ld.quotient + ld.remainder
---R 
---R
---R           3 3       2        2         7     3 3       2        2         7
---R   (9)  15x D  + (51x  + 10x)D  + 29D + -= 15x D  + (51x  + 10x)D  + 29D + -
---R                                        x                                  x
---RType: Equation LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 9
-
---S 10 of 20
-rd := rightDivide(a,b)
---R 
---R
---R                                              5
---R   (10)  [quotient= 5x D + 7,remainder= 10D + -]
---R                                              x
---RType: Record(quotient: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer),remainder: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer))
---E 10
-
---S 11 of 20
-a = rd.quotient * b + rd.remainder
---R 
---R
---R            3 3       2        2         7     3 3       2        2         7
---R   (11)  15x D  + (51x  + 10x)D  + 29D + -= 15x D  + (51x  + 10x)D  + 29D + -
---R                                         x                                  x
---RType: Equation LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 11
-
---S 12 of 20
-rightQuotient(a,b)
---R 
---R
---R   (12)  5x D + 7
---RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 12
-
---S 13 of 20
-rightRemainder(a,b)
---R 
---R
---R               5
---R   (13)  10D + -
---R               x
---RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 13
-
---S 14 of 20
-leftExactQuotient(a,b)
---R 
---R
---R   (14)  5x D + 7
---RType: Union(LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer),...)
---E 14
-
---S 15 of 20
-e := leftGcd(a,b)
---R 
---R
---R           2 2        1
---R   (15)  3x D  + 2D + -
---R                      x
---RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 15
-
---S 16 of 20
-leftRemainder(a, e)
---R 
---R
---R   (16)  0
---RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 16
-
---S 17 of 20
-rightRemainder(a, e)
---R 
---R
---R               5
---R   (17)  10D + -
---R               x
---RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 17
-
---S 18 of 20
-f := rightLcm(a,b)
---R 
---R
---R            3 3       2        2         7
---R   (18)  15x D  + (51x  + 10x)D  + 29D + -
---R                                         x
---RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 18
-
---S 19 of 20
-rightRemainder(f, b)
---R 
---R
---R               5
---R   (19)  10D + -
---R               x
---RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 19
-
---S 20 of 20
-leftRemainder(f, b)
---R 
---R
---R   (20)  0
---RType: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)
---E 20
-)spool
-)lisp (bye)
-@
-
-<<LinearOrdinaryDifferentialOperator1.help>>=
-====================================================================
-LinearOrdinaryDifferentialOperator1 example
-====================================================================
-
-LinearOrdinaryDifferentialOperator1(A) is the domain of linear
-ordinary differential operators with coefficients in the differential
-ring A.
-
-====================================================================
-Differential Operators with Rational Function Coefficients
-====================================================================
-
-This example shows differential operators with rational function
-coefficients.  In this case operator multiplication is non-commutative and,
-since the coefficients form a field, an operator division algorithm exists.
-
-We begin by defining RFZ to be the rational functions in x with
-integer coefficients and Dx to be the differential operator for d/dx.
-
-  RFZ := Fraction UnivariatePolynomial('x, Integer)
-    Fraction UnivariatePolynomial(x,Integer)
-                         Type: Domain
-
-  x : RFZ := 'x
-    x
-                         Type: Fraction UnivariatePolynomial(x,Integer)
-
-  Dx : LODO1 RFZ := D()
-    D
-                         Type: LinearOrdinaryDifferentialOperator1 
-                                 Fraction UnivariatePolynomial(x,Integer)
-
-Operators are created using the usual arithmetic operations.
-
-  b : LODO1 RFZ := 3*x**2*Dx**2 + 2*Dx + 1/x
-      2 2        1
-    3x D  + 2D + -
-                 x
-                         Type: LinearOrdinaryDifferentialOperator1 
-                                Fraction UnivariatePolynomial(x,Integer)
-
-  a : LODO1 RFZ := b*(5*x*Dx + 7)
-       3 3       2        2         7
-    15x D  + (51x  + 10x)D  + 29D + -
-                                    x
-                        Type: LinearOrdinaryDifferentialOperator1 
-                                Fraction UnivariatePolynomial(x,Integer)
-
-Operator multiplication corresponds to functional composition.
-
-  p := x**2 + 1/x**2
-     4
-    x  + 1
-    ------
-       2
-      x
-                        Type: Fraction UnivariatePolynomial(x,Integer)
-
-Since operator coefficients depend on x, the multiplication is not
-commutative.
-
-  (a*b - b*a) p
-         4
-    - 75x  + 540x - 75
-    ------------------
-             4
-            x
-                        Type: Fraction UnivariatePolynomial(x,Integer)
-
-When the coefficients of operator polynomials come from a field, as in
-this case, it is possible to define operator division.  Division on
-the left and division on the right yield different results when the
-multiplication is non-commutative.
-
-The results of leftDivide and rightDivide are quotient-remainder pairs
-satisfying:
-
-  leftDivide(a,b) = [q, r] such that  a = b*q + r
-  rightDivide(a,b) = [q, r] such that a = q*b + r
-
-In both cases, the degree of the remainder, r, is less than the degree
-of b.
-
-  ld := leftDivide(a,b)
-    [quotient= 5x D + 7,remainder= 0]
-      Type: Record(quotient: LinearOrdinaryDifferentialOperator1 
-                               Fraction UnivariatePolynomial(x,Integer),
-                   remainder: LinearOrdinaryDifferentialOperator1 
-                               Fraction UnivariatePolynomial(x,Integer))
-
-  a = b * ld.quotient + ld.remainder
-       3 3       2        2         7     3 3       2        2         7
-    15x D  + (51x  + 10x)D  + 29D + -= 15x D  + (51x  + 10x)D  + 29D + -
-      Type: Equation LinearOrdinaryDifferentialOperator1 
-                       Fraction UnivariatePolynomial(x,Integer)
-
-The operations of left and right division are so-called because the
-quotient is obtained by dividing a on that side by b.
-
-  rd := rightDivide(a,b)
-    [quotient= 5x D + 7,remainder= 10D + -]
-      Type: Record(quotient: LinearOrdinaryDifferentialOperator1 
-                               Fraction UnivariatePolynomial(x,Integer),
-                   remainder: LinearOrdinaryDifferentialOperator1 
-                               Fraction UnivariatePolynomial(x,Integer))
-
-  a = rd.quotient * b + rd.remainder
-       3 3       2        2         7     3 3       2        2         7
-    15x D  + (51x  + 10x)D  + 29D + -= 15x D  + (51x  + 10x)D  + 29D + -
-     Type: Equation LinearOrdinaryDifferentialOperator1 
-                      Fraction UnivariatePolynomial(x,Integer)
-
-Operations rightQuotient and rightRemainder are available if only one
-of the quotient or remainder are of interest to you.  This is the
-quotient from right division.
-
-  rightQuotient(a,b)
-    5x D + 7
-     Type: LinearOrdinaryDifferentialOperator1 
-             Fraction UnivariatePolynomial(x,Integer)
-
-This is the remainder from right division.  The corresponding "left"
-functions, leftQuotient and leftRemainder are also available.
-
-  rightRemainder(a,b)
-          5
-    10D + -
-          x
-      Type: LinearOrdinaryDifferentialOperator1 
-              Fraction UnivariatePolynomial(x,Integer)
-
-For exact division, operations leftExactQuotient and rightExactQuotient 
-are supplied.  These return the quotient but only if the remainder is zero.  
-The call rightExactQuotient(a,b) would yield an error.
-
-  leftExactQuotient(a,b)
-    5x D + 7
-     Type: Union(LinearOrdinaryDifferentialOperator1 
-                   Fraction UnivariatePolynomial(x,Integer),...)
-
-The division operations allow the computation of left and right greatest
-common divisors, leftGcd and rightGcd via remainder sequences, and 
-consequently the computation of left and right least common multiples,
-rightLcm and leftLcm.
-
-  e := leftGcd(a,b)
-      2 2        1
-    3x D  + 2D + -
-                 x
-     Type: LinearOrdinaryDifferentialOperator1 
-             Fraction UnivariatePolynomial(x,Integer)
-
-Note that a greatest common divisor doesn't necessarily divide a and b
-on both sides.  Here the left greatest common divisor does not divide
-a on the right.
-
-  leftRemainder(a, e)
-    0
-      Type: LinearOrdinaryDifferentialOperator1 
-              Fraction UnivariatePolynomial(x,Integer)
-
-  rightRemainder(a, e)
-          5
-    10D + -
-          x
-      Type: LinearOrdinaryDifferentialOperator1 
-              Fraction UnivariatePolynomial(x,Integer)
-
-Similarly, a least common multiple is not necessarily divisible from
-both sides.
-
-  f := rightLcm(a,b)
-       3 3       2        2         7
-    15x D  + (51x  + 10x)D  + 29D + -
-      Type: LinearOrdinaryDifferentialOperator1 
-              Fraction UnivariatePolynomial(x,Integer)
-
-  rightRemainder(f, b)
-          5
-    10D + -
-          x
-      Type: LinearOrdinaryDifferentialOperator1 
-              Fraction UnivariatePolynomial(x,Integer)
-
-  leftRemainder(f, b)
-    0
-      Type: LinearOrdinaryDifferentialOperator1 
-              Fraction UnivariatePolynomial(x,Integer)
-
-See Also:
-o )show LinearOrdinaryDifferentialOperator1
-o $AXIOM/doc/src/algebra/lodo.spad.dvi
-
-@
-<<domain LODO1 LinearOrdinaryDifferentialOperator1>>=
-)abbrev domain LODO1 LinearOrdinaryDifferentialOperator1
-++ Author: Manuel Bronstein
-++ Date Created: 9 December 1993
-++ Date Last Updated: 31 January 1994
-++ Keywords: differential operator
-++ Description:
-++   \spad{LinearOrdinaryDifferentialOperator1} defines a ring of
-++   differential operators with coefficients in a differential ring A.
-++   Multiplication of operators corresponds to functional composition:
-++       \spad{(L1 * L2).(f) = L1 L2 f}
-LinearOrdinaryDifferentialOperator1(A:DifferentialRing) ==
-  LinearOrdinaryDifferentialOperator(A, differentiate$A)
-
-@
-\section{domain LODO2 LinearOrdinaryDifferentialOperator2}
-<<LinearOrdinaryDifferentialOperator2.input>>=
--- lodo.spad.pamphlet LinearOrdinaryDifferentialOperator2.input
-)spool LinearOrdinaryDifferentialOperator2.output
-)set message test on
-)set message auto off
-)clear all
---S 1 of 26
-Q  := Fraction Integer
---R 
---R
---R   (1)  Fraction Integer
---R                                                                 Type: Domain
---E 1
-
---S 2 of 26
-PQ := UnivariatePolynomial('x, Q)
---R 
---R
---R   (2)  UnivariatePolynomial(x,Fraction Integer)
---R                                                                 Type: Domain
---E 2
-
---S 3 of 26
-x: PQ := 'x
---R 
---R
---R   (3)  x
---R                               Type: UnivariatePolynomial(x,Fraction Integer)
---E 3
-
---S 4 of 26
-Dx: LODO2(Q, PQ) := D()
---R 
---R
---R   (4)  D
---RType: LinearOrdinaryDifferentialOperator2(Fraction Integer,UnivariatePolynomial(x,Fraction Integer))
---E 4
-
---S 5 of 26
-a := Dx  + 1
---R 
---R
---R   (5)  D + 1
---RType: LinearOrdinaryDifferentialOperator2(Fraction Integer,UnivariatePolynomial(x,Fraction Integer))
---E 5
-
---S 6 of 26
-b := a + 1/2*Dx**2 - 1/2
---R 
---R
---R        1  2       1
---R   (6)  - D  + D + -
---R        2          2
---RType: LinearOrdinaryDifferentialOperator2(Fraction Integer,UnivariatePolynomial(x,Fraction Integer))
---E 6
-
---S 7 of 26
-p := 4*x**2 + 2/3
---R 
---R
---R          2   2
---R   (7)  4x  + -
---R              3
---R                               Type: UnivariatePolynomial(x,Fraction Integer)
---E 7
-
---S 8 of 26
-a p 
---R 
---R
---R          2        2
---R   (8)  4x  + 8x + -
---R                   3
---R                               Type: UnivariatePolynomial(x,Fraction Integer)
---E 8
-
---S 9 of 26
-(a * b) p = a b p
---R 
---R
---R          2         37    2         37
---R   (9)  2x  + 12x + --= 2x  + 12x + --
---R                     3               3
---R                      Type: Equation UnivariatePolynomial(x,Fraction Integer)
---E 9
-
---S 10 of 26
-c := (1/9)*b*(a + b)^2
---R 
---R
---R          1  6    5  5   13  4   19  3   79  2    7     1
---R   (10)  -- D  + -- D  + -- D  + -- D  + -- D  + -- D + -
---R         72      36      24      18      72      12     8
---RType: LinearOrdinaryDifferentialOperator2(Fraction Integer,UnivariatePolynomial(x,Fraction Integer))
---E 10
-
---S 11 of 26
-(a**2 - 3/4*b + c) (p + 1)
---R 
---R
---R           2   44     541
---R   (11)  3x  + -- x + ---
---R                3      36
---R                               Type: UnivariatePolynomial(x,Fraction Integer)
---E 11
-)clear all
---S 12 of 26
-PZ := UnivariatePolynomial(x,Integer)
---R 
---R
---R   (1)  UnivariatePolynomial(x,Integer)
---R                                                                 Type: Domain
---E 12
-
---S 13 of 26
-x:PZ := 'x
---R 
---R
---R   (2)  x
---R                                        Type: UnivariatePolynomial(x,Integer)
---E 13
-
---S 14 of 26
-Mat  := SquareMatrix(3,PZ)
---R 
---R
---R   (3)  SquareMatrix(3,UnivariatePolynomial(x,Integer))
---R                                                                 Type: Domain
---E 14
-
---S 15 of 26
-Vect := DPMM(3, PZ, Mat, PZ)
---R 
---R
---R   (4)
---R  DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,Un
---R  ivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
---R                                                                 Type: Domain
---E 15
-
---S 16 of 26
-Modo := LODO2(Mat, Vect)
---R 
---R
---R   (5)
---R  LinearOrdinaryDifferentialOperator2(SquareMatrix(3,UnivariatePolynomial(x,Int
---R  eger)),DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatr
---R  ix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer)))
---R                                                                 Type: Domain
---E 16
-
---S 17 of 26
-m:Mat := matrix [ [x^2,1,0],[1,x^4,0],[0,0,4*x^2] ]
---R 
---R
---R        + 2         +
---R        |x   1    0 |
---R        |           |
---R   (6)  |     4     |
---R        |1   x    0 |
---R        |           |
---R        |          2|
---R        +0   0   4x +
---R                        Type: SquareMatrix(3,UnivariatePolynomial(x,Integer))
---E 17
-
---S 18 of 26
-p:Vect := directProduct [3*x^2+1,2*x,7*x^3+2*x]
---R 
---R
---R           2          3
---R   (7)  [3x  + 1,2x,7x  + 2x]
---RType: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
---E 18
-
---S 19 of 26
-q: Vect := m * p
---R 
---R
---R           4    2        5     2        5     3
---R   (8)  [3x  + x  + 2x,2x  + 3x  + 1,28x  + 8x ]
---RType: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
---E 19
-
---S 20 of 26
-Dx : Modo := D()
---R 
---R
---R   (9)  D
---RType: LinearOrdinaryDifferentialOperator2(SquareMatrix(3,UnivariatePolynomial(x,Integer)),DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer)))
---E 20
-
---S 21 of 26
-a : Modo := Dx  + m
---R 
---R
---R             + 2         +
---R             |x   1    0 |
---R             |           |
---R   (10)  D + |     4     |
---R             |1   x    0 |
---R             |           |
---R             |          2|
---R             +0   0   4x +
---RType: LinearOrdinaryDifferentialOperator2(SquareMatrix(3,UnivariatePolynomial(x,Integer)),DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer)))
---E 21
-
---S 22 of 26
-b : Modo := m*Dx  + 1
---R 
---R
---R         + 2         +
---R         |x   1    0 |    +1  0  0+
---R         |           |    |       |
---R   (11)  |     4     |D + |0  1  0|
---R         |1   x    0 |    |       |
---R         |           |    +0  0  1+
---R         |          2|
---R         +0   0   4x +
---RType: LinearOrdinaryDifferentialOperator2(SquareMatrix(3,UnivariatePolynomial(x,Integer)),DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer)))
---E 22
-
---S 23 of 26
-c := a*b
---R 
---R
---R   (12)
---R   + 2         +     + 4              4    2                  +    + 2         +
---R   |x   1    0 |     |x  + 2x + 2    x  + x            0      |    |x   1    0 |
---R   |           | 2   |                                        |    |           |
---R   |     4     |D  + |   4    2     8     3                   |D + |     4     |
---R   |1   x    0 |     |  x  + x     x  + 4x  + 2        0      |    |1   x    0 |
---R   |           |     |                                        |    |           |
---R   |          2|     |                              4         |    |          2|
---R   +0   0   4x +     +     0            0        16x  + 8x + 1+    +0   0   4x +
---RType: LinearOrdinaryDifferentialOperator2(SquareMatrix(3,UnivariatePolynomial(x,Integer)),DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer)))
---E 23
-
---S 24 of 26
-a p
---R 
---R
---R            4    2        5     2        5     3      2
---R   (13)  [3x  + x  + 8x,2x  + 3x  + 3,28x  + 8x  + 21x  + 2]
---RType: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
---E 24
-
---S 25 of 26
-b p
---R 
---R
---R            3     2       4         4     3     2
---R   (14)  [6x  + 3x  + 3,2x  + 8x,84x  + 7x  + 8x  + 2x]
---RType: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
---E 25
-
---S 26 of 26
-(a + b + c) (p + q)
---R 
---R
---R   (15)
---R       8      7      6      5      4      3      2
---R   [10x  + 12x  + 16x  + 30x  + 85x  + 94x  + 40x  + 40x + 17,
---R       12      9      8      7     6      5      4      3      2
---R    10x   + 10x  + 12x  + 92x  + 6x  + 32x  + 72x  + 28x  + 49x  + 32x + 19,
---R         8       7        6        5       4       3      2
---R    2240x  + 224x  + 1280x  + 3508x  + 492x  + 751x  + 98x  + 18x + 4]
---RType: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
---E 26
-)spool
-)lisp (bye)
-@
-<<LinearOrdinaryDifferentialOperator2.help>>=
-====================================================================
-LinearOrdinaryDifferentialOperator2
-====================================================================
-
-LinearOrdinaryDifferentialOperator2(A, M) is the domain of linear
-ordinary differential operators with coefficients in the differential
-ring A and operating on M, an A-module.  This includes the cases of
-operators which are polynomials in D acting upon scalar or vector
-expressions of a single variable.  The coefficients of the operator
-polynomials can be integers, rational functions, matrices or elements
-of other domains.
-
-====================================================================
-Differential Operators with Constant Coefficients
-====================================================================
-
-This example shows differential operators with rational number
-coefficients operating on univariate polynomials.
-
-We begin by making type assignments so we can conveniently refer
-to univariate polynomials in x over the rationals.
-
-  Q  := Fraction Integer
-    Fraction Integer
-                         Type: Domain
-
-  PQ := UnivariatePolynomial('x, Q)
-    UnivariatePolynomial(x,Fraction Integer)
-                         Type: Domain
-
-  x: PQ := 'x
-    x
-                         Type: UnivariatePolynomial(x,Fraction Integer)
-
-Now we assign Dx to be the differential operator D corresponding to d/dx.
-
-  Dx: LODO2(Q, PQ) := D()
-    D
-     Type: LinearOrdinaryDifferentialOperator2(Fraction Integer,
-             UnivariatePolynomial(x,Fraction Integer))
-
-New operators are created as polynomials in D().
-
-  a := Dx  + 1
-    D + 1
-     Type: LinearOrdinaryDifferentialOperator2(Fraction Integer,
-             UnivariatePolynomial(x,Fraction Integer))
-
-  b := a + 1/2*Dx**2 - 1/2
-    1  2       1
-    - D  + D + -
-    2          2
-      Type: LinearOrdinaryDifferentialOperator2(Fraction Integer,
-              UnivariatePolynomial(x,Fraction Integer))
-
-To apply the operator a to the value p the usual function call syntax
-is used.
-
-  p := 4*x**2 + 2/3
-      2   2
-    4x  + -
-          3
-                     Type: UnivariatePolynomial(x,Fraction Integer)
-
-  a p 
-      2        2
-    4x  + 8x + -
-               3
-                     Type: UnivariatePolynomial(x,Fraction Integer)
-
-Operator multiplication is defined by the identity (a*b)p = a(b(p))
-
-  (a * b) p = a b p
-      2         37    2         37
-    2x  + 12x + --= 2x  + 12x + --
-                 3               3
-                     Type: Equation UnivariatePolynomial(x,Fraction Integer)
-
-Exponentiation follows from multiplication.
-
-  c := (1/9)*b*(a + b)^2
-      1  6    5  5   13  4   19  3   79  2    7     1
-     -- D  + -- D  + -- D  + -- D  + -- D  + -- D + -
-     72      36      24      18      72      12     8
-      Type: LinearOrdinaryDifferentialOperator2(Fraction Integer,
-              UnivariatePolynomial(x,Fraction Integer))
-
-Finally, note that operator expressions may be applied directly.
-
-  (a**2 - 3/4*b + c) (p + 1)
-       2   44     541
-     3x  + -- x + ---
-            3      36
-                     Type: UnivariatePolynomial(x,Fraction Integer)
-
-====================================================================
-Differential Operators with Matrix Coefficients Operating on Vectors}
-====================================================================
-
-This is another example of linear ordinary differential operators with
-non-commutative multiplication.  Unlike the rational function case,
-the differential ring of square matrices (of a given dimension) with
-univariate polynomial entries does not form a field.  Thus the number
-of operations available is more limited.
-
-In this section, the operators have three by three matrix coefficients
-with polynomial entries.
-
-  PZ := UnivariatePolynomial(x,Integer)
-    UnivariatePolynomial(x,Integer)
-                           Type: Domain
-
-  x:PZ := 'x
-    x
-                           Type: UnivariatePolynomial(x,Integer)
-
-  Mat  := SquareMatrix(3,PZ)
-    SquareMatrix(3,UnivariatePolynomial(x,Integer))
-                           Type: Domain
-
-The operators act on the vectors considered as a Mat-module.
-
-  Vect := DPMM(3, PZ, Mat, PZ)
-  DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatrix(3,Un
-  ivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer))
-                           Type: Domain
-
-  Modo := LODO2(Mat, Vect)
-  LinearOrdinaryDifferentialOperator2(SquareMatrix(3,UnivariatePolynomial(x,Int
-  eger)),DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),SquareMatr
-  ix(3,UnivariatePolynomial(x,Integer)),UnivariatePolynomial(x,Integer)))
-                           Type: Domain
-
-The matrix m is used as a coefficient and the vectors p and q are
-operated upon.
-
-  m:Mat := matrix [ [x^2,1,0],[1,x^4,0],[0,0,4*x^2] ]
-        + 2         +
-        |x   1    0 |
-        |           |
-        |     4     |
-        |1   x    0 |
-        |           |
-        |          2|
-        +0   0   4x +
-                        Type: SquareMatrix(3,UnivariatePolynomial(x,Integer))
-
-  p:Vect := directProduct [3*x^2+1,2*x,7*x^3+2*x]
-       2          3
-    [3x  + 1,2x,7x  + 2x]
-    Type: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
-             SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-                UnivariatePolynomial(x,Integer))
-
-  q: Vect := m * p
-       4    2        5     2        5     3
-    [3x  + x  + 2x,2x  + 3x  + 1,28x  + 8x ]
-      Type: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
-         SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-            UnivariatePolynomial(x,Integer))
-
-Now form a few operators.
-
-  Dx : Modo := D()
-    D
-      Type: LinearOrdinaryDifferentialOperator2(
-             SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-             DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
-             SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-             UnivariatePolynomial(x,Integer)))
-
-  a : Modo := Dx  + m
-             + 2         +
-             |x   1    0 |
-             |           |
-         D + |     4     |
-             |1   x    0 |
-             |           |
-             |          2|
-             +0   0   4x +
-    Type: LinearOrdinaryDifferentialOperator2(
-             SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-             DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
-             SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-             UnivariatePolynomial(x,Integer)))
-
-  b : Modo := m*Dx  + 1
-         + 2         +
-         |x   1    0 |    +1  0  0+
-         |           |    |       |
-         |     4     |D + |0  1  0|
-         |1   x    0 |    |       |
-         |           |    +0  0  1+
-         |          2|
-         +0   0   4x +
-     Type: LinearOrdinaryDifferentialOperator2(
-              SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-              DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
-              SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-              UnivariatePolynomial(x,Integer)))
-
-  c := a*b
-  + 2         +     + 4              4    2                  +    + 2         +
-  |x   1    0 |     |x  + 2x + 2    x  + x            0      |    |x   1    0 |
-  |           | 2   |                                        |    |           |
-  |     4     |D  + |   4    2     8     3                   |D + |     4     |
-  |1   x    0 |     |  x  + x     x  + 4x  + 2        0      |    |1   x    0 |
-  |           |     |                                        |    |           |
-  |          2|     |                              4         |    |          2|
-  +0   0   4x +     +     0            0        16x  + 8x + 1+    +0   0   4x +
-    Type: LinearOrdinaryDifferentialOperator2(
-            SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-            DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
-            SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-            UnivariatePolynomial(x,Integer)))
-
-These operators can be applied to vector values.
-
-  a p
-        4    2        5     2        5     3      2
-     [3x  + x  + 8x,2x  + 3x  + 3,28x  + 8x  + 21x  + 2]
-       Type: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
-               SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-                  UnivariatePolynomial(x,Integer))
-
-  b p
-        3     2       4         4     3     2
-     [6x  + 3x  + 3,2x  + 8x,84x  + 7x  + 8x  + 2x]
-        Type: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
-                SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-                  UnivariatePolynomial(x,Integer))
-
-  (a + b + c) (p + q)
-       8      7      6      5      4      3      2
-   [10x  + 12x  + 16x  + 30x  + 85x  + 94x  + 40x  + 40x + 17,
-       12      9      8      7     6      5      4      3      2
-    10x   + 10x  + 12x  + 92x  + 6x  + 32x  + 72x  + 28x  + 49x  + 32x + 19,
-         8       7        6        5       4       3      2
-    2240x  + 224x  + 1280x  + 3508x  + 492x  + 751x  + 98x  + 18x + 4]
-     Type: DirectProductMatrixModule(3,UnivariatePolynomial(x,Integer),
-             SquareMatrix(3,UnivariatePolynomial(x,Integer)),
-               UnivariatePolynomial(x,Integer))
-
-See Also:
-o )show LinearOrdinaryDifferentialOperator2
-o $AXIOM/doc/src/algebra/lodo.spad.dvi
-
-@
-<<domain LODO2 LinearOrdinaryDifferentialOperator2>>=
-)abbrev domain LODO2 LinearOrdinaryDifferentialOperator2
-++ Author: Stephen M. Watt, Manuel Bronstein
-++ Date Created: 1986
-++ Date Last Updated: 1 February 1994
-++ Keywords: differential operator
-++ Description:
-++   \spad{LinearOrdinaryDifferentialOperator2} defines a ring of
-++   differential operators with coefficients in a differential ring A
-++   and acting on an A-module M.
-++   Multiplication of operators corresponds to functional composition:
-++       \spad{(L1 * L2).(f) = L1 L2 f}
-LinearOrdinaryDifferentialOperator2(A, M): Exports == Implementation where
-  A: DifferentialRing
-  M: LeftModule A with 
-	differentiate: $ -> $
-		++ differentiate(x) returns the derivative of x
-
-  Exports ==> Join(LinearOrdinaryDifferentialOperatorCategory A, Eltable(M, M))
-
-  Implementation ==> LinearOrdinaryDifferentialOperator(A, differentiate$A) add
-      elt(p:%, m:M):M ==
-        apply(p, differentiate, m)$ApplyUnivariateSkewPolynomial(A, M, %)
-
-@
 \section{License}
 <<license>>=
 --Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
@@ -1642,9 +150,6 @@ LinearOrdinaryDifferentialOperator2(A, M): Exports == Implementation where
 <<license>>
 
 <<package LODOOPS LinearOrdinaryDifferentialOperatorsOps>>
-<<domain LODO LinearOrdinaryDifferentialOperator>>
-<<domain LODO1 LinearOrdinaryDifferentialOperator1>>
-<<domain LODO2 LinearOrdinaryDifferentialOperator2>>
 @
 \eject
 \begin{thebibliography}{99}
diff --git a/src/algebra/lodof.spad.pamphlet b/src/algebra/lodof.spad.pamphlet
index fd72c15..daaedcb 100644
--- a/src/algebra/lodof.spad.pamphlet
+++ b/src/algebra/lodof.spad.pamphlet
@@ -9,153 +9,6 @@
 \eject
 \tableofcontents
 \eject
-\section{domain SETMN SetOfMIntegersInOneToN}
-<<domain SETMN SetOfMIntegersInOneToN>>=
-)abbrev domain SETMN SetOfMIntegersInOneToN
-++ Author: Manuel Bronstein
-++ Date Created: 10 January 1994
-++ Date Last Updated: 10 January 1994
-++ Description:
-++ \spadtype{SetOfMIntegersInOneToN} implements the subsets of M integers
-++ in the interval \spad{[1..n]}
-SetOfMIntegersInOneToN(m, n): Exports == Implementation where
-  PI ==> PositiveInteger
-  N  ==> NonNegativeInteger
-  U  ==> Union(%, "failed")
-  n,m: PI
- 
-  Exports ==> Finite with
-    incrementKthElement: (%, PI) -> U
-      ++ incrementKthElement(S,k) increments the k^{th} element of S,
-      ++ and returns "failed" if the result is not a set of M integers
-      ++ in \spad{1..n} any more.
-    replaceKthElement:   (%, PI, PI) -> U
-      ++ replaceKthElement(S,k,p) replaces the k^{th} element of S by p,
-      ++ and returns "failed" if the result is not a set of M integers
-      ++ in \spad{1..n} any more.
-    elements: % -> List PI
-      ++ elements(S) returns the list of the elements of S in increasing order.
-    setOfMinN: List PI -> %
-      ++ setOfMinN([a_1,...,a_m]) returns the set {a_1,...,a_m}.
-      ++ Error if {a_1,...,a_m} is not a set of M integers in \spad{1..n}.
-    enumerate: () -> Vector %
-      ++ enumerate() returns a vector of all the sets of M integers in
-      ++ \spad{1..n}.
-    member?:   (PI, %) -> Boolean
-      ++ member?(p, s) returns true is p is in s, false otherwise.
-    delta: (%, PI, PI) -> N
-      ++ delta(S,k,p) returns the number of elements of S which are strictly
-      ++ between p and the k^{th} element of S.
- 
-  Implementation ==> add
-    Rep := Record(bits:Bits, pos:N)
- 
-    reallyEnumerate: () -> Vector %
-    enum: (N, N, PI) -> List Bits
- 
-    all:Reference Vector % := ref empty()
-    sz:Reference N := ref 0
- 
-    s1 = s2                == s1.bits =$Bits s2.bits
-    coerce(s:%):OutputForm == brace [i::OutputForm for i in elements s]
-    random()               == index((1 + (random()$Integer rem size()))::PI)
-    reallyEnumerate()      == [[b, i] for b in enum(m, n, n) for i in 1..]
-    member?(p, s)          == s.bits.p
- 
-    enumerate() ==
-      if empty? all() then all() := reallyEnumerate()
-      all()
- 
--- enumerates the sets of p integers in 1..q, returns them as sets in 1..n
--- must have p <= q
-    enum(p, q, n) ==
-      zero? p or zero? q => empty()
-      p = q =>
-        b := new(n, false)$Bits
-        for i in 1..p repeat b.i := true
-        [b]
-      q1 := (q - 1)::N
-      l := enum((p - 1)::N, q1, n)
-      if empty? l then l := [new(n, false)$Bits]
-      for s in l repeat s.q := true
-      concat_!(enum(p, q1, n), l)
- 
-    size() ==
-      if zero? sz() then
-         sz() := binomial(n, m)$IntegerCombinatoricFunctions(Integer) :: N
-      sz()
- 
-    lookup s ==
-      if empty? all() then all() := reallyEnumerate()
-      if zero?(s.pos) then s.pos := position(s, all()) :: N
-      s.pos :: PI
-      
-    index p ==
-      p > size() => error "index: argument too large"
-      if empty? all() then all() := reallyEnumerate()
-      all().p
- 
-    setOfMinN l ==
-      s := new(n, false)$Bits
-      count:N := 0
-      for i in l repeat
-        count := count + 1
-        count > m or zero? i or i > n or s.i =>
-          error "setOfMinN: improper set of integers"
-        s.i := true
-      count < m => error "setOfMinN: improper set of integers"
-      [s, 0]
- 
-    elements s ==
-      b := s.bits
-      l:List PI := empty()
-      found:N := 0
-      i:PI := 1
-      while found < m repeat
-          if b.i then
-              l := concat(i, l)
-              found := found + 1
-          i := i + 1
-      reverse_! l
- 
-    incrementKthElement(s, k) ==
-      b := s.bits
-      found:N := 0
-      i:N := 1
-      while found < k repeat
-          if b.i then found := found + 1
-          i := i + 1
-      i > n or b.i => "failed"
-      newb := copy b
-      newb.i := true
-      newb.((i-1)::N) := false
-      [newb, 0]
- 
-    delta(s, k, p) ==
-      b := s.bits
-      count:N := found:N := 0
-      i:PI := 1
-      while found < k repeat
-          if b.i then
-             found := found + 1
-             if i > p and found < k then count := count + 1
-          i := i + 1
-      count
- 
-    replaceKthElement(s, k, p) ==
-      b := s.bits
-      found:N := 0
-      i:PI := 1
-      while found < k repeat
-          if b.i then found := found + 1
-          if found < k then i := i + 1
-      b.p and i ^= p => "failed"
-      newb := copy b
-      newb.p := true
-      newb.i := false
-      [newb, (i = p => s.pos; 0)]
-
-@
 \section{package PREASSOC PrecomputedAssociatedEquations}
 <<package PREASSOC PrecomputedAssociatedEquations>>=
 )abbrev package PREASSOC PrecomputedAssociatedEquations
@@ -521,7 +374,6 @@ LinearOrdinaryDifferentialOperatorFactorizer(F, UP): Exports == Impl where
 -- oderf.spad  odealg.spad  nlode.spad  nlinsol.spad  riccati.spad
 -- kovacic.spad  lodof.spad  odeef.spad
  
-<<domain SETMN SetOfMIntegersInOneToN>>
 <<package PREASSOC PrecomputedAssociatedEquations>>
 <<package ASSOCEQ AssociatedEquations>>
 <<package LODOF LinearOrdinaryDifferentialOperatorFactorizer>>
diff --git a/src/algebra/lodop.spad.pamphlet b/src/algebra/lodop.spad.pamphlet
index 37d3567..61ce08e 100644
--- a/src/algebra/lodop.spad.pamphlet
+++ b/src/algebra/lodop.spad.pamphlet
@@ -9,44 +9,6 @@
 \eject
 \tableofcontents
 \eject
-\section{domain OMLO OppositeMonogenicLinearOperator}
-<<domain OMLO OppositeMonogenicLinearOperator>>=
-)abbrev domain OMLO OppositeMonogenicLinearOperator
-++ Author: Stephen M. Watt
-++ Date Created: 1986
-++ Date Last Updated: May 30, 1991
-++ Basic Operations:
-++ Related Domains: MonogenicLinearOperator
-++ Also See:
-++ AMS Classifications:
-++ Keywords: opposite ring
-++ Examples:
-++ References:
-++ Description:
-++   This constructor creates the \spadtype{MonogenicLinearOperator} domain
-++   which is ``opposite'' in the ring sense to P.
-++   That is, as sets \spad{P = $} but \spad{a * b} in \spad{$} is equal to
-++   \spad{b * a} in P.
-
-OppositeMonogenicLinearOperator(P, R): OPRcat == OPRdef where
-   P: MonogenicLinearOperator(R)
-   R: Ring
-
-   OPRcat == MonogenicLinearOperator(R) with
-        if P has DifferentialRing then DifferentialRing
-        op: P -> $  ++ op(p) creates a value in $ equal to p in P.
-        po: $ -> P  ++ po(q) creates a value in P equal to q in $.
-
-   OPRdef  == P add
-        Rep := P
-        x, y: $
-        a: P
-        op a == a: $
-        po x == x: P
-        x*y == (y:P) *$P (x:P)
-        coerce(x): OutputForm == prefix(op::OutputForm, [coerce(x:P)$P])
-
-@
 \section{package NCODIV NonCommutativeOperatorDivision}
 <<package NCODIV NonCommutativeOperatorDivision>>=
 )abbrev package NCODIV NonCommutativeOperatorDivision
@@ -143,109 +105,6 @@ NonCommutativeOperatorDivision(P, F): PDcat == PDdef  where
             b0*u
 
 @
-\section{domain ODR OrdinaryDifferentialRing}
-<<domain ODR OrdinaryDifferentialRing>>=
-)abbrev domain ODR OrdinaryDifferentialRing
-++ Author: Stephen M. Watt
-++ Date Created: 1986
-++ Date Last Updated: June 3, 1991
-++ Basic Operations:
-++ Related Domains:
-++ Also See:
-++ AMS Classifications:
-++ Keywords: differential ring
-++ Examples:
-++ References:
-++ Description:
-++   This constructor produces an ordinary differential ring from
-++   a partial differential ring by specifying a variable.
-
-OrdinaryDifferentialRing(Kernels,R,var): DRcategory == DRcapsule where
-    Kernels:SetCategory
-    R: PartialDifferentialRing(Kernels)
-    var : Kernels
-    DRcategory == Join(BiModule($,$), DifferentialRing) with
-        if R has Field then Field
-        coerce: R -> $
-            ++ coerce(r) views r as a value in the ordinary differential ring.
-        coerce: $ -> R
-            ++ coerce(p) views p as a valie in the partial differential ring.
-    DRcapsule == R add
-        n: Integer
-        Rep := R
-        coerce(u:R):$ == u::Rep::$
-        coerce(p:$):R == p::Rep::R
-        differentiate p       == differentiate(p, var)
-
-        if R has Field then
-            p / q     == ((p::R) /$R (q::R))::$
-            p ** n    == ((p::R) **$R n)::$
-            inv(p)    == (inv(p::R)$R)::$
-
-@
-\section{domain DPMO DirectProductModule}
-<<domain DPMO DirectProductModule>>=
-)abbrev domain DPMO DirectProductModule
-++ Author:  Stephen M. Watt
-++ Date Created: 1986
-++ Date Last Updated: June 4, 1991
-++ Basic Operations:
-++ Related Domains:
-++ Also See:
-++ AMS Classifications:
-++ Keywords: equation
-++ Examples:
-++ References:
-++ Description:
-++   This constructor provides a direct product of R-modules
-++   with an R-module view.
-
-DirectProductModule(n, R, S): DPcategory == DPcapsule where
-    n: NonNegativeInteger
-    R: Ring
-    S: LeftModule(R)
-
-    DPcategory == Join(DirectProductCategory(n,S), LeftModule(R))
-    --  with if S has Algebra(R) then Algebra(R)
-    --  <above line leads to matchMmCond: unknown form of condition>
-
-    DPcapsule == DirectProduct(n,S) add
-        Rep := Vector(S)
-        r:R * x:$ == [r * x.i for i in 1..n]
-
-@
-\section{domain DPMM DirectProductMatrixModule}
-<<domain DPMM DirectProductMatrixModule>>=
-)abbrev domain DPMM DirectProductMatrixModule
-++ Author:  Stephen M. Watt
-++ Date Created: 1986
-++ Date Last Updated: June 4, 1991
-++ Basic Operations:
-++ Related Domains:
-++ Also See:
-++ AMS Classifications:
-++ Keywords: equation
-++ Examples:
-++ References:
-++ Description:
-++   This constructor provides a direct product type with a
-++   left matrix-module view.
-
-DirectProductMatrixModule(n, R, M, S): DPcategory == DPcapsule where
-    n: PositiveInteger
-    R: Ring
-    RowCol ==> DirectProduct(n,R)
-    M: SquareMatrixCategory(n,R,RowCol,RowCol)
-    S: LeftModule(R)
-
-    DPcategory == Join(DirectProductCategory(n,S), LeftModule(R), LeftModule(M))
-
-    DPcapsule == DirectProduct(n, S) add
-        Rep := Vector(S)
-        r:R * x:$ == [r*x.i for i in 1..n]
-        m:M * x:$ == [ +/[m(i,j)*x.j for j in 1..n] for i in 1..n]
-
-@
 \section{License}
 <<license>>=
 --Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
@@ -282,11 +141,7 @@ DirectProductMatrixModule(n, R, M, S): DPcategory == DPcapsule where
 <<*>>=
 <<license>>
 
-<<domain OMLO OppositeMonogenicLinearOperator>>
 <<package NCODIV NonCommutativeOperatorDivision>>
-<<domain ODR OrdinaryDifferentialRing>>
-<<domain DPMO DirectProductModule>>
-<<domain DPMM DirectProductMatrixModule>>
 @
 \eject
 \begin{thebibliography}{99}
diff --git a/src/algebra/matrix.spad.pamphlet b/src/algebra/matrix.spad.pamphlet
deleted file mode 100644
index 590cd3e..0000000
--- a/src/algebra/matrix.spad.pamphlet
+++ /dev/null
@@ -1,1586 +0,0 @@
-\documentclass{article}
-\usepackage{axiom}
-\begin{document}
-\title{\$SPAD/src/algebra matrix.spad}
-\author{Johannes Grabmeier, Oswald Gschnitzer, Clifton J. Williamson}
-\maketitle
-\begin{abstract}
-\end{abstract}
-\eject
-\tableofcontents
-\eject
-\section{domain IMATRIX IndexedMatrix}
-<<domain IMATRIX IndexedMatrix>>=
-)abbrev domain IMATRIX IndexedMatrix
-++ Author: Grabmeier, Gschnitzer, Williamson
-++ Date Created: 1987
-++ Date Last Updated: July 1990
-++ Basic Operations:
-++ Related Domains: Matrix, RectangularMatrix, SquareMatrix,
-++   StorageEfficientMatrixOperations
-++ Also See:
-++ AMS Classifications:
-++ Keywords: matrix, linear algebra
-++ Examples:
-++ References:
-++ Description:
-++   An \spad{IndexedMatrix} is a matrix where the minimal row and column
-++   indices are parameters of the type.  The domains Row and Col
-++   are both IndexedVectors.
-++   The index of the 'first' row may be obtained by calling the
-++   function \spadfun{minRowIndex}.  The index of the 'first' column may
-++   be obtained by calling the function \spadfun{minColIndex}.  The index of
-++   the first element of a 'Row' is the same as the index of the
-++   first column in a matrix and vice versa.
-IndexedMatrix(R,mnRow,mnCol): Exports == Implementation where
-  R : Ring
-  mnRow, mnCol : Integer
-  Row ==> IndexedVector(R,mnCol)
-  Col ==> IndexedVector(R,mnRow)
-  MATLIN ==> MatrixLinearAlgebraFunctions(R,Row,Col,$)
- 
-  Exports ==> MatrixCategory(R,Row,Col)
- 
-  Implementation ==>
-    InnerIndexedTwoDimensionalArray(R,mnRow,mnCol,Row,Col) add
- 
-      swapRows_!(x,i1,i2) ==
-        (i1 < minRowIndex(x)) or (i1 > maxRowIndex(x)) or _
-           (i2 < minRowIndex(x)) or (i2 > maxRowIndex(x)) =>
-             error "swapRows!: index out of range"
-        i1 = i2 => x
-        minRow := minRowIndex x
-        xx := x pretend PrimitiveArray(PrimitiveArray(R))
-        n1 := i1 - minRow; n2 := i2 - minRow
-        row1 := qelt(xx,n1)
-        qsetelt_!(xx,n1,qelt(xx,n2))
-        qsetelt_!(xx,n2,row1)
-        xx pretend $
- 
-      if R has commutative("*") then
- 
-        determinant x == determinant(x)$MATLIN
-        minordet    x == minordet(x)$MATLIN
- 
-      if R has EuclideanDomain then
- 
-        rowEchelon  x == rowEchelon(x)$MATLIN
- 
-      if R has IntegralDomain then
- 
-        rank        x == rank(x)$MATLIN
-        nullity     x == nullity(x)$MATLIN
-        nullSpace   x == nullSpace(x)$MATLIN
- 
-      if R has Field then
- 
-        inverse     x == inverse(x)$MATLIN
-
-@
-\section{domain MATRIX Matrix}
-<<Matrix.input>>=
--- matrix.spad.pamphlet Matrix.input
-)spool Matrix.output
-)set message test on
-)set message auto off
-)clear all
---S 1 of 38
-m : Matrix(Integer) := new(3,3,0)
---R 
---R
---R        +0  0  0+
---R        |       |
---R   (1)  |0  0  0|
---R        |       |
---R        +0  0  0+
---R                                                         Type: Matrix Integer
---E 1
-
---S 2 of 38
-setelt(m,2,3,5)
---R 
---R
---R   (2)  5
---R                                                        Type: PositiveInteger
---E 2
-
---S 3 of 38
-m(1,2) := 10
---R 
---R
---R   (3)  10
---R                                                        Type: PositiveInteger
---E 3
-
---S 4 of 38
-m
---R 
---R
---R        +0  10  0+
---R        |        |
---R   (4)  |0  0   5|
---R        |        |
---R        +0  0   0+
---R                                                         Type: Matrix Integer
---E 4
-
---S 5 of 38
-matrix [ [1,2,3,4],[0,9,8,7] ]
---R 
---R
---R        +1  2  3  4+
---R   (5)  |          |
---R        +0  9  8  7+
---R                                                         Type: Matrix Integer
---E 5
-
---S 6 of 38
-dm := diagonalMatrix [1,x**2,x**3,x**4,x**5]
---R 
---R
---R        +1  0   0   0   0 +
---R        |                 |
---R        |    2            |
---R        |0  x   0   0   0 |
---R        |                 |
---R        |        3        |
---R   (6)  |0  0   x   0   0 |
---R        |                 |
---R        |            4    |
---R        |0  0   0   x   0 |
---R        |                 |
---R        |                5|
---R        +0  0   0   0   x +
---R                                              Type: Matrix Polynomial Integer
---E 6
-
---S 7 of 38
-setRow!(dm,5,vector [1,1,1,1,1])
---R 
---R
---R        +1  0   0   0   0+
---R        |                |
---R        |    2           |
---R        |0  x   0   0   0|
---R        |                |
---R   (7)  |        3       |
---R        |0  0   x   0   0|
---R        |                |
---R        |            4   |
---R        |0  0   0   x   0|
---R        |                |
---R        +1  1   1   1   1+
---R                                              Type: Matrix Polynomial Integer
---E 7
-
---S 8 of 38
-setColumn!(dm,2,vector [y,y,y,y,y])
---R 
---R
---R        +1  y  0   0   0+
---R        |               |
---R        |0  y  0   0   0|
---R        |               |
---R        |       3       |
---R   (8)  |0  y  x   0   0|
---R        |               |
---R        |           4   |
---R        |0  y  0   x   0|
---R        |               |
---R        +1  y  1   1   1+
---R                                              Type: Matrix Polynomial Integer
---E 8
-
---S 9 of 38
-cdm := copy(dm)
---R 
---R
---R        +1  y  0   0   0+
---R        |               |
---R        |0  y  0   0   0|
---R        |               |
---R        |       3       |
---R   (9)  |0  y  x   0   0|
---R        |               |
---R        |           4   |
---R        |0  y  0   x   0|
---R        |               |
---R        +1  y  1   1   1+
---R                                              Type: Matrix Polynomial Integer
---E 9
-
---S 10 of 38
-setelt(dm,4,1,1-x**7)
---R 
---R
---R            7
---R   (10)  - x  + 1
---R                                                     Type: Polynomial Integer
---E 10
-
---S 11 of 38
-[dm,cdm]
---R 
---R
---R          +   1      y  0   0   0+ +1  y  0   0   0+
---R          |                      | |               |
---R          |   0      y  0   0   0| |0  y  0   0   0|
---R          |                      | |               |
---R          |              3       | |       3       |
---R   (11)  [|   0      y  x   0   0|,|0  y  x   0   0|]
---R          |                      | |               |
---R          |   7              4   | |           4   |
---R          |- x  + 1  y  0   x   0| |0  y  0   x   0|
---R          |                      | |               |
---R          +   1      y  1   1   1+ +1  y  1   1   1+
---R                                         Type: List Matrix Polynomial Integer
---E 11
-
---S 12 of 38
-subMatrix(dm,2,3,2,4)
---R 
---R
---R         +y  0   0+
---R   (12)  |        |
---R         |    3   |
---R         +y  x   0+
---R                                              Type: Matrix Polynomial Integer
---E 12
-
---S 13 of 38
-d := diagonalMatrix [1.2,-1.3,1.4,-1.5]
---R 
---R
---R         +1.2   0.0   0.0   0.0 +
---R         |                      |
---R         |0.0  - 1.3  0.0   0.0 |
---R   (13)  |                      |
---R         |0.0   0.0   1.4   0.0 |
---R         |                      |
---R         +0.0   0.0   0.0  - 1.5+
---R                                                           Type: Matrix Float
---E 13
-
---S 14 of 38
-e := matrix [ [6.7,9.11],[-31.33,67.19] ]
---R 
---R
---R         +  6.7    9.11 +
---R   (14)  |              |
---R         +- 31.33  67.19+
---R                                                           Type: Matrix Float
---E 14
-
---S 15 of 38
-setsubMatrix!(d,1,2,e)
---R 
---R
---R         +1.2    6.7    9.11    0.0 +
---R         |                          |
---R         |0.0  - 31.33  67.19   0.0 |
---R   (15)  |                          |
---R         |0.0    0.0     1.4    0.0 |
---R         |                          |
---R         +0.0    0.0     0.0   - 1.5+
---R                                                           Type: Matrix Float
---E 15
-
---S 16 of 38
-d
---R 
---R
---R         +1.2    6.7    9.11    0.0 +
---R         |                          |
---R         |0.0  - 31.33  67.19   0.0 |
---R   (16)  |                          |
---R         |0.0    0.0     1.4    0.0 |
---R         |                          |
---R         +0.0    0.0     0.0   - 1.5+
---R                                                           Type: Matrix Float
---E 16
-
---S 17 of 38
-a := matrix [ [1/2,1/3,1/4],[1/5,1/6,1/7] ]
---R 
---R
---R         +1  1  1+
---R         |-  -  -|
---R         |2  3  4|
---R   (17)  |       |
---R         |1  1  1|
---R         |-  -  -|
---R         +5  6  7+
---R                                                Type: Matrix Fraction Integer
---E 17
-
---S 18 of 38
-b := matrix [ [3/5,3/7,3/11],[3/13,3/17,3/19] ] 
---R 
---R
---R         +3   3    3+
---R         |-   -   --|
---R         |5   7   11|
---R   (18)  |          |
---R         | 3   3   3|
---R         |--  --  --|
---R         +13  17  19+
---R                                                Type: Matrix Fraction Integer
---E 18
-
---S 19 of 38
-horizConcat(a,b)
---R 
---R
---R         +1  1  1  3   3    3+
---R         |-  -  -  -   -   --|
---R         |2  3  4  5   7   11|
---R   (19)  |                   |
---R         |1  1  1   3   3   3|
---R         |-  -  -  --  --  --|
---R         +5  6  7  13  17  19+
---R                                                Type: Matrix Fraction Integer
---E 19
-
---S 20 of 38
-vab := vertConcat(a,b)
---R 
---R
---R         +1   1   1 +
---R         |-   -   - |
---R         |2   3   4 |
---R         |          |
---R         |1   1   1 |
---R         |-   -   - |
---R         |5   6   7 |
---R   (20)  |          |
---R         |3   3    3|
---R         |-   -   --|
---R         |5   7   11|
---R         |          |
---R         | 3   3   3|
---R         |--  --  --|
---R         +13  17  19+
---R                                                Type: Matrix Fraction Integer
---E 20
-
---S 21 of 38
-transpose vab
---R 
---R
---R         +1  1  3    3+
---R         |-  -  -   --|
---R         |2  5  5   13|
---R         |            |
---R         |1  1  3    3|
---R   (21)  |-  -  -   --|
---R         |3  6  7   17|
---R         |            |
---R         |1  1   3   3|
---R         |-  -  --  --|
---R         +4  7  11  19+
---R                                                Type: Matrix Fraction Integer
---E 21
-
---S 22 of 38
-m := matrix [ [1,2],[3,4] ]
---R 
---R
---R         +1  2+
---R   (22)  |    |
---R         +3  4+
---R                                                         Type: Matrix Integer
---E 22
-
---S 23 of 38
-4 * m * (-5)
---R 
---R
---R         +- 20  - 40+
---R   (23)  |          |
---R         +- 60  - 80+
---R                                                         Type: Matrix Integer
---E 23
-
---S 24 of 38
-n := matrix([ [1,0,-2],[-3,5,1] ])
---R 
---R
---R         + 1   0  - 2+
---R   (24)  |           |
---R         +- 3  5   1 +
---R                                                         Type: Matrix Integer
---E 24
-
---S 25 of 38
-m * n
---R 
---R
---R         +- 5  10   0 +
---R   (25)  |            |
---R         +- 9  20  - 2+
---R                                                         Type: Matrix Integer
---E 25
-
---S 26 of 38
-vec := column(n,3)
---R 
---R
---R   (26)  [- 2,1]
---R                                                         Type: Vector Integer
---E 26
-
---S 27 of 38
-vec * m
---R 
---R
---R   (27)  [1,0]
---R                                                         Type: Vector Integer
---E 27
-
---S 28 of 38
-m * vec
---R 
---R
---R   (28)  [0,- 2]
---R                                                         Type: Vector Integer
---E 28
-
---S 29 of 38
-hilb := matrix([ [1/(i + j) for i in 1..3] for j in 1..3])
---R 
---R
---R         +1  1  1+
---R         |-  -  -|
---R         |2  3  4|
---R         |       |
---R         |1  1  1|
---R   (29)  |-  -  -|
---R         |3  4  5|
---R         |       |
---R         |1  1  1|
---R         |-  -  -|
---R         +4  5  6+
---R                                                Type: Matrix Fraction Integer
---E 29
-
---S 30 of 38
-inverse(hilb)
---R 
---R
---R         + 72    - 240   180 +
---R         |                   |
---R   (30)  |- 240   900   - 720|
---R         |                   |
---R         + 180   - 720   600 +
---R                                     Type: Union(Matrix Fraction Integer,...)
---E 30
-
---S 31 of 38
-mm := matrix([ [1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ])
---R 
---R
---R         +1   2   3   4 +
---R         |              |
---R         |5   6   7   8 |
---R   (31)  |              |
---R         |9   10  11  12|
---R         |              |
---R         +13  14  15  16+
---R                                                         Type: Matrix Integer
---E 31
-
---S 32 of 38
-inverse(mm)
---R 
---R
---R   (32)  "failed"
---R                                                    Type: Union("failed",...)
---E 32
-
---S 33 of 38
-determinant(mm)
---R 
---R
---R   (33)  0
---R                                                     Type: NonNegativeInteger
---E 33
-
---S 34 of 38
-trace(mm)
---R 
---R
---R   (34)  34
---R                                                        Type: PositiveInteger
---E 34
-
---S 35 of 38
-rank(mm)
---R 
---R
---R   (35)  2
---R                                                        Type: PositiveInteger
---E 35
-
---S 36 of 38
-nullity(mm)
---R 
---R
---R   (36)  2
---R                                                        Type: PositiveInteger
---E 36
-
---S 37 of 38
-nullSpace(mm)
---R 
---R
---R   (37)  [[1,- 2,1,0],[2,- 3,0,1]]
---R                                                    Type: List Vector Integer
---E 37
-
---S 38 of 38
-rowEchelon(mm)
---R 
---R
---R         +1  2  3  4 +
---R         |           |
---R         |0  4  8  12|
---R   (38)  |           |
---R         |0  0  0  0 |
---R         |           |
---R         +0  0  0  0 +
---R                                                         Type: Matrix Integer
---E 38
-)spool
-)lisp (bye)
-@
-<<Matrix.help>>=
-====================================================================
-Matrix examples
-====================================================================
-
-The Matrix domain provides arithmetic operations on matrices
-and standard functions from linear algebra.
-This domain is similar to the TwoDimensionalArray domain, except
-that the entries for Matrix must belong to a  Ring.
-
-====================================================================
-Creating Matrices
-====================================================================
-
-There are many ways to create a matrix from a collection of values or
-from existing matrices.
-
-If the matrix has almost all items equal to the same value, use new to
-create a matrix filled with that value and then reset the entries that
-are different.
-
-  m : Matrix(Integer) := new(3,3,0)
-    +0  0  0+
-    |       |
-    |0  0  0|
-    |       |
-    +0  0  0+
-                      Type: Matrix Integer
-
-To change the entry in the second row, third column to 5, use setelt.
-
-  setelt(m,2,3,5)
-    5
-                      Type: PositiveInteger
-
-An alternative syntax is to use assignment.
-
-  m(1,2) := 10
-    10
-                      Type: PositiveInteger
-
-The matrix was destructively modified.
-
-  m
-    +0  10  0+
-    |        |
-    |0  0   5|
-    |        |
-    +0  0   0+
-                      Type: Matrix Integer
-
-If you already have the matrix entries as a list of lists, use matrix.
-
-  matrix [ [1,2,3,4],[0,9,8,7] ]
-    +1  2  3  4+
-    |          |
-    +0  9  8  7+
-                      Type: Matrix Integer
-
-If the matrix is diagonal, use diagonalMatrix.
-
-  dm := diagonalMatrix [1,x**2,x**3,x**4,x**5]
-        +1  0   0   0   0 +
-        |                 |
-        |    2            |
-        |0  x   0   0   0 |
-        |                 |
-        |        3        |
-        |0  0   x   0   0 |
-        |                 |
-        |            4    |
-        |0  0   0   x   0 |
-        |                 |
-        |                5|
-        +0  0   0   0   x +
-                     Type: Matrix Polynomial Integer
-
-Use setRow and setColumn to change a row or column of a matrix.
-
-  setRow!(dm,5,vector [1,1,1,1,1])
-        +1  0   0   0   0+
-        |                |
-        |    2           |
-        |0  x   0   0   0|
-        |                |
-        |        3       |
-        |0  0   x   0   0|
-        |                |
-        |            4   |
-        |0  0   0   x   0|
-        |                |
-        +1  1   1   1   1+
-                    Type: Matrix Polynomial Integer
-
-  setColumn!(dm,2,vector [y,y,y,y,y])
-        +1  y  0   0   0+
-        |               |
-        |0  y  0   0   0|
-        |               |
-        |       3       |
-        |0  y  x   0   0|
-        |               |
-        |           4   |
-        |0  y  0   x   0|
-        |               |
-        +1  y  1   1   1+
-                    Type: Matrix Polynomial Integer
-
-Use copy to make a copy of a matrix.
-
-  cdm := copy(dm)
-        +1  y  0   0   0+
-        |               |
-        |0  y  0   0   0|
-        |               |
-        |       3       |
-        |0  y  x   0   0|
-        |               |
-        |           4   |
-        |0  y  0   x   0|
-        |               |
-        +1  y  1   1   1+
-                    Type: Matrix Polynomial Integer
-
-This is useful if you intend to modify a matrix destructively but
-want a copy of the original.
-
-  setelt(dm,4,1,1-x**7)
-        7
-     - x  + 1
-                    Type: Polynomial Integer
-
-  [dm,cdm]
-          +   1      y  0   0   0+ +1  y  0   0   0+
-          |                      | |               |
-          |   0      y  0   0   0| |0  y  0   0   0|
-          |                      | |               |
-          |              3       | |       3       |
-         [|   0      y  x   0   0|,|0  y  x   0   0|]
-          |                      | |               |
-          |   7              4   | |           4   |
-          |- x  + 1  y  0   x   0| |0  y  0   x   0|
-          |                      | |               |
-          +   1      y  1   1   1+ +1  y  1   1   1+
-                     Type: List Matrix Polynomial Integer
-
-Use subMatrix to extract part of an existing matrix.  The syntax is 
-subMatrix(m, firstrow, lastrow, firstcol, lastcol).
-
-  subMatrix(dm,2,3,2,4)
-         +y  0   0+
-         |        |
-         |    3   |
-         +y  x   0+
-                     Type: Matrix Polynomial Integer
-
-To change a submatrix, use setsubMatrix.
-
-  d := diagonalMatrix [1.2,-1.3,1.4,-1.5]
-         +1.2   0.0   0.0   0.0 +
-         |                      |
-         |0.0  - 1.3  0.0   0.0 |
-         |                      |
-         |0.0   0.0   1.4   0.0 |
-         |                      |
-         +0.0   0.0   0.0  - 1.5+
-                     Type: Matrix Float
-
-If e is too big to fit where you specify, an error message is
-displayed.  Use subMatrix to extract part of e, if necessary.
-
-  e := matrix [ [6.7,9.11],[-31.33,67.19] ]
-         +  6.7    9.11 +
-         |              |
-         +- 31.33  67.19+
-                      Type: Matrix Float
-
-This changes the submatrix of d whose upper left corner is at the
-first row and second column and whose size is that of e.
-
-  setsubMatrix!(d,1,2,e)
-         +1.2    6.7    9.11    0.0 +
-         |                          |
-         |0.0  - 31.33  67.19   0.0 |
-         |                          |
-         |0.0    0.0     1.4    0.0 |
-         |                          |
-         +0.0    0.0     0.0   - 1.5+
-                       Type: Matrix Float
-
-  d
-         +1.2    6.7    9.11    0.0 +
-         |                          |
-         |0.0  - 31.33  67.19   0.0 |
-         |                          |
-         |0.0    0.0     1.4    0.0 |
-         |                          |
-         +0.0    0.0     0.0   - 1.5+
-                        Type: Matrix Float
-
-Matrices can be joined either horizontally or vertically to make
-new matrices.
-
-  a := matrix [ [1/2,1/3,1/4],[1/5,1/6,1/7] ]
-         +1  1  1+
-         |-  -  -|
-         |2  3  4|
-         |       |
-         |1  1  1|
-         |-  -  -|
-         +5  6  7+
-                         Type: Matrix Fraction Integer
-
-  b := matrix [ [3/5,3/7,3/11],[3/13,3/17,3/19] ] 
-         +3   3    3+
-         |-   -   --|
-         |5   7   11|
-         |          |
-         | 3   3   3|
-         |--  --  --|
-         +13  17  19+
-                         Type: Matrix Fraction Integer
-
-Use horizConcat to append them side to side.  The two matrices must
-have the same number of rows.
-
-  horizConcat(a,b)
-         +1  1  1  3   3    3+
-         |-  -  -  -   -   --|
-         |2  3  4  5   7   11|
-         |                   |
-         |1  1  1   3   3   3|
-         |-  -  -  --  --  --|
-         +5  6  7  13  17  19+
-                         Type: Matrix Fraction Integer
-
-Use vertConcat to stack one upon the other.  The two matrices must
-have the same number of columns.
-
-  vab := vertConcat(a,b)
-         +1   1   1 +
-         |-   -   - |
-         |2   3   4 |
-         |          |
-         |1   1   1 |
-         |-   -   - |
-         |5   6   7 |
-         |          |
-         |3   3    3|
-         |-   -   --|
-         |5   7   11|
-         |          |
-         | 3   3   3|
-         |--  --  --|
-         +13  17  19+
-                         Type: Matrix Fraction Integer
-
-The operation transpose is used to create a new matrix by reflection
-across the main diagonal.
-
-  transpose vab
-         +1  1  3    3+
-         |-  -  -   --|
-         |2  5  5   13|
-         |            |
-         |1  1  3    3|
-         |-  -  -   --|
-         |3  6  7   17|
-         |            |
-         |1  1   3   3|
-         |-  -  --  --|
-         +4  7  11  19+
-                         Type: Matrix Fraction Integer
-
-====================================================================
-Operations on Matrices
-====================================================================
-
-Axiom provides both left and right scalar multiplication.
-
-  m := matrix [ [1,2],[3,4] ]
-         +1  2+
-         |    |
-         +3  4+
-                          Type: Matrix Integer
-
-  4 * m * (-5)
-         +- 20  - 40+
-         |          |
-         +- 60  - 80+
-                          Type: Matrix Integer
-
-You can add, subtract, and multiply matrices provided, of course, that
-the matrices have compatible dimensions.  If not, an error message is
-displayed.
-
-  n := matrix([ [1,0,-2],[-3,5,1] ])
-         + 1   0  - 2+
-         |           |
-         +- 3  5   1 +
-                          Type: Matrix Integer
-
-This following product is defined but n * m is not.
-
-  m * n
-         +- 5  10   0 +
-         |            |
-         +- 9  20  - 2+
-                          Type: Matrix Integer
-
-The operations nrows and ncols return the number of rows and columns
-of a matrix.  You can extract a row or a column of a matrix using the
-operations row and column.  The object returned is a Vector.
-
-Here is the third column of the matrix n.
-
-  vec := column(n,3)
-     [- 2,1]
-                          Type: Vector Integer
-
-You can multiply a matrix on the left by a "row vector" and on the right
-by a "column vector".
-
-  vec * m
-     [1,0]
-                          Type: Vector Integer
-
-Of course, the dimensions of the vector and the matrix must be compatible
-or an error message is returned.
-
-  m * vec
-    [0,- 2]
-                          Type: Vector Integer
-
-The operation inverse computes the inverse of a matrix if the matrix
-is invertible, and returns "failed" if not.
-
-This Hilbert matrix is invertible.
-
-  hilb := matrix([ [1/(i + j) for i in 1..3] for j in 1..3])
-         +1  1  1+
-         |-  -  -|
-         |2  3  4|
-         |       |
-         |1  1  1|
-         |-  -  -|
-         |3  4  5|
-         |       |
-         |1  1  1|
-         |-  -  -|
-         +4  5  6+
-                          Type: Matrix Fraction Integer
-
-  inverse(hilb)
-         + 72    - 240   180 +
-         |                   |
-         |- 240   900   - 720|
-         |                   |
-         + 180   - 720   600 +
-                          Type: Union(Matrix Fraction Integer,...)
-
-This matrix is not invertible.
-
-  mm := matrix([ [1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ])
-         +1   2   3   4 +
-         |              |
-         |5   6   7   8 |
-         |              |
-         |9   10  11  12|
-         |              |
-         +13  14  15  16+
-                           Type: Matrix Integer
-
-  inverse(mm)
-     "failed"
-                           Type: Union("failed",...)
-
-The operation determinant computes the determinant of a matrix
-provided that the entries of the matrix belong to a CommutativeRing.
-
-The above matrix mm is not invertible and, hence, must have determinant 0.
-
-  determinant(mm)
-    0
-                           Type: NonNegativeInteger
-
-The operation trace computes the trace of a square matrix.
-
-  trace(mm)
-    34
-                           Type: PositiveInteger
-
-The operation rank computes the rank of a matrix: the maximal number
-of linearly independent rows or columns.
-
-  rank(mm)
-    2
-                           Type: PositiveInteger
-
-The operation nullity computes the nullity of a matrix: the dimension
-of its null space.
-
-  nullity(mm)
-    2
-                           Type: PositiveInteger
-
-The operation nullSpace returns a list containing a basis for the null
-space of a matrix.  Note that the nullity is the number of elements in
-a basis for the null space.
-
-  nullSpace(mm)
-    [[1,- 2,1,0],[2,- 3,0,1]]
-                           Type: List Vector Integer
-
-The operation rowEchelon returns the row echelon form of a matrix.  It
-is easy to see that the rank of this matrix is two and that its
-nullity is also two.
-
-  rowEchelon(mm)
-         +1  2  3  4 +
-         |           |
-         |0  4  8  12|
-         |           |
-         |0  0  0  0 |
-         |           |
-         +0  0  0  0 +
-                           Type: Matrix Integer
-
-See Also
-o )help OneDimensionalArray
-o )help TwoDimensionalArray
-o )help Vector
-o )help Permanent
-o )show Matrix
-o $AXIOM/doc/src/algebra/matrix.spad.dvi
-
-@
-<<domain MATRIX Matrix>>=
-)abbrev domain MATRIX Matrix
-++ Author: Grabmeier, Gschnitzer, Williamson
-++ Date Created: 1987
-++ Date Last Updated: July 1990
-++ Basic Operations:
-++ Related Domains: IndexedMatrix, RectangularMatrix, SquareMatrix
-++ Also See:
-++ AMS Classifications:
-++ Keywords: matrix, linear algebra
-++ Examples:
-++ References:
-++ Description:
-++   \spadtype{Matrix} is a matrix domain where 1-based indexing is used
-++   for both rows and columns.
-Matrix(R): Exports == Implementation where
-  R : Ring
-  Row ==> Vector R
-  Col ==> Vector R
-  mnRow ==> 1
-  mnCol ==> 1
-  MATLIN ==> MatrixLinearAlgebraFunctions(R,Row,Col,$)
-  MATSTOR ==> StorageEfficientMatrixOperations(R)
- 
-  Exports ==> MatrixCategory(R,Row,Col) with
-    diagonalMatrix: Vector R -> $
-      ++ \spad{diagonalMatrix(v)} returns a diagonal matrix where the elements
-      ++ of v appear on the diagonal.
-
-    if R has ConvertibleTo InputForm then ConvertibleTo InputForm
-
-    if R has Field then
-      inverse: $ -> Union($,"failed")
-        ++ \spad{inverse(m)} returns the inverse of the matrix m. 
-        ++ If the matrix is not invertible, "failed" is returned.
-        ++ Error: if the matrix is not square.
---     matrix: Vector Vector R -> $
---       ++ \spad{matrix(v)} converts the vector of vectors v to a matrix, where
---       ++ the vector of vectors is viewed as a vector of the rows of the
---       ++ matrix
---     diagonalMatrix: Vector $ -> $
---       ++ \spad{diagonalMatrix([m1,...,mk])} creates a block diagonal matrix
---       ++ M with block matrices {\em m1},...,{\em mk} down the diagonal,
---       ++ with 0 block matrices elsewhere.
---     vectorOfVectors: $ -> Vector Vector R
---       ++ \spad{vectorOfVectors(m)} returns the rows of the matrix m as a
---       ++ vector of vectors
- 
-  Implementation ==>
-   InnerIndexedTwoDimensionalArray(R,mnRow,mnCol,Row,Col) add
-    minr ==> minRowIndex
-    maxr ==> maxRowIndex
-    minc ==> minColIndex
-    maxc ==> maxColIndex
-    mini ==> minIndex
-    maxi ==> maxIndex
- 
-    minRowIndex x == mnRow
-    minColIndex x == mnCol
- 
-    swapRows_!(x,i1,i2) ==
-        (i1 < minRowIndex(x)) or (i1 > maxRowIndex(x)) or _
-           (i2 < minRowIndex(x)) or (i2 > maxRowIndex(x)) =>
-             error "swapRows!: index out of range"
-        i1 = i2 => x
-        minRow := minRowIndex x
-        xx := x pretend PrimitiveArray(PrimitiveArray(R))
-        n1 := i1 - minRow; n2 := i2 - minRow
-        row1 := qelt(xx,n1)
-        qsetelt_!(xx,n1,qelt(xx,n2))
-        qsetelt_!(xx,n2,row1)
-        xx pretend $
- 
-    positivePower:($,Integer,NonNegativeInteger) -> $
-    positivePower(x,n,nn) ==
---      one? n => x
-      (n = 1) => x
-      -- no need to allocate space for 3 additional matrices
-      n = 2 => x * x
-      n = 3 => x * x * x
-      n = 4 => (y := x * x; y * y)
-      a := new(nn,nn,0) pretend Matrix(R)
-      b := new(nn,nn,0) pretend Matrix(R)
-      c := new(nn,nn,0) pretend Matrix(R)
-      xx := x pretend Matrix(R)
-      power_!(a,b,c,xx,n :: NonNegativeInteger)$MATSTOR pretend $
- 
-    x:$ ** n:NonNegativeInteger ==
-      not((nn := nrows x) = ncols x) =>
-        error "**: matrix must be square"
-      zero? n => scalarMatrix(nn,1)
-      positivePower(x,n,nn)
- 
-    if R has commutative("*") then
- 
-        determinant x 