diff --git a/books/bookvol10.2.pamphlet b/books/bookvol10.2.pamphlet
index 377b5af..e6ea693 100644
--- a/books/bookvol10.2.pamphlet
+++ b/books/bookvol10.2.pamphlet
@@ -284,9 +284,11 @@ This is the root of the category hierarchy and is not represented by code.
 
 {\bf See:}\\
 \pageto{BasicType}{BASTYPE}
-\pageto{Eltable}{ELTAB}
 \pageto{CoercibleTo}{KOERCE}
 \pageto{ConvertibleTo}{KONVERT}
+\pageto{Eltable}{ELTAB}
+\pageto{InnerEvalable}{IEVALAB}
+\pageto{Logic}{LOGIC}
 \pageto{RetractableTo}{RETRACT}
 \pageto{Type}{TYPE}
 
@@ -603,6 +605,97 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{InnerEvalable}{IEVALAB}
+\pagepic{ps/v102innerevalable.ps}{IEVALAB}{1.00}
+
+{\bf See:}\\
+\pageto{Evalable}{EVALAB}
+\pagefrom{Category}{CATEGORY}
+
+{\bf Exports:}\\
+\begin{tabular}{l}
+\cross{IEVALAB}{eval}
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ eval : (%,A,B) -> %                  
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ eval : (%,List A,List B) -> %
+\end{verbatim}
+
+<<category IEVALAB InnerEvalable>>=
+)abbrev category IEVALAB InnerEvalable
+-- FOR THE BENEFIT OF LIBAX0 GENERATION
+++ Author:
+++ Date Created:
+++ Date Last Updated: June 3, 1991
+++ Basic Operations:
+++ Related Domains:
+++ Also See: Evalable
+++ AMS Classifications:
+++ Keywords: equation
+++ Examples:
+++ References:
+++ Description:
+++   This category provides \spadfun{eval} operations.
+++   A domain may belong to this category if it is possible to make
+++   ``evaluation'' substitutions.  The difference between this
+++   and \spadtype{Evalable} is that the operations in this category
+++   specify the substitution as a pair of arguments rather than as
+++   an equation.
+InnerEvalable(A:SetCategory, B:Type): Category == with
+    eval: ($, A, B) -> $
+       ++ eval(f, x, v) replaces x by v in f.
+    eval: ($, List A, List B) -> $
+       ++ eval(f, [x1,...,xn], [v1,...,vn]) replaces xi by vi in f.
+ add
+    eval(f:$, x:A, v:B) == eval(f, [x], [v])
+
+@
+<<IEVALAB.dotabb>>=
+"IEVALAB"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=IEVALAB"];
+"IEVALAB" -> "CATEGORY"
+
+@
+<<IEVALAB.dotfull>>=
+"InnerEvalable(a:SetCategory,b:Type)"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=IEVALAB"];
+"InnerEvalable(a:SetCategory,b:Type)" -> "Category"
+
+"InnerEvalable(a:SetCategory,b:SetCategory)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=IEVALAB"];
+"InnerEvalable(a:SetCategory,b:SetCategory)" ->
+    "InnerEvalable(a:SetCategory,b:Type)"
+
+"InnerEvalable(a:Ring,MultivariateTaylorSeriesCategory(a:Ring,b:OrderedSet))"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=IEVALAB"];
+"InnerEvalable(a:Ring,MultivariateTaylorSeriesCategory(a:Ring,b:OrderedSet))"
+     -> "InnerEvalable(a:SetCategory,b:Type)"
+
+"InnerEvalable(Kernal(ExpressionSpace),ExpressionSpace)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=IEVALAB"];
+"InnerEvalable(Kernal(ExpressionSpace),ExpressionSpace)" ->
+    "InnerEvalable(a:SetCategory,b:Type)"
+@
+<<IEVALAB.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"InnerEvalable(a:SetCategory,b:Type)" [color=lightblue];
+"InnerEvalable(a:SetCategory,b:Type)" -> "Category"
+
+"Category" [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{RetractableTo}{RETRACT}
 \pagepic{ps/v102retractableto.ps}{RETRACT}{1.00}
 
@@ -972,6 +1065,184 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Evalable}{EVALAB}
+\pagepic{ps/v102evalable.ps}{EVALAB}{1.00}
+
+{\bf See:}\\
+\pagefrom{InnerEvalable}{IEVALAB}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ eval : (%,List Equation R) -> %       
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+eval : (%,Equation R) -> %
+eval : (%,List R,List R) -> %
+\end{verbatim}
+
+These exports come from InnerEvalable(R:SetCategory,R:SetCategory):
+\begin{verbatim}
+ eval : (%,R,R) -> %                   
+\end{verbatim}
+
+<<category EVALAB Evalable>>=
+)abbrev category EVALAB Evalable
+++ Author:
+++ Date Created:
+++ Date Last Updated: June 3, 1991
+++ Basic Operations:
+++ Related Domains:
+++ Also See: FullyEvalable
+++ AMS Classifications:
+++ Keywords: equation
+++ Examples:
+++ References:
+++ Description:
+++   This category provides \spadfun{eval} operations.
+++   A domain may belong to this category if it is possible to make
+++   ``evaluation'' substitutions.
+Evalable(R:SetCategory): Category == InnerEvalable(R,R) with
+    eval: ($, Equation R) -> $
+       ++ eval(f,x = v) replaces x by v in f.
+    eval: ($, List Equation R) -> $
+       ++ eval(f, [x1 = v1,...,xn = vn]) replaces xi by vi in f.
+ add
+    eval(f:$, eq:Equation R) == eval(f, [eq])
+    eval(f:$, xs:List R,vs:List R) == eval(f,[x=v for x in xs for v in vs])
+
+@
+<<EVALAB.dotabb>>=
+"EVALAB"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=EVALAB"];
+"EVALAB" -> "IEVALAB"
+
+@
+<<EVALAB.dotfull>>=
+"Evalable(a:SetCategory)"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=EVALAB"];
+"Evalable(a:SetCategory)" -> "InnerEvalable(a:SetCategory,b:SetCategory)"
+
+"Evalable(MultivariateTaylorSeriesCategory(a:Ring,b:OrderedSet))"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=EVALAB"];
+"Evalable(MultivariateTaylorSeriesCategory(a:Ring,b:OrderedSet))" ->
+    "Evalable(a:SetCategory)"
+
+"Evalable(ExpressionSpace)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=EVALAB"];
+"Evalable(ExpressionSpace)" -> "Evalable(a:SetCategory)"
+
+@
+<<EVALAB.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"Evalable(a:SetCategory)" [color=lightblue];
+"Evalable(a:SetCategory)" -> "InnerEvalable(a:SetCategory,b:SetCategory)"
+
+"InnerEvalable(a:SetCategory,b:SetCategory)" [color=seagreen];
+"InnerEvalable(a:SetCategory,b:SetCategory)" ->
+    "InnerEvalable(a:SetCategory,b:Type)"
+
+"InnerEvalable(a:SetCategory,b:Type)" [color=lightblue];
+"InnerEvalable(a:SetCategory,b:Type)" -> "Category"
+
+"Category" [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Logic}{LOGIC}
+\pagepic{ps/v102logic.ps}{LOGIC}{1.00}
+
+{\bf See:}\\
+\pageto{BitAggregate}{BTAGG}
+\pagefrom{BasicType}{BASTYPE}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{LOGIC}{?$/\backslash{}$?}
+\cross{LOGIC}{?=?}
+\cross{LOGIC}{?$\backslash{}/$?}
+\cross{LOGIC}{\~{}?}
+\cross{LOGIC}{?\~{}=?}
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ ~? : % -> %
+ ?/\? : (%,%) -> %                    
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ ?\/? : (%,%) -> %                    
+\end{verbatim}
+
+These exports come from BasicType():
+\begin{verbatim}
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean              
+\end{verbatim}
+
+<<category LOGIC Logic>>=
+)abbrev category LOGIC Logic
+++ Author: 
+++ Date Created:
+++ Change History:
+++ Basic Operations: ~, /\, \/
+++ Related Constructors:
+++ Keywords: boolean
+++ Description:  
+++ `Logic' provides the basic operations for lattices,
+++ e.g., boolean algebra.
+Logic: Category == BasicType with
+       _~:        % -> %
+	++ ~(x) returns the logical complement of x.
+       _/_\:       (%, %) -> %
+	++ \spadignore { /\ }returns the logical `meet', e.g. `and'.
+       _\_/:       (%, %) -> %
+	++ \spadignore{ \/ } returns the logical `join', e.g. `or'.
+  add
+    _\_/(x: %,y: %) == _~( _/_\(_~(x), _~(y)))
+
+@
+<<LOGIC.dotabb>>=
+"LOGIC"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=LOGIC"];
+"LOGIC" -> "BASTYPE"
+
+@
+<<LOGIC.dotfull>>=
+"Logic()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=LOGIC"];
+"Logic()" -> "BasicType()"
+
+@
+<<LOGIC.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"Logic()" [color=lightblue];
+"Logic()" -> "BasicType()"
+
+"BasicType()" [color=lightblue];
+"BasicType()" -> "Category"
+
+"Category" [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{SetCategory}{SETCAT}
 \pagepic{ps/v102setcategory.ps}{SETCAT}{1.00}
 
@@ -1082,7 +1353,7 @@ digraph pic {
 \chapter{Category Layer 3}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{AbelianSemiGroup}{ABELSG}
-\pagepic{ps/v102abeliansemigroup.ps}{ABELSG}{1.00}
+\pagepic{ps/v102abeliansemigroup.ps}{ABELSG}{0.75}
 
 {\bf See:}\\
 \pageto{AbelianMonoid}{ABELMON}
@@ -1537,6 +1808,7 @@ digraph pic {
 \pagepic{ps/v102orderedset.ps}{ORDSET}{1.00}
 
 {\bf See:}\\
+\pageto{BitAggregate}{BTAGG}
 \pageto{OrderedAbelianSemiGroup}{OASGP}
 \pageto{OrderedFinite}{ORDFIN}
 \pageto{OrderedMonoid}{ORDMON}
@@ -7869,6 +8141,7 @@ digraph pic {
 \pagepic{ps/v102onedimensionalarrayaggregate.ps}{A1AGG}{1.00}
 
 {\bf See:}\\
+\pageto{BitAggregate}{BTAGG}
 \pageto{StringAggregate}{SRAGG}
 \pagefrom{FiniteLinearAggregate}{FLAGG}
 
@@ -8344,6 +8617,7 @@ digraph pic {
 "CLAGG..." [color=lightblue];
 "IXAGG..." [color=lightblue];
 }
+
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{FiniteSetAggregate}{FSAGG}
@@ -9639,11 +9913,14 @@ These exports come from MultiDictionary(S:SetCategory):
  construct : List S -> %              
  convert : % -> InputForm if S has KONVERT INFORM
  copy : % -> %
- count : (S,%) -> NonNegativeInteger if S has SETCAT and $ has finiteAggregate
- count : ((S -> Boolean),%) -> NonNegativeInteger if $ has finiteAggregate
+ count : (S,%) -> NonNegativeInteger 
+     if S has SETCAT and $ has finiteAggregate
+ count : ((S -> Boolean),%) -> NonNegativeInteger 
+     if $ has finiteAggregate
  dictionary : List S -> %             
  dictionary : () -> %
- duplicates : % -> List Record(entry: S,count: NonNegativeInteger)
+ duplicates : % -> 
+     List Record(entry: S,count: NonNegativeInteger)
  empty : () -> %                      
  empty? : % -> Boolean
  eq? : (%,%) -> Boolean               
@@ -9662,21 +9939,31 @@ These exports come from MultiDictionary(S:SetCategory):
  less? : (%,NonNegativeInteger) -> Boolean
  map : ((S -> S),%) -> %
  map! : ((S -> S),%) -> % if $ has shallowlyMutable
- member? : (S,%) -> Boolean if S has SETCAT and $ has finiteAggregate
+ member? : (S,%) -> Boolean 
+     if S has SETCAT and $ has finiteAggregate
  members : % -> List S if $ has finiteAggregate
  more? : (%,NonNegativeInteger) -> Boolean
  parts : % -> List S if $ has finiteAggregate
- reduce : (((S,S) -> S),%) -> S if $ has finiteAggregate
- reduce : (((S,S) -> S),%,S) -> S if $ has finiteAggregate
- reduce : (((S,S) -> S),%,S,S) -> S if S has SETCAT and $ has finiteAggregate
- remove : ((S -> Boolean),%) -> % if $ has finiteAggregate
- remove : (S,%) -> % if S has SETCAT and $ has finiteAggregate
- removeDuplicates : % -> % if S has SETCAT and $ has finiteAggregate
+ reduce : (((S,S) -> S),%) -> S 
+     if $ has finiteAggregate
+ reduce : (((S,S) -> S),%,S) -> S 
+     if $ has finiteAggregate
+ reduce : (((S,S) -> S),%,S,S) -> S 
+     if S has SETCAT and $ has finiteAggregate
+ remove : ((S -> Boolean),%) -> % 
+     if $ has finiteAggregate
+ remove : (S,%) -> % 
+     if S has SETCAT and $ has finiteAggregate
+ removeDuplicates : % -> % 
+     if S has SETCAT and $ has finiteAggregate
  removeDuplicates! : % -> %           
- remove! : ((S -> Boolean),%) -> % if $ has finiteAggregate
+ remove! : ((S -> Boolean),%) -> % 
+     if $ has finiteAggregate
  remove! : (S,%) -> % if $ has finiteAggregate
- select : ((S -> Boolean),%) -> % if $ has finiteAggregate
- select! : ((S -> Boolean),%) -> % if $ has finiteAggregate
+ select : ((S -> Boolean),%) -> % 
+     if $ has finiteAggregate
+ select! : ((S -> Boolean),%) -> % 
+     if $ has finiteAggregate
  size? : (%,NonNegativeInteger) -> Boolean
  #? : % -> NonNegativeInteger if $ has finiteAggregate
  ?~=? : (%,%) -> Boolean              
@@ -10957,7 +11244,7 @@ digraph pic {
 \chapter{Category Layer 8}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{AssociationListAggregate}{ALAGG}
-\pagepic{ps/v102associationlistaggregate.ps}{ALAGG}{0.50}
+\pagepic{ps/v102associationlistaggregate.ps}{ALAGG}{0.45}
 
 {\bf See:}\\
 \pagefrom{ListAggregate}{LSAGG}
@@ -11466,6 +11753,9 @@ digraph pic {
 \pagepic{ps/v102bimodule.ps}{BMODULE}{1.00}
 
 {\bf See:}\\
+\pageto{CommutativeRing}{COMRING}
+\pageto{EntireRing}{ENTIRER}
+\pageto{Module}{MODULE}
 \pagefrom{LeftModule}{LMODULE}
 \pagefrom{RightModule}{RMODULE}
 
@@ -11564,8 +11854,7 @@ digraph pic {
  bgcolor="#FFFF66";
  node [shape=box, color=white, style=filled];
 
-"BiModule(a:Ring,b:Ring)"
- [color=lightblue,href="bookvol10.2.pdf#nameddest=BMODULE"];
+"BiModule(a:Ring,b:Ring)" [color=lightblue];
 "BiModule(a:Ring,b:Ring)" -> "LeftModule(a:Ring)"
 "BiModule(a:Ring,b:Ring)" -> "RightModule(a:Ring)"
 
@@ -11592,14 +11881,347 @@ digraph pic {
 "REPDB..." [color="#00EE00"];
 }
 
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{BitAggregate}{BTAGG}
+\pagepic{ps/v102bitaggregate.ps}{BTAGG}{0.65}
+
+{\bf See:}\\
+\pagefrom{Logic}{LOGIC}
+\pagefrom{OneDimensionalArrayAggregate}{A1AGG}
+\pagefrom{OrderedSet}{ORDSET}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{BTAGG}{any?} &
+\cross{BTAGG}{coerce} &
+\cross{BTAGG}{concat} &
+\cross{BTAGG}{construct} &
+\cross{BTAGG}{convert} \\
+\cross{BTAGG}{copy} &
+\cross{BTAGG}{copyInto!} &
+\cross{BTAGG}{count} &
+\cross{BTAGG}{delete} &
+\cross{BTAGG}{elt} \\
+\cross{BTAGG}{empty} &
+\cross{BTAGG}{empty?} &
+\cross{BTAGG}{entry?} &
+\cross{BTAGG}{entries} &
+\cross{BTAGG}{eq?} \\
+\cross{BTAGG}{eval} &
+\cross{BTAGG}{every?} &
+\cross{BTAGG}{fill!} &
+\cross{BTAGG}{find} &
+\cross{BTAGG}{first} \\
+\cross{BTAGG}{hash} &
+\cross{BTAGG}{index?} &
+\cross{BTAGG}{indices} &
+\cross{BTAGG}{insert} &
+\cross{BTAGG}{latex} \\
+\cross{BTAGG}{less?} &
+\cross{BTAGG}{map} &
+\cross{BTAGG}{map!} &
+\cross{BTAGG}{max} &
+\cross{BTAGG}{maxIndex} \\
+\cross{BTAGG}{member?} &
+\cross{BTAGG}{members} &
+\cross{BTAGG}{merge} &
+\cross{BTAGG}{min} &
+\cross{BTAGG}{minIndex} \\
+\cross{BTAGG}{more?} &
+\cross{BTAGG}{nand} &
+\cross{BTAGG}{new} &
+\cross{BTAGG}{nor} &
+\cross{BTAGG}{not?} \\
+\cross{BTAGG}{parts} &
+\cross{BTAGG}{position} &
+\cross{BTAGG}{qelt} &
+\cross{BTAGG}{qsetelt!} &
+\cross{BTAGG}{reduce} \\
+\cross{BTAGG}{remove} &
+\cross{BTAGG}{removeDuplicates} &
+\cross{BTAGG}{reverse} &
+\cross{BTAGG}{reverse!} &
+\cross{BTAGG}{sample} \\
+\cross{BTAGG}{select} &
+\cross{BTAGG}{setelt} &
+\cross{BTAGG}{size?} &
+\cross{BTAGG}{sort} &
+\cross{BTAGG}{sort!} \\
+\cross{BTAGG}{sorted?} &
+\cross{BTAGG}{swap!} &
+\cross{BTAGG}{xor} &
+\cross{BTAGG}{\#?} &
+\cross{BTAGG}{?$/\backslash{}$?} \\
+\cross{BTAGG}{?$<$?} &
+\cross{BTAGG}{?$<=$?} &
+\cross{BTAGG}{?=?} &
+\cross{BTAGG}{?$>$?} &
+\cross{BTAGG}{?$>=$?} \\
+\cross{BTAGG}{?$\backslash{}/$?} &
+\cross{BTAGG}{\^{}?} &
+\cross{BTAGG}{?and?} &
+\cross{BTAGG}{?.?} &
+\cross{BTAGG}{?or?} \\
+\cross{BTAGG}{\~{}?} &
+\cross{BTAGG}{?\~{}=?} &&&
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ ?and? : (%,%) -> %                   
+ ?or? : (%,%) -> %                    
+ xor : (%,%) -> %                     
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ not? : % -> %
+ ^? : % -> %
+ ~? : % -> %
+ ?/\? : (%,%) -> %                    
+ ?\/? : (%,%) -> %                    
+ nand : (%,%) -> %
+ nor : (%,%) -> %                     
+\end{verbatim}
+
+These exports come from OrderedSet():
+\begin{verbatim}
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String                  
+ max : (%,%) -> %
+ min : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean              
+ ?<? : (%,%) -> Boolean
+ ?>? : (%,%) -> Boolean               
+ ?<=? : (%,%) -> Boolean              
+ ?>=? : (%,%) -> Boolean
+\end{verbatim}
+
+TPDHERE: Note that none of the exports of Logic are needed.
+Perhaps this can be eliminated.
+
+These exports come from OneDimensionalArrayAggregate(Boolean):
+\begin{verbatim}
+ any? : ((Boolean -> Boolean),%) -> Boolean 
+     if $ has finiteAggregate
+ concat : (%,%) -> %                  
+ concat : List % -> %
+ concat : (%,Boolean) -> %            
+ concat : (Boolean,%) -> %
+ construct : List Boolean -> %        
+ convert : % -> InputForm 
+     if Boolean has KONVERT INFORM
+ copy : % -> %
+ copyInto! : (%,%,Integer) -> % 
+     if $ has shallowlyMutable
+ count : (Boolean,%) -> NonNegativeInteger 
+     if Boolean has SETCAT and $ has finiteAggregate
+ count : ((Boolean -> Boolean),%) -> NonNegativeInteger 
+     if $ has finiteAggregate
+ delete : (%,UniversalSegment Integer) -> %
+ delete : (%,Integer) -> %            
+ elt : (%,Integer,Boolean) -> Boolean
+ empty : () -> %                      
+ empty? : % -> Boolean
+ entry? : (Boolean,%) -> Boolean 
+     if $ has finiteAggregate and Boolean has SETCAT
+ entries : % -> List Boolean          
+ eq? : (%,%) -> Boolean
+ eval : (%,List Equation Boolean) -> % 
+     if Boolean has EVALAB BOOLEAN and Boolean has SETCAT
+ eval : (%,Equation Boolean) -> % 
+     if Boolean has EVALAB BOOLEAN and Boolean has SETCAT
+ eval : (%,Boolean,Boolean) -> % 
+     if Boolean has EVALAB BOOLEAN and Boolean has SETCAT
+ eval : (%,List Boolean,List Boolean) -> % 
+     if Boolean has EVALAB BOOLEAN and Boolean has SETCAT
+ every? : ((Boolean -> Boolean),%) -> Boolean 
+     if $ has finiteAggregate
+ fill! : (%,Boolean) -> % 
+     if $ has shallowlyMutable
+ find : ((Boolean -> Boolean),%) -> Union(Boolean,"failed")
+ first : % -> Boolean if Integer has ORDSET
+ index? : (Integer,%) -> Boolean
+ indices : % -> List Integer          
+ insert : (Boolean,%,Integer) -> %
+ insert : (%,%,Integer) -> %
+ less? : (%,NonNegativeInteger) -> Boolean
+ map : ((Boolean -> Boolean),%) -> %
+ map : (((Boolean,Boolean) -> Boolean),%,%) -> %
+ map! : ((Boolean -> Boolean),%) -> % 
+     if $ has shallowlyMutable
+ maxIndex : % -> Integer if Integer has ORDSET
+ member? : (Boolean,%) -> Boolean 
+     if Boolean has SETCAT and $ has finiteAggregate
+ members : % -> List Boolean if $ has finiteAggregate
+ merge : (%,%) -> % if Boolean has ORDSET
+ minIndex : % -> Integer if Integer has ORDSET
+ more? : (%,NonNegativeInteger) -> Boolean
+ new : (NonNegativeInteger,Boolean) -> %
+ merge : (((Boolean,Boolean) -> Boolean),%,%) -> %
+ parts : % -> List Boolean if $ has finiteAggregate
+ position : ((Boolean -> Boolean),%) -> Integer
+ position : (Boolean,%,Integer) -> Integer 
+     if Boolean has SETCAT
+ position : (Boolean,%) -> Integer 
+     if Boolean has SETCAT
+ qelt : (%,Integer) -> Boolean
+ qsetelt! : (%,Integer,Boolean) -> Boolean 
+     if $ has shallowlyMutable
+ reverse : % -> %                     
+ reduce : (((Boolean,Boolean) -> Boolean),%) -> Boolean 
+     if $ has finiteAggregate
+ reduce : (((Boolean,Boolean) -> Boolean),%,Boolean) -> Boolean 
+     if $ has finiteAggregate
+ reduce : 
+  (((Boolean,Boolean) -> Boolean),%,Boolean,Boolean) -> Boolean 
+     if Boolean has SETCAT and $ has finiteAggregate
+ remove : (Boolean,%) -> % 
+     if Boolean has SETCAT and $ has finiteAggregate
+ remove : ((Boolean -> Boolean),%) -> % 
+     if $ has finiteAggregate
+ removeDuplicates : % -> % 
+     if Boolean has SETCAT and $ has finiteAggregate
+ reverse! : % -> % if $ has shallowlyMutable
+ sample : () -> %
+ setelt : (%,UniversalSegment Integer,Boolean) -> Boolean 
+     if $ has shallowlyMutable
+ select : ((Boolean -> Boolean),%) -> % 
+     if $ has finiteAggregate
+ setelt : (%,Integer,Boolean) -> Boolean 
+     if $ has shallowlyMutable
+ size? : (%,NonNegativeInteger) -> Boolean
+ sort : (((Boolean,Boolean) -> Boolean),%) -> %
+ sort : % -> % if Boolean has ORDSET
+ sort! : % -> % 
+     if Boolean has ORDSET and $ has shallowlyMutable
+ sort! : (((Boolean,Boolean) -> Boolean),%) -> % 
+     if $ has shallowlyMutable
+ sorted? : % -> Boolean if Boolean has ORDSET
+ sorted? : (((Boolean,Boolean) -> Boolean),%) -> Boolean
+ swap! : (%,Integer,Integer) -> Void if $ has shallowlyMutable
+ ?.? : (%,UniversalSegment Integer) -> %
+ #? : % -> NonNegativeInteger if $ has finiteAggregate
+ ?.? : (%,Integer) -> Boolean
+\end{verbatim}
+
+<<category BTAGG BitAggregate>>=
+)abbrev category BTAGG BitAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The bit aggregate category models aggregates representing large
+++ quantities of Boolean data.
+BitAggregate(): Category ==
+  Join(OrderedSet, Logic, OneDimensionalArrayAggregate Boolean) with
+    "not": % -> %
+      ++ not(b) returns the logical {\em not} of bit aggregate 
+      ++ \axiom{b}.
+    "^"  : % -> %
+      ++ ^ b returns the logical {\em not} of bit aggregate 
+      ++ \axiom{b}.
+    nand : (%, %) -> %
+      ++ nand(a,b) returns the logical {\em nand} of bit aggregates 
+      ++ \axiom{a} and \axiom{b}.
+    nor	 : (%, %) -> %
+      ++ nor(a,b) returns the logical {\em nor} of bit aggregates 
+      ++ \axiom{a} and \axiom{b}.
+    _and : (%, %) -> %
+      ++ a and b returns the logical {\em and} of bit aggregates 
+      ++ \axiom{a} and \axiom{b}.
+    _or	 : (%, %) -> %
+      ++ a or b returns the logical {\em or} of bit aggregates 
+      ++ \axiom{a} and \axiom{b}.
+    xor	 : (%, %) -> %
+      ++ xor(a,b) returns the logical {\em exclusive-or} of bit aggregates
+      ++ \axiom{a} and \axiom{b}.
+
+ add
+   not v      == map(_not, v)
+   _^ v	      == map(_not, v)
+   _~(v)      == map(_~, v)
+   _/_\(v, u) == map(_/_\, v, u)
+   _\_/(v, u) == map(_\_/, v, u)
+   nand(v, u) == map(nand, v, u)
+   nor(v, u)  == map(nor, v, u)
 
+@
+<<BTAGG.dotabb>>=
+"BTAGG" [color=lightblue,href="bookvol10.2.pdf#nameddest=BTAGG"];
+"BTAGG" -> "ORDSET"
+"BTAGG" -> "LOGIC"
+"BTAGG" -> "A1AGG"
 
+@
+<<BTAGG.dotfull>>=
+"BitAggregate()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=BTAGG"];
+"BitAggregate()" -> "OrderedSet()"
+"BitAggregate()" -> "Logic()"
+"BitAggregate()" -> "OneDimensionalArrayAggregate(Boolean)"
 
+@
+<<BTAGG.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"BitAggregate()" [color=lightblue];
+"BitAggregate()" -> "OrderedSet()"
+"BitAggregate()" -> "Logic()"
+"BitAggregate()" -> "OneDimensionalArrayAggregate(Boolean)"
+
+"OneDimensionalArrayAggregate(Boolean)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=A1AGG"];
+"OneDimensionalArrayAggregate(Boolean)" ->    
+    "OneDimensionalArrayAggregate(a:Type)"
+
+"OneDimensionalArrayAggregate(a:Type)" [color=lightblue];
+"OneDimensionalArrayAggregate(a:Type)" -> 
+    "FiniteLinearAggregate(a:Type)"
+
+"FiniteLinearAggregate(a:Type)" [color=lightblue];
+"FiniteLinearAggregate(a:Type)" -> "LinearAggregate(a:Type)"
+
+"LinearAggregate(a:Type)" [color=lightblue];
+"LinearAggregate(a:Type)" -> "IXAGG..."
+"LinearAggregate(a:Type)" -> "CLAGG..."
 
+"OrderedSet()" [color=lightblue];
+"OrderedSet()" -> "SetCategory()"
+
+"SetCategory()" [color=lightblue];
+"SetCategory()" -> "BasicType()"
+"SetCategory()" -> "CoercibleTo(OutputForm)"
+
+"CoercibleTo(OutputForm)" [color=seagreen];
+"CoercibleTo(OutputForm)" -> "CoercibleTo(a:Type)"
+
+"CoercibleTo(a:Type)" [color=lightblue];
+"CoercibleTo(a:Type)" -> "Category"
 
+"Logic()" [color=lightblue];
+"Logic()" -> "BasicType()"
 
+"BasicType()" [color=lightblue];
+"BasicType()" -> "Category"
 
+"Category" [color=lightblue];
 
+"CLAGG..." [color=lightblue];
+"IXAGG..." [color=lightblue];
+}
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -11938,7 +12560,8 @@ These exports come from MultisetAggregate(S:OrderedSet):
  dictionary : () -> %
  difference : (%,S) -> %
  difference : (%,%) -> %              
- duplicates : % -> List Record(entry: S,count: NonNegativeInteger)
+ duplicates : % -> 
+     List Record(entry: S,count: NonNegativeInteger)
  empty : () -> %                      
  empty? : % -> Boolean
  eq? : (%,%) -> Boolean               
@@ -12094,7 +12717,16 @@ digraph pic {
 \pagepic{ps/v102ring.ps}{RING}{1.00}
 
 {\bf See:}\\
+\pageto{Algebra}{ALGEBRA}
+\pageto{CharacteristicNonZero}{CHARNZ}
+\pageto{CharacteristicZero}{CHARZ}
+\pageto{CommutativeRing}{COMRING}
+\pageto{DifferentialExtension}{DIFEXT}
+\pageto{DifferentialRing}{DIFRING}
+\pageto{EntireRing}{ENTIRER}
+\pageto{LinearlyExplicitRingOver}{LINEXP}
 \pageto{OrderedRing}{ORDRING}
+\pageto{PartialDifferentialRing}{PDRING}
 \pagefrom{LeftModule}{LMODULE}
 \pagefrom{Monoid}{MONOID}
 \pagefrom{Rng}{RNG}
@@ -12168,10 +12800,6 @@ These exports come from Monoid():
 TPDHERE: Note that none of the exports of LeftModule are needed.
 Perhaps this can be eliminated.
 
-These exports come from LeftModule(Ring):
-\begin{verbatim}
-\end{verbatim}
-
 <<category RING Ring>>=
 )abbrev category RING Ring
 ++ Author:
@@ -12262,10 +12890,902 @@ digraph pic {
 @
 \chapter{Category Layer 9}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{CharacteristicNonZero}{CHARNZ}
+\pagepic{ps/v102characteristicnonzero.ps}{CHARNZ}{0.90}
+
+{\bf See:}\\
+\pagefrom{Ring}{RING}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{CHARNZ}{1} &
+\cross{CHARNZ}{0} &
+\cross{CHARNZ}{coerce} &
+\cross{CHARNZ}{hash} &
+\cross{CHARNZ}{latex} \\
+\cross{CHARNZ}{one?} &
+\cross{CHARNZ}{recip} &
+\cross{CHARNZ}{sample} &
+\cross{CHARNZ}{zero?} &
+\cross{CHARNZ}{characteristic} \\
+\cross{CHARNZ}{charthRoot} &
+\cross{CHARNZ}{subtractIfCan} &
+\cross{CHARNZ}{?\~{}=?} &
+\cross{CHARNZ}{?\^{}?} &
+\cross{CHARNZ}{?*?} \\
+\cross{CHARNZ}{?**?} &
+\cross{CHARNZ}{?+?} &
+\cross{CHARNZ}{?-?} &
+\cross{CHARNZ}{-?} &
+\cross{CHARNZ}{?=?} \\
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ charthRoot : % -> Union(%,"failed")
+\end{verbatim}
+
+These exports come from Ring():
+\begin{verbatim}
+ 1 : () -> %                          
+ 0 : () -> %
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ zero? : % -> Boolean                 
+ characteristic : () -> NonNegativeInteger
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ ?~=? : (%,%) -> Boolean
+ ?^? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?*? : (%,%) -> %                     
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %
+ ?+? : (%,%) -> %                     
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?=? : (%,%) -> Boolean
+\end{verbatim}
+
+<<category CHARNZ CharacteristicNonZero>>=
+)abbrev category CHARNZ CharacteristicNonZero
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ Rings of Characteristic Non Zero
+CharacteristicNonZero():Category == Ring with
+    charthRoot: % -> Union(%,"failed")
+       ++ charthRoot(x) returns the pth root of x
+       ++ where p is the characteristic of the ring.
+
+@
+<<CHARNZ.dotabb>>=
+"CHARNZ"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=CHARNZ"];
+"CHARNZ" -> "RING"
+
+@
+<<CHARNZ.dotfull>>=
+"CharacteristicNonZero()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=CHARNZ"];
+"CharacteristicNonZero()" -> "Ring()"
+
+@
+<<CHARNZ.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"CharacteristicNonZero()" [color=lightblue];
+"CharacteristicNonZero()" -> "Ring()"
+
+"Ring()" [color=lightblue];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+"Rng()" [color=lightblue];
+"Rng()" -> "AbelianGroup()"
+"Rng()" -> "SemiGroup()"
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "AbelianGroup()"
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CABMON..."
+"AbelianGroup()" -> "REPDB..."
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SETCAT..."
+"SemiGroup()" -> "REPSQ..."
+
+"REPDB..." [color="#00EE00"];
+"REPSQ..." [color="#00EE00"];
+"SETCAT..." [color=lightblue];
+"CABMON..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{CharacteristicZero}{CHARZ}
+\pagepic{ps/v102characteristiczero.ps}{CHARZ}{0.90}
+
+{\bf See:}\\
+\pagefrom{Ring}{RING}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{CHARZ}{1} &
+\cross{CHARZ}{0} &
+\cross{CHARZ}{coerce} &
+\cross{CHARZ}{hash} &
+\cross{CHARZ}{latex} \\
+\cross{CHARZ}{one?} &
+\cross{CHARZ}{recip} &
+\cross{CHARZ}{sample} &
+\cross{CHARZ}{zero?} &
+\cross{CHARZ}{characteristic} \\
+\cross{CHARZ}{subtractIfCan} &
+\cross{CHARZ}{?\~{}=?} &
+\cross{CHARZ}{?\^{}?} &
+\cross{CHARZ}{?*?} \\
+\cross{CHARZ}{?**?} &
+\cross{CHARZ}{?+?} &
+\cross{CHARZ}{?-?} &
+\cross{CHARZ}{-?} &
+\cross{CHARZ}{?=?} \\
+\end{tabular}
+
+These exports come from Ring():
+\begin{verbatim}
+ 1 : () -> %                          
+ 0 : () -> %
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ zero? : % -> Boolean                 
+ characteristic : () -> NonNegativeInteger
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ ?~=? : (%,%) -> Boolean
+ ?^? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?*? : (%,%) -> %                     
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %
+ ?+? : (%,%) -> %                     
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?=? : (%,%) -> Boolean
+\end{verbatim}
+
+<<category CHARZ CharacteristicZero>>=
+)abbrev category CHARZ CharacteristicZero
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ Rings of Characteristic Zero.
+CharacteristicZero():Category == Ring
+
+@
+<<CHARZ.dotabb>>=
+"CHARZ"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=CHARZ"];
+"CHARZ" -> "RING"
+
+@
+<<CHARZ.dotfull>>=
+"CharacteristicNonZero()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=CHARZ"];
+"CharacteristicNonZero()" -> "Ring()"
+
+@
+<<CHARZ.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"CharacteristicZero()" [color=lightblue];
+"CharacteristicZero()" -> "Ring()"
+
+"Ring()" [color=lightblue];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+"Rng()" [color=lightblue];
+"Rng()" -> "AbelianGroup()"
+"Rng()" -> "SemiGroup()"
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "AbelianGroup()"
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CABMON..."
+"AbelianGroup()" -> "REPDB..."
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SETCAT..."
+"SemiGroup()" -> "REPSQ..."
+
+"REPDB..." [color="#00EE00"];
+"REPSQ..." [color="#00EE00"];
+"SETCAT..." [color=lightblue];
+"CABMON..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{CommutativeRing}{COMRING}
+\pagepic{ps/v102commutativering.ps}{COMRING}{0.65}
+
+{\bf See:}\\
+\pageto{IntegralDomain}{INTDOM}
+\pagefrom{BiModule}{BMODULE}
+\pagefrom{Ring}{RING}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{COMRING}{1} &
+\cross{COMRING}{0} &
+\cross{COMRING}{coerce} &
+\cross{COMRING}{hash} &
+\cross{COMRING}{latex} \\
+\cross{COMRING}{one?} &
+\cross{COMRING}{recip} &
+\cross{COMRING}{sample} &
+\cross{COMRING}{zero?} &
+\cross{COMRING}{characteristic} \\
+\cross{COMRING}{subtractIfCan} &
+\cross{COMRING}{?\~{}=?} &
+\cross{COMRING}{?\^{}?} &
+\cross{COMRING}{?*?} &
+\cross{COMRING}{?**?} \\
+\cross{COMRING}{?+?} &
+\cross{COMRING}{?-?} &
+\cross{COMRING}{-?} &
+\cross{COMRING}{?=?} &
+\end{tabular}
+
+
+These exports come from Ring():
+\begin{verbatim}
+ 0 : () -> %
+ 1 : () -> %                          
+ characteristic : () -> NonNegativeInteger
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?^? : (%,PositiveInteger) -> %       
+ ?^? : (%,NonNegativeInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %
+\end{verbatim}
+
+TPDHERE: Note that none of the exports of BiModule(a:Ring,b:Ring)
+are needed. Perhaps this can be eliminated. 
+
+<<category COMRING CommutativeRing>>=
+)abbrev category COMRING CommutativeRing
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The category of commutative rings with unity, i.e. rings where
+++ \spadop{*} is commutative, and which have a multiplicative identity.
+++ element.
+--CommutativeRing():Category == Join(Ring,BiModule(%:Ring,%:Ring)) with
+CommutativeRing():Category == Join(Ring,BiModule(%,%)) with
+    commutative("*")  ++ multiplication is commutative.
+
+@
+<<COMRING.dotabb>>=
+"COMRING"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=COMRING"];
+"COMRING" -> "RING"
+"COMRING" -> "BMODULE"
+
+@
+<<COMRING.dotfull>>=
+"CommutativeRing()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=COMRING"];
+"CommutativeRing()" -> "Ring()"
+"CommutativeRing()" -> "BiModule(a:Ring,b:Ring)"
+
+@
+<<COMRING.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"CommutativeRing()" [color=lightblue];
+"CommutativeRing()" -> "Ring()"
+"CommutativeRing()" -> "BiModule(a:Ring,b:Ring)"
+
+"Ring()" [color=lightblue];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+"BiModule(a:Ring,b:Ring)" [color=lightblue];
+"BiModule(a:Ring,b:Ring)" -> "LeftModule(a:Ring)"
+"BiModule(a:Ring,b:Ring)" -> "RightModule(a:Ring)"
+
+"RightModule(a:Ring)" [color=seagreen];
+"RightModule(a:Ring)" -> "RightModule(a:Rng)"
+
+"RightModule(a:Rng)" [color=lightblue];
+"RightModule(a:Rng)" -> "AbelianGroup()"
+
+"Rng()" [color=lightblue];
+"Rng()" -> "AbelianGroup()"
+"Rng()" -> "SemiGroup()"
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "AbelianGroup()"
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CABMON..."
+"AbelianGroup()" -> "REPDB..."
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SETCAT..."
+"SemiGroup()" -> "REPSQ..."
+
+"REPDB..." [color="#00EE00"];
+"REPSQ..." [color="#00EE00"];
+"SETCAT..." [color=lightblue];
+"CABMON..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{DifferentialRing}{DIFRING}
+\pagepic{ps/v102differentialring.ps}{DIFRING}{0.90}
+
+{\bf See:}\\
+\pagefrom{Ring}{RING}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{DIFRING}{1} &
+\cross{DIFRING}{0} &
+\cross{DIFRING}{characteristic} &
+\cross{DIFRING}{coerce} &
+\cross{DIFRING}{D} \\
+\cross{DIFRING}{differentiate} &
+\cross{DIFRING}{hash} &
+\cross{DIFRING}{latex} &
+\cross{DIFRING}{one?} &
+\cross{DIFRING}{recip} \\
+\cross{DIFRING}{sample} &
+\cross{DIFRING}{subtractIfCan} &
+\cross{DIFRING}{zero?} &
+\cross{DIFRING}{?\~{}=?} &
+\cross{DIFRING}{?**?} \\
+\cross{DIFRING}{?\^{}?} &
+\cross{DIFRING}{?*?} &
+\cross{DIFRING}{?+?} &
+\cross{DIFRING}{?-?} &
+\cross{DIFRING}{-?} \\
+\cross{DIFRING}{?=?} &
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ differentiate : % -> %
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ D : % -> %
+ D : (%,NonNegativeInteger) -> %      
+ differentiate : (%,NonNegativeInteger) -> %
+\end{verbatim}
+
+These exports come from Ring():
+\begin{verbatim}
+ 1 : () -> %                          
+ 0 : () -> %
+ characteristic : () -> NonNegativeInteger
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger            
+ latex : % -> String
+ one? : % -> Boolean                  
+ recip : % -> Union(%,"failed")
+ sample : () -> %                     
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean
+ ?~=? : (%,%) -> Boolean              
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %
+ ?^? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?*? : (%,%) -> %                     
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?+? : (%,%) -> %                     
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?=? : (%,%) -> Boolean
+\end{verbatim}
+
+<<category DIFRING DifferentialRing>>=
+)abbrev category DIFRING DifferentialRing
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ An ordinary differential ring, that is, a ring with an operation
+++ \spadfun{differentiate}.
+++
+++ Axioms:
+++   \spad{differentiate(x+y) = differentiate(x)+differentiate(y)}
+++   \spad{differentiate(x*y) = x*differentiate(y) + differentiate(x)*y}
+
+DifferentialRing(): Category == Ring with
+    differentiate: % -> %
+         ++ differentiate(x) returns the derivative of x.
+         ++ This function is a simple differential operator
+         ++ where no variable needs to be specified.
+    D: % -> %
+         ++ D(x) returns the derivative of x.
+         ++ This function is a simple differential operator
+         ++ where no variable needs to be specified.
+    differentiate: (%, NonNegativeInteger) -> %
+         ++ differentiate(x, n) returns the n-th derivative of x.
+    D: (%, NonNegativeInteger) -> %
+         ++ D(x, n) returns the n-th derivative of x.
+  add
+    D r == differentiate r
+    differentiate(r, n) ==
+      for i in 1..n repeat r := differentiate r
+      r
+    D(r,n) == differentiate(r,n)
+
+@
+<<DIFRING.dotabb>>=
+"DIFRING"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=DIFRING"];
+"DIFRING" -> "RING"
+
+@
+<<DIFRING.dotfull>>=
+"DifferentialRing()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=DIFRING"];
+"DifferentialRing()" -> "Ring()"
+
+@
+<<DIFRING.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"DifferentialRing()" [color=lightblue];
+"DifferentialRing()" -> "Ring()"
+
+"Ring()" [color=lightblue];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+"Rng()" [color=lightblue];
+"Rng()" -> "AbelianGroup()"
+"Rng()" -> "SemiGroup()"
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "AbelianGroup()"
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CABMON..."
+"AbelianGroup()" -> "REPDB..."
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SETCAT..."
+"SemiGroup()" -> "REPSQ..."
+
+"REPDB..." [color="#00EE00"];
+"REPSQ..." [color="#00EE00"];
+"SETCAT..." [color=lightblue];
+"CABMON..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{EntireRing}{ENTIRER}
+\pagepic{ps/v102EntireRing.ps}{ENTIRER}{0.65}
+
+{\bf See:}\\
+\pageto{DivisionRing}{DIVRING}
+\pageto{IntegralDomain}{INTDOM}
+\pagefrom{BiModule}{BMODULE}
+\pagefrom{Ring}{RING}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{ENTIRER}{1} &
+\cross{ENTIRER}{0} &
+\cross{ENTIRER}{characteristic} &
+\cross{ENTIRER}{coerce} &
+\cross{ENTIRER}{hash} \\
+\cross{ENTIRER}{latex} &
+\cross{ENTIRER}{one?} &
+\cross{ENTIRER}{recip} &
+\cross{ENTIRER}{sample} &
+\cross{ENTIRER}{subtractIfCan} \\
+\cross{ENTIRER}{zero?} &
+\cross{ENTIRER}{?\^{}?} &
+\cross{ENTIRER}{?\~{}=?} &
+\cross{ENTIRER}{?*?} &
+\cross{ENTIRER}{?**?} \\
+\cross{ENTIRER}{?*?} &
+\cross{ENTIRER}{?+?} &
+\cross{ENTIRER}{?-?} &
+\cross{ENTIRER}{-?} &
+\cross{ENTIRER}{?=?} \\
+\end{tabular}
+
+These exports come from Ring():
+\begin{verbatim}
+ 0 : () -> %
+ 1 : () -> %                          
+ characteristic : () -> NonNegativeInteger
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?^? : (%,PositiveInteger) -> %       
+ ?^? : (%,NonNegativeInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %
+\end{verbatim}
+
+TPDHERE: Note that none of the exports of BiModule(a:Ring,b:Ring)
+are needed. Perhaps this can be eliminated. 
+
+<<category ENTIRER EntireRing>>=
+)abbrev category ENTIRER EntireRing
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ Entire Rings (non-commutative Integral Domains), i.e. a ring
+++ not necessarily commutative which has no zero divisors.
+++
+++ Axioms:
+++   \spad{ab=0 => a=0 or b=0}  -- known as noZeroDivisors
+++   \spad{not(1=0)}
+--EntireRing():Category == Join(Ring,BiModule(%:Ring,%:Ring)) with
+EntireRing():Category == Join(Ring,BiModule(%,%)) with
+      noZeroDivisors  ++ if a product is zero then one of the factors
+                      ++ must be zero.
+
+@
+<<ENTIRER.dotabb>>=
+"ENTIRER"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=ENTIRER"];
+"ENTIRER" -> "RING"
+"ENTIRER" -> "BMODULE"
+
+@
+<<ENTIRER.dotfull>>=
+"EntireRing()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=ENTIRER"];
+"EntireRing()" -> "Ring()"
+"EntireRing()" -> "BiModule(a:Ring,b:Ring)"
+
+@
+<<ENTIRER.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"EntireRing()" [color=lightblue];
+"EntireRing()" -> "Ring()"
+"EntireRing()" -> "BiModule(a:Ring,b:Ring)"
+
+"Ring()" [color=lightblue];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+"Rng()" [color=lightblue];
+"Rng()" -> "ABELGRP..."
+"Rng()" -> "SemiGroup()"
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"BiModule(a:Ring,b:Ring)" [color=lightblue];
+"BiModule(a:Ring,b:Ring)" -> "LeftModule(a:Ring)"
+"BiModule(a:Ring,b:Ring)" -> "RightModule(a:Ring)"
+
+"RightModule(a:Ring)" [color=seagreen];
+"RightModule(a:Ring)" -> "RightModule(a:Rng)"
+
+"RightModule(a:Rng)" [color=lightblue];
+"RightModule(a:Rng)" -> "ABELGRP..."
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "ABELGRP..."
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SETCAT..."
+"SemiGroup()" -> "REPSQ..."
+
+"REPSQ..." [color="#00EE00"];
+"SETCAT..." [color=lightblue];
+"ABELGRP..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{LinearlyExplicitRingOver}{LINEXP}
+\pagepic{ps/v102linearlyexplicitringover.ps}{LINEXP}{0.90}
+
+{\bf See:}\\
+\pageto{FullyLinearlyExplicitRingOver}{FLINEXP}
+\pagefrom{Ring}{RING}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{LINEXP}{0} &
+\cross{LINEXP}{1} &
+\cross{LINEXP}{characteristic} &
+\cross{LINEXP}{coerce} &
+\cross{LINEXP}{hash} \\
+\cross{LINEXP}{latex} &
+\cross{LINEXP}{one?} &
+\cross{LINEXP}{recip} &
+\cross{LINEXP}{reducedSystem} &
+\cross{LINEXP}{subtractIfCan} \\
+\cross{LINEXP}{sample} &
+\cross{LINEXP}{zero?} &
+\cross{LINEXP}{?*?} &
+\cross{LINEXP}{?**?} &
+\cross{LINEXP}{?+?} \\
+\cross{LINEXP}{?-?} &
+\cross{LINEXP}{-?} &
+\cross{LINEXP}{?=?} &
+\cross{LINEXP}{?\^{}?} &
+\cross{LINEXP}{?\~{}=?} \\
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ reducedSystem : (Matrix %,Vector %) -> 
+     Record(mat: Matrix R,vec: Vector R)
+ reducedSystem : Matrix % -> Matrix R
+\end{verbatim}
+
+These exports come from Ring():
+\begin{verbatim}
+ 0 : () -> %
+ 1 : () -> %                          
+ characteristic : () -> NonNegativeInteger
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (Integer,%) -> %
+ ?*? : (%,%) -> %                     
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?**? : (%,PositiveInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?^? : (%,NonNegativeInteger) -> %
+\end{verbatim}
+
+<<category LINEXP LinearlyExplicitRingOver>>=
+)abbrev category LINEXP LinearlyExplicitRingOver
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ An extension ring with an explicit linear dependence test.
+LinearlyExplicitRingOver(R:Ring): Category == Ring with
+  reducedSystem: Matrix % -> Matrix R
+    ++ reducedSystem(A) returns a matrix B such that \spad{A x = 0} 
+    ++ and \spad{B x = 0} have the same solutions in R.
+  reducedSystem: (Matrix %,Vector %) -> Record(mat:Matrix R,vec:Vector R)
+    ++ reducedSystem(A, v) returns a matrix B and a vector w such that
+    ++ \spad{A x = v} and \spad{B x = w} have the same solutions in R.
+
+@
+<<LINEXP.dotabb>>=
+"LINEXP"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=LINEXP"];
+"LINEXP" -> "RING"
+
+@
+<<LINEXP.dotfull>>=
+"LinearlyExplicitRingOver(a:Ring)"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=LINEXP"];
+"LinearlyExplicitRingOver(a:Ring)" -> "Ring()"
+
+"LinearlyExplicitRingOver(Integer)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=LINEXP"];
+"LinearlyExplicitRingOver(Integer)" -> "LinearlyExplicitRingOver(a:Ring)"
+
+"LinearlyExplicitRingOver(Fraction(Integer))"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=LINEXP"];
+"LinearlyExplicitRingOver(Fraction(Integer))" -> 
+    "LinearlyExplicitRingOver(a:Ring)"
+
+@
+<<LINEXP.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"LinearlyExplicitRingOver(a:Ring)" [color=lightblue];
+"LinearlyExplicitRingOver(a:Ring)" -> "Ring()"
+
+"Ring()" [color=lightblue];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+"Rng()" [color=lightblue];
+"Rng()" -> "AbelianGroup()"
+"Rng()" -> "SemiGroup()"
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "AbelianGroup()"
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CABMON..."
+"AbelianGroup()" -> "REPDB..."
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SETCAT..."
+"SemiGroup()" -> "REPSQ..."
+
+"REPDB..." [color="#00EE00"];
+"REPSQ..." [color="#00EE00"];
+"SETCAT..." [color=lightblue];
+"CABMON..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{OrderedRing}{ORDRING}
 \pagepic{ps/v102orderedring.ps}{ORDRING}{0.65}
 
 {\bf See:}\\
+\pageto{OrderedIntegralDomain}{OINTDOM}
 \pagefrom{Monoid}{MONOID}
 \pagefrom{OrderedAbelianGroup}{OAGROUP}
 \pagefrom{Ring}{RING}
@@ -12460,69 +13980,2944 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Category Layers}
-\section{category BTAGG BitAggregate}
-<<category BTAGG BitAggregate>>=
-)abbrev category BTAGG BitAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
+\pagehead{PartialDifferentialRing}{PDRING}
+\pagepic{ps/v102partialdifferentialring.ps}{PDRING}{1.00}
+
+{\bf See:}\\
+\pageto{DifferentialExtension}{DIFEXT}
+\pagefrom{Ring}{RING}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{PDRING}{1} &
+\cross{PDRING}{0} &
+\cross{PDRING}{characteristic} &
+\cross{PDRING}{coerce} &
+\cross{PDRING}{D} \\
+\cross{PDRING}{differentiate} &
+\cross{PDRING}{hash} &
+\cross{PDRING}{latex} &
+\cross{PDRING}{one?} &
+\cross{PDRING}{recip} \\
+\cross{PDRING}{sample} &
+\cross{PDRING}{subtractIfCan} &
+\cross{PDRING}{zero?} &
+\cross{PDRING}{?\^{}?} &
+\cross{PDRING}{?*?} \\
+\cross{PDRING}{?\~{}=?} &
+\cross{PDRING}{?**?} &
+\cross{PDRING}{?+?} &
+\cross{PDRING}{?-?} &
+\cross{PDRING}{-?} \\
+\cross{PDRING}{?=?} &
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ differentiate : (%,S) -> %           
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ differentiate : (%,List S) -> %
+ differentiate : (%,S,NonNegativeInteger) -> %
+ differentiate : (%,List S,List NonNegativeInteger) -> %
+ D : (%,S) -> %
+ D : (%,List S) -> %                  
+ D : (%,S,NonNegativeInteger) -> %
+ D : (%,List S,List NonNegativeInteger) -> %
+\end{verbatim}
+
+These exports come from Ring():
+\begin{verbatim}
+ characteristic : () -> NonNegativeInteger
+ 0 : () -> %
+ 1 : () -> %                          
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?^? : (%,PositiveInteger) -> %       
+ ?^? : (%,NonNegativeInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %
+\end{verbatim}
+
+These exports come from Evalable(a:Type):
+\begin{verbatim}
+\end{verbatim}
+
+These exports come from SetCategory:
+\begin{verbatim}
+\end{verbatim}
+
+<<category PDRING PartialDifferentialRing>>=
+)abbrev category PDRING PartialDifferentialRing
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
 ++ Related Constructors:
 ++ Also See:
 ++ AMS Classifications:
 ++ Keywords:
 ++ References:
 ++ Description:
-++ The bit aggregate category models aggregates representing large
-++ quantities of Boolean data.
-BitAggregate(): Category ==
-  Join(OrderedSet, Logic, OneDimensionalArrayAggregate Boolean) with
-    "not": % -> %
-      ++ not(b) returns the logical {\em not} of bit aggregate 
-      ++ \axiom{b}.
-    "^"  : % -> %
-      ++ ^ b returns the logical {\em not} of bit aggregate 
-      ++ \axiom{b}.
-    nand : (%, %) -> %
-      ++ nand(a,b) returns the logical {\em nand} of bit aggregates 
-      ++ \axiom{a} and \axiom{b}.
-    nor	 : (%, %) -> %
-      ++ nor(a,b) returns the logical {\em nor} of bit aggregates 
-      ++ \axiom{a} and \axiom{b}.
-    _and : (%, %) -> %
-      ++ a and b returns the logical {\em and} of bit aggregates 
-      ++ \axiom{a} and \axiom{b}.
-    _or	 : (%, %) -> %
-      ++ a or b returns the logical {\em or} of bit aggregates 
-      ++ \axiom{a} and \axiom{b}.
-    xor	 : (%, %) -> %
-      ++ xor(a,b) returns the logical {\em exclusive-or} of bit aggregates
-      ++ \axiom{a} and \axiom{b}.
+++ A partial differential ring with differentiations indexed by a 
+++ parameter type S.
+++
+++ Axioms:
+++  \spad{differentiate(x+y,e) = differentiate(x,e)+differentiate(y,e)}
+++  \spad{differentiate(x*y,e) = x*differentiate(y,e)+differentiate(x,e)*y}
+
+PartialDifferentialRing(S:SetCategory): Category == Ring with
+    differentiate: (%, S) -> %
+        ++ differentiate(x,v) computes the partial derivative of x
+        ++ with respect to v.
+    differentiate: (%, List S) -> %
+        ++ differentiate(x,[s1,...sn]) computes successive partial 
+        ++ derivatives,
+        ++ i.e. \spad{differentiate(...differentiate(x, s1)..., sn)}.
+    differentiate: (%, S, NonNegativeInteger) -> %
+        ++ differentiate(x, s, n) computes multiple partial derivatives, i.e.
+        ++ n-th derivative of x with respect to s.
+    differentiate: (%, List S, List NonNegativeInteger) -> %
+        ++ differentiate(x, [s1,...,sn], [n1,...,nn]) computes
+        ++ multiple partial derivatives, i.e.
+    D: (%, S) -> %
+        ++ D(x,v) computes the partial derivative of x
+        ++ with respect to v.
+    D: (%, List S) -> %
+        ++ D(x,[s1,...sn]) computes successive partial derivatives,
+        ++ i.e. \spad{D(...D(x, s1)..., sn)}.
+    D: (%, S, NonNegativeInteger) -> %
+        ++ D(x, s, n) computes multiple partial derivatives, i.e.
+        ++ n-th derivative of x with respect to s.
+    D: (%, List S, List NonNegativeInteger) -> %
+        ++ D(x, [s1,...,sn], [n1,...,nn]) computes
+        ++ multiple partial derivatives, i.e.
+        ++ \spad{D(...D(x, s1, n1)..., sn, nn)}.
+  add
+    differentiate(r:%, l:List S) ==
+      for s in l repeat r := differentiate(r, s)
+      r
+
+    differentiate(r:%, s:S, n:NonNegativeInteger) ==
+      for i in 1..n repeat r := differentiate(r, s)
+      r
 
+    differentiate(r:%, ls:List S, ln:List NonNegativeInteger) ==
+      for s in ls for n in ln repeat r := differentiate(r, s, n)
+      r
+
+    D(r:%, v:S) == differentiate(r,v)
+    D(r:%, lv:List S) == differentiate(r,lv)
+    D(r:%, v:S, n:NonNegativeInteger) == differentiate(r,v,n)
+    D(r:%, lv:List S, ln:List NonNegativeInteger) == differentiate(r, lv, ln)
+
+@
+<<PDRING.dotabb>>=
+"PDRING"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=PDRING"];
+"PDRING" -> "RING"
+
+@
+<<PDRING.dotfull>>=
+"PartialDifferentialRing(a:SetCategory)"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=PDRING"];
+"PartialDifferentialRing(a:SetCategory)" -> "Ring()"
+
+"PartialDifferentialRing(a:OrderedSet)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=PDRING"];
+"PartialDifferentialRing(a:OrderedSet)" ->
+    "PartialDifferentialRing(a:SetCategory)"
+
+"PartialDifferentialRing(Symbol)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=PDRING"];
+"PartialDifferentialRing(Symbol)" ->
+    "PartialDifferentialRing(a:SetCategory)"
+
+@
+<<PDRING.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"PartialDifferentialRing(a:SetCategory)" [color=lightblue];
+"PartialDifferentialRing(a:SetCategory)" -> "Ring()"
+
+"Ring()" [color=lightblue];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+"Rng()" [color=lightblue];
+"Rng()" -> "AbelianGroup()"
+"Rng()" -> "SemiGroup()"
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "AbelianGroup()"
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CABMON..."
+"AbelianGroup()" -> "REPDB..."
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SETCAT..."
+"SemiGroup()" -> "REPSQ..."
+
+"REPDB..." [color="#00EE00"];
+"REPSQ..." [color="#00EE00"];
+"SETCAT..." [color=lightblue];
+"CABMON..." [color=lightblue];
+}
+
+@
+\chapter{Category Layer 10}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{DifferentialExtension}{DIFEXT}
+\pagepic{ps/v102differentialextension.ps}{DIFEXT}{0.65}
+
+{\bf See:}\\
+\pagefrom{PartialDifferentialRing}{PDRING}
+\pagefrom{Ring}{RING}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{DIFEXT}{1} &
+\cross{DIFEXT}{0} &
+\cross{DIFEXT}{characteristic} &
+\cross{DIFEXT}{coerce} &
+\cross{DIFEXT}{D} \\
+\cross{DIFEXT}{differentiate} &
+\cross{DIFEXT}{hash} &
+\cross{DIFEXT}{latex} &
+\cross{DIFEXT}{one?} &
+\cross{DIFEXT}{recip} \\
+\cross{DIFEXT}{sample} &
+\cross{DIFEXT}{subtractIfCan} &
+\cross{DIFEXT}{zero?} &
+\cross{DIFEXT}{?*?} &
+\cross{DIFEXT}{?\~{}=?} \\
+\cross{DIFEXT}{?**?} &
+\cross{DIFEXT}{?+?} &
+\cross{DIFEXT}{?-?} &
+\cross{DIFEXT}{-?} &
+\cross{DIFEXT}{?=?} \\
+\cross{DIFEXT}{?\^{}?} &
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ differentiate : (%,(R -> R)) -> %
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ D : (%,(R -> R)) -> %
+ D : (%,(R -> R),NonNegativeInteger) -> %
+ differentiate : % -> % if R has DIFRING
+ differentiate : (%,(R -> R),NonNegativeInteger) -> %
+ differentiate : (%,Symbol) -> % if R has PDRING SYMBOL
+\end{verbatim}
+
+These exports come from Ring():
+\begin{verbatim}
+ 0 : () -> %
+ 1 : () -> %                          
+ characteristic : () -> NonNegativeInteger
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %
+ ?^? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+\end{verbatim}
+
+These exports come from DifferentialRing():
+\begin{verbatim}
+ D : % -> % if R has DIFRING          
+ D : (%,NonNegativeInteger) -> % if R has DIFRING
+ differentiate : (%,NonNegativeInteger) -> % 
+     if R has DIFRING
+\end{verbatim}
+
+These exports come from PartialDifferentialRing(Symbol):
+\begin{verbatim}
+ differentiate : (%,List Symbol) -> % 
+     if R has PDRING SYMBOL
+ differentiate : (%,Symbol,NonNegativeInteger) -> % 
+     if R has PDRING SYMBOL
+ differentiate : (%,List Symbol,List NonNegativeInteger) -> % 
+     if R has PDRING SYMBOL
+ D : (%,Symbol) -> % if R has PDRING SYMBOL
+ D : (%,List Symbol) -> % if R has PDRING SYMBOL
+ D : (%,Symbol,NonNegativeInteger) -> % 
+     if R has PDRING SYMBOL
+ D : (%,List Symbol,List NonNegativeInteger) -> % 
+     if R has PDRING SYMBOL
+\end{verbatim}
+
+<<category DIFEXT DifferentialExtension>>=
+)abbrev category DIFEXT DifferentialExtension
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ Differential extensions of a ring R.
+++ Given a differentiation on R, extend it to a differentiation on %.
+
+DifferentialExtension(R:Ring): Category == Ring with
+    differentiate: (%, R -> R) -> %
+       ++ differentiate(x, deriv) differentiates x extending
+       ++ the derivation deriv on R.
+    differentiate: (%, R -> R, NonNegativeInteger) -> %
+       ++ differentiate(x, deriv, n) differentiate x n times
+       ++ using a derivation which extends deriv on R.
+    D: (%, R -> R) -> %
+       ++ D(x, deriv) differentiates x extending
+       ++ the derivation deriv on R.
+    D: (%, R -> R, NonNegativeInteger) -> %
+       ++ D(x, deriv, n) differentiate x n times
+       ++ using a derivation which extends deriv on R.
+    if R has DifferentialRing then DifferentialRing
+    if R has PartialDifferentialRing(Symbol) then
+             PartialDifferentialRing(Symbol)
+  add
+    differentiate(x:%, derivation: R -> R, n:NonNegativeInteger):% ==
+      for i in 1..n repeat x := differentiate(x, derivation)
+      x
+    D(x:%, derivation: R -> R) == differentiate(x, derivation)
+    D(x:%, derivation: R -> R, n:NonNegativeInteger) ==
+            differentiate(x, derivation, n)
+
+    if R has DifferentialRing then
+      differentiate x == differentiate(x, differentiate$R)
+
+    if R has PartialDifferentialRing Symbol then
+      differentiate(x:%, v:Symbol):% ==
+        differentiate(x, differentiate(#1, v)$R)
+
+@
+<<DIFEXT.dotabb>>=
+"DIFEXT"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=DIFEXT"];
+"DIFEXT" -> "RING"
+"DIFEXT" -> "DIFRING"
+"DIFEXT" -> "PDRING"
+
+@
+<<DIFEXT.dotfull>>=
+"DifferentialExtension(a:Ring)"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=DIFEXT"];
+"DifferentialExtension(a:Ring)" -> "Ring()"
+"DifferentialExtension(a:Ring)" -> "DifferentialRing()"
+"DifferentialExtension(a:Ring)" -> "PartialDifferentialRing(Symbol)"
+
+@
+<<DIFEXT.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"DifferentialExtension(a:Ring)" [color=lightblue];
+"DifferentialExtension(a:Ring)" -> "Ring()"
+"DifferentialExtension(a:Ring)" -> "DifferentialRing()"
+"DifferentialExtension(a:Ring)" -> "PartialDifferentialRing(Symbol)"
+
+"PartialDifferentialRing(Symbol)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=PDRING"];
+"PartialDifferentialRing(Symbol)" ->
+    "PartialDifferentialRing(a:SetCategory)"
+
+"PartialDifferentialRing(a:SetCategory)"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=PDRING"];
+"PartialDifferentialRing(a:SetCategory)" -> "Ring()"
+
+"DifferentialRing()" [color=lightblue];
+"DifferentialRing()" -> "Ring()"
+
+"Ring()" [color=lightblue];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+"Rng()" [color=lightblue];
+"Rng()" -> "AbelianGroup()"
+"Rng()" -> "SGROUP..."
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SGROUP..."
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LMODULE..."
+
+"SGROUP..." [color=lightblue];
+"LMODULE..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{FullyLinearlyExplicitRingOver}{FLINEXP}
+\pagepic{ps/v102fullylinearlyexplicitringover.ps}{FLINEXP}{1.00}
+
+{\bf See:}\\
+\pagefrom{LinearlyExplicitRingOver}{LINEXP}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{FLINEXP}{1} &
+\cross{FLINEXP}{0} &
+\cross{FLINEXP}{characteristic} &
+\cross{FLINEXP}{coerce} &
+\cross{FLINEXP}{hash} \\
+\cross{FLINEXP}{latex} &
+\cross{FLINEXP}{one?} &
+\cross{FLINEXP}{recip} &
+\cross{FLINEXP}{reducedSystem} &
+\cross{FLINEXP}{sample} \\
+\cross{FLINEXP}{subtractIfCan} &
+\cross{FLINEXP}{zero?} &
+\cross{FLINEXP}{?*?} &
+\cross{FLINEXP}{?**?} &
+\cross{FLINEXP}{?+?} \\
+\cross{FLINEXP}{?-?} &
+\cross{FLINEXP}{-?} &
+\cross{FLINEXP}{?=?} &
+\cross{FLINEXP}{?\^{}?} &
+\cross{FLINEXP}{?\~{}=?} \\
+\end{tabular}
+
+These are implemented by this category:
+\begin{verbatim}
+ reducedSystem : Matrix % -> 
+     Matrix Integer if R has LINEXP INT
+ reducedSystem : (Matrix %,Vector %) -> 
+     Record(mat: Matrix Integer,vec: Vector Integer) 
+          if R has LINEXP INT
+\end{verbatim}
+
+These exports come from LinearlyExplicitRingOver(a:Ring):
+\begin{verbatim}
+ 0 : () -> %
+ 1 : () -> %                          
+ characteristic : () -> NonNegativeInteger
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ reducedSystem : (Matrix %,Vector %) -> 
+     Record(mat: Matrix R,vec: Vector R)
+ reducedSystem : Matrix % -> Matrix R
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?**? : (%,PositiveInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?^? : (%,NonNegativeInteger) -> %
+\end{verbatim}
+
+<<category FLINEXP FullyLinearlyExplicitRingOver>>=
+)abbrev category FLINEXP FullyLinearlyExplicitRingOver
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ S is \spadtype{FullyLinearlyExplicitRingOver R} means that S is a
+++ \spadtype{LinearlyExplicitRingOver R} and, in addition, if R is a
+++ \spadtype{LinearlyExplicitRingOver Integer}, then so is S
+FullyLinearlyExplicitRingOver(R:Ring):Category ==
+  LinearlyExplicitRingOver R with
+    if (R has LinearlyExplicitRingOver Integer) then
+            LinearlyExplicitRingOver Integer
  add
-   not v      == map(_not, v)
-   _^ v	      == map(_not, v)
-   _~(v)      == map(_~, v)
-   _/_\(v, u) == map(_/_\, v, u)
-   _\_/(v, u) == map(_\_/, v, u)
-   nand(v, u) == map(nand, v, u)
-   nor(v, u)  == map(nor, v, u)
+  if not(R is Integer) then
+    if (R has LinearlyExplicitRingOver Integer) then
+      reducedSystem(m:Matrix %):Matrix(Integer) ==
+        reducedSystem(reducedSystem(m)@Matrix(R))
+
+      reducedSystem(m:Matrix %, v:Vector %):
+        Record(mat:Matrix(Integer), vec:Vector(Integer)) ==
+          rec := reducedSystem(m, v)@Record(mat:Matrix R, vec:Vector R)
+          reducedSystem(rec.mat, rec.vec)
 
 @
-<<BTAGG.dotabb>>=
-"BTAGG" [color=lightblue,href="bookvol10.2.pdf#nameddest=BTAGG"];
-"BTAGG" -> "ORDSET"
-"BTAGG" -> "LOGIC"
-"BTAGG" -> "A1AGG"
+<<FLINEXP.dotabb>>=
+"FLINEXP"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=FLINEXP"];
+"FLINEXP" -> "LINEXP"
 
 @
-<<BTAGG.dotfull>>=
-"BitAggregate()"
- [color=lightblue,href="bookvol10.2.pdf#nameddest=BTAGG"];
-"BitAggregate()" -> "OrderedSet()"
-"BitAggregate()" -> "Logic()"
-"BitAggregate()" -> "OneDimensionalArrayAggregate(Boolean)"
+<<FLINEXP.dotfull>>=
+"FullyLinearlyExplicitRingOver(a:Ring)"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=FLINEXP"];
+"FullyLinearlyExplicitRingOver(a:Ring)" ->
+     "LinearlyExplicitRingOver(a:Ring)"
+
+"FullyLinearlyExplicitRingOver(a:CommutativeRing)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=FLINEXP"];
+"FullyLinearlyExplicitRingOver(a:CommutativeRing)" ->
+    "FullyLinearlyExplicitRingOver(a:Ring)"
+
+@
+<<FLINEXP.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"FullyLinearlyExplicitRingOver(a:Ring)" [color=lightblue];
+"FullyLinearlyExplicitRingOver(a:Ring)" ->
+     "LinearlyExplicitRingOver(a:Ring)"
+
+"LinearlyExplicitRingOver(a:Ring)" [color=lightblue];
+"LinearlyExplicitRingOver(a:Ring)" -> "Ring()"
+
+"Ring()" [color=lightblue];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+"Rng()" [color=lightblue];
+"Rng()" -> "AbelianGroup()"
+"Rng()" -> "SemiGroup()"
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "AbelianGroup()"
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CABMON..."
+"AbelianGroup()" -> "REPDB..."
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SETCAT..."
+"SemiGroup()" -> "REPSQ..."
+
+"REPDB..." [color="#00EE00"];
+"REPSQ..." [color="#00EE00"];
+"SETCAT..." [color=lightblue];
+"CABMON..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Module}{MODULE}
+\pagepic{ps/v102module.ps}{MODULE}{1.00}
+
+{\bf See:}\\
+\pageto{Algebra}{ALGEBRA}
+\pageto{VectorSpace}{VSPACE}
+\pagefrom{BiModule}{BMODULE}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{MODULE}{0} &
+\cross{MODULE}{coerce} &
+\cross{MODULE}{hash} &
+\cross{MODULE}{latex} &
+\cross{MODULE}{sample} \\
+\cross{MODULE}{subtractIfCan} &
+\cross{MODULE}{zero?} &
+\cross{MODULE}{?~=?} &
+\cross{MODULE}{?*?} &
+\cross{MODULE}{?+?} \\
+\cross{MODULE}{?-?} &
+\cross{MODULE}{-?} &
+\cross{MODULE}{?=?} &&
+\end{tabular}
+
+These are implemented by this category:
+\begin{verbatim}
+ ?*? : (%,R) -> %                     
+\end{verbatim}
+
+These exports come from BiModule(a:Ring,b:Ring):
+\begin{verbatim}
+ 0 : () -> %                          
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String
+ sample : () -> %                     
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean
+ ?~=? : (%,%) -> Boolean              
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (R,%) -> %
+ ?*? : (Integer,%) -> %               
+ ?*? : (PositiveInteger,%) -> %
+ ?+? : (%,%) -> %                     
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?=? : (%,%) -> Boolean
+\end{verbatim}
+
+<<category MODULE Module>>=
+)abbrev category MODULE Module
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The category of modules over a commutative ring.
+++
+++ Axioms:
+++   \spad{1*x = x}
+++   \spad{(a*b)*x = a*(b*x)}
+++   \spad{(a+b)*x = (a*x)+(b*x)}
+++   \spad{a*(x+y) = (a*x)+(a*y)}
+Module(R:CommutativeRing): Category == BiModule(R,R)
+  add
+    if not(R is %) then x:%*r:R == r*x
+
+@
+<<MODULE.dotabb>>=
+"MODULE"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=MODULE"];
+"MODULE" -> "BMODULE"
+
+@
+<<MODULE.dotfull>>=
+"Module(a:CommutativeRing)"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=MODULE"];
+"Module(a:CommutativeRing)" ->
+  "BiModule(a:CommutativeRing,b:CommutativeRing)"
+
+"Module(Field)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=MODULE"];
+"Module(Field)" -> "Module(a:CommutativeRing)"
+
+@
+<<MODULE.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"Module(a:CommutativeRing)" [color=lightblue];
+"Module(a:CommutativeRing)" ->
+  "BiModule(a:CommutativeRing,b:CommutativeRing)"
+
+"BiModule(a:CommutativeRing,b:CommutativeRing)" [color=seagreen];
+"BiModule(a:CommutativeRing,b:CommutativeRing)" -> "BiModule(a:Ring,b:Ring)"
+
+"BiModule(a:Ring,b:Ring)" [color=lightblue];
+"BiModule(a:Ring,b:Ring)" -> "LeftModule(a:Ring)"
+"BiModule(a:Ring,b:Ring)" -> "RightModule(a:Ring)"
+
+"RightModule(a:Ring)" [color=seagreen];
+"RightModule(a:Ring)" -> "RightModule(a:Rng)"
+
+"RightModule(a:Rng)" [color=lightblue];
+"RightModule(a:Rng)" -> "ABELGRP..."
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "ABELGRP..."
+
+"ABELGRP..." [color=lightblue];
+}
+
+@
+\chapter{Category Layer 11}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Algebra}{ALGEBRA}
+\pagepic{ps/v102algebra.ps}{ALGEBRA}{0.65}
+
+{\bf See:}\\
+\pageto{DivisionRing}{DIVRING}
+\pageto{IntegralDomain}{INTDOM}
+\pagefrom{Module}{MODULE}
+\pagefrom{Ring}{RING}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{ALGEBRA}{1} &
+\cross{ALGEBRA}{0} &
+\cross{ALGEBRA}{characteristic} &
+\cross{ALGEBRA}{coerce} &
+\cross{ALGEBRA}{hash} \\
+\cross{ALGEBRA}{latex} &
+\cross{ALGEBRA}{one?} &
+\cross{ALGEBRA}{recip} &
+\cross{ALGEBRA}{sample} &
+\cross{ALGEBRA}{subtractIfCan} \\
+\cross{ALGEBRA}{zero?} &
+\cross{ALGEBRA}{?*?} &
+\cross{ALGEBRA}{?+?} &
+\cross{ALGEBRA}{?-?} &
+\cross{ALGEBRA}{-?} \\
+\cross{ALGEBRA}{?=?} &
+\cross{ALGEBRA}{?\~{}=?} &
+\cross{ALGEBRA}{?*?} &
+\cross{ALGEBRA}{?**?} &
+\cross{ALGEBRA}{?\^{}?} \\
+\end{tabular}
+
+These are implemented by this category:
+\begin{verbatim}
+ coerce : R -> %
+\end{verbatim}
+
+These exports come from Ring():
+\begin{verbatim}
+ 0 : () -> %
+ 1 : () -> %                          
+ characteristic : () -> NonNegativeInteger
+ coerce : Integer -> %                
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String
+ one? : % -> Boolean                  
+ recip : % -> Union(%,"failed")
+ sample : () -> %                     
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean              
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (Integer,%) -> %
+ ?*? : (%,%) -> %                     
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?**? : (%,PositiveInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?^? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+\end{verbatim}
+
+These exports come from Module(R:CommutativeRing):
+\begin{verbatim}
+ ?*? : (R,%) -> %                     
+ ?*? : (%,R) -> %
+\end{verbatim}
+
+<<category ALGEBRA Algebra>>=
+)abbrev category ALGEBRA Algebra
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The category of associative algebras (modules which are themselves rings).
+++
+++ Axioms:
+++   \spad{(b+c)::% = (b::%) + (c::%)}
+++   \spad{(b*c)::% = (b::%) * (c::%)}
+++   \spad{(1::R)::% = 1::%}
+++   \spad{b*x = (b::%)*x}
+++   \spad{r*(a*b) = (r*a)*b = a*(r*b)}
+Algebra(R:CommutativeRing): Category ==
+  Join(Ring, Module R) with
+      coerce: R -> %
+          ++ coerce(r) maps the ring element r to a member of the algebra.
+ add
+  coerce(x:R):% == x * 1$%
+
+@
+<<ALGEBRA.dotabb>>=
+"ALGEBRA"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=ALGEBRA"];
+"ALGEBRA" -> "RING"
+"ALGEBRA" -> "MODULE"
+
+@
+<<ALGEBRA.dotfull>>=
+"Algebra(a:CommutativeRing)"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=ALGEBRA"];
+"Algebra(a:CommutativeRing)" -> "Ring()"
+"Algebra(a:CommutativeRing)" -> "Module(a:CommutativeRing)"
+
+"Algebra(a:Field)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=ALGEBRA"];
+"Algebra(a:Field)" -> "Algebra(a:CommutativeRing)"
+
+"Algebra(a:CommutativeRing)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=ALGEBRA"];
+"Algebra(a:CommutativeRing)" -> "Module(a:CommutativeRing)"
+
+"Algebra(Fraction(Integer))"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=ALGEBRA"];
+"Algebra(Fraction(Integer))" -> "Algebra(a:CommutativeRing)"
+
+@
+<<ALGEBRA.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"Algebra(a:CommutativeRing)" [color=lightblue];
+"Algebra(a:CommutativeRing)" -> "Ring()"
+"Algebra(a:CommutativeRing)" -> "Module(a:CommutativeRing)"
+
+"Ring()" [color=lightblue];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+"Rng()" [color=lightblue];
+"Rng()" -> "ABELGRP..."
+"Rng()" -> "SemiGroup()"
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SETCAT..."
+"SemiGroup()" -> "REPSQ..."
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"Module(a:CommutativeRing)" [color=lightblue];
+"Module(a:CommutativeRing)" ->
+  "BiModule(a:CommutativeRing,b:CommutativeRing)"
+
+"BiModule(a:CommutativeRing,b:CommutativeRing)" [color=seagreen];
+"BiModule(a:CommutativeRing,b:CommutativeRing)" -> "BiModule(a:Ring,b:Ring)"
+
+"BiModule(a:Ring,b:Ring)" [color=lightblue];
+"BiModule(a:Ring,b:Ring)" -> "LeftModule(a:Ring)"
+"BiModule(a:Ring,b:Ring)" -> "RightModule(a:Ring)"
+
+"RightModule(a:Ring)" [color=seagreen];
+"RightModule(a:Ring)" -> "RightModule(a:Rng)"
+
+"RightModule(a:Rng)" [color=lightblue];
+"RightModule(a:Rng)" -> "ABELGRP..."
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "ABELGRP..."
+
+"ABELGRP..." [color=lightblue];
+"REPSQ..." [color="#00EE00"];
+"SETCAT..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{VectorSpace}{VSPACE}
+\pagepic{ps/v102vectorspace.ps}{VSPACE}{1.00}
+
+{\bf See:}\\
+\pagefrom{Module}{MODULE}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{VSPACE}{0} &
+\cross{VSPACE}{coerce} &
+\cross{VSPACE}{dimension} &
+\cross{VSPACE}{hash} &
+\cross{VSPACE}{latex} \\
+\cross{VSPACE}{sample} &
+\cross{VSPACE}{subtractIfCan} &
+\cross{VSPACE}{zero?} &
+\cross{VSPACE}{?~=?} &
+\cross{VSPACE}{?*?} \\
+\cross{VSPACE}{?+?} &
+\cross{VSPACE}{?-?} &
+\cross{VSPACE}{-?} &
+\cross{VSPACE}{?/?} &
+\cross{VSPACE}{?=?} \\
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ dimension : () -> CardinalNumber
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ ?/? : (%,S) -> %
+\end{verbatim}
+
+These exports come from Module():
+\begin{verbatim}
+ ?*? : (%,S) -> %                     
+ 0 : () -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger            
+ latex : % -> String
+ sample : () -> %                     
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean
+ ?~=? : (%,%) -> Boolean              
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (S,%) -> %
+ ?*? : (Integer,%) -> %               
+ ?*? : (PositiveInteger,%) -> %
+ ?+? : (%,%) -> %                     
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?=? : (%,%) -> Boolean               
+\end{verbatim}
+
+<<category VSPACE VectorSpace>>=
+)abbrev category VSPACE VectorSpace
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ Vector Spaces (not necessarily finite dimensional) over a field.
+
+VectorSpace(S:Field): Category ==  Module(S) with
+    "/"      : (%, S) -> %
+      ++ x/y divides the vector x by the scalar y.
+    dimension: () -> CardinalNumber
+      ++ dimension() returns the dimensionality of the vector space.
+  add
+    (v:% / s:S):% == inv(s) * v
+
+@
+<<VSPACE.dotabb>>=
+"VSPACE"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=VSPACE"];
+"VSPACE" -> "MODULE"
+
+@
+<<VSPACE.dotfull>>=
+"VectorSpace(a:Field)"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=VSPACE"];
+"VectorSpace(a:Field)" -> "Module(Field)"
+
+@
+<<VSPACE.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"VectorSpace(a:Field)" [color=lightblue];
+"VectorSpace(a:Field)" -> "Module(Field)"
+
+"Module(Field)" [color=seagreen];
+"Module(Field)" -> "Module(a:CommutativeRing)"
+
+"Module(a:CommutativeRing)" [color=lightblue];
+"Module(a:CommutativeRing)" ->
+  "BiModule(a:CommutativeRing,b:CommutativeRing)"
+
+"BiModule(a:CommutativeRing,b:CommutativeRing)" [color=seagreen];
+"BiModule(a:CommutativeRing,b:CommutativeRing)" -> "BiModule(a:Ring,b:Ring)"
+
+"BiModule(a:Ring,b:Ring)" [color=lightblue];
+"BiModule(a:Ring,b:Ring)" -> "LeftModule(a:Ring)"
+"BiModule(a:Ring,b:Ring)" -> "RightModule(a:Ring)"
+
+"RightModule(a:Ring)" [color=seagreen];
+"RightModule(a:Ring)" -> "RightModule(a:Rng)"
+
+"RightModule(a:Rng)" [color=lightblue];
+"RightModule(a:Rng)" -> "ABELGRP..."
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "ABELGRP..."
+
+"ABELGRP..." [color=lightblue];
+}
+
+@
+\chapter{Category Layer 12}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{DivisionRing}{DIVRING}
+\pagepic{ps/v102divisionring.ps}{DIVRING}{0.65}
+
+{\bf See:}\\
+\pageto{Field}{FIELD}
+\pagefrom{Algebra}{ALGEBRA}
+\pagefrom{EntireRing}{ENTIRER}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{DIVRING}{1} &
+\cross{DIVRING}{0} &
+\cross{DIVRING}{characteristic} &
+\cross{DIVRING}{coerce} &
+\cross{DIVRING}{hash} \\
+\cross{DIVRING}{inv} &
+\cross{DIVRING}{latex} &
+\cross{DIVRING}{one?} &
+\cross{DIVRING}{recip} &
+\cross{DIVRING}{sample} \\
+\cross{DIVRING}{subtractIfCan} &
+\cross{DIVRING}{zero?} &
+\cross{DIVRING}{?\^{}?} &
+\cross{DIVRING}{?\~{}=?} &
+\cross{DIVRING}{?**?} \\
+\cross{DIVRING}{?*?} &
+\cross{DIVRING}{?+?} &
+\cross{DIVRING}{?-?} &
+\cross{DIVRING}{-?} &
+\cross{DIVRING}{?=?} \\
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ inv : % -> %
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ ?^? : (%,Integer) -> %
+ ?**? : (%,Integer) -> %
+\end{verbatim}
+
+These exports come from EntireRing():
+\begin{verbatim}
+ 0 : () -> %                          
+ 1 : () -> %
+ characteristic : () -> NonNegativeInteger
+ coerce : Integer -> %                
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String                  
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %
+ ?=? : (%,%) -> Boolean               
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %                     
+ -? : % -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?^? : (%,NonNegativeInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %      
+\end{verbatim}
+
+These exports come from Algebra(Fraction(Integer)):
+\begin{verbatim}
+ coerce : Fraction Integer -> %
+ ?*? : (%,Fraction Integer) -> %      
+ ?*? : (Fraction Integer,%) -> %
+\end{verbatim}
+
+<<category DIVRING DivisionRing>>=
+)abbrev category DIVRING DivisionRing
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A division ring (sometimes called a skew field),
+++ i.e. a not necessarily commutative ring where
+++ all non-zero elements have multiplicative inverses.
+
+DivisionRing(): Category ==
+ Join(EntireRing, Algebra Fraction Integer) with
+      "**": (%,Integer) -> %
+          ++ x**n returns x raised to the integer power n.
+      "^" : (%,Integer) -> %
+          ++ x^n returns x raised to the integer power n.
+      inv : % -> %
+          ++ inv x returns the multiplicative inverse of x.
+          ++ Error: if x is 0.
+-- Q-algebra is a lie, should be conditional on characteristic 0,
+-- but knownInfo cannot handle the following commented
+--    if % has CharacteristicZero then Algebra Fraction Integer
+    add
+      n: Integer
+      x: %
+      _^(x:%, n:Integer):% == x ** n
+      import RepeatedSquaring(%)
+      x ** n: Integer ==
+         zero? n => 1
+         zero? x =>
+            n<0 => error "division by zero"
+            x
+         n<0 =>
+            expt(inv x,(-n) pretend PositiveInteger)
+         expt(x,n pretend PositiveInteger)
+--    if % has CharacteristicZero() then
+      q:Fraction(Integer) * x:% == numer(q) * inv(denom(q)::%) * x
+
+@
+<<DIVRING.dotabb>>=
+"DIVRING"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=DIVRING"];
+"DIVRING" -> "ENTIRER"
+"DIVRING" -> "ALGEBRA"
+
+@
+<<DIVRING.dotfull>>=
+"DivisionRing()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=DIVRING"];
+"DivisionRing()" -> "EntireRing()"
+"DivisionRing()" -> "Algebra(Fraction(Integer))"
+"DivisionRing()" -> "RepeatedSquaring(DivisionRing)"
+
+@
+<<DIVRING.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"DivisionRing()" [color=lightblue];
+"DivisionRing()" -> "EntireRing()"
+"DivisionRing()" -> "Algebra(Fraction(Integer))"
+"DivisionRing()" -> "RepeatedSquaring(DivisionRing)"
+
+"RepeatedSquaring(DivisionRing)" [color="#00EE00"];
+"RepeatedSquaring(DivisionRing)" -> "RepeatedSquaring(a:SetCategory)"
+
+"RepeatedSquaring(a:SetCategory)" [color="#00EE00"];
+"RepeatedSquaring(a:SetCategory)" -> "Package"
+
+"Package" [color="#00EE00"];
+
+"EntireRing()" [color=lightblue];
+"EntireRing()" -> "RING..."
+"EntireRing()" -> "BMODULE..."
+
+"Algebra(Fraction(Integer))" [color=seagreen];
+"Algebra(Fraction(Integer))" -> "Algebra(a:CommutativeRing)"
+
+"Algebra(a:CommutativeRing)" [color=lightblue];
+"Algebra(a:CommutativeRing)" -> "RING..."
+"Algebra(a:CommutativeRing)" -> "Module(a:CommutativeRing)"
+
+"Module(a:CommutativeRing)" [color=lightblue];
+"Module(a:CommutativeRing)" ->
+  "BiModule(a:CommutativeRing,b:CommutativeRing)"
+
+"BiModule(a:CommutativeRing,b:CommutativeRing)" [color=seagreen];
+"BiModule(a:CommutativeRing,b:CommutativeRing)" -> "BMODULE..."
+
+"RING..." [color=lightblue];
+"BMODULE..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{IntegralDomain}{INTDOM}
+\pagepic{ps/v102integraldomain.ps}{INTDOM}{0.65}
+
+{\bf See:}\\
+\pageto{GcdDomain}{GCDDOM}
+\pageto{OrderedIntegralDomain}{OINTDOM}
+\pagefrom{Algebra}{ALGEBRA}
+\pagefrom{CommutativeRing}{COMRING}
+\pagefrom{EntireRing}{ENTIRER}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{INTDOM}{0} &
+\cross{INTDOM}{1} &
+\cross{INTDOM}{associates?} &
+\cross{INTDOM}{characteristic} &
+\cross{INTDOM}{coerce} \\
+\cross{INTDOM}{exquo} &
+\cross{INTDOM}{hash} &
+\cross{INTDOM}{latex} &
+\cross{INTDOM}{one?} &
+\cross{INTDOM}{recip} \\
+\cross{INTDOM}{sample} &
+\cross{INTDOM}{subtractIfCan} &
+\cross{INTDOM}{unit?} &
+\cross{INTDOM}{unitCanonical} &
+\cross{INTDOM}{unitNormal} \\
+\cross{INTDOM}{zero?} &
+\cross{INTDOM}{?\~{}=?} &
+\cross{INTDOM}{?*?} &
+\cross{INTDOM}{?**?} &
+\cross{INTDOM}{?\^{}?} \\
+\cross{INTDOM}{?+?} &
+\cross{INTDOM}{?-?} &
+\cross{INTDOM}{-?} &
+\cross{INTDOM}{?=?} &
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ exquo : (%,%) -> Union(%,"failed")
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ associates? : (%,%) -> Boolean
+ unit? : % -> Boolean                 
+ unitCanonical : % -> %
+ unitNormal : % -> Record(unit: %,canonical: %,associate: %)
+\end{verbatim}
+
+These exports come from CommutativeRing():
+\begin{verbatim}
+ 0 : () -> %
+ 1 : () -> %                          
+ characteristic : () -> NonNegativeInteger
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?^? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %
+\end{verbatim}
+
+TPDHERE: Should we construct this coercion?
+
+These exports come from Algebra(a:IntegralDomain):
+\begin{verbatim}
+ coerce : % -> %                      
+\end{verbatim}
+
+TPDHERE: Note that none of the exports of EntireRing are needed.
+Perhaps this can be eliminated.
+
+<<category INTDOM IntegralDomain>>=
+)abbrev category INTDOM IntegralDomain
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References: Davenport & Trager I
+++ Description:
+++ The category of commutative integral domains, i.e. commutative
+++ rings with no zero divisors.
+++
+++ Conditional attributes:
+++   canonicalUnitNormal\tab{20}the canonical field is the same for 
+++   all associates canonicalsClosed\tab{20}the product of two 
+++   canonicals is itself canonical
+
+IntegralDomain(): Category ==
+  Join(CommutativeRing, Algebra(%), EntireRing) with
+    "exquo": (%,%) -> Union(%,"failed")
+        ++ exquo(a,b) either returns an element c such that
+        ++ \spad{c*b=a} or "failed" if no such element can be found.
+    unitNormal: % -> Record(unit:%,canonical:%,associate:%)
+        ++ unitNormal(x) tries to choose a canonical element
+        ++ from the associate class of x.
+        ++ The attribute canonicalUnitNormal, if asserted, means that
+        ++ the "canonical" element is the same across all associates of x
+        ++ if \spad{unitNormal(x) = [u,c,a]} then
+        ++ \spad{u*c = x}, \spad{a*u = 1}.
+    unitCanonical: % -> %
+        ++ \spad{unitCanonical(x)} returns \spad{unitNormal(x).canonical}.
+    associates?: (%,%) -> Boolean
+        ++ associates?(x,y) tests whether x and y are associates, i.e.
+        ++ differ by a unit factor.
+    unit?: % -> Boolean
+        ++ unit?(x) tests whether x is a unit, i.e. is invertible.
+ add
+      x,y: %
+
+      UCA ==> Record(unit:%,canonical:%,associate:%)
+      if not (% has Field) then
+        unitNormal(x) == [1$%,x,1$%]$UCA -- the non-canonical definition
+      unitCanonical(x) == unitNormal(x).canonical -- always true
+      recip(x) == if zero? x then "failed" else _exquo(1$%,x)
+      unit?(x) == (recip x case "failed" => false; true)
+      if % has canonicalUnitNormal then
+         associates?(x,y) ==
+           (unitNormal x).canonical = (unitNormal y).canonical
+       else
+         associates?(x,y) ==
+           zero? x => zero? y
+           zero? y => false
+           x exquo y case "failed" => false
+           y exquo x case "failed" => false
+           true
+
+@
+<<INTDOM.dotabb>>=
+"INTDOM"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=INTDOM"];
+"INTDOM" -> "COMRING"
+"INTDOM" -> "ALGEBRA"
+"INTDOM" -> "ENTIRER"
+
+@
+<<INTDOM.dotfull>>=
+"IntegralDomain()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=INTDOM"];
+"IntegralDomain()" -> "CommutativeRing()"
+"IntegralDomain()" -> "Algebra(a:CommutativeRing)"
+"IntegralDomain()" -> "EntireRing()"
+
+@
+<<INTDOM.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"IntegralDomain()" [color=lightblue];
+"IntegralDomain()" -> "CommutativeRing()"
+"IntegralDomain()" -> "Algebra(a:CommutativeRing)"
+"IntegralDomain()" -> "EntireRing()"
+
+"CommutativeRing()" [color=lightblue];
+"CommutativeRing()" -> "RING..."
+"CommutativeRing()" -> "BMODULE..."
+
+"EntireRing()" [color=lightblue];
+"EntireRing()" -> "RING..."
+"EntireRing()" -> "BMODULE..."
+
+"Algebra(a:CommutativeRing)" [color=lightblue];
+"Algebra(a:CommutativeRing)" -> "RING..."
+"Algebra(a:CommutativeRing)" -> "Module(a:CommutativeRing)"
+
+"Module(a:CommutativeRing)" [color=lightblue];
+"Module(a:CommutativeRing)" ->
+  "BiModule(a:CommutativeRing,b:CommutativeRing)"
+
+"BiModule(a:CommutativeRing,b:CommutativeRing)" [color=seagreen];
+"BiModule(a:CommutativeRing,b:CommutativeRing)" -> "BMODULE..."
+
+"BMODULE..." [color=lightblue];
+"RING..." [color=lightblue];
+}
+
+@
+\chapter{Category Layer 13}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{GcdDomain}{GCDDOM}
+\pagepic{ps/v102gcddomain.ps}{GCDDOM}{0.65}
+
+{\bf See:}\\
+\pageto{PrincipalIdealDomain}{PID}
+\pageto{UniqueFactorizationDomain}{UFD}
+\pagefrom{IntegralDomain}{INTDOM}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{GCDDOM}{0} &
+\cross{GCDDOM}{1} &
+\cross{GCDDOM}{associates?} &
+\cross{GCDDOM}{characteristic} &
+\cross{GCDDOM}{coerce} \\
+\cross{GCDDOM}{exquo} &
+\cross{GCDDOM}{gcd} &
+\cross{GCDDOM}{gcdPolynomial} &
+\cross{GCDDOM}{hash} &
+\cross{GCDDOM}{latex} \\
+\cross{GCDDOM}{lcm} &
+\cross{GCDDOM}{one?} &
+\cross{GCDDOM}{recip} &
+\cross{GCDDOM}{sample} &
+\cross{GCDDOM}{subtractIfCan} \\
+\cross{GCDDOM}{unit?} &
+\cross{GCDDOM}{unitCanonical} &
+\cross{GCDDOM}{unitNormal} &
+\cross{GCDDOM}{zero?} &
+\cross{GCDDOM}{?*?} \\
+\cross{GCDDOM}{?**?} &
+\cross{GCDDOM}{?+?} &
+\cross{GCDDOM}{?-?} &
+\cross{GCDDOM}{-?} &
+\cross{GCDDOM}{?=?} \\
+\cross{GCDDOM}{?\^{}?} &
+\cross{GCDDOM}{?\~{}=?} &&&
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ gcd : (%,%) -> %                     
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ gcd : List % -> %
+ gcdPolynomial : (SparseUnivariatePolynomial %,
+                  SparseUnivariatePolynomial %) -> 
+                     SparseUnivariatePolynomial %
+ lcm : (%,%) -> %                     
+ lcm : List % -> %
+\end{verbatim}
+
+These exports come from IntegralDomain():
+\begin{verbatim}
+ associates? : (%,%) -> Boolean
+ exquo : (%,%) -> Union(%,"failed")
+ unit? : % -> Boolean                 
+ unitCanonical : % -> %
+ unitNormal : % -> Record(unit: %,canonical: %,associate: %)
+ 0 : () -> %
+ 1 : () -> %                          
+ characteristic : () -> NonNegativeInteger
+ coerce : % -> %                      
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?**? : (%,PositiveInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?^? : (%,NonNegativeInteger) -> %
+\end{verbatim}
+
+<<category GCDDOM GcdDomain>>=
+)abbrev category GCDDOM GcdDomain
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References: Davenport & Trager 1
+++ Description:
+++ This category describes domains where
+++ \spadfun{gcd} can be computed but where there is no guarantee
+++ of the existence of \spadfun{factor} operation for factorisation 
+++ into irreducibles. However, if such a \spadfun{factor} operation exist, 
+++ factorization will be unique up to order and units.
+
+GcdDomain(): Category == IntegralDomain with
+    gcd: (%,%) -> %
+      ++ gcd(x,y) returns the greatest common divisor of x and y.
+      -- gcd(x,y) = gcd(y,x) in the presence of canonicalUnitNormal,
+      -- but not necessarily elsewhere
+    gcd: List(%) -> %
+      ++ gcd(l) returns the common gcd of the elements in the list l.
+    lcm: (%,%) -> %
+      ++ lcm(x,y) returns the least common multiple of x and y.
+      -- lcm(x,y) = lcm(y,x) in the presence of canonicalUnitNormal,
+      -- but not necessarily elsewhere
+    lcm: List(%) -> %
+      ++ lcm(l) returns the least common multiple of the elements of 
+      ++ the list l.
+    gcdPolynomial: (SparseUnivariatePolynomial %, _
+                    SparseUnivariatePolynomial %) -> _
+                       SparseUnivariatePolynomial %
+      ++ gcdPolynomial(p,q) returns the greatest common divisor (gcd) of 
+      ++ univariate polynomials over the domain
+  add
+   lcm(x: %,y: %) ==
+     y = 0 => 0
+     x = 0 => 0
+     LCM : Union(%,"failed") := y exquo gcd(x,y)
+     LCM case % =>  x * LCM
+     error "bad gcd in lcm computation"
+   lcm(l:List %) == reduce(lcm,l,1,0)
+   gcd(l:List %) == reduce(gcd,l,0,1)
+   SUP ==> SparseUnivariatePolynomial
+   gcdPolynomial(p1,p2) ==
+     zero? p1 => unitCanonical p2
+     zero? p2 => unitCanonical p1
+     c1:= content(p1); c2:= content(p2)
+     p1:= (p1 exquo c1)::SUP %
+     p2:= (p2 exquo c2)::SUP %
+     if (e1:=minimumDegree p1) > 0 then p1:=(p1 exquo monomial(1,e1))::SUP %
+     if (e2:=minimumDegree p2) > 0 then p2:=(p2 exquo monomial(1,e2))::SUP %
+     e1:=min(e1,e2); c1:=gcd(c1,c2)
+     p1:=
+        degree p1 = 0 or degree p2 = 0 => monomial(c1,0)
+        p:= subResultantGcd(p1,p2)
+        degree p = 0 => monomial(c1,0)
+        c2:= gcd(leadingCoefficient p1,leadingCoefficient p2)
+        unitCanonical(_
+          c1 * primitivePart(((c2*p) exquo leadingCoefficient p)::SUP %))
+     zero? e1 => p1
+     monomial(1,e1)*p1
+
+@
+<<GCDDOM.dotabb>>=
+"GCDDOM"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=GCDDOM"];
+"GCDDOM" -> "INTDOM"
+
+@
+<<GCDDOM.dotfull>>=
+"GcdDomain()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=GCDDOM"];
+"GcdDomain()" -> "IntegralDomain()"
+
+@
+<<GCDDOM.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"GcdDomain()" [color=lightblue];
+"GcdDomain()" -> "IntegralDomain()"
+
+"IntegralDomain()" [color=lightblue];
+"IntegralDomain()" -> "CommutativeRing()"
+"IntegralDomain()" -> "Algebra(a:CommutativeRing)"
+"IntegralDomain()" -> "EntireRing()"
+
+"CommutativeRing()" [color=lightblue];
+"CommutativeRing()" -> "RING..."
+"CommutativeRing()" -> "BMODULE..."
+
+"EntireRing()" [color=lightblue];
+"EntireRing()" -> "RING..."
+"EntireRing()" -> "BMODULE..."
+
+"Algebra(a:CommutativeRing)" [color=lightblue];
+"Algebra(a:CommutativeRing)" -> "RING..."
+"Algebra(a:CommutativeRing)" -> "Module(a:CommutativeRing)"
+
+"Module(a:CommutativeRing)" [color=lightblue];
+"Module(a:CommutativeRing)" ->
+  "BiModule(a:CommutativeRing,b:CommutativeRing)"
+
+"BiModule(a:CommutativeRing,b:CommutativeRing)" [color=seagreen];
+"BiModule(a:CommutativeRing,b:CommutativeRing)" -> "BMODULE..."
+
+"BMODULE..." [color=lightblue];
+"RING..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{OrderedIntegralDomain}{OINTDOM}
+\pagepic{ps/v102orderedintegraldomain.ps}{OINTDOM}{0.45}
+
+{\bf See:}\\
+\pagefrom{IntegralDomain}{INTDOM}
+\pagefrom{OrderedRing}{ORDRING}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{OINTDOM}{1} &
+\cross{OINTDOM}{0} &
+\cross{OINTDOM}{abs} &
+\cross{OINTDOM}{associates?} &
+\cross{OINTDOM}{characteristic} \\
+\cross{OINTDOM}{coerce} &
+\cross{OINTDOM}{exquo} &
+\cross{OINTDOM}{hash} &
+\cross{OINTDOM}{latex} &
+\cross{OINTDOM}{max} \\
+\cross{OINTDOM}{min} &
+\cross{OINTDOM}{negative?} &
+\cross{OINTDOM}{one?} &
+\cross{OINTDOM}{positive?} &
+\cross{OINTDOM}{recip} \\
+\cross{OINTDOM}{sample} &
+\cross{OINTDOM}{sign} &
+\cross{OINTDOM}{subtractIfCan} &
+\cross{OINTDOM}{unit?} &
+\cross{OINTDOM}{unitCanonical} \\
+\cross{OINTDOM}{unitNormal} &
+\cross{OINTDOM}{zero?} &
+\cross{OINTDOM}{?*?} &
+\cross{OINTDOM}{?**?} &
+\cross{OINTDOM}{?+?} \\
+\cross{OINTDOM}{?-?} &
+\cross{OINTDOM}{-?} &
+\cross{OINTDOM}{?$<$?} &
+\cross{OINTDOM}{?$<=$?} &
+\cross{OINTDOM}{?=?} \\
+\cross{OINTDOM}{?$>$?} &
+\cross{OINTDOM}{?$>=$?} &
+\cross{OINTDOM}{?\^{}?} &
+\cross{OINTDOM}{?\~{}=?} &
+\end{tabular}
+
+These exports come from IntegralDomain():
+\begin{verbatim}
+ 0 : () -> %
+ 1 : () -> %                          
+ associates? : (%,%) -> Boolean       
+ characteristic : () -> NonNegativeInteger
+ coerce : % -> %
+ coerce : Integer -> %                
+ coerce : % -> OutputForm
+ exquo : (%,%) -> Union(%,"failed")
+ hash : % -> SingleInteger            
+ latex : % -> String
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")
+ sample : () -> %                     
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ unit? : % -> Boolean                 
+ unitCanonical : % -> %
+ unitNormal : % -> Record(unit: %,canonical: %,associate: %)
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %
+ ?<? : (%,%) -> Boolean
+ ?^? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+\end{verbatim}
+
+These exports come from OrderedRing():
+\begin{verbatim}
+ abs : % -> %
+ max : (%,%) -> %                     
+ min : (%,%) -> %
+ negative? : % -> Boolean             
+ positive? : % -> Boolean             
+ sign : % -> Integer
+ ?<=? : (%,%) -> Boolean              
+ ?>? : (%,%) -> Boolean               
+ ?>=? : (%,%) -> Boolean
+\end{verbatim}
+
+<<category OINTDOM OrderedIntegralDomain>>=
+)abbrev category OINTDOM OrderedIntegralDomain
+++ Author: JH Davenport (after L Gonzalez-Vega)
+++ Date Created: 30.1.96
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ Description:
+++ The category of ordered commutative integral domains, where ordering
+++ and the arithmetic operations are compatible
+++
+
+OrderedIntegralDomain(): Category ==
+  Join(IntegralDomain, OrderedRing) 
+
+@
+<<OINTDOM.dotabb>>=
+"OINTDOM"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=OINTDOM"];
+"OINTDOM" -> "INTDOM"
+"OINTDOM" -> "ORDRING"
+
+@
+<<OINTDOM.dotfull>>=
+"OrderedIntegralDomain()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=OINTDOM"];
+"OrderedIntegralDomain()" -> "IntegralDomain()"
+"OrderedIntegralDomain()" -> "OrderedRing()"
+
+@
+<<OINTDOM.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"OrderedIntegralDomain()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=OINTDOM"];
+"OrderedIntegralDomain()" -> "IntegralDomain()"
+"OrderedIntegralDomain()" -> "OrderedRing()"
+
+"IntegralDomain()" [color=lightblue];
+"IntegralDomain()" -> "CommutativeRing()"
+"IntegralDomain()" -> "Algebra(a:CommutativeRing)"
+"IntegralDomain()" -> "EntireRing()"
+
+"OrderedRing()" [color=lightblue];
+"OrderedRing()" -> "OAGROUP..."
+"OrderedRing()" -> "RING..."
+"OrderedRing()" -> "MONOID..."
+
+"CommutativeRing()" [color=lightblue];
+"CommutativeRing()" -> "RING..."
+"CommutativeRing()" -> "BMODULE..."
+
+"EntireRing()" [color=lightblue];
+"EntireRing()" -> "RING..."
+"EntireRing()" -> "BMODULE..."
+
+"Algebra(a:CommutativeRing)" [color=lightblue];
+"Algebra(a:CommutativeRing)" -> "RING..."
+"Algebra(a:CommutativeRing)" -> "Module(a:CommutativeRing)"
+
+"Module(a:CommutativeRing)" [color=lightblue];
+"Module(a:CommutativeRing)" ->
+  "BiModule(a:CommutativeRing,b:CommutativeRing)"
+
+"BiModule(a:CommutativeRing,b:CommutativeRing)" [color=seagreen];
+"BiModule(a:CommutativeRing,b:CommutativeRing)" -> "BMODULE..."
+
+"OAGROUP..." [color=lightblue];
+"BMODULE..." [color=lightblue];
+"RING..." [color=lightblue];
+"MONOID..." [color=lightblue];
+}
+
+@
+\chapter{Category Layer 14}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{PrincipalIdealDomain}{PID}
+\pagepic{ps/v102principalidealdomain.ps}{PID}{0.65}
+
+{\bf See:}\\
+\pageto{EuclideanDomain}{EUCDOM}
+\pagefrom{GcdDomain}{GCDDOM}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{PID}{0} &
+\cross{PID}{1} &
+\cross{PID}{associates?} &
+\cross{PID}{characteristic} &
+\cross{PID}{coerce} \\
+\cross{PID}{expressIdealMember} &
+\cross{PID}{exquo} &
+\cross{PID}{gcd} &
+\cross{PID}{gcdPolynomial} &
+\cross{PID}{hash} \\
+\cross{PID}{latex} &
+\cross{PID}{lcm} &
+\cross{PID}{one?} &
+\cross{PID}{principalIdeal} &
+\cross{PID}{recip} \\
+\cross{PID}{sample} &
+\cross{PID}{subtractIfCan} &
+\cross{PID}{unit?} &
+\cross{PID}{unitCanonical} &
+\cross{PID}{unitNormal} \\
+\cross{PID}{zero?} &
+\cross{PID}{?+?} &
+\cross{PID}{?-?} &
+\cross{PID}{-?} &
+\cross{PID}{?=?} \\
+\cross{PID}{?\~{}=?} &
+\cross{PID}{?*?} &
+\cross{PID}{?**?} &
+\cross{PID}{?\^{}?} &
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ expressIdealMember : (List %,%) -> Union(List %,"failed")
+ principalIdeal : List % -> Record(coef: List %,generator: %)
+\end{verbatim}
+
+These exports come from GcdDomain():
+\begin{verbatim}
+ associates? : (%,%) -> Boolean
+ exquo : (%,%) -> Union(%,"failed")
+ gcd : (%,%) -> %                     
+ gcd : List % -> %
+ gcdPolynomial : (SparseUnivariatePolynomial %,
+                  SparseUnivariatePolynomial %) ->
+                     SparseUnivariatePolynomial %
+ lcm : List % -> %
+ lcm : (%,%) -> %                     
+ unit? : % -> Boolean                 
+ unitCanonical : % -> %
+ unitNormal : % -> Record(unit: %,canonical: %,associate: %)
+ 0 : () -> %
+ 1 : () -> %                          
+ characteristic : () -> NonNegativeInteger
+ coerce : % -> %                      
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?**? : (%,PositiveInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?^? : (%,NonNegativeInteger) -> %
+\end{verbatim}
+
+<<category PID PrincipalIdealDomain>>=
+)abbrev category PID PrincipalIdealDomain
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The category of constructive principal ideal domains, i.e.
+++ where a single generator can be constructively found for
+++ any ideal given by a finite set of generators.
+++ Note that this constructive definition only implies that
+++ finitely generated ideals are principal. It is not clear
+++ what we would mean by an infinitely generated ideal.
+
+PrincipalIdealDomain(): Category == GcdDomain with
+      principalIdeal: List % -> Record(coef:List %,generator:%)
+         ++ principalIdeal([f1,...,fn]) returns a record whose
+         ++ generator component is a generator of the ideal
+         ++ generated by \spad{[f1,...,fn]} whose coef component satisfies
+         ++ \spad{generator = sum (input.i * coef.i)}
+      expressIdealMember: (List %,%) -> Union(List %,"failed")
+         ++ expressIdealMember([f1,...,fn],h) returns a representation
+         ++ of h as a linear combination of the fi or "failed" if h
+         ++ is not in the ideal generated by the fi.
+
+@
+<<PID.dotabb>>=
+"PID"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=PID"];
+"PID" -> "GCDDOM"
+
+@
+<<PID.dotfull>>=
+"PrincipalIdealDomain()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=PID"];
+"PrincipalIdealDomain()" -> "GcdDomain()"
+
+@
+<<PID.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"PrincipalIdealDomain()" [color=lightblue];
+"PrincipalIdealDomain()" -> "GcdDomain()"
+
+"GcdDomain()" [color=lightblue];
+"GcdDomain()" -> "IntegralDomain()"
+
+"IntegralDomain()" [color=lightblue];
+"IntegralDomain()" -> "CommutativeRing()"
+"IntegralDomain()" -> "Algebra(a:CommutativeRing)"
+"IntegralDomain()" -> "EntireRing()"
+
+"CommutativeRing()" [color=lightblue];
+"CommutativeRing()" -> "RING..."
+"CommutativeRing()" -> "BMODULE..."
+
+"EntireRing()" [color=lightblue];
+"EntireRing()" -> "RING..."
+"EntireRing()" -> "BMODULE..."
+
+"Algebra(a:CommutativeRing)" [color=lightblue];
+"Algebra(a:CommutativeRing)" -> "RING..."
+"Algebra(a:CommutativeRing)" -> "Module(a:CommutativeRing)"
+
+"Module(a:CommutativeRing)" [color=lightblue];
+"Module(a:CommutativeRing)" ->
+  "BiModule(a:CommutativeRing,b:CommutativeRing)"
+
+"BiModule(a:CommutativeRing,b:CommutativeRing)" [color=seagreen];
+"BiModule(a:CommutativeRing,b:CommutativeRing)" -> "BMODULE..."
+
+"BMODULE..." [color=lightblue];
+"RING..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{UniqueFactorizationDomain}{UFD}
+\pagepic{ps/v102uniquefactorizationdomain.ps}{UFD}{0.65}
+
+{\bf See:}\\
+\pageto{Field}{FIELD}
+\pageto{PolynomialFactorizationExplicit}{PFECAT}
+\pagefrom{GcdDomain}{GCDDOM}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{UFD}{0} &
+\cross{UFD}{1} &
+\cross{UFD}{associates?} &
+\cross{UFD}{characteristic} &
+\cross{UFD}{coerce} \\
+\cross{UFD}{exquo} &
+\cross{UFD}{factor} &
+\cross{UFD}{gcd} &
+\cross{UFD}{gcdPolynomial} &
+\cross{UFD}{hash} \\
+\cross{UFD}{latex} &
+\cross{UFD}{lcm} &
+\cross{UFD}{one?} &
+\cross{UFD}{prime?} &
+\cross{UFD}{recip} \\
+\cross{UFD}{sample} &
+\cross{UFD}{squareFree} &
+\cross{UFD}{squareFreePart} &
+\cross{UFD}{subtractIfCan} &
+\cross{UFD}{unit?} \\
+\cross{UFD}{unitCanonical} &
+\cross{UFD}{unitNormal} &
+\cross{UFD}{zero?} &
+\cross{UFD}{?*?} &
+\cross{UFD}{?**?} \\
+\cross{UFD}{?+?} &
+\cross{UFD}{?-?} &
+\cross{UFD}{-?} &
+\cross{UFD}{?=?} &
+\cross{UFD}{?\~{}=?} \\
+\cross{UFD}{?\^{}?} &
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ factor : % -> Factored %
+ squareFree : % -> Factored %         
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ prime? : % -> Boolean
+ squareFreePart : % -> %
+\end{verbatim}
+
+These exports come from GcdDomain():
+\begin{verbatim}
+ 0 : () -> %
+ 1 : () -> %                          
+ associates? : (%,%) -> Boolean
+ characteristic : () -> NonNegativeInteger
+ coerce : % -> %                      
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ exquo : (%,%) -> Union(%,"failed")
+ gcd : (%,%) -> %
+ gcd : List % -> %                    
+ gcdPolynomial : (SparseUnivariatePolynomial %,
+                  SparseUnivariatePolynomial %) -> 
+                     SparseUnivariatePolynomial %
+ hash : % -> SingleInteger            
+ latex : % -> String
+ lcm : List % -> %                    
+ lcm : (%,%) -> %
+ one? : % -> Boolean                  
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ unit? : % -> Boolean                 
+ unitCanonical : % -> %
+ unitNormal : % -> Record(unit: %,canonical: %,associate: %)
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?**? : (%,PositiveInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?^? : (%,NonNegativeInteger) -> %
+\end{verbatim}
+
+<<category UFD UniqueFactorizationDomain>>=
+)abbrev category UFD UniqueFactorizationDomain
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A constructive unique factorization domain, i.e. where
+++ we can constructively factor members into a product of
+++ a finite number of irreducible elements.
+
+UniqueFactorizationDomain(): Category == GcdDomain with
+   prime?: % -> Boolean
+     ++ prime?(x) tests if x can never be written as the product of two
+     ++ non-units of the ring,
+     ++ i.e., x is an irreducible element.
+   squareFree    : % -> Factored(%)
+     ++ squareFree(x) returns the square-free factorization of x
+     ++ i.e. such that the factors are pairwise relatively prime
+     ++ and each has multiple prime factors.
+   squareFreePart: % -> %
+     ++ squareFreePart(x) returns a product of prime factors of
+     ++ x each taken with multiplicity one.
+   factor: % -> Factored(%)
+     ++ factor(x) returns the factorization of x into irreducibles.
+ add
+  squareFreePart x ==
+    unit(s := squareFree x) * _*/[f.factor for f in factors s]
+
+  prime? x == # factorList factor x = 1
+
+@
+<<UFD.dotabb>>=
+"UFD"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=UFD"];
+"UFD" -> "GCDDOM"
+
+@
+<<UFD.dotfull>>=
+"UniqueFactorizationDomain()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=UFD"];
+"UniqueFactorizationDomain()" -> "GcdDomain()"
+
+@
+<<UFD.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"UniqueFactorizationDomain()" [color=lightblue];
+"UniqueFactorizationDomain()" -> "GcdDomain()"
+
+"GcdDomain()" [color=lightblue];
+"GcdDomain()" -> "IntegralDomain()"
+
+"IntegralDomain()" [color=lightblue];
+"IntegralDomain()" -> "CommutativeRing()"
+"IntegralDomain()" -> "Algebra(a:CommutativeRing)"
+"IntegralDomain()" -> "EntireRing()"
+
+"CommutativeRing()" [color=lightblue];
+"CommutativeRing()" -> "RING..."
+"CommutativeRing()" -> "BMODULE..."
+
+"EntireRing()" [color=lightblue];
+"EntireRing()" -> "RING..."
+"EntireRing()" -> "BMODULE..."
+
+"Algebra(a:CommutativeRing)" [color=lightblue];
+"Algebra(a:CommutativeRing)" -> "RING..."
+"Algebra(a:CommutativeRing)" -> "Module(a:CommutativeRing)"
+
+"Module(a:CommutativeRing)" [color=lightblue];
+"Module(a:CommutativeRing)" ->
+  "BiModule(a:CommutativeRing,b:CommutativeRing)"
+
+"BiModule(a:CommutativeRing,b:CommutativeRing)" [color=seagreen];
+"BiModule(a:CommutativeRing,b:CommutativeRing)" -> "BMODULE..."
+
+"BMODULE..." [color=lightblue];
+"RING..." [color=lightblue];
+}
+
+@
+\chapter{Category Layer 15}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{EuclideanDomain}{EUCDOM}
+\pagepic{ps/v102euclideandomain.ps}{EUCDOM}{0.65}
+
+{\bf See:}\\
+\pageto{Field}{FIELD}
+\pagefrom{PrincipalIdealDomain}{PID}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{EUCDOM}{1} &
+\cross{EUCDOM}{0} &
+\cross{EUCDOM}{associates?} &
+\cross{EUCDOM}{characteristic} &
+\cross{EUCDOM}{coerce} \\
+\cross{EUCDOM}{divide} &
+\cross{EUCDOM}{euclideanSize} &
+\cross{EUCDOM}{expressIdealMember} &
+\cross{EUCDOM}{exquo} &
+\cross{EUCDOM}{extendedEuclidean} \\
+\cross{EUCDOM}{gcd} &
+\cross{EUCDOM}{gcdPolynomial} &
+\cross{EUCDOM}{hash} &
+\cross{EUCDOM}{latex} &
+\cross{EUCDOM}{lcm} \\
+\cross{EUCDOM}{multiEuclidean} &
+\cross{EUCDOM}{one?} &
+\cross{EUCDOM}{principalIdeal} &
+\cross{EUCDOM}{recip} &
+\cross{EUCDOM}{sample} \\
+\cross{EUCDOM}{sizeLess?} &
+\cross{EUCDOM}{subtractIfCan} &
+\cross{EUCDOM}{unit?} &
+\cross{EUCDOM}{unitCanonical} &
+\cross{EUCDOM}{unitNormal} \\
+\cross{EUCDOM}{zero?} &
+\cross{EUCDOM}{?+?} &
+\cross{EUCDOM}{?-?} &
+\cross{EUCDOM}{-?} &
+\cross{EUCDOM}{?=?} \\
+\cross{EUCDOM}{?quo?} &
+\cross{EUCDOM}{?rem?} &
+\cross{EUCDOM}{?\~{}=?} &
+\cross{EUCDOM}{?*?} &
+\cross{EUCDOM}{?**?} \\
+\cross{EUCDOM}{?\^{}?} &&&&
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ divide : (%,%) -> Record(quotient: %,remainder: %)
+ euclideanSize : % -> NonNegativeInteger
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ expressIdealMember : (List %,%) -> Union(List %,"failed")
+ exquo : (%,%) -> Union(%,"failed")
+ extendedEuclidean : (%,%) -> Record(coef1: %,coef2: %,generator: %)
+ extendedEuclidean : (%,%,%) -> Union(Record(coef1: %,coef2: %),"failed")
+ gcd : (%,%) -> %                     
+ multiEuclidean : (List %,%) -> Union(List %,"failed")
+ principalIdeal : List % -> Record(coef: List %,generator: %)
+ sizeLess? : (%,%) -> Boolean         
+ ?quo? : (%,%) -> %                   
+ ?rem? : (%,%) -> %                   
+\end{verbatim}
+
+These exports come from PrincipalIdealDomain():
+\begin{verbatim}
+ 0 : () -> %
+ 1 : () -> %                          
+ associates? : (%,%) -> Boolean
+ characteristic : () -> NonNegativeInteger
+ coerce : % -> %                      
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ gcd : List % -> %
+ gcdPolynomial : (SparseUnivariatePolynomial %,
+                  SparseUnivariatePolynomial %) -> 
+                     SparseUnivariatePolynomial %
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ lcm : List % -> %
+ lcm : (%,%) -> %                     
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ unit? : % -> Boolean
+ unitCanonical : % -> %               
+ unitNormal : % -> Record(unit: %,canonical: %,associate: %)
+ zero? : % -> Boolean
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean              
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?**? : (%,PositiveInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?^? : (%,NonNegativeInteger) -> %
+\end{verbatim}
+
+<<category EUCDOM EuclideanDomain>>=
+)abbrev category EUCDOM EuclideanDomain
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A constructive euclidean domain, i.e. one can divide producing
+++ a quotient and a remainder where the remainder is either zero
+++ or is smaller (\spadfun{euclideanSize}) than the divisor.
+++
+++ Conditional attributes:
+++   multiplicativeValuation\tab{25}\spad{Size(a*b)=Size(a)*Size(b)}
+++   additiveValuation\tab{25}\spad{Size(a*b)=Size(a)+Size(b)}
+
+EuclideanDomain(): Category == PrincipalIdealDomain with
+   sizeLess?: (%,%) -> Boolean
+     ++ sizeLess?(x,y) tests whether x is strictly
+     ++ smaller than y with respect to the 
+     ++ \spadfunFrom{euclideanSize}{EuclideanDomain}.
+   euclideanSize: % -> NonNegativeInteger
+     ++ euclideanSize(x) returns the euclidean size of the element x.
+     ++ Error: if x is zero.
+   divide: (%,%) -> Record(quotient:%,remainder:%)
+     ++ divide(x,y) divides x by y producing a record containing a
+     ++ \spad{quotient} and \spad{remainder},
+     ++ where the remainder is smaller (see 
+     ++ \spadfunFrom{sizeLess?}{EuclideanDomain}) than the divisor y.
+   "quo" : (%,%) -> %
+     ++ x quo y is the same as \spad{divide(x,y).quotient}.
+     ++ See \spadfunFrom{divide}{EuclideanDomain}.
+   "rem": (%,%) -> %
+     ++ x rem y is the same as \spad{divide(x,y).remainder}.
+     ++ See \spadfunFrom{divide}{EuclideanDomain}.
+   extendedEuclidean: (%,%) -> Record(coef1:%,coef2:%,generator:%)
+     -- formerly called princIdeal
+     ++ extendedEuclidean(x,y) returns a record rec where
+     ++ \spad{rec.coef1*x+rec.coef2*y = rec.generator} and
+     ++ rec.generator is a gcd of x and y.
+     ++ The gcd is unique only
+     ++ up to associates if \spadatt{canonicalUnitNormal} is not asserted.
+     ++ \spadfun{principalIdeal} provides a version of this operation
+     ++ which accepts an arbitrary length list of arguments.
+   extendedEuclidean: (%,%,%) -> Union(Record(coef1:%,coef2:%),"failed")
+     -- formerly called expressIdealElt
+     ++ extendedEuclidean(x,y,z) either returns a record rec
+     ++ where \spad{rec.coef1*x+rec.coef2*y=z} or returns "failed"
+     ++ if z cannot be expressed as a linear combination of x and y.
+   multiEuclidean: (List %,%) -> Union(List %,"failed")
+     ++ multiEuclidean([f1,...,fn],z) returns a list of coefficients
+     ++ \spad{[a1, ..., an]} such that
+     ++ \spad{ z / prod fi = sum aj/fj}.
+     ++ If no such list of coefficients exists, "failed" is returned.
+  add
+      x,y,z: %
+      l: List %
+      sizeLess?(x,y) ==
+            zero? y => false
+            zero? x => true
+            euclideanSize(x)<euclideanSize(y)
+      x quo y == divide(x,y).quotient --divide must be user-supplied
+      x rem y == divide(x,y).remainder
+      x exquo y ==
+         zero? x => 0
+         zero? y => "failed"
+         qr:=divide(x,y)
+         zero?(qr.remainder) => qr.quotient
+         "failed"
+      gcd(x,y) ==                --Euclidean Algorithm
+         x:=unitCanonical x
+         y:=unitCanonical y
+         while not zero? y repeat
+            (x,y):= (y,x rem y)
+            y:=unitCanonical y   -- this doesn't affect the
+                                 -- correctness of Euclid's algorithm,
+                                 -- but
+                                 -- a) may improve performance
+                                 -- b) ensures gcd(x,y)=gcd(y,x)
+                                 --    if canonicalUnitNormal
+         x
+      IdealElt ==> Record(coef1:%,coef2:%,generator:%)
+      unitNormalizeIdealElt(s:IdealElt):IdealElt ==
+         (u,c,a):=unitNormal(s.generator)
+--         one? a => s
+         (a = 1) => s
+         [a*s.coef1,a*s.coef2,c]$IdealElt
+      extendedEuclidean(x,y) ==         --Extended Euclidean Algorithm
+         s1:=unitNormalizeIdealElt([1$%,0$%,x]$IdealElt)
+         s2:=unitNormalizeIdealElt([0$%,1$%,y]$IdealElt)
+         zero? y => s1
+         zero? x => s2
+         while not zero?(s2.generator) repeat
+            qr:= divide(s1.generator, s2.generator)
+            s3:=[s1.coef1 - qr.quotient * s2.coef1,
+                 s1.coef2 - qr.quotient * s2.coef2, qr.remainder]$IdealElt
+            s1:=s2
+            s2:=unitNormalizeIdealElt s3
+         if not(zero?(s1.coef1)) and not sizeLess?(s1.coef1,y)
+           then
+              qr:= divide(s1.coef1,y)
+              s1.coef1:= qr.remainder
+              s1.coef2:= s1.coef2 + qr.quotient * x
+              s1 := unitNormalizeIdealElt s1
+         s1
+
+      TwoCoefs ==> Record(coef1:%,coef2:%)
+      extendedEuclidean(x,y,z) ==
+         zero? z => [0,0]$TwoCoefs
+         s:= extendedEuclidean(x,y)
+         (w:= z exquo s.generator) case "failed" => "failed"
+         zero? y =>
+            [s.coef1 * w, s.coef2 * w]$TwoCoefs
+         qr:= divide((s.coef1 * w), y)
+         [qr.remainder, s.coef2 * w + qr.quotient * x]$TwoCoefs
+      principalIdeal l ==
+         l = [] => error "empty list passed to principalIdeal"
+         rest l = [] =>
+              uca:=unitNormal(first l)
+              [[uca.unit],uca.canonical]
+         rest rest l = [] =>
+             u:= extendedEuclidean(first l,second l)
+             [[u.coef1, u.coef2], u.generator]
+         v:=principalIdeal rest l
+         u:= extendedEuclidean(first l,v.generator)
+         [[u.coef1,:[u.coef2*vv for vv in v.coef]],u.generator]
+      expressIdealMember(l,z) ==
+         z = 0 => [0 for v in l]
+         pid := principalIdeal l
+         (q := z exquo (pid.generator)) case "failed" => "failed"
+         [q*v for v in pid.coef]
+      multiEuclidean(l,z) ==
+         n := #l
+         zero? n => error "empty list passed to multiEuclidean"
+         n = 1 => [z]
+         l1 := copy l
+         l2 := split!(l1, n quo 2)
+         u:= extendedEuclidean(*/l1, */l2, z)
+         u case "failed" => "failed"
+         v1 := multiEuclidean(l1,u.coef2)
+         v1 case "failed" => "failed"
+         v2 := multiEuclidean(l2,u.coef1)
+         v2 case "failed" => "failed"
+         concat(v1,v2)
+
+@
+<<EUCDOM.dotabb>>=
+"EUCDOM"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=EUCDOM"];
+"EUCDOM" -> "PID"
+
+@
+<<EUCDOM.dotfull>>=
+"EuclideanDomain()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=EUCDOM"];
+"EuclideanDomain()" -> "PrincipalIdealDomain()"
+
+@
+<<EUCDOM.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"EuclideanDomain()" [color=lightblue];
+"EuclideanDomain()" -> "PrincipalIdealDomain()"
+
+"PrincipalIdealDomain()" [color=lightblue];
+"PrincipalIdealDomain()" -> "GcdDomain()"
+
+"GcdDomain()" [color=lightblue];
+"GcdDomain()" -> "IntegralDomain()"
+
+"IntegralDomain()" [color=lightblue];
+"IntegralDomain()" -> "CommutativeRing()"
+"IntegralDomain()" -> "Algebra(a:CommutativeRing)"
+"IntegralDomain()" -> "EntireRing()"
+
+"CommutativeRing()" [color=lightblue];
+"CommutativeRing()" -> "RING..."
+"CommutativeRing()" -> "BMODULE..."
+
+"EntireRing()" [color=lightblue];
+"EntireRing()" -> "RING..."
+"EntireRing()" -> "BMODULE..."
+
+"Algebra(a:CommutativeRing)" [color=lightblue];
+"Algebra(a:CommutativeRing)" -> "RING..."
+"Algebra(a:CommutativeRing)" -> "Module(a:CommutativeRing)"
+
+"Module(a:CommutativeRing)" [color=lightblue];
+"Module(a:CommutativeRing)" -> "BMODULE..."
+
+"BMODULE..." [color=lightblue];
+"RING..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{PolynomialFactorizationExplicit}{PFECAT}
+\pagepic{ps/v102polynomialfactorizationexplicit.ps}{PFECAT}{0.75}
+
+{\bf See:}\\
+\pagefrom{UniqueFactorizationDomain}{UFD}
+
+{\bf Exports:}\\
+\begin{tabular}{lll}
+\cross{PFECAT}{0} &
+\cross{PFECAT}{1} &
+\cross{PFECAT}{associates?} \\
+\cross{PFECAT}{characteristic} &
+\cross{PFECAT}{charthRoot} &
+\cross{PFECAT}{coerce} \\
+\cross{PFECAT}{conditionP} &
+\cross{PFECAT}{exquo} &
+\cross{PFECAT}{factor} \\
+\cross{PFECAT}{factorPolynomial} &
+\cross{PFECAT}{factorSquareFreePolynomial} &
+\cross{PFECAT}{gcd} \\
+\cross{PFECAT}{gcdPolynomial} &
+\cross{PFECAT}{hash} &
+\cross{PFECAT}{latex} \\
+\cross{PFECAT}{lcm} &
+\cross{PFECAT}{one?} &
+\cross{PFECAT}{prime?} \\
+\cross{PFECAT}{recip} &
+\cross{PFECAT}{sample} &
+\cross{PFECAT}{solveLinearPolynomialEquation} \\
+\cross{PFECAT}{squareFree} &
+\cross{PFECAT}{squareFreePart} &
+\cross{PFECAT}{squareFreePolynomial} \\
+\cross{PFECAT}{subtractIfCan} &
+\cross{PFECAT}{unit?} &
+\cross{PFECAT}{unitNormal} \\
+\cross{PFECAT}{unitCanonical} &
+\cross{PFECAT}{zero?} &
+\cross{PFECAT}{?*?} \\
+\cross{PFECAT}{?**?} &
+\cross{PFECAT}{?+?} &
+\cross{PFECAT}{?-?} \\
+\cross{PFECAT}{-?} &
+\cross{PFECAT}{?=?} &
+\cross{PFECAT}{?\^{}?} \\
+\cross{PFECAT}{?\~{}=?} &&
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ conditionP : Matrix % -> Union(Vector %,"failed") 
+     if $ has CHARNZ
+ factorPolynomial :
+   SparseUnivariatePolynomial % ->
+      Factored SparseUnivariatePolynomial %
+ factorSquareFreePolynomial : 
+   SparseUnivariatePolynomial % -> 
+      Factored SparseUnivariatePolynomial %
+ squareFreePolynomial : 
+   SparseUnivariatePolynomial % -> 
+      Factored SparseUnivariatePolynomial %
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ charthRoot : % -> Union(%,"failed") if $ has CHARNZ
+ gcdPolynomial : (SparseUnivariatePolynomial %,
+                  SparseUnivariatePolynomial %) ->
+                     SparseUnivariatePolynomial %
+ solveLinearPolynomialEquation : 
+   (List SparseUnivariatePolynomial %,
+    SparseUnivariatePolynomial %) ->
+      Union(List SparseUnivariatePolynomial %,"failed")
+\end{verbatim}
+
+These exports come from UniqueFactorizationDomain():
+\begin{verbatim}
+ factor : % -> Factored %
+ squareFree : % -> Factored %         
+ 0 : () -> %
+ 1 : () -> %                          
+ associates? : (%,%) -> Boolean
+ characteristic : () -> NonNegativeInteger
+ coerce : % -> %                      
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ exquo : (%,%) -> Union(%,"failed")
+ gcd : List % -> %                    
+ gcd : (%,%) -> %
+ hash : % -> SingleInteger            
+ latex : % -> String
+ lcm : List % -> %                    
+ lcm : (%,%) -> %
+ one? : % -> Boolean                  
+ prime? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ sample : () -> %
+ squareFreePart : % -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ unit? : % -> Boolean                 
+ unitNormal : % -> Record(unit: %,canonical: %,associate: %)
+ unitCanonical : % -> %
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?**? : (%,PositiveInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?^? : (%,NonNegativeInteger) -> %
+\end{verbatim}
+
+<<category PFECAT PolynomialFactorizationExplicit>>=
+)abbrev category PFECAT PolynomialFactorizationExplicit
+++ Author: James Davenport
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ This is the category of domains that know "enough" about
+++ themselves in order to factor univariate polynomials over themselves.
+++ This will be used in future releases for supporting factorization
+++ over finitely generated coefficient fields, it is not yet available
+++ in the current release of axiom.
+
+PolynomialFactorizationExplicit(): Category == Definition where
+  P ==> SparseUnivariatePolynomial %
+  Definition ==>
+   UniqueFactorizationDomain with
+     squareFreePolynomial: P -> Factored(P)
+       ++ squareFreePolynomial(p) returns the
+       ++ square-free factorization of the
+       ++ univariate polynomial p.
+     factorPolynomial: P -> Factored(P)
+       ++ factorPolynomial(p) returns the factorization
+       ++ into irreducibles of the univariate polynomial p.
+     factorSquareFreePolynomial: P -> Factored(P)
+       ++ factorSquareFreePolynomial(p) factors the
+       ++ univariate polynomial p into irreducibles
+       ++ where p is known to be square free
+       ++ and primitive with respect to its main variable.
+     gcdPolynomial: (P, P) -> P
+       ++ gcdPolynomial(p,q) returns the gcd of the univariate
+       ++ polynomials p qnd q.
+       -- defaults to Euclidean, but should be implemented via
+       -- modular or p-adic methods.
+     solveLinearPolynomialEquation: (List P, P) -> Union(List P,"failed")
+       ++ solveLinearPolynomialEquation([f1, ..., fn], g)
+       ++ (where the fi are relatively prime to each other)
+       ++ returns a list of ai such that
+       ++ \spad{g/prod fi = sum ai/fi}
+       ++ or returns "failed" if no such list of ai's exists.
+     if % has CharacteristicNonZero then
+       conditionP: Matrix % -> Union(Vector %,"failed")
+         ++ conditionP(m) returns a vector of elements, not all zero,
+         ++ whose \spad{p}-th powers (p is the characteristic of the domain)
+         ++ are a solution of the homogenous linear system represented
+         ++ by m, or "failed" is there is no such vector.
+       charthRoot: % -> Union(%,"failed")
+         ++ charthRoot(r) returns the \spad{p}-th root of r, or "failed"
+         ++ if none exists in the domain.
+         -- this is a special case of conditionP, but often the one we want
+    add
+        gcdPolynomial(f,g) ==
+           zero? f => g
+           zero? g => f
+           cf:=content f
+           if not one? cf then f:=(f exquo cf)::P
+           cg:=content g
+           if not one? cg then g:=(g exquo cg)::P
+           ans:=subResultantGcd(f,g)$P
+           gcd(cf,cg)*(ans exquo content ans)::P
+        if % has CharacteristicNonZero then
+          charthRoot f ==
+             -- to take p'th root of f, solve the system X-fY=0,
+             -- so solution is [x,y]
+             -- with x^p=X and y^p=Y, then (x/y)^p = f
+             zero? f => 0
+             m:Matrix % := matrix [[1,-f]]
+             ans:= conditionP m
+             ans case "failed" => "failed"
+             (ans.1) exquo (ans.2)
+        if % has Field then
+          solveLinearPolynomialEquation(lf,g) ==
+            multiEuclidean(lf,g)$P
+        else solveLinearPolynomialEquation(lf,g) ==
+               LPE ==> LinearPolynomialEquationByFractions %
+               solveLinearPolynomialEquationByFractions(lf,g)$LPE
+
+@
+<<PFECAT.dotabb>>=
+"PFECAT"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=PFECAT"];
+"PFECAT" -> "UFD"
+
+@
+<<PFECAT.dotfull>>=
+"PolynomialFactorizationExplicit()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=PFECAT"];
+"PolynomialFactorizationExplicit()" -> "UniqueFactorizationDomain()"
+
+@
+<<PFECAT.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"PolynomialFactorizationExplicit()" [color=lightblue];
+"PolynomialFactorizationExplicit()" -> "UniqueFactorizationDomain()"
+
+"UniqueFactorizationDomain()" [color=lightblue];
+"UniqueFactorizationDomain()" -> "GcdDomain()"
+
+"GcdDomain()" [color=lightblue];
+"GcdDomain()" -> "IntegralDomain()"
+
+"IntegralDomain()" [color=lightblue];
+"IntegralDomain()" -> "CommutativeRing()"
+"IntegralDomain()" -> "Algebra(a:CommutativeRing)"
+"IntegralDomain()" -> "EntireRing()"
+
+"CommutativeRing()" [color=lightblue];
+"CommutativeRing()" -> "RING..."
+"CommutativeRing()" -> "BMODULE..."
+
+"EntireRing()" [color=lightblue];
+"EntireRing()" -> "RING..."
+"EntireRing()" -> "BMODULE..."
+
+"Algebra(a:CommutativeRing)" [color=lightblue];
+"Algebra(a:CommutativeRing)" -> "RING..."
+"Algebra(a:CommutativeRing)" -> "Module(a:CommutativeRing)"
+
+"Module(a:CommutativeRing)" [color=lightblue];
+"Module(a:CommutativeRing)" -> "BMODULE..."
+
+"BMODULE..." [color=lightblue];
+"RING..." [color=lightblue];
+}
+
+@
+\chapter{Category Layer 16}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Field}{FIELD}
+\pagepic{ps/v102field.ps}{FIELD}{1.00}
+
+{\bf See:}\\
+\pagefrom{DivisionRing}{DIVRING}
+\pagefrom{EuclideanDomain}{EUCDOM}
+\pagefrom{UniqueFactorizationDomain}{UFD}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{FIELD}{0} &
+\cross{FIELD}{1} &
+\cross{FIELD}{associates?} &
+\cross{FIELD}{characteristic} &
+\cross{FIELD}{coerce} \\
+\cross{FIELD}{divide} &
+\cross{FIELD}{euclideanSize} &
+\cross{FIELD}{expressIdealMember} &
+\cross{FIELD}{exquo} &
+\cross{FIELD}{extendedEuclidean} \\
+\cross{FIELD}{factor} &
+\cross{FIELD}{gcd} &
+\cross{FIELD}{gcdPolynomial} &
+\cross{FIELD}{hash} &
+\cross{FIELD}{inv} \\
+\cross{FIELD}{latex} &
+\cross{FIELD}{lcm} &
+\cross{FIELD}{multiEuclidean} &
+\cross{FIELD}{one?} &
+\cross{FIELD}{prime?} \\
+\cross{FIELD}{principalIdeal} &
+\cross{FIELD}{recip} &
+\cross{FIELD}{sample} &
+\cross{FIELD}{sizeLess?} &
+\cross{FIELD}{squareFree} \\
+\cross{FIELD}{squareFreePart} &
+\cross{FIELD}{subtractIfCan} &
+\cross{FIELD}{unit?} &
+\cross{FIELD}{unitCanonical} &
+\cross{FIELD}{unitNormal} \\
+\cross{FIELD}{zero?} &
+\cross{FIELD}{?*?} &
+\cross{FIELD}{?**?} &
+\cross{FIELD}{?+?} &
+\cross{FIELD}{?-?} \\
+\cross{FIELD}{-?} &
+\cross{FIELD}{?/?} &
+\cross{FIELD}{?=?} &
+\cross{FIELD}{?\^{}?} &
+\cross{FIELD}{?quo?} \\
+\cross{FIELD}{?rem?} &
+\cross{FIELD}{?\~{}=?} &&&
+\end{tabular}
+
+These are implemented by this category:
+\begin{verbatim}
+ associates? : (%,%) -> Boolean       
+ divide : (%,%) -> Record(quotient: %,remainder: %)
+ euclideanSize : % -> NonNegativeInteger
+ exquo : (%,%) -> Union(%,"failed")
+ factor : % -> Factored %
+ gcd : (%,%) -> %
+ inv : % -> %
+ prime? : % -> Boolean                
+ squareFree : % -> Factored %         
+ unitCanonical : % -> %
+ unitNormal : % -> Record(unit: %,canonical: %,associate: %)
+ ?/? : (%,%) -> %                     
+\end{verbatim}
+
+These exports come from EuclideanDomain():
+\begin{verbatim}
+ 0 : () -> %
+ 1 : () -> %                          
+ characteristic : () -> NonNegativeInteger
+ coerce : % -> %                      
+ coerce : Integer -> %
+ coerce : % -> OutputForm             
+ expressIdealMember : (List %,%) -> Union(List %,"failed")
+ extendedEuclidean : (%,%,%) -> Union(Record(coef1: %,coef2: %),"failed")
+ extendedEuclidean : (%,%) -> Record(coef1: %,coef2: %,generator: %)
+ gcd : List % -> %                    
+ gcdPolynomial : (SparseUnivariatePolynomial %,
+                  SparseUnivariatePolynomial %) ->
+                      SparseUnivariatePolynomial %
+ hash : % -> SingleInteger            
+ latex : % -> String                  
+ lcm : List % -> %
+ lcm : (%,%) -> %                     
+ multiEuclidean : (List %,%) -> Union(List %,"failed")
+ one? : % -> Boolean
+ principalIdeal : List % -> Record(coef: List %,generator: %)
+ recip : % -> Union(%,"failed")       
+ sample : () -> %                     
+ sizeLess? : (%,%) -> Boolean
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ unit? : % -> Boolean                 
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %                     
+ -? : % -> %
+ ?**? : (%,PositiveInteger) -> %      
+ ?**? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %
+ ?^? : (%,NonNegativeInteger) -> %
+ ?quo? : (%,%) -> %
+ ?rem? : (%,%) -> %
+\end{verbatim}
+
+These exports come from UniqueFactorizationDomain():
+\begin{verbatim}
+ squareFreePart : % -> %
+\end{verbatim}
+
+These exports come from DivisionRing():
+\begin{verbatim}
+ coerce : Fraction Integer -> %
+ ?*? : (Fraction Integer,%) -> %      
+ ?*? : (%,Fraction Integer) -> %
+ ?**? : (%,Integer) -> %
+ ?^? : (%,Integer) -> %               
+\end{verbatim}
+
+<<category FIELD Field>>=
+)abbrev category FIELD Field
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The category of commutative fields, i.e. commutative rings
+++ where all non-zero elements have multiplicative inverses.
+++ The \spadfun{factor} operation while trivial is useful to have defined.
+++
+++ Axioms:
+++   \spad{a*(b/a) = b}
+++   \spad{inv(a) = 1/a}
+
+Field(): Category == Join(EuclideanDomain,UniqueFactorizationDomain,
+  DivisionRing) with
+      "/": (%,%) -> %
+        ++ x/y divides the element x by the element y.
+        ++ Error: if y is 0.
+      canonicalUnitNormal  ++ either 0 or 1.
+      canonicalsClosed     ++ since \spad{0*0=0}, \spad{1*1=1}
+    add
+      x,y: %
+      n: Integer
+      UCA ==> Record(unit:%,canonical:%,associate:%)
+      unitNormal(x) ==
+          if zero? x then [1$%,0$%,1$%]$UCA else [x,1$%,inv(x)]$UCA
+      unitCanonical(x) == if zero? x then x else 1
+      associates?(x,y) == if zero? x then zero? y else not(zero? y)
+      inv x ==((u:=recip x) case "failed" => error "not invertible"; u)
+      x exquo y == (y=0 => "failed"; x / y)
+      gcd(x,y) == 1
+      euclideanSize(x) == 0
+      prime? x == false
+      squareFree x == x::Factored(%)
+      factor x == x::Factored(%)
+      x / y == (zero? y => error "catdef: division by zero"; x * inv(y))
+      divide(x,y) == [x / y,0]
+
+@
+<<FIELD.dotabb>>=
+"FIELD"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=FIELD"];
+"FIELD" -> "EUCDOM"
+"FIELD" -> "UFD"
+"FIELD" -> "DIVRING"
+
+@
+<<FIELD.dotfull>>=
+"Field()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=FIELD"];
+"Field()" -> "EuclideanDomain()"
+"Field()" -> "UniqueFactorizationDomain()"
+"Field()" -> "DivisionRing()"
+
+@
+<<FIELD.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"Field()" [color=lightblue];
+"Field()" -> "EuclideanDomain()"
+"Field()" -> "UniqueFactorizationDomain()"
+"Field()" -> "DIVRING..."
+
+"EuclideanDomain()" [color=lightblue];
+"EuclideanDomain()" -> "PrincipalIdealDomain()"
+
+"UniqueFactorizationDomain()" [color=lightblue];
+"UniqueFactorizationDomain()" -> "GCDDOM..."
+
+"PrincipalIdealDomain()" [color=lightblue];
+"PrincipalIdealDomain()" -> "GCDDOM..."
+
+"DIVRING..." [color=lightblue];
+"GCDDOM..." [color=lightblue];
+}
 
 @
 \chapter{Temporary Placeholders}
@@ -13358,6 +17753,1349 @@ Note that this code is not included in the generated catdef.spad file.
         12 0 13 2 0 14 12 0 15 1 0 10 0 11))))))
     (QUOTE |lookupComplete|))) 
 @
+\section{COMRING.lsp BOOTSTRAP}
+{\bf COMRING} depends on itself. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf COMRING}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf COMRING.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<COMRING.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |CommutativeRing;AL| (QUOTE NIL)) 
+
+(DEFUN |CommutativeRing| NIL 
+  (LET (#:G82892) 
+    (COND 
+      (|CommutativeRing;AL|)
+      (T (SETQ |CommutativeRing;AL| (|CommutativeRing;|)))))) 
+
+(DEFUN |CommutativeRing;| NIL 
+  (PROG (#1=#:G82890) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| 
+            (|Ring|)
+            (|BiModule| (QUOTE |$|) (QUOTE |$|))
+            (|mkCategory| 
+              (QUOTE |package|)
+              NIL
+              (QUOTE (((|commutative| "*") T)))
+              (QUOTE NIL)
+              NIL)) 
+           |CommutativeRing|)
+        (SETELT #1# 0 (QUOTE (|CommutativeRing|))))))) 
+
+(MAKEPROP (QUOTE |CommutativeRing|) (QUOTE NILADIC) T) 
+
+@
+\section{DIFRING.lsp BOOTSTRAP} 
+{\bf DIFRING} needs {\bf INT} which needs {\bf DIFRING}.
+We need to break this cycle to build the algebra. So we keep a
+cached copy of the translated {\bf DIFRING} category which we can write
+into the {\bf MID} directory. We compile the lisp code and copy the
+{\bf DIFRING.o} file to the {\bf OUT} directory.  This is eventually
+forcibly replaced by a recompiled version.
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<DIFRING.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |DifferentialRing;AL| (QUOTE NIL)) 
+
+(DEFUN |DifferentialRing| NIL 
+  (LET (#:G84565) 
+    (COND 
+      (|DifferentialRing;AL|) 
+      (T (SETQ |DifferentialRing;AL| (|DifferentialRing;|)))))) 
+
+(DEFUN |DifferentialRing;| NIL 
+  (PROG (#1=#:G84563) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| 
+            (|Ring|)
+            (|mkCategory| 
+              (QUOTE |domain|)
+              (QUOTE 
+                (((|differentiate| (|$| |$|)) T)
+                 ((D (|$| |$|)) T)
+                 ((|differentiate| (|$| |$| (|NonNegativeInteger|))) T)
+                 ((D (|$| |$| (|NonNegativeInteger|))) T)))
+              NIL
+              (QUOTE ((|NonNegativeInteger|)))
+              NIL))
+          |DifferentialRing|)
+        (SETELT #1# 0 (QUOTE (|DifferentialRing|))))))) 
+
+(MAKEPROP (QUOTE |DifferentialRing|) (QUOTE NILADIC) T) 
+
+@
+\section{DIFRING-.lsp BOOTSTRAP} 
+{\bf DIFRING-} needs {\bf DIFRING}.
+We need to break this cycle to build the algebra. So we keep a
+cached copy of the translated {\bf DIFRING-} category which we can write
+into the {\bf MID} directory. We compile the lisp code and copy the
+{\bf DIFRING-.o} file to the {\bf OUT} directory.  This is eventually
+forcibly replaced by a recompiled version.
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<DIFRING-.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(DEFUN |DIFRING-;D;2S;1| (|r| |$|) 
+  (SPADCALL |r| (QREFELT |$| 7))) 
+
+(DEFUN |DIFRING-;differentiate;SNniS;2| (|r| |n| |$|) 
+  (PROG (|i|) 
+    (RETURN 
+      (SEQ 
+        (SEQ 
+          (LETT |i| 1 |DIFRING-;differentiate;SNniS;2|)
+          G190
+          (COND ((QSGREATERP |i| |n|) (GO G191)))
+          (SEQ 
+            (EXIT 
+              (LETT |r| 
+                (SPADCALL |r| (QREFELT |$| 7))
+                |DIFRING-;differentiate;SNniS;2|)))
+          (LETT |i| (QSADD1 |i|) |DIFRING-;differentiate;SNniS;2|)
+          (GO G190)
+          G191
+          (EXIT NIL)) 
+        (EXIT |r|))))) 
+
+(DEFUN |DIFRING-;D;SNniS;3| (|r| |n| |$|) 
+  (SPADCALL |r| |n| (QREFELT |$| 11))) 
+
+(DEFUN |DifferentialRing&| (|#1|) 
+  (PROG (|DV$1| |dv$| |$| |pv$|) 
+    (RETURN 
+      (PROGN 
+        (LETT |DV$1| (|devaluate| |#1|) . #1=(|DifferentialRing&|))
+        (LETT |dv$| (LIST (QUOTE |DifferentialRing&|) |DV$1|) . #1#)
+        (LETT |$| (GETREFV 13) . #1#)
+        (QSETREFV |$| 0 |dv$|)
+        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
+        (|stuffDomainSlots| |$|)
+        (QSETREFV |$| 6 |#1|)
+        |$|)))) 
+
+(MAKEPROP 
+  (QUOTE |DifferentialRing&|)
+  (QUOTE |infovec|)
+  (LIST 
+    (QUOTE 
+      #(NIL NIL NIL NIL NIL NIL 
+        (|local| |#1|)
+        (0 . |differentiate|)
+        |DIFRING-;D;2S;1| 
+        (|NonNegativeInteger|)
+        |DIFRING-;differentiate;SNniS;2| 
+        (5 . |differentiate|)
+        |DIFRING-;D;SNniS;3|)) 
+    (QUOTE #(|differentiate| 11 D 17))
+    (QUOTE NIL) 
+    (CONS 
+      (|makeByteWordVec2| 1 (QUOTE NIL))
+      (CONS 
+        (QUOTE #())
+        (CONS 
+          (QUOTE #())
+          (|makeByteWordVec2| 12 
+            (QUOTE 
+             (1 6 0 0 7 2 6 0 0 9 11 2 0 0 0 9 10 2 0 0 0 9 12 1 0 0 0 8))))))
+    (QUOTE |lookupComplete|))) 
+
+@
+\section{DIVRING.lsp BOOTSTRAP}
+{\bf DIVRING} depends on {\bf QFCAT} which eventually depends on 
+{\bf DIVRING}. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf DIVRING}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf DIVRING.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<DIVRING.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |DivisionRing;AL| (QUOTE NIL)) 
+
+(DEFUN |DivisionRing| NIL 
+  (LET (#:G84035) 
+    (COND 
+      (|DivisionRing;AL|)
+      (T (SETQ |DivisionRing;AL| (|DivisionRing;|)))))) 
+
+(DEFUN |DivisionRing;| NIL 
+  (PROG (#1=#:G84033) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|sublisV| 
+            (PAIR 
+              (QUOTE (#2=#:G84032))
+              (LIST (QUOTE (|Fraction| (|Integer|)))))
+            (|Join| 
+              (|EntireRing|)
+              (|Algebra| (QUOTE #2#))
+              (|mkCategory| 
+                (QUOTE |domain|)
+                (QUOTE (
+                  ((|**| (|$| |$| (|Integer|))) T)
+                  ((|^| (|$| |$| (|Integer|))) T)
+                  ((|inv| (|$| |$|)) T)))
+                NIL
+                (QUOTE ((|Integer|)))
+                NIL)))
+          |DivisionRing|)
+        (SETELT #1# 0 (QUOTE (|DivisionRing|))))))) 
+
+(MAKEPROP (QUOTE |DivisionRing|) (QUOTE NILADIC) T) 
+
+@
+\section{DIVRING-.lsp BOOTSTRAP}
+{\bf DIVRING-} depends on {\bf DIVRING}. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf DIVRING-}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf DIVRING-.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<DIVRING-.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(DEFUN |DIVRING-;^;SIS;1| (|x| |n| |$|) 
+  (SPADCALL |x| |n| (QREFELT |$| 8))) 
+
+(DEFUN |DIVRING-;**;SIS;2| (|x| |n| |$|) 
+  (COND 
+    ((ZEROP |n|) (|spadConstant| |$| 10))
+    ((SPADCALL |x| (QREFELT |$| 12))
+      (COND 
+        ((|<| |n| 0) (|error| "division by zero"))
+        ((QUOTE T) |x|)))
+    ((|<| |n| 0) 
+      (SPADCALL (SPADCALL |x| (QREFELT |$| 14)) (|-| |n|) (QREFELT |$| 17)))
+    ((QUOTE T) (SPADCALL |x| |n| (QREFELT |$| 17))))) 
+
+(DEFUN |DIVRING-;*;F2S;3| (|q| |x| |$|) 
+  (SPADCALL 
+    (SPADCALL 
+      (SPADCALL |q| (QREFELT |$| 20))
+      (SPADCALL 
+        (SPADCALL (SPADCALL |q| (QREFELT |$| 21)) (QREFELT |$| 22))
+        (QREFELT |$| 14))
+      (QREFELT |$| 23))
+    |x|
+    (QREFELT |$| 24))) 
+
+(DEFUN |DivisionRing&| (|#1|) 
+  (PROG (|DV$1| |dv$| |$| |pv$|) 
+    (RETURN 
+      (PROGN 
+        (LETT |DV$1| (|devaluate| |#1|) . #1=(|DivisionRing&|))
+        (LETT |dv$| (LIST (QUOTE |DivisionRing&|) |DV$1|) . #1#)
+        (LETT |$| (GETREFV 27) . #1#)
+        (QSETREFV |$| 0 |dv$|)
+        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
+        (|stuffDomainSlots| |$|)
+        (QSETREFV |$| 6 |#1|)
+        |$|)))) 
+
+(MAKEPROP 
+  (QUOTE |DivisionRing&|)
+  (QUOTE |infovec|)
+  (LIST 
+    (QUOTE 
+      #(NIL NIL NIL NIL NIL NIL 
+        (|local| |#1|)
+        (|Integer|)
+        (0 . |**|)
+        |DIVRING-;^;SIS;1| 
+        (6 . |One|)
+        (|Boolean|)
+        (10 . |zero?|)
+        (15 . |Zero|)
+        (19 . |inv|)
+        (|PositiveInteger|)
+        (|RepeatedSquaring| 6)
+        (24 . |expt|)
+        |DIVRING-;**;SIS;2| 
+        (|Fraction| 7)
+        (30 . |numer|)
+        (35 . |denom|)
+        (40 . |coerce|)
+        (45 . |*|)
+        (51 . |*|)
+        |DIVRING-;*;F2S;3| 
+        (|NonNegativeInteger|))) 
+    (QUOTE #(|^| 57 |**| 63 |*| 69))
+    (QUOTE NIL)
+    (CONS 
+      (|makeByteWordVec2| 1 (QUOTE NIL))
+      (CONS 
+        (QUOTE #()) 
+        (CONS 
+          (QUOTE #()) 
+            (|makeByteWordVec2| 25 
+              (QUOTE 
+                (2 6 0 0 7 8 0 6 0 10 1 6 11 0 12 0 6 0 13 1 6 0 0 14 2 16 6
+                 6 15 17 1 19 7 0 20 1 19 7 0 21 1 6 0 7 22 2 6 0 7 0 23 2 6
+                 0 0 0 24 2 0 0 0 7 9 2 0 0 0 7 18 2 0 0 19 0 25)))))) 
+    (QUOTE |lookupComplete|))) 
+
+@
+\section{EUCDOM.lsp BOOTSTRAP}
+{\bf EUCDOM} depends on {\bf INT} which depends on {\bf EUCDOM}. 
+We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf EUCDOM}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf EUCDOM.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Note that this code is not included in the generated catdef.spad file.
+
+\subsection{The Lisp Implementation}
+\subsubsection{EUCDOM;VersionCheck}
+This implements the bootstrap code for {\bf EuclideanDomain}. 
+The call to {\bf VERSIONCHECK} is a legacy check to ensure that
+we did not load algebra code from a previous system version (which
+would not run due to major surgical changes in the system) without
+recompiling.
+<<EUCDOM;VersionCheck>>=
+(|/VERSIONCHECK| 2) 
+
+@
+\subsubsection{The Domain Cache Variable}
+We create a variable which is formed by concatenating the string
+``{\bf ;AL}'' to the domain name forming, in this case,
+``{\bf EuclideanDomain;AL}''. The variable has the initial value
+at load time of a list of one element, {\bf NIL}. This list is
+a data structure that will be modified to hold an executable 
+function. This function is created the first time the domain is
+used which it replaces the {\bf NIL}.
+<<EuclideanDomain;AL>>=
+(SETQ |EuclideanDomain;AL| (QUOTE NIL)) 
+
+@
+\subsubsection{The Domain Function}
+When you call a domain the code is pretty simple at the top
+level. This code will check to see if this domain has ever been
+used. It does this by checking the value of the cached domain
+variable (which is the domain name {\bf EuclideanDomain} concatenated
+with the string ``{\bf ;AL}'' to form the cache variable name which
+is {\bf EuclideanDomain;AL}).
+
+If this value is NIL we have never executed this function
+before. If it is not NIL we have executed this function before and
+we need only return the cached function which was stored in the
+cache variable.
+
+If this is the first time this function is called, the cache
+variable is NIL and we execute the other branch of the conditional.
+This calls a function which 
+\begin{enumerate}
+\item creates a procedure
+\item returns the procedure as a value.
+\end{enumerate}
+This procedure replaces the cached variable {\bf EuclideanDomain;AL}
+value so it will be non-NIL the second time this domain is used.
+Thus the work of building the domain only happens once.
+
+If this function has never been called before we call the 
+<<EuclideanDomain>>=
+(DEFUN |EuclideanDomain| NIL 
+  (LET (#:G83585) 
+    (COND 
+      (|EuclideanDomain;AL|)
+      (T (SETQ |EuclideanDomain;AL| (|EuclideanDomain;|)))))) 
+
+@
+\subsubsection{The First Call Domain Function}
+<<EuclideanDomain;>>=
+(DEFUN |EuclideanDomain;| NIL 
+  (PROG (#1=#:G83583) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| 
+            (|PrincipalIdealDomain|)
+            (|mkCategory| 
+              (QUOTE |domain|)
+              (QUOTE (
+                ((|sizeLess?| ((|Boolean|) |$| |$|)) T)
+                ((|euclideanSize| ((|NonNegativeInteger|) |$|)) T)
+                ((|divide| 
+                  ((|Record| 
+                    (|:| |quotient| |$|)
+                    (|:| |remainder| |$|))
+                  |$| |$|)) T)
+                ((|quo| (|$| |$| |$|)) T)
+                ((|rem| (|$| |$| |$|)) T)
+                ((|extendedEuclidean| 
+                  ((|Record| 
+                    (|:| |coef1| |$|)
+                    (|:| |coef2| |$|)
+                    (|:| |generator| |$|))
+                  |$| |$|)) T)
+                ((|extendedEuclidean| 
+                  ((|Union| 
+                      (|Record| (|:| |coef1| |$|) (|:| |coef2| |$|))
+                      "failed")
+                    |$| |$| |$|)) T)
+                ((|multiEuclidean| 
+                  ((|Union| 
+                      (|List| |$|)
+                      "failed") 
+                   (|List| |$|) |$|)) T)))
+              NIL 
+              (QUOTE ((|List| |$|) (|NonNegativeInteger|) (|Boolean|)))
+              NIL)) 
+            |EuclideanDomain|)
+        (SETELT #1# 0 (QUOTE (|EuclideanDomain|))))))) 
+
+@
+\subsubsection{EUCDOM;MAKEPROP}
+<<EUCDOM;MAKEPROP>>=
+(MAKEPROP (QUOTE |EuclideanDomain|) (QUOTE NILADIC) T) 
+
+@
+<<EUCDOM.lsp BOOTSTRAP>>=
+<<EUCDOM;VersionCheck>>
+<<EuclideanDomain;AL>>
+<<EuclideanDomain>>
+<<EuclideanDomain;>>
+<<EUCDOM;MAKEPROP>>
+@
+\section{EUCDOM-.lsp BOOTSTRAP}
+{\bf EUCDOM-} depends on {\bf EUCDOM}. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf EUCDOM-}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf EUCDOM-.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Note that this code is not included in the generated catdef.spad file.
+
+\subsection{The Lisp Implementation}
+\subsubsection{EUCDOM-;VersionCheck}
+This implements the bootstrap code for {\bf EuclideanDomain}. 
+The call to {\bf VERSIONCHECK} is a legacy check to ensure that
+we did not load algebra code from a previous system version (which
+would not run due to major surgical changes in the system) without
+recompiling.
+<<EUCDOM-;VersionCheck>>=
+(|/VERSIONCHECK| 2) 
+
+@
+\subsubsection{EUCDOM-;sizeLess?;2SB;1}
+<<EUCDOM-;sizeLess?;2SB;1>>=
+(DEFUN |EUCDOM-;sizeLess?;2SB;1| (|x| |y| $)
+ (COND
+  ((SPADCALL |y| (QREFELT $ 8)) (QUOTE NIL))
+  ((SPADCALL |x| (QREFELT $ 8)) (QUOTE T))
+  ((QUOTE T)
+   (< (SPADCALL |x| (QREFELT $ 10)) (SPADCALL |y| (QREFELT $ 10)))))) 
+
+@
+
+\subsubsection{EUCDOM-;quo;3S;2}
+<<EUCDOM-;quo;3S;2>>=
+(DEFUN |EUCDOM-;quo;3S;2| (|x| |y| $)
+ (QCAR (SPADCALL |x| |y| (QREFELT $ 13)))) 
+
+@
+\subsubsection{EUCDOM-;rem;3S;3}
+<<EUCDOM-;rem;3S;3>>=
+(DEFUN |EUCDOM-;rem;3S;3| (|x| |y| $)
+ (QCDR (SPADCALL |x| |y| (QREFELT $ 13)))) 
+
+@
+\subsubsection{EUCDOM-;exquo;2SU;4}
+<<EUCDOM-;exquo;2SU;4>>=
+(DEFUN |EUCDOM-;exquo;2SU;4| (|x| |y| $)
+ (PROG (|qr|)
+  (RETURN
+   (SEQ
+    (COND
+     ((SPADCALL |x| (QREFELT $ 8)) (CONS 0 (|spadConstant| $ 16)))
+     ((SPADCALL |y| (QREFELT $ 8)) (CONS 1 "failed"))
+     ((QUOTE T)
+      (SEQ
+       (LETT |qr|
+        (SPADCALL |x| |y| (QREFELT $ 13))
+        |EUCDOM-;exquo;2SU;4|)
+       (EXIT
+        (COND
+         ((SPADCALL (QCDR |qr|) (QREFELT $ 8)) (CONS 0 (QCAR |qr|)))
+         ((QUOTE T) (CONS 1 "failed"))))))))))) 
+
+@
+\subsubsection{EUCDOM-;gcd;3S;5}
+<<EUCDOM-;gcd;3S;5>>=
+(DEFUN |EUCDOM-;gcd;3S;5| (|x| |y| $)
+ (PROG (|#G13| |#G14|)
+  (RETURN
+   (SEQ
+    (LETT |x| (SPADCALL |x| (QREFELT $ 19)) |EUCDOM-;gcd;3S;5|)
+    (LETT |y| (SPADCALL |y| (QREFELT $ 19)) |EUCDOM-;gcd;3S;5|)
+    (SEQ G190
+     (COND
+      ((NULL
+       (COND 
+        ((SPADCALL |y| (QREFELT $ 8)) (QUOTE NIL))
+        ((QUOTE T) (QUOTE T))))
+       (GO G191)))
+     (SEQ
+      (PROGN
+       (LETT |#G13| |y| |EUCDOM-;gcd;3S;5|)
+       (LETT |#G14| (SPADCALL |x| |y| (QREFELT $ 20)) |EUCDOM-;gcd;3S;5|)
+       (LETT |x| |#G13| |EUCDOM-;gcd;3S;5|)
+       (LETT |y| |#G14| |EUCDOM-;gcd;3S;5|))
+      (EXIT
+       (LETT |y| (SPADCALL |y| (QREFELT $ 19)) |EUCDOM-;gcd;3S;5|)))
+     NIL
+     (GO G190)
+    G191
+   (EXIT NIL))
+  (EXIT |x|))))) 
+
+@
+\subsubsection{EUCDOM-;unitNormalizeIdealElt}
+<<EUCDOM-;unitNormalizeIdealElt>>=
+(DEFUN |EUCDOM-;unitNormalizeIdealElt| (|s| $)
+ (PROG (|#G16| |u| |c| |a|)
+  (RETURN
+   (SEQ
+    (PROGN
+     (LETT |#G16| 
+       (SPADCALL (QVELT |s| 2) (QREFELT $ 23))
+       |EUCDOM-;unitNormalizeIdealElt|)
+     (LETT |u| (QVELT |#G16| 0) |EUCDOM-;unitNormalizeIdealElt|)
+     (LETT |c| (QVELT |#G16| 1) |EUCDOM-;unitNormalizeIdealElt|)
+     (LETT |a| (QVELT |#G16| 2) |EUCDOM-;unitNormalizeIdealElt|)
+     |#G16|)
+    (EXIT
+     (COND
+      ((SPADCALL |a| (|spadConstant| $ 24) (QREFELT $ 25)) |s|)
+      ((QUOTE T)
+       (VECTOR
+        (SPADCALL |a| (QVELT |s| 0) (QREFELT $ 26))
+        (SPADCALL |a| (QVELT |s| 1) (QREFELT $ 26))
+        |c|)))))))) 
+
+@
+\subsubsection{EUCDOM-;extendedEuclidean;2SR;7}
+<<EUCDOM-;extendedEuclidean;2SR;7>>=
+(DEFUN |EUCDOM-;extendedEuclidean;2SR;7| (|x| |y| $)
+ (PROG (|s3| |s2| |qr| |s1|)
+  (RETURN
+   (SEQ
+    (LETT |s1|
+     (|EUCDOM-;unitNormalizeIdealElt|
+      (VECTOR (|spadConstant| $ 24) (|spadConstant| $ 16) |x|)
+       $)
+     |EUCDOM-;extendedEuclidean;2SR;7|)
+    (LETT |s2|
+     (|EUCDOM-;unitNormalizeIdealElt|
+      (VECTOR (|spadConstant| $ 16) (|spadConstant| $ 24) |y|)
+      $)
+      |EUCDOM-;extendedEuclidean;2SR;7|)
+    (EXIT
+     (COND
+      ((SPADCALL |y| (QREFELT $ 8)) |s1|)
+      ((SPADCALL |x| (QREFELT $ 8)) |s2|)
+      ((QUOTE T)
+       (SEQ
+        (SEQ
+         G190
+         (COND
+          ((NULL 
+            (COND 
+             ((SPADCALL (QVELT |s2| 2) (QREFELT $ 8)) (QUOTE NIL))
+             ((QUOTE T) (QUOTE T))))
+           (GO G191)))
+         (SEQ
+          (LETT |qr|
+           (SPADCALL (QVELT |s1| 2) (QVELT |s2| 2) (QREFELT $ 13))
+           |EUCDOM-;extendedEuclidean;2SR;7|)
+          (LETT |s3|
+           (VECTOR
+            (SPADCALL (QVELT |s1| 0)
+             (SPADCALL (QCAR |qr|) (QVELT |s2| 0) (QREFELT $ 26))
+             (QREFELT $ 27))
+            (SPADCALL (QVELT |s1| 1)
+             (SPADCALL (QCAR |qr|) (QVELT |s2| 1) (QREFELT $ 26))
+             (QREFELT $ 27))
+            (QCDR |qr|))
+           |EUCDOM-;extendedEuclidean;2SR;7|)
+          (LETT |s1| |s2| |EUCDOM-;extendedEuclidean;2SR;7|)
+          (EXIT
+           (LETT |s2|
+            (|EUCDOM-;unitNormalizeIdealElt| |s3| $)
+            |EUCDOM-;extendedEuclidean;2SR;7|)))
+         NIL
+         (GO G190)
+         G191
+         (EXIT NIL))
+        (COND
+         ((NULL (SPADCALL (QVELT |s1| 0) (QREFELT $ 8)))
+           (COND
+            ((NULL (SPADCALL (QVELT |s1| 0) |y| (QREFELT $ 28)))
+             (SEQ
+              (LETT |qr|
+               (SPADCALL (QVELT |s1| 0) |y| (QREFELT $ 13))
+               |EUCDOM-;extendedEuclidean;2SR;7|)
+              (QSETVELT |s1| 0 (QCDR |qr|))
+              (QSETVELT |s1| 1
+               (SPADCALL (QVELT |s1| 1)
+                (SPADCALL (QCAR |qr|) |x| (QREFELT $ 26)) (QREFELT $ 29)))
+              (EXIT
+               (LETT |s1|
+                (|EUCDOM-;unitNormalizeIdealElt| |s1| $)
+                |EUCDOM-;extendedEuclidean;2SR;7|)))))))
+        (EXIT |s1|))))))))) 
+
+@
+\subsubsection{EUCDOM-;extendedEuclidean;3SU;8}
+<<EUCDOM-;extendedEuclidean;3SU;8>>=
+(DEFUN |EUCDOM-;extendedEuclidean;3SU;8| (|x| |y| |z| $)
+ (PROG (|s| |w| |qr|)
+  (RETURN
+   (SEQ
+    (COND
+     ((SPADCALL |z| (QREFELT $ 8))
+       (CONS 0 (CONS (|spadConstant| $ 16) (|spadConstant| $ 16))))
+     ((QUOTE T)
+       (SEQ
+        (LETT |s|
+         (SPADCALL |x| |y| (QREFELT $ 32))
+         |EUCDOM-;extendedEuclidean;3SU;8|)
+        (LETT |w|
+         (SPADCALL |z| (QVELT |s| 2) (QREFELT $ 33))
+         |EUCDOM-;extendedEuclidean;3SU;8|)
+        (EXIT
+         (COND
+          ((QEQCAR |w| 1) (CONS 1 "failed"))
+          ((SPADCALL |y| (QREFELT $ 8))
+            (CONS 0
+             (CONS (SPADCALL (QVELT |s| 0) (QCDR |w|) (QREFELT $ 26))
+              (SPADCALL (QVELT |s| 1) (QCDR |w|) (QREFELT $ 26)))))
+          ((QUOTE T)
+           (SEQ
+            (LETT |qr|
+             (SPADCALL
+              (SPADCALL (QVELT |s| 0) (QCDR |w|) (QREFELT $ 26))
+              |y|
+              (QREFELT $ 13))
+             |EUCDOM-;extendedEuclidean;3SU;8|)
+            (EXIT
+             (CONS 0
+              (CONS (QCDR |qr|)
+               (SPADCALL
+                (SPADCALL (QVELT |s| 1) (QCDR |w|) (QREFELT $ 26))
+                (SPADCALL (QCAR |qr|) |x| (QREFELT $ 26))
+                (QREFELT $ 29)))))))))))))))) 
+
+@
+\subsubsection{EUCDOM-;principalIdeal;LR;9}
+<<EUCDOM-;principalIdeal;LR;9>>=
+(DEFUN |EUCDOM-;principalIdeal;LR;9| (|l| $)
+ (PROG (|uca| |v| |u| #0=#:G1497 |vv| #1=#:G1498)
+  (RETURN
+   (SEQ
+    (COND
+     ((SPADCALL |l| NIL (QREFELT $ 38))
+       (|error| "empty list passed to principalIdeal"))
+     ((SPADCALL (CDR |l|) NIL (QREFELT $ 38))
+       (SEQ
+        (LETT |uca|
+         (SPADCALL (|SPADfirst| |l|) (QREFELT $ 23))
+         |EUCDOM-;principalIdeal;LR;9|)
+        (EXIT (CONS (LIST (QVELT |uca| 0)) (QVELT |uca| 1)))))
+     ((SPADCALL (CDR (CDR |l|)) NIL (QREFELT $ 38))
+       (SEQ
+        (LETT |u|
+         (SPADCALL (|SPADfirst| |l|)
+          (SPADCALL |l| (QREFELT $ 39)) (QREFELT $ 32))
+         |EUCDOM-;principalIdeal;LR;9|)
+        (EXIT (CONS (LIST (QVELT |u| 0) (QVELT |u| 1)) (QVELT |u| 2)))))
+     ((QUOTE T)
+       (SEQ
+        (LETT |v|
+         (SPADCALL (CDR |l|) (QREFELT $ 42))
+         |EUCDOM-;principalIdeal;LR;9|)
+        (LETT |u|
+         (SPADCALL (|SPADfirst| |l|) (QCDR |v|) (QREFELT $ 32))
+         |EUCDOM-;principalIdeal;LR;9|)
+        (EXIT
+         (CONS 
+          (CONS (QVELT |u| 0)
+           (PROGN
+            (LETT #0# NIL |EUCDOM-;principalIdeal;LR;9|)
+            (SEQ
+             (LETT |vv| NIL |EUCDOM-;principalIdeal;LR;9|)
+             (LETT #1# (QCAR |v|) |EUCDOM-;principalIdeal;LR;9|)
+             G190
+             (COND
+              ((OR (ATOM #1#)
+                   (PROGN
+                    (LETT |vv| (CAR #1#) |EUCDOM-;principalIdeal;LR;9|) NIL))
+               (GO G191)))
+             (SEQ
+              (EXIT
+               (LETT #0#
+                (CONS (SPADCALL (QVELT |u| 1) |vv| (QREFELT $ 26))
+                   #0#)
+                |EUCDOM-;principalIdeal;LR;9|)))
+             (LETT #1# (CDR #1#)
+              |EUCDOM-;principalIdeal;LR;9|)
+             (GO G190)
+             G191
+             (EXIT (NREVERSE0 #0#)))))
+          (QVELT |u| 2)))))))))) 
+
+@
+\subsubsection{EUCDOM-;expressIdealMember;LSU;10}
+<<EUCDOM-;expressIdealMember;LSU;10>>=
+(DEFUN |EUCDOM-;expressIdealMember;LSU;10| (|l| |z| $)
+ (PROG (#0=#:G1513 #1=#:G1514 |pid| |q| #2=#:G1515 |v| #3=#:G1516)
+  (RETURN
+   (SEQ
+    (COND
+     ((SPADCALL |z| (|spadConstant| $ 16) (QREFELT $ 25))
+      (CONS 0
+       (PROGN
+        (LETT #0# NIL |EUCDOM-;expressIdealMember;LSU;10|)
+        (SEQ
+         (LETT |v| NIL |EUCDOM-;expressIdealMember;LSU;10|)
+         (LETT #1# |l| |EUCDOM-;expressIdealMember;LSU;10|)
+         G190
+         (COND
+          ((OR (ATOM #1#)
+               (PROGN
+                (LETT |v| (CAR #1#) |EUCDOM-;expressIdealMember;LSU;10|) NIL))
+           (GO G191)))
+         (SEQ 
+          (EXIT
+           (LETT #0#
+            (CONS (|spadConstant| $ 16) #0#)
+            |EUCDOM-;expressIdealMember;LSU;10|)))
+         (LETT #1# (CDR #1#) |EUCDOM-;expressIdealMember;LSU;10|)
+         (GO G190)
+         G191
+        (EXIT (NREVERSE0 #0#))))))
+     ((QUOTE T)
+      (SEQ
+       (LETT |pid|
+        (SPADCALL |l| (QREFELT $ 42))
+        |EUCDOM-;expressIdealMember;LSU;10|)
+       (LETT |q|
+        (SPADCALL |z| (QCDR |pid|) (QREFELT $ 33))
+        |EUCDOM-;expressIdealMember;LSU;10|)
+       (EXIT
+        (COND
+         ((QEQCAR |q| 1) (CONS 1 "failed"))
+         ((QUOTE T)
+          (CONS 0
+           (PROGN
+            (LETT #2# NIL |EUCDOM-;expressIdealMember;LSU;10|)
+            (SEQ
+             (LETT |v| NIL |EUCDOM-;expressIdealMember;LSU;10|)
+             (LETT #3# (QCAR |pid|) |EUCDOM-;expressIdealMember;LSU;10|)
+             G190
+             (COND
+              ((OR (ATOM #3#)
+                   (PROGN
+                    (LETT |v| (CAR #3#) |EUCDOM-;expressIdealMember;LSU;10|)
+                    NIL))
+               (GO G191)))
+             (SEQ
+              (EXIT
+              (LETT #2#
+               (CONS (SPADCALL (QCDR |q|) |v| (QREFELT $ 26))
+                  #2#) 
+               |EUCDOM-;expressIdealMember;LSU;10|)))
+             (LETT #3# (CDR #3#) |EUCDOM-;expressIdealMember;LSU;10|)
+             (GO G190)
+             G191
+             (EXIT (NREVERSE0 #2#))))))))))))))) 
+
+@
+\subsubsection{EUCDOM-;multiEuclidean;LSU;11}
+<<EUCDOM-;multiEuclidean;LSU;11>>=
+(DEFUN |EUCDOM-;multiEuclidean;LSU;11| (|l| |z| $)
+ (PROG (|n| |l1| |l2| #0=#:G1405 #1=#:G1535 #2=#:G1522 #3=#:G1520 
+        #4=#:G1521 #5=#:G1406 #6=#:G1536 #7=#:G1525 #8=#:G1523 #9=#:G1524 
+        |u| |v1| |v2|)
+  (RETURN
+   (SEQ
+    (LETT |n| (LENGTH |l|) |EUCDOM-;multiEuclidean;LSU;11|)
+    (EXIT
+     (COND
+      ((ZEROP |n|) (|error| "empty list passed to multiEuclidean"))
+      ((EQL |n| 1) (CONS 0 (LIST |z|)))
+      ((QUOTE T)
+       (SEQ
+        (LETT |l1|
+         (SPADCALL |l| (QREFELT $ 46)) |EUCDOM-;multiEuclidean;LSU;11|)
+        (LETT |l2|
+         (SPADCALL |l1| (QUOTIENT2 |n| 2) (QREFELT $ 48))
+         |EUCDOM-;multiEuclidean;LSU;11|)
+        (LETT |u|
+         (SPADCALL
+          (PROGN
+           (LETT #4# NIL |EUCDOM-;multiEuclidean;LSU;11|)
+           (SEQ
+            (LETT #0# NIL |EUCDOM-;multiEuclidean;LSU;11|)
+            (LETT #1# |l1| |EUCDOM-;multiEuclidean;LSU;11|)
+            G190
+            (COND
+             ((OR (ATOM #1#)
+                  (PROGN
+                   (LETT #0# (CAR #1#) |EUCDOM-;multiEuclidean;LSU;11|)
+                   NIL))
+              (GO G191)))
+            (SEQ 
+             (EXIT
+              (PROGN
+               (LETT #2# #0# |EUCDOM-;multiEuclidean;LSU;11|)
+               (COND
+                (#4#
+                 (LETT #3#
+                  (SPADCALL #3# #2# (QREFELT $ 26))
+                  |EUCDOM-;multiEuclidean;LSU;11|))
+                ((QUOTE T)
+                 (PROGN
+                  (LETT #3# #2# |EUCDOM-;multiEuclidean;LSU;11|)
+                  (LETT #4# (QUOTE T) |EUCDOM-;multiEuclidean;LSU;11|)))))))
+            (LETT #1# (CDR #1#) |EUCDOM-;multiEuclidean;LSU;11|)
+            (GO G190)
+            G191
+            (EXIT NIL))
+           (COND (#4# #3#) ((QUOTE T) (|spadConstant| $ 24))))
+          (PROGN
+           (LETT #9# NIL |EUCDOM-;multiEuclidean;LSU;11|)
+           (SEQ
+            (LETT #5# NIL |EUCDOM-;multiEuclidean;LSU;11|)
+            (LETT #6# |l2| |EUCDOM-;multiEuclidean;LSU;11|)
+            G190
+            (COND
+             ((OR (ATOM #6#)
+                  (PROGN
+                   (LETT #5# (CAR #6#) |EUCDOM-;multiEuclidean;LSU;11|)
+                   NIL))
+              (GO G191)))
+            (SEQ
+             (EXIT
+              (PROGN
+               (LETT #7# #5# |EUCDOM-;multiEuclidean;LSU;11|)
+               (COND
+                (#9#
+                 (LETT #8#
+                  (SPADCALL #8# #7# (QREFELT $ 26))
+                  |EUCDOM-;multiEuclidean;LSU;11|))
+                ((QUOTE T)
+                 (PROGN
+                  (LETT #8# #7# |EUCDOM-;multiEuclidean;LSU;11|)
+                  (LETT #9# (QUOTE T) |EUCDOM-;multiEuclidean;LSU;11|)))))))
+            (LETT #6# (CDR #6#) |EUCDOM-;multiEuclidean;LSU;11|)
+            (GO G190)
+            G191
+            (EXIT NIL))
+           (COND (#9# #8#) ((QUOTE T) (|spadConstant| $ 24))))
+          |z| (QREFELT $ 49))
+         |EUCDOM-;multiEuclidean;LSU;11|)
+        (EXIT
+         (COND
+          ((QEQCAR |u| 1) (CONS 1 "failed"))
+          ((QUOTE T)
+           (SEQ
+            (LETT |v1|
+             (SPADCALL |l1| (QCDR (QCDR |u|)) (QREFELT $ 50))
+             |EUCDOM-;multiEuclidean;LSU;11|)
+            (EXIT
+             (COND
+              ((QEQCAR |v1| 1) (CONS 1 "failed"))
+              ((QUOTE T)
+               (SEQ
+                (LETT |v2|
+                 (SPADCALL |l2| (QCAR (QCDR |u|)) (QREFELT $ 50))
+                 |EUCDOM-;multiEuclidean;LSU;11|)
+                (EXIT
+                 (COND
+                  ((QEQCAR |v2| 1) (CONS 1 "failed"))
+                  ((QUOTE T)
+                   (CONS 0
+                    (SPADCALL
+                     (QCDR |v1|)
+                     (QCDR |v2|)
+                     (QREFELT $ 51)))))))))))))))))))))) 
+
+@
+\subsubsection{EuclideanDomain\&}
+<<EuclideanDomainAmp>>=
+(DEFUN |EuclideanDomain&| (|#1|)
+ (PROG (DV$1 |dv$| $ |pv$|)
+  (RETURN
+   (PROGN 
+    (LETT DV$1 (|devaluate| |#1|) . #0=(|EuclideanDomain&|))
+    (LETT |dv$| (LIST (QUOTE |EuclideanDomain&|) DV$1) . #0#)
+    (LETT $ (GETREFV 53) . #0#)
+    (QSETREFV $ 0 |dv$|)
+    (QSETREFV $ 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #0#))
+    (|stuffDomainSlots| $)
+    (QSETREFV $ 6 |#1|)
+    $)))) 
+
+@
+\subsubsection{EUCDOM-;MAKEPROP}
+<<EUCDOM-;MAKEPROP>>=
+(MAKEPROP
+ (QUOTE |EuclideanDomain&|)
+ (QUOTE |infovec|)
+ (LIST
+  (QUOTE #(NIL NIL NIL NIL NIL NIL (|local| |#1|) (|Boolean|) (0 . |zero?|)
+  (|NonNegativeInteger|) (5 . |euclideanSize|) |EUCDOM-;sizeLess?;2SB;1|
+  (|Record| (|:| |quotient| $) (|:| |remainder| $)) (10 . |divide|)
+  |EUCDOM-;quo;3S;2| |EUCDOM-;rem;3S;3| (16 . |Zero|)
+  (|Union| $ (QUOTE "failed")) |EUCDOM-;exquo;2SU;4| (20 . |unitCanonical|)
+  (25 . |rem|) |EUCDOM-;gcd;3S;5|
+  (|Record| (|:| |unit| $) (|:| |canonical| $) (|:| |associate| $))
+  (31 . |unitNormal|) (36 . |One|) (40 . =) (46 . *) (52 . -)
+  (58 . |sizeLess?|) (64 . +) 
+  (|Record| (|:| |coef1| $) (|:| |coef2| $) (|:| |generator| $))
+  |EUCDOM-;extendedEuclidean;2SR;7|
+  (70 . |extendedEuclidean|) (76 . |exquo|) 
+  (|Record| (|:| |coef1| $) (|:| |coef2| $))
+  (|Union| 34 (QUOTE "failed")) |EUCDOM-;extendedEuclidean;3SU;8|
+  (|List| 6) (82 . =) (88 . |second|) 
+  (|Record| (|:| |coef| 41) (|:| |generator| $))
+  (|List| $) (93 . |principalIdeal|) |EUCDOM-;principalIdeal;LR;9| 
+  (|Union| 41 (QUOTE "failed")) |EUCDOM-;expressIdealMember;LSU;10|
+  (98 . |copy|) (|Integer|) (103 . |split!|) (109 . |extendedEuclidean|)
+  (116 . |multiEuclidean|) (122 . |concat|) |EUCDOM-;multiEuclidean;LSU;11|))
+  (QUOTE
+   #(|sizeLess?| 128 |rem| 134 |quo| 140 |principalIdeal| 146 
+     |multiEuclidean| 151 |gcd| 157 |extendedEuclidean| 163 
+     |exquo| 176 |expressIdealMember| 182))
+  (QUOTE NIL)
+  (CONS (|makeByteWordVec2| 1 (QUOTE NIL))
+   (CONS (QUOTE #())
+    (CONS (QUOTE #())
+     (|makeByteWordVec2| 52 (QUOTE (1 6 7 0 8 1 6 9 0 10 2 6 12 0 0 13 0 
+       6 0 16 1 6 0 0 19 2 6 0 0 0 20 1 6 22 0 23 0 6 0 24 2 6 7 0 0 25 2 6 0 
+       0 0 26 2 6 0 0 0 27 2 6 7 0 0 28 2 6 0 0 0 29 2 6 30 0 0 32 2 6 17 0 0 
+       33 2 37 7 0 0 38 1 37 6 0 39 1 6 40 41 42 1 37 0 0 46 2 37 0 0 47 48 3 
+       6 35 0 0 0 49 2 6 44 41 0 50 2 37 0 0 0 51 2 0 7 0 0 11 2 0 0 0 0 15 2 
+       0 0 0 0 14 1 0 40 41 43 2 0 44 41 0 52 2 0 0 0 0 21 3 0 35 0 0 0 36 2 0 
+       30 0 0 31 2 0 17 0 0 18 2 0 44 41 0 45))))))
+  (QUOTE |lookupComplete|))) 
+
+@
+<<EUCDOM-.lsp BOOTSTRAP>>=
+
+<<EUCDOM-;VersionCheck>>
+<<EUCDOM-;sizeLess?;2SB;1>>
+<<EUCDOM-;quo;3S;2>>
+<<EUCDOM-;rem;3S;3>>
+<<EUCDOM-;exquo;2SU;4>>
+<<EUCDOM-;gcd;3S;5>>
+<<EUCDOM-;unitNormalizeIdealElt>>
+<<EUCDOM-;extendedEuclidean;2SR;7>>
+<<EUCDOM-;extendedEuclidean;3SU;8>>
+<<EUCDOM-;principalIdeal;LR;9>>
+<<EUCDOM-;expressIdealMember;LSU;10>>
+<<EUCDOM-;multiEuclidean;LSU;11>>
+<<EuclideanDomainAmp>>
+<<EUCDOM-;MAKEPROP>>
+@
+\section{ENTIRER.lsp BOOTSTRAP}
+{\bf ENTIRER} depends on itself. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf ENTIRER}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf ENTIRER.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<ENTIRER.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |EntireRing;AL| (QUOTE NIL)) 
+
+(DEFUN |EntireRing| NIL 
+  (LET (#:G82841) 
+    (COND 
+      (|EntireRing;AL|) 
+      (T (SETQ |EntireRing;AL| (|EntireRing;|)))))) 
+
+(DEFUN |EntireRing;| NIL 
+  (PROG (#1=#:G82839) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| 
+            (|Ring|) 
+            (|BiModule| (QUOTE |$|) (QUOTE |$|))
+            (|mkCategory| 
+              (QUOTE |package|)
+              NIL
+              (QUOTE ((|noZeroDivisors| T)))
+              (QUOTE NIL)
+              NIL))
+          |EntireRing|)
+        (SETELT #1# 0 (QUOTE (|EntireRing|))))))) 
+
+(MAKEPROP (QUOTE |EntireRing|) (QUOTE NILADIC) T) 
+
+@
+\section{GCDDOM.lsp BOOTSTRAP}
+{\bf GCDDOM} needs
+{\bf COMRING} which needs
+{\bf RING} which needs
+{\bf RNG} which needs
+{\bf ABELGRP} which needs
+{\bf CABMON} which needs
+{\bf ABELMON} which needs
+{\bf ABELSG} which needs
+{\bf SETCAT} which needs
+{\bf SINT} which needs
+{\bf UFD} which needs
+{\bf GCDDOM}. 
+We break this chain with {\bf GCDDOM.lsp} which we
+cache here. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf GCDDOM}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf GCDDOM.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version.
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<GCDDOM.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |GcdDomain;AL| (QUOTE NIL)) 
+
+(DEFUN |GcdDomain| NIL 
+  (LET (#:G83171) 
+    (COND 
+      (|GcdDomain;AL|) 
+      (T (SETQ |GcdDomain;AL| (|GcdDomain;|)))))) 
+
+(DEFUN |GcdDomain;| NIL 
+  (PROG (#1=#:G83169) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| 
+            (|IntegralDomain|)
+            (|mkCategory| 
+              (QUOTE |domain|)
+              (QUOTE (
+                ((|gcd| (|$| |$| |$|)) T)
+                ((|gcd| (|$| (|List| |$|))) T)
+                ((|lcm| (|$| |$| |$|)) T)
+                ((|lcm| (|$| (|List| |$|))) T)
+                ((|gcdPolynomial| 
+                  ((|SparseUnivariatePolynomial| |$|)
+                   (|SparseUnivariatePolynomial| |$|)
+                   (|SparseUnivariatePolynomial| |$|)))
+                  T)))
+              NIL 
+              (QUOTE ((|SparseUnivariatePolynomial| |$|) (|List| |$|)))
+              NIL)) 
+            |GcdDomain|)
+        (SETELT #1# 0 (QUOTE (|GcdDomain|))))))) 
+
+(MAKEPROP (QUOTE |GcdDomain|) (QUOTE NILADIC) T) 
+
+@
+\section{GCDDOM-.lsp BOOTSTRAP}
+{\bf GCDDOM-} depends on {\bf GCDDOM}.
+We break this chain with {\bf GCDDOM-.lsp} which we
+cache here. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf GCDDOM-}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf GCDDOM-.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version.
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<GCDDOM-.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(DEFUN |GCDDOM-;lcm;3S;1| (|x| |y| |$|) 
+  (PROG (LCM) 
+    (RETURN 
+      (SEQ 
+        (COND 
+          ((OR 
+              (SPADCALL |y| (|spadConstant| |$| 7) (QREFELT |$| 9))
+              (SPADCALL |x| (|spadConstant| |$| 7) (QREFELT |$| 9))) 
+            (|spadConstant| |$| 7))
+          ((QUOTE T) 
+            (SEQ 
+              (LETT LCM 
+                (SPADCALL |y| 
+                  (SPADCALL |x| |y| (QREFELT |$| 10))
+                  (QREFELT |$| 12))
+                |GCDDOM-;lcm;3S;1|)
+              (EXIT 
+                (COND 
+                  ((QEQCAR LCM 0) (SPADCALL |x| (QCDR LCM) (QREFELT |$| 13)))
+                  ((QUOTE T) (|error| "bad gcd in lcm computation"))))))))))) 
+
+(DEFUN |GCDDOM-;lcm;LS;2| (|l| |$|) 
+  (SPADCALL 
+    (ELT |$| 15)
+    |l|
+    (|spadConstant| |$| 16)
+    (|spadConstant| |$| 7)
+    (QREFELT |$| 19))) 
+
+(DEFUN |GCDDOM-;gcd;LS;3| (|l| |$|) 
+  (SPADCALL 
+    (ELT |$| 10)
+    |l|
+    (|spadConstant| |$| 7)
+    (|spadConstant| |$| 16)
+    (QREFELT |$| 19))) 
+
+(DEFUN |GCDDOM-;gcdPolynomial;3Sup;4| (|p1| |p2| |$|) 
+  (PROG (|e2| |e1| |c1| |p| |c2| #1=#:G83191) 
+    (RETURN 
+      (SEQ 
+        (COND 
+          ((SPADCALL |p1| (QREFELT |$| 24)) (SPADCALL |p2| (QREFELT |$| 25)))
+          ((SPADCALL |p2| (QREFELT |$| 24)) (SPADCALL |p1| (QREFELT |$| 25)))
+          ((QUOTE T) 
+            (SEQ 
+              (LETT |c1| 
+                (SPADCALL |p1| (QREFELT |$| 26))
+                |GCDDOM-;gcdPolynomial;3Sup;4|)
+              (LETT |c2| 
+                (SPADCALL |p2| (QREFELT |$| 26))
+                |GCDDOM-;gcdPolynomial;3Sup;4|)
+              (LETT |p1| 
+                (PROG2 
+                  (LETT #1# 
+                    (SPADCALL |p1| |c1| (QREFELT |$| 27))
+                    |GCDDOM-;gcdPolynomial;3Sup;4|)
+                  (QCDR #1#)
+                  (|check-union| 
+                    (QEQCAR #1# 0)
+                    (|SparseUnivariatePolynomial| (QREFELT |$| 6))
+                    #1#))
+                |GCDDOM-;gcdPolynomial;3Sup;4|)
+              (LETT |p2| 
+                (PROG2 
+                  (LETT #1# 
+                    (SPADCALL |p2| |c2| (QREFELT |$| 27))
+                    |GCDDOM-;gcdPolynomial;3Sup;4|)
+                  (QCDR #1#)
+                  (|check-union| 
+                    (QEQCAR #1# 0)
+                    (|SparseUnivariatePolynomial| (QREFELT |$| 6))
+                    #1#))
+                |GCDDOM-;gcdPolynomial;3Sup;4|)
+              (SEQ 
+                (LETT |e1| 
+                  (SPADCALL |p1| (QREFELT |$| 29))
+                  |GCDDOM-;gcdPolynomial;3Sup;4|)
+                (EXIT 
+                  (COND 
+                    ((|<| 0 |e1|)
+                      (LETT |p1| 
+                        (PROG2 
+                          (LETT #1# 
+                            (SPADCALL |p1| 
+                              (SPADCALL 
+                               (|spadConstant| |$| 16) |e1| (QREFELT |$| 32))
+                              (QREFELT |$| 33))
+                            |GCDDOM-;gcdPolynomial;3Sup;4|)
+                          (QCDR #1#)
+                          (|check-union| 
+                            (QEQCAR #1# 0)
+                            (|SparseUnivariatePolynomial| (QREFELT |$| 6))
+                            #1#))
+                        |GCDDOM-;gcdPolynomial;3Sup;4|)))))
+              (SEQ 
+                (LETT |e2| 
+                  (SPADCALL |p2| (QREFELT |$| 29))
+                  |GCDDOM-;gcdPolynomial;3Sup;4|)
+                (EXIT 
+                  (COND 
+                    ((|<| 0 |e2|)
+                      (LETT |p2| 
+                        (PROG2 
+                          (LETT #1# 
+                            (SPADCALL |p2| 
+                              (SPADCALL 
+                                (|spadConstant| |$| 16)
+                                |e2|
+                                (QREFELT |$| 32)) 
+                              (QREFELT |$| 33)) 
+                            |GCDDOM-;gcdPolynomial;3Sup;4|)
+                          (QCDR #1#)
+                          (|check-union| 
+                            (QEQCAR #1# 0)
+                            (|SparseUnivariatePolynomial| (QREFELT |$| 6))
+                            #1#))
+                        |GCDDOM-;gcdPolynomial;3Sup;4|)))))
+              (LETT |e1| 
+                (MIN |e1| |e2|)
+                |GCDDOM-;gcdPolynomial;3Sup;4|)
+              (LETT |c1| 
+                (SPADCALL |c1| |c2| (QREFELT |$| 10))
+                |GCDDOM-;gcdPolynomial;3Sup;4|)
+              (LETT |p1| 
+                (COND 
+                  ((OR 
+                       (EQL (SPADCALL |p1| (QREFELT |$| 34)) 0)
+                       (EQL (SPADCALL |p2| (QREFELT |$| 34)) 0))
+                     (SPADCALL |c1| 0 (QREFELT |$| 32))) 
+                  ((QUOTE T) 
+                    (SEQ 
+                      (LETT |p| 
+                        (SPADCALL |p1| |p2| (QREFELT |$| 35))
+                        |GCDDOM-;gcdPolynomial;3Sup;4|)
+                      (EXIT 
+                        (COND 
+                          ((EQL (SPADCALL |p| (QREFELT |$| 34)) 0)
+                            (SPADCALL |c1| 0 (QREFELT |$| 32)))
+                          ((QUOTE T) 
+                            (SEQ 
+                              (LETT |c2| 
+                                (SPADCALL 
+                                  (SPADCALL |p1| (QREFELT |$| 36))
+                                  (SPADCALL |p2| (QREFELT |$| 36))
+                                  (QREFELT |$| 10))
+                                |GCDDOM-;gcdPolynomial;3Sup;4|)
+                              (EXIT 
+                                (SPADCALL 
+                                  (SPADCALL |c1| 
+                                    (SPADCALL 
+                                      (PROG2 
+                                        (LETT #1# 
+                                          (SPADCALL 
+                                            (SPADCALL 
+                                              |c2| 
+                                              |p| 
+                                              (QREFELT |$| 37)) 
+                                            (SPADCALL |p| (QREFELT |$| 36))
+                                            (QREFELT |$| 27))
+                                          |GCDDOM-;gcdPolynomial;3Sup;4|) 
+                                       (QCDR #1#)
+                                       (|check-union| 
+                                         (QEQCAR #1# 0)
+                                         (|SparseUnivariatePolynomial| 
+                                           (QREFELT |$| 6))
+                                         #1#)) 
+                                      (QREFELT |$| 38))
+                                    (QREFELT |$| 37))
+                                  (QREFELT |$| 25))))))))))
+                |GCDDOM-;gcdPolynomial;3Sup;4|)
+              (EXIT
+               (COND
+                ((ZEROP |e1|) |p1|)
+                ((QUOTE T)
+                  (SPADCALL
+                   (SPADCALL (|spadConstant| |$| 16) |e1| (QREFELT |$| 32))
+                   |p1| (QREFELT |$| 39)))))))))))) 
+
+(DEFUN |GcdDomain&| (|#1|) 
+  (PROG (|DV$1| |dv$| |$| |pv$|) 
+    (RETURN 
+      (PROGN 
+        (LETT |DV$1| (|devaluate| |#1|) . #1=(|GcdDomain&|))
+        (LETT |dv$| (LIST (QUOTE |GcdDomain&|) |DV$1|) . #1#)
+        (LETT |$| (GETREFV 42) . #1#)
+        (QSETREFV |$| 0 |dv$|)
+        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
+        (|stuffDomainSlots| |$|)
+        (QSETREFV |$| 6 |#1|)
+        |$|)))) 
+
+(MAKEPROP 
+  (QUOTE |GcdDomain&|)
+  (QUOTE |infovec|)
+  (LIST 
+    (QUOTE 
+      #(NIL NIL NIL NIL NIL NIL 
+        (|local| |#1|)
+        (0 . |Zero|)
+        (|Boolean|)
+        (4 . |=|)
+        (10 . |gcd|)
+        (|Union| |$| (QUOTE "failed"))
+        (16 . |exquo|)
+        (22 . |*|)
+        |GCDDOM-;lcm;3S;1| 
+        (28 . |lcm|)
+        (34 . |One|)
+        (|Mapping| 6 6 6)
+        (|List| 6)
+        (38 . |reduce|)
+        (|List| |$|)
+        |GCDDOM-;lcm;LS;2| 
+        |GCDDOM-;gcd;LS;3| 
+        (|SparseUnivariatePolynomial| 6)
+        (46 . |zero?|)
+        (51 . |unitCanonical|)
+        (56 . |content|)
+        (61 . |exquo|)
+        (|NonNegativeInteger|)
+        (67 . |minimumDegree|)
+        (72 . |Zero|)
+        (76 . |One|)
+        (80 . |monomial|)
+        (86 . |exquo|)
+        (92 . |degree|)
+        (97 . |subResultantGcd|)
+        (103 . |leadingCoefficient|)
+        (108 . |*|)
+        (114 . |primitivePart|)
+        (119 . |*|)
+        (|SparseUnivariatePolynomial| |$|)
+        |GCDDOM-;gcdPolynomial;3Sup;4|)) 
+    (QUOTE #(|lcm| 125 |gcdPolynomial| 136 |gcd| 142))
+    (QUOTE NIL)
+    (CONS 
+      (|makeByteWordVec2| 1 (QUOTE NIL))
+      (CONS 
+        (QUOTE #())
+        (CONS 
+          (QUOTE #()) 
+            (|makeByteWordVec2| 41 
+             (QUOTE (0 6 0 7 2 6 8 0 0 9 2 6 0 0 0 10 2 6 11 0 0 12 2 6 0 0 0
+                     13 2 6 0 0 0 15 0 6 0 16 4 18 6 17 0 6 6 19 1 23 8 0 24
+                     1 23 0 0 25 1 23 6 0 26 2 23 11 0 6 27 1 23 28 0 29 0 23
+                     0 30 0 23 0 31 2 23 0 6 28 32 2 23 11 0 0 33 1 23 28 0
+                     34 2 23 0 0 0 35 1 23 6 0 36 2 23 0 6 0 37 1 23 0 0 38 2
+                     23 0 0 0 39 1 0 0 20 21 2 0 0 0 0 14 2 0 40 40 40 41 1 0
+                     0 20 22)))))) 
+   (QUOTE |lookupComplete|))) 
+
+@
 \section{HOAGG.lsp BOOTSTRAP}
 {\bf HOAGG} depends on a chain of files. We need to break this cycle to build
 the algebra. So we keep a cached copy of the translated {\bf HOAGG}
@@ -13733,6 +19471,170 @@ Note that this code is not included in the generated catdef.spad file.
         0 17 0 0 30 1 0 15 0 16))))))
   (QUOTE |lookupComplete|))) 
 @
+\section{INTDOM.lsp BOOTSTRAP}
+{\bf INTDOM} depends on itself. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf INTDOM}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf INTDOM.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<INTDOM.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |IntegralDomain;AL| (QUOTE NIL)) 
+
+(DEFUN |IntegralDomain| NIL 
+  (LET (#:G83060) 
+    (COND 
+      (|IntegralDomain;AL|) 
+      (T (SETQ |IntegralDomain;AL| (|IntegralDomain;|)))))) 
+
+(DEFUN |IntegralDomain;| NIL 
+  (PROG (#1=#:G83058) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| 
+            (|CommutativeRing|)
+            (|Algebra| (QUOTE |$|))
+            (|EntireRing|)
+            (|mkCategory| 
+              (QUOTE |domain|) 
+              (QUOTE (
+                ((|exquo| ((|Union| |$| "failed") |$| |$|)) T)
+                ((|unitNormal| 
+                  ((|Record| 
+                     (|:| |unit| |$|) 
+                     (|:| |canonical| |$|)
+                     (|:| |associate| |$|)) |$|)) T)
+                ((|unitCanonical| (|$| |$|)) T)
+                ((|associates?| ((|Boolean|) |$| |$|)) T)
+                ((|unit?| ((|Boolean|) |$|)) T)))
+               NIL
+               (QUOTE ((|Boolean|)))
+               NIL))
+           |IntegralDomain|)
+        (SETELT #1# 0 (QUOTE (|IntegralDomain|))))))) 
+
+(MAKEPROP (QUOTE |IntegralDomain|) (QUOTE NILADIC) T) 
+
+@
+\section{INTDOM-.lsp BOOTSTRAP}
+{\bf INTDOM-} depends on {\bf INTDOM}. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf INTDOM-}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf INTDOM-.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<INTDOM-.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(DEFUN |INTDOM-;unitNormal;SR;1| (|x| |$|) 
+  (VECTOR (|spadConstant| |$| 7) |x| (|spadConstant| |$| 7))) 
+
+(DEFUN |INTDOM-;unitCanonical;2S;2| (|x| |$|) 
+  (QVELT (SPADCALL |x| (QREFELT |$| 10)) 1)) 
+
+(DEFUN |INTDOM-;recip;SU;3| (|x| |$|) 
+  (COND 
+    ((SPADCALL |x| (QREFELT |$| 13)) (CONS 1 "failed"))
+    ((QUOTE T) (SPADCALL (|spadConstant| |$| 7) |x| (QREFELT |$| 15))))) 
+
+(DEFUN |INTDOM-;unit?;SB;4| (|x| |$|) 
+  (COND 
+    ((QEQCAR (SPADCALL |x| (QREFELT |$| 17)) 1) (QUOTE NIL))
+    ((QUOTE T) (QUOTE T)))) 
+
+(DEFUN |INTDOM-;associates?;2SB;5| (|x| |y| |$|) 
+  (SPADCALL 
+    (QVELT (SPADCALL |x| (QREFELT |$| 10)) 1)
+    (QVELT (SPADCALL |y| (QREFELT |$| 10)) 1)
+    (QREFELT |$| 19))) 
+
+(DEFUN |INTDOM-;associates?;2SB;6| (|x| |y| |$|) 
+  (COND 
+    ((SPADCALL |x| (QREFELT |$| 13)) (SPADCALL |y| (QREFELT |$| 13)))
+    ((OR 
+        (SPADCALL |y| (QREFELT |$| 13))
+        (OR 
+          (QEQCAR (SPADCALL |x| |y| (QREFELT |$| 15)) 1)
+          (QEQCAR (SPADCALL |y| |x| (QREFELT |$| 15)) 1)))
+      (QUOTE NIL))
+    ((QUOTE T) (QUOTE T)))) 
+
+(DEFUN |IntegralDomain&| (|#1|) 
+  (PROG (|DV$1| |dv$| |$| |pv$|) 
+    (RETURN 
+      (PROGN 
+        (LETT |DV$1| (|devaluate| |#1|) . #1=(|IntegralDomain&|))
+        (LETT |dv$| (LIST (QUOTE |IntegralDomain&|) |DV$1|) . #1#)
+        (LETT |$| (GETREFV 21) . #1#)
+        (QSETREFV |$| 0 |dv$|)
+        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
+        (|stuffDomainSlots| |$|)
+        (QSETREFV |$| 6 |#1|)
+        (COND 
+          ((|HasCategory| |#1| (QUOTE (|Field|))))
+          ((QUOTE T) 
+            (QSETREFV |$| 9 
+              (CONS (|dispatchFunction| |INTDOM-;unitNormal;SR;1|) |$|))))
+        (COND 
+          ((|HasAttribute| |#1| (QUOTE |canonicalUnitNormal|))
+            (QSETREFV |$| 20 
+              (CONS (|dispatchFunction| |INTDOM-;associates?;2SB;5|) |$|)))
+          ((QUOTE T) 
+            (QSETREFV |$| 20 
+              (CONS (|dispatchFunction| |INTDOM-;associates?;2SB;6|) |$|))))
+        |$|)))) 
+
+(MAKEPROP 
+  (QUOTE |IntegralDomain&|)
+  (QUOTE |infovec|)
+  (LIST 
+    (QUOTE 
+      #(NIL NIL NIL NIL NIL NIL 
+        (|local| |#1|)
+        (0 . |One|)
+        (|Record| 
+          (|:| |unit| |$|)
+          (|:| |canonical| |$|)
+          (|:| |associate| |$|))
+        (4 . |unitNormal|)
+        (9 . |unitNormal|)
+        |INTDOM-;unitCanonical;2S;2| 
+        (|Boolean|)
+        (14 . |zero?|)
+        (|Union| |$| (QUOTE "failed"))
+        (19 . |exquo|)
+        |INTDOM-;recip;SU;3|
+        (25 . |recip|)
+        |INTDOM-;unit?;SB;4|
+        (30 . |=|)
+        (36 . |associates?|))) 
+    (QUOTE 
+      #(|unitNormal| 42 |unitCanonical| 47 |unit?| 52 |recip| 57 
+        |associates?| 62)) 
+    (QUOTE NIL)
+    (CONS 
+      (|makeByteWordVec2| 1 (QUOTE NIL))
+      (CONS 
+        (QUOTE #())
+        (CONS 
+          (QUOTE #())
+          (|makeByteWordVec2| 20 
+            (QUOTE 
+              (0 6 0 7 1 0 8 0 9 1 6 8 0 10 1 6 12 0 13 2 6 14 0 0 15 1 6 14
+               0 17 2 6 12 0 0 19 2 0 12 0 0 20 1 0 8 0 9 1 0 0 0 11 1 0 12 0
+               18 1 0 14 0 16 2 0 12 0 0 20)))))) 
+   (QUOTE |lookupComplete|))) 
+
+@
 \section{LNAGG.lsp BOOTSTRAP}
 {\bf LNAGG} depends on a chain of files. We need to break this cycle to build
 the algebra. So we keep a cached copy of the translated {\bf LNAGG}
@@ -14943,6 +20845,38 @@ Note that this code is not included in the generated catdef.spad file.
   (QUOTE |lookupComplete|))) 
 
 @
+\section{OINTDOM.lsp BOOTSTRAP}
+{\bf OINTDOM} depends on itself. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf OINTDOM}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf OINTDOM.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<OINTDOM.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |OrderedIntegralDomain;AL| (QUOTE NIL)) 
+
+(DEFUN |OrderedIntegralDomain| NIL 
+  (LET (#:G84531) 
+    (COND 
+      (|OrderedIntegralDomain;AL|)
+      (T (SETQ |OrderedIntegralDomain;AL| (|OrderedIntegralDomain;|)))))) 
+
+(DEFUN |OrderedIntegralDomain;| NIL 
+  (PROG (#1=#:G84529) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| (|IntegralDomain|) (|OrderedRing|)) |OrderedIntegralDomain|)
+        (SETELT #1# 0 (QUOTE (|OrderedIntegralDomain|))))))) 
+
+(MAKEPROP (QUOTE |OrderedIntegralDomain|) (QUOTE NILADIC) T) 
+
+@
 \section{ORDRING.lsp BOOTSTRAP}
 {\bf ORDRING} depends on {\bf INT}. We need to break this cycle to build
 the algebra. So we keep a cached copy of the translated {\bf ORDRING}
@@ -15623,7 +21557,7 @@ Note that this code is not included in the generated catdef.spad file.
       (CONS (|devaluate| #1#) (SETQ #2# (|StreamAggregate;| #1#)))
       |StreamAggregate;AL|))
     #2#)))) 
-
+v
 (DEFUN |StreamAggregate;| (|t#1|)
  (PROG (#1=#:G87034)
   (RETURN
@@ -15970,6 +21904,184 @@ Note that this code is not included in the generated catdef.spad file.
        0 19 22 2 0 0 0 23 30 2 0 0 0 0 46 1 0 0 33 35 2 0 0 0 0 32))))))
   (QUOTE |lookupComplete|))) 
 @
+\section{UFD.lsp BOOTSTRAP} 
+{\bf UFD} needs
+{\bf GCDDOM} which needs
+{\bf COMRING} which needs
+{\bf RING} which needs
+{\bf RNG} which needs
+{\bf ABELGRP} which needs
+{\bf CABMON} which needs
+{\bf ABELMON} which needs
+{\bf ABELSG} which needs
+{\bf SETCAT} which needs
+{\bf SINT} which needs
+{\bf UFD}.
+We need to break this cycle to build the algebra. So we keep a
+cached copy of the translated {\bf UFD} category which we can write
+into the {\bf MID} directory. We compile the lisp code and copy the
+{\bf UFD.o} file to the {\bf OUT} directory.  This is eventually
+forcibly replaced by a recompiled version.
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<UFD.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |UniqueFactorizationDomain;AL| (QUOTE NIL)) 
+
+(DEFUN |UniqueFactorizationDomain| NIL 
+  (LET (#:G83334) 
+    (COND 
+      (|UniqueFactorizationDomain;AL|) 
+      (T 
+        (SETQ 
+          |UniqueFactorizationDomain;AL| 
+          (|UniqueFactorizationDomain;|)))))) 
+
+(DEFUN |UniqueFactorizationDomain;| NIL 
+  (PROG (#1=#:G83332) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| 
+            (|GcdDomain|)
+            (|mkCategory| 
+              (QUOTE |domain|)
+              (QUOTE (
+                ((|prime?| ((|Boolean|) |$|)) T)
+                ((|squareFree| ((|Factored| |$|) |$|)) T)
+                ((|squareFreePart| (|$| |$|)) T)
+                ((|factor| ((|Factored| |$|) |$|)) T)))
+              NIL
+              (QUOTE ((|Factored| |$|) (|Boolean|)))
+              NIL))
+          |UniqueFactorizationDomain|)
+        (SETELT #1# 0 (QUOTE (|UniqueFactorizationDomain|))))))) 
+
+(MAKEPROP (QUOTE |UniqueFactorizationDomain|) (QUOTE NILADIC) T) 
+
+@
+\section{UFD-.lsp BOOTSTRAP} 
+{\bf UFD-} needs {\bf UFD}.
+We need to break this cycle to build the algebra. So we keep a
+cached copy of the translated {\bf UFD-} category which we can write
+into the {\bf MID} directory. We compile the lisp code and copy the
+{\bf UFD-.o} file to the {\bf OUT} directory.  This is eventually
+forcibly replaced by a recompiled version.
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<UFD-.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(DEFUN |UFD-;squareFreePart;2S;1| (|x| |$|) 
+  (PROG (|s| |f| #1=#:G83349 #2=#:G83347 #3=#:G83345 #4=#:G83346) 
+    (RETURN 
+      (SEQ 
+        (SPADCALL 
+          (SPADCALL 
+            (LETT |s| 
+              (SPADCALL |x| (QREFELT |$| 8))
+              |UFD-;squareFreePart;2S;1|)
+            (QREFELT |$| 10)) 
+          (PROGN 
+            (LETT #4# NIL |UFD-;squareFreePart;2S;1|)
+            (SEQ 
+              (LETT |f| NIL |UFD-;squareFreePart;2S;1|)
+              (LETT #1# 
+                (SPADCALL |s| (QREFELT |$| 13))
+                |UFD-;squareFreePart;2S;1|)
+              G190
+              (COND 
+                ((OR 
+                   (ATOM #1#)
+                   (PROGN 
+                     (LETT |f| (CAR #1#) |UFD-;squareFreePart;2S;1|)
+                     NIL))
+                 (GO G191)))
+              (SEQ 
+                (EXIT 
+                  (PROGN 
+                    (LETT #2# (QCAR |f|) |UFD-;squareFreePart;2S;1|)
+                    (COND 
+                      (#4# 
+                        (LETT #3# 
+                          (SPADCALL #3# #2# (QREFELT |$| 14))
+                          |UFD-;squareFreePart;2S;1|))
+                      ((QUOTE T) 
+                        (PROGN 
+                          (LETT #3# #2# |UFD-;squareFreePart;2S;1|)
+                          (LETT #4# (QUOTE T) 
+                            |UFD-;squareFreePart;2S;1|)))))))
+              (LETT #1# (CDR #1#) |UFD-;squareFreePart;2S;1|)
+              (GO G190)
+              G191
+              (EXIT NIL))
+            (COND 
+              (#4# #3#) 
+              ((QUOTE T) (|spadConstant| |$| 15))))
+       (QREFELT |$| 14)))))) 
+
+(DEFUN |UFD-;prime?;SB;2| (|x| |$|) 
+  (EQL 
+    (LENGTH (SPADCALL (SPADCALL |x| (QREFELT |$| 17)) (QREFELT |$| 21))) 1)) 
+
+(DEFUN |UniqueFactorizationDomain&| (|#1|) 
+  (PROG (|DV$1| |dv$| |$| |pv$|) 
+    (RETURN 
+      (PROGN 
+        (LETT |DV$1| (|devaluate| |#1|) . #1=(|UniqueFactorizationDomain&|))
+        (LETT |dv$| (LIST (QUOTE |UniqueFactorizationDomain&|) |DV$1|) . #1#)
+        (LETT |$| (GETREFV 24) . #1#)
+        (QSETREFV |$| 0 |dv$|)
+        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
+        (|stuffDomainSlots| |$|)
+        (QSETREFV |$| 6 |#1|)
+        |$|)))) 
+
+(MAKEPROP 
+  (QUOTE |UniqueFactorizationDomain&|)
+  (QUOTE |infovec|)
+  (LIST 
+    (QUOTE 
+      #(NIL NIL NIL NIL NIL NIL 
+        (|local| |#1|)
+        (|Factored| |$|)
+        (0 . |squareFree|)
+        (|Factored| 6)
+        (5 . |unit|)
+        (|Record| (|:| |factor| 6) (|:| |exponent| (|Integer|)))
+        (|List| 11)
+        (10 . |factors|)
+        (15 . |*|)
+        (21 . |One|)
+        |UFD-;squareFreePart;2S;1| 
+        (25 . |factor|)
+        (|Union| 
+          (QUOTE "nil") (QUOTE "sqfr") (QUOTE "irred") (QUOTE "prime"))
+        (|Record| (|:| |flg| 18) (|:| |fctr| 6) (|:| |xpnt| (|Integer|)))
+        (|List| 19)
+        (30 . |factorList|)
+        (|Boolean|)
+        |UFD-;prime?;SB;2|)) 
+     (QUOTE #(|squareFreePart| 35 |prime?| 40))
+     (QUOTE NIL)
+     (CONS 
+       (|makeByteWordVec2| 1 (QUOTE NIL))
+       (CONS 
+         (QUOTE #())
+         (CONS 
+           (QUOTE #())
+           (|makeByteWordVec2| 23 
+             (QUOTE 
+               (1 6 7 0 8 1 9 6 0 10 1 9 12 0 13 2 6 0 0 0 14 0 6 0 15 1 6 7
+                0 17 1 9 20 0 21 1 0 0 0 16 1 0 22 0 23)))))) 
+      (QUOTE |lookupComplete|))) 
+
+@
 \section{URAGG.lsp BOOTSTRAP}
 {\bf URAGG} depends on a chain of files. We need to break this cycle to build
 the algebra. So we keep a cached copy of the translated {\bf URAGG}
@@ -16749,6 +22861,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<category ABELSG AbelianSemiGroup>>
 <<category AGG Aggregate>>
 <<category ALAGG AssociationListAggregate>>
+<<category ALGEBRA Algebra>>
 <<category A1AGG OneDimensionalArrayAggregate>>
 <<category BASTYPE BasicType>>
 <<category BGAGG BagAggregate>>
@@ -16756,26 +22869,43 @@ Note that this code is not included in the generated catdef.spad file.
 <<category BRAGG BinaryRecursiveAggregate>>
 <<category BTAGG BitAggregate>>
 <<category CABMON CancellationAbelianMonoid>>
+<<category CHARNZ CharacteristicNonZero>>
+<<category CHARZ CharacteristicZero>>
 <<category CLAGG Collection>>
+<<category COMRING CommutativeRing>>
 <<category DIAGG Dictionary>>
+<<category DIFEXT DifferentialExtension>>
+<<category DIFRING DifferentialRing>>
 <<category DIOPS DictionaryOperations>>
+<<category DIVRING DivisionRing>>
 <<category DLAGG DoublyLinkedAggregate>>
 <<category DQAGG DequeueAggregate>>
 <<category ELAGG ExtensibleLinearAggregate>>
 <<category ELTAB Eltable>>
 <<category ELTAGG EltableAggregate>>
+<<category ENTIRER EntireRing>>
+<<category EUCDOM EuclideanDomain>>
+<<category EVALAB Evalable>>
+<<category FIELD Field>>
 <<category FINITE Finite>>
 <<category FLAGG FiniteLinearAggregate>>
+<<category FLINEXP FullyLinearlyExplicitRingOver>>
 <<category FSAGG FiniteSetAggregate>>
+<<category GCDDOM GcdDomain>>
 <<category GROUP Group>>
 <<category HOAGG HomogeneousAggregate>>
+<<category IEVALAB InnerEvalable>>
+<<category INTDOM IntegralDomain>>
 <<category IXAGG IndexedAggregate>>
 <<category KDAGG KeyedDictionary>>
 <<category KOERCE CoercibleTo>>
 <<category KONVERT ConvertibleTo>>
+<<category LINEXP LinearlyExplicitRingOver>>
 <<category LMODULE LeftModule>>
 <<category LNAGG LinearAggregate>>
+<<category LOGIC Logic>>
 <<category LSAGG ListAggregate>>
+<<category MODULE Module>>
 <<category MONOID Monoid>>
 <<category MDAGG MultiDictionary>>
 <<category MSETAGG MultisetAggregate>>
@@ -16784,11 +22914,15 @@ Note that this code is not included in the generated catdef.spad file.
 <<category OAMONS OrderedAbelianMonoidSup>>
 <<category OASGP OrderedAbelianSemiGroup>>
 <<category OCAMON OrderedCancellationAbelianMonoid>>
+<<category OINTDOM OrderedIntegralDomain>>
 <<category OMSAGG OrderedMultisetAggregate>>
 <<category ORDFIN OrderedFinite>>
 <<category ORDMON OrderedMonoid>>
 <<category ORDRING OrderedRing>>
 <<category ORDSET OrderedSet>>
+<<category PDRING PartialDifferentialRing>>
+<<category PFECAT PolynomialFactorizationExplicit>>
+<<category PID PrincipalIdealDomain>>
 <<category PRQAGG PriorityQueueAggregate>>
 <<category QUAGG QueueAggregate>>
 <<category RCAGG RecursiveAggregate>>
@@ -16805,7 +22939,9 @@ Note that this code is not included in the generated catdef.spad file.
 <<category STEP StepThrough>>
 <<category TYPE Type>>
 <<category TBAGG TableAggregate>>
+<<category UFD UniqueFactorizationDomain>>
 <<category URAGG UnaryRecursiveAggregate>>
+<<category VSPACE VectorSpace>>
 @
 <<dotabb>>=
 digraph dotabb {
@@ -16821,6 +22957,7 @@ digraph dotabb {
 <<ABELSG.dotabb>>
 <<AGG.dotabb>>
 <<ALAGG.dotabb>>
+<<ALGEBRA.dotabb>>
 <<A1AGG.dotabb>>
 <<BASTYPE.dotabb>>
 <<BGAGG.dotabb>>
@@ -16828,25 +22965,41 @@ digraph dotabb {
 <<BRAGG.dotabb>>
 <<BTAGG.dotabb>>
 <<CABMON.dotabb>>
+<<CHARNZ.dotabb>>
+<<CHARZ.dotabb>>
 <<CLAGG.dotabb>>
+<<COMRING.dotabb>>
 <<DIAGG.dotabb>>
+<<DIFEXT.dotabb>>
 <<DIOPS.dotabb>>
+<<DIVRING.dotabb>>
 <<DLAGG.dotabb>>
 <<DQAGG.dotabb>>
 <<ELAGG.dotabb>>
 <<ELTAB.dotabb>>
 <<ELTAGG.dotabb>>
+<<ENTIRER.dotabb>>
+<<EUCDOM.dotabb>>
+<<EVALAB.dotabb>>
+<<FIELD.dotabb>>
 <<FINITE.dotabb>>
 <<FLAGG.dotabb>>
+<<FLINEXP.dotabb>>
 <<FSAGG.dotabb>>
+<<GCDDOM.dotabb>>
 <<HOAGG.dotabb>>
+<<IEVALAB.dotabb>>
+<<INTDOM.dotabb>>
 <<IXAGG.dotabb>>
 <<KDAGG.dotabb>>
 <<KOERCE.dotabb>>
 <<KONVERT.dotabb>>
+<<LINEXP.dotabb>>
 <<LMODULE.dotabb>>
 <<LNAGG.dotabb>>
+<<LOGIC.dotabb>>
 <<LSAGG.dotabb>>
+<<MODULE.dotabb>>
 <<MDAGG.dotabb>>
 <<MONOID.dotabb>>
 <<MSETAGG.dotabb>>
@@ -16855,11 +23008,15 @@ digraph dotabb {
 <<OAMONS.dotabb>>
 <<OASGP.dotabb>>
 <<OCAMON.dotabb>>
+<<OINTDOM.dotabb>>
 <<OMSAGG.dotabb>>
 <<ORDFIN.dotabb>>
 <<ORDMON.dotabb>>
 <<ORDRING.dotabb>>
 <<ORDSET.dotabb>>
+<<PDRING.dotabb>>
+<<PFECAT.dotabb>>
+<<PID.dotabb>>
 <<PRQAGG.dotabb>>
 <<QUAGG.dotabb>>
 <<RCAGG.dotabb>>
@@ -16876,7 +23033,9 @@ digraph dotabb {
 <<STEP.dotabb>>
 <<TYPE.dotabb>>
 <<TBAGG.dotabb>>
+<<UFD.dotabb>>
 <<URAGG.dotabb>>
+<<VSPACE.dotabb>>
 }
 @
 <<dotfull>>=
@@ -16895,6 +23054,7 @@ digraph dotfull {
 <<ABELSG.dotfull>>
 <<AGG.dotfull>>
 <<ALAGG.dotfull>>
+<<ALGEBRA.dotfull>>
 <<A1AGG.dotfull>>
 <<BASTYPE.dotfull>>
 <<BGAGG.dotfull>>
@@ -16902,25 +23062,41 @@ digraph dotfull {
 <<BRAGG.dotfull>>
 <<BTAGG.dotfull>>
 <<CABMON.dotfull>>
+<<CHARNZ.dotfull>>
+<<CHARZ.dotfull>>
 <<CLAGG.dotfull>>
+<<COMRING.dotfull>>
 <<DIAGG.dotfull>>
+<<DIFEXT.dotfull>>
 <<DIOPS.dotfull>>
+<<DIVRING.dotfull>>
 <<DLAGG.dotfull>>
 <<DQAGG.dotfull>>
 <<ELAGG.dotfull>>
 <<ELTAB.dotfull>>
 <<ELTAGG.dotfull>>
+<<ENTIRER.dotfull>>
+<<EUCDOM.dotfull>>
+<<EVALAB.dotfull>>
+<<FIELD.dotfull>>
 <<FINITE.dotfull>>
 <<FLAGG.dotfull>>
+<<FLINEXP.dotfull>>
 <<FSAGG.dotfull>>
+<<GCDDOM.dotfull>>
 <<HOAGG.dotfull>>
+<<IEVALAB.dotfull>>
+<<INTDOM.dotfull>>
 <<IXAGG.dotfull>>
 <<KDAGG.dotfull>>
 <<KOERCE.dotfull>>
 <<KONVERT.dotfull>>
+<<LINEXP.dotfull>>
 <<LMODULE.dotfull>>
 <<LNAGG.dotfull>>
+<<LOGIC.dotfull>>
 <<LSAGG.dotfull>>
+<<MODULE.dotfull>>
 <<MDAGG.dotfull>>
 <<MONOID.dotfull>>
 <<MSETAGG.dotfull>>
@@ -16929,11 +23105,15 @@ digraph dotfull {
 <<OAMONS.dotabb>>
 <<OASGP.dotfull>>
 <<OCAMON.dotfull>>
+<<OINTDOM.dotfull>>
 <<OMSAGG.dotfull>>
 <<ORDFIN.dotfull>>
 <<ORDMON.dotfull>>
 <<ORDRING.dotfull>>
 <<ORDSET.dotfull>>
+<<PDRING.dotfull>>
+<<PFECAT.dotfull>>
+<<PID.dotfull>>
 <<PRQAGG.dotfull>>
 <<QUAGG.dotfull>>
 <<RCAGG.dotfull>>
@@ -16950,7 +23130,9 @@ digraph dotfull {
 <<STEP.dotfull>>
 <<TYPE.dotfull>>
 <<TBAGG.dotfull>>
+<<UFD.dotfull>>
 <<URAGG.dotfull>>
+<<VSPACE.dotfull>>
 }
 @
 \eject
diff --git a/books/ps/v102EntireRing.ps b/books/ps/v102EntireRing.ps
new file mode 100644
index 0000000..d789dcb
--- /dev/null
+++ b/books/ps/v102EntireRing.ps
@@ -0,0 +1,876 @@
+%!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 536 368
+%%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 536 368
+%%PageOrientation: Portrait
+gsave
+36 36 500 332 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 330 lineto
+498 330 lineto
+498 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+498 330 lineto
+498 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% EntireRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 269 324 moveto
+183 324 lineto
+183 288 lineto
+269 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 269 324 moveto
+183 324 lineto
+183 288 lineto
+269 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+190 301 moveto
+(EntireRing\(\))
+[8.64 6.96 3.84 3.84 4.8 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 190 252 moveto
+136 252 lineto
+136 216 lineto
+190 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 190 252 moveto
+136 252 lineto
+136 216 lineto
+190 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+144 229 moveto
+(Ring\(\))
+[9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% EntireRing()->Ring()
+newpath 210 288 moveto
+202 279 193 269 186 260 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 188 257 moveto
+179 252 lineto
+183 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 188 257 moveto
+179 252 lineto
+183 262 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:Ring,b:Ring)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 370 252 moveto
+208 252 lineto
+208 216 lineto
+370 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 370 252 moveto
+208 252 lineto
+208 216 lineto
+370 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+216 229 moveto
+(BiModule\(a:Ring,b:Ring\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% EntireRing()->BiModule(a:Ring,b:Ring)
+newpath 242 288 moveto
+250 279 259 269 266 260 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 269 262 moveto
+273 252 lineto
+264 257 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 269 262 moveto
+273 252 lineto
+264 257 lineto
+closepath
+stroke
+end grestore
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 190 180 moveto
+136 180 lineto
+136 144 lineto
+190 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 190 180 moveto
+136 180 lineto
+136 144 lineto
+190 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+146 157 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Rng()
+newpath 163 216 moveto
+163 208 163 199 163 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 167 190 moveto
+163 180 lineto
+160 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 167 190 moveto
+163 180 lineto
+160 190 lineto
+closepath
+stroke
+end grestore
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 118 180 moveto
+48 180 lineto
+48 144 lineto
+118 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 118 180 moveto
+48 180 lineto
+48 144 lineto
+118 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+55 157 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Monoid()
+newpath 143 216 moveto
+133 207 121 196 110 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 113 185 moveto
+103 180 lineto
+108 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 113 185 moveto
+103 180 lineto
+108 190 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 338 180 moveto
+208 180 lineto
+208 144 lineto
+338 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 338 180 moveto
+208 180 lineto
+208 144 lineto
+338 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+216 157 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->LeftModule(a:Ring)
+newpath 190 216 moveto
+204 207 222 196 237 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 239 189 moveto
+245 180 lineto
+235 183 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 239 189 moveto
+245 180 lineto
+235 183 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:Ring,b:Ring)->LeftModule(a:Ring)
+newpath 285 216 moveto
+283 208 281 199 279 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 282 189 moveto
+277 180 lineto
+276 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 282 189 moveto
+277 180 lineto
+276 190 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 492 180 moveto
+356 180 lineto
+356 144 lineto
+492 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 492 180 moveto
+356 180 lineto
+356 144 lineto
+492 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+363 157 moveto
+(RightModule\(a:Ring\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:Ring,b:Ring)->RightModule(a:Ring)
+newpath 323 216 moveto
+341 207 363 195 381 185 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 383 188 moveto
+390 180 lineto
+380 182 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 383 188 moveto
+390 180 lineto
+380 182 lineto
+closepath
+stroke
+end grestore
+% ABELGRP...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 318 36 moveto
+228 36 lineto
+228 0 lineto
+318 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 318 36 moveto
+228 36 lineto
+228 0 lineto
+318 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+235 13 moveto
+(ABELGRP...)
+[10.08 9.36 8.64 8.64 10.08 9.36 6.24 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% Rng()->ABELGRP...
+newpath 167 144 moveto
+173 125 184 94 201 72 curveto
+210 61 221 50 233 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 235 45 moveto
+241 36 lineto
+231 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 235 45 moveto
+241 36 lineto
+231 39 lineto
+closepath
+stroke
+end grestore
+% SemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 131 108 moveto
+41 108 lineto
+41 72 lineto
+131 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 131 108 moveto
+41 108 lineto
+41 72 lineto
+131 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+49 85 moveto
+(SemiGroup\(\))
+[7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->SemiGroup()
+newpath 144 144 moveto
+134 135 123 125 113 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 115 112 moveto
+105 108 lineto
+110 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 115 112 moveto
+105 108 lineto
+110 117 lineto
+closepath
+stroke
+end grestore
+% Monoid()->SemiGroup()
+newpath 84 144 moveto
+85 136 85 127 85 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 89 118 moveto
+85 108 lineto
+82 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 89 118 moveto
+85 108 lineto
+82 118 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 336 108 moveto
+210 108 lineto
+210 72 lineto
+336 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 336 108 moveto
+210 108 lineto
+210 72 lineto
+336 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+218 85 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 273 144 moveto
+273 136 273 127 273 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 277 118 moveto
+273 108 lineto
+270 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 277 118 moveto
+273 108 lineto
+270 118 lineto
+closepath
+stroke
+end grestore
+% SETCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 78 36 moveto
+0 36 lineto
+0 0 lineto
+78 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 78 36 moveto
+0 36 lineto
+0 0 lineto
+78 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(SETCAT...)
+[7.68 8.64 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->SETCAT...
+newpath 74 72 moveto
+69 64 62 54 56 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 59 43 moveto
+51 36 lineto
+53 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 59 43 moveto
+51 36 lineto
+53 46 lineto
+closepath
+stroke
+end grestore
+% REPSQ...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 166 36 moveto
+96 36 lineto
+96 0 lineto
+166 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 166 36 moveto
+96 36 lineto
+96 0 lineto
+166 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+103 13 moveto
+(REPSQ...)
+[9.36 8.64 7.68 7.68 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->REPSQ...
+newpath 97 72 moveto
+102 64 109 54 115 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 118 46 moveto
+120 36 lineto
+112 43 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 118 46 moveto
+120 36 lineto
+112 43 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 489 108 moveto
+355 108 lineto
+355 72 lineto
+489 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 489 108 moveto
+355 108 lineto
+355 72 lineto
+489 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+363 85 moveto
+(RightModule\(a:Rng\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% RightModule(a:Ring)->RightModule(a:Rng)
+newpath 423 144 moveto
+423 136 423 127 423 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 426 118 moveto
+422 108 lineto
+420 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 426 118 moveto
+422 108 lineto
+420 118 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Rng)->ABELGRP...
+newpath 384 72 moveto
+364 62 340 51 319 40 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 321 37 moveto
+310 36 lineto
+318 43 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 321 37 moveto
+310 36 lineto
+318 43 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->ABELGRP...
+newpath 273 72 moveto
+273 64 273 55 273 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 277 46 moveto
+273 36 lineto
+270 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 277 46 moveto
+273 36 lineto
+270 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102algebra.ps b/books/ps/v102algebra.ps
new file mode 100644
index 0000000..a0d1010
--- /dev/null
+++ b/books/ps/v102algebra.ps
@@ -0,0 +1,969 @@
+%!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 547 512
+%%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 547 512
+%%PageOrientation: Portrait
+gsave
+36 36 511 476 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 474 lineto
+509 474 lineto
+509 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+509 474 lineto
+509 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Algebra(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 330 468 moveto
+146 468 lineto
+146 432 lineto
+330 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 330 468 moveto
+146 468 lineto
+146 432 lineto
+330 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+154 445 moveto
+(Algebra\(a:CommutativeRing\))
+[10.08 3.84 6.72 6.24 6.96 4.8 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 190 252 moveto
+136 252 lineto
+136 216 lineto
+190 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 190 252 moveto
+136 252 lineto
+136 216 lineto
+190 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+144 229 moveto
+(Ring\(\))
+[9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Algebra(a:CommutativeRing)->Ring()
+newpath 228 432 moveto
+216 407 194 363 182 324 curveto
+175 304 170 280 167 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 170 262 moveto
+166 252 lineto
+164 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 170 262 moveto
+166 252 lineto
+164 262 lineto
+closepath
+stroke
+end grestore
+% Module(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 405 396 moveto
+223 396 lineto
+223 360 lineto
+405 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 405 396 moveto
+223 396 lineto
+223 360 lineto
+405 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+230 373 moveto
+(Module\(a:CommutativeRing\))
+[12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Algebra(a:CommutativeRing)->Module(a:CommutativeRing)
+newpath 257 432 moveto
+267 423 278 413 288 403 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 290 406 moveto
+295 396 lineto
+285 401 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 290 406 moveto
+295 396 lineto
+285 401 lineto
+closepath
+stroke
+end grestore
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 190 180 moveto
+136 180 lineto
+136 144 lineto
+190 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 190 180 moveto
+136 180 lineto
+136 144 lineto
+190 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+146 157 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Rng()
+newpath 163 216 moveto
+163 208 163 199 163 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 167 190 moveto
+163 180 lineto
+160 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 167 190 moveto
+163 180 lineto
+160 190 lineto
+closepath
+stroke
+end grestore
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 118 180 moveto
+48 180 lineto
+48 144 lineto
+118 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 118 180 moveto
+48 180 lineto
+48 144 lineto
+118 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+55 157 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Monoid()
+newpath 143 216 moveto
+133 207 121 196 110 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 113 185 moveto
+103 180 lineto
+108 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 113 185 moveto
+103 180 lineto
+108 190 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 338 180 moveto
+208 180 lineto
+208 144 lineto
+338 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 338 180 moveto
+208 180 lineto
+208 144 lineto
+338 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+216 157 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->LeftModule(a:Ring)
+newpath 190 216 moveto
+204 207 222 196 237 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 239 189 moveto
+245 180 lineto
+235 183 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 239 189 moveto
+245 180 lineto
+235 183 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 503 324 moveto
+191 324 lineto
+191 288 lineto
+503 288 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 503 324 moveto
+191 324 lineto
+191 288 lineto
+503 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+198 301 moveto
+(BiModule\(a:CommutativeRing,b:CommutativeRing\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Module(a:CommutativeRing)->BiModule(a:CommutativeRing,b:CommutativeRing)
+newpath 322 360 moveto
+326 352 330 342 335 333 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 338 335 moveto
+339 324 lineto
+332 332 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 338 335 moveto
+339 324 lineto
+332 332 lineto
+closepath
+stroke
+end grestore
+% ABELGRP...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 318 36 moveto
+228 36 lineto
+228 0 lineto
+318 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 318 36 moveto
+228 36 lineto
+228 0 lineto
+318 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+235 13 moveto
+(ABELGRP...)
+[10.08 9.36 8.64 8.64 10.08 9.36 6.24 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% Rng()->ABELGRP...
+newpath 167 144 moveto
+173 125 184 94 201 72 curveto
+210 61 221 50 233 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 235 45 moveto
+241 36 lineto
+231 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 235 45 moveto
+241 36 lineto
+231 39 lineto
+closepath
+stroke
+end grestore
+% SemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 131 108 moveto
+41 108 lineto
+41 72 lineto
+131 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 131 108 moveto
+41 108 lineto
+41 72 lineto
+131 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+49 85 moveto
+(SemiGroup\(\))
+[7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->SemiGroup()
+newpath 144 144 moveto
+134 135 123 125 113 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 115 112 moveto
+105 108 lineto
+110 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 115 112 moveto
+105 108 lineto
+110 117 lineto
+closepath
+stroke
+end grestore
+% Monoid()->SemiGroup()
+newpath 84 144 moveto
+85 136 85 127 85 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 89 118 moveto
+85 108 lineto
+82 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 89 118 moveto
+85 108 lineto
+82 118 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 336 108 moveto
+210 108 lineto
+210 72 lineto
+336 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 336 108 moveto
+210 108 lineto
+210 72 lineto
+336 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+218 85 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 273 144 moveto
+273 136 273 127 273 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 277 118 moveto
+273 108 lineto
+270 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 277 118 moveto
+273 108 lineto
+270 118 lineto
+closepath
+stroke
+end grestore
+% SETCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 78 36 moveto
+0 36 lineto
+0 0 lineto
+78 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 78 36 moveto
+0 36 lineto
+0 0 lineto
+78 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(SETCAT...)
+[7.68 8.64 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->SETCAT...
+newpath 74 72 moveto
+69 64 62 54 56 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 59 43 moveto
+51 36 lineto
+53 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 59 43 moveto
+51 36 lineto
+53 46 lineto
+closepath
+stroke
+end grestore
+% REPSQ...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 166 36 moveto
+96 36 lineto
+96 0 lineto
+166 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 166 36 moveto
+96 36 lineto
+96 0 lineto
+166 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+103 13 moveto
+(REPSQ...)
+[9.36 8.64 7.68 7.68 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->REPSQ...
+newpath 97 72 moveto
+102 64 109 54 115 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 118 46 moveto
+120 36 lineto
+112 43 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 118 46 moveto
+120 36 lineto
+112 43 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:Ring,b:Ring)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 428 252 moveto
+266 252 lineto
+266 216 lineto
+428 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 428 252 moveto
+266 252 lineto
+266 216 lineto
+428 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+274 229 moveto
+(BiModule\(a:Ring,b:Ring\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)->BiModule(a:Ring,b:Ring)
+newpath 347 288 moveto
+347 280 347 271 347 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 351 262 moveto
+347 252 lineto
+344 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 351 262 moveto
+347 252 lineto
+344 262 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:Ring,b:Ring)->LeftModule(a:Ring)
+newpath 328 216 moveto
+319 207 308 197 298 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 301 185 moveto
+291 180 lineto
+296 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 301 185 moveto
+291 180 lineto
+296 190 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 492 180 moveto
+356 180 lineto
+356 144 lineto
+492 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 492 180 moveto
+356 180 lineto
+356 144 lineto
+492 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+363 157 moveto
+(RightModule\(a:Ring\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:Ring,b:Ring)->RightModule(a:Ring)
+newpath 366 216 moveto
+376 207 387 197 397 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 400 189 moveto
+405 180 lineto
+395 184 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 400 189 moveto
+405 180 lineto
+395 184 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 489 108 moveto
+355 108 lineto
+355 72 lineto
+489 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 489 108 moveto
+355 108 lineto
+355 72 lineto
+489 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+363 85 moveto
+(RightModule\(a:Rng\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% RightModule(a:Ring)->RightModule(a:Rng)
+newpath 423 144 moveto
+423 136 423 127 423 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 426 118 moveto
+422 108 lineto
+420 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 426 118 moveto
+422 108 lineto
+420 118 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Rng)->ABELGRP...
+newpath 384 72 moveto
+364 62 340 51 319 40 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 321 37 moveto
+310 36 lineto
+318 43 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 321 37 moveto
+310 36 lineto
+318 43 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->ABELGRP...
+newpath 273 72 moveto
+273 64 273 55 273 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 277 46 moveto
+273 36 lineto
+270 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 277 46 moveto
+273 36 lineto
+270 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102bitaggregate.ps b/books/ps/v102bitaggregate.ps
new file mode 100644
index 0000000..defcdac
--- /dev/null
+++ b/books/ps/v102bitaggregate.ps
@@ -0,0 +1,886 @@
+%!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 563 440
+%%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 563 440
+%%PageOrientation: Portrait
+gsave
+36 36 527 404 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 402 lineto
+525 402 lineto
+525 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+525 402 lineto
+525 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% BitAggregate()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 275 396 moveto
+173 396 lineto
+173 360 lineto
+275 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 275 396 moveto
+173 396 lineto
+173 360 lineto
+275 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+181 373 moveto
+(BitAggregate\(\))
+[9.36 3.84 3.84 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedSet()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 185 324 moveto
+97 324 lineto
+97 288 lineto
+185 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 185 324 moveto
+97 324 lineto
+97 288 lineto
+185 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+104 301 moveto
+(OrderedSet\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 7.68 6 3.84 4.56 4.56]
+xshow
+end grestore
+end grestore
+% BitAggregate()->OrderedSet()
+newpath 203 360 moveto
+193 351 180 340 169 331 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 171 328 moveto
+161 324 lineto
+166 333 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 171 328 moveto
+161 324 lineto
+166 333 lineto
+closepath
+stroke
+end grestore
+% Logic()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 253 252 moveto
+195 252 lineto
+195 216 lineto
+253 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 253 252 moveto
+195 252 lineto
+195 216 lineto
+253 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+203 229 moveto
+(Logic\(\))
+[8.64 6.96 6.96 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% BitAggregate()->Logic()
+newpath 224 360 moveto
+224 335 224 291 224 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 228 262 moveto
+224 252 lineto
+221 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 228 262 moveto
+224 252 lineto
+221 262 lineto
+closepath
+stroke
+end grestore
+% OneDimensionalArrayAggregate(Boolean)
+[ /Rect [ 259 288 517 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=A1AGG) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 517 324 moveto
+259 324 lineto
+259 288 lineto
+517 288 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 517 324 moveto
+259 324 lineto
+259 288 lineto
+517 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+267 301 moveto
+(OneDimensionalArrayAggregate\(Boolean\))
+[10.08 6.96 6.24 10.08 3.84 10.8 6.24 6.96 5.52 3.84 6.96 6.96 6.24 3.84 10.08 5.28 4.8 5.76 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 9.36 6.96 6.96 3.84 6.24 6.24 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BitAggregate()->OneDimensionalArrayAggregate(Boolean)
+newpath 265 360 moveto
+287 350 314 338 338 328 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 339 331 moveto
+347 324 lineto
+336 325 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 339 331 moveto
+347 324 lineto
+336 325 lineto
+closepath
+stroke
+end grestore
+% SetCategory()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 177 252 moveto
+83 252 lineto
+83 216 lineto
+177 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 177 252 moveto
+83 252 lineto
+83 216 lineto
+177 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+90 229 moveto
+(SetCategory\(\))
+[7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedSet()->SetCategory()
+newpath 138 288 moveto
+137 280 135 271 134 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 137 262 moveto
+133 252 lineto
+131 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 137 262 moveto
+133 252 lineto
+131 262 lineto
+closepath
+stroke
+end grestore
+% BasicType()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 266 180 moveto
+182 180 lineto
+182 144 lineto
+266 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 266 180 moveto
+182 180 lineto
+182 144 lineto
+266 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+189 157 moveto
+(BasicType\(\))
+[9.36 6.24 5.52 3.84 6.24 7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Logic()->BasicType()
+newpath 224 216 moveto
+224 208 224 199 224 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 228 190 moveto
+224 180 lineto
+221 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 228 190 moveto
+224 180 lineto
+221 190 lineto
+closepath
+stroke
+end grestore
+% OneDimensionalArrayAggregate(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 519 252 moveto
+271 252 lineto
+271 216 lineto
+519 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 519 252 moveto
+271 252 lineto
+271 216 lineto
+519 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+278 229 moveto
+(OneDimensionalArrayAggregate\(a:Type\))
+[10.08 6.96 6.24 10.08 3.84 10.8 6.24 6.96 5.52 3.84 6.96 6.96 6.24 3.84 10.08 5.28 4.8 5.76 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% OneDimensionalArrayAggregate(Boolean)->OneDimensionalArrayAggregate(a:Type)
+newpath 390 288 moveto
+391 280 391 271 392 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 395 262 moveto
+393 252 lineto
+389 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 395 262 moveto
+393 252 lineto
+389 262 lineto
+closepath
+stroke
+end grestore
+% FiniteLinearAggregate(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 490 180 moveto
+300 180 lineto
+300 144 lineto
+490 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 490 180 moveto
+300 180 lineto
+300 144 lineto
+490 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+308 157 moveto
+(FiniteLinearAggregate\(a:Type\))
+[7.44 3.84 6.96 3.84 3.84 6.24 8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% OneDimensionalArrayAggregate(a:Type)->FiniteLinearAggregate(a:Type)
+newpath 395 216 moveto
+395 208 395 199 395 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 399 190 moveto
+395 180 lineto
+392 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 399 190 moveto
+395 180 lineto
+392 190 lineto
+closepath
+stroke
+end grestore
+% LinearAggregate(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 474 108 moveto
+316 108 lineto
+316 72 lineto
+474 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 474 108 moveto
+316 108 lineto
+316 72 lineto
+474 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+324 85 moveto
+(LinearAggregate\(a:Type\))
+[8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% FiniteLinearAggregate(a:Type)->LinearAggregate(a:Type)
+newpath 395 144 moveto
+395 136 395 127 395 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 399 118 moveto
+395 108 lineto
+392 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 399 118 moveto
+395 108 lineto
+392 118 lineto
+closepath
+stroke
+end grestore
+% IXAGG...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 476 36 moveto
+404 36 lineto
+404 0 lineto
+476 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 476 36 moveto
+404 36 lineto
+404 0 lineto
+476 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+411 13 moveto
+(IXAGG...)
+[4.56 10.08 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->IXAGG...
+newpath 406 72 moveto
+411 64 418 54 424 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 427 46 moveto
+429 36 lineto
+421 43 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 427 46 moveto
+429 36 lineto
+421 43 lineto
+closepath
+stroke
+end grestore
+% CLAGG...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 386 36 moveto
+312 36 lineto
+312 0 lineto
+386 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 386 36 moveto
+312 36 lineto
+312 0 lineto
+386 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+319 13 moveto
+(CLAGG...)
+[9.36 8.64 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->CLAGG...
+newpath 383 72 moveto
+378 64 371 54 365 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 368 43 moveto
+360 36 lineto
+362 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 368 43 moveto
+360 36 lineto
+362 46 lineto
+closepath
+stroke
+end grestore
+% SetCategory()->BasicType()
+newpath 154 216 moveto
+165 207 180 196 193 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 195 189 moveto
+201 180 lineto
+191 183 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 195 189 moveto
+201 180 lineto
+191 183 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(OutputForm)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 164 180 moveto
+0 180 lineto
+0 144 lineto
+164 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 164 180 moveto
+0 180 lineto
+0 144 lineto
+164 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 157 moveto
+(CoercibleTo\(OutputForm\))
+[9.36 6.96 6.24 4.8 6.24 3.84 6.96 3.84 6.24 7.44 6.96 4.56 10.08 6.96 3.84 6.96 6.96 3.84 7.44 6.96 5.04 10.8 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->CoercibleTo(OutputForm)
+newpath 118 216 moveto
+113 208 106 198 100 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 103 186 moveto
+94 180 lineto
+97 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 103 186 moveto
+94 180 lineto
+97 190 lineto
+closepath
+stroke
+end grestore
+% Category
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 199 36 moveto
+131 36 lineto
+131 0 lineto
+199 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 199 36 moveto
+131 36 lineto
+131 0 lineto
+199 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+139 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% BasicType()->Category
+newpath 217 144 moveto
+207 119 188 74 176 45 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 44 moveto
+172 36 lineto
+173 47 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 44 moveto
+172 36 lineto
+173 47 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 160 108 moveto
+28 108 lineto
+28 72 lineto
+160 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 160 108 moveto
+28 108 lineto
+28 72 lineto
+160 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+36 85 moveto
+(CoercibleTo\(a:Type\))
+[9.36 6.96 6.24 4.8 6.24 3.84 6.96 3.84 6.24 7.44 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% CoercibleTo(OutputForm)->CoercibleTo(a:Type)
+newpath 85 144 moveto
+86 136 88 127 89 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 92 118 moveto
+91 108 lineto
+86 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 92 118 moveto
+91 108 lineto
+86 117 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)->Category
+newpath 112 72 moveto
+121 63 131 53 140 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 143 46 moveto
+147 36 lineto
+138 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 143 46 moveto
+147 36 lineto
+138 41 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102characteristicnonzero.ps b/books/ps/v102characteristicnonzero.ps
new file mode 100644
index 0000000..af0751f
--- /dev/null
+++ b/books/ps/v102characteristicnonzero.ps
@@ -0,0 +1,790 @@
+%!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 403 440
+%%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 403 440
+%%PageOrientation: Portrait
+gsave
+36 36 367 404 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 402 lineto
+365 402 lineto
+365 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+365 402 lineto
+365 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% CharacteristicNonZero()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 252 396 moveto
+98 396 lineto
+98 360 lineto
+252 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 252 396 moveto
+98 396 lineto
+98 360 lineto
+252 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+106 373 moveto
+(CharacteristicNonZero\(\))
+[9.36 6.96 6.24 4.8 6.24 6.24 3.84 6.24 5.04 3.84 5.28 3.84 3.84 6.24 9.84 6.96 6.96 8.64 6.24 4.8 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+156 301 moveto
+(Ring\(\))
+[9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% CharacteristicNonZero()->Ring()
+newpath 175 360 moveto
+175 352 175 343 175 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 334 moveto
+175 324 lineto
+172 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 334 moveto
+175 324 lineto
+172 334 lineto
+closepath
+stroke
+end grestore
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+158 229 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Rng()
+newpath 175 288 moveto
+175 280 175 271 175 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+stroke
+end grestore
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+227 229 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Monoid()
+newpath 195 288 moveto
+205 279 217 268 228 259 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 229 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->LeftModule(a:Ring)
+newpath 148 288 moveto
+134 279 116 268 101 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+stroke
+end grestore
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+59 85 moveto
+(AbelianGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->AbelianGroup()
+newpath 169 216 moveto
+163 197 152 168 140 144 curveto
+135 134 129 125 123 116 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+stroke
+end grestore
+% SemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+214 157 moveto
+(SemiGroup\(\))
+[7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->SemiGroup()
+newpath 194 216 moveto
+204 207 215 197 225 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+stroke
+end grestore
+% Monoid()->SemiGroup()
+newpath 254 216 moveto
+253 208 253 199 253 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+13 157 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 66 216 moveto
+67 208 67 199 67 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+stroke
+end grestore
+% CABMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+19 13 moveto
+(CABMON...)
+[9.12 10.08 9.36 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->CABMON...
+newpath 92 72 moveto
+86 64 79 54 73 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+stroke
+end grestore
+% REPDB...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 13 moveto
+(REPDB...)
+[9.36 8.64 7.68 10.08 9.36 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->REPDB...
+newpath 116 72 moveto
+122 64 129 54 135 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+stroke
+end grestore
+% SETCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+201 85 moveto
+(SETCAT...)
+[7.68 8.64 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->SETCAT...
+newpath 246 144 moveto
+244 136 242 127 240 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+stroke
+end grestore
+% REPSQ...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+296 85 moveto
+(REPSQ...)
+[9.36 8.64 7.68 7.68 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->REPSQ...
+newpath 269 144 moveto
+278 135 289 125 299 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->AbelianGroup()
+newpath 77 144 moveto
+81 136 86 126 91 117 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102characteristiczero.ps b/books/ps/v102characteristiczero.ps
new file mode 100644
index 0000000..88f05da
--- /dev/null
+++ b/books/ps/v102characteristiczero.ps
@@ -0,0 +1,790 @@
+%!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 403 440
+%%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 403 440
+%%PageOrientation: Portrait
+gsave
+36 36 367 404 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 402 lineto
+365 402 lineto
+365 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+365 402 lineto
+365 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% CharacteristicZero()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 240 396 moveto
+110 396 lineto
+110 360 lineto
+240 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 240 396 moveto
+110 396 lineto
+110 360 lineto
+240 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+118 373 moveto
+(CharacteristicZero\(\))
+[9.36 6.96 6.24 4.8 6.24 6.24 3.84 6.24 5.04 3.84 5.28 3.84 3.84 6.24 8.64 6.24 4.8 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+156 301 moveto
+(Ring\(\))
+[9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% CharacteristicZero()->Ring()
+newpath 175 360 moveto
+175 352 175 343 175 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 334 moveto
+175 324 lineto
+172 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 334 moveto
+175 324 lineto
+172 334 lineto
+closepath
+stroke
+end grestore
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+158 229 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Rng()
+newpath 175 288 moveto
+175 280 175 271 175 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+stroke
+end grestore
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+227 229 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Monoid()
+newpath 195 288 moveto
+205 279 217 268 228 259 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 229 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->LeftModule(a:Ring)
+newpath 148 288 moveto
+134 279 116 268 101 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+stroke
+end grestore
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+59 85 moveto
+(AbelianGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->AbelianGroup()
+newpath 169 216 moveto
+163 197 152 168 140 144 curveto
+135 134 129 125 123 116 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+stroke
+end grestore
+% SemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+214 157 moveto
+(SemiGroup\(\))
+[7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->SemiGroup()
+newpath 194 216 moveto
+204 207 215 197 225 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+stroke
+end grestore
+% Monoid()->SemiGroup()
+newpath 254 216 moveto
+253 208 253 199 253 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+13 157 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 66 216 moveto
+67 208 67 199 67 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+stroke
+end grestore
+% CABMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+19 13 moveto
+(CABMON...)
+[9.12 10.08 9.36 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->CABMON...
+newpath 92 72 moveto
+86 64 79 54 73 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+stroke
+end grestore
+% REPDB...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 13 moveto
+(REPDB...)
+[9.36 8.64 7.68 10.08 9.36 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->REPDB...
+newpath 116 72 moveto
+122 64 129 54 135 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+stroke
+end grestore
+% SETCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+201 85 moveto
+(SETCAT...)
+[7.68 8.64 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->SETCAT...
+newpath 246 144 moveto
+244 136 242 127 240 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+stroke
+end grestore
+% REPSQ...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+296 85 moveto
+(REPSQ...)
+[9.36 8.64 7.68 7.68 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->REPSQ...
+newpath 269 144 moveto
+278 135 289 125 299 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->AbelianGroup()
+newpath 77 144 moveto
+81 136 86 126 91 117 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102commutativering.ps b/books/ps/v102commutativering.ps
new file mode 100644
index 0000000..baaff82
--- /dev/null
+++ b/books/ps/v102commutativering.ps
@@ -0,0 +1,968 @@
+%!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 540 440
+%%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 540 440
+%%PageOrientation: Portrait
+gsave
+36 36 504 404 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 402 lineto
+502 402 lineto
+502 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+502 402 lineto
+502 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% CommutativeRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 294 396 moveto
+166 396 lineto
+166 360 lineto
+294 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 294 396 moveto
+166 396 lineto
+166 360 lineto
+294 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+174 373 moveto
+(CommutativeRing\(\))
+[9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 194 324 moveto
+140 324 lineto
+140 288 lineto
+194 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 194 324 moveto
+140 324 lineto
+140 288 lineto
+194 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+148 301 moveto
+(Ring\(\))
+[9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->Ring()
+newpath 214 360 moveto
+206 351 197 341 190 332 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 192 329 moveto
+183 324 lineto
+187 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 192 329 moveto
+183 324 lineto
+187 334 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:Ring,b:Ring)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 374 324 moveto
+212 324 lineto
+212 288 lineto
+374 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 374 324 moveto
+212 324 lineto
+212 288 lineto
+374 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+220 301 moveto
+(BiModule\(a:Ring,b:Ring\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->BiModule(a:Ring,b:Ring)
+newpath 246 360 moveto
+254 351 263 341 270 332 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 273 334 moveto
+277 324 lineto
+268 329 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 273 334 moveto
+277 324 lineto
+268 329 lineto
+closepath
+stroke
+end grestore
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 194 252 moveto
+140 252 lineto
+140 216 lineto
+194 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 194 252 moveto
+140 252 lineto
+140 216 lineto
+194 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+150 229 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Rng()
+newpath 167 288 moveto
+167 280 167 271 167 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 171 262 moveto
+167 252 lineto
+164 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 171 262 moveto
+167 252 lineto
+164 262 lineto
+closepath
+stroke
+end grestore
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 122 252 moveto
+52 252 lineto
+52 216 lineto
+122 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 122 252 moveto
+52 252 lineto
+52 216 lineto
+122 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+59 229 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Monoid()
+newpath 147 288 moveto
+137 279 125 268 114 259 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 117 257 moveto
+107 252 lineto
+112 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 117 257 moveto
+107 252 lineto
+112 262 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 342 252 moveto
+212 252 lineto
+212 216 lineto
+342 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 342 252 moveto
+212 252 lineto
+212 216 lineto
+342 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+220 229 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->LeftModule(a:Ring)
+newpath 194 288 moveto
+208 279 226 268 241 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 261 moveto
+249 252 lineto
+239 255 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 261 moveto
+249 252 lineto
+239 255 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:Ring,b:Ring)->LeftModule(a:Ring)
+newpath 289 288 moveto
+287 280 285 271 283 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 286 261 moveto
+281 252 lineto
+280 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 286 261 moveto
+281 252 lineto
+280 262 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 496 252 moveto
+360 252 lineto
+360 216 lineto
+496 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 496 252 moveto
+360 252 lineto
+360 216 lineto
+496 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+367 229 moveto
+(RightModule\(a:Ring\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:Ring,b:Ring)->RightModule(a:Ring)
+newpath 327 288 moveto
+345 279 367 267 385 257 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 387 260 moveto
+394 252 lineto
+384 254 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 387 260 moveto
+394 252 lineto
+384 254 lineto
+closepath
+stroke
+end grestore
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 330 108 moveto
+224 108 lineto
+224 72 lineto
+330 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 330 108 moveto
+224 108 lineto
+224 72 lineto
+330 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+232 85 moveto
+(AbelianGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->AbelianGroup()
+newpath 172 216 moveto
+177 197 188 166 205 144 curveto
+214 133 225 122 237 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 239 117 moveto
+245 108 lineto
+235 111 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 239 117 moveto
+245 108 lineto
+235 111 lineto
+closepath
+stroke
+end grestore
+% SemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 135 180 moveto
+45 180 lineto
+45 144 lineto
+135 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 135 180 moveto
+45 180 lineto
+45 144 lineto
+135 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+53 157 moveto
+(SemiGroup\(\))
+[7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->SemiGroup()
+newpath 148 216 moveto
+138 207 127 197 117 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 119 184 moveto
+109 180 lineto
+114 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 119 184 moveto
+109 180 lineto
+114 189 lineto
+closepath
+stroke
+end grestore
+% Monoid()->SemiGroup()
+newpath 88 216 moveto
+89 208 89 199 89 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 93 190 moveto
+89 180 lineto
+86 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 93 190 moveto
+89 180 lineto
+86 190 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 340 180 moveto
+214 180 lineto
+214 144 lineto
+340 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 340 180 moveto
+214 180 lineto
+214 144 lineto
+340 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+222 157 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 277 216 moveto
+277 208 277 199 277 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 281 190 moveto
+277 180 lineto
+274 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 281 190 moveto
+277 180 lineto
+274 190 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 493 180 moveto
+359 180 lineto
+359 144 lineto
+493 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 493 180 moveto
+359 180 lineto
+359 144 lineto
+493 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+367 157 moveto
+(RightModule\(a:Rng\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% RightModule(a:Ring)->RightModule(a:Rng)
+newpath 427 216 moveto
+427 208 427 199 427 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 430 190 moveto
+426 180 lineto
+424 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 430 190 moveto
+426 180 lineto
+424 190 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Rng)->AbelianGroup()
+newpath 388 144 moveto
+368 134 344 123 323 112 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 325 109 moveto
+314 108 lineto
+322 115 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 325 109 moveto
+314 108 lineto
+322 115 lineto
+closepath
+stroke
+end grestore
+% CABMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 272 36 moveto
+184 36 lineto
+184 0 lineto
+272 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 272 36 moveto
+184 36 lineto
+184 0 lineto
+272 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+192 13 moveto
+(CABMON...)
+[9.12 10.08 9.36 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->CABMON...
+newpath 265 72 moveto
+259 64 252 54 246 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 249 42 moveto
+240 36 lineto
+243 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 249 42 moveto
+240 36 lineto
+243 46 lineto
+closepath
+stroke
+end grestore
+% REPDB...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 362 36 moveto
+290 36 lineto
+290 0 lineto
+362 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 362 36 moveto
+290 36 lineto
+290 0 lineto
+362 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+297 13 moveto
+(REPDB...)
+[9.36 8.64 7.68 10.08 9.36 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->REPDB...
+newpath 289 72 moveto
+295 64 302 54 308 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 311 46 moveto
+314 36 lineto
+305 42 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 311 46 moveto
+314 36 lineto
+305 42 lineto
+closepath
+stroke
+end grestore
+% SETCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 78 108 moveto
+0 108 lineto
+0 72 lineto
+78 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 78 108 moveto
+0 108 lineto
+0 72 lineto
+78 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 85 moveto
+(SETCAT...)
+[7.68 8.64 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->SETCAT...
+newpath 77 144 moveto
+71 136 64 126 58 116 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 61 114 moveto
+52 108 lineto
+55 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 61 114 moveto
+52 108 lineto
+55 118 lineto
+closepath
+stroke
+end grestore
+% REPSQ...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 166 108 moveto
+96 108 lineto
+96 72 lineto
+166 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 166 108 moveto
+96 108 lineto
+96 72 lineto
+166 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+103 85 moveto
+(REPSQ...)
+[9.36 8.64 7.68 7.68 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->REPSQ...
+newpath 100 144 moveto
+104 136 110 126 116 117 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 119 118 moveto
+121 108 lineto
+113 115 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 119 118 moveto
+121 108 lineto
+113 115 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->AbelianGroup()
+newpath 277 144 moveto
+277 136 277 127 277 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 281 118 moveto
+277 108 lineto
+274 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 281 118 moveto
+277 108 lineto
+274 118 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102differentialextension.ps b/books/ps/v102differentialextension.ps
new file mode 100644
index 0000000..c3e4d57
--- /dev/null
+++ b/books/ps/v102differentialextension.ps
@@ -0,0 +1,775 @@
+%!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 519 440
+%%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 519 440
+%%PageOrientation: Portrait
+gsave
+36 36 483 404 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 402 lineto
+481 402 lineto
+481 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+481 402 lineto
+481 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% DifferentialExtension(a:Ring)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 256 396 moveto
+72 396 lineto
+72 360 lineto
+256 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 256 396 moveto
+72 396 lineto
+72 360 lineto
+256 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+80 373 moveto
+(DifferentialExtension\(a:Ring\))
+[10.08 3.84 4.56 4.08 6.24 4.8 6.24 6.96 3.84 3.84 6.24 3.84 8.64 6.96 3.84 6.24 6.96 5.52 3.84 6.96 6.96 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 191 180 moveto
+137 180 lineto
+137 144 lineto
+191 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 191 180 moveto
+137 180 lineto
+137 144 lineto
+191 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+145 157 moveto
+(Ring\(\))
+[9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% DifferentialExtension(a:Ring)->Ring()
+newpath 151 360 moveto
+134 336 107 293 96 252 curveto
+93 236 90 230 96 216 curveto
+103 201 116 190 128 181 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 130 184 moveto
+137 176 lineto
+127 178 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 130 184 moveto
+137 176 lineto
+127 178 lineto
+closepath
+stroke
+end grestore
+% DifferentialRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 223 252 moveto
+105 252 lineto
+105 216 lineto
+223 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 223 252 moveto
+105 252 lineto
+105 216 lineto
+223 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+113 229 moveto
+(DifferentialRing\(\))
+[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 4.56 4.56]
+xshow
+end grestore
+end grestore
+% DifferentialExtension(a:Ring)->DifferentialRing()
+newpath 164 360 moveto
+164 335 164 291 164 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 168 262 moveto
+164 252 lineto
+161 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 168 262 moveto
+164 252 lineto
+161 262 lineto
+closepath
+stroke
+end grestore
+% PartialDifferentialRing(Symbol)
+[ /Rect [ 225 288 423 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=PDRING) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 423 324 moveto
+225 324 lineto
+225 288 lineto
+423 288 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 423 324 moveto
+225 324 lineto
+225 288 lineto
+423 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+233 301 moveto
+(PartialDifferentialRing\(Symbol\))
+[7.44 6.24 5.04 3.84 3.84 6.24 3.84 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 4.56 7.68 6.96 10.8 6.96 6.96 3.84 4.56]
+xshow
+end grestore
+end grestore
+% DifferentialExtension(a:Ring)->PartialDifferentialRing(Symbol)
+newpath 204 360 moveto
+226 350 252 338 275 328 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 276 331 moveto
+284 324 lineto
+273 325 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 276 331 moveto
+284 324 lineto
+273 325 lineto
+closepath
+stroke
+end grestore
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 111 108 moveto
+57 108 lineto
+57 72 lineto
+111 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 111 108 moveto
+57 108 lineto
+57 72 lineto
+111 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+67 85 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Rng()
+newpath 144 144 moveto
+134 135 122 124 111 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 114 113 moveto
+104 108 lineto
+109 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 114 113 moveto
+104 108 lineto
+109 118 lineto
+closepath
+stroke
+end grestore
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 199 108 moveto
+129 108 lineto
+129 72 lineto
+199 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 199 108 moveto
+129 108 lineto
+129 72 lineto
+199 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+136 85 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Monoid()
+newpath 164 144 moveto
+164 136 164 127 164 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 168 118 moveto
+164 108 lineto
+161 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 168 118 moveto
+164 108 lineto
+161 118 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 347 108 moveto
+217 108 lineto
+217 72 lineto
+347 72 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 347 108 moveto
+217 108 lineto
+217 72 lineto
+347 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+225 85 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->LeftModule(a:Ring)
+newpath 191 145 moveto
+206 136 226 123 243 113 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 245 116 moveto
+252 108 lineto
+242 110 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 245 116 moveto
+252 108 lineto
+242 110 lineto
+closepath
+stroke
+end grestore
+% DifferentialRing()->Ring()
+newpath 164 216 moveto
+164 208 164 199 164 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 168 190 moveto
+164 180 lineto
+161 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 168 190 moveto
+164 180 lineto
+161 190 lineto
+closepath
+stroke
+end grestore
+% PartialDifferentialRing(a:SetCategory)
+[ /Rect [ 241 216 475 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=PDRING) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 475 252 moveto
+241 252 lineto
+241 216 lineto
+475 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 475 252 moveto
+241 252 lineto
+241 216 lineto
+475 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+249 229 moveto
+(PartialDifferentialRing\(a:SetCategory\))
+[7.44 6.24 5.04 3.84 3.84 6.24 3.84 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 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% PartialDifferentialRing(Symbol)->PartialDifferentialRing(a:SetCategory)
+newpath 333 288 moveto
+337 280 341 270 346 261 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 349 263 moveto
+350 252 lineto
+343 260 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 349 263 moveto
+350 252 lineto
+343 260 lineto
+closepath
+stroke
+end grestore
+% PartialDifferentialRing(a:SetCategory)->Ring()
+newpath 309 216 moveto
+276 203 232 187 201 176 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 202 172 moveto
+191 172 lineto
+199 179 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 202 172 moveto
+191 172 lineto
+199 179 lineto
+closepath
+stroke
+end grestore
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.000 0.000 1.000 nodecolor
+0.000 0.000 1.000 nodecolor
+newpath 106 36 moveto
+0 36 lineto
+0 0 lineto
+106 0 lineto
+closepath
+fill
+0.000 0.000 1.000 nodecolor
+newpath 106 36 moveto
+0 36 lineto
+0 0 lineto
+106 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(AbelianGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->AbelianGroup()
+newpath 76 72 moveto
+72 64 68 54 65 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 68 44 moveto
+61 36 lineto
+61 47 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 68 44 moveto
+61 36 lineto
+61 47 lineto
+closepath
+stroke
+end grestore
+% SGROUP...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 204 36 moveto
+124 36 lineto
+124 0 lineto
+204 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 204 36 moveto
+124 36 lineto
+124 0 lineto
+204 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+132 13 moveto
+(SGROUP...)
+[7.68 10.08 8.64 10.08 10.08 6.24 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% Rng()->SGROUP...
+newpath 104 72 moveto
+114 63 126 52 137 43 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 139 46 moveto
+144 36 lineto
+134 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 139 46 moveto
+144 36 lineto
+134 41 lineto
+closepath
+stroke
+end grestore
+% Monoid()->SGROUP...
+newpath 164 72 moveto
+164 64 164 55 164 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 168 46 moveto
+164 36 lineto
+161 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 168 46 moveto
+164 36 lineto
+161 46 lineto
+closepath
+stroke
+end grestore
+% LMODULE...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 330 36 moveto
+234 36 lineto
+234 0 lineto
+330 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 330 36 moveto
+234 36 lineto
+234 0 lineto
+330 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+242 13 moveto
+(LMODULE...)
+[8.64 12.48 10.08 10.08 10.08 8.64 8.64 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LMODULE...
+newpath 282 72 moveto
+282 64 282 55 282 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 286 46 moveto
+282 36 lineto
+279 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 286 46 moveto
+282 36 lineto
+279 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102differentialring.ps b/books/ps/v102differentialring.ps
new file mode 100644
index 0000000..3cebb93
--- /dev/null
+++ b/books/ps/v102differentialring.ps
@@ -0,0 +1,790 @@
+%!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 403 440
+%%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 403 440
+%%PageOrientation: Portrait
+gsave
+36 36 367 404 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 402 lineto
+365 402 lineto
+365 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+365 402 lineto
+365 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% DifferentialRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 234 396 moveto
+116 396 lineto
+116 360 lineto
+234 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 234 396 moveto
+116 396 lineto
+116 360 lineto
+234 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 373 moveto
+(DifferentialRing\(\))
+[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 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+156 301 moveto
+(Ring\(\))
+[9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% DifferentialRing()->Ring()
+newpath 175 360 moveto
+175 352 175 343 175 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 334 moveto
+175 324 lineto
+172 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 334 moveto
+175 324 lineto
+172 334 lineto
+closepath
+stroke
+end grestore
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+158 229 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Rng()
+newpath 175 288 moveto
+175 280 175 271 175 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+stroke
+end grestore
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+227 229 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Monoid()
+newpath 195 288 moveto
+205 279 217 268 228 259 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 229 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->LeftModule(a:Ring)
+newpath 148 288 moveto
+134 279 116 268 101 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+stroke
+end grestore
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+59 85 moveto
+(AbelianGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->AbelianGroup()
+newpath 169 216 moveto
+163 197 152 168 140 144 curveto
+135 134 129 125 123 116 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+stroke
+end grestore
+% SemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+214 157 moveto
+(SemiGroup\(\))
+[7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->SemiGroup()
+newpath 194 216 moveto
+204 207 215 197 225 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+stroke
+end grestore
+% Monoid()->SemiGroup()
+newpath 254 216 moveto
+253 208 253 199 253 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+13 157 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 66 216 moveto
+67 208 67 199 67 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+stroke
+end grestore
+% CABMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+19 13 moveto
+(CABMON...)
+[9.12 10.08 9.36 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->CABMON...
+newpath 92 72 moveto
+86 64 79 54 73 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+stroke
+end grestore
+% REPDB...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 13 moveto
+(REPDB...)
+[9.36 8.64 7.68 10.08 9.36 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->REPDB...
+newpath 116 72 moveto
+122 64 129 54 135 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+stroke
+end grestore
+% SETCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+201 85 moveto
+(SETCAT...)
+[7.68 8.64 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->SETCAT...
+newpath 246 144 moveto
+244 136 242 127 240 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+stroke
+end grestore
+% REPSQ...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+296 85 moveto
+(REPSQ...)
+[9.36 8.64 7.68 7.68 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->REPSQ...
+newpath 269 144 moveto
+278 135 289 125 299 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->AbelianGroup()
+newpath 77 144 moveto
+81 136 86 126 91 117 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102divisionring.ps b/books/ps/v102divisionring.ps
new file mode 100644
index 0000000..917bb12
--- /dev/null
+++ b/books/ps/v102divisionring.ps
@@ -0,0 +1,745 @@
+%!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 556 440
+%%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 556 440
+%%PageOrientation: Portrait
+gsave
+36 36 520 404 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 402 lineto
+518 402 lineto
+518 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+518 402 lineto
+518 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% DivisionRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 247 396 moveto
+145 396 lineto
+145 360 lineto
+247 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 247 396 moveto
+145 396 lineto
+145 360 lineto
+247 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+153 373 moveto
+(DivisionRing\(\))
+[10.08 3.84 6.96 3.84 5.52 3.84 6.96 6.96 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% EntireRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 86 252 moveto
+0 252 lineto
+0 216 lineto
+86 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 86 252 moveto
+0 252 lineto
+0 216 lineto
+86 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 229 moveto
+(EntireRing\(\))
+[8.64 6.96 3.84 3.84 4.8 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% DivisionRing()->EntireRing()
+newpath 157 360 moveto
+139 351 119 338 104 324 curveto
+85 305 68 280 57 261 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 60 259 moveto
+52 252 lineto
+54 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 60 259 moveto
+52 252 lineto
+54 262 lineto
+closepath
+stroke
+end grestore
+% Algebra(Fraction(Integer))
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 279 324 moveto
+113 324 lineto
+113 288 lineto
+279 288 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 279 324 moveto
+113 324 lineto
+113 288 lineto
+279 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+121 301 moveto
+(Algebra\(Fraction\(Integer\)\))
+[10.08 3.84 6.72 6.24 6.96 4.8 6.24 4.56 7.44 4.8 6.24 6.24 3.84 3.84 6.96 6.96 4.56 4.56 6.96 3.84 6.24 6.72 6.24 4.8 4.56 4.56]
+xshow
+end grestore
+end grestore
+% DivisionRing()->Algebra(Fraction(Integer))
+newpath 196 360 moveto
+196 352 196 343 196 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 200 334 moveto
+196 324 lineto
+193 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 200 334 moveto
+196 324 lineto
+193 334 lineto
+closepath
+stroke
+end grestore
+% RepeatedSquaring(DivisionRing)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 504 324 moveto
+302 324 lineto
+302 288 lineto
+504 288 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 504 324 moveto
+302 324 lineto
+302 288 lineto
+504 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+309 301 moveto
+(RepeatedSquaring\(DivisionRing\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 7.68 6.72 6.96 6.24 5.04 3.84 6.96 6.96 4.56 10.08 3.84 6.96 3.84 5.52 3.84 6.96 6.96 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DivisionRing()->RepeatedSquaring(DivisionRing)
+newpath 247 360 moveto
+275 350 311 338 341 327 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 342 330 moveto
+351 324 lineto
+340 324 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 342 330 moveto
+351 324 lineto
+340 324 lineto
+closepath
+stroke
+end grestore
+% RING...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 109 180 moveto
+49 180 lineto
+49 144 lineto
+109 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 109 180 moveto
+49 180 lineto
+49 144 lineto
+109 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+56 157 moveto
+(RING...)
+[9.36 4.56 9.84 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% EntireRing()->RING...
+newpath 52 216 moveto
+56 208 61 198 66 189 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 69 191 moveto
+70 180 lineto
+63 188 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 69 191 moveto
+70 180 lineto
+63 188 lineto
+closepath
+stroke
+end grestore
+% BMODULE...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 165 36 moveto
+67 36 lineto
+67 0 lineto
+165 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 165 36 moveto
+67 36 lineto
+67 0 lineto
+165 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+75 13 moveto
+(BMODULE...)
+[9.36 12.48 10.08 10.08 10.08 8.64 8.64 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% EntireRing()->BMODULE...
+newpath 38 216 moveto
+31 184 21 118 46 72 curveto
+52 60 62 50 73 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 75 45 moveto
+81 36 lineto
+71 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 75 45 moveto
+81 36 lineto
+71 39 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 288 252 moveto
+104 252 lineto
+104 216 lineto
+288 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 288 252 moveto
+104 252 lineto
+104 216 lineto
+288 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+112 229 moveto
+(Algebra\(a:CommutativeRing\))
+[10.08 3.84 6.72 6.24 6.96 4.8 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Algebra(Fraction(Integer))->Algebra(a:CommutativeRing)
+newpath 196 288 moveto
+196 280 196 271 196 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 200 262 moveto
+196 252 lineto
+193 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 200 262 moveto
+196 252 lineto
+193 262 lineto
+closepath
+stroke
+end grestore
+% RepeatedSquaring(a:SetCategory)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 512 252 moveto
+306 252 lineto
+306 216 lineto
+512 216 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 512 252 moveto
+306 252 lineto
+306 216 lineto
+512 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+313 229 moveto
+(RepeatedSquaring\(a:SetCategory\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 7.68 6.72 6.96 6.24 5.04 3.84 6.96 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% RepeatedSquaring(DivisionRing)->RepeatedSquaring(a:SetCategory)
+newpath 405 288 moveto
+406 280 406 271 407 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 411 262 moveto
+407 252 lineto
+404 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 411 262 moveto
+407 252 lineto
+404 262 lineto
+closepath
+stroke
+end grestore
+% Package
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 440 180 moveto
+378 180 lineto
+378 144 lineto
+440 144 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 440 180 moveto
+378 180 lineto
+378 144 lineto
+440 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+385 157 moveto
+(Package)
+[7.44 6.24 6 6.96 6.24 6.72 6.24]
+xshow
+end grestore
+end grestore
+% RepeatedSquaring(a:SetCategory)->Package
+newpath 409 216 moveto
+409 208 409 199 409 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 413 190 moveto
+409 180 lineto
+406 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 413 190 moveto
+409 180 lineto
+406 190 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)->RING...
+newpath 166 216 moveto
+151 207 133 195 117 185 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 118 182 moveto
+108 180 lineto
+115 188 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 118 182 moveto
+108 180 lineto
+115 188 lineto
+closepath
+stroke
+end grestore
+% Module(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 309 180 moveto
+127 180 lineto
+127 144 lineto
+309 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 309 180 moveto
+127 180 lineto
+127 144 lineto
+309 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+134 157 moveto
+(Module\(a:CommutativeRing\))
+[12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Algebra(a:CommutativeRing)->Module(a:CommutativeRing)
+newpath 202 216 moveto
+204 208 207 198 210 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 213 191 moveto
+213 180 lineto
+207 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 213 191 moveto
+213 180 lineto
+207 189 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 367 108 moveto
+55 108 lineto
+55 72 lineto
+367 72 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 367 108 moveto
+55 108 lineto
+55 72 lineto
+367 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+62 85 moveto
+(BiModule\(a:CommutativeRing,b:CommutativeRing\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Module(a:CommutativeRing)->BiModule(a:CommutativeRing,b:CommutativeRing)
+newpath 216 144 moveto
+215 136 215 127 214 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 217 118 moveto
+213 108 lineto
+211 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 217 118 moveto
+213 108 lineto
+211 118 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)->BMODULE...
+newpath 187 72 moveto
+176 63 161 52 148 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 150 39 moveto
+140 36 lineto
+146 45 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 150 39 moveto
+140 36 lineto
+146 45 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102euclideandomain.ps b/books/ps/v102euclideandomain.ps
new file mode 100644
index 0000000..51a70fc
--- /dev/null
+++ b/books/ps/v102euclideandomain.ps
@@ -0,0 +1,738 @@
+%!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 478 512
+%%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 478 512
+%%PageOrientation: Portrait
+gsave
+36 36 442 476 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 474 lineto
+440 474 lineto
+440 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+440 474 lineto
+440 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% EuclideanDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 252 468 moveto
+126 468 lineto
+126 432 lineto
+252 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 252 468 moveto
+126 468 lineto
+126 432 lineto
+252 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+133 445 moveto
+(EuclideanDomain\(\))
+[8.64 6.96 6.24 3.84 3.84 6.96 6.24 6.24 6.96 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% PrincipalIdealDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 264 396 moveto
+114 396 lineto
+114 360 lineto
+264 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 264 396 moveto
+114 396 lineto
+114 360 lineto
+264 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+122 373 moveto
+(PrincipalIdealDomain\(\))
+[7.68 5.04 3.84 6.96 6.24 3.84 6.96 6.24 3.84 4.56 6.96 6.24 6.24 3.84 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% EuclideanDomain()->PrincipalIdealDomain()
+newpath 189 432 moveto
+189 424 189 415 189 406 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 406 moveto
+189 396 lineto
+186 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 406 moveto
+189 396 lineto
+186 406 lineto
+closepath
+stroke
+end grestore
+% GcdDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 236 324 moveto
+142 324 lineto
+142 288 lineto
+236 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 236 324 moveto
+142 324 lineto
+142 288 lineto
+236 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+150 301 moveto
+(GcdDomain\(\))
+[10.08 6.24 6.96 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% PrincipalIdealDomain()->GcdDomain()
+newpath 189 360 moveto
+189 352 189 343 189 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+stroke
+end grestore
+% IntegralDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 246 252 moveto
+132 252 lineto
+132 216 lineto
+246 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 246 252 moveto
+132 252 lineto
+132 216 lineto
+246 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+139 229 moveto
+(IntegralDomain\(\))
+[4.56 6.96 3.84 6.24 7.2 4.8 6.24 3.84 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% GcdDomain()->IntegralDomain()
+newpath 189 288 moveto
+189 280 189 271 189 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+stroke
+end grestore
+% CommutativeRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 180 moveto
+0 180 lineto
+0 144 lineto
+128 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 180 moveto
+0 180 lineto
+0 144 lineto
+128 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 157 moveto
+(CommutativeRing\(\))
+[9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->CommutativeRing()
+newpath 157 216 moveto
+141 207 121 195 104 185 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 182 moveto
+95 180 lineto
+102 188 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 182 moveto
+95 180 lineto
+102 188 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 434 180 moveto
+250 180 lineto
+250 144 lineto
+434 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 434 180 moveto
+250 180 lineto
+250 144 lineto
+434 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+258 157 moveto
+(Algebra\(a:CommutativeRing\))
+[10.08 3.84 6.72 6.24 6.96 4.8 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->Algebra(a:CommutativeRing)
+newpath 228 216 moveto
+248 206 273 195 295 184 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 296 187 moveto
+304 180 lineto
+293 181 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 296 187 moveto
+304 180 lineto
+293 181 lineto
+closepath
+stroke
+end grestore
+% EntireRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 232 180 moveto
+146 180 lineto
+146 144 lineto
+232 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 232 180 moveto
+146 180 lineto
+146 144 lineto
+232 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+153 157 moveto
+(EntireRing\(\))
+[8.64 6.96 3.84 3.84 4.8 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->EntireRing()
+newpath 189 216 moveto
+189 208 189 199 189 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 190 moveto
+189 180 lineto
+186 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 190 moveto
+189 180 lineto
+186 190 lineto
+closepath
+stroke
+end grestore
+% RING...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 178 108 moveto
+118 108 lineto
+118 72 lineto
+178 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 178 108 moveto
+118 108 lineto
+118 72 lineto
+178 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+125 85 moveto
+(RING...)
+[9.36 4.56 9.84 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->RING...
+newpath 85 144 moveto
+95 135 108 124 119 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 122 117 moveto
+127 108 lineto
+117 112 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 122 117 moveto
+127 108 lineto
+117 112 lineto
+closepath
+stroke
+end grestore
+% BMODULE...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 255 36 moveto
+157 36 lineto
+157 0 lineto
+255 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 255 36 moveto
+157 36 lineto
+157 0 lineto
+255 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+165 13 moveto
+(BMODULE...)
+[9.36 12.48 10.08 10.08 10.08 8.64 8.64 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->BMODULE...
+newpath 69 144 moveto
+76 124 89 93 109 72 curveto
+121 59 137 49 152 41 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 154 44 moveto
+161 36 lineto
+151 38 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 154 44 moveto
+161 36 lineto
+151 38 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)->RING...
+newpath 293 144 moveto
+261 132 218 116 188 105 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 189 101 moveto
+178 101 lineto
+186 108 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 189 101 moveto
+178 101 lineto
+186 108 lineto
+closepath
+stroke
+end grestore
+% Module(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 424 108 moveto
+242 108 lineto
+242 72 lineto
+424 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 424 108 moveto
+242 108 lineto
+242 72 lineto
+424 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+249 85 moveto
+(Module\(a:CommutativeRing\))
+[12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Algebra(a:CommutativeRing)->Module(a:CommutativeRing)
+newpath 340 144 moveto
+339 136 338 127 337 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 340 117 moveto
+335 108 lineto
+334 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 340 117 moveto
+335 108 lineto
+334 118 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->RING...
+newpath 179 144 moveto
+175 136 169 126 163 117 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 166 115 moveto
+158 108 lineto
+160 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 166 115 moveto
+158 108 lineto
+160 118 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->BMODULE...
+newpath 191 144 moveto
+195 119 200 75 203 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 206 46 moveto
+204 36 lineto
+200 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 206 46 moveto
+204 36 lineto
+200 46 lineto
+closepath
+stroke
+end grestore
+% Module(a:CommutativeRing)->BMODULE...
+newpath 301 72 moveto
+284 63 264 51 246 41 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 247 38 moveto
+237 36 lineto
+244 44 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 247 38 moveto
+237 36 lineto
+244 44 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102evalable.ps b/books/ps/v102evalable.ps
new file mode 100644
index 0000000..33f828f
--- /dev/null
+++ b/books/ps/v102evalable.ps
@@ -0,0 +1,381 @@
+%!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 310 296
+%%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 310 296
+%%PageOrientation: Portrait
+gsave
+36 36 274 260 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 258 lineto
+272 258 lineto
+272 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 258 lineto
+272 258 lineto
+272 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Evalable(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 210 252 moveto
+56 252 lineto
+56 216 lineto
+210 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 210 252 moveto
+56 252 lineto
+56 216 lineto
+210 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+64 229 moveto
+(Evalable\(a:SetCategory\))
+[8.64 6.72 6.24 3.84 6.24 6.96 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% InnerEvalable(a:SetCategory,b:SetCategory)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 266 180 moveto
+0 180 lineto
+0 144 lineto
+266 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 266 180 moveto
+0 180 lineto
+0 144 lineto
+266 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 157 moveto
+(InnerEvalable\(a:SetCategory,b:SetCategory\))
+[4.56 6.96 6.96 6.24 4.8 8.64 6.72 6.24 3.84 6.24 6.96 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Evalable(a:SetCategory)->InnerEvalable(a:SetCategory,b:SetCategory)
+newpath 133 216 moveto
+133 208 133 199 133 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 137 190 moveto
+133 180 lineto
+130 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 137 190 moveto
+133 180 lineto
+130 190 lineto
+closepath
+stroke
+end grestore
+% InnerEvalable(a:SetCategory,b:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 245 108 moveto
+21 108 lineto
+21 72 lineto
+245 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 245 108 moveto
+21 108 lineto
+21 72 lineto
+245 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+28 85 moveto
+(InnerEvalable\(a:SetCategory,b:Type\))
+[4.56 6.96 6.96 6.24 4.8 8.64 6.72 6.24 3.84 6.24 6.96 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% InnerEvalable(a:SetCategory,b:SetCategory)->InnerEvalable(a:SetCategory,b:Type)
+newpath 133 144 moveto
+133 136 133 127 133 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 137 118 moveto
+133 108 lineto
+130 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 137 118 moveto
+133 108 lineto
+130 118 lineto
+closepath
+stroke
+end grestore
+% Category
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 167 36 moveto
+99 36 lineto
+99 0 lineto
+167 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 167 36 moveto
+99 36 lineto
+99 0 lineto
+167 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+107 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% InnerEvalable(a:SetCategory,b:Type)->Category
+newpath 133 72 moveto
+133 64 133 55 133 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 137 46 moveto
+133 36 lineto
+130 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 137 46 moveto
+133 36 lineto
+130 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102field.ps b/books/ps/v102field.ps
new file mode 100644
index 0000000..f3b5190
--- /dev/null
+++ b/books/ps/v102field.ps
@@ -0,0 +1,493 @@
+%!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 396 296
+%%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 396 296
+%%PageOrientation: Portrait
+gsave
+36 36 360 260 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 258 lineto
+358 258 lineto
+358 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 258 lineto
+358 258 lineto
+358 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Field()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 263 252 moveto
+209 252 lineto
+209 216 lineto
+263 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 263 252 moveto
+209 252 lineto
+209 216 lineto
+263 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+217 229 moveto
+(Field\(\))
+[7.44 3.84 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% EuclideanDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 161 180 moveto
+35 180 lineto
+35 144 lineto
+161 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 161 180 moveto
+35 180 lineto
+35 144 lineto
+161 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+42 157 moveto
+(EuclideanDomain\(\))
+[8.64 6.96 6.24 3.84 3.84 6.96 6.24 6.24 6.96 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Field()->EuclideanDomain()
+newpath 209 220 moveto
+190 210 164 196 142 185 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 143 182 moveto
+133 180 lineto
+140 188 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 143 182 moveto
+133 180 lineto
+140 188 lineto
+closepath
+stroke
+end grestore
+% UniqueFactorizationDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 352 108 moveto
+168 108 lineto
+168 72 lineto
+352 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 352 108 moveto
+168 108 lineto
+168 72 lineto
+352 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+175 85 moveto
+(UniqueFactorizationDomain\(\))
+[9.6 6.96 3.84 6.72 6.96 6.24 7.2 6.24 6.24 3.84 6.96 5.04 3.84 6.24 6.24 3.84 3.84 6.96 6.96 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Field()->UniqueFactorizationDomain()
+newpath 239 216 moveto
+243 191 250 147 255 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 258 118 moveto
+257 108 lineto
+252 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 258 118 moveto
+257 108 lineto
+252 117 lineto
+closepath
+stroke
+end grestore
+% DIVRING...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 350 180 moveto
+264 180 lineto
+264 144 lineto
+350 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 350 180 moveto
+264 180 lineto
+264 144 lineto
+350 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+271 157 moveto
+(DIVRING...)
+[10.08 4.56 10.08 9.36 4.56 9.84 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% Field()->DIVRING...
+newpath 254 216 moveto
+263 207 273 197 282 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 285 190 moveto
+289 180 lineto
+280 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 285 190 moveto
+289 180 lineto
+280 185 lineto
+closepath
+stroke
+end grestore
+% PrincipalIdealDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 150 108 moveto
+0 108 lineto
+0 72 lineto
+150 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 150 108 moveto
+0 108 lineto
+0 72 lineto
+150 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 85 moveto
+(PrincipalIdealDomain\(\))
+[7.68 5.04 3.84 6.96 6.24 3.84 6.96 6.24 3.84 4.56 6.96 6.24 6.24 3.84 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% EuclideanDomain()->PrincipalIdealDomain()
+newpath 92 144 moveto
+89 136 86 127 84 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 87 117 moveto
+81 108 lineto
+81 119 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 87 117 moveto
+81 108 lineto
+81 119 lineto
+closepath
+stroke
+end grestore
+% GCDDOM...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 212 36 moveto
+122 36 lineto
+122 0 lineto
+212 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 212 36 moveto
+122 36 lineto
+122 0 lineto
+212 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+130 13 moveto
+(GCDDOM...)
+[10.08 9.36 10.08 10.08 10.08 12.48 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% UniqueFactorizationDomain()->GCDDOM...
+newpath 237 72 moveto
+226 63 211 52 198 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 200 39 moveto
+190 36 lineto
+196 45 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 200 39 moveto
+190 36 lineto
+196 45 lineto
+closepath
+stroke
+end grestore
+% PrincipalIdealDomain()->GCDDOM...
+newpath 98 72 moveto
+109 63 124 52 136 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 138 45 moveto
+144 36 lineto
+134 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 138 45 moveto
+144 36 lineto
+134 39 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102fullylinearlyexplicitringover.ps b/books/ps/v102fullylinearlyexplicitringover.ps
new file mode 100644
index 0000000..f8f2f66
--- /dev/null
+++ b/books/ps/v102fullylinearlyexplicitringover.ps
@@ -0,0 +1,836 @@
+%!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 403 512
+%%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 403 512
+%%PageOrientation: Portrait
+gsave
+36 36 367 476 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 474 lineto
+365 474 lineto
+365 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+365 474 lineto
+365 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% FullyLinearlyExplicitRingOver(a:Ring)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 294 468 moveto
+56 468 lineto
+56 432 lineto
+294 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 294 468 moveto
+56 468 lineto
+56 432 lineto
+294 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+64 445 moveto
+(FullyLinearlyExplicitRingOver\(a:Ring\))
+[7.44 6.96 3.84 3.6 6.96 8.64 3.84 6.96 6.24 6.24 4.56 3.6 6.96 8.64 6.96 6.96 3.84 3.84 6.24 3.84 3.84 9.36 3.84 6.96 6.96 10.08 6.48 6.24 4.8 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LinearlyExplicitRingOver(a:Ring)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 279 396 moveto
+71 396 lineto
+71 360 lineto
+279 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 279 396 moveto
+71 396 lineto
+71 360 lineto
+279 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+78 373 moveto
+(LinearlyExplicitRingOver\(a:Ring\))
+[8.64 3.84 6.96 6.24 6.24 4.56 3.6 6.96 8.64 6.96 6.96 3.84 3.84 6.24 3.84 3.84 9.36 3.84 6.96 6.96 10.08 6.48 6.24 4.8 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% FullyLinearlyExplicitRingOver(a:Ring)->LinearlyExplicitRingOver(a:Ring)
+newpath 175 432 moveto
+175 424 175 415 175 406 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 406 moveto
+175 396 lineto
+172 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 406 moveto
+175 396 lineto
+172 406 lineto
+closepath
+stroke
+end grestore
+% Ring()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+156 301 moveto
+(Ring\(\))
+[9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% LinearlyExplicitRingOver(a:Ring)->Ring()
+newpath 175 360 moveto
+175 352 175 343 175 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 334 moveto
+175 324 lineto
+172 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 334 moveto
+175 324 lineto
+172 334 lineto
+closepath
+stroke
+end grestore
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+158 229 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Rng()
+newpath 175 288 moveto
+175 280 175 271 175 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+stroke
+end grestore
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+227 229 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Monoid()
+newpath 195 288 moveto
+205 279 217 268 228 259 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 229 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->LeftModule(a:Ring)
+newpath 148 288 moveto
+134 279 116 268 101 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+stroke
+end grestore
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+59 85 moveto
+(AbelianGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->AbelianGroup()
+newpath 169 216 moveto
+163 197 152 168 140 144 curveto
+135 134 129 125 123 116 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+stroke
+end grestore
+% SemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+214 157 moveto
+(SemiGroup\(\))
+[7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->SemiGroup()
+newpath 194 216 moveto
+204 207 215 197 225 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+stroke
+end grestore
+% Monoid()->SemiGroup()
+newpath 254 216 moveto
+253 208 253 199 253 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+13 157 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 66 216 moveto
+67 208 67 199 67 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+stroke
+end grestore
+% CABMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+19 13 moveto
+(CABMON...)
+[9.12 10.08 9.36 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->CABMON...
+newpath 92 72 moveto
+86 64 79 54 73 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+stroke
+end grestore
+% REPDB...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 13 moveto
+(REPDB...)
+[9.36 8.64 7.68 10.08 9.36 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->REPDB...
+newpath 116 72 moveto
+122 64 129 54 135 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+stroke
+end grestore
+% SETCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+201 85 moveto
+(SETCAT...)
+[7.68 8.64 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->SETCAT...
+newpath 246 144 moveto
+244 136 242 127 240 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+stroke
+end grestore
+% REPSQ...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+296 85 moveto
+(REPSQ...)
+[9.36 8.64 7.68 7.68 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->REPSQ...
+newpath 269 144 moveto
+278 135 289 125 299 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->AbelianGroup()
+newpath 77 144 moveto
+81 136 86 126 91 117 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102gcddomain.ps b/books/ps/v102gcddomain.ps
new file mode 100644
index 0000000..93140ca
--- /dev/null
+++ b/books/ps/v102gcddomain.ps
@@ -0,0 +1,692 @@
+%!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 570 440
+%%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 570 440
+%%PageOrientation: Portrait
+gsave
+36 36 534 404 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 402 lineto
+532 402 lineto
+532 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+532 402 lineto
+532 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% GcdDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 236 396 moveto
+142 396 lineto
+142 360 lineto
+236 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 236 396 moveto
+142 396 lineto
+142 360 lineto
+236 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+150 373 moveto
+(GcdDomain\(\))
+[10.08 6.24 6.96 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 246 324 moveto
+132 324 lineto
+132 288 lineto
+246 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 246 324 moveto
+132 324 lineto
+132 288 lineto
+246 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+139 301 moveto
+(IntegralDomain\(\))
+[4.56 6.96 3.84 6.24 7.2 4.8 6.24 3.84 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% GcdDomain()->IntegralDomain()
+newpath 189 360 moveto
+189 352 189 343 189 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+stroke
+end grestore
+% CommutativeRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 252 moveto
+0 252 lineto
+0 216 lineto
+128 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 252 moveto
+0 252 lineto
+0 216 lineto
+128 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 229 moveto
+(CommutativeRing\(\))
+[9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->CommutativeRing()
+newpath 157 288 moveto
+141 279 121 267 104 257 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 254 moveto
+95 252 lineto
+102 260 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 254 moveto
+95 252 lineto
+102 260 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 434 252 moveto
+250 252 lineto
+250 216 lineto
+434 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 434 252 moveto
+250 252 lineto
+250 216 lineto
+434 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+258 229 moveto
+(Algebra\(a:CommutativeRing\))
+[10.08 3.84 6.72 6.24 6.96 4.8 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->Algebra(a:CommutativeRing)
+newpath 228 288 moveto
+248 278 273 267 295 256 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 296 259 moveto
+304 252 lineto
+293 253 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 296 259 moveto
+304 252 lineto
+293 253 lineto
+closepath
+stroke
+end grestore
+% EntireRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 232 252 moveto
+146 252 lineto
+146 216 lineto
+232 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 232 252 moveto
+146 252 lineto
+146 216 lineto
+232 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+153 229 moveto
+(EntireRing\(\))
+[8.64 6.96 3.84 3.84 4.8 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->EntireRing()
+newpath 189 288 moveto
+189 280 189 271 189 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+stroke
+end grestore
+% RING...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 158 180 moveto
+98 180 lineto
+98 144 lineto
+158 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 158 180 moveto
+98 180 lineto
+98 144 lineto
+158 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+105 157 moveto
+(RING...)
+[9.36 4.56 9.84 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->RING...
+newpath 80 216 moveto
+88 207 97 197 105 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 108 190 moveto
+112 180 lineto
+103 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 108 190 moveto
+112 180 lineto
+103 185 lineto
+closepath
+stroke
+end grestore
+% BMODULE...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 235 36 moveto
+137 36 lineto
+137 0 lineto
+235 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 235 36 moveto
+137 36 lineto
+137 0 lineto
+235 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+145 13 moveto
+(BMODULE...)
+[9.36 12.48 10.08 10.08 10.08 8.64 8.64 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->BMODULE...
+newpath 67 216 moveto
+70 197 77 167 89 144 curveto
+108 105 139 68 161 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 164 46 moveto
+168 36 lineto
+159 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 164 46 moveto
+168 36 lineto
+159 41 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)->RING...
+newpath 288 216 moveto
+251 203 202 187 168 175 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 169 172 moveto
+158 172 lineto
+167 178 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 169 172 moveto
+158 172 lineto
+167 178 lineto
+closepath
+stroke
+end grestore
+% Module(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 447 180 moveto
+265 180 lineto
+265 144 lineto
+447 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 447 180 moveto
+265 180 lineto
+265 144 lineto
+447 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+272 157 moveto
+(Module\(a:CommutativeRing\))
+[12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Algebra(a:CommutativeRing)->Module(a:CommutativeRing)
+newpath 346 216 moveto
+347 208 349 199 351 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 354 190 moveto
+353 180 lineto
+348 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 354 190 moveto
+353 180 lineto
+348 189 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->RING...
+newpath 174 216 moveto
+167 207 158 197 150 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 152 185 moveto
+143 180 lineto
+147 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 152 185 moveto
+143 180 lineto
+147 190 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->BMODULE...
+newpath 189 216 moveto
+188 178 187 91 186 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 190 46 moveto
+186 36 lineto
+183 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 190 46 moveto
+186 36 lineto
+183 46 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 526 108 moveto
+214 108 lineto
+214 72 lineto
+526 72 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 526 108 moveto
+214 108 lineto
+214 72 lineto
+526 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+221 85 moveto
+(BiModule\(a:CommutativeRing,b:CommutativeRing\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Module(a:CommutativeRing)->BiModule(a:CommutativeRing,b:CommutativeRing)
+newpath 360 144 moveto
+361 136 363 127 365 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 368 118 moveto
+367 108 lineto
+362 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 368 118 moveto
+367 108 lineto
+362 117 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)->BMODULE...
+newpath 324 72 moveto
+299 62 268 50 241 40 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 37 moveto
+232 36 lineto
+240 43 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 37 moveto
+232 36 lineto
+240 43 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102innerevalable.ps b/books/ps/v102innerevalable.ps
new file mode 100644
index 0000000..a852559
--- /dev/null
+++ b/books/ps/v102innerevalable.ps
@@ -0,0 +1,289 @@
+%!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 152
+%%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 152
+%%PageOrientation: Portrait
+gsave
+36 36 232 116 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 114 lineto
+230 114 lineto
+230 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 114 lineto
+230 114 lineto
+230 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% InnerEvalable(a:SetCategory,b:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 224 108 moveto
+0 108 lineto
+0 72 lineto
+224 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 224 108 moveto
+0 108 lineto
+0 72 lineto
+224 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(InnerEvalable\(a:SetCategory,b:Type\))
+[4.56 6.96 6.96 6.24 4.8 8.64 6.72 6.24 3.84 6.24 6.96 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Category
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 146 36 moveto
+78 36 lineto
+78 0 lineto
+146 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 146 36 moveto
+78 36 lineto
+78 0 lineto
+146 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+86 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% InnerEvalable(a:SetCategory,b:Type)->Category
+newpath 112 72 moveto
+112 64 112 55 112 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 116 46 moveto
+112 36 lineto
+109 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 116 46 moveto
+112 36 lineto
+109 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102integraldomain.ps b/books/ps/v102integraldomain.ps
new file mode 100644
index 0000000..4572819
--- /dev/null
+++ b/books/ps/v102integraldomain.ps
@@ -0,0 +1,646 @@
+%!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 570 368
+%%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 570 368
+%%PageOrientation: Portrait
+gsave
+36 36 534 332 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 330 lineto
+532 330 lineto
+532 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+532 330 lineto
+532 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% IntegralDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 246 324 moveto
+132 324 lineto
+132 288 lineto
+246 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 246 324 moveto
+132 324 lineto
+132 288 lineto
+246 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+139 301 moveto
+(IntegralDomain\(\))
+[4.56 6.96 3.84 6.24 7.2 4.8 6.24 3.84 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% CommutativeRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 252 moveto
+0 252 lineto
+0 216 lineto
+128 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 252 moveto
+0 252 lineto
+0 216 lineto
+128 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 229 moveto
+(CommutativeRing\(\))
+[9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->CommutativeRing()
+newpath 157 288 moveto
+141 279 121 267 104 257 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 254 moveto
+95 252 lineto
+102 260 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 254 moveto
+95 252 lineto
+102 260 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 434 252 moveto
+250 252 lineto
+250 216 lineto
+434 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 434 252 moveto
+250 252 lineto
+250 216 lineto
+434 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+258 229 moveto
+(Algebra\(a:CommutativeRing\))
+[10.08 3.84 6.72 6.24 6.96 4.8 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->Algebra(a:CommutativeRing)
+newpath 228 288 moveto
+248 278 273 267 295 256 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 296 259 moveto
+304 252 lineto
+293 253 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 296 259 moveto
+304 252 lineto
+293 253 lineto
+closepath
+stroke
+end grestore
+% EntireRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 232 252 moveto
+146 252 lineto
+146 216 lineto
+232 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 232 252 moveto
+146 252 lineto
+146 216 lineto
+232 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+153 229 moveto
+(EntireRing\(\))
+[8.64 6.96 3.84 3.84 4.8 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->EntireRing()
+newpath 189 288 moveto
+189 280 189 271 189 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+stroke
+end grestore
+% RING...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 158 180 moveto
+98 180 lineto
+98 144 lineto
+158 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 158 180 moveto
+98 180 lineto
+98 144 lineto
+158 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+105 157 moveto
+(RING...)
+[9.36 4.56 9.84 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->RING...
+newpath 80 216 moveto
+88 207 97 197 105 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 108 190 moveto
+112 180 lineto
+103 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 108 190 moveto
+112 180 lineto
+103 185 lineto
+closepath
+stroke
+end grestore
+% BMODULE...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 235 36 moveto
+137 36 lineto
+137 0 lineto
+235 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 235 36 moveto
+137 36 lineto
+137 0 lineto
+235 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+145 13 moveto
+(BMODULE...)
+[9.36 12.48 10.08 10.08 10.08 8.64 8.64 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->BMODULE...
+newpath 67 216 moveto
+70 197 77 167 89 144 curveto
+108 105 139 68 161 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 164 46 moveto
+168 36 lineto
+159 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 164 46 moveto
+168 36 lineto
+159 41 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)->RING...
+newpath 288 216 moveto
+251 203 202 187 168 175 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 169 172 moveto
+158 172 lineto
+167 178 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 169 172 moveto
+158 172 lineto
+167 178 lineto
+closepath
+stroke
+end grestore
+% Module(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 447 180 moveto
+265 180 lineto
+265 144 lineto
+447 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 447 180 moveto
+265 180 lineto
+265 144 lineto
+447 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+272 157 moveto
+(Module\(a:CommutativeRing\))
+[12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Algebra(a:CommutativeRing)->Module(a:CommutativeRing)
+newpath 346 216 moveto
+347 208 349 199 351 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 354 190 moveto
+353 180 lineto
+348 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 354 190 moveto
+353 180 lineto
+348 189 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->RING...
+newpath 174 216 moveto
+167 207 158 197 150 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 152 185 moveto
+143 180 lineto
+147 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 152 185 moveto
+143 180 lineto
+147 190 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->BMODULE...
+newpath 189 216 moveto
+188 178 187 91 186 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 190 46 moveto
+186 36 lineto
+183 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 190 46 moveto
+186 36 lineto
+183 46 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 526 108 moveto
+214 108 lineto
+214 72 lineto
+526 72 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 526 108 moveto
+214 108 lineto
+214 72 lineto
+526 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+221 85 moveto
+(BiModule\(a:CommutativeRing,b:CommutativeRing\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Module(a:CommutativeRing)->BiModule(a:CommutativeRing,b:CommutativeRing)
+newpath 360 144 moveto
+361 136 363 127 365 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 368 118 moveto
+367 108 lineto
+362 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 368 118 moveto
+367 108 lineto
+362 117 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)->BMODULE...
+newpath 324 72 moveto
+299 62 268 50 241 40 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 37 moveto
+232 36 lineto
+240 43 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 37 moveto
+232 36 lineto
+240 43 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102linearlyexplicitringover.ps b/books/ps/v102linearlyexplicitringover.ps
new file mode 100644
index 0000000..2655f5a
--- /dev/null
+++ b/books/ps/v102linearlyexplicitringover.ps
@@ -0,0 +1,790 @@
+%!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 403 440
+%%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 403 440
+%%PageOrientation: Portrait
+gsave
+36 36 367 404 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 402 lineto
+365 402 lineto
+365 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+365 402 lineto
+365 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% LinearlyExplicitRingOver(a:Ring)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 279 396 moveto
+71 396 lineto
+71 360 lineto
+279 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 279 396 moveto
+71 396 lineto
+71 360 lineto
+279 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+78 373 moveto
+(LinearlyExplicitRingOver\(a:Ring\))
+[8.64 3.84 6.96 6.24 6.24 4.56 3.6 6.96 8.64 6.96 6.96 3.84 3.84 6.24 3.84 3.84 9.36 3.84 6.96 6.96 10.08 6.48 6.24 4.8 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+156 301 moveto
+(Ring\(\))
+[9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% LinearlyExplicitRingOver(a:Ring)->Ring()
+newpath 175 360 moveto
+175 352 175 343 175 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 334 moveto
+175 324 lineto
+172 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 334 moveto
+175 324 lineto
+172 334 lineto
+closepath
+stroke
+end grestore
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+158 229 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Rng()
+newpath 175 288 moveto
+175 280 175 271 175 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+stroke
+end grestore
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+227 229 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Monoid()
+newpath 195 288 moveto
+205 279 217 268 228 259 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 229 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->LeftModule(a:Ring)
+newpath 148 288 moveto
+134 279 116 268 101 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+stroke
+end grestore
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+59 85 moveto
+(AbelianGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->AbelianGroup()
+newpath 169 216 moveto
+163 197 152 168 140 144 curveto
+135 134 129 125 123 116 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+stroke
+end grestore
+% SemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+214 157 moveto
+(SemiGroup\(\))
+[7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->SemiGroup()
+newpath 194 216 moveto
+204 207 215 197 225 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+stroke
+end grestore
+% Monoid()->SemiGroup()
+newpath 254 216 moveto
+253 208 253 199 253 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+13 157 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 66 216 moveto
+67 208 67 199 67 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+stroke
+end grestore
+% CABMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+19 13 moveto
+(CABMON...)
+[9.12 10.08 9.36 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->CABMON...
+newpath 92 72 moveto
+86 64 79 54 73 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+stroke
+end grestore
+% REPDB...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 13 moveto
+(REPDB...)
+[9.36 8.64 7.68 10.08 9.36 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->REPDB...
+newpath 116 72 moveto
+122 64 129 54 135 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+stroke
+end grestore
+% SETCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+201 85 moveto
+(SETCAT...)
+[7.68 8.64 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->SETCAT...
+newpath 246 144 moveto
+244 136 242 127 240 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+stroke
+end grestore
+% REPSQ...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+296 85 moveto
+(REPSQ...)
+[9.36 8.64 7.68 7.68 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->REPSQ...
+newpath 269 144 moveto
+278 135 289 125 299 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->AbelianGroup()
+newpath 77 144 moveto
+81 136 86 126 91 117 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102logic.ps b/books/ps/v102logic.ps
new file mode 100644
index 0000000..e714944
--- /dev/null
+++ b/books/ps/v102logic.ps
@@ -0,0 +1,335 @@
+%!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 128 224
+%%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 128 224
+%%PageOrientation: Portrait
+gsave
+36 36 92 188 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 186 lineto
+90 186 lineto
+90 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 186 lineto
+90 186 lineto
+90 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Logic()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 71 180 moveto
+13 180 lineto
+13 144 lineto
+71 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 71 180 moveto
+13 180 lineto
+13 144 lineto
+71 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+21 157 moveto
+(Logic\(\))
+[8.64 6.96 6.96 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% BasicType()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(BasicType\(\))
+[9.36 6.24 5.52 3.84 6.24 7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Logic()->BasicType()
+newpath 42 144 moveto
+42 136 42 127 42 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 46 118 moveto
+42 108 lineto
+39 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 46 118 moveto
+42 108 lineto
+39 118 lineto
+closepath
+stroke
+end grestore
+% Category
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 76 36 moveto
+8 36 lineto
+8 0 lineto
+76 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 76 36 moveto
+8 36 lineto
+8 0 lineto
+76 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+16 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% BasicType()->Category
+newpath 42 72 moveto
+42 64 42 55 42 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 46 46 moveto
+42 36 lineto
+39 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 46 46 moveto
+42 36 lineto
+39 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102module.ps b/books/ps/v102module.ps
new file mode 100644
index 0000000..e122530
--- /dev/null
+++ b/books/ps/v102module.ps
@@ -0,0 +1,585 @@
+%!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 356 440
+%%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 356 440
+%%PageOrientation: Portrait
+gsave
+36 36 320 404 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 402 lineto
+318 402 lineto
+318 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+318 402 lineto
+318 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Module(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 247 396 moveto
+65 396 lineto
+65 360 lineto
+247 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 247 396 moveto
+65 396 lineto
+65 360 lineto
+247 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+72 373 moveto
+(Module\(a:CommutativeRing\))
+[12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 312 324 moveto
+0 324 lineto
+0 288 lineto
+312 288 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 312 324 moveto
+0 324 lineto
+0 288 lineto
+312 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 301 moveto
+(BiModule\(a:CommutativeRing,b:CommutativeRing\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Module(a:CommutativeRing)->BiModule(a:CommutativeRing,b:CommutativeRing)
+newpath 156 360 moveto
+156 352 156 343 156 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 160 334 moveto
+156 324 lineto
+153 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 160 334 moveto
+156 324 lineto
+153 334 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:Ring,b:Ring)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 237 252 moveto
+75 252 lineto
+75 216 lineto
+237 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 237 252 moveto
+75 252 lineto
+75 216 lineto
+237 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+83 229 moveto
+(BiModule\(a:Ring,b:Ring\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)->BiModule(a:Ring,b:Ring)
+newpath 156 288 moveto
+156 280 156 271 156 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 160 262 moveto
+156 252 lineto
+153 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 160 262 moveto
+156 252 lineto
+153 262 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 146 180 moveto
+16 180 lineto
+16 144 lineto
+146 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 146 180 moveto
+16 180 lineto
+16 144 lineto
+146 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+24 157 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:Ring,b:Ring)->LeftModule(a:Ring)
+newpath 137 216 moveto
+128 207 117 197 107 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 110 185 moveto
+100 180 lineto
+105 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 110 185 moveto
+100 180 lineto
+105 190 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 300 180 moveto
+164 180 lineto
+164 144 lineto
+300 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 300 180 moveto
+164 180 lineto
+164 144 lineto
+300 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+171 157 moveto
+(RightModule\(a:Ring\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:Ring,b:Ring)->RightModule(a:Ring)
+newpath 175 216 moveto
+185 207 196 197 206 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 208 190 moveto
+213 180 lineto
+203 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 208 190 moveto
+213 180 lineto
+203 185 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 145 108 moveto
+19 108 lineto
+19 72 lineto
+145 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 145 108 moveto
+19 108 lineto
+19 72 lineto
+145 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+27 85 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 81 144 moveto
+82 136 82 127 82 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 86 118 moveto
+82 108 lineto
+79 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 86 118 moveto
+82 108 lineto
+79 118 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 298 108 moveto
+164 108 lineto
+164 72 lineto
+298 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 298 108 moveto
+164 108 lineto
+164 72 lineto
+298 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+172 85 moveto
+(RightModule\(a:Rng\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% RightModule(a:Ring)->RightModule(a:Rng)
+newpath 232 144 moveto
+231 136 231 127 231 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 235 118 moveto
+231 108 lineto
+228 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 235 118 moveto
+231 108 lineto
+228 118 lineto
+closepath
+stroke
+end grestore
+% ABELGRP...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 201 36 moveto
+111 36 lineto
+111 0 lineto
+201 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 201 36 moveto
+111 36 lineto
+111 0 lineto
+201 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+118 13 moveto
+(ABELGRP...)
+[10.08 9.36 8.64 8.64 10.08 9.36 6.24 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% RightModule(a:Rng)->ABELGRP...
+newpath 212 72 moveto
+203 63 192 53 182 43 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 185 41 moveto
+175 36 lineto
+180 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 185 41 moveto
+175 36 lineto
+180 46 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->ABELGRP...
+newpath 101 72 moveto
+110 63 121 53 131 43 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 133 46 moveto
+138 36 lineto
+128 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 133 46 moveto
+138 36 lineto
+128 41 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102orderedintegraldomain.ps b/books/ps/v102orderedintegraldomain.ps
new file mode 100644
index 0000000..e39e3ac
--- /dev/null
+++ b/books/ps/v102orderedintegraldomain.ps
@@ -0,0 +1,856 @@
+%!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 793 440
+%%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 793 440
+%%PageOrientation: Portrait
+gsave
+36 36 757 404 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 402 lineto
+755 402 lineto
+755 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+755 402 lineto
+755 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OrderedIntegralDomain()
+[ /Rect [ 421 360 581 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=OINTDOM) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 581 396 moveto
+421 396 lineto
+421 360 lineto
+581 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 581 396 moveto
+421 396 lineto
+421 360 lineto
+581 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+429 373 moveto
+(OrderedIntegralDomain\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 4.56 6.96 3.84 6.24 7.2 4.8 6.24 3.84 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 442 324 moveto
+328 324 lineto
+328 288 lineto
+442 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 442 324 moveto
+328 324 lineto
+328 288 lineto
+442 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+335 301 moveto
+(IntegralDomain\(\))
+[4.56 6.96 3.84 6.24 7.2 4.8 6.24 3.84 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedIntegralDomain()->IntegralDomain()
+newpath 472 360 moveto
+457 351 438 340 423 330 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 424 327 moveto
+414 324 lineto
+420 332 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 424 327 moveto
+414 324 lineto
+420 332 lineto
+closepath
+stroke
+end grestore
+% OrderedRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 612 324 moveto
+514 324 lineto
+514 288 lineto
+612 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 612 324 moveto
+514 324 lineto
+514 288 lineto
+612 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+521 301 moveto
+(OrderedRing\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedIntegralDomain()->OrderedRing()
+newpath 517 360 moveto
+524 351 533 341 541 332 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 544 334 moveto
+548 324 lineto
+539 329 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 544 334 moveto
+548 324 lineto
+539 329 lineto
+closepath
+stroke
+end grestore
+% CommutativeRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 395 252 moveto
+267 252 lineto
+267 216 lineto
+395 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 395 252 moveto
+267 252 lineto
+267 216 lineto
+395 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+275 229 moveto
+(CommutativeRing\(\))
+[9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->CommutativeRing()
+newpath 371 288 moveto
+365 280 357 269 350 260 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 353 258 moveto
+344 252 lineto
+347 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 353 258 moveto
+344 252 lineto
+347 262 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 249 252 moveto
+65 252 lineto
+65 216 lineto
+249 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 249 252 moveto
+65 252 lineto
+65 216 lineto
+249 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+73 229 moveto
+(Algebra\(a:CommutativeRing\))
+[10.08 3.84 6.72 6.24 6.96 4.8 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->Algebra(a:CommutativeRing)
+newpath 328 288 moveto
+296 278 257 265 224 255 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 225 252 moveto
+214 252 lineto
+223 258 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 225 252 moveto
+214 252 lineto
+223 258 lineto
+closepath
+stroke
+end grestore
+% EntireRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 499 252 moveto
+413 252 lineto
+413 216 lineto
+499 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 499 252 moveto
+413 252 lineto
+413 216 lineto
+499 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+420 229 moveto
+(EntireRing\(\))
+[8.64 6.96 3.84 3.84 4.8 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->EntireRing()
+newpath 403 288 moveto
+412 279 422 269 431 260 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 434 262 moveto
+438 252 lineto
+429 257 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 434 262 moveto
+438 252 lineto
+429 257 lineto
+closepath
+stroke
+end grestore
+% OAGROUP...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 645 252 moveto
+555 252 lineto
+555 216 lineto
+645 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 645 252 moveto
+555 252 lineto
+555 216 lineto
+645 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+562 229 moveto
+(OAGROUP...)
+[9.36 9.36 10.08 8.64 10.08 10.08 6.24 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% OrderedRing()->OAGROUP...
+newpath 572 288 moveto
+576 280 581 270 586 261 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 589 262 moveto
+591 252 lineto
+583 259 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 589 262 moveto
+591 252 lineto
+583 259 lineto
+closepath
+stroke
+end grestore
+% RING...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 428 180 moveto
+368 180 lineto
+368 144 lineto
+428 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 428 180 moveto
+368 180 lineto
+368 144 lineto
+428 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+375 157 moveto
+(RING...)
+[9.36 4.56 9.84 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% OrderedRing()->RING...
+newpath 556 288 moveto
+547 268 530 236 508 216 curveto
+487 198 460 184 437 175 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 439 172 moveto
+428 171 lineto
+436 178 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 439 172 moveto
+428 171 lineto
+436 178 lineto
+closepath
+stroke
+end grestore
+% MONOID...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 749 252 moveto
+663 252 lineto
+663 216 lineto
+749 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 749 252 moveto
+663 252 lineto
+663 216 lineto
+749 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+671 229 moveto
+(MONOID...)
+[12.48 10.08 9.84 10.08 4.56 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% OrderedRing()->MONOID...
+newpath 599 288 moveto
+618 278 641 267 661 257 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 663 260 moveto
+670 252 lineto
+660 254 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 663 260 moveto
+670 252 lineto
+660 254 lineto
+closepath
+stroke
+end grestore
+% CommutativeRing()->RING...
+newpath 348 216 moveto
+356 207 365 197 374 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 377 190 moveto
+381 180 lineto
+372 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 377 190 moveto
+381 180 lineto
+372 185 lineto
+closepath
+stroke
+end grestore
+% BMODULE...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 389 36 moveto
+291 36 lineto
+291 0 lineto
+389 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 389 36 moveto
+291 36 lineto
+291 0 lineto
+389 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+299 13 moveto
+(BMODULE...)
+[9.36 12.48 10.08 10.08 10.08 8.64 8.64 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->BMODULE...
+newpath 332 216 moveto
+334 178 337 91 339 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 343 46 moveto
+339 36 lineto
+336 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 343 46 moveto
+339 36 lineto
+336 46 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)->RING...
+newpath 218 216 moveto
+262 203 320 185 358 174 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 359 177 moveto
+368 171 lineto
+357 171 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 359 177 moveto
+368 171 lineto
+357 171 lineto
+closepath
+stroke
+end grestore
+% Module(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 247 180 moveto
+65 180 lineto
+65 144 lineto
+247 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 247 180 moveto
+65 180 lineto
+65 144 lineto
+247 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+72 157 moveto
+(Module\(a:CommutativeRing\))
+[12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Algebra(a:CommutativeRing)->Module(a:CommutativeRing)
+newpath 157 216 moveto
+156 208 156 199 156 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 160 190 moveto
+156 180 lineto
+153 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 160 190 moveto
+156 180 lineto
+153 190 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->RING...
+newpath 441 216 moveto
+434 207 426 197 418 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 421 186 moveto
+412 180 lineto
+415 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 421 186 moveto
+412 180 lineto
+415 190 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->BMODULE...
+newpath 455 216 moveto
+453 197 448 167 437 144 curveto
+419 105 387 68 365 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 367 41 moveto
+358 36 lineto
+362 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 367 41 moveto
+358 36 lineto
+362 46 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 312 108 moveto
+0 108 lineto
+0 72 lineto
+312 72 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 312 108 moveto
+0 108 lineto
+0 72 lineto
+312 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(BiModule\(a:CommutativeRing,b:CommutativeRing\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Module(a:CommutativeRing)->BiModule(a:CommutativeRing,b:CommutativeRing)
+newpath 156 144 moveto
+156 136 156 127 156 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 160 118 moveto
+156 108 lineto
+153 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 160 118 moveto
+156 108 lineto
+153 118 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)->BMODULE...
+newpath 202 72 moveto
+227 62 258 50 285 40 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 286 43 moveto
+294 36 lineto
+283 37 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 286 43 moveto
+294 36 lineto
+283 37 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102partialdifferentialring.ps b/books/ps/v102partialdifferentialring.ps
new file mode 100644
index 0000000..c754226
--- /dev/null
+++ b/books/ps/v102partialdifferentialring.ps
@@ -0,0 +1,790 @@
+%!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 403 440
+%%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 403 440
+%%PageOrientation: Portrait
+gsave
+36 36 367 404 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 402 lineto
+365 402 lineto
+365 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+365 402 lineto
+365 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% PartialDifferentialRing(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 292 396 moveto
+58 396 lineto
+58 360 lineto
+292 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 292 396 moveto
+58 396 lineto
+58 360 lineto
+292 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+66 373 moveto
+(PartialDifferentialRing\(a:SetCategory\))
+[7.44 6.24 5.04 3.84 3.84 6.24 3.84 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 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+156 301 moveto
+(Ring\(\))
+[9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% PartialDifferentialRing(a:SetCategory)->Ring()
+newpath 175 360 moveto
+175 352 175 343 175 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 334 moveto
+175 324 lineto
+172 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 334 moveto
+175 324 lineto
+172 334 lineto
+closepath
+stroke
+end grestore
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+158 229 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Rng()
+newpath 175 288 moveto
+175 280 175 271 175 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+stroke
+end grestore
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+227 229 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Monoid()
+newpath 195 288 moveto
+205 279 217 268 228 259 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 229 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->LeftModule(a:Ring)
+newpath 148 288 moveto
+134 279 116 268 101 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+stroke
+end grestore
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+59 85 moveto
+(AbelianGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->AbelianGroup()
+newpath 169 216 moveto
+163 197 152 168 140 144 curveto
+135 134 129 125 123 116 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+stroke
+end grestore
+% SemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+214 157 moveto
+(SemiGroup\(\))
+[7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->SemiGroup()
+newpath 194 216 moveto
+204 207 215 197 225 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+stroke
+end grestore
+% Monoid()->SemiGroup()
+newpath 254 216 moveto
+253 208 253 199 253 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+13 157 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 66 216 moveto
+67 208 67 199 67 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+stroke
+end grestore
+% CABMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+19 13 moveto
+(CABMON...)
+[9.12 10.08 9.36 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->CABMON...
+newpath 92 72 moveto
+86 64 79 54 73 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+stroke
+end grestore
+% REPDB...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 13 moveto
+(REPDB...)
+[9.36 8.64 7.68 10.08 9.36 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->REPDB...
+newpath 116 72 moveto
+122 64 129 54 135 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+stroke
+end grestore
+% SETCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+201 85 moveto
+(SETCAT...)
+[7.68 8.64 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->SETCAT...
+newpath 246 144 moveto
+244 136 242 127 240 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+stroke
+end grestore
+% REPSQ...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+296 85 moveto
+(REPSQ...)
+[9.36 8.64 7.68 7.68 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->REPSQ...
+newpath 269 144 moveto
+278 135 289 125 299 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->AbelianGroup()
+newpath 77 144 moveto
+81 136 86 126 91 117 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102polynomialfactorizationexplicit.ps b/books/ps/v102polynomialfactorizationexplicit.ps
new file mode 100644
index 0000000..be666e0
--- /dev/null
+++ b/books/ps/v102polynomialfactorizationexplicit.ps
@@ -0,0 +1,738 @@
+%!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 478 512
+%%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 478 512
+%%PageOrientation: Portrait
+gsave
+36 36 442 476 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 474 lineto
+440 474 lineto
+440 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+440 474 lineto
+440 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% PolynomialFactorizationExplicit()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 293 468 moveto
+85 468 lineto
+85 432 lineto
+293 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 293 468 moveto
+85 468 lineto
+85 432 lineto
+293 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+93 445 moveto
+(PolynomialFactorizationExplicit\(\))
+[7.44 6.96 3.6 6.96 6.96 6.96 10.8 3.84 6.24 3.84 7.2 6.24 6.24 3.84 6.96 5.04 3.84 6.24 6.24 3.84 3.84 6.96 6.96 8.64 6.96 6.96 3.84 3.84 6.24 3.84 3.84 4.56 4.56]
+xshow
+end grestore
+end grestore
+% UniqueFactorizationDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 281 396 moveto
+97 396 lineto
+97 360 lineto
+281 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 281 396 moveto
+97 396 lineto
+97 360 lineto
+281 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+104 373 moveto
+(UniqueFactorizationDomain\(\))
+[9.6 6.96 3.84 6.72 6.96 6.24 7.2 6.24 6.24 3.84 6.96 5.04 3.84 6.24 6.24 3.84 3.84 6.96 6.96 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% PolynomialFactorizationExplicit()->UniqueFactorizationDomain()
+newpath 189 432 moveto
+189 424 189 415 189 406 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 406 moveto
+189 396 lineto
+186 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 406 moveto
+189 396 lineto
+186 406 lineto
+closepath
+stroke
+end grestore
+% GcdDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 236 324 moveto
+142 324 lineto
+142 288 lineto
+236 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 236 324 moveto
+142 324 lineto
+142 288 lineto
+236 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+150 301 moveto
+(GcdDomain\(\))
+[10.08 6.24 6.96 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% UniqueFactorizationDomain()->GcdDomain()
+newpath 189 360 moveto
+189 352 189 343 189 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+stroke
+end grestore
+% IntegralDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 246 252 moveto
+132 252 lineto
+132 216 lineto
+246 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 246 252 moveto
+132 252 lineto
+132 216 lineto
+246 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+139 229 moveto
+(IntegralDomain\(\))
+[4.56 6.96 3.84 6.24 7.2 4.8 6.24 3.84 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% GcdDomain()->IntegralDomain()
+newpath 189 288 moveto
+189 280 189 271 189 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+stroke
+end grestore
+% CommutativeRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 180 moveto
+0 180 lineto
+0 144 lineto
+128 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 180 moveto
+0 180 lineto
+0 144 lineto
+128 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 157 moveto
+(CommutativeRing\(\))
+[9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->CommutativeRing()
+newpath 157 216 moveto
+141 207 121 195 104 185 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 182 moveto
+95 180 lineto
+102 188 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 182 moveto
+95 180 lineto
+102 188 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 434 180 moveto
+250 180 lineto
+250 144 lineto
+434 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 434 180 moveto
+250 180 lineto
+250 144 lineto
+434 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+258 157 moveto
+(Algebra\(a:CommutativeRing\))
+[10.08 3.84 6.72 6.24 6.96 4.8 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->Algebra(a:CommutativeRing)
+newpath 228 216 moveto
+248 206 273 195 295 184 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 296 187 moveto
+304 180 lineto
+293 181 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 296 187 moveto
+304 180 lineto
+293 181 lineto
+closepath
+stroke
+end grestore
+% EntireRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 232 180 moveto
+146 180 lineto
+146 144 lineto
+232 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 232 180 moveto
+146 180 lineto
+146 144 lineto
+232 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+153 157 moveto
+(EntireRing\(\))
+[8.64 6.96 3.84 3.84 4.8 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->EntireRing()
+newpath 189 216 moveto
+189 208 189 199 189 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 190 moveto
+189 180 lineto
+186 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 190 moveto
+189 180 lineto
+186 190 lineto
+closepath
+stroke
+end grestore
+% RING...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 178 108 moveto
+118 108 lineto
+118 72 lineto
+178 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 178 108 moveto
+118 108 lineto
+118 72 lineto
+178 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+125 85 moveto
+(RING...)
+[9.36 4.56 9.84 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->RING...
+newpath 85 144 moveto
+95 135 108 124 119 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 122 117 moveto
+127 108 lineto
+117 112 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 122 117 moveto
+127 108 lineto
+117 112 lineto
+closepath
+stroke
+end grestore
+% BMODULE...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 255 36 moveto
+157 36 lineto
+157 0 lineto
+255 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 255 36 moveto
+157 36 lineto
+157 0 lineto
+255 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+165 13 moveto
+(BMODULE...)
+[9.36 12.48 10.08 10.08 10.08 8.64 8.64 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->BMODULE...
+newpath 69 144 moveto
+76 124 89 93 109 72 curveto
+121 59 137 49 152 41 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 154 44 moveto
+161 36 lineto
+151 38 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 154 44 moveto
+161 36 lineto
+151 38 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)->RING...
+newpath 293 144 moveto
+261 132 218 116 188 105 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 189 101 moveto
+178 101 lineto
+186 108 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 189 101 moveto
+178 101 lineto
+186 108 lineto
+closepath
+stroke
+end grestore
+% Module(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 424 108 moveto
+242 108 lineto
+242 72 lineto
+424 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 424 108 moveto
+242 108 lineto
+242 72 lineto
+424 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+249 85 moveto
+(Module\(a:CommutativeRing\))
+[12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Algebra(a:CommutativeRing)->Module(a:CommutativeRing)
+newpath 340 144 moveto
+339 136 338 127 337 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 340 117 moveto
+335 108 lineto
+334 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 340 117 moveto
+335 108 lineto
+334 118 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->RING...
+newpath 179 144 moveto
+175 136 169 126 163 117 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 166 115 moveto
+158 108 lineto
+160 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 166 115 moveto
+158 108 lineto
+160 118 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->BMODULE...
+newpath 191 144 moveto
+195 119 200 75 203 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 206 46 moveto
+204 36 lineto
+200 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 206 46 moveto
+204 36 lineto
+200 46 lineto
+closepath
+stroke
+end grestore
+% Module(a:CommutativeRing)->BMODULE...
+newpath 301 72 moveto
+284 63 264 51 246 41 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 247 38 moveto
+237 36 lineto
+244 44 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 247 38 moveto
+237 36 lineto
+244 44 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102principalidealdomain.ps b/books/ps/v102principalidealdomain.ps
new file mode 100644
index 0000000..becb712
--- /dev/null
+++ b/books/ps/v102principalidealdomain.ps
@@ -0,0 +1,738 @@
+%!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 570 512
+%%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 570 512
+%%PageOrientation: Portrait
+gsave
+36 36 534 476 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 474 lineto
+532 474 lineto
+532 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+532 474 lineto
+532 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% PrincipalIdealDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 264 468 moveto
+114 468 lineto
+114 432 lineto
+264 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 264 468 moveto
+114 468 lineto
+114 432 lineto
+264 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+122 445 moveto
+(PrincipalIdealDomain\(\))
+[7.68 5.04 3.84 6.96 6.24 3.84 6.96 6.24 3.84 4.56 6.96 6.24 6.24 3.84 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% GcdDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 236 396 moveto
+142 396 lineto
+142 360 lineto
+236 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 236 396 moveto
+142 396 lineto
+142 360 lineto
+236 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+150 373 moveto
+(GcdDomain\(\))
+[10.08 6.24 6.96 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% PrincipalIdealDomain()->GcdDomain()
+newpath 189 432 moveto
+189 424 189 415 189 406 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 406 moveto
+189 396 lineto
+186 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 406 moveto
+189 396 lineto
+186 406 lineto
+closepath
+stroke
+end grestore
+% IntegralDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 246 324 moveto
+132 324 lineto
+132 288 lineto
+246 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 246 324 moveto
+132 324 lineto
+132 288 lineto
+246 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+139 301 moveto
+(IntegralDomain\(\))
+[4.56 6.96 3.84 6.24 7.2 4.8 6.24 3.84 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% GcdDomain()->IntegralDomain()
+newpath 189 360 moveto
+189 352 189 343 189 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+stroke
+end grestore
+% CommutativeRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 252 moveto
+0 252 lineto
+0 216 lineto
+128 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 252 moveto
+0 252 lineto
+0 216 lineto
+128 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 229 moveto
+(CommutativeRing\(\))
+[9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->CommutativeRing()
+newpath 157 288 moveto
+141 279 121 267 104 257 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 254 moveto
+95 252 lineto
+102 260 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 254 moveto
+95 252 lineto
+102 260 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 434 252 moveto
+250 252 lineto
+250 216 lineto
+434 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 434 252 moveto
+250 252 lineto
+250 216 lineto
+434 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+258 229 moveto
+(Algebra\(a:CommutativeRing\))
+[10.08 3.84 6.72 6.24 6.96 4.8 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->Algebra(a:CommutativeRing)
+newpath 228 288 moveto
+248 278 273 267 295 256 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 296 259 moveto
+304 252 lineto
+293 253 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 296 259 moveto
+304 252 lineto
+293 253 lineto
+closepath
+stroke
+end grestore
+% EntireRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 232 252 moveto
+146 252 lineto
+146 216 lineto
+232 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 232 252 moveto
+146 252 lineto
+146 216 lineto
+232 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+153 229 moveto
+(EntireRing\(\))
+[8.64 6.96 3.84 3.84 4.8 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->EntireRing()
+newpath 189 288 moveto
+189 280 189 271 189 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+stroke
+end grestore
+% RING...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 158 180 moveto
+98 180 lineto
+98 144 lineto
+158 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 158 180 moveto
+98 180 lineto
+98 144 lineto
+158 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+105 157 moveto
+(RING...)
+[9.36 4.56 9.84 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->RING...
+newpath 80 216 moveto
+88 207 97 197 105 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 108 190 moveto
+112 180 lineto
+103 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 108 190 moveto
+112 180 lineto
+103 185 lineto
+closepath
+stroke
+end grestore
+% BMODULE...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 235 36 moveto
+137 36 lineto
+137 0 lineto
+235 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 235 36 moveto
+137 36 lineto
+137 0 lineto
+235 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+145 13 moveto
+(BMODULE...)
+[9.36 12.48 10.08 10.08 10.08 8.64 8.64 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->BMODULE...
+newpath 67 216 moveto
+70 197 77 167 89 144 curveto
+108 105 139 68 161 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 164 46 moveto
+168 36 lineto
+159 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 164 46 moveto
+168 36 lineto
+159 41 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)->RING...
+newpath 288 216 moveto
+251 203 202 187 168 175 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 169 172 moveto
+158 172 lineto
+167 178 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 169 172 moveto
+158 172 lineto
+167 178 lineto
+closepath
+stroke
+end grestore
+% Module(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 447 180 moveto
+265 180 lineto
+265 144 lineto
+447 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 447 180 moveto
+265 180 lineto
+265 144 lineto
+447 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+272 157 moveto
+(Module\(a:CommutativeRing\))
+[12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Algebra(a:CommutativeRing)->Module(a:CommutativeRing)
+newpath 346 216 moveto
+347 208 349 199 351 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 354 190 moveto
+353 180 lineto
+348 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 354 190 moveto
+353 180 lineto
+348 189 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->RING...
+newpath 174 216 moveto
+167 207 158 197 150 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 152 185 moveto
+143 180 lineto
+147 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 152 185 moveto
+143 180 lineto
+147 190 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->BMODULE...
+newpath 189 216 moveto
+188 178 187 91 186 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 190 46 moveto
+186 36 lineto
+183 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 190 46 moveto
+186 36 lineto
+183 46 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 526 108 moveto
+214 108 lineto
+214 72 lineto
+526 72 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 526 108 moveto
+214 108 lineto
+214 72 lineto
+526 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+221 85 moveto
+(BiModule\(a:CommutativeRing,b:CommutativeRing\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Module(a:CommutativeRing)->BiModule(a:CommutativeRing,b:CommutativeRing)
+newpath 360 144 moveto
+361 136 363 127 365 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 368 118 moveto
+367 108 lineto
+362 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 368 118 moveto
+367 108 lineto
+362 117 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)->BMODULE...
+newpath 324 72 moveto
+299 62 268 50 241 40 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 37 moveto
+232 36 lineto
+240 43 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 37 moveto
+232 36 lineto
+240 43 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102retractableto.ps b/books/ps/v102retractableto.ps
index dd4dde1..87e09a1 100644
--- a/books/ps/v102retractableto.ps
+++ b/books/ps/v102retractableto.ps
@@ -206,11 +206,6 @@ stroke
 0.000 0.000 0.000 graphcolor
 14.00 /Times-Roman set_font
 % RetractableTo(a:Type)
-[ /Rect [ 0 72 140 108 ]
-  /Border [ 0 0 0 ]
-  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
-  /Subtype /Link
-/ANN pdfmark
 gsave 10 dict begin
 filled
 0.537 0.247 0.902 nodecolor
@@ -237,11 +232,6 @@ xshow
 end grestore
 end grestore
 % Category
-[ /Rect [ 36 0 104 36 ]
-  /Border [ 0 0 0 ]
-  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
-  /Subtype /Link
-/ANN pdfmark
 gsave 10 dict begin
 filled
 0.537 0.247 0.902 nodecolor
diff --git a/books/ps/v102uniquefactorizationdomain.ps b/books/ps/v102uniquefactorizationdomain.ps
new file mode 100644
index 0000000..f309094
--- /dev/null
+++ b/books/ps/v102uniquefactorizationdomain.ps
@@ -0,0 +1,738 @@
+%!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 570 512
+%%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 570 512
+%%PageOrientation: Portrait
+gsave
+36 36 534 476 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 474 lineto
+532 474 lineto
+532 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+532 474 lineto
+532 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% UniqueFactorizationDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 281 468 moveto
+97 468 lineto
+97 432 lineto
+281 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 281 468 moveto
+97 468 lineto
+97 432 lineto
+281 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+104 445 moveto
+(UniqueFactorizationDomain\(\))
+[9.6 6.96 3.84 6.72 6.96 6.24 7.2 6.24 6.24 3.84 6.96 5.04 3.84 6.24 6.24 3.84 3.84 6.96 6.96 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% GcdDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 236 396 moveto
+142 396 lineto
+142 360 lineto
+236 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 236 396 moveto
+142 396 lineto
+142 360 lineto
+236 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+150 373 moveto
+(GcdDomain\(\))
+[10.08 6.24 6.96 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% UniqueFactorizationDomain()->GcdDomain()
+newpath 189 432 moveto
+189 424 189 415 189 406 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 406 moveto
+189 396 lineto
+186 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 406 moveto
+189 396 lineto
+186 406 lineto
+closepath
+stroke
+end grestore
+% IntegralDomain()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 246 324 moveto
+132 324 lineto
+132 288 lineto
+246 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 246 324 moveto
+132 324 lineto
+132 288 lineto
+246 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+139 301 moveto
+(IntegralDomain\(\))
+[4.56 6.96 3.84 6.24 7.2 4.8 6.24 3.84 10.08 6.96 10.8 6.24 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% GcdDomain()->IntegralDomain()
+newpath 189 360 moveto
+189 352 189 343 189 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+stroke
+end grestore
+% CommutativeRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 252 moveto
+0 252 lineto
+0 216 lineto
+128 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 252 moveto
+0 252 lineto
+0 216 lineto
+128 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 229 moveto
+(CommutativeRing\(\))
+[9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->CommutativeRing()
+newpath 157 288 moveto
+141 279 121 267 104 257 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 254 moveto
+95 252 lineto
+102 260 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 254 moveto
+95 252 lineto
+102 260 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 434 252 moveto
+250 252 lineto
+250 216 lineto
+434 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 434 252 moveto
+250 252 lineto
+250 216 lineto
+434 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+258 229 moveto
+(Algebra\(a:CommutativeRing\))
+[10.08 3.84 6.72 6.24 6.96 4.8 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->Algebra(a:CommutativeRing)
+newpath 228 288 moveto
+248 278 273 267 295 256 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 296 259 moveto
+304 252 lineto
+293 253 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 296 259 moveto
+304 252 lineto
+293 253 lineto
+closepath
+stroke
+end grestore
+% EntireRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 232 252 moveto
+146 252 lineto
+146 216 lineto
+232 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 232 252 moveto
+146 252 lineto
+146 216 lineto
+232 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+153 229 moveto
+(EntireRing\(\))
+[8.64 6.96 3.84 3.84 4.8 6.24 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% IntegralDomain()->EntireRing()
+newpath 189 288 moveto
+189 280 189 271 189 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+stroke
+end grestore
+% RING...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 158 180 moveto
+98 180 lineto
+98 144 lineto
+158 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 158 180 moveto
+98 180 lineto
+98 144 lineto
+158 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+105 157 moveto
+(RING...)
+[9.36 4.56 9.84 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->RING...
+newpath 80 216 moveto
+88 207 97 197 105 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 108 190 moveto
+112 180 lineto
+103 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 108 190 moveto
+112 180 lineto
+103 185 lineto
+closepath
+stroke
+end grestore
+% BMODULE...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 235 36 moveto
+137 36 lineto
+137 0 lineto
+235 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 235 36 moveto
+137 36 lineto
+137 0 lineto
+235 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+145 13 moveto
+(BMODULE...)
+[9.36 12.48 10.08 10.08 10.08 8.64 8.64 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CommutativeRing()->BMODULE...
+newpath 67 216 moveto
+70 197 77 167 89 144 curveto
+108 105 139 68 161 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 164 46 moveto
+168 36 lineto
+159 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 164 46 moveto
+168 36 lineto
+159 41 lineto
+closepath
+stroke
+end grestore
+% Algebra(a:CommutativeRing)->RING...
+newpath 288 216 moveto
+251 203 202 187 168 175 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 169 172 moveto
+158 172 lineto
+167 178 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 169 172 moveto
+158 172 lineto
+167 178 lineto
+closepath
+stroke
+end grestore
+% Module(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 447 180 moveto
+265 180 lineto
+265 144 lineto
+447 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 447 180 moveto
+265 180 lineto
+265 144 lineto
+447 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+272 157 moveto
+(Module\(a:CommutativeRing\))
+[12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Algebra(a:CommutativeRing)->Module(a:CommutativeRing)
+newpath 346 216 moveto
+347 208 349 199 351 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 354 190 moveto
+353 180 lineto
+348 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 354 190 moveto
+353 180 lineto
+348 189 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->RING...
+newpath 174 216 moveto
+167 207 158 197 150 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 152 185 moveto
+143 180 lineto
+147 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 152 185 moveto
+143 180 lineto
+147 190 lineto
+closepath
+stroke
+end grestore
+% EntireRing()->BMODULE...
+newpath 189 216 moveto
+188 178 187 91 186 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 190 46 moveto
+186 36 lineto
+183 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 190 46 moveto
+186 36 lineto
+183 46 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 526 108 moveto
+214 108 lineto
+214 72 lineto
+526 72 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 526 108 moveto
+214 108 lineto
+214 72 lineto
+526 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+221 85 moveto
+(BiModule\(a:CommutativeRing,b:CommutativeRing\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Module(a:CommutativeRing)->BiModule(a:CommutativeRing,b:CommutativeRing)
+newpath 360 144 moveto
+361 136 363 127 365 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 368 118 moveto
+367 108 lineto
+362 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 368 118 moveto
+367 108 lineto
+362 117 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)->BMODULE...
+newpath 324 72 moveto
+299 62 268 50 241 40 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 37 moveto
+232 36 lineto
+240 43 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 37 moveto
+232 36 lineto
+240 43 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102vectorspace.ps b/books/ps/v102vectorspace.ps
new file mode 100644
index 0000000..498929b
--- /dev/null
+++ b/books/ps/v102vectorspace.ps
@@ -0,0 +1,677 @@
+%!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 356 584
+%%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 356 584
+%%PageOrientation: Portrait
+gsave
+36 36 320 548 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 546 lineto
+318 546 lineto
+318 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 546 lineto
+318 546 lineto
+318 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% VectorSpace(a:Field)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 223 540 moveto
+89 540 lineto
+89 504 lineto
+223 504 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 223 540 moveto
+89 540 lineto
+89 504 lineto
+223 504 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+96 517 moveto
+(VectorSpace\(a:Field\))
+[8.88 6.24 6.24 3.84 6.96 4.8 7.68 6.96 6.24 6.24 6.24 4.56 6.24 3.84 7.44 3.84 6.24 3.84 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Module(Field)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 205 468 moveto
+107 468 lineto
+107 432 lineto
+205 432 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 205 468 moveto
+107 468 lineto
+107 432 lineto
+205 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+114 445 moveto
+(Module\(Field\))
+[12.48 6.96 6.96 6.96 3.84 6.24 4.56 7.44 3.84 6.24 3.84 6.96 4.56]
+xshow
+end grestore
+end grestore
+% VectorSpace(a:Field)->Module(Field)
+newpath 156 504 moveto
+156 496 156 487 156 478 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 160 478 moveto
+156 468 lineto
+153 478 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 160 478 moveto
+156 468 lineto
+153 478 lineto
+closepath
+stroke
+end grestore
+% Module(a:CommutativeRing)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 247 396 moveto
+65 396 lineto
+65 360 lineto
+247 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 247 396 moveto
+65 396 lineto
+65 360 lineto
+247 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+72 373 moveto
+(Module\(a:CommutativeRing\))
+[12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Module(Field)->Module(a:CommutativeRing)
+newpath 156 432 moveto
+156 424 156 415 156 406 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 160 406 moveto
+156 396 lineto
+153 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 160 406 moveto
+156 396 lineto
+153 406 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 312 324 moveto
+0 324 lineto
+0 288 lineto
+312 288 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 312 324 moveto
+0 324 lineto
+0 288 lineto
+312 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 301 moveto
+(BiModule\(a:CommutativeRing,b:CommutativeRing\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 6.96 10.8 10.8 6.96 4.08 6.24 3.84 3.84 6.48 6.24 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Module(a:CommutativeRing)->BiModule(a:CommutativeRing,b:CommutativeRing)
+newpath 156 360 moveto
+156 352 156 343 156 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 160 334 moveto
+156 324 lineto
+153 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 160 334 moveto
+156 324 lineto
+153 334 lineto
+closepath
+stroke
+end grestore
+% BiModule(a:Ring,b:Ring)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 237 252 moveto
+75 252 lineto
+75 216 lineto
+237 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 237 252 moveto
+75 252 lineto
+75 216 lineto
+237 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+83 229 moveto
+(BiModule\(a:Ring,b:Ring\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:CommutativeRing,b:CommutativeRing)->BiModule(a:Ring,b:Ring)
+newpath 156 288 moveto
+156 280 156 271 156 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 160 262 moveto
+156 252 lineto
+153 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 160 262 moveto
+156 252 lineto
+153 262 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 146 180 moveto
+16 180 lineto
+16 144 lineto
+146 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 146 180 moveto
+16 180 lineto
+16 144 lineto
+146 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+24 157 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:Ring,b:Ring)->LeftModule(a:Ring)
+newpath 137 216 moveto
+128 207 117 197 107 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 110 185 moveto
+100 180 lineto
+105 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 110 185 moveto
+100 180 lineto
+105 190 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 300 180 moveto
+164 180 lineto
+164 144 lineto
+300 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 300 180 moveto
+164 180 lineto
+164 144 lineto
+300 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+171 157 moveto
+(RightModule\(a:Ring\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:Ring,b:Ring)->RightModule(a:Ring)
+newpath 175 216 moveto
+185 207 196 197 206 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 208 190 moveto
+213 180 lineto
+203 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 208 190 moveto
+213 180 lineto
+203 185 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 145 108 moveto
+19 108 lineto
+19 72 lineto
+145 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 145 108 moveto
+19 108 lineto
+19 72 lineto
+145 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+27 85 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 81 144 moveto
+82 136 82 127 82 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 86 118 moveto
+82 108 lineto
+79 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 86 118 moveto
+82 108 lineto
+79 118 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 298 108 moveto
+164 108 lineto
+164 72 lineto
+298 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 298 108 moveto
+164 108 lineto
+164 72 lineto
+298 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+172 85 moveto
+(RightModule\(a:Rng\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% RightModule(a:Ring)->RightModule(a:Rng)
+newpath 232 144 moveto
+231 136 231 127 231 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 235 118 moveto
+231 108 lineto
+228 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 235 118 moveto
+231 108 lineto
+228 118 lineto
+closepath
+stroke
+end grestore
+% ABELGRP...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 201 36 moveto
+111 36 lineto
+111 0 lineto
+201 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 201 36 moveto
+111 36 lineto
+111 0 lineto
+201 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+118 13 moveto
+(ABELGRP...)
+[10.08 9.36 8.64 8.64 10.08 9.36 6.24 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% RightModule(a:Rng)->ABELGRP...
+newpath 212 72 moveto
+203 63 192 53 182 43 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 185 41 moveto
+175 36 lineto
+180 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 185 41 moveto
+175 36 lineto
+180 46 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->ABELGRP...
+newpath 101 72 moveto
+110 63 121 53 131 43 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 133 46 moveto
+138 36 lineto
+128 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 133 46 moveto
+138 36 lineto
+128 41 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 419275b..6c2a43d 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,53 @@
+20080925 tpd books/ps/v102vectorspace.ps added
+20080925 tpd books/ps/v102uniquefactorizationdomain.ps added
+20080925 tpd books/ps/v102principalidealdomain.ps added
+20080925 tpd books/ps/v102polynomialfactorizationexplicit.ps added
+20080925 tpd books/ps/v102partialdifferentialring.ps added
+20080925 tpd books/ps/v102orderedintegraldomain.ps added
+20080925 tpd books/ps/v102module.ps added
+20080925 tpd books/ps/v102logic.ps added
+20080925 tpd books/ps/v102linearlyexplicitringover.ps added
+20080925 tpd books/ps/v102integraldomain.ps added
+20080925 tpd books/ps/v102innerevalable.ps added
+20080925 tpd books/ps/v102gcddomain.ps added
+20080925 tpd books/ps/v102fullylinearlyexplicitringover.ps added
+20080925 tpd books/ps/v102field.ps added
+20080925 tpd books/ps/v102evalable.ps added
+20080925 tpd books/ps/v102euclideandomain.ps added
+20080925 tpd books/ps/v102divisionring.ps added
+20080925 tpd books/ps/v102differentialring.ps added
+20080925 tpd books/ps/v102differentialextension.ps added
+20080925 tpd books/ps/v102commutativering.ps added
+20080925 tpd books/ps/v102characteristiczero.ps added
+20080925 tpd books/ps/v102characteristicnonzero.ps added
+20080925 tpd books/ps/v102bitaggregate.ps added
+20080925 tpd books/ps/v102algebra.ps added
+20080925 tpd books/ps/v102EntireRing.ps added
+20080925 tpd books/ps/v102retractableto.ps added
+20080925 tpd books/bookvol10.2 absorb equation1.spad
+20080925 tpd src/algebra/Makefile remove equation1
+20080925 tpd src/algebra/boolean.spad move LOGIC into bookvol10.2
+20080925 tpd src/algebra/equation1.spad remove. merged into bookvol10.2
+20080925 tpd src/algebra/Makefile remove catdef.spad
+20080925 tpd books/bookvol10.2 absorb catdef.spad
+20080925 tpd src/algebra/catdef.spad removed, moved to bookvol10.2
+20080921 tpd books/bookvol10.2 use .pdf rather than .pamphlet in URL
+20080921 tpd books/ps/v71sept2008.eps add new image for sept 2008 
+20080921 tpd books/ps/v71releasenotes.eps update image to include sept2008
+20080921 tpd books/bookvol7.1 add september release notes
+20080921 tpd Makefile.pamphlet September 2008 release number
+20080921 tpd Makefile September 2008 release number
+20080920 tpd books/ps/v102bimodule.ps diagram BMODULE
+20080920 tpd books/ps/v102group.ps diagram GROUP
+20080920 tpd books/ps/v102leftmodule.ps diagram LMODULE
+20080920 tpd books/ps/v102orderedabeliangroup.ps diagram OAGROUP
+20080920 tpd books/ps/v102orderedabelianmonoidsup.ps OAMONS
+20080920 tpd books/ps/v102orderedcancellationabelianmonoid.ps OCAMON
+20080920 tpd books/ps/v102orderedring.ps diagram ORDRING
+20080920 tpd books/ps/v102rightmodule.ps diagram RMODULE
+20080920 tpd books/ps/v102ring.ps diagram RING
+20080920 tpd src/algebra/catdef.spad remove more categories
+20080920 tpd books/bookvol10.2 add more categories
 20080919 tpd books/ps/v102stepthrough.ps diagram STEP
 20080919 tpd books/ps/v102setaggregate.ps diagram SETAGG
 20080919 tpd books/ps/v102rng.ps diagram RNG
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 59f9a08..c28c491 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -273,9 +273,6 @@ LAYER4=\
 @
 \subsection{Layer 5}
 \subsubsection{Completed spad files}
-\begin{verbatim}
-equation1.spad.pamphlet (EVALAB IEVALAB)
-\end{verbatim}
 
 <<layer5>>=
 
@@ -492,12 +489,6 @@ LAYER12=\
 \subsubsection{Completed spad files}
 \begin{verbatim}
 carten.spad.pamphlet (GRMOD GRALG CARTEN CARTEN2)
-catdef.spad.pamphlet (ABELGRP ABELMON ABELSG ALGEBRA BASTYPE BMODULE CABMON
-                      CHARNZ CHARZ COMRING DIFRING DIFEXT DIVRING ENTIRER
-                      EUCDOM FIELD FINITE FLINEXP GCDDOM GROUP INTDOM LMODULE
-                      LINEXP MODULE MONOID OAGROUP OAMON OAMONS OASGP OCAMON
-                      ORDFIN OINTDOM ORDMON ORDRING ORDSET PDRING PFECAT PID
-                      RMODULE RING RNG SGROUP SETCAT STEP UFD VSPACE)
 clifford.spad.pamphlet (QFORM CLIF)
 clip.spad.pamphlet (CLIP)
 coordsys.spad.pamphlet (COORDSYS)
@@ -1194,7 +1185,7 @@ SPADFILES= \
  ${OUTSRC}/bags.spad ${OUTSRC}/bezout.spad ${OUTSRC}/boolean.spad \
  ${OUTSRC}/brill.spad \
  ${OUTSRC}/c02.spad ${OUTSRC}/c05.spad ${OUTSRC}/c06.spad \
- ${OUTSRC}/card.spad ${OUTSRC}/carten.spad ${OUTSRC}/catdef.spad \
+ ${OUTSRC}/card.spad ${OUTSRC}/carten.spad \
  ${OUTSRC}/cden.spad ${OUTSRC}/clifford.spad ${OUTSRC}/clip.spad \
  ${OUTSRC}/cmplxrt.spad ${OUTSRC}/color.spad \
  ${OUTSRC}/combfunc.spad ${OUTSRC}/combinat.spad ${OUTSRC}/complet.spad \
@@ -1215,7 +1206,7 @@ SPADFILES= \
  ${OUTSRC}/e04package.spad ${OUTSRC}/e04routine.spad ${OUTSRC}/e04.spad \
  ${OUTSRC}/efstruc.spad ${OUTSRC}/efuls.spad ${OUTSRC}/efupxs.spad \
  ${OUTSRC}/eigen.spad ${OUTSRC}/elemntry.spad ${OUTSRC}/elfuts.spad \
- ${OUTSRC}/equation1.spad ${OUTSRC}/equation2.spad ${OUTSRC}/error.spad \
+ ${OUTSRC}/equation2.spad ${OUTSRC}/error.spad \
  ${OUTSRC}/expexpan.spad ${OUTSRC}/expr2ups.spad \
  ${OUTSRC}/exprode.spad ${OUTSRC}/expr.spad \
  ${OUTSRC}/f01.spad ${OUTSRC}/f02.spad ${OUTSRC}/f04.spad \
@@ -1354,7 +1345,7 @@ DOCFILES= \
  ${DOC}/bags.spad.dvi ${DOC}/bezout.spad.dvi ${DOC}/boolean.spad.dvi \
  ${DOC}/brill.spad.dvi \
  ${DOC}/c02.spad.dvi ${DOC}/c05.spad.dvi ${DOC}/c06.spad.dvi \
- ${DOC}/card.spad.dvi ${DOC}/carten.spad.dvi ${DOC}/catdef.spad.dvi \
+ ${DOC}/card.spad.dvi ${DOC}/carten.spad.dvi \
  ${DOC}/cden.spad.dvi ${DOC}/clifford.spad.dvi ${DOC}/clip.spad.dvi \
  ${DOC}/cmplxrt.spad.dvi ${DOC}/color.spad.dvi \
  ${DOC}/combfunc.spad.dvi ${DOC}/combinat.spad.dvi ${DOC}/complet.spad.dvi \
@@ -1375,7 +1366,7 @@ DOCFILES= \
  ${DOC}/e04package.spad.dvi ${DOC}/e04routine.spad.dvi ${DOC}/e04.spad.dvi \
  ${DOC}/efstruc.spad.dvi ${DOC}/efuls.spad.dvi ${DOC}/efupxs.spad.dvi \
  ${DOC}/eigen.spad.dvi ${DOC}/elemntry.spad.dvi ${DOC}/elfuts.spad.dvi \
- ${DOC}/equation1.spad.dvi ${DOC}/equation2.spad.dvi ${DOC}/error.spad.dvi \
+ ${DOC}/equation2.spad.dvi ${DOC}/error.spad.dvi \
  ${DOC}/expexpan.spad.dvi ${DOC}/exposed.lsp.dvi ${DOC}/expr2ups.spad.dvi \
  ${DOC}/exprode.spad.dvi ${DOC}/expr.spad.dvi \
  ${DOC}/f01.spad.dvi ${DOC}/f02.spad.dvi ${DOC}/f04.spad.dvi \
diff --git a/src/algebra/boolean.spad.pamphlet b/src/algebra/boolean.spad.pamphlet
index 41e9347..a2768f6 100644
--- a/src/algebra/boolean.spad.pamphlet
+++ b/src/algebra/boolean.spad.pamphlet
@@ -98,33 +98,6 @@ Note that this code is not included in the generated catdef.spad file.
 
 (MAKEPROP (QUOTE |Reference|) (QUOTE |infovec|) (LIST (QUOTE #(NIL NIL NIL NIL NIL NIL (|local| |#1|) (QUOTE |Rep|) (|Boolean|) |REF;=;2$B;1| |REF;ref;S$;2| |REF;elt;$S;3| |REF;setelt;$2S;4| |REF;deref;$S;5| |REF;setref;$2S;6| (|String|) (|OutputForm|) (0 . |message|) (5 . |coerce|) (|List| |$|) (10 . |prefix|) (16 . |coerce|) (|SingleInteger|))) (QUOTE #(|~=| 21 |setref| 27 |setelt| 33 |ref| 39 |latex| 44 |hash| 49 |elt| 54 |deref| 59 |coerce| 64 |=| 69)) (QUOTE NIL) (CONS (|makeByteWordVec2| 1 (QUOTE (1 0 1 1))) (CONS (QUOTE #(|SetCategory&| NIL |BasicType&| NIL)) (CONS (QUOTE #((|SetCategory|) (|Type|) (|BasicType|) (|CoercibleTo| 16))) (|makeByteWordVec2| 22 (QUOTE (1 16 0 15 17 1 6 16 0 18 2 16 0 0 19 20 1 0 16 0 21 2 1 8 0 0 1 2 0 6 0 6 14 2 0 6 0 6 12 1 0 0 6 10 1 1 15 0 1 1 1 22 0 1 1 0 6 0 11 1 0 6 0 13 1 1 16 0 21 2 0 8 0 0 9)))))) (QUOTE |lookupComplete|))) 
 @
-\section{category LOGIC Logic}
-<<dot>>=
-"LOGIC" -> "BASTYPE"
-"Logic()" -> "BasicType()"
-@
-<<category LOGIC Logic>>=
-)abbrev category LOGIC Logic
-++ Author: 
-++ Date Created:
-++ Change History:
-++ Basic Operations: ~, /\, \/
-++ Related Constructors:
-++ Keywords: boolean
-++ Description:  
-++ `Logic' provides the basic operations for lattices,
-++ e.g., boolean algebra.
-Logic: Category == BasicType with
-       _~:        % -> %
-	++ ~(x) returns the logical complement of x.
-       _/_\:       (%, %) -> %
-	++ \spadignore { /\ }returns the logical `meet', e.g. `and'.
-       _\_/:       (%, %) -> %
-	++ \spadignore{ \/ } returns the logical `join', e.g. `or'.
-  add
-    _\_/(x: %,y: %) == _~( _/_\(_~(x), _~(y)))
-
-@
 \section{domain BOOLEAN Boolean}
 <<dot>>=
 "BOOLEAN" -> "ORDSET"
@@ -599,7 +572,6 @@ Bits(): Exports == Implementation where
 <<license>>
 
 <<domain REF Reference>>
-<<category LOGIC Logic>>
 <<domain BOOLEAN Boolean>>
 <<domain IBITS IndexedBits>>
 <<domain BITS Bits>>
diff --git a/src/algebra/catdef.spad.pamphlet b/src/algebra/catdef.spad.pamphlet
deleted file mode 100644
index e564a0c..0000000
--- a/src/algebra/catdef.spad.pamphlet
+++ /dev/null
@@ -1,2818 +0,0 @@
-\documentclass{article}
-\usepackage{axiom}
-\begin{document}
-\title{\$SPAD/src/algebra catdef.spad}
-\author{James Davenport, Lalo Gonzalez-Vega}
-\maketitle
-\begin{abstract}
-\end{abstract}
-\eject
-\tableofcontents
-\eject
-\section{category ALGEBRA Algebra}
-<<dot>>=
-"ALGEBRA" -> "RING"
-"Algebra(a:CommutativeRing)" -> "Ring()"
-"Algebra(a:Field)" -> "Algebra(a:CommutativeRing)"
-"ALGEBRA" -> "MODULE"
-"Algebra(a:CommutativeRing)" -> "Module(a:CommutativeRing)"
-"Algebra(Fraction(Integer))" -> "Algebra(a:CommutativeRing)"
-@
-<<category ALGEBRA Algebra>>=
-)abbrev category ALGEBRA Algebra
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The category of associative algebras (modules which are themselves rings).
-++
-++ Axioms:
-++   \spad{(b+c)::% = (b::%) + (c::%)}
-++   \spad{(b*c)::% = (b::%) * (c::%)}
-++   \spad{(1::R)::% = 1::%}
-++   \spad{b*x = (b::%)*x}
-++   \spad{r*(a*b) = (r*a)*b = a*(r*b)}
-Algebra(R:CommutativeRing): Category ==
-  Join(Ring, Module R) with
-    --operations
-      coerce: R -> %
-          ++ coerce(r) maps the ring element r to a member of the algebra.
- add
-  coerce(x:R):% == x * 1$%
-
-@
-\section{category CHARNZ CharacteristicNonZero}
-<<dot>>=
-"CHARNZ" -> "RING"
-"CharacteristicNonZero()" -> "Ring()"
-@
-<<category CHARNZ CharacteristicNonZero>>=
-)abbrev category CHARNZ CharacteristicNonZero
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ Rings of Characteristic Non Zero
-CharacteristicNonZero():Category == Ring with
-    charthRoot: % -> Union(%,"failed")
-       ++ charthRoot(x) returns the pth root of x
-       ++ where p is the characteristic of the ring.
-
-@
-\section{category CHARZ CharacteristicZero}
-<<dot>>=
-"CHARZ" -> "RING"
-"CharacteristicZero()" -> "Ring()"
-@
-<<category CHARZ CharacteristicZero>>=
-)abbrev category CHARZ CharacteristicZero
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ Rings of Characteristic Zero.
-CharacteristicZero():Category == Ring
-
-@
-\section{category COMRING CommutativeRing}
-<<dot>>=
-"COMRING" -> "RING"
-"CommutativeRing()" -> "Ring()"
-"COMRING" -> "BMODULE"
-"CommutativeRing()" -> "BiModule(a:Ring,b:Ring)"
-@
-<<category COMRING CommutativeRing>>=
-)abbrev category COMRING CommutativeRing
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The category of commutative rings with unity, i.e. rings where
-++ \spadop{*} is commutative, and which have a multiplicative identity.
-++ element.
---CommutativeRing():Category == Join(Ring,BiModule(%:Ring,%:Ring)) with
-CommutativeRing():Category == Join(Ring,BiModule(%,%)) with
-    commutative("*")  ++ multiplication is commutative.
-
-@
-\section{COMRING.lsp BOOTSTRAP}
-{\bf COMRING} depends on itself. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf COMRING}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf COMRING.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<COMRING.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |CommutativeRing;AL| (QUOTE NIL)) 
-
-(DEFUN |CommutativeRing| NIL 
-  (LET (#:G82892) 
-    (COND 
-      (|CommutativeRing;AL|)
-      (T (SETQ |CommutativeRing;AL| (|CommutativeRing;|)))))) 
-
-(DEFUN |CommutativeRing;| NIL 
-  (PROG (#1=#:G82890) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| 
-            (|Ring|)
-            (|BiModule| (QUOTE |$|) (QUOTE |$|))
-            (|mkCategory| 
-              (QUOTE |package|)
-              NIL
-              (QUOTE (((|commutative| "*") T)))
-              (QUOTE NIL)
-              NIL)) 
-           |CommutativeRing|)
-        (SETELT #1# 0 (QUOTE (|CommutativeRing|))))))) 
-
-(MAKEPROP (QUOTE |CommutativeRing|) (QUOTE NILADIC) T) 
-
-@
-\section{category DIFRING DifferentialRing}
-<<dot>>=
-"DIFRING" -> "RING"
-"DifferentialRing()" -> "Ring()"
-@
-<<category DIFRING DifferentialRing>>=
-)abbrev category DIFRING DifferentialRing
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ An ordinary differential ring, that is, a ring with an operation
-++ \spadfun{differentiate}.
-++
-++ Axioms:
-++   \spad{differentiate(x+y) = differentiate(x)+differentiate(y)}
-++   \spad{differentiate(x*y) = x*differentiate(y) + differentiate(x)*y}
-
-DifferentialRing(): Category == Ring with
-    differentiate: % -> %
-         ++ differentiate(x) returns the derivative of x.
-         ++ This function is a simple differential operator
-         ++ where no variable needs to be specified.
-    D: % -> %
-         ++ D(x) returns the derivative of x.
-         ++ This function is a simple differential operator
-         ++ where no variable needs to be specified.
-    differentiate: (%, NonNegativeInteger) -> %
-         ++ differentiate(x, n) returns the n-th derivative of x.
-    D: (%, NonNegativeInteger) -> %
-         ++ D(x, n) returns the n-th derivative of x.
-  add
-    D r == differentiate r
-    differentiate(r, n) ==
-      for i in 1..n repeat r := differentiate r
-      r
-    D(r,n) == differentiate(r,n)
-
-@
-\section{DIFRING.lsp BOOTSTRAP} 
-{\bf DIFRING} needs {\bf INT} which needs {\bf DIFRING}.
-We need to break this cycle to build the algebra. So we keep a
-cached copy of the translated {\bf DIFRING} category which we can write
-into the {\bf MID} directory. We compile the lisp code and copy the
-{\bf DIFRING.o} file to the {\bf OUT} directory.  This is eventually
-forcibly replaced by a recompiled version.
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<DIFRING.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |DifferentialRing;AL| (QUOTE NIL)) 
-
-(DEFUN |DifferentialRing| NIL 
-  (LET (#:G84565) 
-    (COND 
-      (|DifferentialRing;AL|) 
-      (T (SETQ |DifferentialRing;AL| (|DifferentialRing;|)))))) 
-
-(DEFUN |DifferentialRing;| NIL 
-  (PROG (#1=#:G84563) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| 
-            (|Ring|)
-            (|mkCategory| 
-              (QUOTE |domain|)
-              (QUOTE 
-                (((|differentiate| (|$| |$|)) T)
-                 ((D (|$| |$|)) T)
-                 ((|differentiate| (|$| |$| (|NonNegativeInteger|))) T)
-                 ((D (|$| |$| (|NonNegativeInteger|))) T)))
-              NIL
-              (QUOTE ((|NonNegativeInteger|)))
-              NIL))
-          |DifferentialRing|)
-        (SETELT #1# 0 (QUOTE (|DifferentialRing|))))))) 
-
-(MAKEPROP (QUOTE |DifferentialRing|) (QUOTE NILADIC) T) 
-
-@
-\section{DIFRING-.lsp BOOTSTRAP} 
-{\bf DIFRING-} needs {\bf DIFRING}.
-We need to break this cycle to build the algebra. So we keep a
-cached copy of the translated {\bf DIFRING-} category which we can write
-into the {\bf MID} directory. We compile the lisp code and copy the
-{\bf DIFRING-.o} file to the {\bf OUT} directory.  This is eventually
-forcibly replaced by a recompiled version.
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<DIFRING-.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(DEFUN |DIFRING-;D;2S;1| (|r| |$|) 
-  (SPADCALL |r| (QREFELT |$| 7))) 
-
-(DEFUN |DIFRING-;differentiate;SNniS;2| (|r| |n| |$|) 
-  (PROG (|i|) 
-    (RETURN 
-      (SEQ 
-        (SEQ 
-          (LETT |i| 1 |DIFRING-;differentiate;SNniS;2|)
-          G190
-          (COND ((QSGREATERP |i| |n|) (GO G191)))
-          (SEQ 
-            (EXIT 
-              (LETT |r| 
-                (SPADCALL |r| (QREFELT |$| 7))
-                |DIFRING-;differentiate;SNniS;2|)))
-          (LETT |i| (QSADD1 |i|) |DIFRING-;differentiate;SNniS;2|)
-          (GO G190)
-          G191
-          (EXIT NIL)) 
-        (EXIT |r|))))) 
-
-(DEFUN |DIFRING-;D;SNniS;3| (|r| |n| |$|) 
-  (SPADCALL |r| |n| (QREFELT |$| 11))) 
-
-(DEFUN |DifferentialRing&| (|#1|) 
-  (PROG (|DV$1| |dv$| |$| |pv$|) 
-    (RETURN 
-      (PROGN 
-        (LETT |DV$1| (|devaluate| |#1|) . #1=(|DifferentialRing&|))
-        (LETT |dv$| (LIST (QUOTE |DifferentialRing&|) |DV$1|) . #1#)
-        (LETT |$| (GETREFV 13) . #1#)
-        (QSETREFV |$| 0 |dv$|)
-        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
-        (|stuffDomainSlots| |$|)
-        (QSETREFV |$| 6 |#1|)
-        |$|)))) 
-
-(MAKEPROP 
-  (QUOTE |DifferentialRing&|)
-  (QUOTE |infovec|)
-  (LIST 
-    (QUOTE 
-      #(NIL NIL NIL NIL NIL NIL 
-        (|local| |#1|)
-        (0 . |differentiate|)
-        |DIFRING-;D;2S;1| 
-        (|NonNegativeInteger|)
-        |DIFRING-;differentiate;SNniS;2| 
-        (5 . |differentiate|)
-        |DIFRING-;D;SNniS;3|)) 
-    (QUOTE #(|differentiate| 11 D 17))
-    (QUOTE NIL) 
-    (CONS 
-      (|makeByteWordVec2| 1 (QUOTE NIL))
-      (CONS 
-        (QUOTE #())
-        (CONS 
-          (QUOTE #())
-          (|makeByteWordVec2| 12 
-            (QUOTE 
-             (1 6 0 0 7 2 6 0 0 9 11 2 0 0 0 9 10 2 0 0 0 9 12 1 0 0 0 8))))))
-    (QUOTE |lookupComplete|))) 
-
-@
-\section{category DIFEXT DifferentialExtension}
-<<dot>>=
-"DIFEXT" -> "RING"
-"DifferentialExtension(a:Ring)" -> "Ring()"
-@
-<<category DIFEXT DifferentialExtension>>=
-)abbrev category DIFEXT DifferentialExtension
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ Differential extensions of a ring R.
-++ Given a differentiation on R, extend it to a differentiation on %.
-
-DifferentialExtension(R:Ring): Category == Ring with
-    --operations
-    differentiate: (%, R -> R) -> %
-       ++ differentiate(x, deriv) differentiates x extending
-       ++ the derivation deriv on R.
-    differentiate: (%, R -> R, NonNegativeInteger) -> %
-       ++ differentiate(x, deriv, n) differentiate x n times
-       ++ using a derivation which extends deriv on R.
-    D: (%, R -> R) -> %
-       ++ D(x, deriv) differentiates x extending
-       ++ the derivation deriv on R.
-    D: (%, R -> R, NonNegativeInteger) -> %
-       ++ D(x, deriv, n) differentiate x n times
-       ++ using a derivation which extends deriv on R.
-    if R has DifferentialRing then DifferentialRing
-    if R has PartialDifferentialRing(Symbol) then
-             PartialDifferentialRing(Symbol)
-  add
-    differentiate(x:%, derivation: R -> R, n:NonNegativeInteger):% ==
-      for i in 1..n repeat x := differentiate(x, derivation)
-      x
-    D(x:%, derivation: R -> R) == differentiate(x, derivation)
-    D(x:%, derivation: R -> R, n:NonNegativeInteger) ==
-            differentiate(x, derivation, n)
-
-    if R has DifferentialRing then
-      differentiate x == differentiate(x, differentiate$R)
-
-    if R has PartialDifferentialRing Symbol then
-      differentiate(x:%, v:Symbol):% ==
-        differentiate(x, differentiate(#1, v)$R)
-
-@
-\section{category DIVRING DivisionRing}
-<<dot>>=
-"DIVRING" -> "ENTIRER"
-"DivisionRing()" -> "EntireRing()"
-"DIVRING" -> "ALGEBRA"
-"DivisionRing()" -> "Algebra(Fraction(Integer))"
-@
-<<category DIVRING DivisionRing>>=
-)abbrev category DIVRING DivisionRing
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A division ring (sometimes called a skew field),
-++ i.e. a not necessarily commutative ring where
-++ all non-zero elements have multiplicative inverses.
-
-DivisionRing(): Category ==
- Join(EntireRing, Algebra Fraction Integer) with
-      "**": (%,Integer) -> %
-          ++ x**n returns x raised to the integer power n.
-      "^" : (%,Integer) -> %
-          ++ x^n returns x raised to the integer power n.
-      inv : % -> %
-          ++ inv x returns the multiplicative inverse of x.
-          ++ Error: if x is 0.
--- Q-algebra is a lie, should be conditional on characteristic 0,
--- but knownInfo cannot handle the following commented
---    if % has CharacteristicZero then Algebra Fraction Integer
-    add
-      n: Integer
-      x: %
-      _^(x:%, n:Integer):% == x ** n
-      import RepeatedSquaring(%)
-      x ** n: Integer ==
-         zero? n => 1
-         zero? x =>
-            n<0 => error "division by zero"
-            x
-         n<0 =>
-            expt(inv x,(-n) pretend PositiveInteger)
-         expt(x,n pretend PositiveInteger)
---    if % has CharacteristicZero() then
-      q:Fraction(Integer) * x:% == numer(q) * inv(denom(q)::%) * x
-
-@
-\section{DIVRING.lsp BOOTSTRAP}
-{\bf DIVRING} depends on {\bf QFCAT} which eventually depends on 
-{\bf DIVRING}. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf DIVRING}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf DIVRING.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<DIVRING.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |DivisionRing;AL| (QUOTE NIL)) 
-
-(DEFUN |DivisionRing| NIL 
-  (LET (#:G84035) 
-    (COND 
-      (|DivisionRing;AL|)
-      (T (SETQ |DivisionRing;AL| (|DivisionRing;|)))))) 
-
-(DEFUN |DivisionRing;| NIL 
-  (PROG (#1=#:G84033) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|sublisV| 
-            (PAIR 
-              (QUOTE (#2=#:G84032))
-              (LIST (QUOTE (|Fraction| (|Integer|)))))
-            (|Join| 
-              (|EntireRing|)
-              (|Algebra| (QUOTE #2#))
-              (|mkCategory| 
-                (QUOTE |domain|)
-                (QUOTE (
-                  ((|**| (|$| |$| (|Integer|))) T)
-                  ((|^| (|$| |$| (|Integer|))) T)
-                  ((|inv| (|$| |$|)) T)))
-                NIL
-                (QUOTE ((|Integer|)))
-                NIL)))
-          |DivisionRing|)
-        (SETELT #1# 0 (QUOTE (|DivisionRing|))))))) 
-
-(MAKEPROP (QUOTE |DivisionRing|) (QUOTE NILADIC) T) 
-
-@
-\section{DIVRING-.lsp BOOTSTRAP}
-{\bf DIVRING-} depends on {\bf DIVRING}. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf DIVRING-}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf DIVRING-.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<DIVRING-.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(DEFUN |DIVRING-;^;SIS;1| (|x| |n| |$|) 
-  (SPADCALL |x| |n| (QREFELT |$| 8))) 
-
-(DEFUN |DIVRING-;**;SIS;2| (|x| |n| |$|) 
-  (COND 
-    ((ZEROP |n|) (|spadConstant| |$| 10))
-    ((SPADCALL |x| (QREFELT |$| 12))
-      (COND 
-        ((|<| |n| 0) (|error| "division by zero"))
-        ((QUOTE T) |x|)))
-    ((|<| |n| 0) 
-      (SPADCALL (SPADCALL |x| (QREFELT |$| 14)) (|-| |n|) (QREFELT |$| 17)))
-    ((QUOTE T) (SPADCALL |x| |n| (QREFELT |$| 17))))) 
-
-(DEFUN |DIVRING-;*;F2S;3| (|q| |x| |$|) 
-  (SPADCALL 
-    (SPADCALL 
-      (SPADCALL |q| (QREFELT |$| 20))
-      (SPADCALL 
-        (SPADCALL (SPADCALL |q| (QREFELT |$| 21)) (QREFELT |$| 22))
-        (QREFELT |$| 14))
-      (QREFELT |$| 23))
-    |x|
-    (QREFELT |$| 24))) 
-
-(DEFUN |DivisionRing&| (|#1|) 
-  (PROG (|DV$1| |dv$| |$| |pv$|) 
-    (RETURN 
-      (PROGN 
-        (LETT |DV$1| (|devaluate| |#1|) . #1=(|DivisionRing&|))
-        (LETT |dv$| (LIST (QUOTE |DivisionRing&|) |DV$1|) . #1#)
-        (LETT |$| (GETREFV 27) . #1#)
-        (QSETREFV |$| 0 |dv$|)
-        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
-        (|stuffDomainSlots| |$|)
-        (QSETREFV |$| 6 |#1|)
-        |$|)))) 
-
-(MAKEPROP 
-  (QUOTE |DivisionRing&|)
-  (QUOTE |infovec|)
-  (LIST 
-    (QUOTE 
-      #(NIL NIL NIL NIL NIL NIL 
-        (|local| |#1|)
-        (|Integer|)
-        (0 . |**|)
-        |DIVRING-;^;SIS;1| 
-        (6 . |One|)
-        (|Boolean|)
-        (10 . |zero?|)
-        (15 . |Zero|)
-        (19 . |inv|)
-        (|PositiveInteger|)
-        (|RepeatedSquaring| 6)
-        (24 . |expt|)
-        |DIVRING-;**;SIS;2| 
-        (|Fraction| 7)
-        (30 . |numer|)
-        (35 . |denom|)
-        (40 . |coerce|)
-        (45 . |*|)
-        (51 . |*|)
-        |DIVRING-;*;F2S;3| 
-        (|NonNegativeInteger|))) 
-    (QUOTE #(|^| 57 |**| 63 |*| 69))
-    (QUOTE NIL)
-    (CONS 
-      (|makeByteWordVec2| 1 (QUOTE NIL))
-      (CONS 
-        (QUOTE #()) 
-        (CONS 
-          (QUOTE #()) 
-            (|makeByteWordVec2| 25 
-              (QUOTE 
-                (2 6 0 0 7 8 0 6 0 10 1 6 11 0 12 0 6 0 13 1 6 0 0 14 2 16 6
-                 6 15 17 1 19 7 0 20 1 19 7 0 21 1 6 0 7 22 2 6 0 7 0 23 2 6
-                 0 0 0 24 2 0 0 0 7 9 2 0 0 0 7 18 2 0 0 19 0 25)))))) 
-    (QUOTE |lookupComplete|))) 
-
-@
-\section{category ENTIRER EntireRing}
-<<dot>>=
-"ENTIRER" -> "RING"
-"EntireRing()" -> "Ring()"
-"ENTIRER" -> "BMODULE"
-"EntireRing()" -> "BiModule(a:Ring,b:Ring)"
-@
-<<category ENTIRER EntireRing>>=
-)abbrev category ENTIRER EntireRing
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ Entire Rings (non-commutative Integral Domains), i.e. a ring
-++ not necessarily commutative which has no zero divisors.
-++
-++ Axioms:
-++   \spad{ab=0 => a=0 or b=0}  -- known as noZeroDivisors
-++   \spad{not(1=0)}
---EntireRing():Category == Join(Ring,BiModule(%:Ring,%:Ring)) with
-EntireRing():Category == Join(Ring,BiModule(%,%)) with
-      noZeroDivisors  ++ if a product is zero then one of the factors
-                      ++ must be zero.
-
-@
-\section{ENTIRER.lsp BOOTSTRAP}
-{\bf ENTIRER} depends on itself. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf ENTIRER}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf ENTIRER.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<ENTIRER.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |EntireRing;AL| (QUOTE NIL)) 
-
-(DEFUN |EntireRing| NIL 
-  (LET (#:G82841) 
-    (COND 
-      (|EntireRing;AL|) 
-      (T (SETQ |EntireRing;AL| (|EntireRing;|)))))) 
-
-(DEFUN |EntireRing;| NIL 
-  (PROG (#1=#:G82839) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| 
-            (|Ring|) 
-            (|BiModule| (QUOTE |$|) (QUOTE |$|))
-            (|mkCategory| 
-              (QUOTE |package|)
-              NIL
-              (QUOTE ((|noZeroDivisors| T)))
-              (QUOTE NIL)
-              NIL))
-          |EntireRing|)
-        (SETELT #1# 0 (QUOTE (|EntireRing|))))))) 
-
-(MAKEPROP (QUOTE |EntireRing|) (QUOTE NILADIC) T) 
-
-@
-\section{category EUCDOM EuclideanDomain}
-<<dot>>=
-"EUCDOM" -> "PID"
-"EuclideanDomain()" -> "PrincipalIdealDomain()"
-@
-<<category EUCDOM EuclideanDomain>>=
-)abbrev category EUCDOM EuclideanDomain
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A constructive euclidean domain, i.e. one can divide producing
-++ a quotient and a remainder where the remainder is either zero
-++ or is smaller (\spadfun{euclideanSize}) than the divisor.
-++
-++ Conditional attributes:
-++   multiplicativeValuation\tab{25}\spad{Size(a*b)=Size(a)*Size(b)}
-++   additiveValuation\tab{25}\spad{Size(a*b)=Size(a)+Size(b)}
-
-EuclideanDomain(): Category == PrincipalIdealDomain with
-    --operations
-      sizeLess?: (%,%) -> Boolean
-         ++ sizeLess?(x,y) tests whether x is strictly
-         ++ smaller than y with respect to the \spadfunFrom{euclideanSize}{EuclideanDomain}.
-      euclideanSize: % -> NonNegativeInteger
-         ++ euclideanSize(x) returns the euclidean size of the element x.
-         ++ Error: if x is zero.
-      divide: (%,%) -> Record(quotient:%,remainder:%)
-         ++ divide(x,y) divides x by y producing a record containing a
-         ++ \spad{quotient} and \spad{remainder},
-         ++ where the remainder is smaller (see \spadfunFrom{sizeLess?}{EuclideanDomain})
-         ++ than the divisor y.
-      "quo" : (%,%) -> %
-         ++ x quo y is the same as \spad{divide(x,y).quotient}.
-         ++ See \spadfunFrom{divide}{EuclideanDomain}.
-      "rem": (%,%) -> %
-         ++ x rem y is the same as \spad{divide(x,y).remainder}.
-         ++ See \spadfunFrom{divide}{EuclideanDomain}.
-      extendedEuclidean: (%,%) -> Record(coef1:%,coef2:%,generator:%)
-                     -- formerly called princIdeal
-            ++ extendedEuclidean(x,y) returns a record rec where
-            ++ \spad{rec.coef1*x+rec.coef2*y = rec.generator} and
-            ++ rec.generator is a gcd of x and y.
-            ++ The gcd is unique only
-            ++ up to associates if \spadatt{canonicalUnitNormal} is not asserted.
-            ++ \spadfun{principalIdeal} provides a version of this operation
-            ++ which accepts an arbitrary length list of arguments.
-      extendedEuclidean: (%,%,%) -> Union(Record(coef1:%,coef2:%),"failed")
-                     -- formerly called expressIdealElt
-          ++ extendedEuclidean(x,y,z) either returns a record rec
-          ++ where \spad{rec.coef1*x+rec.coef2*y=z} or returns "failed"
-          ++ if z cannot be expressed as a linear combination of x and y.
-      multiEuclidean: (List %,%) -> Union(List %,"failed")
-          ++ multiEuclidean([f1,...,fn],z) returns a list of coefficients
-          ++ \spad{[a1, ..., an]} such that
-          ++ \spad{ z / prod fi = sum aj/fj}.
-          ++ If no such list of coefficients exists, "failed" is returned.
-    add
-      -- declarations
-      x,y,z: %
-      l: List %
-      -- definitions
-      sizeLess?(x,y) ==
-            zero? y => false
-            zero? x => true
-            euclideanSize(x)<euclideanSize(y)
-      x quo y == divide(x,y).quotient --divide must be user-supplied
-      x rem y == divide(x,y).remainder
-      x exquo y ==
-         zero? x => 0
-         zero? y => "failed"
-         qr:=divide(x,y)
-         zero?(qr.remainder) => qr.quotient
-         "failed"
-      gcd(x,y) ==                --Euclidean Algorithm
-         x:=unitCanonical x
-         y:=unitCanonical y
-         while not zero? y repeat
-            (x,y):= (y,x rem y)
-            y:=unitCanonical y             -- this doesn't affect the
-                                           -- correctness of Euclid's algorithm,
-                                           -- but
-                                           -- a) may improve performance
-                                           -- b) ensures gcd(x,y)=gcd(y,x)
-                                           --    if canonicalUnitNormal
-         x
-      IdealElt ==> Record(coef1:%,coef2:%,generator:%)
-      unitNormalizeIdealElt(s:IdealElt):IdealElt ==
-         (u,c,a):=unitNormal(s.generator)
---         one? a => s
-         (a = 1) => s
-         [a*s.coef1,a*s.coef2,c]$IdealElt
-      extendedEuclidean(x,y) ==         --Extended Euclidean Algorithm
-         s1:=unitNormalizeIdealElt([1$%,0$%,x]$IdealElt)
-         s2:=unitNormalizeIdealElt([0$%,1$%,y]$IdealElt)
-         zero? y => s1
-         zero? x => s2
-         while not zero?(s2.generator) repeat
-            qr:= divide(s1.generator, s2.generator)
-            s3:=[s1.coef1 - qr.quotient * s2.coef1,
-                 s1.coef2 - qr.quotient * s2.coef2, qr.remainder]$IdealElt
-            s1:=s2
-            s2:=unitNormalizeIdealElt s3
-         if not(zero?(s1.coef1)) and not sizeLess?(s1.coef1,y)
-           then
-              qr:= divide(s1.coef1,y)
-              s1.coef1:= qr.remainder
-              s1.coef2:= s1.coef2 + qr.quotient * x
-              s1 := unitNormalizeIdealElt s1
-         s1
-
-      TwoCoefs ==> Record(coef1:%,coef2:%)
-      extendedEuclidean(x,y,z) ==
-         zero? z => [0,0]$TwoCoefs
-         s:= extendedEuclidean(x,y)
-         (w:= z exquo s.generator) case "failed" => "failed"
-         zero? y =>
-            [s.coef1 * w, s.coef2 * w]$TwoCoefs
-         qr:= divide((s.coef1 * w), y)
-         [qr.remainder, s.coef2 * w + qr.quotient * x]$TwoCoefs
-      principalIdeal l ==
-         l = [] => error "empty list passed to principalIdeal"
-         rest l = [] =>
-              uca:=unitNormal(first l)
-              [[uca.unit],uca.canonical]
-         rest rest l = [] =>
-             u:= extendedEuclidean(first l,second l)
-             [[u.coef1, u.coef2], u.generator]
-         v:=principalIdeal rest l
-         u:= extendedEuclidean(first l,v.generator)
-         [[u.coef1,:[u.coef2*vv for vv in v.coef]],u.generator]
-      expressIdealMember(l,z) ==
-         z = 0 => [0 for v in l]
-         pid := principalIdeal l
-         (q := z exquo (pid.generator)) case "failed" => "failed"
-         [q*v for v in pid.coef]
-      multiEuclidean(l,z) ==
-         n := #l
-         zero? n => error "empty list passed to multiEuclidean"
-         n = 1 => [z]
-         l1 := copy l
-         l2 := split!(l1, n quo 2)
-         u:= extendedEuclidean(*/l1, */l2, z)
-         u case "failed" => "failed"
-         v1 := multiEuclidean(l1,u.coef2)
-         v1 case "failed" => "failed"
-         v2 := multiEuclidean(l2,u.coef1)
-         v2 case "failed" => "failed"
-         concat(v1,v2)
-
-@
-\section{EUCDOM.lsp BOOTSTRAP}
-{\bf EUCDOM} depends on {\bf INT} which depends on {\bf EUCDOM}. 
-We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf EUCDOM}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf EUCDOM.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Note that this code is not included in the generated catdef.spad file.
-
-\subsection{The Lisp Implementation}
-\subsubsection{EUCDOM;VersionCheck}
-This implements the bootstrap code for {\bf EuclideanDomain}. 
-The call to {\bf VERSIONCHECK} is a legacy check to ensure that
-we did not load algebra code from a previous system version (which
-would not run due to major surgical changes in the system) without
-recompiling.
-<<EUCDOM;VersionCheck>>=
-(|/VERSIONCHECK| 2) 
-
-@
-\subsubsection{The Domain Cache Variable}
-We create a variable which is formed by concatenating the string
-``{\bf ;AL}'' to the domain name forming, in this case,
-``{\bf EuclideanDomain;AL}''. The variable has the initial value
-at load time of a list of one element, {\bf NIL}. This list is
-a data structure that will be modified to hold an executable 
-function. This function is created the first time the domain is
-used which it replaces the {\bf NIL}.
-<<EuclideanDomain;AL>>=
-(SETQ |EuclideanDomain;AL| (QUOTE NIL)) 
-
-@
-\subsubsection{The Domain Function}
-When you call a domain the code is pretty simple at the top
-level. This code will check to see if this domain has ever been
-used. It does this by checking the value of the cached domain
-variable (which is the domain name {\bf EuclideanDomain} concatenated
-with the string ``{\bf ;AL}'' to form the cache variable name which
-is {\bf EuclideanDomain;AL}).
-
-If this value is NIL we have never executed this function
-before. If it is not NIL we have executed this function before and
-we need only return the cached function which was stored in the
-cache variable.
-
-If this is the first time this function is called, the cache
-variable is NIL and we execute the other branch of the conditional.
-This calls a function which 
-\begin{enumerate}
-\item creates a procedure
-\item returns the procedure as a value.
-\end{enumerate}
-This procedure replaces the cached variable {\bf EuclideanDomain;AL}
-value so it will be non-NIL the second time this domain is used.
-Thus the work of building the domain only happens once.
-
-If this function has never been called before we call the 
-<<EuclideanDomain>>=
-(DEFUN |EuclideanDomain| NIL 
-  (LET (#:G83585) 
-    (COND 
-      (|EuclideanDomain;AL|)
-      (T (SETQ |EuclideanDomain;AL| (|EuclideanDomain;|)))))) 
-
-@
-\subsubsection{The First Call Domain Function}
-<<EuclideanDomain;>>=
-(DEFUN |EuclideanDomain;| NIL 
-  (PROG (#1=#:G83583) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| 
-            (|PrincipalIdealDomain|)
-            (|mkCategory| 
-              (QUOTE |domain|)
-              (QUOTE (
-                ((|sizeLess?| ((|Boolean|) |$| |$|)) T)
-                ((|euclideanSize| ((|NonNegativeInteger|) |$|)) T)
-                ((|divide| 
-                  ((|Record| 
-                    (|:| |quotient| |$|)
-                    (|:| |remainder| |$|))
-                  |$| |$|)) T)
-                ((|quo| (|$| |$| |$|)) T)
-                ((|rem| (|$| |$| |$|)) T)
-                ((|extendedEuclidean| 
-                  ((|Record| 
-                    (|:| |coef1| |$|)
-                    (|:| |coef2| |$|)
-                    (|:| |generator| |$|))
-                  |$| |$|)) T)
-                ((|extendedEuclidean| 
-                  ((|Union| 
-                      (|Record| (|:| |coef1| |$|) (|:| |coef2| |$|))
-                      "failed")
-                    |$| |$| |$|)) T)
-                ((|multiEuclidean| 
-                  ((|Union| 
-                      (|List| |$|)
-                      "failed") 
-                   (|List| |$|) |$|)) T)))
-              NIL 
-              (QUOTE ((|List| |$|) (|NonNegativeInteger|) (|Boolean|)))
-              NIL)) 
-            |EuclideanDomain|)
-        (SETELT #1# 0 (QUOTE (|EuclideanDomain|))))))) 
-
-@
-\subsubsection{EUCDOM;MAKEPROP}
-<<EUCDOM;MAKEPROP>>=
-(MAKEPROP (QUOTE |EuclideanDomain|) (QUOTE NILADIC) T) 
-
-@
-<<EUCDOM.lsp BOOTSTRAP>>=
-<<EUCDOM;VersionCheck>>
-<<EuclideanDomain;AL>>
-<<EuclideanDomain>>
-<<EuclideanDomain;>>
-<<EUCDOM;MAKEPROP>>
-@
-\section{EUCDOM-.lsp BOOTSTRAP}
-{\bf EUCDOM-} depends on {\bf EUCDOM}. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf EUCDOM-}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf EUCDOM-.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Note that this code is not included in the generated catdef.spad file.
-
-\subsection{The Lisp Implementation}
-\subsubsection{EUCDOM-;VersionCheck}
-This implements the bootstrap code for {\bf EuclideanDomain}. 
-The call to {\bf VERSIONCHECK} is a legacy check to ensure that
-we did not load algebra code from a previous system version (which
-would not run due to major surgical changes in the system) without
-recompiling.
-<<EUCDOM-;VersionCheck>>=
-(|/VERSIONCHECK| 2) 
-
-@
-\subsubsection{EUCDOM-;sizeLess?;2SB;1}
-<<EUCDOM-;sizeLess?;2SB;1>>=
-(DEFUN |EUCDOM-;sizeLess?;2SB;1| (|x| |y| $)
- (COND
-  ((SPADCALL |y| (QREFELT $ 8)) (QUOTE NIL))
-  ((SPADCALL |x| (QREFELT $ 8)) (QUOTE T))
-  ((QUOTE T)
-   (< (SPADCALL |x| (QREFELT $ 10)) (SPADCALL |y| (QREFELT $ 10)))))) 
-
-@
-
-\subsubsection{EUCDOM-;quo;3S;2}
-<<EUCDOM-;quo;3S;2>>=
-(DEFUN |EUCDOM-;quo;3S;2| (|x| |y| $)
- (QCAR (SPADCALL |x| |y| (QREFELT $ 13)))) 
-
-@
-\subsubsection{EUCDOM-;rem;3S;3}
-<<EUCDOM-;rem;3S;3>>=
-(DEFUN |EUCDOM-;rem;3S;3| (|x| |y| $)
- (QCDR (SPADCALL |x| |y| (QREFELT $ 13)))) 
-
-@
-\subsubsection{EUCDOM-;exquo;2SU;4}
-<<EUCDOM-;exquo;2SU;4>>=
-(DEFUN |EUCDOM-;exquo;2SU;4| (|x| |y| $)
- (PROG (|qr|)
-  (RETURN
-   (SEQ
-    (COND
-     ((SPADCALL |x| (QREFELT $ 8)) (CONS 0 (|spadConstant| $ 16)))
-     ((SPADCALL |y| (QREFELT $ 8)) (CONS 1 "failed"))
-     ((QUOTE T)
-      (SEQ
-       (LETT |qr|
-        (SPADCALL |x| |y| (QREFELT $ 13))
-        |EUCDOM-;exquo;2SU;4|)
-       (EXIT
-        (COND
-         ((SPADCALL (QCDR |qr|) (QREFELT $ 8)) (CONS 0 (QCAR |qr|)))
-         ((QUOTE T) (CONS 1 "failed"))))))))))) 
-
-@
-\subsubsection{EUCDOM-;gcd;3S;5}
-<<EUCDOM-;gcd;3S;5>>=
-(DEFUN |EUCDOM-;gcd;3S;5| (|x| |y| $)
- (PROG (|#G13| |#G14|)
-  (RETURN
-   (SEQ
-    (LETT |x| (SPADCALL |x| (QREFELT $ 19)) |EUCDOM-;gcd;3S;5|)
-    (LETT |y| (SPADCALL |y| (QREFELT $ 19)) |EUCDOM-;gcd;3S;5|)
-    (SEQ G190
-     (COND
-      ((NULL
-       (COND 
-        ((SPADCALL |y| (QREFELT $ 8)) (QUOTE NIL))
-        ((QUOTE T) (QUOTE T))))
-       (GO G191)))
-     (SEQ
-      (PROGN
-       (LETT |#G13| |y| |EUCDOM-;gcd;3S;5|)
-       (LETT |#G14| (SPADCALL |x| |y| (QREFELT $ 20)) |EUCDOM-;gcd;3S;5|)
-       (LETT |x| |#G13| |EUCDOM-;gcd;3S;5|)
-       (LETT |y| |#G14| |EUCDOM-;gcd;3S;5|))
-      (EXIT
-       (LETT |y| (SPADCALL |y| (QREFELT $ 19)) |EUCDOM-;gcd;3S;5|)))
-     NIL
-     (GO G190)
-    G191
-   (EXIT NIL))
-  (EXIT |x|))))) 
-
-@
-\subsubsection{EUCDOM-;unitNormalizeIdealElt}
-<<EUCDOM-;unitNormalizeIdealElt>>=
-(DEFUN |EUCDOM-;unitNormalizeIdealElt| (|s| $)
- (PROG (|#G16| |u| |c| |a|)
-  (RETURN
-   (SEQ
-    (PROGN
-     (LETT |#G16| 
-       (SPADCALL (QVELT |s| 2) (QREFELT $ 23))
-       |EUCDOM-;unitNormalizeIdealElt|)
-     (LETT |u| (QVELT |#G16| 0) |EUCDOM-;unitNormalizeIdealElt|)
-     (LETT |c| (QVELT |#G16| 1) |EUCDOM-;unitNormalizeIdealElt|)
-     (LETT |a| (QVELT |#G16| 2) |EUCDOM-;unitNormalizeIdealElt|)
-     |#G16|)
-    (EXIT
-     (COND
-      ((SPADCALL |a| (|spadConstant| $ 24) (QREFELT $ 25)) |s|)
-      ((QUOTE T)
-       (VECTOR
-        (SPADCALL |a| (QVELT |s| 0) (QREFELT $ 26))
-        (SPADCALL |a| (QVELT |s| 1) (QREFELT $ 26))
-        |c|)))))))) 
-
-@
-\subsubsection{EUCDOM-;extendedEuclidean;2SR;7}
-<<EUCDOM-;extendedEuclidean;2SR;7>>=
-(DEFUN |EUCDOM-;extendedEuclidean;2SR;7| (|x| |y| $)
- (PROG (|s3| |s2| |qr| |s1|)
-  (RETURN
-   (SEQ
-    (LETT |s1|
-     (|EUCDOM-;unitNormalizeIdealElt|
-      (VECTOR (|spadConstant| $ 24) (|spadConstant| $ 16) |x|)
-       $)
-     |EUCDOM-;extendedEuclidean;2SR;7|)
-    (LETT |s2|
-     (|EUCDOM-;unitNormalizeIdealElt|
-      (VECTOR (|spadConstant| $ 16) (|spadConstant| $ 24) |y|)
-      $)
-      |EUCDOM-;extendedEuclidean;2SR;7|)
-    (EXIT
-     (COND
-      ((SPADCALL |y| (QREFELT $ 8)) |s1|)
-      ((SPADCALL |x| (QREFELT $ 8)) |s2|)
-      ((QUOTE T)
-       (SEQ
-        (SEQ
-         G190
-         (COND
-          ((NULL 
-            (COND 
-             ((SPADCALL (QVELT |s2| 2) (QREFELT $ 8)) (QUOTE NIL))
-             ((QUOTE T) (QUOTE T))))
-           (GO G191)))
-         (SEQ
-          (LETT |qr|
-           (SPADCALL (QVELT |s1| 2) (QVELT |s2| 2) (QREFELT $ 13))
-           |EUCDOM-;extendedEuclidean;2SR;7|)
-          (LETT |s3|
-           (VECTOR
-            (SPADCALL (QVELT |s1| 0)
-             (SPADCALL (QCAR |qr|) (QVELT |s2| 0) (QREFELT $ 26))
-             (QREFELT $ 27))
-            (SPADCALL (QVELT |s1| 1)
-             (SPADCALL (QCAR |qr|) (QVELT |s2| 1) (QREFELT $ 26))
-             (QREFELT $ 27))
-            (QCDR |qr|))
-           |EUCDOM-;extendedEuclidean;2SR;7|)
-          (LETT |s1| |s2| |EUCDOM-;extendedEuclidean;2SR;7|)
-          (EXIT
-           (LETT |s2|
-            (|EUCDOM-;unitNormalizeIdealElt| |s3| $)
-            |EUCDOM-;extendedEuclidean;2SR;7|)))
-         NIL
-         (GO G190)
-         G191
-         (EXIT NIL))
-        (COND
-         ((NULL (SPADCALL (QVELT |s1| 0) (QREFELT $ 8)))
-           (COND
-            ((NULL (SPADCALL (QVELT |s1| 0) |y| (QREFELT $ 28)))
-             (SEQ
-              (LETT |qr|
-               (SPADCALL (QVELT |s1| 0) |y| (QREFELT $ 13))
-               |EUCDOM-;extendedEuclidean;2SR;7|)
-              (QSETVELT |s1| 0 (QCDR |qr|))
-              (QSETVELT |s1| 1
-               (SPADCALL (QVELT |s1| 1)
-                (SPADCALL (QCAR |qr|) |x| (QREFELT $ 26)) (QREFELT $ 29)))
-              (EXIT
-               (LETT |s1|
-                (|EUCDOM-;unitNormalizeIdealElt| |s1| $)
-                |EUCDOM-;extendedEuclidean;2SR;7|)))))))
-        (EXIT |s1|))))))))) 
-
-@
-\subsubsection{EUCDOM-;extendedEuclidean;3SU;8}
-<<EUCDOM-;extendedEuclidean;3SU;8>>=
-(DEFUN |EUCDOM-;extendedEuclidean;3SU;8| (|x| |y| |z| $)
- (PROG (|s| |w| |qr|)
-  (RETURN
-   (SEQ
-    (COND
-     ((SPADCALL |z| (QREFELT $ 8))
-       (CONS 0 (CONS (|spadConstant| $ 16) (|spadConstant| $ 16))))
-     ((QUOTE T)
-       (SEQ
-        (LETT |s|
-         (SPADCALL |x| |y| (QREFELT $ 32))
-         |EUCDOM-;extendedEuclidean;3SU;8|)
-        (LETT |w|
-         (SPADCALL |z| (QVELT |s| 2) (QREFELT $ 33))
-         |EUCDOM-;extendedEuclidean;3SU;8|)
-        (EXIT
-         (COND
-          ((QEQCAR |w| 1) (CONS 1 "failed"))
-          ((SPADCALL |y| (QREFELT $ 8))
-            (CONS 0
-             (CONS (SPADCALL (QVELT |s| 0) (QCDR |w|) (QREFELT $ 26))
-              (SPADCALL (QVELT |s| 1) (QCDR |w|) (QREFELT $ 26)))))
-          ((QUOTE T)
-           (SEQ
-            (LETT |qr|
-             (SPADCALL
-              (SPADCALL (QVELT |s| 0) (QCDR |w|) (QREFELT $ 26))
-              |y|
-              (QREFELT $ 13))
-             |EUCDOM-;extendedEuclidean;3SU;8|)
-            (EXIT
-             (CONS 0
-              (CONS (QCDR |qr|)
-               (SPADCALL
-                (SPADCALL (QVELT |s| 1) (QCDR |w|) (QREFELT $ 26))
-                (SPADCALL (QCAR |qr|) |x| (QREFELT $ 26))
-                (QREFELT $ 29)))))))))))))))) 
-
-@
-\subsubsection{EUCDOM-;principalIdeal;LR;9}
-<<EUCDOM-;principalIdeal;LR;9>>=
-(DEFUN |EUCDOM-;principalIdeal;LR;9| (|l| $)
- (PROG (|uca| |v| |u| #0=#:G1497 |vv| #1=#:G1498)
-  (RETURN
-   (SEQ
-    (COND
-     ((SPADCALL |l| NIL (QREFELT $ 38))
-       (|error| "empty list passed to principalIdeal"))
-     ((SPADCALL (CDR |l|) NIL (QREFELT $ 38))
-       (SEQ
-        (LETT |uca|
-         (SPADCALL (|SPADfirst| |l|) (QREFELT $ 23))
-         |EUCDOM-;principalIdeal;LR;9|)
-        (EXIT (CONS (LIST (QVELT |uca| 0)) (QVELT |uca| 1)))))
-     ((SPADCALL (CDR (CDR |l|)) NIL (QREFELT $ 38))
-       (SEQ
-        (LETT |u|
-         (SPADCALL (|SPADfirst| |l|)
-          (SPADCALL |l| (QREFELT $ 39)) (QREFELT $ 32))
-         |EUCDOM-;principalIdeal;LR;9|)
-        (EXIT (CONS (LIST (QVELT |u| 0) (QVELT |u| 1)) (QVELT |u| 2)))))
-     ((QUOTE T)
-       (SEQ
-        (LETT |v|
-         (SPADCALL (CDR |l|) (QREFELT $ 42))
-         |EUCDOM-;principalIdeal;LR;9|)
-        (LETT |u|
-         (SPADCALL (|SPADfirst| |l|) (QCDR |v|) (QREFELT $ 32))
-         |EUCDOM-;principalIdeal;LR;9|)
-        (EXIT
-         (CONS 
-          (CONS (QVELT |u| 0)
-           (PROGN
-            (LETT #0# NIL |EUCDOM-;principalIdeal;LR;9|)
-            (SEQ
-             (LETT |vv| NIL |EUCDOM-;principalIdeal;LR;9|)
-             (LETT #1# (QCAR |v|) |EUCDOM-;principalIdeal;LR;9|)
-             G190
-             (COND
-              ((OR (ATOM #1#)
-                   (PROGN
-                    (LETT |vv| (CAR #1#) |EUCDOM-;principalIdeal;LR;9|) NIL))
-               (GO G191)))
-             (SEQ
-              (EXIT
-               (LETT #0#
-                (CONS (SPADCALL (QVELT |u| 1) |vv| (QREFELT $ 26))
-                   #0#)
-                |EUCDOM-;principalIdeal;LR;9|)))
-             (LETT #1# (CDR #1#)
-              |EUCDOM-;principalIdeal;LR;9|)
-             (GO G190)
-             G191
-             (EXIT (NREVERSE0 #0#)))))
-          (QVELT |u| 2)))))))))) 
-
-@
-\subsubsection{EUCDOM-;expressIdealMember;LSU;10}
-<<EUCDOM-;expressIdealMember;LSU;10>>=
-(DEFUN |EUCDOM-;expressIdealMember;LSU;10| (|l| |z| $)
- (PROG (#0=#:G1513 #1=#:G1514 |pid| |q| #2=#:G1515 |v| #3=#:G1516)
-  (RETURN
-   (SEQ
-    (COND
-     ((SPADCALL |z| (|spadConstant| $ 16) (QREFELT $ 25))
-      (CONS 0
-       (PROGN
-        (LETT #0# NIL |EUCDOM-;expressIdealMember;LSU;10|)
-        (SEQ
-         (LETT |v| NIL |EUCDOM-;expressIdealMember;LSU;10|)
-         (LETT #1# |l| |EUCDOM-;expressIdealMember;LSU;10|)
-         G190
-         (COND
-          ((OR (ATOM #1#)
-               (PROGN
-                (LETT |v| (CAR #1#) |EUCDOM-;expressIdealMember;LSU;10|) NIL))
-           (GO G191)))
-         (SEQ 
-          (EXIT
-           (LETT #0#
-            (CONS (|spadConstant| $ 16) #0#)
-            |EUCDOM-;expressIdealMember;LSU;10|)))
-         (LETT #1# (CDR #1#) |EUCDOM-;expressIdealMember;LSU;10|)
-         (GO G190)
-         G191
-        (EXIT (NREVERSE0 #0#))))))
-     ((QUOTE T)
-      (SEQ
-       (LETT |pid|
-        (SPADCALL |l| (QREFELT $ 42))
-        |EUCDOM-;expressIdealMember;LSU;10|)
-       (LETT |q|
-        (SPADCALL |z| (QCDR |pid|) (QREFELT $ 33))
-        |EUCDOM-;expressIdealMember;LSU;10|)
-       (EXIT
-        (COND
-         ((QEQCAR |q| 1) (CONS 1 "failed"))
-         ((QUOTE T)
-          (CONS 0
-           (PROGN
-            (LETT #2# NIL |EUCDOM-;expressIdealMember;LSU;10|)
-            (SEQ
-             (LETT |v| NIL |EUCDOM-;expressIdealMember;LSU;10|)
-             (LETT #3# (QCAR |pid|) |EUCDOM-;expressIdealMember;LSU;10|)
-             G190
-             (COND
-              ((OR (ATOM #3#)
-                   (PROGN
-                    (LETT |v| (CAR #3#) |EUCDOM-;expressIdealMember;LSU;10|)
-                    NIL))
-               (GO G191)))
-             (SEQ
-              (EXIT
-              (LETT #2#
-               (CONS (SPADCALL (QCDR |q|) |v| (QREFELT $ 26))
-                  #2#) 
-               |EUCDOM-;expressIdealMember;LSU;10|)))
-             (LETT #3# (CDR #3#) |EUCDOM-;expressIdealMember;LSU;10|)
-             (GO G190)
-             G191
-             (EXIT (NREVERSE0 #2#))))))))))))))) 
-
-@
-\subsubsection{EUCDOM-;multiEuclidean;LSU;11}
-<<EUCDOM-;multiEuclidean;LSU;11>>=
-(DEFUN |EUCDOM-;multiEuclidean;LSU;11| (|l| |z| $)
- (PROG (|n| |l1| |l2| #0=#:G1405 #1=#:G1535 #2=#:G1522 #3=#:G1520 
-        #4=#:G1521 #5=#:G1406 #6=#:G1536 #7=#:G1525 #8=#:G1523 #9=#:G1524 
-        |u| |v1| |v2|)
-  (RETURN
-   (SEQ
-    (LETT |n| (LENGTH |l|) |EUCDOM-;multiEuclidean;LSU;11|)
-    (EXIT
-     (COND
-      ((ZEROP |n|) (|error| "empty list passed to multiEuclidean"))
-      ((EQL |n| 1) (CONS 0 (LIST |z|)))
-      ((QUOTE T)
-       (SEQ
-        (LETT |l1|
-         (SPADCALL |l| (QREFELT $ 46)) |EUCDOM-;multiEuclidean;LSU;11|)
-        (LETT |l2|
-         (SPADCALL |l1| (QUOTIENT2 |n| 2) (QREFELT $ 48))
-         |EUCDOM-;multiEuclidean;LSU;11|)
-        (LETT |u|
-         (SPADCALL
-          (PROGN
-           (LETT #4# NIL |EUCDOM-;multiEuclidean;LSU;11|)
-           (SEQ
-            (LETT #0# NIL |EUCDOM-;multiEuclidean;LSU;11|)
-            (LETT #1# |l1| |EUCDOM-;multiEuclidean;LSU;11|)
-            G190
-            (COND
-             ((OR (ATOM #1#)
-                  (PROGN
-                   (LETT #0# (CAR #1#) |EUCDOM-;multiEuclidean;LSU;11|)
-                   NIL))
-              (GO G191)))
-            (SEQ 
-             (EXIT
-              (PROGN
-               (LETT #2# #0# |EUCDOM-;multiEuclidean;LSU;11|)
-               (COND
-                (#4#
-                 (LETT #3#
-                  (SPADCALL #3# #2# (QREFELT $ 26))
-                  |EUCDOM-;multiEuclidean;LSU;11|))
-                ((QUOTE T)
-                 (PROGN
-                  (LETT #3# #2# |EUCDOM-;multiEuclidean;LSU;11|)
-                  (LETT #4# (QUOTE T) |EUCDOM-;multiEuclidean;LSU;11|)))))))
-            (LETT #1# (CDR #1#) |EUCDOM-;multiEuclidean;LSU;11|)
-            (GO G190)
-            G191
-            (EXIT NIL))
-           (COND (#4# #3#) ((QUOTE T) (|spadConstant| $ 24))))
-          (PROGN
-           (LETT #9# NIL |EUCDOM-;multiEuclidean;LSU;11|)
-           (SEQ
-            (LETT #5# NIL |EUCDOM-;multiEuclidean;LSU;11|)
-            (LETT #6# |l2| |EUCDOM-;multiEuclidean;LSU;11|)
-            G190
-            (COND
-             ((OR (ATOM #6#)
-                  (PROGN
-                   (LETT #5# (CAR #6#) |EUCDOM-;multiEuclidean;LSU;11|)
-                   NIL))
-              (GO G191)))
-            (SEQ
-             (EXIT
-              (PROGN
-               (LETT #7# #5# |EUCDOM-;multiEuclidean;LSU;11|)
-               (COND
-                (#9#
-                 (LETT #8#
-                  (SPADCALL #8# #7# (QREFELT $ 26))
-                  |EUCDOM-;multiEuclidean;LSU;11|))
-                ((QUOTE T)
-                 (PROGN
-                  (LETT #8# #7# |EUCDOM-;multiEuclidean;LSU;11|)
-                  (LETT #9# (QUOTE T) |EUCDOM-;multiEuclidean;LSU;11|)))))))
-            (LETT #6# (CDR #6#) |EUCDOM-;multiEuclidean;LSU;11|)
-            (GO G190)
-            G191
-            (EXIT NIL))
-           (COND (#9# #8#) ((QUOTE T) (|spadConstant| $ 24))))
-          |z| (QREFELT $ 49))
-         |EUCDOM-;multiEuclidean;LSU;11|)
-        (EXIT
-         (COND
-          ((QEQCAR |u| 1) (CONS 1 "failed"))
-          ((QUOTE T)
-           (SEQ
-            (LETT |v1|
-             (SPADCALL |l1| (QCDR (QCDR |u|)) (QREFELT $ 50))
-             |EUCDOM-;multiEuclidean;LSU;11|)
-            (EXIT
-             (COND
-              ((QEQCAR |v1| 1) (CONS 1 "failed"))
-              ((QUOTE T)
-               (SEQ
-                (LETT |v2|
-                 (SPADCALL |l2| (QCAR (QCDR |u|)) (QREFELT $ 50))
-                 |EUCDOM-;multiEuclidean;LSU;11|)
-                (EXIT
-                 (COND
-                  ((QEQCAR |v2| 1) (CONS 1 "failed"))
-                  ((QUOTE T)
-                   (CONS 0
-                    (SPADCALL
-                     (QCDR |v1|)
-                     (QCDR |v2|)
-                     (QREFELT $ 51)))))))))))))))))))))) 
-
-@
-\subsubsection{EuclideanDomain\&}
-<<EuclideanDomainAmp>>=
-(DEFUN |EuclideanDomain&| (|#1|)
- (PROG (DV$1 |dv$| $ |pv$|)
-  (RETURN
-   (PROGN 
-    (LETT DV$1 (|devaluate| |#1|) . #0=(|EuclideanDomain&|))
-    (LETT |dv$| (LIST (QUOTE |EuclideanDomain&|) DV$1) . #0#)
-    (LETT $ (GETREFV 53) . #0#)
-    (QSETREFV $ 0 |dv$|)
-    (QSETREFV $ 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #0#))
-    (|stuffDomainSlots| $)
-    (QSETREFV $ 6 |#1|)
-    $)))) 
-
-@
-\subsubsection{EUCDOM-;MAKEPROP}
-<<EUCDOM-;MAKEPROP>>=
-(MAKEPROP
- (QUOTE |EuclideanDomain&|)
- (QUOTE |infovec|)
- (LIST
-  (QUOTE #(NIL NIL NIL NIL NIL NIL (|local| |#1|) (|Boolean|) (0 . |zero?|)
-  (|NonNegativeInteger|) (5 . |euclideanSize|) |EUCDOM-;sizeLess?;2SB;1|
-  (|Record| (|:| |quotient| $) (|:| |remainder| $)) (10 . |divide|)
-  |EUCDOM-;quo;3S;2| |EUCDOM-;rem;3S;3| (16 . |Zero|)
-  (|Union| $ (QUOTE "failed")) |EUCDOM-;exquo;2SU;4| (20 . |unitCanonical|)
-  (25 . |rem|) |EUCDOM-;gcd;3S;5|
-  (|Record| (|:| |unit| $) (|:| |canonical| $) (|:| |associate| $))
-  (31 . |unitNormal|) (36 . |One|) (40 . =) (46 . *) (52 . -)
-  (58 . |sizeLess?|) (64 . +) 
-  (|Record| (|:| |coef1| $) (|:| |coef2| $) (|:| |generator| $))
-  |EUCDOM-;extendedEuclidean;2SR;7|
-  (70 . |extendedEuclidean|) (76 . |exquo|) 
-  (|Record| (|:| |coef1| $) (|:| |coef2| $))
-  (|Union| 34 (QUOTE "failed")) |EUCDOM-;extendedEuclidean;3SU;8|
-  (|List| 6) (82 . =) (88 . |second|) 
-  (|Record| (|:| |coef| 41) (|:| |generator| $))
-  (|List| $) (93 . |principalIdeal|) |EUCDOM-;principalIdeal;LR;9| 
-  (|Union| 41 (QUOTE "failed")) |EUCDOM-;expressIdealMember;LSU;10|
-  (98 . |copy|) (|Integer|) (103 . |split!|) (109 . |extendedEuclidean|)
-  (116 . |multiEuclidean|) (122 . |concat|) |EUCDOM-;multiEuclidean;LSU;11|))
-  (QUOTE
-   #(|sizeLess?| 128 |rem| 134 |quo| 140 |principalIdeal| 146 
-     |multiEuclidean| 151 |gcd| 157 |extendedEuclidean| 163 
-     |exquo| 176 |expressIdealMember| 182))
-  (QUOTE NIL)
-  (CONS (|makeByteWordVec2| 1 (QUOTE NIL))
-   (CONS (QUOTE #())
-    (CONS (QUOTE #())
-     (|makeByteWordVec2| 52 (QUOTE (1 6 7 0 8 1 6 9 0 10 2 6 12 0 0 13 0 
-       6 0 16 1 6 0 0 19 2 6 0 0 0 20 1 6 22 0 23 0 6 0 24 2 6 7 0 0 25 2 6 0 
-       0 0 26 2 6 0 0 0 27 2 6 7 0 0 28 2 6 0 0 0 29 2 6 30 0 0 32 2 6 17 0 0 
-       33 2 37 7 0 0 38 1 37 6 0 39 1 6 40 41 42 1 37 0 0 46 2 37 0 0 47 48 3 
-       6 35 0 0 0 49 2 6 44 41 0 50 2 37 0 0 0 51 2 0 7 0 0 11 2 0 0 0 0 15 2 
-       0 0 0 0 14 1 0 40 41 43 2 0 44 41 0 52 2 0 0 0 0 21 3 0 35 0 0 0 36 2 0 
-       30 0 0 31 2 0 17 0 0 18 2 0 44 41 0 45))))))
-  (QUOTE |lookupComplete|))) 
-
-@
-<<EUCDOM-.lsp BOOTSTRAP>>=
-
-<<EUCDOM-;VersionCheck>>
-<<EUCDOM-;sizeLess?;2SB;1>>
-<<EUCDOM-;quo;3S;2>>
-<<EUCDOM-;rem;3S;3>>
-<<EUCDOM-;exquo;2SU;4>>
-<<EUCDOM-;gcd;3S;5>>
-<<EUCDOM-;unitNormalizeIdealElt>>
-<<EUCDOM-;extendedEuclidean;2SR;7>>
-<<EUCDOM-;extendedEuclidean;3SU;8>>
-<<EUCDOM-;principalIdeal;LR;9>>
-<<EUCDOM-;expressIdealMember;LSU;10>>
-<<EUCDOM-;multiEuclidean;LSU;11>>
-<<EuclideanDomainAmp>>
-<<EUCDOM-;MAKEPROP>>
-@
-\section{category FIELD Field}
-<<dot>>=
-"FIELD" -> "EUCDOM"
-"Field()" -> "EuclideanDomain()"
-"FIELD" -> "UFD"
-"Field()" -> "UniqueFactorizationDomain()"
-"FIELD" -> "DIVRING"
-"Field()" -> "DivisionRing()"
-@
-<<category FIELD Field>>=
-)abbrev category FIELD Field
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The category of commutative fields, i.e. commutative rings
-++ where all non-zero elements have multiplicative inverses.
-++ The \spadfun{factor} operation while trivial is useful to have defined.
-++
-++ Axioms:
-++   \spad{a*(b/a) = b}
-++   \spad{inv(a) = 1/a}
-
-Field(): Category == Join(EuclideanDomain,UniqueFactorizationDomain,
-  DivisionRing) with
-    --operations
-      "/": (%,%) -> %
-        ++ x/y divides the element x by the element y.
-        ++ Error: if y is 0.
-      canonicalUnitNormal  ++ either 0 or 1.
-      canonicalsClosed     ++ since \spad{0*0=0}, \spad{1*1=1}
-    add
-      --declarations
-      x,y: %
-      n: Integer
-      -- definitions
-      UCA ==> Record(unit:%,canonical:%,associate:%)
-      unitNormal(x) ==
-          if zero? x then [1$%,0$%,1$%]$UCA else [x,1$%,inv(x)]$UCA
-      unitCanonical(x) == if zero? x then x else 1
-      associates?(x,y) == if zero? x then zero? y else not(zero? y)
-      inv x ==((u:=recip x) case "failed" => error "not invertible"; u)
-      x exquo y == (y=0 => "failed"; x / y)
-      gcd(x,y) == 1
-      euclideanSize(x) == 0
-      prime? x == false
-      squareFree x == x::Factored(%)
-      factor x == x::Factored(%)
-      x / y == (zero? y => error "catdef: division by zero"; x * inv(y))
-      divide(x,y) == [x / y,0]
-
-@
-\section{category FLINEXP FullyLinearlyExplicitRingOver}
-<<dot>>=
-"FLINEXP" -> "LINEXP"
-"FullyLinearlyExplicitRingOver(a:Ring)" -> "LinearlyExplicitRingOver(a:Ring)"
-"FullyLinearlyExplicitRingOver(a:CommutativeRing)" ->
-    "FullyLinearlyExplicitRingOver(a:Ring)"
-@
-<<category FLINEXP FullyLinearlyExplicitRingOver>>=
-)abbrev category FLINEXP FullyLinearlyExplicitRingOver
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ S is \spadtype{FullyLinearlyExplicitRingOver R} means that S is a
-++ \spadtype{LinearlyExplicitRingOver R} and, in addition, if R is a
-++ \spadtype{LinearlyExplicitRingOver Integer}, then so is S
-FullyLinearlyExplicitRingOver(R:Ring):Category ==
-  LinearlyExplicitRingOver R with
-    if (R has LinearlyExplicitRingOver Integer) then
-            LinearlyExplicitRingOver Integer
- add
-  if not(R is Integer) then
-    if (R has LinearlyExplicitRingOver Integer) then
-      reducedSystem(m:Matrix %):Matrix(Integer) ==
-        reducedSystem(reducedSystem(m)@Matrix(R))
-
-      reducedSystem(m:Matrix %, v:Vector %):
-        Record(mat:Matrix(Integer), vec:Vector(Integer)) ==
-          rec := reducedSystem(m, v)@Record(mat:Matrix R, vec:Vector R)
-          reducedSystem(rec.mat, rec.vec)
-
-@
-\section{category GCDDOM GcdDomain}
-<<dot>>=
-"GCDDOM" -> "INTDOM"
-"GcdDomain()" -> "IntegralDomain()"
-@
-<<category GCDDOM GcdDomain>>=
-)abbrev category GCDDOM GcdDomain
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References: Davenport & Trager 1
-++ Description:
-++ This category describes domains where
-++ \spadfun{gcd} can be computed but where there is no guarantee
-++ of the existence of \spadfun{factor} operation for factorisation into irreducibles.
-++ However, if such a \spadfun{factor} operation exist, factorization will be
-++ unique up to order and units.
-
-GcdDomain(): Category == IntegralDomain with
-    --operations
-      gcd: (%,%) -> %
-            ++ gcd(x,y) returns the greatest common divisor of x and y.
-            -- gcd(x,y) = gcd(y,x) in the presence of canonicalUnitNormal,
-            -- but not necessarily elsewhere
-      gcd: List(%) -> %
-            ++ gcd(l) returns the common gcd of the elements in the list l.
-      lcm: (%,%) -> %
-            ++ lcm(x,y) returns the least common multiple of x and y.
-            -- lcm(x,y) = lcm(y,x) in the presence of canonicalUnitNormal,
-            -- but not necessarily elsewhere
-      lcm: List(%) -> %
-            ++ lcm(l) returns the least common multiple of the elements of the list l.
-      gcdPolynomial: (SparseUnivariatePolynomial %, SparseUnivariatePolynomial %) ->
-           SparseUnivariatePolynomial %
-	    ++ gcdPolynomial(p,q) returns the greatest common divisor (gcd) of 
-	    ++ univariate polynomials over the domain
-    add
-      lcm(x: %,y: %) ==
-        y = 0 => 0
-        x = 0 => 0
-        LCM : Union(%,"failed") := y exquo gcd(x,y)
-        LCM case % =>  x * LCM
-        error "bad gcd in lcm computation"
-      lcm(l:List %) == reduce(lcm,l,1,0)
-      gcd(l:List %) == reduce(gcd,l,0,1)
-      SUP ==> SparseUnivariatePolynomial
-      gcdPolynomial(p1,p2) ==
-        zero? p1 => unitCanonical p2
-        zero? p2 => unitCanonical p1
-        c1:= content(p1); c2:= content(p2)
-        p1:= (p1 exquo c1)::SUP %
-        p2:= (p2 exquo c2)::SUP %
-        if (e1:=minimumDegree p1) > 0 then p1:=(p1 exquo monomial(1,e1))::SUP %
-        if (e2:=minimumDegree p2) > 0 then p2:=(p2 exquo monomial(1,e2))::SUP %
-        e1:=min(e1,e2); c1:=gcd(c1,c2)
-        p1:=
-           degree p1 = 0 or degree p2 = 0 => monomial(c1,0)
-           p:= subResultantGcd(p1,p2)
-           degree p = 0 => monomial(c1,0)
-           c2:= gcd(leadingCoefficient p1,leadingCoefficient p2)
-           unitCanonical(c1 * primitivePart(((c2*p) exquo leadingCoefficient p)::SUP %))
-        zero? e1 => p1
-        monomial(1,e1)*p1
-
-@
-\section{GCDDOM.lsp BOOTSTRAP}
-{\bf GCDDOM} needs
-{\bf COMRING} which needs
-{\bf RING} which needs
-{\bf RNG} which needs
-{\bf ABELGRP} which needs
-{\bf CABMON} which needs
-{\bf ABELMON} which needs
-{\bf ABELSG} which needs
-{\bf SETCAT} which needs
-{\bf SINT} which needs
-{\bf UFD} which needs
-{\bf GCDDOM}. 
-We break this chain with {\bf GCDDOM.lsp} which we
-cache here. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf GCDDOM}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf GCDDOM.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version.
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<GCDDOM.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |GcdDomain;AL| (QUOTE NIL)) 
-
-(DEFUN |GcdDomain| NIL 
-  (LET (#:G83171) 
-    (COND 
-      (|GcdDomain;AL|) 
-      (T (SETQ |GcdDomain;AL| (|GcdDomain;|)))))) 
-
-(DEFUN |GcdDomain;| NIL 
-  (PROG (#1=#:G83169) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| 
-            (|IntegralDomain|)
-            (|mkCategory| 
-              (QUOTE |domain|)
-              (QUOTE (
-                ((|gcd| (|$| |$| |$|)) T)
-                ((|gcd| (|$| (|List| |$|))) T)
-                ((|lcm| (|$| |$| |$|)) T)
-                ((|lcm| (|$| (|List| |$|))) T)
-                ((|gcdPolynomial| 
-                  ((|SparseUnivariatePolynomial| |$|)
-                   (|SparseUnivariatePolynomial| |$|)
-                   (|SparseUnivariatePolynomial| |$|)))
-                  T)))
-              NIL 
-              (QUOTE ((|SparseUnivariatePolynomial| |$|) (|List| |$|)))
-              NIL)) 
-            |GcdDomain|)
-        (SETELT #1# 0 (QUOTE (|GcdDomain|))))))) 
-
-(MAKEPROP (QUOTE |GcdDomain|) (QUOTE NILADIC) T) 
-
-@
-\section{GCDDOM-.lsp BOOTSTRAP}
-{\bf GCDDOM-} depends on {\bf GCDDOM}.
-We break this chain with {\bf GCDDOM-.lsp} which we
-cache here. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf GCDDOM-}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf GCDDOM-.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version.
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<GCDDOM-.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(DEFUN |GCDDOM-;lcm;3S;1| (|x| |y| |$|) 
-  (PROG (LCM) 
-    (RETURN 
-      (SEQ 
-        (COND 
-          ((OR 
-              (SPADCALL |y| (|spadConstant| |$| 7) (QREFELT |$| 9))
-              (SPADCALL |x| (|spadConstant| |$| 7) (QREFELT |$| 9))) 
-            (|spadConstant| |$| 7))
-          ((QUOTE T) 
-            (SEQ 
-              (LETT LCM 
-                (SPADCALL |y| 
-                  (SPADCALL |x| |y| (QREFELT |$| 10))
-                  (QREFELT |$| 12))
-                |GCDDOM-;lcm;3S;1|)
-              (EXIT 
-                (COND 
-                  ((QEQCAR LCM 0) (SPADCALL |x| (QCDR LCM) (QREFELT |$| 13)))
-                  ((QUOTE T) (|error| "bad gcd in lcm computation"))))))))))) 
-
-(DEFUN |GCDDOM-;lcm;LS;2| (|l| |$|) 
-  (SPADCALL 
-    (ELT |$| 15)
-    |l|
-    (|spadConstant| |$| 16)
-    (|spadConstant| |$| 7)
-    (QREFELT |$| 19))) 
-
-(DEFUN |GCDDOM-;gcd;LS;3| (|l| |$|) 
-  (SPADCALL 
-    (ELT |$| 10)
-    |l|
-    (|spadConstant| |$| 7)
-    (|spadConstant| |$| 16)
-    (QREFELT |$| 19))) 
-
-(DEFUN |GCDDOM-;gcdPolynomial;3Sup;4| (|p1| |p2| |$|) 
-  (PROG (|e2| |e1| |c1| |p| |c2| #1=#:G83191) 
-    (RETURN 
-      (SEQ 
-        (COND 
-          ((SPADCALL |p1| (QREFELT |$| 24)) (SPADCALL |p2| (QREFELT |$| 25)))
-          ((SPADCALL |p2| (QREFELT |$| 24)) (SPADCALL |p1| (QREFELT |$| 25)))
-          ((QUOTE T) 
-            (SEQ 
-              (LETT |c1| 
-                (SPADCALL |p1| (QREFELT |$| 26))
-                |GCDDOM-;gcdPolynomial;3Sup;4|)
-              (LETT |c2| 
-                (SPADCALL |p2| (QREFELT |$| 26))
-                |GCDDOM-;gcdPolynomial;3Sup;4|)
-              (LETT |p1| 
-                (PROG2 
-                  (LETT #1# 
-                    (SPADCALL |p1| |c1| (QREFELT |$| 27))
-                    |GCDDOM-;gcdPolynomial;3Sup;4|)
-                  (QCDR #1#)
-                  (|check-union| 
-                    (QEQCAR #1# 0)
-                    (|SparseUnivariatePolynomial| (QREFELT |$| 6))
-                    #1#))
-                |GCDDOM-;gcdPolynomial;3Sup;4|)
-              (LETT |p2| 
-                (PROG2 
-                  (LETT #1# 
-                    (SPADCALL |p2| |c2| (QREFELT |$| 27))
-                    |GCDDOM-;gcdPolynomial;3Sup;4|)
-                  (QCDR #1#)
-                  (|check-union| 
-                    (QEQCAR #1# 0)
-                    (|SparseUnivariatePolynomial| (QREFELT |$| 6))
-                    #1#))
-                |GCDDOM-;gcdPolynomial;3Sup;4|)
-              (SEQ 
-                (LETT |e1| 
-                  (SPADCALL |p1| (QREFELT |$| 29))
-                  |GCDDOM-;gcdPolynomial;3Sup;4|)
-                (EXIT 
-                  (COND 
-                    ((|<| 0 |e1|)
-                      (LETT |p1| 
-                        (PROG2 
-                          (LETT #1# 
-                            (SPADCALL |p1| 
-                              (SPADCALL 
-                                (|spadConstant| |$| 16) |e1| (QREFELT |$| 32))
-                              (QREFELT |$| 33))
-                            |GCDDOM-;gcdPolynomial;3Sup;4|)
-                          (QCDR #1#)
-                          (|check-union| 
-                            (QEQCAR #1# 0)
-                            (|SparseUnivariatePolynomial| (QREFELT |$| 6))
-                            #1#))
-                        |GCDDOM-;gcdPolynomial;3Sup;4|)))))
-              (SEQ 
-                (LETT |e2| 
-                  (SPADCALL |p2| (QREFELT |$| 29))
-                  |GCDDOM-;gcdPolynomial;3Sup;4|)
-                (EXIT 
-                  (COND 
-                    ((|<| 0 |e2|)
-                      (LETT |p2| 
-                        (PROG2 
-                          (LETT #1# 
-                            (SPADCALL |p2| 
-                              (SPADCALL 
-                                (|spadConstant| |$| 16)
-                                |e2|
-                                (QREFELT |$| 32)) 
-                              (QREFELT |$| 33)) 
-                            |GCDDOM-;gcdPolynomial;3Sup;4|)
-                          (QCDR #1#)
-                          (|check-union| 
-                            (QEQCAR #1# 0)
-                            (|SparseUnivariatePolynomial| (QREFELT |$| 6))
-                            #1#))
-                        |GCDDOM-;gcdPolynomial;3Sup;4|)))))
-              (LETT |e1| 
-                (MIN |e1| |e2|)
-                |GCDDOM-;gcdPolynomial;3Sup;4|)
-              (LETT |c1| 
-                (SPADCALL |c1| |c2| (QREFELT |$| 10))
-                |GCDDOM-;gcdPolynomial;3Sup;4|)
-              (LETT |p1| 
-                (COND 
-                  ((OR 
-                       (EQL (SPADCALL |p1| (QREFELT |$| 34)) 0)
-                       (EQL (SPADCALL |p2| (QREFELT |$| 34)) 0))
-                     (SPADCALL |c1| 0 (QREFELT |$| 32))) 
-                  ((QUOTE T) 
-                    (SEQ 
-                      (LETT |p| 
-                        (SPADCALL |p1| |p2| (QREFELT |$| 35))
-                        |GCDDOM-;gcdPolynomial;3Sup;4|)
-                      (EXIT 
-                        (COND 
-                          ((EQL (SPADCALL |p| (QREFELT |$| 34)) 0)
-                            (SPADCALL |c1| 0 (QREFELT |$| 32)))
-                          ((QUOTE T) 
-                            (SEQ 
-                              (LETT |c2| 
-                                (SPADCALL 
-                                  (SPADCALL |p1| (QREFELT |$| 36))
-                                  (SPADCALL |p2| (QREFELT |$| 36))
-                                  (QREFELT |$| 10))
-                                |GCDDOM-;gcdPolynomial;3Sup;4|)
-                              (EXIT 
-                                (SPADCALL 
-                                  (SPADCALL |c1| 
-                                    (SPADCALL 
-                                      (PROG2 
-                                        (LETT #1# 
-                                          (SPADCALL 
-                                            (SPADCALL 
-                                              |c2| 
-                                              |p| 
-                                              (QREFELT |$| 37)) 
-                                            (SPADCALL |p| (QREFELT |$| 36))
-                                            (QREFELT |$| 27))
-                                          |GCDDOM-;gcdPolynomial;3Sup;4|) 
-                                       (QCDR #1#)
-                                       (|check-union| 
-                                         (QEQCAR #1# 0)
-                                         (|SparseUnivariatePolynomial| 
-                                           (QREFELT |$| 6))
-                                         #1#)) 
-                                      (QREFELT |$| 38))
-                                    (QREFELT |$| 37))
-                                  (QREFELT |$| 25))))))))))
-                |GCDDOM-;gcdPolynomial;3Sup;4|)
-              (EXIT (COND ((ZEROP |e1|) |p1|) ((QUOTE T) (SPADCALL (SPADCALL (|spadConstant| |$| 16) |e1| (QREFELT |$| 32)) |p1| (QREFELT |$| 39)))))))))))) 
-
-(DEFUN |GcdDomain&| (|#1|) 
-  (PROG (|DV$1| |dv$| |$| |pv$|) 
-    (RETURN 
-      (PROGN 
-        (LETT |DV$1| (|devaluate| |#1|) . #1=(|GcdDomain&|))
-        (LETT |dv$| (LIST (QUOTE |GcdDomain&|) |DV$1|) . #1#)
-        (LETT |$| (GETREFV 42) . #1#)
-        (QSETREFV |$| 0 |dv$|)
-        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
-        (|stuffDomainSlots| |$|)
-        (QSETREFV |$| 6 |#1|)
-        |$|)))) 
-
-(MAKEPROP 
-  (QUOTE |GcdDomain&|)
-  (QUOTE |infovec|)
-  (LIST 
-    (QUOTE 
-      #(NIL NIL NIL NIL NIL NIL 
-        (|local| |#1|)
-        (0 . |Zero|)
-        (|Boolean|)
-        (4 . |=|)
-        (10 . |gcd|)
-        (|Union| |$| (QUOTE "failed"))
-        (16 . |exquo|)
-        (22 . |*|)
-        |GCDDOM-;lcm;3S;1| 
-        (28 . |lcm|)
-        (34 . |One|)
-        (|Mapping| 6 6 6)
-        (|List| 6)
-        (38 . |reduce|)
-        (|List| |$|)
-        |GCDDOM-;lcm;LS;2| 
-        |GCDDOM-;gcd;LS;3| 
-        (|SparseUnivariatePolynomial| 6)
-        (46 . |zero?|)
-        (51 . |unitCanonical|)
-        (56 . |content|)
-        (61 . |exquo|)
-        (|NonNegativeInteger|)
-        (67 . |minimumDegree|)
-        (72 . |Zero|)
-        (76 . |One|)
-        (80 . |monomial|)
-        (86 . |exquo|)
-        (92 . |degree|)
-        (97 . |subResultantGcd|)
-        (103 . |leadingCoefficient|)
-        (108 . |*|)
-        (114 . |primitivePart|)
-        (119 . |*|)
-        (|SparseUnivariatePolynomial| |$|)
-        |GCDDOM-;gcdPolynomial;3Sup;4|)) 
-    (QUOTE #(|lcm| 125 |gcdPolynomial| 136 |gcd| 142))
-    (QUOTE NIL)
-    (CONS 
-      (|makeByteWordVec2| 1 (QUOTE NIL))
-      (CONS 
-        (QUOTE #())
-        (CONS 
-          (QUOTE #()) 
-            (|makeByteWordVec2| 41 
-              (QUOTE (0 6 0 7 2 6 8 0 0 9 2 6 0 0 0 10 2 6 11 0 0 12 2 6 0 0 0
-                      13 2 6 0 0 0 15 0 6 0 16 4 18 6 17 0 6 6 19 1 23 8 0 24
-                      1 23 0 0 25 1 23 6 0 26 2 23 11 0 6 27 1 23 28 0 29 0 23
-                      0 30 0 23 0 31 2 23 0 6 28 32 2 23 11 0 0 33 1 23 28 0
-                      34 2 23 0 0 0 35 1 23 6 0 36 2 23 0 6 0 37 1 23 0 0 38 2
-                      23 0 0 0 39 1 0 0 20 21 2 0 0 0 0 14 2 0 40 40 40 41 1 0
-                      0 20 22)))))) 
-   (QUOTE |lookupComplete|))) 
-
-@
-\section{category INTDOM IntegralDomain}
-<<dot>>=
-"INTDOM" -> "COMRING"
-"IntegralDomain()" -> "CommutativeRing()"
-"INTDOM" -> "ALGEBRA"
-"IntegralDomain()" -> "Algebra(a:CommutativeRing)"
-"INTDOM" -> "ENTIRER"
-"IntegralDomain()" -> "EntireRing()"
-@
-<<category INTDOM IntegralDomain>>=
-)abbrev category INTDOM IntegralDomain
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References: Davenport & Trager I
-++ Description:
-++ The category of commutative integral domains, i.e. commutative
-++ rings with no zero divisors.
-++
-++ Conditional attributes:
-++   canonicalUnitNormal\tab{20}the canonical field is the same for all associates
-++   canonicalsClosed\tab{20}the product of two canonicals is itself canonical
-
-IntegralDomain(): Category ==
---  Join(CommutativeRing, Algebra(%:CommutativeRing), EntireRing) with
-  Join(CommutativeRing, Algebra(%), EntireRing) with
-    --operations
-      "exquo": (%,%) -> Union(%,"failed")
-            ++ exquo(a,b) either returns an element c such that
-            ++ \spad{c*b=a} or "failed" if no such element can be found.
-      unitNormal: % -> Record(unit:%,canonical:%,associate:%)
-            ++ unitNormal(x) tries to choose a canonical element
-            ++ from the associate class of x.
-            ++ The attribute canonicalUnitNormal, if asserted, means that
-            ++ the "canonical" element is the same across all associates of x
-            ++ if \spad{unitNormal(x) = [u,c,a]} then
-            ++ \spad{u*c = x}, \spad{a*u = 1}.
-      unitCanonical: % -> %
-            ++ \spad{unitCanonical(x)} returns \spad{unitNormal(x).canonical}.
-      associates?: (%,%) -> Boolean
-        ++ associates?(x,y) tests whether x and y are associates, i.e.
-        ++ differ by a unit factor.
-      unit?: % -> Boolean
-        ++ unit?(x) tests whether x is a unit, i.e. is invertible.
- add
-      -- declaration
-      x,y: %
-      -- definitions
-      UCA ==> Record(unit:%,canonical:%,associate:%)
-      if not (% has Field) then
-        unitNormal(x) == [1$%,x,1$%]$UCA -- the non-canonical definition
-      unitCanonical(x) == unitNormal(x).canonical -- always true
-      recip(x) == if zero? x then "failed" else _exquo(1$%,x)
-      unit?(x) == (recip x case "failed" => false; true)
-      if % has canonicalUnitNormal then
-         associates?(x,y) ==
-           (unitNormal x).canonical = (unitNormal y).canonical
-       else
-         associates?(x,y) ==
-           zero? x => zero? y
-           zero? y => false
-           x exquo y case "failed" => false
-           y exquo x case "failed" => false
-           true
-
-@
-\section{INTDOM.lsp BOOTSTRAP}
-{\bf INTDOM} depends on itself. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf INTDOM}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf INTDOM.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<INTDOM.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |IntegralDomain;AL| (QUOTE NIL)) 
-
-(DEFUN |IntegralDomain| NIL 
-  (LET (#:G83060) 
-    (COND 
-      (|IntegralDomain;AL|) 
-      (T (SETQ |IntegralDomain;AL| (|IntegralDomain;|)))))) 
-
-(DEFUN |IntegralDomain;| NIL 
-  (PROG (#1=#:G83058) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| 
-            (|CommutativeRing|)
-            (|Algebra| (QUOTE |$|))
-            (|EntireRing|)
-            (|mkCategory| 
-              (QUOTE |domain|) 
-              (QUOTE (
-                ((|exquo| ((|Union| |$| "failed") |$| |$|)) T)
-                ((|unitNormal| 
-                  ((|Record| 
-                     (|:| |unit| |$|) 
-                     (|:| |canonical| |$|)
-                     (|:| |associate| |$|)) |$|)) T)
-                ((|unitCanonical| (|$| |$|)) T)
-                ((|associates?| ((|Boolean|) |$| |$|)) T)
-                ((|unit?| ((|Boolean|) |$|)) T)))
-               NIL
-               (QUOTE ((|Boolean|)))
-               NIL))
-           |IntegralDomain|)
-        (SETELT #1# 0 (QUOTE (|IntegralDomain|))))))) 
-
-(MAKEPROP (QUOTE |IntegralDomain|) (QUOTE NILADIC) T) 
-
-@
-\section{INTDOM-.lsp BOOTSTRAP}
-{\bf INTDOM-} depends on {\bf INTDOM}. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf INTDOM-}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf INTDOM-.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<INTDOM-.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(DEFUN |INTDOM-;unitNormal;SR;1| (|x| |$|) 
-  (VECTOR (|spadConstant| |$| 7) |x| (|spadConstant| |$| 7))) 
-
-(DEFUN |INTDOM-;unitCanonical;2S;2| (|x| |$|) 
-  (QVELT (SPADCALL |x| (QREFELT |$| 10)) 1)) 
-
-(DEFUN |INTDOM-;recip;SU;3| (|x| |$|) 
-  (COND 
-    ((SPADCALL |x| (QREFELT |$| 13)) (CONS 1 "failed"))
-    ((QUOTE T) (SPADCALL (|spadConstant| |$| 7) |x| (QREFELT |$| 15))))) 
-
-(DEFUN |INTDOM-;unit?;SB;4| (|x| |$|) 
-  (COND 
-    ((QEQCAR (SPADCALL |x| (QREFELT |$| 17)) 1) (QUOTE NIL))
-    ((QUOTE T) (QUOTE T)))) 
-
-(DEFUN |INTDOM-;associates?;2SB;5| (|x| |y| |$|) 
-  (SPADCALL 
-    (QVELT (SPADCALL |x| (QREFELT |$| 10)) 1)
-    (QVELT (SPADCALL |y| (QREFELT |$| 10)) 1)
-    (QREFELT |$| 19))) 
-
-(DEFUN |INTDOM-;associates?;2SB;6| (|x| |y| |$|) 
-  (COND 
-    ((SPADCALL |x| (QREFELT |$| 13)) (SPADCALL |y| (QREFELT |$| 13)))
-    ((OR 
-        (SPADCALL |y| (QREFELT |$| 13))
-        (OR 
-          (QEQCAR (SPADCALL |x| |y| (QREFELT |$| 15)) 1)
-          (QEQCAR (SPADCALL |y| |x| (QREFELT |$| 15)) 1)))
-      (QUOTE NIL))
-    ((QUOTE T) (QUOTE T)))) 
-
-(DEFUN |IntegralDomain&| (|#1|) 
-  (PROG (|DV$1| |dv$| |$| |pv$|) 
-    (RETURN 
-      (PROGN 
-        (LETT |DV$1| (|devaluate| |#1|) . #1=(|IntegralDomain&|))
-        (LETT |dv$| (LIST (QUOTE |IntegralDomain&|) |DV$1|) . #1#)
-        (LETT |$| (GETREFV 21) . #1#)
-        (QSETREFV |$| 0 |dv$|)
-        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
-        (|stuffDomainSlots| |$|)
-        (QSETREFV |$| 6 |#1|)
-        (COND 
-          ((|HasCategory| |#1| (QUOTE (|Field|))))
-          ((QUOTE T) 
-            (QSETREFV |$| 9 
-              (CONS (|dispatchFunction| |INTDOM-;unitNormal;SR;1|) |$|))))
-        (COND 
-          ((|HasAttribute| |#1| (QUOTE |canonicalUnitNormal|))
-            (QSETREFV |$| 20 
-              (CONS (|dispatchFunction| |INTDOM-;associates?;2SB;5|) |$|)))
-          ((QUOTE T) 
-            (QSETREFV |$| 20 
-              (CONS (|dispatchFunction| |INTDOM-;associates?;2SB;6|) |$|))))
-        |$|)))) 
-
-(MAKEPROP 
-  (QUOTE |IntegralDomain&|)
-  (QUOTE |infovec|)
-  (LIST 
-    (QUOTE 
-      #(NIL NIL NIL NIL NIL NIL 
-        (|local| |#1|)
-        (0 . |One|)
-        (|Record| (|:| |unit| |$|) (|:| |canonical| |$|) (|:| |associate| |$|))
-        (4 . |unitNormal|)
-        (9 . |unitNormal|)
-        |INTDOM-;unitCanonical;2S;2| 
-        (|Boolean|)
-        (14 . |zero?|)
-        (|Union| |$| (QUOTE "failed"))
-        (19 . |exquo|)
-        |INTDOM-;recip;SU;3|
-        (25 . |recip|)
-        |INTDOM-;unit?;SB;4|
-        (30 . |=|)
-        (36 . |associates?|))) 
-    (QUOTE 
-      #(|unitNormal| 42 |unitCanonical| 47 |unit?| 52 |recip| 57 
-        |associates?| 62)) 
-    (QUOTE NIL)
-    (CONS 
-      (|makeByteWordVec2| 1 (QUOTE NIL))
-      (CONS 
-        (QUOTE #())
-        (CONS 
-          (QUOTE #())
-          (|makeByteWordVec2| 20 
-            (QUOTE 
-              (0 6 0 7 1 0 8 0 9 1 6 8 0 10 1 6 12 0 13 2 6 14 0 0 15 1 6 14
-               0 17 2 6 12 0 0 19 2 0 12 0 0 20 1 0 8 0 9 1 0 0 0 11 1 0 12 0
-               18 1 0 14 0 16 2 0 12 0 0 20)))))) 
-   (QUOTE |lookupComplete|))) 
-
-@
-\section{category LINEXP LinearlyExplicitRingOver}
-<<dot>>=
-"LINEXP" -> "RING"
-"LinearlyExplicitRingOver(a:Ring)" -> "Ring()"
-"LinearlyExplicitRingOver(Integer)" -> "LinearlyExplicitRingOver(a:Ring)"
-"LinearlyExplicitRingOver(Fraction(Integer))" -> 
-    "LinearlyExplicitRingOver(a:Ring)"
-@
-<<category LINEXP LinearlyExplicitRingOver>>=
-)abbrev category LINEXP LinearlyExplicitRingOver
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ An extension ring with an explicit linear dependence test.
-LinearlyExplicitRingOver(R:Ring): Category == Ring with
-  reducedSystem: Matrix % -> Matrix R
-    ++ reducedSystem(A) returns a matrix B such that \spad{A x = 0} and \spad{B x = 0}
-    ++ have the same solutions in R.
-  reducedSystem: (Matrix %,Vector %) -> Record(mat:Matrix R,vec:Vector R)
-    ++ reducedSystem(A, v) returns a matrix B and a vector w such that
-    ++ \spad{A x = v} and \spad{B x = w} have the same solutions in R.
-
-@
-\section{category MODULE Module}
-<<dot>>=
-"MODULE" -> "BMODULE"
-"Module(a:CommutativeRing)" -> "BiModule(a:CommutativeRing,b:CommutativeRing)"
-"Module(Field)" -> "Module(a:CommutativeRing)"
-@
-<<category MODULE Module>>=
-)abbrev category MODULE Module
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The category of modules over a commutative ring.
-++
-++ Axioms:
-++   \spad{1*x = x}
-++   \spad{(a*b)*x = a*(b*x)}
-++   \spad{(a+b)*x = (a*x)+(b*x)}
-++   \spad{a*(x+y) = (a*x)+(a*y)}
-Module(R:CommutativeRing): Category == BiModule(R,R)
-  add
-    if not(R is %) then x:%*r:R == r*x
-
-@
-\section{category OINTDOM OrderedIntegralDomain}
-<<dot>>=
-"OINTDOM" -> "INTDOM"
-"OrderedIntegralDomain()" -> "IntegralDomain()"
-"OINTDOM" -> "ORDRING"
-"OrderedIntegralDomain()" -> "OrderedRing()"
-@
-<<category OINTDOM OrderedIntegralDomain>>=
-)abbrev category OINTDOM OrderedIntegralDomain
-++ Author: JH Davenport (after L Gonzalez-Vega)
-++ Date Created: 30.1.96
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ Description:
-++ The category of ordered commutative integral domains, where ordering
-++ and the arithmetic operations are compatible
-++
-
-OrderedIntegralDomain(): Category ==
-  Join(IntegralDomain, OrderedRing) 
-
-@
-\section{OINTDOM.lsp BOOTSTRAP}
-{\bf OINTDOM} depends on itself. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf OINTDOM}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf OINTDOM.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<OINTDOM.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |OrderedIntegralDomain;AL| (QUOTE NIL)) 
-
-(DEFUN |OrderedIntegralDomain| NIL 
-  (LET (#:G84531) 
-    (COND 
-      (|OrderedIntegralDomain;AL|)
-      (T (SETQ |OrderedIntegralDomain;AL| (|OrderedIntegralDomain;|)))))) 
-
-(DEFUN |OrderedIntegralDomain;| NIL 
-  (PROG (#1=#:G84529) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| (|IntegralDomain|) (|OrderedRing|)) |OrderedIntegralDomain|)
-        (SETELT #1# 0 (QUOTE (|OrderedIntegralDomain|))))))) 
-
-(MAKEPROP (QUOTE |OrderedIntegralDomain|) (QUOTE NILADIC) T) 
-
-@
-\section{category PDRING PartialDifferentialRing}
-<<dot>>=
-"PDRING" -> "RING"
-"PartialDifferentialRing(a:SetCategory)" -> "Ring()"
-"PartialDifferentialRing(a:OrderedSet)" ->
-    "PartialDifferentialRing(a:SetCategory)"
-@
-<<category PDRING PartialDifferentialRing>>=
-)abbrev category PDRING PartialDifferentialRing
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A partial differential ring with differentiations indexed by a parameter type S.
-++
-++ Axioms:
-++   \spad{differentiate(x+y,e) = differentiate(x,e)+differentiate(y,e)}
-++   \spad{differentiate(x*y,e) = x*differentiate(y,e) + differentiate(x,e)*y}
-
-PartialDifferentialRing(S:SetCategory): Category == Ring with
-    differentiate: (%, S) -> %
-        ++ differentiate(x,v) computes the partial derivative of x
-        ++ with respect to v.
-    differentiate: (%, List S) -> %
-        ++ differentiate(x,[s1,...sn]) computes successive partial derivatives,
-        ++ i.e. \spad{differentiate(...differentiate(x, s1)..., sn)}.
-    differentiate: (%, S, NonNegativeInteger) -> %
-        ++ differentiate(x, s, n) computes multiple partial derivatives, i.e.
-        ++ n-th derivative of x with respect to s.
-    differentiate: (%, List S, List NonNegativeInteger) -> %
-        ++ differentiate(x, [s1,...,sn], [n1,...,nn]) computes
-        ++ multiple partial derivatives, i.e.
-    D: (%, S) -> %
-        ++ D(x,v) computes the partial derivative of x
-        ++ with respect to v.
-    D: (%, List S) -> %
-        ++ D(x,[s1,...sn]) computes successive partial derivatives,
-        ++ i.e. \spad{D(...D(x, s1)..., sn)}.
-    D: (%, S, NonNegativeInteger) -> %
-        ++ D(x, s, n) computes multiple partial derivatives, i.e.
-        ++ n-th derivative of x with respect to s.
-    D: (%, List S, List NonNegativeInteger) -> %
-        ++ D(x, [s1,...,sn], [n1,...,nn]) computes
-        ++ multiple partial derivatives, i.e.
-        ++ \spad{D(...D(x, s1, n1)..., sn, nn)}.
-  add
-    differentiate(r:%, l:List S) ==
-      for s in l repeat r := differentiate(r, s)
-      r
-
-    differentiate(r:%, s:S, n:NonNegativeInteger) ==
-      for i in 1..n repeat r := differentiate(r, s)
-      r
-
-    differentiate(r:%, ls:List S, ln:List NonNegativeInteger) ==
-      for s in ls for n in ln repeat r := differentiate(r, s, n)
-      r
-
-    D(r:%, v:S) == differentiate(r,v)
-    D(r:%, lv:List S) == differentiate(r,lv)
-    D(r:%, v:S, n:NonNegativeInteger) == differentiate(r,v,n)
-    D(r:%, lv:List S, ln:List NonNegativeInteger) == differentiate(r, lv, ln)
-
-@
-\section{category PFECAT PolynomialFactorizationExplicit}
-<<dot>>=
-"PFECAT" -> "UFD"
-"PolynomialFactorizationExplicit()" -> "UniqueFactorizationDomain()"
-@
-<<category PFECAT PolynomialFactorizationExplicit>>=
-)abbrev category PFECAT PolynomialFactorizationExplicit
-++ Author: James Davenport
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ This is the category of domains that know "enough" about
-++ themselves in order to factor univariate polynomials over themselves.
-++ This will be used in future releases for supporting factorization
-++ over finitely generated coefficient fields, it is not yet available
-++ in the current release of axiom.
-
-PolynomialFactorizationExplicit(): Category == Definition where
-  P ==> SparseUnivariatePolynomial %
-  Definition ==>
-    UniqueFactorizationDomain with
-    -- operations
-       squareFreePolynomial: P -> Factored(P)
-              ++ squareFreePolynomial(p) returns the
-              ++ square-free factorization of the
-              ++ univariate polynomial p.
-       factorPolynomial: P -> Factored(P)
-              ++ factorPolynomial(p) returns the factorization
-              ++ into irreducibles of the univariate polynomial p.
-       factorSquareFreePolynomial: P -> Factored(P)
-              ++ factorSquareFreePolynomial(p) factors the
-              ++ univariate polynomial p into irreducibles
-              ++ where p is known to be square free
-              ++ and primitive with respect to its main variable.
-       gcdPolynomial: (P, P) -> P
-              ++ gcdPolynomial(p,q) returns the gcd of the univariate
-              ++ polynomials p qnd q.
-              -- defaults to Euclidean, but should be implemented via
-              -- modular or p-adic methods.
-       solveLinearPolynomialEquation: (List P, P) -> Union(List P,"failed")
-              ++ solveLinearPolynomialEquation([f1, ..., fn], g)
-              ++ (where the fi are relatively prime to each other)
-              ++ returns a list of ai such that
-              ++ \spad{g/prod fi = sum ai/fi}
-              ++ or returns "failed" if no such list of ai's exists.
-       if % has CharacteristicNonZero then
-         conditionP: Matrix % -> Union(Vector %,"failed")
-              ++ conditionP(m) returns a vector of elements, not all zero,
-              ++ whose \spad{p}-th powers (p is the characteristic of the domain)
-              ++ are a solution of the homogenous linear system represented
-              ++ by m, or "failed" is there is no such vector.
-         charthRoot: % -> Union(%,"failed")
-              ++ charthRoot(r) returns the \spad{p}-th root of r, or "failed"
-              ++ if none exists in the domain.
-              -- this is a special case of conditionP, but often the one we want
-      add
-        gcdPolynomial(f,g) ==
-           zero? f => g
-           zero? g => f
-           cf:=content f
-           if not one? cf then f:=(f exquo cf)::P
-           cg:=content g
-           if not one? cg then g:=(g exquo cg)::P
-           ans:=subResultantGcd(f,g)$P
-           gcd(cf,cg)*(ans exquo content ans)::P
-        if % has CharacteristicNonZero then
-          charthRoot f ==
-             -- to take p'th root of f, solve the system X-fY=0,
-             -- so solution is [x,y]
-             -- with x^p=X and y^p=Y, then (x/y)^p = f
-             zero? f => 0
-             m:Matrix % := matrix [[1,-f]]
-             ans:= conditionP m
-             ans case "failed" => "failed"
-             (ans.1) exquo (ans.2)
-        if % has Field then
-          solveLinearPolynomialEquation(lf,g) ==
-            multiEuclidean(lf,g)$P
-        else solveLinearPolynomialEquation(lf,g) ==
-               LPE ==> LinearPolynomialEquationByFractions %
-               solveLinearPolynomialEquationByFractions(lf,g)$LPE
-
-@
-\section{category PID PrincipalIdealDomain}
-<<dot>>=
-"PID" -> "GCDDOM"
-"PrincipalIdealDomain()" -> "GcdDomain()"
-@
-<<category PID PrincipalIdealDomain>>=
-)abbrev category PID PrincipalIdealDomain
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The category of constructive principal ideal domains, i.e.
-++ where a single generator can be constructively found for
-++ any ideal given by a finite set of generators.
-++ Note that this constructive definition only implies that
-++ finitely generated ideals are principal. It is not clear
-++ what we would mean by an infinitely generated ideal.
-
-PrincipalIdealDomain(): Category == GcdDomain with
-    --operations
-      principalIdeal: List % -> Record(coef:List %,generator:%)
-         ++ principalIdeal([f1,...,fn]) returns a record whose
-         ++ generator component is a generator of the ideal
-         ++ generated by \spad{[f1,...,fn]} whose coef component satisfies
-         ++ \spad{generator = sum (input.i * coef.i)}
-      expressIdealMember: (List %,%) -> Union(List %,"failed")
-         ++ expressIdealMember([f1,...,fn],h) returns a representation
-         ++ of h as a linear combination of the fi or "failed" if h
-         ++ is not in the ideal generated by the fi.
-
-@
-\section{category UFD UniqueFactorizationDomain}
-<<dot>>=
-"UFD" -> "GCDDOM"
-"UniqueFactorizationDomain()" -> "GcdDomain()"
-@
-<<category UFD UniqueFactorizationDomain>>=
-)abbrev category UFD UniqueFactorizationDomain
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A constructive unique factorization domain, i.e. where
-++ we can constructively factor members into a product of
-++ a finite number of irreducible elements.
-
-UniqueFactorizationDomain(): Category == GcdDomain with
-    --operations
-      prime?: % -> Boolean
-            ++ prime?(x) tests if x can never be written as the product of two
-            ++ non-units of the ring,
-            ++ i.e., x is an irreducible element.
-      squareFree    : % -> Factored(%)
-            ++ squareFree(x) returns the square-free factorization of x
-            ++ i.e. such that the factors are pairwise relatively prime
-            ++ and each has multiple prime factors.
-      squareFreePart: % -> %
-            ++ squareFreePart(x) returns a product of prime factors of
-            ++ x each taken with multiplicity one.
-      factor: % -> Factored(%)
-            ++ factor(x) returns the factorization of x into irreducibles.
- add
-  squareFreePart x ==
-    unit(s := squareFree x) * _*/[f.factor for f in factors s]
-
-  prime? x == # factorList factor x = 1
-
-@
-\section{UFD.lsp BOOTSTRAP} 
-{\bf UFD} needs
-{\bf GCDDOM} which needs
-{\bf COMRING} which needs
-{\bf RING} which needs
-{\bf RNG} which needs
-{\bf ABELGRP} which needs
-{\bf CABMON} which needs
-{\bf ABELMON} which needs
-{\bf ABELSG} which needs
-{\bf SETCAT} which needs
-{\bf SINT} which needs
-{\bf UFD}.
-We need to break this cycle to build the algebra. So we keep a
-cached copy of the translated {\bf UFD} category which we can write
-into the {\bf MID} directory. We compile the lisp code and copy the
-{\bf UFD.o} file to the {\bf OUT} directory.  This is eventually
-forcibly replaced by a recompiled version.
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<UFD.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |UniqueFactorizationDomain;AL| (QUOTE NIL)) 
-
-(DEFUN |UniqueFactorizationDomain| NIL 
-  (LET (#:G83334) 
-    (COND 
-      (|UniqueFactorizationDomain;AL|) 
-      (T 
-        (SETQ 
-          |UniqueFactorizationDomain;AL| 
-          (|UniqueFactorizationDomain;|)))))) 
-
-(DEFUN |UniqueFactorizationDomain;| NIL 
-  (PROG (#1=#:G83332) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| 
-            (|GcdDomain|)
-            (|mkCategory| 
-              (QUOTE |domain|)
-              (QUOTE (
-                ((|prime?| ((|Boolean|) |$|)) T)
-                ((|squareFree| ((|Factored| |$|) |$|)) T)
-                ((|squareFreePart| (|$| |$|)) T)
-                ((|factor| ((|Factored| |$|) |$|)) T)))
-              NIL
-              (QUOTE ((|Factored| |$|) (|Boolean|)))
-              NIL))
-          |UniqueFactorizationDomain|)
-        (SETELT #1# 0 (QUOTE (|UniqueFactorizationDomain|))))))) 
-
-(MAKEPROP (QUOTE |UniqueFactorizationDomain|) (QUOTE NILADIC) T) 
-
-@
-\section{UFD-.lsp BOOTSTRAP} 
-{\bf UFD-} needs {\bf UFD}.
-We need to break this cycle to build the algebra. So we keep a
-cached copy of the translated {\bf UFD-} category which we can write
-into the {\bf MID} directory. We compile the lisp code and copy the
-{\bf UFD-.o} file to the {\bf OUT} directory.  This is eventually
-forcibly replaced by a recompiled version.
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<UFD-.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(DEFUN |UFD-;squareFreePart;2S;1| (|x| |$|) 
-  (PROG (|s| |f| #1=#:G83349 #2=#:G83347 #3=#:G83345 #4=#:G83346) 
-    (RETURN 
-      (SEQ 
-        (SPADCALL 
-          (SPADCALL 
-            (LETT |s| 
-              (SPADCALL |x| (QREFELT |$| 8))
-              |UFD-;squareFreePart;2S;1|)
-            (QREFELT |$| 10)) 
-          (PROGN 
-            (LETT #4# NIL |UFD-;squareFreePart;2S;1|)
-            (SEQ 
-              (LETT |f| NIL |UFD-;squareFreePart;2S;1|)
-              (LETT #1# 
-                (SPADCALL |s| (QREFELT |$| 13))
-                |UFD-;squareFreePart;2S;1|)
-              G190
-              (COND 
-                ((OR 
-                   (ATOM #1#)
-                   (PROGN 
-                     (LETT |f| (CAR #1#) |UFD-;squareFreePart;2S;1|)
-                     NIL))
-                 (GO G191)))
-              (SEQ 
-                (EXIT 
-                  (PROGN 
-                    (LETT #2# (QCAR |f|) |UFD-;squareFreePart;2S;1|)
-                    (COND 
-                      (#4# 
-                        (LETT #3# 
-                          (SPADCALL #3# #2# (QREFELT |$| 14))
-                          |UFD-;squareFreePart;2S;1|))
-                      ((QUOTE T) 
-                        (PROGN 
-                          (LETT #3# #2# |UFD-;squareFreePart;2S;1|)
-                          (LETT #4# (QUOTE T) |UFD-;squareFreePart;2S;1|)))))))
-              (LETT #1# (CDR #1#) |UFD-;squareFreePart;2S;1|)
-              (GO G190)
-              G191
-              (EXIT NIL))
-            (COND 
-              (#4# #3#) 
-              ((QUOTE T) (|spadConstant| |$| 15))))
-       (QREFELT |$| 14)))))) 
-
-(DEFUN |UFD-;prime?;SB;2| (|x| |$|) 
-  (EQL 
-    (LENGTH (SPADCALL (SPADCALL |x| (QREFELT |$| 17)) (QREFELT |$| 21))) 1)) 
-
-(DEFUN |UniqueFactorizationDomain&| (|#1|) 
-  (PROG (|DV$1| |dv$| |$| |pv$|) 
-    (RETURN 
-      (PROGN 
-        (LETT |DV$1| (|devaluate| |#1|) . #1=(|UniqueFactorizationDomain&|))
-        (LETT |dv$| (LIST (QUOTE |UniqueFactorizationDomain&|) |DV$1|) . #1#)
-        (LETT |$| (GETREFV 24) . #1#)
-        (QSETREFV |$| 0 |dv$|)
-        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
-        (|stuffDomainSlots| |$|)
-        (QSETREFV |$| 6 |#1|)
-        |$|)))) 
-
-(MAKEPROP 
-  (QUOTE |UniqueFactorizationDomain&|)
-  (QUOTE |infovec|)
-  (LIST 
-    (QUOTE 
-      #(NIL NIL NIL NIL NIL NIL 
-        (|local| |#1|)
-        (|Factored| |$|)
-        (0 . |squareFree|)
-        (|Factored| 6)
-        (5 . |unit|)
-        (|Record| (|:| |factor| 6) (|:| |exponent| (|Integer|)))
-        (|List| 11)
-        (10 . |factors|)
-        (15 . |*|)
-        (21 . |One|)
-        |UFD-;squareFreePart;2S;1| 
-        (25 . |factor|)
-        (|Union| (QUOTE "nil") (QUOTE "sqfr") (QUOTE "irred") (QUOTE "prime"))
-        (|Record| (|:| |flg| 18) (|:| |fctr| 6) (|:| |xpnt| (|Integer|)))
-        (|List| 19)
-        (30 . |factorList|)
-        (|Boolean|)
-        |UFD-;prime?;SB;2|)) 
-     (QUOTE #(|squareFreePart| 35 |prime?| 40))
-     (QUOTE NIL)
-     (CONS 
-       (|makeByteWordVec2| 1 (QUOTE NIL))
-       (CONS 
-         (QUOTE #())
-         (CONS 
-           (QUOTE #())
-           (|makeByteWordVec2| 23 
-             (QUOTE 
-               (1 6 7 0 8 1 9 6 0 10 1 9 12 0 13 2 6 0 0 0 14 0 6 0 15 1 6 7
-                0 17 1 9 20 0 21 1 0 0 0 16 1 0 22 0 23)))))) 
-      (QUOTE |lookupComplete|))) 
-
-@
-\section{category VSPACE VectorSpace}
-<<dot>>=
-"VSPACE" -> "MODULE"
-"VectorSpace(a:Field)" -> "Module(Field)"
-@
-<<category VSPACE VectorSpace>>=
-)abbrev category VSPACE VectorSpace
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ Vector Spaces (not necessarily finite dimensional) over a field.
-
-VectorSpace(S:Field): Category ==  Module(S) with
-    "/"      : (%, S) -> %
-      ++ x/y divides the vector x by the scalar y.
-    dimension: () -> CardinalNumber
-      ++ dimension() returns the dimensionality of the vector space.
-  add
-    (v:% / s:S):% == inv(s) * v
-
-@
-\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>>
-
-<<category ENTIRER EntireRing>>
-<<category CHARZ CharacteristicZero>>
-<<category CHARNZ CharacteristicNonZero>>
-<<category COMRING CommutativeRing>>
-<<category MODULE Module>>
-<<category ALGEBRA Algebra>>
-<<category LINEXP LinearlyExplicitRingOver>>
-<<category FLINEXP FullyLinearlyExplicitRingOver>>
-<<category INTDOM IntegralDomain>>
-<<category GCDDOM GcdDomain>>
-<<category UFD UniqueFactorizationDomain>>
-<<category PFECAT PolynomialFactorizationExplicit>>
-<<category PID PrincipalIdealDomain>>
-<<category EUCDOM EuclideanDomain>>
-<<category DIVRING DivisionRing>>
-<<category FIELD Field>>
-<<category VSPACE VectorSpace>>
-<<category OINTDOM OrderedIntegralDomain>>
-<<category DIFRING DifferentialRing>>
-<<category PDRING PartialDifferentialRing>>
-<<category DIFEXT DifferentialExtension>>
-@
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} nothing
-\end{thebibliography}
-\end{document}
diff --git a/src/algebra/equation1.spad.pamphlet b/src/algebra/equation1.spad.pamphlet
deleted file mode 100644
index 1483d64..0000000
--- a/src/algebra/equation1.spad.pamphlet
+++ /dev/null
@@ -1,129 +0,0 @@
-\documentclass{article}
-\usepackage{axiom}
-\begin{document}
-\title{\$SPAD/src/algebra equation1.spad}
-\author{The Axiom Team}
-\maketitle
-\begin{abstract}
-\end{abstract}
-\eject
-\tableofcontents
-\eject
-\section{category IEVALAB InnerEvalable}
-<<dot>>=
-"IEVALAB" -> "CATEGORY"
-"InnerEvalable(a:SetCategory,b:Type)" -> "Category"
-"InnerEvalable(a:SetCategory,b:SetCategory)" ->
-    "InnerEvalable(a:SetCategory,b:Type)"
-"InnerEvalable(a:Ring,MultivariateTaylorSeriesCategory(a:Ring,b:OrderedSet))"
-     -> "InnerEvalable(a:SetCategory,b:Type)"
-"InnerEvalable(Kernal(ExpressionSpace),ExpressionSpace)" ->
-    "InnerEvalable(a:SetCategory,b:Type)"
-@
-<<category IEVALAB InnerEvalable>>=
-)abbrev category IEVALAB InnerEvalable
--- FOR THE BENEFIT OF LIBAX0 GENERATION
-++ Author:
-++ Date Created:
-++ Date Last Updated: June 3, 1991
-++ Basic Operations:
-++ Related Domains:
-++ Also See: Evalable
-++ AMS Classifications:
-++ Keywords: equation
-++ Examples:
-++ References:
-++ Description:
-++   This category provides \spadfun{eval} operations.
-++   A domain may belong to this category if it is possible to make
-++   ``evaluation'' substitutions.  The difference between this
-++   and \spadtype{Evalable} is that the operations in this category
-++   specify the substitution as a pair of arguments rather than as
-++   an equation.
-InnerEvalable(A:SetCategory, B:Type): Category == with
-    eval: ($, A, B) -> $
-       ++ eval(f, x, v) replaces x by v in f.
-    eval: ($, List A, List B) -> $
-       ++ eval(f, [x1,...,xn], [v1,...,vn]) replaces xi by vi in f.
- add
-    eval(f:$, x:A, v:B) == eval(f, [x], [v])
-
-@
-\section{category EVALAB Evalable}
-<<dot>>=
-"EVALAB" -> "IEVALAB"
-"Evalable(a:SetCategory)" -> "InnerEvalable(a:SetCategory,b:SetCategory)"
-"Evalable(MultivariateTaylorSeriesCategory(a:Ring,b:OrderedSet))" ->
-    "Evalable(a:SetCategory)"
-"Evalable(ExpressionSpace)" -> "Evalable(a:SetCategory)"
-@
-<<category EVALAB Evalable>>=
-)abbrev category EVALAB Evalable
-++ Author:
-++ Date Created:
-++ Date Last Updated: June 3, 1991
-++ Basic Operations:
-++ Related Domains:
-++ Also See: FullyEvalable
-++ AMS Classifications:
-++ Keywords: equation
-++ Examples:
-++ References:
-++ Description:
-++   This category provides \spadfun{eval} operations.
-++   A domain may belong to this category if it is possible to make
-++   ``evaluation'' substitutions.
-Evalable(R:SetCategory): Category == InnerEvalable(R,R) with
-    eval: ($, Equation R) -> $
-       ++ eval(f,x = v) replaces x by v in f.
-    eval: ($, List Equation R) -> $
-       ++ eval(f, [x1 = v1,...,xn = vn]) replaces xi by vi in f.
- add
-    eval(f:$, eq:Equation R) == eval(f, [eq])
-    eval(f:$, xs:List R,vs:List R) == eval(f,[x=v for x in xs for v in vs])
-
-@
-\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>>
-
-<<category IEVALAB InnerEvalable>>
-<<category EVALAB Evalable>>
-@
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} nothing
-\end{thebibliography}
-\end{document}
