diff --git a/books/bookvol10.2.pamphlet b/books/bookvol10.2.pamphlet
index 5685fd5..8b0afca 100644
--- a/books/bookvol10.2.pamphlet
+++ b/books/bookvol10.2.pamphlet
@@ -513,7 +513,7 @@ is true if $1 * x = x$ for all x.
 \item {\bf \cross{ATTREG}{rightUnitary}}
 is true if $x * 1 = x$ for all x.
 \item {\bf \cross{ATTREG}{noZeroDivisors}}
-is true if $x * y ~= 0$ implies both x and y are non-zero.
+is true if $x * y \ne 0$ implies both x and y are non-zero.
 \item {\bf \cross{ATTREG}{canonicalUnitNormal}}
 is true if we can choose a canonical representative for each class 
 of associate elements, that is {\tt associates?(a,b)} returns true 
@@ -1038,6 +1038,7 @@ digraph pic {
 
 {\bf See:}\\
 \pageto{EltableAggregate}{ELTAGG}
+\pageto{UnivariatePolynomialCategory}{UPOLYC}
 \pagefrom{Category}{CATEGORY}
 
 {\bf Exports:}\\
@@ -1083,6 +1084,16 @@ Eltable(S:SetCategory, Index:Type): Category == with
  [color=lightblue,href="bookvol10.2.pdf#nameddest=ELTAB"];
 "Eltable(a:SetCategory,b:Type)" -> "Category"
 
+"Eltable(a:UnivariatePolynomialCategory(a:Ring),b:UnivariatePolynomialCategory(a:Ring))"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=ELTAB"];
+"Eltable(a:UnivariatePolynomialCategory(a:Ring),b:UnivariatePolynomialCategory(a:Ring))" ->
+   "Eltable(a:SetCategory,b:Type)" 
+
+"Eltable(a:Ring,b:Ring)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=ELTAB"];
+"Eltable(a:Ring,b:Ring)" ->
+   "Eltable(a:SetCategory,b:Type)" 
+
 @
 <<ELTAB.dotpic>>=
 digraph pic {
@@ -1090,10 +1101,17 @@ digraph pic {
  bgcolor="#FFFF66";
  node [shape=box, color=white, style=filled];
 
-"Eltable(a:SetCategory,b:Type)" [color=lightblue];
-"Eltable(a:SetCategory,b:Type)" -> "Category"
+"UnivariatePolynomialCategory(a:Ring)" [color=lightblue];
+"UnivariatePolynomialCategory(a:Ring)" -> "POLYCAT..."
+"UnivariatePolynomialCategory(a:Ring)" -> "ELTAB..."
+"UnivariatePolynomialCategory(a:Ring)" -> "DIFRING..."
+"UnivariatePolynomialCategory(a:Ring)" -> "DIFEXT..."
+
+"POLYCAT..." [color=lightblue];
+"ELTAB..." [color=lightblue];
+"DIFRING..." [color=lightblue];
+"DIFEXT..." [color=lightblue];
 
-"Category" [color=lightblue];
 }
 
 @
@@ -1797,6 +1815,11 @@ digraph pic {
 \pagehead{Type}{TYPE}
 \pagepic{ps/v102type.ps}{TYPE}{1.00}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf nil}
+\end{itemize}
+
 {\bf See:}\\
 \pageto{Aggregate}{AGG}
 \pageto{FullyPatternMatchable}{FPATMAB}
@@ -1843,6 +1866,11 @@ digraph pic {
 \pageto{HomogeneousAggregate}{HOAGG}
 \pagefrom{Type}{TYPE}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf nil}
+\end{itemize}
+
 {\bf Exports:}\\
 \begin{tabular}{llllll}
 \cross{AGG}{empty?} &
@@ -2293,6 +2321,11 @@ digraph pic {
 {\bf See:}\\
 \pagefrom{Type}{TYPE}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf nil}
+\end{itemize}
+
 {\bf Exports:}\\
 \begin{tabular}{lllll}
 \cross{FPATMAB}{coerce} &
@@ -3437,6 +3470,11 @@ digraph pic {
 \pagefrom{Evalable}{EVALAB}
 \pagefrom{SetCategory}{SETCAT}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf nil}
+\end{itemize}
+
 {\bf Exports:}\\
 \begin{tabular}{lllll}
 \cross{HOAGG}{any?} &
@@ -4349,6 +4387,7 @@ digraph pic {
 
 {\bf See:}\\
 \pageto{FiniteFieldCategory}{FFIELDC}
+\pageto{UnivariatePolynomialCategory}{UPOLYC}
 \pagefrom{SetCategory}{SETCAT}
 
 {\bf Exports:}\\
@@ -4633,6 +4672,7 @@ digraph pic {
 is true if its values have immediate components that are 
 updateable (mutable). Note: the properties of any component 
 domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
 \end{itemize}
 
 These are directly exported but not implemented:
@@ -4803,6 +4843,11 @@ digraph pic {
 \cross{CLAGG}{?\~{}=?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf nil}
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{CLAGG}{finiteAggregate}}
@@ -5213,6 +5258,11 @@ digraph pic {
 \cross{IXAGG}{?=?} &&&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf nil}
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{IXAGG}{finiteAggregate}}
@@ -5928,6 +5978,11 @@ digraph pic {
 \cross{RCAGG}{?=?} &&&&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf nil}
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{RCAGG}{shallowlyMutable}}
@@ -6161,6 +6216,7 @@ is true if it is an aggregate with a finite number of elements.
 is true if its values have immediate components that are 
 updateable (mutable). Note: the properties of any component 
 domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
 \end{itemize}
 
 {\bf Attributes Used:}
@@ -6693,6 +6749,11 @@ digraph pic {
 \cross{BRAGG}{?.value} &&&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf nil}
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{BRAGG}{finiteAggregate}}
@@ -7095,6 +7156,15 @@ digraph pic {
 \cross{DIOPS}{?\~{}=?} &&&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{DIOPS}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{DIOPS}{finiteAggregate}}
@@ -7329,6 +7399,11 @@ digraph pic {
 \cross{DLAGG}{?.value} &&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf nil}
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{DLAGG}{shallowlyMutable}}
@@ -7730,6 +7805,11 @@ digraph pic {
 \cross{LNAGG}{?.?} &&&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf nil}
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{LNAGG}{finiteAggregate}}
@@ -8286,6 +8366,10 @@ digraph pic {
 \begin{itemize}
 \item {\bf \cross{PRQAGG}{finiteAggregate}}
 is true if it is an aggregate with a finite number of elements.
+\item {\bf \cross{PROAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
 \end{itemize}
 
 These are directly exported but not implemented:
@@ -8459,6 +8543,10 @@ digraph pic {
 \begin{itemize}
 \item {\bf \cross{QUAGG}{finiteAggregate}}
 is true if it is an aggregate with a finite number of elements.
+\item {\bf \cross{QUAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
 \end{itemize}
 
 These are implemented by this category:
@@ -8650,6 +8738,7 @@ digraph pic {
 \item {\bf \cross{SETAGG}{partiallyOrderedSet}}
 is true if a set with $<$ which is transitive, but 
 not($a < b$ or $a = b$) does not necessarily imply $b<a$.
+\item {\bf nil}
 \end{itemize}
 
 These are directly exported but not implemented:
@@ -8926,6 +9015,10 @@ digraph pic {
 \begin{itemize}
 \item {\bf \cross{SKAGG}{finiteAggregate}}
 is true if it is an aggregate with a finite number of elements.
+\item {\bf \cross{SKAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
 \end{itemize}
 
 These are directly exported but not implemented:
@@ -9118,6 +9211,11 @@ digraph pic {
 \cross{URAGG}{?\~{}=?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf nil}
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{URAGG}{finiteAggregate}}
@@ -9725,6 +9823,15 @@ digraph pic {
 \cross{DIAGG}{?=?} &&&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{DIAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{DIAGG}{finiteAggregate}}
@@ -9951,6 +10058,17 @@ digraph pic {
 \cross{DQAGG}{?\~{}=?} &&&&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{DQAGG}{finiteAggregate}}
+is true if it is an aggregate with a finite number of elements.
+\item {\bf \cross{DQAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  bottom! : % -> S                     
@@ -10188,6 +10306,7 @@ digraph pic {
 is true if its values have immediate components that are 
 updateable (mutable). Note: the properties of any component 
 domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
 \end{itemize}
 
 These are directly exported but not implemented:
@@ -10490,6 +10609,7 @@ digraph pic {
 \begin{itemize}
 \item {\bf \cross{FLAGG}{finiteAggregate}}
 is true if it is an aggregate with a finite number of elements.
+\item {\bf nil}
 \end{itemize}
 
 {\bf Attributes Used:}
@@ -10805,6 +10925,15 @@ digraph pic {
 \cross{MDAGG}{?\~{}=?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{MDAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  insert! : (S,%,NonNegativeInteger) -> %
@@ -11151,6 +11280,11 @@ digraph pic {
 \cross{STAGG}{?\~{}=?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf nil}
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{STAGG}{shallowlyMutable}}
@@ -11675,10 +11809,13 @@ digraph pic {
 
 {\bf Attributes Exported:}
 \begin{itemize}
+\item {\bf \cross{A1AGG}{finiteAggregate}}
+is true if it is an aggregate with a finite number of elements.
 \item {\bf \cross{A1AGG}{shallowlyMutable}}
 is true if its values have immediate components that are 
 updateable (mutable). Note: the properties of any component 
 domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
 \end{itemize}
 
 These are implemented by this category:
@@ -12158,8 +12295,16 @@ digraph pic {
 
 {\bf Attributes Exported:}
 \begin{itemize}
+\item {\bf \cross{FSAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
 \item {\bf \cross{FSAGG}{finiteAggregate}}
 is true if it is an aggregate with a finite number of elements.
+\item {\bf \cross{FSAGG}{partiallyOrderedSet}}
+is true if a set with $<$ which is transitive, but 
+not($a < b$ or $a = b$) does not necessarily imply $b<a$.
+\item {\bf nil}
 \end{itemize}
 
 These are implemented by this category:
@@ -12460,6 +12605,15 @@ digraph pic {
 \cross{KDAGG}{?\~{}=?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{KDAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{KDAGG}{finiteAggregate}}
@@ -12873,9 +13027,16 @@ digraph pic {
 \cross{LSAGG}{?\~{}=?} \\
 \end{tabular}
 
-These are directly exported but not implemented:
-\begin{verbatim}
-\end{verbatim}
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{LSAGG}{finiteAggregate}}
+is true if it is an aggregate with a finite number of elements.
+\item {\bf \cross{LSAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
+\end{itemize}
 
 These are implemented by this category:
 \begin{verbatim}
@@ -13387,6 +13548,18 @@ digraph pic {
 \cross{MSETAGG}{?=?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{MSETAGG}{partiallyOrderedSet}}
+is true if a set with $<$ which is transitive, but 
+not($a < b$ or $a = b$) does not necessarily imply $b<a$.
+\item {\bf \cross{MSETAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
+\end{itemize}
+
 These exports come from \refto{MultiDictionary}(S:SetCategory):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean if $ has finiteAggregate
@@ -13977,6 +14150,17 @@ digraph pic {
 \cross{SRAGG}{?$>=$?} &&&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{SRAGG}{finiteAggregate}}
+is true if it is an aggregate with a finite number of elements.
+\item {\bf \cross{SRAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  leftTrim : (%,Character) -> %
@@ -14358,6 +14542,15 @@ digraph pic {
 \cross{TBAGG}{?\~{}=?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{TBAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf nil}
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{TBAGG}{finiteAggregate}}
@@ -14849,6 +15042,17 @@ digraph pic {
 \cross{ALAGG}{?.?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{ALAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf \cross{ALAGG}{finiteAggregate}}
+is true if it is an aggregate with a finite number of elements.
+\item {\bf nil}
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  assoc : (Key,%) -> Union(Record(key: Key,entry: Entry),"failed")
@@ -15458,6 +15662,17 @@ digraph pic {
 \cross{BTAGG}{?\~{}=?} &&&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{BTAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf \cross{BTAGG}{finiteAggregate}}
+is true if it is an aggregate with a finite number of elements.
+\item {\bf nil}
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  ?and? : (%,%) -> %                   
@@ -16196,6 +16411,20 @@ digraph pic {
 \cross{OMSAGG}{?\~{}?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{OMSAGG}{partiallyOrderedSet}}
+is true if a set with $<$ which is transitive, but 
+not($a < b$ or $a = b$) does not necessarily imply $b<a$.
+\item {\bf \cross{OMSAGG}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf \cross{OMSAGG}{finiteAggregate}}
+is true if it is an aggregate with a finite number of elements.
+\item {\bf nil}
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  min : % -> S
@@ -16648,6 +16877,16 @@ digraph pic {
 \cross{STRICAT}{?\~{}=?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{STRICAT}{shallowlyMutable}}
+is true if its values have immediate components that are 
+updateable (mutable). Note: the properties of any component 
+domain are irrevelant to the shallowlyMutable proper.
+\item {\bf \cross{STRICAT}{finiteAggregate}}
+is true if it is an aggregate with a finite number of elements.
+\item {\bf nil}
+\end{itemize}
 
 These are directly exported but not implemented:
 \begin{verbatim}
@@ -16936,6 +17175,24 @@ digraph pic {
 \cross{AMR}{?/?} &&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item if \$ has CommutativeRing then commutative("*") where
+{\bf \cross{AMR}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item if \$ has IntegralDomain then noZeroDivisors where
+{\bf \cross{AMR}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{AMR}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{AMR}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{AMR}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
 
 These are directly exported but not implemented:
 \begin{verbatim}
@@ -17194,6 +17451,14 @@ digraph pic {
 \cross{CHARNZ}{?=?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{CHARNZ}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  charthRoot : % -> Union(%,"failed")
@@ -17332,6 +17597,14 @@ digraph pic {
 \cross{CHARZ}{?=?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{CHARZ}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\end{itemize}
+
 These exports come from \refto{Ring}():
 \begin{verbatim}
  1 : () -> %                          
@@ -17439,6 +17712,7 @@ digraph pic {
 \pageto{IntegralDomain}{INTDOM}
 \pageto{MonogenicAlgebra}{MONOGEN}
 \pageto{PolynomialCategory}{POLYCAT}
+\pageto{UnivariatePolynomialCategory}{UPOLYC}
 \pagefrom{BiModule}{BMODULE}
 \pagefrom{Ring}{RING}
 
@@ -17470,6 +17744,14 @@ digraph pic {
 \item {\bf \cross{COMRING}{commutative("*")}}
 is true if it has an operation $"*": (D,D) -> D$
 which is commutative.
+\item {\bf \cross{COMRING}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{COMRING}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{COMRING}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
 \end{itemize}
 
 These exports come from \refto{Ring}():
@@ -17597,6 +17879,7 @@ digraph pic {
 
 {\bf See:}\\
 \pageto{FiniteFieldCategory}{FFIELDC}
+\pageto{UnivariatePolynomialCategory}{UPOLYC}
 \pagefrom{Ring}{RING}
 
 {\bf Exports:}\\
@@ -17624,6 +17907,14 @@ digraph pic {
 \cross{DIFRING}{?=?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{DIFRING}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  differentiate : % -> %
@@ -17638,8 +17929,8 @@ These are implemented by this category:
 
 These exports come from \refto{Ring}():
 \begin{verbatim}
- 1 : () -> %                          
  0 : () -> %
+ 1 : () -> %                          
  characteristic : () -> NonNegativeInteger
  coerce : Integer -> %
  coerce : % -> OutputForm             
@@ -17796,7 +18087,15 @@ digraph pic {
 {\bf Attributes Exported:}
 \begin{itemize}
 \item {\bf \cross{ENTIRER}{noZeroDivisors}}
-is true if $x * y ~= 0$ implies both x and y are non-zero.
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{ENTIRER}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{ENTIRER}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{ENTIRER}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
 \end{itemize}
 
 These exports come from \refto{Ring}():
@@ -17950,6 +18249,13 @@ digraph pic {
 \cross{LINEXP}{?\~{}=?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{LINEXP}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  reducedSystem : (Matrix %,Vector %) -> 
@@ -18114,6 +18420,14 @@ digraph pic {
 \cross{ORDRING}{?$>=$?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{ORDRING}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\end{itemize}
+
 These are implemented by this category:
 \begin{verbatim}
  abs : % -> %
@@ -18304,6 +18618,14 @@ digraph pic {
 \cross{PDRING}{?=?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{PDRING}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  differentiate : (%,S) -> %           
@@ -18484,6 +18806,7 @@ digraph pic {
 \pagepic{ps/v102differentialextension.ps}{DIFEXT}{0.65}
 
 {\bf See:}\\
+\pageto{UnivariatePolynomialCategory}{UPOLYC}
 \pagefrom{PartialDifferentialRing}{PDRING}
 \pagefrom{Ring}{RING}
 
@@ -18512,6 +18835,14 @@ digraph pic {
 \cross{DIFEXT}{?\^{}?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{DIFEXT}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  differentiate : (%,(R -> R)) -> %
@@ -18744,6 +19075,25 @@ digraph pic {
 \cross{FAMR}{?/?} &&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item if \$ has CommutativeRing then commutative("*") where
+{\bf \cross{FAMR}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item if \$ has IntegralDomain then noZeroDivisors where
+{\bf \cross{FAMR}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{FAMR}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{FAMR}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{FAMR}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 
 These are directly exported but not implemented:
 \begin{verbatim}
@@ -19073,6 +19423,14 @@ digraph pic {
 \cross{FLINEXP}{?\~{}=?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{FLINEXP}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\end{itemize}
+
 These are implemented by this category:
 \begin{verbatim}
  reducedSystem : Matrix % -> 
@@ -19236,6 +19594,14 @@ digraph pic {
 \cross{MODULE}{?=?} &&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{MODULE}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{MODULE}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are implemented by this category:
 \begin{verbatim}
  ?*? : (%,R) -> %                     
@@ -19371,6 +19737,18 @@ digraph pic {
 \cross{ALGEBRA}{?\^{}?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{ALGEBRA}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{ALGEBRA}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{ALGEBRA}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are implemented by this category:
 \begin{verbatim}
  coerce : R -> %
@@ -19553,6 +19931,14 @@ digraph pic {
 \cross{NAALG}{?=?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{NAALG}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{NAALG}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are implemented by this category:
 \begin{verbatim}
  plenaryPower : (%,PositiveInteger) -> %
@@ -19710,6 +20096,14 @@ digraph pic {
 \cross{VSPACE}{?=?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{VSPACE}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{VSPACE}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  dimension : () -> CardinalNumber
@@ -19849,6 +20243,21 @@ digraph pic {
 \cross{DIVRING}{?=?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{DIVRING}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{DIVRING}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{DIVRING}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{DIVRING}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\item {\bf nil}
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  inv : % -> %
@@ -20077,12 +20486,18 @@ digraph pic {
 
 {\bf Attributes Exported:}
 \begin{itemize}
-\item if R has IntegralDomain then {\bf \cross{ATTREG}{unitsKnown}}
+\item if R has IntegralDomain then unitsKnown where
+{\bf \cross{FINAALG}{unitsKnown}}
 is true if a monoid (a multiplicative semigroup with a 1) has 
 unitsKnown means that  the operation {\tt recip} can only return 
 ``failed'' if its argument is not a unit.
+\item {\bf \cross{FINAALG}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{FINAALG}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
 \end{itemize}
 
+
 These are directly exported but not implemented:
 \begin{verbatim}
  conditionsForIdempotents : Vector % -> List Polynomial R
@@ -20897,6 +21312,7 @@ digraph pic {
 {\bf See:}\\
 \pageto{GcdDomain}{GCDDOM}
 \pageto{OrderedIntegralDomain}{OINTDOM}
+\pageto{UnivariatePolynomialCategory}{UPOLYC}
 \pagefrom{Algebra}{ALGEBRA}
 \pagefrom{CommutativeRing}{COMRING}
 \pagefrom{EntireRing}{ENTIRER}
@@ -20929,6 +21345,23 @@ digraph pic {
 \cross{INTDOM}{?=?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{INTDOM}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{INTDOM}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{INTDOM}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{INTDOM}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{INTDOM}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 {\bf Attributes Used:}
 \begin{itemize}
 \item {\bf \cross{INTDOM}{canonicalUnitNormal}}
@@ -21182,6 +21615,19 @@ digraph pic {
 \cross{FRNAALG}{?\~{}=?} \\
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item if \$ has IntegralDomain then unitsKnown where
+{\bf \cross{FRNAALG}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{FRNAALG}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{FRNAALG}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  apply : (Matrix R,%) -> %
@@ -21689,6 +22135,7 @@ digraph pic {
 \pageto{PolynomialCategory}{POLYCAT}
 \pageto{PrincipalIdealDomain}{PID}
 \pageto{UniqueFactorizationDomain}{UFD}
+\pageto{UnivariatePolynomialCategory}{UPOLYC}
 \pagefrom{IntegralDomain}{INTDOM}
 
 {\bf Exports:}\\
@@ -21722,6 +22169,23 @@ digraph pic {
 \cross{GCDDOM}{?\~{}=?} &&&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{GCDDOM}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{GCDDOM}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{GCDDOM}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{GCDDOM}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{GCDDOM}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  gcd : (%,%) -> %                     
@@ -21934,6 +22398,23 @@ digraph pic {
 \cross{OINTDOM}{?\~{}=?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{OINTDOM}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{OINTDOM}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{OINTDOM}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{OINTDOM}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{OINTDOM}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These exports come from \refto{IntegralDomain}():
 \begin{verbatim}
  0 : () -> %
@@ -22105,6 +22586,23 @@ digraph pic {
 \cross{PID}{?\^{}?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{PID}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{PID}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{PID}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{PID}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{PID}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  expressIdealMember : (List %,%) -> Union(List %,"failed")
@@ -22281,6 +22779,23 @@ digraph pic {
 \cross{UFD}{?\^{}?} &
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{UFD}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{UFD}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{UFD}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{UFD}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{UFD}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  factor : % -> Factored %
@@ -22474,6 +22989,23 @@ digraph pic {
 \cross{EUCDOM}{?\^{}?} &&&&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{EUCDOM}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{EUCDOM}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{EUCDOM}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{EUCDOM}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{EUCDOM}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  divide : (%,%) -> Record(quotient: %,remainder: %)
@@ -22742,6 +23274,7 @@ digraph pic {
 
 {\bf See:}\\
 \pageto{PolynomialCategory}{POLYCAT}
+\pageto{UnivariatePolynomialCategory}{UPOLYC}
 \pagefrom{UniqueFactorizationDomain}{UFD}
 
 {\bf Exports:}\\
@@ -22785,6 +23318,23 @@ digraph pic {
 \cross{PFECAT}{?\~{}=?} &&
 \end{tabular}
 
+{\bf Attributes exported:}
+\begin{itemize}
+\item {\bf \cross{PFECAT}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{PFECAT}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{PFECAT}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{PFECAT}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{PFECAT}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  conditionP : Matrix % -> Union(Vector %,"failed") 
@@ -22999,6 +23549,7 @@ digraph pic {
 \pageto{ExtensionField}{XF}
 \pageto{FieldOfPrimeCharacteristic}{FPC}
 \pageto{FiniteRankAlgebra}{FINRALG}
+\pageto{UnivariatePolynomialCategory}{UPOLYC}
 \pagefrom{DivisionRing}{DIVRING}
 \pagefrom{EuclideanDomain}{EUCDOM}
 \pagefrom{UniqueFactorizationDomain}{UFD}
@@ -23058,6 +23609,19 @@ if and only if {\tt unitCanonical(a) = unitCanonical(b)}.
 \item {\bf \cross{FIELD}{canonicalsClosed}}
 is true if\\
 {\tt unitCanonical(a)*unitCanonical(b) = unitCanonical(a*b)}.
+\item {\bf \cross{FIELD}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{FIELD}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{FIELD}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{FIELD}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{FIELD}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
 \end{itemize}
 
 These are implemented by this category:
@@ -23227,6 +23791,7 @@ digraph pic {
 \pagepic{ps/v102polynomialcategory.ps}{POLYCAT}{1.00}
 
 {\bf See:}\\
+\pageto{UnivariatePolynomialCategory}{UPOLYC}
 \pagefrom{CommutativeRing}{COMRING}
 \pagefrom{ConvertibleTo}{KONVERT}
 \pagefrom{Evalable}{EVALAB}
@@ -23327,13 +23892,28 @@ digraph pic {
 \cross{POLYCAT}{?$>=$?} &
 \end{tabular}
 
-{\bf Attributes exported:}
+{\bf Attributes Exported:}
 \begin{itemize}
-\item if R has canonicalUnitNormal then canonicalUnitNormal where
+\item \item if R has canonicalUnitNormal then canonicalUnitNormal where
 {\bf \cross{POLYCAT}{canonicalUnitNormal}}
 is true if we can choose a canonical representative for each class 
 of associate elements, that is {\tt associates?(a,b)} returns true 
 if and only if {\tt unitCanonical(a) = unitCanonical(b)}.
+\item if \$ has IntegralDomain then noZeroDivisors where
+{\bf \cross{POLYCAT}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item if \$ has CommutativeRing then commutative("*") where
+{\bf \cross{POLYCAT}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{POLYCAT}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{POLYCAT}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{POLYCAT}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
 \end{itemize}
 
 These are directly exported but not implemented:
@@ -24112,6 +24692,10 @@ PolynomialCategory(R:Ring, E:OrderedAbelianMonoidSup, VarSet:OrderedSet):
 "PolynomialCategory(a:Ring,b:OrderedAbelianMonoidSup,c:OrderedSet)"
   -> "CommutativeRing()"
 
+"PolynomialCategory(a:Ring,b:NonNegativeInteger,c:SingletonAsOrderedSet)"
+ [color=seagreen,href="bookvol10.2.pdf#nameddest=POLYCAT"];
+"PolynomialCategory(a:Ring,b:NonNegativeInteger,c:SingletonAsOrderedSet)"
+ -> "PolynomialCategory(a:Ring,b:OrderedAbelianMonoidSup,c:OrderedSet)"
 @
 <<POLYCAT.dotpic>>=
 digraph pic {
@@ -24222,6 +24806,30 @@ digraph pic {
 \cross{FPC}{?\~{}=?} &&&&
 \end{tabular}
 
+{\bf Attributes Exported:}
+\begin{itemize}
+\item {\bf \cross{FPC}{canonicalUnitNormal}}
+is true if we can choose a canonical representative for each class 
+of associate elements, that is {\tt associates?(a,b)} returns true 
+if and only if {\tt unitCanonical(a) = unitCanonical(b)}.
+\item {\bf \cross{FPC}{canonicalsClosed}}
+is true if\\
+{\tt unitCanonical(a)*unitCanonical(b) = unitCanonical(a*b)}.
+\item {\bf \cross{FPC}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{FPC}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{FPC}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{FPC}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{FPC}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  order : % -> OnePointCompletion PositiveInteger
@@ -24426,6 +25034,18 @@ digraph pic {
 \cross{FINRALG}{?\~{}=?} \\
 \end{tabular}
 
+{\bf Attributes Exported:}
+\begin{itemize}
+\item {\bf \cross{FINRALG}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{FINRALG}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{FINRALG}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  characteristicPolynomial : % -> UP
@@ -24634,6 +25254,35 @@ digraph pic {
 \pagepic{ps/v102monogenicalgebra.ps}{MONOGEN}{0.70}
 
 {\bf See:}\\
+
+{\bf Attributes Exported:}
+\begin{itemize}
+\item if \$ has Field then canonicalUnitNormal where
+{\bf \cross{MONOGEN}{canonicalUnitNormal}}
+is true if we can choose a canonical representative for each class 
+of associate elements, that is {\tt associates?(a,b)} returns true 
+if and only if {\tt unitCanonical(a) = unitCanonical(b)}.
+\item if \$ has Field then canonicalClosed where
+{\bf \cross{MONOGEN}{canonicalsClosed}}
+is true if\\
+{\tt unitCanonical(a)*unitCanonical(b) = unitCanonical(a*b)}.
+\item if \$ has Field then noZeroDivisors where
+{\bf \cross{MONOGEN}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{MONOGEN}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{MONOGEN}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{MONOGEN}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{MONOGEN}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
+
 \pageto{FunctionFieldCategory}{FFCAT}
 \pagefrom{CommutativeRing}{COMRING}
 \pagefrom{ConvertibleTo}{KONVERT}
@@ -24774,6 +25423,991 @@ digraph pic {
 }
 
 @
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{UnivariatePolynomialCategory}{UPOLYC}
+\pagepic{ps/v102univariatepolynomialcategory.ps}{UPOLYC}{0.35}
+
+{\bf See:}\\
+\pagefrom{Algebra}{ALGEBRA}
+\pagefrom{CommutativeRing}{COMRING}
+\pagefrom{DifferentialExtension}{DIFEXT}
+\pagefrom{DifferentialRing}{DIFRING}
+\pagefrom{Eltable}{ELTAB}
+\pagefrom{Field}{FIELD}
+\pagefrom{GcdDomain}{GCDDOM}
+\pagefrom{IntegralDomain}{INTDOM}
+\pagefrom{PolynomialCategory}{POLYCAT}
+\pagefrom{PolynomialFactorizationExplicit}{PFECAT}
+\pagefrom{StepThrough}{STEP}
+
+{\bf Exports:}\\
+\begin{tabular}{lll}
+\cross{UPOLYC}{0} &
+\cross{UPOLYC}{1} &
+\cross{UPOLYC}{associates?} \\
+\cross{UPOLYC}{binomThmExpt} &
+\cross{UPOLYC}{characteristic} &
+\cross{UPOLYC}{charthRoot} \\
+\cross{UPOLYC}{coefficient} &
+\cross{UPOLYC}{coefficients} &
+\cross{UPOLYC}{coerce} \\
+\cross{UPOLYC}{composite} &
+\cross{UPOLYC}{conditionP} &
+\cross{UPOLYC}{content} \\
+\cross{UPOLYC}{convert} &
+\cross{UPOLYC}{D} &
+\cross{UPOLYC}{degree} \\
+\cross{UPOLYC}{differentiate} &
+\cross{UPOLYC}{discriminant} &
+\cross{UPOLYC}{divide} \\
+\cross{UPOLYC}{divideExponents} &
+\cross{UPOLYC}{elt} &
+\cross{UPOLYC}{euclideanSize} \\
+\cross{UPOLYC}{eval} &
+\cross{UPOLYC}{expressIdealMember} &
+\cross{UPOLYC}{exquo} \\
+\cross{UPOLYC}{extendedEuclidean} &
+\cross{UPOLYC}{factor} &
+\cross{UPOLYC}{factorPolynomial} \\
+\cross{UPOLYC}{factorSquareFreePolynomial} &
+\cross{UPOLYC}{gcd} &
+\cross{UPOLYC}{gcdPolynomial} \\
+\cross{UPOLYC}{ground} &
+\cross{UPOLYC}{ground?} &
+\cross{UPOLYC}{hash} \\
+\cross{UPOLYC}{init} &
+\cross{UPOLYC}{integrate} &
+\cross{UPOLYC}{isExpt} \\
+\cross{UPOLYC}{isPlus} &
+\cross{UPOLYC}{isTimes} &
+\cross{UPOLYC}{karatsubaDivide} \\
+\cross{UPOLYC}{latex} &
+\cross{UPOLYC}{lcm} &
+\cross{UPOLYC}{leadingCoefficient} \\
+\cross{UPOLYC}{leadingMonomial} &
+\cross{UPOLYC}{mainVariable} &
+\cross{UPOLYC}{makeSUP} \\
+\cross{UPOLYC}{map} &
+\cross{UPOLYC}{mapExponents} &
+\cross{UPOLYC}{max} \\
+\cross{UPOLYC}{min} &
+\cross{UPOLYC}{minimumDegree} &
+\cross{UPOLYC}{monicDivide} \\
+\cross{UPOLYC}{monomial} &
+\cross{UPOLYC}{monomial?} &
+\cross{UPOLYC}{monomials} \\
+\cross{UPOLYC}{multiEuclidean} &
+\cross{UPOLYC}{multiplyExponents} &
+\cross{UPOLYC}{multivariate} \\
+\cross{UPOLYC}{nextItem} &
+\cross{UPOLYC}{numberOfMonomials} &
+\cross{UPOLYC}{one?} \\
+\cross{UPOLYC}{order} &
+\cross{UPOLYC}{patternMatch} &
+\cross{UPOLYC}{pomopo!} \\
+\cross{UPOLYC}{prime?} &
+\cross{UPOLYC}{primitiveMonomials} &
+\cross{UPOLYC}{primitivePart} \\
+\cross{UPOLYC}{principalIdeal} &
+\cross{UPOLYC}{pseudoDivide} &
+\cross{UPOLYC}{pseudoQuotient} \\
+\cross{UPOLYC}{pseudoRemainder} &
+\cross{UPOLYC}{recip} &
+\cross{UPOLYC}{reducedSystem} \\
+\cross{UPOLYC}{reductum} &
+\cross{UPOLYC}{resultant} &
+\cross{UPOLYC}{retract} \\
+\cross{UPOLYC}{retractIfCan} &
+\cross{UPOLYC}{sample} &
+\cross{UPOLYC}{separate} \\
+\cross{UPOLYC}{shiftLeft} &
+\cross{UPOLYC}{shiftRight} &
+\cross{UPOLYC}{sizeLess?} \\
+\cross{UPOLYC}{solveLinearPolynomialEquation} &
+\cross{UPOLYC}{squareFree} &
+\cross{UPOLYC}{squareFreePart} \\
+\cross{UPOLYC}{squareFreePolynomial} &
+\cross{UPOLYC}{subResultantGcd} &
+\cross{UPOLYC}{subtractIfCan} \\
+\cross{UPOLYC}{totalDegree} &
+\cross{UPOLYC}{totalDegree} &
+\cross{UPOLYC}{unit?} \\
+\cross{UPOLYC}{unitCanonical} &
+\cross{UPOLYC}{unitNormal} &
+\cross{UPOLYC}{univariate} \\
+\cross{UPOLYC}{unmakeSUP} &
+\cross{UPOLYC}{variables} &
+\cross{UPOLYC}{vectorise} \\
+\cross{UPOLYC}{zero?} &
+\cross{UPOLYC}{?*?} &
+\cross{UPOLYC}{?**?} \\
+\cross{UPOLYC}{?+?} &
+\cross{UPOLYC}{?-?} &
+\cross{UPOLYC}{-?} \\
+\cross{UPOLYC}{?=?} &
+\cross{UPOLYC}{?\^{}?} &
+\cross{UPOLYC}{?.?} \\
+\cross{UPOLYC}{?\~{}=?} &
+\cross{UPOLYC}{?/?} &
+\cross{UPOLYC}{?$<$?} \\
+\cross{UPOLYC}{?$<=$?} &
+\cross{UPOLYC}{?$>$?} &
+\cross{UPOLYC}{?$>=$?} \\
+\cross{UPOLYC}{?quo?} &
+\cross{UPOLYC}{?rem?} &
+\end{tabular}
+
+{\bf Attributes exported:}
+\begin{itemize}
+\item if \$ has CommutativeRing then commutative("*") where
+{\bf \cross{UPOLYC}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item if \$ has IntegralDomain then noZeroDivisors where
+{\bf \cross{UPOLYC}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item if R has Field then additiveValuation where
+{\bf \cross{UPOLYC}{additiveValuation}} implies\\
+{\tt euclideanSize(a*b)=euclideanSize(a)+euclideanSize(b)}.
+\item if \$ has canonicalUnitNormal then canonicalUnitNormal where
+{\bf \cross{UPOLYC}{canonicalUnitNormal}}
+is true if we can choose a canonical representative for each class 
+of associate elements, that is {\tt associates?(a,b)} returns true 
+if and only if {\tt unitCanonical(a) = unitCanonical(b)}.
+\item {\bf \cross{UPOLYC}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{UPOLYC}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{UPOLYC}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ discriminant : % -> R if R has COMRING
+ divideExponents : (%,NonNegativeInteger) -> Union(%,"failed")
+ monicDivide : (%,%) -> Record(quotient: %,remainder: %)
+ multiplyExponents : (%,NonNegativeInteger) -> %
+ pseudoRemainder : (%,%) -> %         
+ resultant : (%,%) -> R if R has COMRING
+ subResultantGcd : (%,%) -> % if R has INTDOM
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ 0 : () -> %                          
+ 1 : () -> %
+ associates? : (%,%) -> Boolean if R has INTDOM
+ binomThmExpt : (%,%,NonNegativeInteger) -> % 
+     if R has COMRING
+ characteristic : () -> NonNegativeInteger
+ coefficient : (%,NonNegativeInteger) -> R
+ coefficients : % -> List R           
+ coerce : R -> %
+ coerce : Fraction Integer -> % 
+     if R has RETRACT FRAC INT 
+     or R has ALGEBRA FRAC INT
+ coerce : % -> % if R has INTDOM
+ content : % -> R if R has GCDDOM
+ coerce : Integer -> %                
+ coerce : % -> OutputForm
+ coerce : SingletonAsOrderedSet -> %
+ composite : (Fraction %,%) -> Union(Fraction %,"failed") 
+     if R has INTDOM
+ composite : (%,%) -> Union(%,"failed") 
+     if R has INTDOM
+ content : (%,SingletonAsOrderedSet) -> % 
+     if R has GCDDOM
+ D : (%,List SingletonAsOrderedSet) -> %
+ D : (%,SingletonAsOrderedSet) -> %
+ D : (%,List SingletonAsOrderedSet,List NonNegativeInteger) -> %
+ D : (%,SingletonAsOrderedSet,NonNegativeInteger) -> %
+ degree : % -> NonNegativeInteger     
+ degree :
+   (%,List SingletonAsOrderedSet) -> List NonNegativeInteger
+ differentiate :
+   (%,List SingletonAsOrderedSet,List NonNegativeInteger) -> %
+ differentiate :
+   (%,SingletonAsOrderedSet,NonNegativeInteger) -> %
+ differentiate : (%,List SingletonAsOrderedSet) -> %
+ differentiate : (%,(R -> R),%) -> %
+ differentiate : (%,(R -> R)) -> %
+ differentiate : % -> %
+ differentiate : (%,SingletonAsOrderedSet) -> %
+ divide : (%,%) -> Record(quotient: %,remainder: %) 
+     if R has FIELD
+ elt : (Fraction %,Fraction %) -> Fraction % 
+     if R has INTDOM
+ elt : (Fraction %,R) -> R if R has FIELD
+ euclideanSize : % -> NonNegativeInteger 
+     if R has FIELD
+ eval : (%,List SingletonAsOrderedSet,List %) -> %
+ eval : (%,SingletonAsOrderedSet,%) -> %
+ eval : (%,List SingletonAsOrderedSet,List R) -> %
+ eval : (%,SingletonAsOrderedSet,R) -> %
+ eval : (%,List Equation %) -> %
+ eval : (%,List %,List %) -> %        
+ eval : (%,%,%) -> %
+ eval : (%,Equation %) -> %           
+ exquo : (%,R) -> Union(%,"failed") 
+     if R has INTDOM
+ exquo : (%,%) -> Union(%,"failed") 
+     if R has INTDOM
+ factor : % -> Factored % if R has PFECAT
+ factorPolynomial : 
+   SparseUnivariatePolynomial % -> 
+     Factored SparseUnivariatePolynomial % 
+       if R has PFECAT
+ factorSquareFreePolynomial : 
+   SparseUnivariatePolynomial % ->
+     Factored SparseUnivariatePolynomial % 
+       if R has PFECAT
+ gcd : (%,%) -> % if R has GCDDOM
+ gcd : List % -> % if R has GCDDOM
+ gcdPolynomial :
+   (SparseUnivariatePolynomial %,
+    SparseUnivariatePolynomial %) ->
+      SparseUnivariatePolynomial % 
+        if R has GCDDOM
+ ground : % -> R                      
+ ground? : % -> Boolean
+ hash : % -> SingleInteger            
+ init : () -> % if R has STEP
+ integrate : % -> % if R has ALGEBRA FRAC INT
+ karatsubaDivide :
+   (%,NonNegativeInteger) -> Record(quotient: %,remainder: %)
+ latex : % -> String                  
+ lcm : (%,%) -> % if R has GCDDOM
+ lcm : List % -> % if R has GCDDOM
+ leadingCoefficient : % -> R
+ leadingMonomial : % -> %             
+ mainVariable : % -> Union(SingletonAsOrderedSet,"failed")
+ makeSUP : % -> SparseUnivariatePolynomial R
+ map : ((R -> R),%) -> %
+ mapExponents :
+   ((NonNegativeInteger -> NonNegativeInteger),%) -> %
+ max : (%,%) -> % if R has ORDSET
+ min : (%,%) -> % if R has ORDSET
+ minimumDegree :
+   (%,SingletonAsOrderedSet) -> NonNegativeInteger
+ minimumDegree :
+   (%,List SingletonAsOrderedSet) -> List NonNegativeInteger
+ monomial : (R,NonNegativeInteger) -> %
+ monomial : (%,SingletonAsOrderedSet,NonNegativeInteger) -> %
+ monomial? : % -> Boolean             
+ nextItem : % -> Union(%,"failed") if R has STEP
+ numberOfMonomials : % -> NonNegativeInteger
+ one? : % -> Boolean                  
+ order : (%,%) -> NonNegativeInteger 
+     if R has INTDOM
+ pomopo! : (%,R,NonNegativeInteger,%) -> %
+ prime? : % -> Boolean if R has PFECAT
+ pseudoDivide :
+   (%,%) -> Record(coef: R,quotient: %,remainder: %) 
+     if R has INTDOM
+ pseudoQuotient : (%,%) -> % if R has INTDOM
+ recip : % -> Union(%,"failed")
+ reducedSystem : (Matrix %,Vector %) ->
+   Record(mat: Matrix Integer,vec: Vector Integer)
+     if R has LINEXP INT
+ reducedSystem : Matrix % -> Matrix Integer 
+     if R has LINEXP INT
+ reductum : % -> %                    
+ retract : % -> R
+ retract : % -> Integer if R has RETRACT INT
+ retract : % -> Fraction Integer 
+     if R has RETRACT FRAC INT
+ retractIfCan : % -> Union(Integer,"failed") 
+     if R has RETRACT INT
+ retractIfCan : % -> Union(Fraction Integer,"failed") 
+     if R has RETRACT FRAC INT
+ retractIfCan : % -> Union(R,"failed")
+ sample : () -> %                     
+ separate : (%,%) -> Record(primePart: %,commonPart: %) 
+     if R has GCDDOM
+ shiftLeft : (%,NonNegativeInteger) -> %
+ shiftRight : (%,NonNegativeInteger) -> %
+ solveLinearPolynomialEquation : 
+   (List SparseUnivariatePolynomial %,
+    SparseUnivariatePolynomial %) ->
+      Union(List SparseUnivariatePolynomial %,"failed") 
+        if R has PFECAT
+ squareFree : % -> Factored % if R has GCDDOM
+ squareFreePart : % -> % if R has GCDDOM
+ squareFreePolynomial :
+   SparseUnivariatePolynomial % ->
+     Factored SparseUnivariatePolynomial % 
+      if R has PFECAT
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ totalDegree :
+   (%,List SingletonAsOrderedSet) -> NonNegativeInteger
+ unit? : % -> Boolean if R has INTDOM
+ unitCanonical : % -> % if R has INTDOM
+ unitNormal : % -> Record(unit: %,canonical: %,associate: %) 
+     if R has INTDOM
+ unmakeSUP : SparseUnivariatePolynomial R -> %
+ variables : % -> List SingletonAsOrderedSet
+ vectorise : (%,NonNegativeInteger) -> Vector R
+ zero? : % -> Boolean
+ ?<=? : (%,%) -> Boolean if R has ORDSET
+ ?>? : (%,%) -> Boolean if R has ORDSET
+ ?>=? : (%,%) -> Boolean if R has ORDSET
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean              
+ ?*? : (%,R) -> %                     
+ ?*? : (R,%) -> %
+ ?*? : (Fraction Integer,%) -> % 
+     if R has ALGEBRA FRAC INT
+ ?*? : (%,Fraction Integer) -> % 
+     if R has ALGEBRA FRAC INT
+ ?*? : (%,%) -> %                     
+ ?*? : (Integer,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?/? : (%,R) -> % if R has FIELD
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?^? : (%,PositiveInteger) -> %
+ ?^? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?.? : (%,Fraction %) -> Fraction % 
+     if R has INTDOM
+\end{verbatim}
+
+These exports come from \refto{PolynomialCategory}(R,N,S)\\
+where R:Ring, N:NonNegativeInteger, S:SingletonAsOrderedSet:
+\begin{verbatim}
+ charthRoot : % -> Union(%,"failed") 
+   if 
+    and(has($,CharacteristicNonZero),
+        has(R,PolynomialFactorizationExplicit)) 
+    or R has CHARNZ
+ coefficient :
+   (%,SingletonAsOrderedSet,NonNegativeInteger) -> %
+ coefficient :
+   (%,List SingletonAsOrderedSet,List NonNegativeInteger) -> %
+ conditionP : Matrix % -> Union(Vector %,"failed") 
+  if and(has($,CharacteristicNonZero),
+         has(R,PolynomialFactorizationExplicit))
+ convert : % -> Pattern Integer 
+     if SingletonAsOrderedSet has KONVERT PATTERN INT 
+     and R has KONVERT PATTERN INT
+ convert : % -> Pattern Float 
+     if SingletonAsOrderedSet has KONVERT PATTERN FLOAT 
+     and R has KONVERT PATTERN FLOAT
+ convert : % -> InputForm 
+     if SingletonAsOrderedSet has KONVERT INFORM 
+     and R has KONVERT INFORM
+ degree : (%,SingletonAsOrderedSet) -> NonNegativeInteger
+ discriminant : (%,SingletonAsOrderedSet) -> % 
+     if R has COMRING
+ isExpt : % ->
+   Union(
+    Record(var: SingletonAsOrderedSet,exponent: NonNegativeInteger),
+   "failed")
+ isPlus : % -> Union(List %,"failed")
+ isTimes : % -> Union(List %,"failed")
+ minimumDegree : % -> NonNegativeInteger
+ monicDivide :
+   (%,%,SingletonAsOrderedSet) -> Record(quotient: %,remainder: %)
+ monomial :
+   (%,List SingletonAsOrderedSet,List NonNegativeInteger) -> %
+ monomials : % -> List %
+ multivariate :
+   (SparseUnivariatePolynomial %,SingletonAsOrderedSet) -> %
+ multivariate :
+   (SparseUnivariatePolynomial R,SingletonAsOrderedSet) -> %
+ patternMatch :
+  (%,Pattern Integer,PatternMatchResult(Integer,%)) ->
+    PatternMatchResult(Integer,%) 
+     if SingletonAsOrderedSet has PATMAB INT 
+     and R has PATMAB INT
+ patternMatch :
+  (%,Pattern Float,PatternMatchResult(Float,%)) ->
+    PatternMatchResult(Float,%) 
+     if SingletonAsOrderedSet has PATMAB FLOAT 
+     and R has PATMAB FLOAT
+ primitiveMonomials : % -> List %
+ primitivePart : (%,SingletonAsOrderedSet) -> % 
+     if R has GCDDOM
+ primitivePart : % -> % if R has GCDDOM
+ reducedSystem : Matrix % -> Matrix R
+ reducedSystem : (Matrix %,Vector %) ->
+   Record(mat: Matrix R,vec: Vector R)
+ resultant : (%,%,SingletonAsOrderedSet) -> % 
+     if R has COMRING
+ retract : % -> SingletonAsOrderedSet
+ retractIfCan : % -> Union(SingletonAsOrderedSet,"failed")
+ totalDegree : % -> NonNegativeInteger
+ univariate : % -> SparseUnivariatePolynomial R
+ univariate :
+   (%,SingletonAsOrderedSet) -> SparseUnivariatePolynomial %
+ ?<? : (%,%) -> Boolean if R has ORDSET
+\end{verbatim}
+
+These exports come from \refto{Eltable}(R:Ring,R:Ring):
+\begin{verbatim}
+ ?.? : (%,R) -> R
+\end{verbatim}
+
+These exports come from \refto{Eltable}(R:UPOLYC,R:UPOLYC):
+\begin{verbatim}
+ ?.? : (%,%) -> %                     
+\end{verbatim}
+
+These exports come from \refto{DifferentialRing}():
+\begin{verbatim}
+ D : % -> %
+ D : (%,NonNegativeInteger) -> %      
+ differentiate : (%,NonNegativeInteger) -> %
+\end{verbatim}
+
+These exports come from \refto{DifferentialExtension}(R:Ring):
+\begin{verbatim}
+ D : (%,(R -> R)) -> %                
+ D : (%,(R -> R),NonNegativeInteger) -> %
+ 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
+ differentiate : (%,(R -> R),NonNegativeInteger) -> %
+ differentiate : (%,Symbol) -> % 
+     if R has PDRING SYMBOL
+ 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
+\end{verbatim}
+
+These exports come from \refto{StepThrough}()
+\begin{verbatim}
+\end{verbatim}
+
+These exports come from \refto{CommutativeRing}()
+\begin{verbatim}
+\end{verbatim}
+
+These exports come from \refto{IntegralDomain}()
+\begin{verbatim}
+\end{verbatim}
+
+These exports come from \refto{GcdDomain}()
+\begin{verbatim}
+\end{verbatim}
+
+These exports come from \refto{Field}()
+\begin{verbatim}
+ expressIdealMember : (List %,%) -> Union(List %,"failed") 
+     if R has FIELD
+ extendedEuclidean : (%,%) ->
+   Record(coef1: %,coef2: %,generator: %) 
+     if R has FIELD
+ extendedEuclidean :
+   (%,%,%) -> Union(Record(coef1: %,coef2: %),"failed") 
+     if R has FIELD
+ multiEuclidean : (List %,%) -> Union(List %,"failed") 
+     if R has FIELD
+ principalIdeal : List % -> Record(coef: List %,generator: %) 
+     if R has FIELD
+ sizeLess? : (%,%) -> Boolean if R has FIELD
+ ?quo? : (%,%) -> % if R has FIELD
+ ?rem? : (%,%) -> % if R has FIELD
+\end{verbatim}
+
+These exports come from \refto{Algebra}(Fraction(Integer))
+\begin{verbatim}
+\end{verbatim}
+
+These exports come from \refto{PolynomialFactorizationExplicit}()
+\begin{verbatim}
+\end{verbatim}
+
+<<category UPOLYC UnivariatePolynomialCategory>>=
+)abbrev category UPOLYC UnivariatePolynomialCategory
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions: Ring, monomial, coefficient, reductum, differentiate,
+++ elt, map, resultant, discriminant
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The category of univariate polynomials over a ring R.
+++ No particular model is assumed - implementations can be either
+++ sparse or dense.
+
+UnivariatePolynomialCategory(R:Ring): Category ==
+ Join(PolynomialCategory(R, NonNegativeInteger, SingletonAsOrderedSet),
+      Eltable(R, R), Eltable(%, %), DifferentialRing,
+      DifferentialExtension R) with
+    vectorise        : (%,NonNegativeInteger) -> Vector R
+      ++ vectorise(p, n) returns \spad{[a0,...,a(n-1)]} where
+      ++ \spad{p = a0 + a1*x + ... + a(n-1)*x**(n-1)} + higher order terms.
+      ++ The degree of polynomial p can be different from \spad{n-1}.
+    makeSUP: % -> SparseUnivariatePolynomial R
+      ++ makeSUP(p) converts the polynomial p to be of type
+      ++ SparseUnivariatePolynomial over the same coefficients.
+    unmakeSUP: SparseUnivariatePolynomial R -> %
+      ++ unmakeSUP(sup) converts sup of type 
+      ++ \spadtype{SparseUnivariatePolynomial(R)}
+      ++ to be a member of the given type.
+      ++ Note: converse of makeSUP.
+    multiplyExponents: (%,NonNegativeInteger) -> %
+      ++ multiplyExponents(p,n) returns a new polynomial resulting from
+      ++ multiplying all exponents of the polynomial p by the non negative
+      ++ integer n.
+    divideExponents: (%,NonNegativeInteger) -> Union(%,"failed")
+      ++ divideExponents(p,n) returns a new polynomial resulting from
+      ++ dividing all exponents of the polynomial p by the non negative
+      ++ integer n, or "failed" if some exponent is not exactly divisible
+      ++ by n.
+    monicDivide: (%,%) -> Record(quotient:%,remainder:%)
+      ++ monicDivide(p,q) divide the polynomial p by the monic polynomial q,
+      ++ returning the pair \spad{[quotient, remainder]}.
+      ++ Error: if q isn't monic.
+-- These three are for Karatsuba
+    karatsubaDivide: (%,NonNegativeInteger) -> Record(quotient:%,remainder:%)
+      ++ \spad{karatsubaDivide(p,n)} returns the same as 
+      ++ \spad{monicDivide(p,monomial(1,n))}
+    shiftRight: (%,NonNegativeInteger) -> %
+      ++ \spad{shiftRight(p,n)} returns 
+      ++ \spad{monicDivide(p,monomial(1,n)).quotient}
+    shiftLeft: (%,NonNegativeInteger) -> %
+      ++ \spad{shiftLeft(p,n)} returns \spad{p * monomial(1,n)}
+    pseudoRemainder: (%,%) -> %
+       ++ pseudoRemainder(p,q) = r, for polynomials p and q, returns the 
+       ++ remainder when
+       ++ \spad{p' := p*lc(q)**(deg p - deg q + 1)}
+       ++ is pseudo right-divided by q, i.e. \spad{p' = s q + r}.
+    differentiate: (%, R -> R, %) -> %
+       ++ differentiate(p, d, x') extends the R-derivation d to an
+       ++ extension D in \spad{R[x]} where Dx is given by x', and 
+       ++ returns \spad{Dp}.
+    if R has StepThrough then StepThrough
+    if R has CommutativeRing then
+      discriminant: % -> R
+        ++ discriminant(p) returns the discriminant of the polynomial p.
+      resultant: (%,%) -> R
+        ++ resultant(p,q) returns the resultant of the polynomials p and q.
+    if R has IntegralDomain then
+        Eltable(Fraction %, Fraction %)
+        elt  : (Fraction %, Fraction %) -> Fraction %
+             ++ elt(a,b) evaluates the fraction of univariate polynomials 
+             ++ \spad{a} with the distinguished variable replaced by b.
+        order: (%, %) -> NonNegativeInteger
+             ++ order(p, q) returns the largest n such that \spad{q**n} 
+             ++ divides polynomial p
+             ++ i.e. the order of \spad{p(x)} at \spad{q(x)=0}.
+        subResultantGcd: (%,%) -> %
+           ++ subResultantGcd(p,q) computes the gcd of the polynomials p 
+           ++ and q using the SubResultant GCD algorithm.
+        composite: (%, %) -> Union(%, "failed")
+           ++ composite(p, q) returns h if \spad{p = h(q)}, and "failed" 
+           ++ no such h exists.
+        composite: (Fraction %, %) -> Union(Fraction %, "failed")
+           ++ composite(f, q) returns h if f = h(q), and "failed" is 
+           ++ no such h exists.
+        pseudoQuotient: (%,%) -> %
+           ++ pseudoQuotient(p,q) returns r, the quotient when
+           ++ \spad{p' := p*lc(q)**(deg p - deg q + 1)}
+           ++ is pseudo right-divided by q, i.e. \spad{p' = s q + r}.
+        pseudoDivide: (%, %) -> Record(coef:R, quotient: %, remainder:%)
+           ++ pseudoDivide(p,q) returns \spad{[c, q, r]}, when
+           ++ \spad{p' := p*lc(q)**(deg p - deg q + 1) = c * p}
+           ++ is pseudo right-divided by q, i.e. \spad{p' = s q + r}.
+    if R has GcdDomain then
+        separate: (%, %) -> Record(primePart:%, commonPart: %)
+           ++ separate(p, q) returns \spad{[a, b]} such that polynomial 
+           ++ \spad{p = a b} and \spad{a} is relatively prime to q.
+    if R has Field then
+        EuclideanDomain
+        additiveValuation
+          ++ euclideanSize(a*b) = euclideanSize(a) + euclideanSize(b)
+        elt      : (Fraction %, R) -> R
+          ++ elt(a,r) evaluates the fraction of univariate polynomials 
+          ++ \spad{a} with the distinguished variable replaced by the 
+          ++ constant r.
+    if R has Algebra Fraction Integer then
+      integrate: % -> %
+        ++ integrate(p) integrates the univariate polynomial p with respect
+        ++ to its distinguished variable.
+  add
+    pp,qq: SparseUnivariatePolynomial %
+
+    variables(p) ==
+      zero? p or zero?(degree p) => []
+      [create()]
+
+    degree(p:%,v:SingletonAsOrderedSet) == degree p
+
+    totalDegree(p:%,lv:List SingletonAsOrderedSet) ==
+       empty? lv => 0
+       totalDegree p
+
+    degree(p:%,lv:List SingletonAsOrderedSet) ==
+       empty? lv => []
+       [degree p]
+
+    eval(p:%,lv: List SingletonAsOrderedSet,lq: List %):% ==
+      empty? lv => p
+      not empty? rest lv => _
+        error "can only eval a univariate polynomial once"
+      eval(p,first lv,first lq)$%
+
+    eval(p:%,v:SingletonAsOrderedSet,q:%):% == p(q)
+
+    eval(p:%,lv: List SingletonAsOrderedSet,lr: List R):% ==
+      empty? lv => p
+      not empty? rest lv => _
+         error "can only eval a univariate polynomial once"
+      eval(p,first lv,first lr)$%
+
+    eval(p:%,v:SingletonAsOrderedSet,r:R):% == p(r)::%
+
+    eval(p:%,le:List Equation %):% == 
+      empty? le  => p
+      not empty? rest le => _
+         error "can only eval a univariate polynomial once"
+      mainVariable(lhs first le) case "failed" => p
+      p(rhs first le)
+
+    mainVariable(p:%) ==
+      zero? degree p =>  "failed"
+      create()$SingletonAsOrderedSet
+
+    minimumDegree(p:%,v:SingletonAsOrderedSet) == minimumDegree p
+
+    minimumDegree(p:%,lv:List SingletonAsOrderedSet) ==
+       empty? lv => []
+       [minimumDegree p]
+
+    monomial(p:%,v:SingletonAsOrderedSet,n:NonNegativeInteger) ==
+       mapExponents(#1+n,p)
+
+    coerce(v:SingletonAsOrderedSet):% == monomial(1,1)
+
+    makeSUP p ==
+      zero? p => 0
+      monomial(leadingCoefficient p,degree p) + makeSUP reductum p
+
+    unmakeSUP sp ==
+      zero? sp => 0
+      monomial(leadingCoefficient sp,degree sp) + unmakeSUP reductum sp
+
+    karatsubaDivide(p:%,n:NonNegativeInteger) == monicDivide(p,monomial(1,n))
+
+    shiftRight(p:%,n:NonNegativeInteger) == 
+       monicDivide(p,monomial(1,n)).quotient
+
+    shiftLeft(p:%,n:NonNegativeInteger) == p * monomial(1,n)
+
+    if R has PolynomialFactorizationExplicit then
+       PFBRU ==> PolynomialFactorizationByRecursionUnivariate(R,%)
+       pp,qq:SparseUnivariatePolynomial %
+       lpp:List SparseUnivariatePolynomial %
+       SupR ==> SparseUnivariatePolynomial R
+       sp:SupR
+
+       solveLinearPolynomialEquation(lpp,pp) ==
+         solveLinearPolynomialEquationByRecursion(lpp,pp)$PFBRU
+
+       factorPolynomial(pp) ==
+         factorByRecursion(pp)$PFBRU
+
+       factorSquareFreePolynomial(pp) ==
+         factorSquareFreeByRecursion(pp)$PFBRU
+
+       import FactoredFunctions2(SupR,S)
+
+       factor p ==
+         zero? degree p  =>
+           ansR:=factor leadingCoefficient p
+           makeFR(unit(ansR)::%,
+                  [[w.flg,w.fctr::%,w.xpnt] for w in factorList ansR])
+         map(unmakeSUP,factorPolynomial(makeSUP p)$R)
+
+    vectorise(p, n) ==
+      m := minIndex(v := new(n, 0)$Vector(R))
+      for i in minIndex v .. maxIndex v repeat
+        qsetelt_!(v, i, coefficient(p, (i - m)::NonNegativeInteger))
+      v
+
+    retract(p:%):R ==
+      zero? p => 0
+      zero? degree p => leadingCoefficient p
+      error "Polynomial is not of degree 0"
+
+    retractIfCan(p:%):Union(R, "failed") ==
+      zero? p => 0
+      zero? degree p => leadingCoefficient p
+      "failed"
+
+    if R has StepThrough then
+       init() == init()$R::%
+
+       nextItemInner: % -> Union(%,"failed")
+
+       nextItemInner(n) ==
+         zero? n => nextItem(0$R)::R::% -- assumed not to fail
+         zero? degree n =>
+           nn:=nextItem leadingCoefficient n
+           nn case "failed" => "failed"
+           nn::R::%
+         n1:=reductum n
+         n2:=nextItemInner n1 -- try stepping the reductum
+         n2 case % => monomial(leadingCoefficient n,degree n) + n2
+         1+degree n1 < degree n => -- there was a hole between lt n and n1
+           monomial(leadingCoefficient n,degree n)+
+             monomial(nextItem(init()$R)::R,1+degree n1)
+         n3:=nextItem leadingCoefficient n
+         n3 case "failed" => "failed"
+         monomial(n3,degree n)
+
+       nextItem(n) ==
+         n1:=nextItemInner n
+         n1 case "failed" => monomial(nextItem(init()$R)::R,1+degree(n))
+         n1
+
+    if R has GcdDomain then
+
+      content(p:%,v:SingletonAsOrderedSet) == content(p)::%
+
+      primeFactor: (%, %) -> %
+
+      primeFactor(p, q) ==
+        (p1 := (p exquo gcd(p, q))::%) = p => p
+        primeFactor(p1, q)
+
+      separate(p, q) ==
+        a := primeFactor(p, q)
+        [a, (p exquo a)::%]
+
+    if R has CommutativeRing then
+      differentiate(x:%, deriv:R -> R, x':%) ==
+        d:% := 0
+        while (dg := degree x) > 0 repeat
+          lc := leadingCoefficient x
+          d := d + x' * monomial(dg * lc, (dg - 1)::NonNegativeInteger)
+                 + monomial(deriv lc, dg)
+          x := reductum x
+        d + deriv(leadingCoefficient x)::%
+    else
+      ncdiff: (NonNegativeInteger, %) -> %
+      -- computes d(x**n) given dx = x', non-commutative case
+      ncdiff(n, x') ==
+        zero? n => 0
+        zero?(n1 := (n - 1)::NonNegativeInteger) => x'
+        x' * monomial(1, n1) + monomial(1, 1) * ncdiff(n1, x')
+
+      differentiate(x:%, deriv:R -> R, x':%) ==
+        d:% := 0
+        while (dg := degree x) > 0 repeat
+          lc := leadingCoefficient x
+          d := d + monomial(deriv lc, dg) + lc * ncdiff(dg, x')
+          x := reductum x
+        d + deriv(leadingCoefficient x)::%
+
+    differentiate(x:%, deriv:R -> R) == differentiate(x, deriv, 1$%)$%
+
+    differentiate(x:%) ==
+        d:% := 0
+        while (dg := degree x) > 0 repeat
+          d:=d+monomial(dg*leadingCoefficient x,(dg-1)::NonNegativeInteger)
+          x := reductum x
+        d
+
+    differentiate(x:%,v:SingletonAsOrderedSet) == differentiate x
+
+    if R has IntegralDomain then
+
+      elt(g:Fraction %, f:Fraction %) == ((numer g) f) / ((denom g) f)
+
+      pseudoQuotient(p, q) ==
+        (n := degree(p)::Integer - degree q + 1) < 1 => 0
+        ((leadingCoefficient(q)**(n::NonNegativeInteger) * p
+          - pseudoRemainder(p, q)) exquo q)::%
+
+      pseudoDivide(p, q) ==
+        (n := degree(p)::Integer - degree q + 1) < 1 => [1, 0, p]
+        prem := pseudoRemainder(p, q)
+        lc   := leadingCoefficient(q)**(n::NonNegativeInteger)
+        [lc,((lc*p - prem) exquo q)::%, prem]
+
+      composite(f:Fraction %, q:%) ==
+        (n := composite(numer f, q)) case "failed" => "failed"
+        (d := composite(denom f, q)) case "failed" => "failed"
+        n::% / d::%
+
+      composite(p:%, q:%) ==
+        ground? p => p
+        cqr := pseudoDivide(p, q)
+        ground?(cqr.remainder) and
+          ((v := cqr.remainder exquo cqr.coef) case %) and
+            ((u := composite(cqr.quotient, q)) case %) and
+              ((w := (u::%) exquo cqr.coef) case %) =>
+                v::% + monomial(1, 1) * w::%
+        "failed"
+
+      elt(p:%, f:Fraction %) ==
+        zero? p => 0
+        ans:Fraction(%) := (leadingCoefficient p)::%::Fraction(%)
+        n := degree p
+        while not zero?(p:=reductum p) repeat
+          ans := ans * f ** (n - (n := degree p))::NonNegativeInteger +
+                    (leadingCoefficient p)::%::Fraction(%)
+        zero? n => ans
+        ans * f ** n
+
+      order(p, q) ==
+        zero? p => error "order: arguments must be nonzero"
+        degree(q) < 1 => error "order: place must be non-trivial"
+        ans:NonNegativeInteger := 0
+        repeat
+          (u  := p exquo q) case "failed" => return ans
+          p   := u::%
+          ans := ans + 1
+
+    if R has GcdDomain then
+      squareFree(p:%) ==
+        squareFree(p)$UnivariatePolynomialSquareFree(R, %)
+
+      squareFreePart(p:%) ==
+        squareFreePart(p)$UnivariatePolynomialSquareFree(R, %)
+
+    if R has PolynomialFactorizationExplicit then
+
+      gcdPolynomial(pp,qq) ==
+            zero? pp => unitCanonical qq  -- subResultantGcd can't handle 0
+            zero? qq => unitCanonical pp
+            unitCanonical(gcd(content (pp),content(qq))*
+                   primitivePart
+                      subResultantGcd(primitivePart pp,primitivePart qq))
+
+      squareFreePolynomial pp ==
+         squareFree(pp)$UnivariatePolynomialSquareFree(%,
+                                    SparseUnivariatePolynomial %)
+
+    if R has Field then
+      elt(f:Fraction %, r:R) == ((numer f) r) / ((denom f) r)
+
+      euclideanSize x ==
+            zero? x =>
+              error "euclideanSize called on 0 in Univariate Polynomial"
+            degree x
+
+      divide(x,y) ==
+            zero? y => error "division by 0 in Univariate Polynomials"
+            quot:=0
+            lc := inv leadingCoefficient y
+            while not zero?(x) and (degree x >= degree y) repeat
+               f:=lc*leadingCoefficient x
+               n:=(degree x - degree y)::NonNegativeInteger
+               quot:=quot+monomial(f,n)
+               x:=x-monomial(f,n)*y
+            [quot,x]
+
+    if R has Algebra Fraction Integer then
+
+      integrate p ==
+        ans:% := 0
+        while p ^= 0 repeat
+          l := leadingCoefficient p
+          d := 1 + degree p
+          ans := ans + inv(d::Fraction(Integer)) * monomial(l, d)
+          p := reductum p
+        ans
+
+@
+<<UPOLYC.dotabb>>=
+"UPOLYC"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=UPOLYC"];
+"UPOLYC" -> "POLYCAT"
+"UPOLYC" -> "ELTAB"
+"UPOLYC" -> "DIFRING"
+"UPOLYC" -> "DIFEXT"
+"UPOLYC" -> "STEP"
+"UPOLYC" -> "COMRING"
+"UPOLYC" -> "INTDOM"
+"UPOLYC" -> "GCDDOM"
+"UPOLYC" -> "FIELD"
+"UPOLYC" -> "ALGEBRA"
+"UPOLYC" -> "PFECAT"
+
+@
+<<UPOLYC.dotfull>>=
+"UnivariatePolynomialCategory(a:Ring)"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=UPOLYC"];
+"UnivariatePolynomialCategory(a:Ring)" -> 
+   "PolynomialCategory(a:Ring,b:NonNegativeInteger,c:SingletonAsOrderedSet)"
+"UnivariatePolynomialCategory(a:Ring)" -> 
+   "Eltable(a:Ring,b:Ring)"
+"UnivariatePolynomialCategory(a:Ring)" -> 
+   "Eltable(a:UnivariatePolynomialCategory(a:Ring),b:UnivariatePolynomialCategory(a:Ring))" 
+"UnivariatePolynomialCategory(a:Ring)" -> 
+   "DifferentialRing()"
+"UnivariatePolynomialCategory(a:Ring)" ->
+   "DifferentialExtension(a:Ring)"
+"UnivariatePolynomialCategory(a:Ring)" ->
+   "StepThrough()"
+"UnivariatePolynomialCategory(a:Ring)" ->
+   "CommutativeRing()"
+"UnivariatePolynomialCategory(a:Ring)" ->
+   "IntegralDomain()"
+"UnivariatePolynomialCategory(a:Ring)" ->
+   "GcdDomain()"
+"UnivariatePolynomialCategory(a:Ring)" ->
+   "Field()"
+"UnivariatePolynomialCategory(a:Ring)" ->
+   "Algebra(Fraction(Integer))"
+"UnivariatePolynomialCategory(a:Ring)" ->
+   "PolynomialFactorizationExplicit()"
+
+@
+<<UPOLYC.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"UnivariatePolynomialCategory(a:Ring)" [color=lightblue];
+"UnivariatePolynomialCategory(a:Ring)" -> "POLYCAT..."
+"UnivariatePolynomialCategory(a:Ring)" -> "ELTAB..."
+"UnivariatePolynomialCategory(a:Ring)" -> "DIFRING..."
+"UnivariatePolynomialCategory(a:Ring)" -> "DIFEXT..."
+"UnivariatePolynomialCategory(a:Ring)" -> "STEP..."
+"UnivariatePolynomialCategory(a:Ring)" -> "COMRING..."
+"UnivariatePolynomialCategory(a:Ring)" -> "INTDOM..."
+"UnivariatePolynomialCategory(a:Ring)" -> "GCDDOM..."
+"UnivariatePolynomialCategory(a:Ring)" -> "FIELD..."
+"UnivariatePolynomialCategory(a:Ring)" -> "ALGEBRA..."
+"UnivariatePolynomialCategory(a:Ring)" -> "PFECAT..."
+
+"POLYCAT..." [color=lightblue];
+"ELTAB..." [color=lightblue];
+"DIFRING..." [color=lightblue];
+"DIFEXT..." [color=lightblue];
+"STEP..." [color=lightblue];
+"COMRING..." [color=lightblue];
+"INTDOM..." [color=lightblue];
+"GCDDOM..." [color=lightblue];
+"FIELD..." [color=lightblue];
+"ALGEBRA..." [color=lightblue];
+"PFECAT..." [color=lightblue];
+
+}
+
+@
 \chapter{Category Layer 18}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{ExtensionField}{XF}
@@ -24845,6 +26479,30 @@ digraph pic {
 \cross{XF}{?\~{}=?}\\
 \end{tabular}
 
+{\bf Attributes Exported:}
+\begin{itemize}
+\item {\bf \cross{XF}{canonicalUnitNormal}}
+is true if we can choose a canonical representative for each class 
+of associate elements, that is {\tt associates?(a,b)} returns true 
+if and only if {\tt unitCanonical(a) = unitCanonical(b)}.
+\item {\bf \cross{XF}{canonicalsClosed}}
+is true if\\
+{\tt unitCanonical(a)*unitCanonical(b) = unitCanonical(a*b)}.
+\item {\bf \cross{XF}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{XF}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{XF}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{XF}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{XF}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  inGroundField? : % -> Boolean
@@ -25151,6 +26809,30 @@ digraph pic {
 \cross{FFIELDC}{?\~{}=?} &&&&
 \end{tabular}
 
+{\bf Attributes Exported:}
+\begin{itemize}
+\item {\bf \cross{FFIELDC}{canonicalUnitNormal}}
+is true if we can choose a canonical representative for each class 
+of associate elements, that is {\tt associates?(a,b)} returns true 
+if and only if {\tt unitCanonical(a) = unitCanonical(b)}.
+\item {\bf \cross{FFIELDC}{canonicalsClosed}}
+is true if\\
+{\tt unitCanonical(a)*unitCanonical(b) = unitCanonical(a*b)}.
+\item {\bf \cross{FFIELDC}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{FFIELDC}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{FFIELDC}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{FFIELDC}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{FFIELDC}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  factorsOfCyclicGroupSize : () ->
@@ -25676,6 +27358,32 @@ digraph pic {
 \cross{FFCAT}{?rem?} &
 \end{tabular}
 
+{\bf Attributes Exported:}
+\begin{itemize}
+\item if \$ has Fraction(UPOLYC(UFD)) and Field then noZeroDivisors where
+{\bf \cross{FFCAT}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item if \$ has Fraction(UPOLYC(UFD)) and Field then canonicalUnitNormal
+ where {\bf \cross{FFCAT}{canonicalUnitNormal}}
+is true if we can choose a canonical representative for each class 
+of associate elements, that is {\tt associates?(a,b)} returns true 
+if and only if {\tt unitCanonical(a) = unitCanonical(b)}.
+\item if \$ has Fraction(UPOLYC(UFD)) and Field then canonicalsClosed where
+{\bf \cross{FFCAT}{canonicalsClosed}} is true if\\
+{\tt unitCanonical(a)*unitCanonical(b) = unitCanonical(a*b)}.
+\item {\bf \cross{FFCAT}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{FFCAT}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{FFCAT}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{FFCAT}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 TPDHERE:
 \begin{verbatim}
  0 : () -> %
@@ -26559,6 +28267,18 @@ digraph pic {
 \cross{FRAMALG}{?\~{}=?} &
 \end{tabular}
 
+{\bf Attributes Exported:}
+\begin{itemize}
+\item {\bf \cross{FRAMALG}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{FRAMALG}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{FRAMALG}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  basis : () -> Vector %
@@ -26867,6 +28587,30 @@ digraph pic {
 \cross{FAXF}{?\~{}=?} &
 \end{tabular}
 
+{\bf Attributes Exported:}
+\begin{itemize}
+\item {\bf \cross{FAXF}{canonicalUnitNormal}}
+is true if we can choose a canonical representative for each class 
+of associate elements, that is {\tt associates?(a,b)} returns true 
+if and only if {\tt unitCanonical(a) = unitCanonical(b)}.
+\item {\bf \cross{FAXF}{canonicalsClosed}}
+is true if\\
+{\tt unitCanonical(a)*unitCanonical(b) = unitCanonical(a*b)}.
+\item {\bf \cross{FAXF}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{FAXF}{commutative("*")}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{FAXF}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{FAXF}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{FAXF}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\end{itemize}
+
 These are directly exported but not implemented:
 \begin{verbatim}
  basis : () -> Vector %               
@@ -34840,6 +36584,1540 @@ Note that this code is not included in the generated catdef.spad file.
       (QUOTE |lookupComplete|))) 
 
 @
+\section{UPOLYC.lsp BOOTSTRAP}
+{\bf UPOLYC} depends on itself. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf UPOLYC}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf UPOLYC.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.
+
+<<UPOLYC.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |UnivariatePolynomialCategory;CAT| (QUOTE NIL)) 
+
+(SETQ |UnivariatePolynomialCategory;AL| (QUOTE NIL)) 
+
+(DEFUN |UnivariatePolynomialCategory| (#1=#:G103214) 
+  (LET (#2=#:G103215) 
+    (COND 
+      ((SETQ #2# (|assoc| (|devaluate| #1#) |UnivariatePolynomialCategory;AL|))
+         (CDR #2#))
+      (T 
+        (SETQ |UnivariatePolynomialCategory;AL| 
+          (|cons5| 
+            (CONS 
+              (|devaluate| #1#)
+              (SETQ #2# (|UnivariatePolynomialCategory;| #1#)))
+            |UnivariatePolynomialCategory;AL|))
+         #2#)))) 
+
+(DEFUN |UnivariatePolynomialCategory;| (|t#1|) 
+  (PROG (#1=#:G103213) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|sublisV| 
+            (PAIR (QUOTE (|t#1|)) (LIST (|devaluate| |t#1|)))
+            (|sublisV| 
+              (PAIR 
+                (QUOTE (#2=#:G103211 #3=#:G103212))
+                (LIST 
+                  (QUOTE (|NonNegativeInteger|))
+                  (QUOTE (|SingletonAsOrderedSet|))))
+              (COND 
+                (|UnivariatePolynomialCategory;CAT|)
+                ((QUOTE T) 
+                  (LETT |UnivariatePolynomialCategory;CAT| 
+                    (|Join| 
+                      (|PolynomialCategory| 
+                        (QUOTE |t#1|) (QUOTE #2#) (QUOTE #3#))
+                      (|Eltable| (QUOTE |t#1|) (QUOTE |t#1|))
+                      (|Eltable| (QUOTE |$|) (QUOTE |$|))
+                      (|DifferentialRing|)
+                      (|DifferentialExtension| (QUOTE |t#1|))
+                      (|mkCategory| 
+                        (QUOTE |domain|)
+                        (QUOTE (
+                          ((|vectorise| 
+                            ((|Vector| |t#1|) |$| (|NonNegativeInteger|))) T)
+                          ((|makeSUP| 
+                            ((|SparseUnivariatePolynomial| |t#1|) |$|)) T)
+                          ((|unmakeSUP| 
+                            (|$| (|SparseUnivariatePolynomial| |t#1|))) T)
+                          ((|multiplyExponents| 
+                            (|$| |$| (|NonNegativeInteger|))) T)
+                          ((|divideExponents| 
+                            ((|Union| |$| "failed")
+                             |$| 
+                             (|NonNegativeInteger|))) T)
+                          ((|monicDivide| 
+                            ((|Record| 
+                               (|:| |quotient| |$|)
+                               (|:| |remainder| |$|))
+                             |$| 
+                             |$|)) T)
+                          ((|karatsubaDivide| 
+                            ((|Record| 
+                               (|:| |quotient| |$|)
+                               (|:| |remainder| |$|)) 
+                             |$| 
+                             (|NonNegativeInteger|))) T)
+                          ((|shiftRight| (|$| |$| (|NonNegativeInteger|))) T)
+                          ((|shiftLeft| (|$| |$| (|NonNegativeInteger|))) T)
+                          ((|pseudoRemainder| (|$| |$| |$|)) T)
+                          ((|differentiate| 
+                            (|$| |$| (|Mapping| |t#1| |t#1|) |$|)) T)
+                          ((|discriminant| (|t#1| |$|)) 
+                            (|has| |t#1| (|CommutativeRing|)))
+                          ((|resultant| (|t#1| |$| |$|)) 
+                            (|has| |t#1| (|CommutativeRing|)))
+                          ((|elt| 
+                             ((|Fraction| |$|) 
+                              (|Fraction| |$|)
+                              (|Fraction| |$|)))
+                            (|has| |t#1| (|IntegralDomain|)))
+                          ((|order| ((|NonNegativeInteger|) |$| |$|)) 
+                            (|has| |t#1| (|IntegralDomain|)))
+                          ((|subResultantGcd| (|$| |$| |$|)) 
+                            (|has| |t#1| (|IntegralDomain|)))
+                          ((|composite| ((|Union| |$| "failed") |$| |$|)) 
+                            (|has| |t#1| (|IntegralDomain|)))
+                          ((|composite| 
+                             ((|Union| (|Fraction| |$|) "failed")
+                              (|Fraction| |$|)
+                              |$|)) 
+                            (|has| |t#1| (|IntegralDomain|)))
+                          ((|pseudoQuotient| (|$| |$| |$|)) 
+                            (|has| |t#1| (|IntegralDomain|)))
+                          ((|pseudoDivide| 
+                             ((|Record| 
+                               (|:| |coef| |t#1|)
+                               (|:| |quotient| |$|)
+                               (|:| |remainder| |$|)) 
+                             |$| 
+                             |$|)) 
+                            (|has| |t#1| (|IntegralDomain|)))
+                          ((|separate| 
+                             ((|Record| 
+                               (|:| |primePart| |$|)
+                               (|:| |commonPart| |$|)) 
+                             |$| 
+                             |$|)) 
+                            (|has| |t#1| (|GcdDomain|)))
+                          ((|elt| (|t#1| (|Fraction| |$|) |t#1|)) 
+                            (|has| |t#1| (|Field|)))
+                          ((|integrate| (|$| |$|)) 
+                            (|has| |t#1| 
+                              (|Algebra| (|Fraction| (|Integer|)))))))
+                         (QUOTE (
+                           ((|StepThrough|) (|has| |t#1| (|StepThrough|)))
+                           ((|Eltable| 
+                              (|Fraction| |$|)
+                              (|Fraction| |$|)) 
+                             (|has| |t#1| (|IntegralDomain|)))
+                           ((|EuclideanDomain|) (|has| |t#1| (|Field|)))
+                           (|additiveValuation| (|has| |t#1| (|Field|)))))
+                         (QUOTE (
+                           (|Fraction| |$|)
+                           (|NonNegativeInteger|)
+                           (|SparseUnivariatePolynomial| |t#1|)
+                           (|Vector| |t#1|)))
+                         NIL))
+                    . #4=(|UnivariatePolynomialCategory|))))))
+            . #4#)
+         (SETELT #1# 0 
+           (LIST 
+             (QUOTE |UnivariatePolynomialCategory|)
+             (|devaluate| |t#1|))))))) 
+
+@
+\section{UPOLYC-.lsp BOOTSTRAP}
+{\bf UPOLYC-} depends on {\bf UPOLYC}. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf UPOLYC-}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf UPOLYC-.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.
+
+<<UPOLYC-.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(DEFUN |UPOLYC-;variables;SL;1| (|p| |$|) 
+  (COND 
+    ((OR 
+      (SPADCALL |p| (QREFELT |$| 9))
+      (ZEROP (SPADCALL |p| (QREFELT |$| 11)))) 
+     NIL)
+    ((QUOTE T) (LIST (SPADCALL (QREFELT |$| 13)))))) 
+
+(DEFUN |UPOLYC-;degree;SSaosNni;2| (|p| |v| |$|) 
+  (SPADCALL |p| (QREFELT |$| 11))) 
+
+(DEFUN |UPOLYC-;totalDegree;SLNni;3| (|p| |lv| |$|) 
+  (COND ((NULL |lv|) 0) ((QUOTE T) (SPADCALL |p| (QREFELT |$| 17))))) 
+
+(DEFUN |UPOLYC-;degree;SLL;4| (|p| |lv| |$|) 
+  (COND ((NULL |lv|) NIL) ((QUOTE T) (LIST (SPADCALL |p| (QREFELT |$| 11)))))) 
+
+(DEFUN |UPOLYC-;eval;SLLS;5| (|p| |lv| |lq| |$|) 
+  (COND 
+    ((NULL |lv|) |p|)
+    ((NULL (NULL (CDR |lv|))) 
+      (|error| "can only eval a univariate polynomial once"))
+    ((QUOTE T) 
+      (SPADCALL |p| (|SPADfirst| |lv|) (|SPADfirst| |lq|) (QREFELT |$| 21))))) 
+
+(DEFUN |UPOLYC-;eval;SSaos2S;6| (|p| |v| |q| |$|) 
+  (SPADCALL |p| |q| (QREFELT |$| 24))) 
+
+(DEFUN |UPOLYC-;eval;SLLS;7| (|p| |lv| |lr| |$|) 
+  (COND 
+    ((NULL |lv|) |p|)
+    ((NULL (NULL (CDR |lv|))) 
+      (|error| "can only eval a univariate polynomial once"))
+    ((QUOTE T) 
+      (SPADCALL |p| (|SPADfirst| |lv|) (|SPADfirst| |lr|) (QREFELT |$| 26))))) 
+
+(DEFUN |UPOLYC-;eval;SSaosRS;8| (|p| |v| |r| |$|) 
+  (SPADCALL (SPADCALL |p| |r| (QREFELT |$| 29)) (QREFELT |$| 30))) 
+
+(DEFUN |UPOLYC-;eval;SLS;9| (|p| |le| |$|) 
+  (COND 
+    ((NULL |le|) |p|)
+    ((NULL (NULL (CDR |le|))) 
+      (|error| "can only eval a univariate polynomial once"))
+    ((QUOTE T) 
+      (COND 
+        ((QEQCAR 
+           (SPADCALL 
+             (SPADCALL (|SPADfirst| |le|) (QREFELT |$| 33))
+             (QREFELT |$| 35))
+            1)
+          |p|)
+        ((QUOTE T) 
+          (SPADCALL |p| 
+            (SPADCALL (|SPADfirst| |le|) (QREFELT |$| 36))
+            (QREFELT |$| 24))))))) 
+
+(DEFUN |UPOLYC-;mainVariable;SU;10| (|p| |$|) 
+  (COND 
+    ((ZEROP (SPADCALL |p| (QREFELT |$| 11))) (CONS 1 "failed"))
+    ((QUOTE T) (CONS 0 (SPADCALL (QREFELT |$| 13)))))) 
+
+(DEFUN |UPOLYC-;minimumDegree;SSaosNni;11| (|p| |v| |$|) 
+  (SPADCALL |p| (QREFELT |$| 40))) 
+
+(DEFUN |UPOLYC-;minimumDegree;SLL;12| (|p| |lv| |$|) 
+  (COND ((NULL |lv|) NIL) ((QUOTE T) (LIST (SPADCALL |p| (QREFELT |$| 40)))))) 
+
+(DEFUN |UPOLYC-;monomial;SSaosNniS;13| (|p| |v| |n| |$|) 
+  (SPADCALL 
+    (CONS (FUNCTION |UPOLYC-;monomial;SSaosNniS;13!0|) (VECTOR |$| |n|))
+    |p|
+    (QREFELT |$| 45))) 
+
+(DEFUN |UPOLYC-;monomial;SSaosNniS;13!0| (|#1| |$$|) 
+  (SPADCALL |#1| (QREFELT |$$| 1) (QREFELT (QREFELT |$$| 0) 43))) 
+
+(DEFUN |UPOLYC-;coerce;SaosS;14| (|v| |$|) 
+  (SPADCALL (|spadConstant| |$| 48) 1 (QREFELT |$| 49))) 
+
+(DEFUN |UPOLYC-;makeSUP;SSup;15| (|p| |$|) 
+  (COND 
+    ((SPADCALL |p| (QREFELT |$| 9)) (|spadConstant| |$| 52))
+    ((QUOTE T) 
+      (SPADCALL 
+        (SPADCALL 
+          (SPADCALL |p| (QREFELT |$| 53))
+          (SPADCALL |p| (QREFELT |$| 11))
+          (QREFELT |$| 54))
+        (SPADCALL 
+          (SPADCALL |p| (QREFELT |$| 55))
+          (QREFELT |$| 56))
+        (QREFELT |$| 57))))) 
+
+(DEFUN |UPOLYC-;unmakeSUP;SupS;16| (|sp| |$|) 
+  (COND 
+    ((SPADCALL |sp| (QREFELT |$| 59)) (|spadConstant| |$| 60))
+    ((QUOTE T) 
+      (SPADCALL 
+        (SPADCALL 
+          (SPADCALL |sp| (QREFELT |$| 61))
+          (SPADCALL |sp| (QREFELT |$| 62))
+          (QREFELT |$| 49)) 
+        (SPADCALL (SPADCALL |sp| (QREFELT |$| 63)) (QREFELT |$| 64))
+      (QREFELT |$| 65))))) 
+
+(DEFUN |UPOLYC-;karatsubaDivide;SNniR;17| (|p| |n| |$|) 
+  (SPADCALL |p| 
+    (SPADCALL (|spadConstant| |$| 48) |n| (QREFELT |$| 49))
+    (QREFELT |$| 68))) 
+
+(DEFUN |UPOLYC-;shiftRight;SNniS;18| (|p| |n| |$|) 
+  (QCAR 
+    (SPADCALL |p| 
+      (SPADCALL (|spadConstant| |$| 48) |n| (QREFELT |$| 49))
+      (QREFELT |$| 68)))) 
+
+(DEFUN |UPOLYC-;shiftLeft;SNniS;19| (|p| |n| |$|) 
+  (SPADCALL |p| 
+    (SPADCALL (|spadConstant| |$| 48) |n| (QREFELT |$| 49)) (QREFELT |$| 71))) 
+
+(DEFUN |UPOLYC-;solveLinearPolynomialEquation;LSupU;20| (|lpp| |pp| |$|) 
+  (SPADCALL |lpp| |pp| (QREFELT |$| 77))) 
+
+(DEFUN |UPOLYC-;factorPolynomial;SupF;21| (|pp| |$|) 
+  (SPADCALL |pp| (QREFELT |$| 83))) 
+
+(DEFUN |UPOLYC-;factorSquareFreePolynomial;SupF;22| (|pp| |$|) 
+  (SPADCALL |pp| (QREFELT |$| 86))) 
+
+(DEFUN |UPOLYC-;factor;SF;23| (|p| |$|) 
+  (PROG (|ansR| #1=#:G103310 |w| #2=#:G103311) 
+    (RETURN 
+      (SEQ 
+        (COND 
+          ((ZEROP (SPADCALL |p| (QREFELT |$| 11)))
+            (SEQ 
+              (LETT |ansR| 
+                (SPADCALL 
+                  (SPADCALL |p| (QREFELT |$| 53))
+                  (QREFELT |$| 89)) 
+                |UPOLYC-;factor;SF;23|)
+              (EXIT 
+                (SPADCALL 
+                  (SPADCALL 
+                    (SPADCALL |ansR| (QREFELT |$| 91))
+                    (QREFELT |$| 30)) 
+                  (PROGN 
+                    (LETT #1# NIL |UPOLYC-;factor;SF;23|)
+                    (SEQ 
+                      (LETT |w| NIL |UPOLYC-;factor;SF;23|)
+                      (LETT #2# 
+                        (SPADCALL |ansR| (QREFELT |$| 95))
+                        |UPOLYC-;factor;SF;23|)
+                      G190
+                      (COND 
+                        ((OR 
+                          (ATOM #2#)
+                          (PROGN 
+                            (LETT |w| (CAR #2#) |UPOLYC-;factor;SF;23|)
+                            NIL))
+                         (GO G191)))
+                      (SEQ 
+                        (EXIT 
+                          (LETT #1# 
+                            (CONS 
+                              (VECTOR 
+                                (QVELT |w| 0)
+                                (SPADCALL (QVELT |w| 1) (QREFELT |$| 30))
+                                (QVELT |w| 2)) 
+                               #1#)
+                             |UPOLYC-;factor;SF;23|)))
+                      (LETT #2# (CDR #2#) |UPOLYC-;factor;SF;23|)
+                      (GO G190)
+                      G191
+                      (EXIT (NREVERSE0 #1#))))
+                  (QREFELT |$| 99)))))
+          ((QUOTE T) 
+            (SPADCALL 
+              (ELT |$| 64)
+              (SPADCALL (SPADCALL |p| (QREFELT |$| 56)) (QREFELT |$| 100))
+              (QREFELT |$| 104)))))))) 
+
+(DEFUN |UPOLYC-;vectorise;SNniV;24| (|p| |n| |$|) 
+  (PROG (|v| |m| |i| #1=#:G103316 #2=#:G103312) 
+    (RETURN 
+      (SEQ 
+        (LETT |m| 
+          (SPADCALL 
+            (LETT |v| 
+              (SPADCALL |n| (|spadConstant| |$| 106) (QREFELT |$| 108))
+              |UPOLYC-;vectorise;SNniV;24|)
+            (QREFELT |$| 110))
+          |UPOLYC-;vectorise;SNniV;24|)
+        (SEQ 
+          (LETT |i| 
+            (SPADCALL |v| (QREFELT |$| 110))
+            |UPOLYC-;vectorise;SNniV;24|)
+          (LETT #1# (QVSIZE |v|) |UPOLYC-;vectorise;SNniV;24|)
+          G190
+          (COND ((|>| |i| #1#) (GO G191)))
+          (SEQ 
+            (EXIT 
+              (SPADCALL |v| |i| 
+                (SPADCALL |p| 
+                  (PROG1 
+                    (LETT #2# (|-| |i| |m|) |UPOLYC-;vectorise;SNniV;24|)
+                    (|check-subtype| 
+                      (|>=| #2# 0)
+                      (QUOTE (|NonNegativeInteger|))
+                      #2#)) 
+                  (QREFELT |$| 111))
+                (QREFELT |$| 112))))
+          (LETT |i| (|+| |i| 1) |UPOLYC-;vectorise;SNniV;24|)
+          (GO G190)
+          G191
+          (EXIT NIL))
+        (EXIT |v|))))) 
+
+(DEFUN |UPOLYC-;retract;SR;25| (|p| |$|) 
+  (COND 
+    ((SPADCALL |p| (QREFELT |$| 9)) (|spadConstant| |$| 106))
+    ((ZEROP (SPADCALL |p| (QREFELT |$| 11))) (SPADCALL |p| (QREFELT |$| 53)))
+    ((QUOTE T) (|error| "Polynomial is not of degree 0")))) 
+
+(DEFUN |UPOLYC-;retractIfCan;SU;26| (|p| |$|) 
+  (COND 
+    ((SPADCALL |p| (QREFELT |$| 9)) (CONS 0 (|spadConstant| |$| 106)))
+    ((ZEROP (SPADCALL |p| (QREFELT |$| 11)))
+       (CONS 0 (SPADCALL |p| (QREFELT |$| 53))))
+    ((QUOTE T) (CONS 1 "failed")))) 
+
+(DEFUN |UPOLYC-;init;S;27| (|$|) 
+  (SPADCALL (|spadConstant| |$| 117) (QREFELT |$| 30))) 
+
+(DEFUN |UPOLYC-;nextItemInner| (|n| |$|) 
+  (PROG (|nn| |n1| |n2| #1=#:G103337 |n3|) 
+    (RETURN 
+      (SEQ 
+        (COND 
+          ((SPADCALL |n| (QREFELT |$| 9))
+            (CONS 
+              0 
+              (SPADCALL 
+                (PROG2 
+                  (LETT #1# 
+                    (SPADCALL (|spadConstant| |$| 106) (QREFELT |$| 120))
+                    |UPOLYC-;nextItemInner|) 
+                  (QCDR #1#)
+                  (|check-union| (QEQCAR #1# 0) (QREFELT |$| 7) #1#))
+                (QREFELT |$| 30))))
+          ((ZEROP (SPADCALL |n| (QREFELT |$| 11)))
+            (SEQ 
+              (LETT |nn| 
+                (SPADCALL (SPADCALL |n| (QREFELT |$| 53)) (QREFELT |$| 120))
+                |UPOLYC-;nextItemInner|)
+              (EXIT 
+                (COND 
+                  ((QEQCAR |nn| 1) (CONS 1 "failed"))
+                  ((QUOTE T) 
+                    (CONS 0 (SPADCALL (QCDR |nn|) (QREFELT |$| 30))))))))
+          ((QUOTE T) 
+            (SEQ 
+              (LETT |n1| 
+                (SPADCALL |n| (QREFELT |$| 55))
+                |UPOLYC-;nextItemInner|)
+              (LETT |n2| 
+                (|UPOLYC-;nextItemInner| |n1| |$|)
+                |UPOLYC-;nextItemInner|)
+              (EXIT 
+                (COND 
+                  ((QEQCAR |n2| 0)
+                    (CONS 
+                      0 
+                      (SPADCALL 
+                        (SPADCALL 
+                          (SPADCALL |n| (QREFELT |$| 53))
+                          (SPADCALL |n| (QREFELT |$| 11))
+                          (QREFELT |$| 49)) 
+                        (QCDR |n2|) 
+                        (QREFELT |$| 65))))
+                  ((|<| 
+                     (|+| 1 (SPADCALL |n1| (QREFELT |$| 11)))
+                     (SPADCALL |n| (QREFELT |$| 11)))
+                    (CONS 
+                      0 
+                      (SPADCALL 
+                        (SPADCALL 
+                          (SPADCALL |n| (QREFELT |$| 53))
+                          (SPADCALL |n| (QREFELT |$| 11))
+                          (QREFELT |$| 49))
+                        (SPADCALL 
+                          (PROG2 
+                            (LETT #1# 
+                              (SPADCALL 
+                                (|spadConstant| |$| 117)
+                                (QREFELT |$| 120))
+                              |UPOLYC-;nextItemInner|)
+                            (QCDR #1#)
+                            (|check-union| (QEQCAR #1# 0) (QREFELT |$| 7) #1#))
+                          (|+| 1 (SPADCALL |n1| (QREFELT |$| 11)))
+                          (QREFELT |$| 49))
+                        (QREFELT |$| 65))))
+                  ((QUOTE T) 
+                    (SEQ 
+                      (LETT |n3| 
+                        (SPADCALL 
+                          (SPADCALL |n| (QREFELT |$| 53))
+                          (QREFELT |$| 120))
+                        |UPOLYC-;nextItemInner|)
+                      (EXIT 
+                        (COND 
+                          ((QEQCAR |n3| 1) (CONS 1 "failed"))
+                          ((QUOTE T) 
+                            (CONS 
+                              0 
+                              (SPADCALL 
+                                (QCDR |n3|)
+                                (SPADCALL |n| (QREFELT |$| 11))
+                                (QREFELT |$| 49))))))))))))))))) 
+
+(DEFUN |UPOLYC-;nextItem;SU;29| (|n| |$|) 
+  (PROG (|n1| #1=#:G103350) 
+    (RETURN 
+      (SEQ 
+        (LETT |n1| (|UPOLYC-;nextItemInner| |n| |$|) |UPOLYC-;nextItem;SU;29|)
+        (EXIT 
+          (COND 
+            ((QEQCAR |n1| 1)
+              (CONS 
+                0 
+                (SPADCALL 
+                  (PROG2 
+                    (LETT #1# 
+                      (SPADCALL (|spadConstant| |$| 117) (QREFELT |$| 120))
+                      |UPOLYC-;nextItem;SU;29|)
+                    (QCDR #1#)
+                    (|check-union| (QEQCAR #1# 0) (QREFELT |$| 7) #1#))
+                 (|+| 1 (SPADCALL |n| (QREFELT |$| 11)))
+               (QREFELT |$| 49))))
+            ((QUOTE T) |n1|))))))) 
+
+(DEFUN |UPOLYC-;content;SSaosS;30| (|p| |v| |$|) 
+  (SPADCALL (SPADCALL |p| (QREFELT |$| 123)) (QREFELT |$| 30))) 
+
+(DEFUN |UPOLYC-;primeFactor| (|p| |q| |$|) 
+  (PROG (#1=#:G103356 |p1|) 
+    (RETURN 
+      (SEQ 
+        (LETT |p1| 
+           (PROG2 
+             (LETT #1# 
+               (SPADCALL |p| 
+                 (SPADCALL |p| |q| (QREFELT |$| 125))
+                 (QREFELT |$| 126))
+               |UPOLYC-;primeFactor|)
+             (QCDR #1#)
+             (|check-union| (QEQCAR #1# 0) (QREFELT |$| 6) #1#))
+           |UPOLYC-;primeFactor|)
+        (EXIT 
+          (COND 
+            ((SPADCALL |p1| |p| (QREFELT |$| 127)) |p|)
+            ((QUOTE T) (|UPOLYC-;primeFactor| |p1| |q| |$|)))))))) 
+
+(DEFUN |UPOLYC-;separate;2SR;32| (|p| |q| |$|) 
+  (PROG (|a| #1=#:G103362) 
+    (RETURN 
+      (SEQ 
+        (LETT |a| 
+          (|UPOLYC-;primeFactor| |p| |q| |$|)
+          |UPOLYC-;separate;2SR;32|)
+        (EXIT 
+          (CONS 
+            |a| 
+            (PROG2 
+              (LETT #1# 
+                (SPADCALL |p| |a| (QREFELT |$| 126))
+                |UPOLYC-;separate;2SR;32|)
+              (QCDR #1#)
+              (|check-union| (QEQCAR #1# 0) (QREFELT |$| 6) #1#)))))))) 
+
+(DEFUN |UPOLYC-;differentiate;SM2S;33| (|x| |deriv| |x'| |$|) 
+  (PROG (|dg| |lc| #1=#:G103367 |d|) 
+    (RETURN 
+      (SEQ 
+        (LETT |d| (|spadConstant| |$| 60) |UPOLYC-;differentiate;SM2S;33|)
+        (SEQ G190 
+          (COND 
+            ((NULL 
+               (|<| 0 
+                 (LETT |dg| 
+                   (SPADCALL |x| (QREFELT |$| 11))
+                   |UPOLYC-;differentiate;SM2S;33|)))
+              (GO G191)))
+          (SEQ 
+            (LETT |lc| 
+              (SPADCALL |x| (QREFELT |$| 53))
+              |UPOLYC-;differentiate;SM2S;33|)
+            (LETT |d| 
+              (SPADCALL 
+                (SPADCALL |d| 
+                  (SPADCALL |x'| 
+                    (SPADCALL 
+                      (SPADCALL |dg| |lc| (QREFELT |$| 131))
+                      (PROG1 
+                        (LETT #1# (|-| |dg| 1) |UPOLYC-;differentiate;SM2S;33|)
+                        (|check-subtype| 
+                          (|>=| #1# 0) 
+                          (QUOTE (|NonNegativeInteger|)) 
+                          #1#))
+                      (QREFELT |$| 49)) 
+                    (QREFELT |$| 71)) 
+                  (QREFELT |$| 65)) 
+                  (SPADCALL 
+                    (SPADCALL |lc| |deriv|)
+                    |dg|
+                    (QREFELT |$| 49)) 
+                (QREFELT |$| 65))
+              |UPOLYC-;differentiate;SM2S;33|)
+            (EXIT 
+              (LETT |x| 
+                (SPADCALL |x| (QREFELT |$| 55))
+                |UPOLYC-;differentiate;SM2S;33|)))
+           NIL
+           (GO G190)
+           G191
+           (EXIT NIL))
+        (EXIT 
+          (SPADCALL |d| 
+            (SPADCALL 
+              (SPADCALL 
+                (SPADCALL |x| (QREFELT |$| 53))
+                |deriv|)
+              (QREFELT |$| 30)) 
+            (QREFELT |$| 65))))))) 
+
+(DEFUN |UPOLYC-;ncdiff| (|n| |x'| |$|) 
+  (PROG (#1=#:G103385 |n1|) 
+    (RETURN 
+      (COND 
+        ((ZEROP |n|) (|spadConstant| |$| 60))
+        ((ZEROP 
+          (LETT |n1| 
+            (PROG1 
+              (LETT #1# (|-| |n| 1) |UPOLYC-;ncdiff|)
+              (|check-subtype| 
+                (|>=| #1# 0)
+                (QUOTE (|NonNegativeInteger|))
+                #1#))
+            |UPOLYC-;ncdiff|))
+          |x'|)
+        ((QUOTE T) 
+          (SPADCALL 
+            (SPADCALL |x'| 
+              (SPADCALL (|spadConstant| |$| 48) |n1| (QREFELT |$| 49))
+              (QREFELT |$| 71)) 
+            (SPADCALL 
+              (SPADCALL (|spadConstant| |$| 48) 1 (QREFELT |$| 49))
+              (|UPOLYC-;ncdiff| |n1| |x'| |$|)
+              (QREFELT |$| 71)) 
+            (QREFELT |$| 65))))))) 
+
+(DEFUN |UPOLYC-;differentiate;SM2S;35| (|x| |deriv| |x'| |$|) 
+  (PROG (|dg| |lc| |d|) 
+    (RETURN 
+      (SEQ 
+        (LETT |d| (|spadConstant| |$| 60) |UPOLYC-;differentiate;SM2S;35|)
+        (SEQ G190 
+          (COND 
+            ((NULL 
+               (|<| 0 
+                 (LETT |dg| 
+                   (SPADCALL |x| (QREFELT |$| 11))
+                   |UPOLYC-;differentiate;SM2S;35|)))
+              (GO G191)))
+          (SEQ 
+            (LETT |lc| 
+              (SPADCALL |x| (QREFELT |$| 53))
+              |UPOLYC-;differentiate;SM2S;35|)
+            (LETT |d| 
+              (SPADCALL 
+                (SPADCALL |d| 
+                  (SPADCALL 
+                    (SPADCALL |lc| |deriv|)
+                    |dg|
+                    (QREFELT |$| 49)) 
+                  (QREFELT |$| 65)) 
+                (SPADCALL |lc| 
+                  (|UPOLYC-;ncdiff| |dg| |x'| |$|)
+                  (QREFELT |$| 134)) 
+              (QREFELT |$| 65)) 
+              |UPOLYC-;differentiate;SM2S;35|)
+            (EXIT 
+              (LETT |x| 
+                (SPADCALL |x| (QREFELT |$| 55))
+                |UPOLYC-;differentiate;SM2S;35|)))
+           NIL 
+           (GO G190) 
+           G191 
+           (EXIT NIL))
+        (EXIT 
+          (SPADCALL |d| 
+            (SPADCALL 
+              (SPADCALL (SPADCALL |x| (QREFELT |$| 53)) |deriv|)
+              (QREFELT |$| 30)) 
+            (QREFELT |$| 65))))))) 
+
+(DEFUN |UPOLYC-;differentiate;SMS;36| (|x| |deriv| |$|) 
+  (SPADCALL |x| |deriv| (|spadConstant| |$| 47) (QREFELT |$| 135))) 
+
+(DEFUN |UPOLYC-;differentiate;2S;37| (|x| |$|) 
+  (PROG (|dg| #1=#:G103394 |d|) 
+    (RETURN 
+      (SEQ 
+        (LETT |d| (|spadConstant| |$| 60) |UPOLYC-;differentiate;2S;37|)
+        (SEQ G190 
+          (COND 
+            ((NULL 
+              (|<| 0 
+                (LETT |dg| 
+                  (SPADCALL |x| (QREFELT |$| 11))
+                  |UPOLYC-;differentiate;2S;37|))) 
+            (GO G191)))
+          (SEQ 
+            (LETT |d| 
+              (SPADCALL |d| 
+                (SPADCALL 
+                  (SPADCALL |dg| 
+                    (SPADCALL |x| (QREFELT |$| 53)) (QREFELT |$| 131))
+                  (PROG1 
+                    (LETT #1# (|-| |dg| 1) |UPOLYC-;differentiate;2S;37|)
+                    (|check-subtype| 
+                      (|>=| #1# 0) 
+                      (QUOTE (|NonNegativeInteger|))
+                      #1#))
+                  (QREFELT |$| 49))
+                (QREFELT |$| 65))
+              |UPOLYC-;differentiate;2S;37|)
+            (EXIT 
+              (LETT |x| 
+                (SPADCALL |x| (QREFELT |$| 55))
+                |UPOLYC-;differentiate;2S;37|)))
+           NIL
+           (GO G190)
+           G191
+           (EXIT NIL))
+        (EXIT |d|))))) 
+
+(DEFUN |UPOLYC-;differentiate;SSaosS;38| (|x| |v| |$|) 
+  (SPADCALL |x| (QREFELT |$| 138))) 
+
+(DEFUN |UPOLYC-;elt;3F;39| (|g| |f| |$|) 
+  (SPADCALL 
+    (SPADCALL 
+      (SPADCALL |g| (QREFELT |$| 141))
+      |f|
+      (QREFELT |$| 143)) 
+    (SPADCALL (SPADCALL |g| (QREFELT |$| 144)) |f| (QREFELT |$| 143))
+    (QREFELT |$| 145))) 
+
+(DEFUN |UPOLYC-;pseudoQuotient;3S;40| (|p| |q| |$|) 
+  (PROG (|n| #1=#:G103440 #2=#:G103442) 
+    (RETURN 
+      (SEQ 
+        (LETT |n| 
+          (|+| 
+            (|-| 
+              (SPADCALL |p| (QREFELT |$| 11))
+              (SPADCALL |q| (QREFELT |$| 11))) 1)
+           |UPOLYC-;pseudoQuotient;3S;40|)
+        (EXIT 
+          (COND 
+            ((|<| |n| 1) (|spadConstant| |$| 60))
+            ((QUOTE T) 
+              (PROG2 
+                (LETT #2# 
+                  (SPADCALL 
+                    (SPADCALL 
+                      (SPADCALL 
+                        (SPADCALL 
+                          (SPADCALL |q| (QREFELT |$| 53))
+                          (PROG1 
+                            (LETT #1# |n| |UPOLYC-;pseudoQuotient;3S;40|)
+                            (|check-subtype| 
+                              (|>=| #1# 0) 
+                              (QUOTE (|NonNegativeInteger|))
+                              #1#))
+                          (QREFELT |$| 147)) 
+                        |p| 
+                        (QREFELT |$| 134)) 
+                      (SPADCALL |p| |q| (QREFELT |$| 148))
+                      (QREFELT |$| 149)) 
+                    |q| 
+                    (QREFELT |$| 126))
+                  |UPOLYC-;pseudoQuotient;3S;40|)
+                (QCDR #2#)
+                (|check-union| (QEQCAR #2# 0) (QREFELT |$| 6) #2#))))))))) 
+
+(DEFUN |UPOLYC-;pseudoDivide;2SR;41| (|p| |q| |$|) 
+  (PROG (|n| |prem| #1=#:G103448 |lc| #2=#:G103450) 
+    (RETURN 
+      (SEQ 
+        (LETT |n| 
+          (|+| 
+            (|-| 
+              (SPADCALL |p| (QREFELT |$| 11))
+              (SPADCALL |q| (QREFELT |$| 11))) 1)
+          |UPOLYC-;pseudoDivide;2SR;41|)
+        (EXIT 
+          (COND 
+            ((|<| |n| 1)
+              (VECTOR (|spadConstant| |$| 48) (|spadConstant| |$| 60) |p|))
+            ((QUOTE T) 
+              (SEQ 
+                (LETT |prem| 
+                  (SPADCALL |p| |q| (QREFELT |$| 148))
+                  |UPOLYC-;pseudoDivide;2SR;41|)
+                (LETT |lc| 
+                  (SPADCALL 
+                    (SPADCALL |q| (QREFELT |$| 53))
+                    (PROG1 
+                      (LETT #1# |n| |UPOLYC-;pseudoDivide;2SR;41|)
+                      (|check-subtype| 
+                        (|>=| #1# 0)
+                        (QUOTE (|NonNegativeInteger|)) #1#))
+                    (QREFELT |$| 147))
+                  |UPOLYC-;pseudoDivide;2SR;41|)
+                (EXIT 
+                  (VECTOR |lc| 
+                    (PROG2 
+                      (LETT #2# 
+                        (SPADCALL 
+                          (SPADCALL 
+                            (SPADCALL |lc| |p| (QREFELT |$| 134))
+                            |prem|
+                            (QREFELT |$| 149))
+                          |q|
+                          (QREFELT |$| 126))
+                        |UPOLYC-;pseudoDivide;2SR;41|)
+                      (QCDR #2#)
+                      (|check-union| (QEQCAR #2# 0) (QREFELT |$| 6) #2#))
+                    |prem|)))))))))) 
+
+(DEFUN |UPOLYC-;composite;FSU;42| (|f| |q| |$|) 
+  (PROG (|n| |d|) 
+    (RETURN 
+      (SEQ 
+        (LETT |n| 
+          (SPADCALL (SPADCALL |f| (QREFELT |$| 141)) |q| (QREFELT |$| 153))
+          |UPOLYC-;composite;FSU;42|)
+        (EXIT 
+          (COND 
+            ((QEQCAR |n| 1) (CONS 1 "failed"))
+            ((QUOTE T) 
+              (SEQ 
+                (LETT |d| 
+                  (SPADCALL 
+                    (SPADCALL |f| (QREFELT |$| 144)) |q| (QREFELT |$| 153))
+                  |UPOLYC-;composite;FSU;42|)
+                (EXIT 
+                  (COND 
+                    ((QEQCAR |d| 1) (CONS 1 "failed"))
+                    ((QUOTE T) 
+                      (CONS 
+                        0 
+                        (SPADCALL 
+                          (QCDR |n|) 
+                          (QCDR |d|) 
+                          (QREFELT |$| 154)))))))))))))) 
+
+(DEFUN |UPOLYC-;composite;2SU;43| (|p| |q| |$|) 
+  (PROG (|cqr| |v| |u| |w| #1=#:G103476) 
+    (RETURN 
+      (SEQ 
+        (COND 
+          ((SPADCALL |p| (QREFELT |$| 157)) (CONS 0 |p|))
+          ((QUOTE T) 
+            (SEQ 
+              (EXIT 
+                (SEQ 
+                  (LETT |cqr| 
+                    (SPADCALL |p| |q| (QREFELT |$| 158))
+                    |UPOLYC-;composite;2SU;43|)
+                  (COND 
+                    ((SPADCALL (QVELT |cqr| 2) (QREFELT |$| 157))
+                      (SEQ 
+                        (LETT |v| 
+                          (SPADCALL 
+                            (QVELT |cqr| 2)
+                            (QVELT |cqr| 0)
+                            (QREFELT |$| 159))
+                          |UPOLYC-;composite;2SU;43|)
+                        (EXIT 
+                          (COND 
+                            ((QEQCAR |v| 0)
+                              (SEQ 
+                                (LETT |u| 
+                                  (SPADCALL 
+                                    (QVELT |cqr| 1) 
+                                    |q| 
+                                    (QREFELT |$| 153))
+                                  |UPOLYC-;composite;2SU;43|)
+                                (EXIT 
+                                  (COND 
+                                    ((QEQCAR |u| 0)
+                                      (SEQ 
+                                        (LETT |w| 
+                                          (SPADCALL 
+                                            (QCDR |u|)
+                                            (QVELT |cqr| 0)
+                                            (QREFELT |$| 159))
+                                          |UPOLYC-;composite;2SU;43|)
+                                        (EXIT 
+                                          (COND 
+                                            ((QEQCAR |w| 0)
+                                              (PROGN 
+                                                (LETT #1# 
+                                                  (CONS 
+                                                    0 
+                                                    (SPADCALL 
+                                                      (QCDR |v|)
+                                                      (SPADCALL 
+                                                        (SPADCALL 
+                                                       (|spadConstant| |$| 48)
+                                                       1
+                                                       (QREFELT |$| 49)) 
+                                                     (QCDR |w|) 
+                                                     (QREFELT |$| 71))
+                                                    (QREFELT |$| 65)))
+                                                  |UPOLYC-;composite;2SU;43|)
+                                                (GO #1#))))))))))))))))
+                  (EXIT (CONS 1 "failed"))))
+              #1# 
+              (EXIT #1#)))))))) 
+
+(DEFUN |UPOLYC-;elt;S2F;44| (|p| |f| |$|) 
+  (PROG (|n| #1=#:G103483 |ans|) 
+    (RETURN 
+      (SEQ 
+        (COND 
+          ((SPADCALL |p| (QREFELT |$| 9)) (|spadConstant| |$| 161))
+          ((QUOTE T) 
+            (SEQ 
+              (LETT |ans| 
+                (SPADCALL 
+                  (SPADCALL (SPADCALL |p| (QREFELT |$| 53)) (QREFELT |$| 30))
+                  (QREFELT |$| 162))
+                |UPOLYC-;elt;S2F;44|)
+              (LETT |n| (SPADCALL |p| (QREFELT |$| 11)) |UPOLYC-;elt;S2F;44|)
+              (SEQ G190 
+                (COND 
+                  ((NULL 
+                    (COND 
+                      ((SPADCALL 
+                        (LETT |p| 
+                          (SPADCALL |p| (QREFELT |$| 55))
+                          |UPOLYC-;elt;S2F;44|)
+                        (QREFELT |$| 9))
+                       (QUOTE NIL))
+                      ((QUOTE T) (QUOTE T))))
+                   (GO G191)))
+                (SEQ 
+                  (EXIT 
+                    (LETT |ans| 
+                      (SPADCALL 
+                        (SPADCALL |ans| 
+                          (SPADCALL |f| 
+                            (PROG1 
+                              (LETT #1# 
+                                (|-| |n| 
+                                  (LETT |n| 
+                                    (SPADCALL |p| (QREFELT |$| 11))
+                                    |UPOLYC-;elt;S2F;44|))
+                                |UPOLYC-;elt;S2F;44|)
+                              (|check-subtype| 
+                                (|>=| #1# 0)
+                                (QUOTE (|NonNegativeInteger|))
+                                #1#))
+                            (QREFELT |$| 163))
+                          (QREFELT |$| 164))
+                        (SPADCALL 
+                          (SPADCALL 
+                            (SPADCALL |p| (QREFELT |$| 53))
+                            (QREFELT |$| 30))
+                          (QREFELT |$| 162))
+                        (QREFELT |$| 165))
+                      |UPOLYC-;elt;S2F;44|)))
+                NIL 
+                (GO G190)
+                G191
+                (EXIT NIL))
+              (EXIT 
+                (COND 
+                  ((ZEROP |n|) |ans|)
+                  ((QUOTE T) 
+                    (SPADCALL |ans| 
+                      (SPADCALL |f| |n| (QREFELT |$| 166))
+                      (QREFELT |$| 164)))))))))))) 
+
+(DEFUN |UPOLYC-;order;2SNni;45| (|p| |q| |$|) 
+  (PROG (|u| #1=#:G103497 |ans|) 
+    (RETURN 
+      (SEQ 
+        (EXIT 
+          (COND 
+            ((SPADCALL |p| (QREFELT |$| 9))
+              (|error| "order: arguments must be nonzero"))
+            ((|<| (SPADCALL |q| (QREFELT |$| 11)) 1)
+              (|error| "order: place must be non-trivial"))
+            ((QUOTE T) 
+              (SEQ 
+                (LETT |ans| 0 |UPOLYC-;order;2SNni;45|)
+                (EXIT 
+                  (SEQ G190 
+                    NIL 
+                    (SEQ 
+                      (LETT |u| 
+                        (SPADCALL |p| |q| (QREFELT |$| 126))
+                        |UPOLYC-;order;2SNni;45|)
+                      (EXIT 
+                        (COND 
+                          ((QEQCAR |u| 1)
+                            (PROGN 
+                              (LETT #1# |ans| |UPOLYC-;order;2SNni;45|)
+                              (GO #1#)))
+                          ((QUOTE T) 
+                            (SEQ 
+                              (LETT |p| (QCDR |u|) |UPOLYC-;order;2SNni;45|)
+                              (EXIT 
+                                (LETT 
+                                  |ans|
+                                  (|+| |ans| 1)
+                                  |UPOLYC-;order;2SNni;45|)))))))
+                    NIL 
+                    (GO G190)
+                    G191
+                    (EXIT NIL)))))))
+         #1# 
+         (EXIT #1#))))) 
+
+(DEFUN |UPOLYC-;squareFree;SF;46| (|p| |$|) 
+  (SPADCALL |p| (QREFELT |$| 170))) 
+
+(DEFUN |UPOLYC-;squareFreePart;2S;47| (|p| |$|) 
+  (SPADCALL |p| (QREFELT |$| 172))) 
+
+(DEFUN |UPOLYC-;gcdPolynomial;3Sup;48| (|pp| |qq| |$|) 
+  (COND 
+    ((SPADCALL |pp| (QREFELT |$| 174)) (SPADCALL |qq| (QREFELT |$| 175)))
+    ((SPADCALL |qq| (QREFELT |$| 174)) (SPADCALL |pp| (QREFELT |$| 175)))
+    ((QUOTE T) 
+      (SPADCALL 
+        (SPADCALL 
+          (SPADCALL 
+            (SPADCALL |pp| (QREFELT |$| 176))
+            (SPADCALL |qq| (QREFELT |$| 176)) (QREFELT |$| 125))
+          (SPADCALL 
+            (SPADCALL 
+              (SPADCALL |pp| (QREFELT |$| 177))
+              (SPADCALL |qq| (QREFELT |$| 177)) (QREFELT |$| 178))
+            (QREFELT |$| 177))
+          (QREFELT |$| 179))
+        (QREFELT |$| 175))))) 
+
+(DEFUN |UPOLYC-;squareFreePolynomial;SupF;49| (|pp| |$|) 
+  (SPADCALL |pp| (QREFELT |$| 182))) 
+
+(DEFUN |UPOLYC-;elt;F2R;50| (|f| |r| |$|) 
+  (SPADCALL 
+    (SPADCALL 
+      (SPADCALL |f| (QREFELT |$| 141))
+      |r|
+      (QREFELT |$| 29))
+    (SPADCALL (SPADCALL |f| (QREFELT |$| 144)) |r| (QREFELT |$| 29))
+    (QREFELT |$| 184))) 
+
+(DEFUN |UPOLYC-;euclideanSize;SNni;51| (|x| |$|) 
+  (COND 
+    ((SPADCALL |x| (QREFELT |$| 9))
+      (|error| "euclideanSize called on 0 in Univariate Polynomial"))
+    ((QUOTE T) (SPADCALL |x| (QREFELT |$| 11))))) 
+
+(DEFUN |UPOLYC-;divide;2SR;52| (|x| |y| |$|) 
+  (PROG (|lc| |f| #1=#:G103510 |n| |quot|) 
+    (RETURN 
+      (SEQ 
+        (COND 
+          ((SPADCALL |y| (QREFELT |$| 9)) 
+            (|error| "division by 0 in Univariate Polynomials"))
+          ((QUOTE T) 
+            (SEQ 
+              (LETT |quot| (|spadConstant| |$| 60) |UPOLYC-;divide;2SR;52|)
+              (LETT |lc| 
+                (SPADCALL (SPADCALL |y| (QREFELT |$| 53)) (QREFELT |$| 187))
+                |UPOLYC-;divide;2SR;52|)
+              (SEQ G190 
+                (COND 
+                  ((NULL 
+                     (COND 
+                       ((OR 
+                          (SPADCALL |x| (QREFELT |$| 9))
+                          (|<| 
+                            (SPADCALL |x| (QREFELT |$| 11))
+                            (SPADCALL |y| (QREFELT |$| 11))))
+                        (QUOTE NIL)) ((QUOTE T) (QUOTE T))))
+                    (GO G191)))
+                (SEQ 
+                  (LETT |f| 
+                    (SPADCALL |lc| 
+                      (SPADCALL |x| (QREFELT |$| 53))
+                      (QREFELT |$| 188))
+                    |UPOLYC-;divide;2SR;52|)
+                  (LETT |n| 
+                    (PROG1 
+                      (LETT #1# 
+                        (|-| 
+                          (SPADCALL |x| (QREFELT |$| 11))
+                          (SPADCALL |y| (QREFELT |$| 11)))
+                         |UPOLYC-;divide;2SR;52|)
+                      (|check-subtype| 
+                        (|>=| #1# 0)
+                        (QUOTE (|NonNegativeInteger|))
+                        #1#))
+                    |UPOLYC-;divide;2SR;52|)
+                  (LETT |quot| 
+                    (SPADCALL |quot| 
+                      (SPADCALL |f| |n| (QREFELT |$| 49))
+                      (QREFELT |$| 65))
+                    |UPOLYC-;divide;2SR;52|)
+                  (EXIT 
+                    (LETT |x| 
+                      (SPADCALL |x| 
+                        (SPADCALL 
+                          (SPADCALL |f| |n| (QREFELT |$| 49))
+                          |y|
+                          (QREFELT |$| 71))
+                        (QREFELT |$| 149))
+                      |UPOLYC-;divide;2SR;52|)))
+                 NIL 
+                 (GO G190)
+                 G191
+                 (EXIT NIL))
+              (EXIT (CONS |quot| |x|))))))))) 
+
+(DEFUN |UPOLYC-;integrate;2S;53| (|p| |$|) 
+  (PROG (|l| |d| |ans|) 
+    (RETURN 
+      (SEQ 
+        (LETT |ans| (|spadConstant| |$| 60) |UPOLYC-;integrate;2S;53|)
+        (SEQ G190 
+          (COND 
+            ((NULL 
+              (COND 
+                ((SPADCALL |p| (|spadConstant| |$| 60) (QREFELT |$| 127))
+                  (QUOTE NIL))
+                ((QUOTE T) (QUOTE T)))) (GO G191)))
+          (SEQ 
+            (LETT |l| 
+              (SPADCALL |p| (QREFELT |$| 53))
+              |UPOLYC-;integrate;2S;53|)
+            (LETT |d| 
+              (|+| 1 (SPADCALL |p| (QREFELT |$| 11)))
+              |UPOLYC-;integrate;2S;53|)
+            (LETT |ans| 
+              (SPADCALL |ans| 
+                (SPADCALL 
+                  (SPADCALL (SPADCALL |d| (QREFELT |$| 191)) (QREFELT |$| 192))
+                  (SPADCALL |l| |d| (QREFELT |$| 49)) (QREFELT |$| 193))
+                (QREFELT |$| 65))
+              |UPOLYC-;integrate;2S;53|)
+            (EXIT 
+              (LETT |p| 
+                (SPADCALL |p| (QREFELT |$| 55))
+                |UPOLYC-;integrate;2S;53|)))
+          NIL
+          (GO G190)
+          G191
+          (EXIT NIL))
+        (EXIT |ans|))))) 
+
+(DEFUN |UnivariatePolynomialCategory&| (|#1| |#2|) 
+  (PROG (|DV$1| |DV$2| |dv$| |$| |pv$|) 
+    (RETURN 
+      (PROGN 
+        (LETT |DV$1| (|devaluate| |#1|) . #1=(|UnivariatePolynomialCategory&|))
+        (LETT |DV$2| (|devaluate| |#2|) . #1#)
+        (LETT |dv$| 
+          (LIST (QUOTE |UnivariatePolynomialCategory&|) |DV$1| |DV$2|) . #1#)
+        (LETT |$| (GETREFV 201) . #1#)
+        (QSETREFV |$| 0 |dv$|)
+        (QSETREFV |$| 3 
+          (LETT |pv$| 
+            (|buildPredVector| 0 0 
+              (LIST 
+                (|HasCategory| |#2| 
+                  (QUOTE (|Algebra| (|Fraction| (|Integer|)))))
+                (|HasCategory| |#2| (QUOTE (|Field|)))
+                (|HasCategory| |#2| (QUOTE (|GcdDomain|)))
+                (|HasCategory| |#2| (QUOTE (|IntegralDomain|)))
+                (|HasCategory| |#2| (QUOTE (|CommutativeRing|)))
+                (|HasCategory| |#2| (QUOTE (|StepThrough|))))) . #1#))
+        (|stuffDomainSlots| |$|)
+        (QSETREFV |$| 6 |#1|)
+        (QSETREFV |$| 7 |#2|)
+        (COND 
+          ((|HasCategory| |#2| (QUOTE (|PolynomialFactorizationExplicit|)))
+            (PROGN 
+              (QSETREFV |$| 81 
+                (CONS 
+                  (|dispatchFunction|
+                     |UPOLYC-;solveLinearPolynomialEquation;LSupU;20|)
+                  |$|))
+              (QSETREFV |$| 85 
+                (CONS 
+                  (|dispatchFunction| |UPOLYC-;factorPolynomial;SupF;21|) 
+                  |$|))
+              (QSETREFV |$| 87 
+                 (CONS 
+                    (|dispatchFunction|
+                       |UPOLYC-;factorSquareFreePolynomial;SupF;22|)
+                    |$|))
+              (QSETREFV |$| 105 
+                (CONS (|dispatchFunction| |UPOLYC-;factor;SF;23|) |$|)))))
+        (COND 
+          ((|testBitVector| |pv$| 6)
+            (PROGN 
+              (QSETREFV |$| 118 
+                (CONS (|dispatchFunction| |UPOLYC-;init;S;27|) |$|))
+              NIL
+              (QSETREFV |$| 122 
+                (CONS (|dispatchFunction| |UPOLYC-;nextItem;SU;29|) |$|)))))
+        (COND 
+          ((|testBitVector| |pv$| 3)
+            (PROGN 
+              (QSETREFV |$| 124 
+                (CONS (|dispatchFunction| |UPOLYC-;content;SSaosS;30|) |$|))
+              NIL
+              (QSETREFV |$| 129 
+                (CONS (|dispatchFunction| |UPOLYC-;separate;2SR;32|) |$|)))))
+        (COND 
+          ((|testBitVector| |pv$| 5)
+            (QSETREFV |$| 133 
+              (CONS 
+                (|dispatchFunction| |UPOLYC-;differentiate;SM2S;33|)
+                |$|))) 
+          ((QUOTE T) 
+            (PROGN 
+              (QSETREFV |$| 133 
+                (CONS 
+                  (|dispatchFunction| |UPOLYC-;differentiate;SM2S;35|)
+                  |$|)))))
+        (COND 
+          ((|testBitVector| |pv$| 4)
+            (PROGN 
+              (QSETREFV |$| 146 
+                (CONS (|dispatchFunction| |UPOLYC-;elt;3F;39|) |$|))
+              (QSETREFV |$| 150 
+                (CONS (|dispatchFunction| |UPOLYC-;pseudoQuotient;3S;40|) |$|))
+              (QSETREFV |$| 152 
+                (CONS (|dispatchFunction| |UPOLYC-;pseudoDivide;2SR;41|) |$|))
+              (QSETREFV |$| 156 
+                (CONS (|dispatchFunction| |UPOLYC-;composite;FSU;42|) |$|))
+              (QSETREFV |$| 160 
+                (CONS (|dispatchFunction| |UPOLYC-;composite;2SU;43|) |$|))
+              (QSETREFV |$| 167 
+                (CONS (|dispatchFunction| |UPOLYC-;elt;S2F;44|) |$|))
+              (QSETREFV |$| 168 
+                (CONS (|dispatchFunction| |UPOLYC-;order;2SNni;45|) |$|)))))
+        (COND 
+          ((|testBitVector| |pv$| 3)
+            (PROGN 
+              (QSETREFV |$| 171 
+                (CONS (|dispatchFunction| |UPOLYC-;squareFree;SF;46|) |$|))
+              (QSETREFV |$| 173 
+                (CONS 
+                  (|dispatchFunction| |UPOLYC-;squareFreePart;2S;47|)
+                  |$|)))))
+        (COND 
+          ((|HasCategory| |#2| (QUOTE (|PolynomialFactorizationExplicit|)))
+            (PROGN 
+              (QSETREFV |$| 180 
+                (CONS 
+                  (|dispatchFunction| |UPOLYC-;gcdPolynomial;3Sup;48|)
+                  |$|))
+              (QSETREFV |$| 183 
+                (CONS 
+                  (|dispatchFunction| |UPOLYC-;squareFreePolynomial;SupF;49|)
+                  |$|)))))
+        (COND 
+          ((|testBitVector| |pv$| 2)
+            (PROGN 
+              (QSETREFV |$| 185 
+                (CONS (|dispatchFunction| |UPOLYC-;elt;F2R;50|) |$|))
+              (QSETREFV |$| 186 
+                (CONS 
+                  (|dispatchFunction| |UPOLYC-;euclideanSize;SNni;51|)
+                  |$|))
+              (QSETREFV |$| 189 
+                (CONS (|dispatchFunction| |UPOLYC-;divide;2SR;52|) |$|)))))
+        (COND 
+          ((|testBitVector| |pv$| 1)
+             (QSETREFV |$| 194 
+               (CONS 
+                 (|dispatchFunction| |UPOLYC-;integrate;2S;53|)
+                 |$|)))) |$|)))) 
+
+(MAKEPROP 
+  (QUOTE |UnivariatePolynomialCategory&|)
+  (QUOTE |infovec|)
+  (LIST 
+    (QUOTE 
+      #(NIL NIL NIL NIL NIL NIL 
+        (|local| |#1|)
+        (|local| |#2|)
+        (|Boolean|)
+        (0 . |zero?|)
+        (|NonNegativeInteger|)
+        (5 . |degree|)
+        (|SingletonAsOrderedSet|)
+        (10 . |create|)
+        (|List| 12)
+        |UPOLYC-;variables;SL;1| 
+        |UPOLYC-;degree;SSaosNni;2| 
+        (14 . |totalDegree|)
+        |UPOLYC-;totalDegree;SLNni;3| 
+        (|List| 10)
+        |UPOLYC-;degree;SLL;4| 
+        (19 . |eval|)
+        (|List| |$|)
+        |UPOLYC-;eval;SLLS;5| 
+        (26 . |elt|)
+        |UPOLYC-;eval;SSaos2S;6| 
+        (32 . |eval|)
+        (|List| 7)
+        |UPOLYC-;eval;SLLS;7| 
+        (39 . |elt|)
+        (45 . |coerce|)
+        |UPOLYC-;eval;SSaosRS;8| 
+        (|Equation| 6)
+        (50 . |lhs|)
+        (|Union| 12 (QUOTE "failed"))
+        (55 . |mainVariable|)
+        (60 . |rhs|)
+        (|List| 197)
+        |UPOLYC-;eval;SLS;9| 
+        |UPOLYC-;mainVariable;SU;10| 
+        (65 . |minimumDegree|)
+        |UPOLYC-;minimumDegree;SSaosNni;11| 
+        |UPOLYC-;minimumDegree;SLL;12| 
+        (70 . |+|)
+        (|Mapping| 10 10)
+        (76 . |mapExponents|)
+        |UPOLYC-;monomial;SSaosNniS;13| 
+        (82 . |One|)
+        (86 . |One|)
+        (90 . |monomial|)
+        |UPOLYC-;coerce;SaosS;14| 
+        (|SparseUnivariatePolynomial| 7)
+        (96 . |Zero|)
+        (100 . |leadingCoefficient|)
+        (105 . |monomial|)
+        (111 . |reductum|)
+        (116 . |makeSUP|)
+        (121 . |+|)
+        |UPOLYC-;makeSUP;SSup;15| 
+        (127 . |zero?|)
+        (132 . |Zero|)
+        (136 . |leadingCoefficient|)
+        (141 . |degree|)
+        (146 . |reductum|)
+        (151 . |unmakeSUP|)
+        (156 . |+|)
+        |UPOLYC-;unmakeSUP;SupS;16| 
+        (|Record| (|:| |quotient| |$|) (|:| |remainder| |$|))
+        (162 . |monicDivide|)
+        |UPOLYC-;karatsubaDivide;SNniR;17| 
+        |UPOLYC-;shiftRight;SNniS;18| 
+        (168 . |*|)
+        |UPOLYC-;shiftLeft;SNniS;19| 
+        (|Union| 74 (QUOTE "failed"))
+        (|List| 75)
+        (|SparseUnivariatePolynomial| 6)
+        (|PolynomialFactorizationByRecursionUnivariate| 7 6)
+        (174 . |solveLinearPolynomialEquationByRecursion|)
+        (|Union| 79 (QUOTE "failed"))
+        (|List| 80)
+        (|SparseUnivariatePolynomial| |$|)
+        (180 . |solveLinearPolynomialEquation|)
+        (|Factored| 75)
+        (186 . |factorByRecursion|)
+        (|Factored| 80)
+        (191 . |factorPolynomial|)
+        (196 . |factorSquareFreeByRecursion|)
+        (201 . |factorSquareFreePolynomial|)
+        (|Factored| |$|)
+        (206 . |factor|)
+        (|Factored| 7)
+        (211 . |unit|)
+        (|Union| (QUOTE "nil") (QUOTE "sqfr") (QUOTE "irred") (QUOTE "prime"))
+        (|Record| (|:| |flg| 92) (|:| |fctr| 7) (|:| |xpnt| 109))
+        (|List| 93)
+        (216 . |factorList|)
+        (|Record| (|:| |flg| 92) (|:| |fctr| 6) (|:| |xpnt| 109))
+        (|List| 96)
+        (|Factored| 6)
+        (221 . |makeFR|)
+        (227 . |factorPolynomial|)
+        (|Mapping| 6 51)
+        (|Factored| 51)
+        (|FactoredFunctions2| 51 6)
+        (232 . |map|)
+        (238 . |factor|)
+        (243 . |Zero|)
+        (|Vector| 7)
+        (247 . |new|)
+        (|Integer|)
+        (253 . |minIndex|)
+        (258 . |coefficient|)
+        (264 . |qsetelt!|)
+        |UPOLYC-;vectorise;SNniV;24| 
+        |UPOLYC-;retract;SR;25| 
+        (|Union| 7 (QUOTE "failed"))
+        |UPOLYC-;retractIfCan;SU;26| 
+        (271 . |init|)
+        (275 . |init|)
+        (|Union| |$| (QUOTE "failed"))
+        (279 . |nextItem|)
+        (284 . |One|)
+        (288 . |nextItem|)
+        (293 . |content|)
+        (298 . |content|)
+        (304 . |gcd|)
+        (310 . |exquo|)
+        (316 . |=|)
+        (|Record| (|:| |primePart| |$|) (|:| |commonPart| |$|))
+        (322 . |separate|)
+        (328 . |Zero|)
+        (332 . |*|)
+        (|Mapping| 7 7)
+        (338 . |differentiate|)
+        (345 . |*|)
+        (351 . |differentiate|)
+        |UPOLYC-;differentiate;SMS;36| 
+        |UPOLYC-;differentiate;2S;37| 
+        (358 . |differentiate|)
+        |UPOLYC-;differentiate;SSaosS;38| 
+        (|Fraction| 6)
+        (363 . |numer|)
+        (|Fraction| |$|)
+        (368 . |elt|)
+        (374 . |denom|)
+        (379 . |/|)
+        (385 . |elt|)
+        (391 . |**|)
+        (397 . |pseudoRemainder|)
+        (403 . |-|)
+        (409 . |pseudoQuotient|)
+        (|Record| (|:| |coef| 7) (|:| |quotient| |$|) (|:| |remainder| |$|))
+        (415 . |pseudoDivide|)
+        (421 . |composite|)
+        (427 . |/|)
+        (|Union| 142 (QUOTE "failed"))
+        (433 . |composite|)
+        (439 . |ground?|)
+        (444 . |pseudoDivide|)
+        (450 . |exquo|)
+        (456 . |composite|)
+        (462 . |Zero|)
+        (466 . |coerce|)
+        (471 . |**|)
+        (477 . |*|)
+        (483 . |+|)
+        (489 . |**|)
+        (495 . |elt|)
+        (501 . |order|)
+        (|UnivariatePolynomialSquareFree| 7 6)
+        (507 . |squareFree|)
+        (512 . |squareFree|)
+        (517 . |squareFreePart|)
+        (522 . |squareFreePart|)
+        (527 . |zero?|)
+        (532 . |unitCanonical|)
+        (537 . |content|)
+        (542 . |primitivePart|)
+        (547 . |subResultantGcd|)
+        (553 . |*|)
+        (559 . |gcdPolynomial|)
+        (|UnivariatePolynomialSquareFree| 6 75)
+        (565 . |squareFree|)
+        (570 . |squareFreePolynomial|)
+        (575 . |/|)
+        (581 . |elt|)
+        (587 . |euclideanSize|)
+        (592 . |inv|)
+        (597 . |*|)
+        (603 . |divide|)
+        (|Fraction| 109)
+        (609 . |coerce|)
+        (614 . |inv|)
+        (619 . |*|)
+        (625 . |integrate|)
+        (|Symbol|)
+        (|List| 195)
+        (|Equation| |$|)
+        (|Union| 109 (QUOTE "failed"))
+        (|Union| 190 (QUOTE "failed"))
+        (|OutputForm|))) 
+    (QUOTE 
+      #(|vectorise| 630 |variables| 636 |unmakeSUP| 641 |totalDegree| 646 
+        |squareFreePolynomial| 652 |squareFreePart| 657 |squareFree| 662
+        |solveLinearPolynomialEquation| 667 |shiftRight| 673 |shiftLeft| 679
+        |separate| 685 |retractIfCan| 691 |retract| 696 |pseudoQuotient| 701
+        |pseudoDivide| 707 |order| 713 |nextItem| 719 |monomial| 724
+        |minimumDegree| 731 |makeSUP| 743 |mainVariable| 748
+        |karatsubaDivide| 753 |integrate| 759 |init| 764 |gcdPolynomial| 768
+        |factorSquareFreePolynomial| 774 |factorPolynomial| 779 |factor| 784
+        |eval| 789 |euclideanSize| 823 |elt| 828 |divide| 846
+        |differentiate| 852 |degree| 876 |content| 888 |composite| 894
+        |coerce| 906)) 
+    (QUOTE NIL) 
+    (CONS 
+      (|makeByteWordVec2| 1 (QUOTE NIL))
+      (CONS 
+        (QUOTE #())
+        (CONS 
+          (QUOTE #())
+          (|makeByteWordVec2| 194 
+            (QUOTE 
+              (1 6 8 0 9 1 6 10 0 11 0 12 0 13 1 6 10 0 17 3 6 0 0 12 0 21 2
+               6 0 0 0 24 3 6 0 0 12 7 26 2 6 7 0 7 29 1 6 0 7 30 1 32 6 0 33
+               1 6 34 0 35 1 32 6 0 36 1 6 10 0 40 2 10 0 0 0 43 2 6 0 44 0
+               45 0 6 0 47 0 7 0 48 2 6 0 7 10 49 0 51 0 52 1 6 7 0 53 2 51
+               0 7 10 54 1 6 0 0 55 1 6 51 0 56 2 51 0 0 0 57 1 51 8 0 59 0
+               6 0 60 1 51 7 0 61 1 51 10 0 62 1 51 0 0 63 1 6 0 51 64 2 6 0
+               0 0 65 2 6 67 0 0 68 2 6 0 0 0 71 2 76 73 74 75 77 2 0 78 79
+               80 81 1 76 82 75 83 1 0 84 80 85 1 76 82 75 86 1 0 84 80 87 1
+               7 88 0 89 1 90 7 0 91 1 90 94 0 95 2 98 0 6 97 99 1 7 84 80
+               100 2 103 98 101 102 104 1 0 88 0 105 0 7 0 106 2 107 0 10 7
+               108 1 107 109 0 110 2 6 7 0 10 111 3 107 7 0 109 7 112 0 7 0
+               117 0 0 0 118 1 7 119 0 120 0 75 0 121 1 0 119 0 122 1 6 7 0
+               123 2 0 0 0 12 124 2 6 0 0 0 125 2 6 119 0 0 126 2 6 8 0 0 127
+               2 0 128 0 0 129 0 75 0 130 2 7 0 10 0 131 3 0 0 0 132 0 133 2
+               6 0 7 0 134 3 6 0 0 132 0 135 1 6 0 0 138 1 140 6 0 141 2 6
+               142 0 142 143 1 140 6 0 144 2 140 0 0 0 145 2 0 142 142 142
+               146 2 7 0 0 10 147 2 6 0 0 0 148 2 6 0 0 0 149 2 0 0 0 0 150
+               2 0 151 0 0 152 2 6 119 0 0 153 2 140 0 6 6 154 2 0 155 142 0
+               156 1 6 8 0 157 2 6 151 0 0 158 2 6 119 0 7 159 2 0 119 0 0
+               160 0 140 0 161 1 140 0 6 162 2 140 0 0 109 163 2 140 0 0 0
+               164 2 140 0 0 0 165 2 140 0 0 10 166 2 0 142 0 142 167 2 0 10
+               0 0 168 1 169 98 6 170 1 0 88 0 171 1 169 6 6 172 1 0 0 0 173
+               1 75 8 0 174 1 75 0 0 175 1 75 6 0 176 1 75 0 0 177 2 75 0 0
+               0 178 2 75 0 6 0 179 2 0 80 80 80 180 1 181 82 75 182 1 0 84
+               80 183 2 7 0 0 0 184 2 0 7 142 7 185 1 0 10 0 186 1 7 0 0 187
+               2 7 0 0 0 188 2 0 67 0 0 189 1 190 0 109 191 1 190 0 0 192 2
+               6 0 190 0 193 1 0 0 0 194 2 0 107 0 10 113 1 0 14 0 15 1 0 0
+               51 66 2 0 10 0 14 18 1 0 84 80 183 1 0 0 0 173 1 0 88 0 171 2
+               0 78 79 80 81 2 0 0 0 10 70 2 0 0 0 10 72 2 0 128 0 0 129 1 0
+               115 0 116 1 0 7 0 114 2 0 0 0 0 150 2 0 151 0 0 152 2 0 10 0
+               0 168 1 0 119 0 122 3 0 0 0 12 10 46 2 0 19 0 14 42 2 0 10 0
+               12 41 1 0 51 0 58 1 0 34 0 39 2 0 67 0 10 69 1 0 0 0 194 0 0
+               0 118 2 0 80 80 80 180 1 0 84 80 87 1 0 84 80 85 1 0 88 0 105
+               3 0 0 0 12 0 25 3 0 0 0 14 22 23 3 0 0 0 14 27 28 3 0 0 0 12
+               7 31 2 0 0 0 37 38 1 0 10 0 186 2 0 142 0 142 167 2 0 7 142 7
+               185 2 0 142 142 142 146 2 0 67 0 0 189 3 0 0 0 132 0 133 2 0
+               0 0 132 136 1 0 0 0 137 2 0 0 0 12 139 2 0 10 0 12 16 2 0 19
+               0 14 20 2 0 0 0 12 124 2 0 119 0 0 160 2 0 155 142 0 156 1 0
+               0 12 50)))))) 
+       (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}
@@ -35736,6 +39014,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<category TYPE Type>>
 <<category TBAGG TableAggregate>>
 <<category UFD UniqueFactorizationDomain>>
+<<category UPOLYC UnivariatePolynomialCategory>>
 <<category URAGG UnaryRecursiveAggregate>>
 <<category VSPACE VectorSpace>>
 <<category XF ExtensionField>>
@@ -35867,6 +39146,7 @@ digraph dotabb {
 <<TYPE.dotabb>>
 <<TBAGG.dotabb>>
 <<UFD.dotabb>>
+<<UPOLYC.dotabb>>
 <<URAGG.dotabb>>
 <<VSPACE.dotabb>>
 <<XF.dotabb>>
@@ -36001,6 +39281,7 @@ digraph dotfull {
 <<TYPE.dotfull>>
 <<TBAGG.dotfull>>
 <<UFD.dotfull>>
+<<UPOLYC.dotfull>>
 <<URAGG.dotfull>>
 <<VSPACE.dotfull>>
 <<XF.dotfull>>
diff --git a/books/ps/v102univariatepolynomialcategory.ps b/books/ps/v102univariatepolynomialcategory.ps
new file mode 100644
index 0000000..d30dc33
--- /dev/null
+++ b/books/ps/v102univariatepolynomialcategory.ps
@@ -0,0 +1,749 @@
+%!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 1104 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 1104 152
+%%PageOrientation: Portrait
+gsave
+36 36 1068 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
+1066 114 lineto
+1066 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 114 lineto
+1066 114 lineto
+1066 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% UnivariatePolynomialCategory(a:Ring)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 631 108 moveto
+393 108 lineto
+393 72 lineto
+631 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 631 108 moveto
+393 108 lineto
+393 72 lineto
+631 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+401 85 moveto
+(UnivariatePolynomialCategory\(a:Ring\))
+[9.6 6.96 3.84 6.72 6.24 5.04 3.84 6.24 3.84 6.24 7.44 6.96 3.6 6.96 6.96 6.96 10.8 3.84 6.24 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% POLYCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 88 36 moveto
+0 36 lineto
+0 0 lineto
+88 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 88 36 moveto
+0 36 lineto
+0 0 lineto
+88 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(POLYCAT...)
+[7.68 10.08 7.2 9.12 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% UnivariatePolynomialCategory(a:Ring)->POLYCAT...
+newpath 393 81 moveto
+312 73 203 60 98 36 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 98 33 moveto
+88 34 lineto
+97 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 98 33 moveto
+88 34 lineto
+97 39 lineto
+closepath
+stroke
+end grestore
+% ELTAB...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 176 36 moveto
+106 36 lineto
+106 0 lineto
+176 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 176 36 moveto
+106 36 lineto
+106 0 lineto
+176 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+113 13 moveto
+(ELTAB...)
+[8.64 7.68 7.92 10.08 9.36 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% UnivariatePolynomialCategory(a:Ring)->ELTAB...
+newpath 393 77 moveto
+333 68 260 56 186 36 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 187 33 moveto
+176 33 lineto
+185 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 187 33 moveto
+176 33 lineto
+185 39 lineto
+closepath
+stroke
+end grestore
+% DIFRING...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 278 36 moveto
+194 36 lineto
+194 0 lineto
+278 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 278 36 moveto
+194 36 lineto
+194 0 lineto
+278 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+201 13 moveto
+(DIFRING...)
+[10.08 4.56 7.68 9.36 4.56 9.84 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% UnivariatePolynomialCategory(a:Ring)->DIFRING...
+newpath 428 72 moveto
+388 63 339 51 288 36 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 289 33 moveto
+278 33 lineto
+287 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 289 33 moveto
+278 33 lineto
+287 39 lineto
+closepath
+stroke
+end grestore
+% DIFEXT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 372 36 moveto
+296 36 lineto
+296 0 lineto
+372 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 372 36 moveto
+296 36 lineto
+296 0 lineto
+372 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+303 13 moveto
+(DIFEXT...)
+[10.08 4.56 7.68 8.64 10.08 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% UnivariatePolynomialCategory(a:Ring)->DIFEXT...
+newpath 467 72 moveto
+441 61 408 48 382 38 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 383 34 moveto
+372 34 lineto
+380 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 383 34 moveto
+372 34 lineto
+380 41 lineto
+closepath
+stroke
+end grestore
+% STEP...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 448 36 moveto
+390 36 lineto
+390 0 lineto
+448 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 448 36 moveto
+390 36 lineto
+390 0 lineto
+448 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+398 13 moveto
+(STEP...)
+[7.44 8.64 8.64 6.24 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% UnivariatePolynomialCategory(a:Ring)->STEP...
+newpath 489 72 moveto
+478 63 463 52 450 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 452 39 moveto
+442 36 lineto
+448 45 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 452 39 moveto
+442 36 lineto
+448 45 lineto
+closepath
+stroke
+end grestore
+% COMRING...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 558 36 moveto
+466 36 lineto
+466 0 lineto
+558 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 558 36 moveto
+466 36 lineto
+466 0 lineto
+558 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+473 13 moveto
+(COMRING...)
+[9.12 10.08 12.48 9.36 4.56 9.84 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% UnivariatePolynomialCategory(a:Ring)->COMRING...
+newpath 512 72 moveto
+512 64 512 55 512 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 516 46 moveto
+512 36 lineto
+509 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 516 46 moveto
+512 36 lineto
+509 46 lineto
+closepath
+stroke
+end grestore
+% INTDOM...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 660 36 moveto
+576 36 lineto
+576 0 lineto
+660 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 660 36 moveto
+576 36 lineto
+576 0 lineto
+660 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+584 13 moveto
+(INTDOM...)
+[4.56 10.08 8.64 10.08 10.08 12.48 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% UnivariatePolynomialCategory(a:Ring)->INTDOM...
+newpath 539 72 moveto
+552 63 569 52 583 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 586 44 moveto
+592 36 lineto
+582 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 586 44 moveto
+592 36 lineto
+582 39 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 768 36 moveto
+678 36 lineto
+678 0 lineto
+768 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 768 36 moveto
+678 36 lineto
+678 0 lineto
+768 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+686 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
+% UnivariatePolynomialCategory(a:Ring)->GCDDOM...
+newpath 565 72 moveto
+597 61 637 48 668 37 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 669 40 moveto
+678 34 lineto
+667 34 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 669 40 moveto
+678 34 lineto
+667 34 lineto
+closepath
+stroke
+end grestore
+% FIELD...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 852 36 moveto
+786 36 lineto
+786 0 lineto
+852 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 852 36 moveto
+786 36 lineto
+786 0 lineto
+852 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+793 13 moveto
+(FIELD...)
+[7.68 4.56 8.64 8.64 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% UnivariatePolynomialCategory(a:Ring)->FIELD...
+newpath 624 72 moveto
+669 64 722 52 776 36 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 777 39 moveto
+786 33 lineto
+775 33 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 777 39 moveto
+786 33 lineto
+775 33 lineto
+closepath
+stroke
+end grestore
+% ALGEBRA...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 964 36 moveto
+870 36 lineto
+870 0 lineto
+964 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 964 36 moveto
+870 36 lineto
+870 0 lineto
+964 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+878 13 moveto
+(ALGEBRA...)
+[10.08 8.64 10.08 8.64 9.36 9.36 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% UnivariatePolynomialCategory(a:Ring)->ALGEBRA...
+newpath 631 76 moveto
+696 67 778 55 860 35 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 861 38 moveto
+870 33 lineto
+860 32 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 861 38 moveto
+870 33 lineto
+860 32 lineto
+closepath
+stroke
+end grestore
+% PFECAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 1060 36 moveto
+982 36 lineto
+982 0 lineto
+1060 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 1060 36 moveto
+982 36 lineto
+982 0 lineto
+1060 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+990 13 moveto
+(PFECAT...)
+[7.68 7.68 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% UnivariatePolynomialCategory(a:Ring)->PFECAT...
+newpath 631 84 moveto
+723 77 852 64 972 35 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 973 38 moveto
+982 33 lineto
+972 32 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 973 38 moveto
+982 33 lineto
+972 32 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 7e6fde6..deeb50b 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,9 @@
+20081003 tpd books/bookvol10.2 add UPOLYC, update attributes
+20081003 tpd books/ps/v102univariatepolynomialcategory.ps added
+20081003 tpd src/algebra/polycat.spad move UPOLYC
+20081003 tpd books/bookvol10.2 add category POLYCAT
+20081003 tpd books/ps/v102polynomialcategory.ps added
+20081003 tpd books/ps/v102fullypatternmatchable.ps fixup
 20081002 tpd books/bookvol10.2 add categories
 20081002 tpd books/ps/v102finiteabelianmonoidring.ps added
 20081002 tpd src/algebra/polycat.spad move FAMR into bookvol10.2
diff --git a/src/algebra/polycat.spad.pamphlet b/src/algebra/polycat.spad.pamphlet
index 7645806..39b0d38 100644
--- a/src/algebra/polycat.spad.pamphlet
+++ b/src/algebra/polycat.spad.pamphlet
@@ -9,2088 +9,6 @@
 \eject
 \tableofcontents
 \eject
-\section{category POLYCAT PolynomialCategory}
-<<category POLYCAT PolynomialCategory>>=
-)abbrev category POLYCAT PolynomialCategory
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions: Ring, monomial, coefficient, differentiate, eval
-++ Related Constructors: Polynomial, DistributedMultivariatePolynomial
-++ Also See: UnivariatePolynomialCategory
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The category for general multi-variate polynomials over a ring
-++ R, in variables from VarSet, with exponents from the
-++ \spadtype{OrderedAbelianMonoidSup}.
-
-PolynomialCategory(R:Ring, E:OrderedAbelianMonoidSup, VarSet:OrderedSet):
-        Category ==
-  Join(PartialDifferentialRing VarSet, FiniteAbelianMonoidRing(R, E),
-       Evalable %, InnerEvalable(VarSet, R),
-       InnerEvalable(VarSet, %), RetractableTo VarSet,
-       FullyLinearlyExplicitRingOver R) with
-    -- operations
-    degree : (%,VarSet) -> NonNegativeInteger
-      ++ degree(p,v) gives the degree of polynomial p with respect to the variable v.
-    degree : (%,List(VarSet)) -> List(NonNegativeInteger)
-      ++ degree(p,lv) gives the list of degrees of polynomial p
-      ++ with respect to each of the variables in the list lv.
-    coefficient: (%,VarSet,NonNegativeInteger) -> %
-      ++ coefficient(p,v,n) views the polynomial p as a univariate
-      ++ polynomial in v and returns the coefficient of the \spad{v**n} term.
-    coefficient: (%,List VarSet,List NonNegativeInteger) -> %
-      ++ coefficient(p, lv, ln) views the polynomial p as a polynomial
-      ++ in the variables of lv and returns the coefficient of the term
-      ++ \spad{lv**ln}, i.e. \spad{prod(lv_i ** ln_i)}.
-    monomials: % -> List %
-      ++ monomials(p) returns the list of non-zero monomials of polynomial p, i.e.
-      ++ \spad{monomials(sum(a_(i) X^(i))) = [a_(1) X^(1),...,a_(n) X^(n)]}.
-    univariate   : (%,VarSet) -> SparseUnivariatePolynomial(%)
-      ++ univariate(p,v) converts the multivariate polynomial p
-      ++ into a univariate polynomial in v, whose coefficients are still
-      ++ multivariate polynomials (in all the other variables).
-    univariate   : % -> SparseUnivariatePolynomial(R)
-        ++ univariate(p) converts the multivariate polynomial p,
-        ++ which should actually involve only one variable,
-        ++ into a univariate polynomial
-        ++ in that variable, whose coefficients are in the ground ring.
-        ++ Error: if polynomial is genuinely multivariate
-    mainVariable  : % -> Union(VarSet,"failed")
-           ++ mainVariable(p) returns the biggest variable which actually
-           ++ occurs in the polynomial p, or "failed" if no variables are
-           ++ present.
-           ++ fails precisely if polynomial satisfies ground?
-    minimumDegree : (%,VarSet) -> NonNegativeInteger
-      ++ minimumDegree(p,v) gives the minimum degree of polynomial p
-      ++ with respect to v, i.e. viewed a univariate polynomial in v
-    minimumDegree : (%,List(VarSet)) -> List(NonNegativeInteger)
-      ++ minimumDegree(p, lv) gives the list of minimum degrees of the
-      ++ polynomial p with respect to each of the variables in the list lv
-    monicDivide : (%,%,VarSet) -> Record(quotient:%,remainder:%)
-       ++ monicDivide(a,b,v) divides the polynomial a by the polynomial b,
-       ++ with each viewed as a univariate polynomial in v returning
-       ++ both the quotient and remainder.
-       ++ Error: if b is not monic with respect to v.
-    monomial : (%,VarSet,NonNegativeInteger) -> %
-        ++ monomial(a,x,n) creates the monomial \spad{a*x**n} where \spad{a} is
-        ++ a polynomial, x is a variable and n is a nonnegative integer.
-    monomial : (%,List VarSet,List NonNegativeInteger) -> %
-        ++ monomial(a,[v1..vn],[e1..en]) returns \spad{a*prod(vi**ei)}.
-    multivariate : (SparseUnivariatePolynomial(R),VarSet) -> %
-        ++ multivariate(sup,v) converts an anonymous univariable
-        ++ polynomial sup to a polynomial in the variable v.
-    multivariate : (SparseUnivariatePolynomial(%),VarSet) -> %
-        ++ multivariate(sup,v) converts an anonymous univariable
-        ++ polynomial sup to a polynomial in the variable v.
-    isPlus: % -> Union(List %, "failed")
-        ++ isPlus(p) returns \spad{[m1,...,mn]} if polynomial \spad{p = m1 + ... + mn} and
-        ++ \spad{n >= 2} and each mi is a nonzero monomial.
-    isTimes: % -> Union(List %, "failed")
-        ++ isTimes(p) returns \spad{[a1,...,an]} if polynomial \spad{p = a1 ... an}
-        ++ and \spad{n >= 2}, and, for each i, ai is either a nontrivial constant in R or else of the
-        ++ form \spad{x**e}, where \spad{e > 0} is an integer and x in a member of VarSet.
-    isExpt: % -> Union(Record(var:VarSet, exponent:NonNegativeInteger),_
-                       "failed")
-        ++ isExpt(p) returns \spad{[x, n]} if polynomial p has the form \spad{x**n} and \spad{n > 0}.
-    totalDegree : % -> NonNegativeInteger
-        ++ totalDegree(p) returns the largest sum over all monomials
-        ++ of all exponents of a monomial.
-    totalDegree : (%,List VarSet) -> NonNegativeInteger
-        ++ totalDegree(p, lv) returns the maximum sum (over all monomials of polynomial p)
-        ++ of the variables in the list lv.
-    variables : % -> List(VarSet)
-        ++ variables(p) returns the list of those variables actually
-        ++ appearing in the polynomial p.
-    primitiveMonomials: % -> List %
-        ++ primitiveMonomials(p) gives the list of monomials of the
-        ++ polynomial p with their coefficients removed.
-        ++ Note: \spad{primitiveMonomials(sum(a_(i) X^(i))) = [X^(1),...,X^(n)]}.
-    if R has OrderedSet  then OrderedSet
-    -- OrderedRing view removed to allow EXPR to define abs
-    --if R has OrderedRing then OrderedRing
-    if (R has ConvertibleTo InputForm) and
-       (VarSet has ConvertibleTo InputForm) then
-         ConvertibleTo InputForm
-    if (R has ConvertibleTo Pattern Integer) and
-       (VarSet has ConvertibleTo Pattern Integer) then
-         ConvertibleTo Pattern Integer
-    if (R has ConvertibleTo Pattern Float) and
-       (VarSet has ConvertibleTo Pattern Float) then
-         ConvertibleTo Pattern Float
-    if (R has PatternMatchable Integer) and
-       (VarSet has PatternMatchable Integer) then
-         PatternMatchable Integer
-    if (R has PatternMatchable Float) and
-       (VarSet has PatternMatchable Float) then
-         PatternMatchable Float
-    if R has CommutativeRing then
-      resultant : (%,%,VarSet) -> %
-         ++ resultant(p,q,v) returns the resultant of the polynomials
-         ++ p and q with respect to the variable v.
-      discriminant : (%,VarSet) -> %
-         ++ discriminant(p,v) returns the disriminant of the polynomial p
-         ++ with respect to the variable v.
-    if R has GcdDomain then
-      GcdDomain
-      content: (%,VarSet) -> %
-        ++ content(p,v) is the gcd of the coefficients of the polynomial p
-        ++ when p is viewed as a univariate polynomial with respect to the
-        ++ variable v.
-        ++ Thus, for polynomial 7*x**2*y + 14*x*y**2, the gcd of the
-        ++ coefficients with respect to x is 7*y.
-      primitivePart: % -> %
-        ++ primitivePart(p) returns the unitCanonical associate of the
-        ++ polynomial p with its content divided out.
-      primitivePart: (%,VarSet) -> %
-        ++ primitivePart(p,v) returns the unitCanonical associate of the
-        ++ polynomial p with its content with respect to the variable v
-        ++ divided out.
-      squareFree: % -> Factored %
-        ++ squareFree(p) returns the square free factorization of the
-        ++ polynomial p.
-      squareFreePart: % -> %
-        ++ squareFreePart(p) returns product of all the irreducible factors
-        ++ of polynomial p each taken with multiplicity one.
-
-    -- assertions
-    if R has canonicalUnitNormal then canonicalUnitNormal
-             ++ we can choose a unique representative for each
-             ++ associate class.
-             ++ This normalization is chosen to be normalization of
-             ++ leading coefficient (by default).
-    if R has PolynomialFactorizationExplicit then
-       PolynomialFactorizationExplicit
- add
-    p:%
-    v:VarSet
-    ln:List NonNegativeInteger
-    lv:List VarSet
-    n:NonNegativeInteger
-    pp,qq:SparseUnivariatePolynomial %
-    eval(p:%, l:List Equation %) ==
-      empty? l => p
-      for e in l repeat
-        retractIfCan(lhs e)@Union(VarSet,"failed") case "failed" => 
-             error "cannot find a variable to evaluate"
-      lvar:=[retract(lhs e)@VarSet for e in l]
-      eval(p, lvar,[rhs e for e in l]$List(%))
-    monomials p ==
---    zero? p => empty()
---    concat(leadingMonomial p, monomials reductum p)
---    replaced by sequential version for efficiency, by WMSIT, 7/30/90
-      ml:= empty$List(%)
-      while p ^= 0 repeat
-        ml:=concat(leadingMonomial p, ml)
-        p:= reductum p
-      reverse ml
-    isPlus p ==
-      empty? rest(l := monomials p) => "failed"
-      l
-    isTimes p ==
-      empty?(lv := variables p) or not monomial? p => "failed"
-      l := [monomial(1, v, degree(p, v)) for v in lv]
---      one?(r := leadingCoefficient p) =>
-      ((r := leadingCoefficient p) = 1) =>
-        empty? rest lv => "failed"
-        l
-      concat(r::%, l)
-    isExpt p ==
-      (u := mainVariable p) case "failed" => "failed"
-      p = monomial(1, u::VarSet, d := degree(p, u::VarSet)) =>
-        [u::VarSet, d]
-      "failed"
-    coefficient(p,v,n) == coefficient(univariate(p,v),n)
-    coefficient(p,lv,ln) ==
-       empty? lv =>
-         empty? ln => p
-         error "mismatched lists in coefficient"
-       empty? ln  => error "mismatched lists in coefficient"
-       coefficient(coefficient(univariate(p,first lv),first ln),
-                   rest lv,rest ln)
-    monomial(p,lv,ln) ==
-       empty? lv =>
-         empty? ln => p
-         error "mismatched lists in monomial"
-       empty? ln  => error "mismatched lists in monomial"
-       monomial(monomial(p,first lv, first ln),rest lv, rest ln)
-    retract(p:%):VarSet ==
-      q := mainVariable(p)::VarSet
-      q::% = p => q
-      error "Polynomial is not a single variable"
-    retractIfCan(p:%):Union(VarSet, "failed") ==
-      ((q := mainVariable p) case VarSet) and (q::VarSet::% = p) => q
-      "failed"
-    mkPrim(p:%):% == monomial(1,degree p)
-    primitiveMonomials p == [mkPrim q for q in monomials p]
-    totalDegree p ==
-        ground? p => 0
-        u := univariate(p, mainVariable(p)::VarSet)
-        d: NonNegativeInteger := 0
-        while u ^= 0 repeat
-          d := max(d, degree u + totalDegree leadingCoefficient u)
-          u := reductum u
-        d
-    totalDegree(p,lv) ==
-        ground? p => 0
-        u := univariate(p, v:=(mainVariable(p)::VarSet))
-        d: NonNegativeInteger := 0
-        w: NonNegativeInteger := 0
-        if member?(v, lv) then w:=1
-        while u ^= 0 repeat
-          d := max(d, w*(degree u) + totalDegree(leadingCoefficient u,lv))
-          u := reductum u
-        d
-
-    if R has CommutativeRing then
-        resultant(p1,p2,mvar) ==
-          resultant(univariate(p1,mvar),univariate(p2,mvar))
-        discriminant(p,var) ==
-          discriminant(univariate(p,var))
-
-    if R has IntegralDomain then
-      allMonoms(l:List %):List(%) ==
-        removeDuplicates_! concat [primitiveMonomials p for p in l]
-      P2R(p:%, b:List E, n:NonNegativeInteger):Vector(R) ==
-        w := new(n, 0)$Vector(R)
-        for i in minIndex w .. maxIndex w for bj in b repeat
-          qsetelt_!(w, i, coefficient(p, bj))
-        w
-      eq2R(l:List %, b:List E):Matrix(R) ==
-        matrix [[coefficient(p, bj) for p in l] for bj in b]
-      reducedSystem(m:Matrix %):Matrix(R) ==
-        l := listOfLists m
-        b := removeDuplicates_!
-                           concat [allMonoms r for r in l]$List(List(%))
-        d := [degree bj for bj in b]
-        mm := eq2R(first l, d)
-        l := rest l
-        while not empty? l repeat
-          mm := vertConcat(mm, eq2R(first l, d))
-          l := rest l
-        mm
-      reducedSystem(m:Matrix %, v:Vector %):
-       Record(mat:Matrix R, vec:Vector R) ==
-        l := listOfLists m
-        r := entries v
-        b : List % := removeDuplicates_! concat(allMonoms r,
-                          concat [allMonoms s for s in l]$List(List(%)))
-        d := [degree bj for bj in b]
-        n := #d
-        mm := eq2R(first l, d)
-        w := P2R(first r, d, n)
-        l := rest l
-        r := rest r
-        while not empty? l repeat
-          mm := vertConcat(mm, eq2R(first l, d))
-          w := concat(w, P2R(first r, d, n))
-          l := rest l
-          r := rest r
-        [mm, w]
-
-    if R has PolynomialFactorizationExplicit then
-       -- we might be in trouble if its actually only
-       -- a univariate polynomial category - have to remember to
-       -- over-ride these in UnivariatePolynomialCategory
-       PFBR ==>PolynomialFactorizationByRecursion(R,E,VarSet,%)
-       gcdPolynomial(pp,qq) ==
-          gcdPolynomial(pp,qq)$GeneralPolynomialGcdPackage(E,VarSet,R,%)
-       solveLinearPolynomialEquation(lpp,pp) ==
-         solveLinearPolynomialEquationByRecursion(lpp,pp)$PFBR
-       factorPolynomial(pp) ==
-         factorByRecursion(pp)$PFBR
-       factorSquareFreePolynomial(pp) ==
-         factorSquareFreeByRecursion(pp)$PFBR
-       factor p ==
-         v:Union(VarSet,"failed"):=mainVariable p
-         v case "failed" =>
-           ansR:=factor leadingCoefficient p
-           makeFR(unit(ansR)::%,
-                  [[w.flg,w.fctr::%,w.xpnt] for w in factorList ansR])
-         up:SparseUnivariatePolynomial %:=univariate(p,v)
-         ansSUP:=factorByRecursion(up)$PFBR
-         makeFR(multivariate(unit(ansSUP),v),
-                [[ww.flg,multivariate(ww.fctr,v),ww.xpnt]
-                 for ww in factorList ansSUP])
-       if R has CharacteristicNonZero then
-          mat: Matrix %
-          conditionP mat ==
-            ll:=listOfLists transpose mat   -- hence each list corresponds to a
-                                            -- column, i.e. to one variable
-            llR:List List R := [ empty() for z in first ll]
-            monslist:List List % := empty()
-            ch:=characteristic()$%
-            for l in ll repeat
-                mons:= "setUnion"/[primitiveMonomials u for u in l]
-                redmons:List % :=[]
-                for m in mons repeat
-                    vars:=variables m
-                    degs:=degree(m,vars)
-                    deg1:List NonNegativeInteger
-                    deg1:=[ ((nd:=d:Integer exquo ch:Integer)
-                               case "failed" => return "failed" ;
-                                nd::Integer::NonNegativeInteger)
-                           for d in degs ]
-                    redmons:=[monomial(1,vars,deg1),:redmons]
-                    llR:=[[ground coefficient(u,vars,degs),:v] for u in l for v in llR]
-                monslist:=[redmons,:monslist]
-            ans:=conditionP transpose matrix llR
-            ans case "failed" => "failed"
-            i:NonNegativeInteger:=0
-            [ +/[m*(ans.(i:=i+1))::% for m in mons ]
-              for mons in monslist]
-
-    if R has CharacteristicNonZero then
-          charthRootlv: (%,List VarSet,NonNegativeInteger) -> Union(%,"failed")
-          charthRoot p ==
-            vars:= variables p
-            empty? vars =>
-              ans := charthRoot ground p
-              ans case "failed" => "failed"
-              ans::R::%
-            ch:=characteristic()$%
-            charthRootlv(p,vars,ch)
-          charthRootlv(p,vars,ch) ==
-            empty? vars =>
-              ans := charthRoot ground p
-              ans case "failed" => "failed"
-              ans::R::%
-            v:=first vars
-            vars:=rest vars
-            d:=degree(p,v)
-            ans:% := 0
-            while (d>0) repeat
-               (dd:=(d::Integer exquo ch::Integer)) case "failed" =>
-                      return "failed"
-               cp:=coefficient(p,v,d)
-               p:=p-monomial(cp,v,d)
-               ansx:=charthRootlv(cp,vars,ch)
-               ansx case "failed" => return "failed"
-               d:=degree(p,v)
-               ans:=ans+monomial(ansx,v,dd::Integer::NonNegativeInteger)
-            ansx:=charthRootlv(p,vars,ch)
-            ansx case "failed" => return "failed"
-            return ans+ansx
-
-    monicDivide(p1,p2,mvar) ==
-       result:=monicDivide(univariate(p1,mvar),univariate(p2,mvar))
-       [multivariate(result.quotient,mvar),
-        multivariate(result.remainder,mvar)]
-
-
-    if R has GcdDomain then
-      if R has EuclideanDomain and R has CharacteristicZero then
-       squareFree p == squareFree(p)$MultivariateSquareFree(E,VarSet,R,%)
-      else
-        squareFree p == squareFree(p)$PolynomialSquareFree(VarSet,E,R,%)
-      squareFreePart p ==
-        unit(s := squareFree p) * */[f.factor for f in factors s]
-      content(p,v) == content univariate(p,v)
-      primitivePart p ==
-        zero? p => p
-        unitNormal((p exquo content p) ::%).canonical
-      primitivePart(p,v) ==
-        zero? p => p
-        unitNormal((p exquo content(p,v)) ::%).canonical
-    if R has OrderedSet then
-      p:% < q:% ==
-        (dp:= degree p) < (dq := degree q) => (leadingCoefficient q) > 0
-        dq < dp => (leadingCoefficient p) < 0
-        leadingCoefficient(p - q) < 0
-      if (R has PatternMatchable Integer) and
-         (VarSet has PatternMatchable Integer) then
-           patternMatch(p:%, pat:Pattern Integer,
-            l:PatternMatchResult(Integer, %)) ==
-              patternMatch(p, pat,
-                l)$PatternMatchPolynomialCategory(Integer,E,VarSet,R,%)
-      if (R has PatternMatchable Float) and
-         (VarSet has PatternMatchable Float) then
-           patternMatch(p:%, pat:Pattern Float,
-            l:PatternMatchResult(Float, %)) ==
-              patternMatch(p, pat,
-                l)$PatternMatchPolynomialCategory(Float,E,VarSet,R,%)
-
-    if (R has ConvertibleTo Pattern Integer) and
-       (VarSet has ConvertibleTo Pattern Integer) then
-         convert(x:%):Pattern(Integer) ==
-           map(convert, convert,
-              x)$PolynomialCategoryLifting(E,VarSet,R,%,Pattern Integer)
-    if (R has ConvertibleTo Pattern Float) and
-       (VarSet has ConvertibleTo Pattern Float) then
-         convert(x:%):Pattern(Float) ==
-           map(convert, convert,
-            x)$PolynomialCategoryLifting(E, VarSet, R, %, Pattern Float)
-    if (R has ConvertibleTo InputForm) and
-       (VarSet has ConvertibleTo InputForm) then
-         convert(p:%):InputForm ==
-           map(convert, convert,
-                    p)$PolynomialCategoryLifting(E,VarSet,R,%,InputForm)
-
-@
-\section{POLYCAT.lsp BOOTSTRAP}
-{\bf POLYCAT} depends on itself. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf POLYCAT}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf POLYCAT.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.
-
-<<POLYCAT.lsp BOOTSTRAP>>=
-
-(/VERSIONCHECK 2) 
-
-(SETQ |PolynomialCategory;CAT| (QUOTE NIL)) 
-
-(SETQ |PolynomialCategory;AL| (QUOTE NIL)) 
-
-(DEFUN |PolynomialCategory| (&REST #0=#:G1430 &AUX #1=#:G1428)
- (DSETQ #1# #0#)
- (LET (#2=#:G1429)
-  (COND
-   ((SETQ #2# (|assoc| (|devaluateList| #1#) |PolynomialCategory;AL|))
-     (CDR #2#))
-   (T
-     (SETQ |PolynomialCategory;AL|
-      (|cons5|
-       (CONS (|devaluateList| #1#)
-        (SETQ #2# (APPLY (FUNCTION |PolynomialCategory;|) #1#)))
-       |PolynomialCategory;AL|))
-     #2#)))) 
-
-(DEFUN |PolynomialCategory;| (|t#1| |t#2| |t#3|)
- (PROG (#0=#:G1427)
-  (RETURN
-   (PROG1 
-    (LETT #0#
-     (|sublisV|
-      (PAIR (QUOTE (|t#1| |t#2| |t#3|)) (LIST (|devaluate| |t#1|) (|devaluate| |t#2|) (|devaluate| |t#3|)))
-      (COND
-       (|PolynomialCategory;CAT|)
-       ((QUOTE T)
-        (LETT |PolynomialCategory;CAT|
-         (|Join|
-          (|PartialDifferentialRing| (QUOTE |t#3|))
-          (|FiniteAbelianMonoidRing| (QUOTE |t#1|) (QUOTE |t#2|))
-          (|Evalable| (QUOTE $))
-          (|InnerEvalable| (QUOTE |t#3|) (QUOTE |t#1|))
-          (|InnerEvalable| (QUOTE |t#3|) (QUOTE $))
-          (|RetractableTo| (QUOTE |t#3|))
-          (|FullyLinearlyExplicitRingOver| (QUOTE |t#1|))
-          (|mkCategory| (QUOTE |domain|)
-           (QUOTE
-            (((|degree| ((|NonNegativeInteger|) $ |t#3|)) T)
-             ((|degree| ((|List| (|NonNegativeInteger|)) $ (|List| |t#3|))) T)
-             ((|coefficient| ($ $ |t#3| (|NonNegativeInteger|))) T)
-             ((|coefficient| ($ $ (|List| |t#3|)
-               (|List| (|NonNegativeInteger|)))) T)
-             ((|monomials| ((|List| $) $)) T)
-             ((|univariate| ((|SparseUnivariatePolynomial| $) $ |t#3|)) T)
-             ((|univariate| ((|SparseUnivariatePolynomial| |t#1|) $)) T)
-             ((|mainVariable| ((|Union| |t#3| "failed") $)) T)
-             ((|minimumDegree| ((|NonNegativeInteger|) $ |t#3|)) T)
-             ((|minimumDegree| ((|List| (|NonNegativeInteger|)) $
-               (|List| |t#3|))) T)
-             ((|monicDivide|
-               ((|Record| (|:| |quotient| $) (|:| |remainder| $)) $ $ |t#3|))
-               T)
-             ((|monomial| ($ $ |t#3| (|NonNegativeInteger|))) T)
-             ((|monomial| ($ $ (|List| |t#3|) (|List| (|NonNegativeInteger|))))
-               T)
-             ((|multivariate| ($ (|SparseUnivariatePolynomial| |t#1|) |t#3|))
-               T)
-             ((|multivariate| ($ (|SparseUnivariatePolynomial| $) |t#3|)) T)
-             ((|isPlus| ((|Union| (|List| $) "failed") $)) T)
-             ((|isTimes| ((|Union| (|List| $) "failed") $)) T)
-             ((|isExpt|
-               ((|Union| 
-                (|Record| (|:| |var| |t#3|) 
-                          (|:| |exponent| (|NonNegativeInteger|)))
-                "failed") $))
-               T)
-             ((|totalDegree| ((|NonNegativeInteger|) $)) T)
-             ((|totalDegree| ((|NonNegativeInteger|) $ (|List| |t#3|))) T)
-             ((|variables| ((|List| |t#3|) $)) T)
-             ((|primitiveMonomials| ((|List| $) $)) T)
-             ((|resultant| ($ $ $ |t#3|)) (|has| |t#1| (|CommutativeRing|)))
-             ((|discriminant| ($ $ |t#3|)) (|has| |t#1| (|CommutativeRing|)))
-             ((|content| ($ $ |t#3|)) (|has| |t#1| (|GcdDomain|)))
-             ((|primitivePart| ($ $)) (|has| |t#1| (|GcdDomain|)))
-             ((|primitivePart| ($ $ |t#3|)) (|has| |t#1| (|GcdDomain|)))
-             ((|squareFree| ((|Factored| $) $)) (|has| |t#1| (|GcdDomain|)))
-             ((|squareFreePart| ($ $)) (|has| |t#1| (|GcdDomain|)))))
-           (QUOTE
-            (((|OrderedSet|) (|has| |t#1| (|OrderedSet|)))
-             ((|ConvertibleTo| (|InputForm|))
-              (AND (|has| |t#3| (|ConvertibleTo| (|InputForm|)))
-                   (|has| |t#1| (|ConvertibleTo| (|InputForm|)))))
-             ((|ConvertibleTo| (|Pattern| (|Integer|)))
-              (AND (|has| |t#3| (|ConvertibleTo| (|Pattern| (|Integer|))))
-                   (|has| |t#1| (|ConvertibleTo| (|Pattern| (|Integer|))))))
-             ((|ConvertibleTo| (|Pattern| (|Float|)))
-              (AND (|has| |t#3| (|ConvertibleTo| (|Pattern| (|Float|))))
-                   (|has| |t#1| (|ConvertibleTo| (|Pattern| (|Float|))))))
-             ((|PatternMatchable| (|Integer|))
-              (AND
-               (|has| |t#3| (|PatternMatchable| (|Integer|)))
-               (|has| |t#1| (|PatternMatchable| (|Integer|)))))
-             ((|PatternMatchable| (|Float|))
-              (AND
-               (|has| |t#3| (|PatternMatchable| (|Float|)))
-               (|has| |t#1| (|PatternMatchable| (|Float|)))))
-             ((|GcdDomain|) (|has| |t#1| (|GcdDomain|)))
-             (|canonicalUnitNormal|
-               (|has| |t#1| (ATTRIBUTE |canonicalUnitNormal|)))
-             ((|PolynomialFactorizationExplicit|)
-               (|has| |t#1| (|PolynomialFactorizationExplicit|)))))
-           (QUOTE
-            ((|Factored| $)
-             (|List| $)
-             (|List| |t#3|)
-             (|NonNegativeInteger|)
-             (|SparseUnivariatePolynomial| $)
-             (|SparseUnivariatePolynomial| |t#1|)
-             (|List| (|NonNegativeInteger|))))
-            NIL))
-          . #1=(|PolynomialCategory|)))))
-      . #1#)
-    (SETELT #0# 0
-     (LIST (QUOTE |PolynomialCategory|)
-      (|devaluate| |t#1|) (|devaluate| |t#2|) (|devaluate| |t#3|))))))) 
-
-@
-\section{POLYCAT-.lsp BOOTSTRAP}
-{\bf POLYCAT-} depends on {\bf POLYCAT}. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf POLYCAT-}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf POLYCAT-.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.
-
-<<POLYCAT-.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-
-(/VERSIONCHECK 2) 
-
-(DEFUN |POLYCAT-;eval;SLS;1| (|p| |l| $)
- (PROG (#0=#:G1444 #1=#:G1438 #2=#:G1445 #3=#:G1446 |lvar| #4=#:G1447 
-        |e| #5=#:G1448)
-  (RETURN 
-   (SEQ
-    (COND
-     ((NULL |l|) |p|)
-     ((QUOTE T)
-      (SEQ
-       (SEQ
-        (EXIT
-         (SEQ
-          (LETT |e| NIL |POLYCAT-;eval;SLS;1|)
-          (LETT #0# |l| |POLYCAT-;eval;SLS;1|)
-          G190
-          (COND
-           ((OR (ATOM #0#)
-                (PROGN (LETT |e| (CAR #0#) |POLYCAT-;eval;SLS;1|) NIL))
-            (GO G191)))
-          (SEQ 
-           (EXIT
-            (COND
-             ((QEQCAR
-               (SPADCALL (SPADCALL |e| (QREFELT $ 11)) (QREFELT $ 13)) 1)
-              (PROGN
-               (LETT #1# 
-                (|error| "cannot find a variable to evaluate")
-                |POLYCAT-;eval;SLS;1|)
-               (GO #1#))))))
-          (LETT #0# (CDR #0#) |POLYCAT-;eval;SLS;1|)
-          (GO G190)
-          G191
-          (EXIT NIL)))
-        #1# (EXIT #1#))
-       (LETT |lvar|
-        (PROGN
-         (LETT #2# NIL |POLYCAT-;eval;SLS;1|)
-         (SEQ
-          (LETT |e| NIL |POLYCAT-;eval;SLS;1|)
-          (LETT #3# |l| |POLYCAT-;eval;SLS;1|)
-          G190
-          (COND
-           ((OR (ATOM #3#)
-                (PROGN (LETT |e| (CAR #3#) |POLYCAT-;eval;SLS;1|) NIL))
-            (GO G191)))
-          (SEQ
-           (EXIT
-            (LETT #2#
-             (CONS (SPADCALL (SPADCALL |e| (QREFELT $ 11)) (QREFELT $ 14))
-                   #2#)
-             |POLYCAT-;eval;SLS;1|)))
-          (LETT #3# (CDR #3#) |POLYCAT-;eval;SLS;1|)
-          (GO G190)
-          G191
-          (EXIT (NREVERSE0 #2#))))
-         |POLYCAT-;eval;SLS;1|)
-       (EXIT
-        (SPADCALL |p| |lvar|
-         (PROGN
-          (LETT #4# NIL |POLYCAT-;eval;SLS;1|)
-          (SEQ
-           (LETT |e| NIL |POLYCAT-;eval;SLS;1|)
-           (LETT #5# |l| |POLYCAT-;eval;SLS;1|)
-           G190
-           (COND 
-            ((OR (ATOM #5#)
-                 (PROGN (LETT |e| (CAR #5#) |POLYCAT-;eval;SLS;1|) NIL))
-              (GO G191)))
-           (SEQ 
-            (EXIT
-             (LETT #4# (CONS (SPADCALL |e| (QREFELT $ 15)) #4#)
-              |POLYCAT-;eval;SLS;1|)))
-           (LETT #5# (CDR #5#) |POLYCAT-;eval;SLS;1|)
-           (GO G190)
-           G191
-           (EXIT (NREVERSE0 #4#))))
-         (QREFELT $ 18)))))))))) 
-
-(DEFUN |POLYCAT-;monomials;SL;2| (|p| $)
- (PROG (|ml|)
-  (RETURN
-   (SEQ
-    (LETT |ml| NIL |POLYCAT-;monomials;SL;2|)
-    (SEQ G190
-     (COND
-      ((NULL 
-        (COND
-         ((SPADCALL |p| (|spadConstant| $ 21) (QREFELT $ 24)) (QUOTE NIL))
-         ((QUOTE T) (QUOTE T))))
-       (GO G191)))
-     (SEQ
-      (LETT |ml|
-       (CONS (SPADCALL |p| (QREFELT $ 25)) |ml|)
-       |POLYCAT-;monomials;SL;2|)
-      (EXIT
-       (LETT |p| (SPADCALL |p| (QREFELT $ 26)) |POLYCAT-;monomials;SL;2|)))
-      NIL
-     (GO G190)
-     G191
-     (EXIT NIL))
-    (EXIT (REVERSE |ml|)))))) 
-
-(DEFUN |POLYCAT-;isPlus;SU;3| (|p| $)
- (PROG (|l|)
-  (RETURN
-   (COND
-    ((NULL 
-       (CDR (LETT |l| (SPADCALL |p| (QREFELT $ 28)) |POLYCAT-;isPlus;SU;3|)))
-      (CONS 1 "failed"))
-    ((QUOTE T) (CONS 0 |l|)))))) 
-
-(DEFUN |POLYCAT-;isTimes;SU;4| (|p| $)
- (PROG (|lv| #0=#:G1470 |v| #1=#:G1471 |l| |r|)
-  (RETURN
-   (SEQ
-    (COND
-     ((OR (NULL 
-           (LETT |lv| (SPADCALL |p| (QREFELT $ 31)) |POLYCAT-;isTimes;SU;4|))
-          (NULL (SPADCALL |p| (QREFELT $ 32))))
-       (CONS 1 "failed"))
-     ((QUOTE T)
-      (SEQ
-       (LETT |l|
-        (PROGN
-         (LETT #0# NIL |POLYCAT-;isTimes;SU;4|)
-         (SEQ
-          (LETT |v| NIL |POLYCAT-;isTimes;SU;4|)
-          (LETT #1# |lv| |POLYCAT-;isTimes;SU;4|)
-          G190
-          (COND
-           ((OR (ATOM #1#) 
-                (PROGN (LETT |v| (CAR #1#) |POLYCAT-;isTimes;SU;4|) NIL))
-            (GO G191)))
-          (SEQ 
-           (EXIT
-            (LETT #0#
-             (CONS
-              (SPADCALL (|spadConstant| $ 33) |v|
-               (SPADCALL |p| |v| (QREFELT $ 36)) (QREFELT $ 37))
-              #0#)
-              |POLYCAT-;isTimes;SU;4|)))
-          (LETT #1# (CDR #1#) |POLYCAT-;isTimes;SU;4|)
-          (GO G190)
-          G191
-         (EXIT (NREVERSE0 #0#))))
-        |POLYCAT-;isTimes;SU;4|)
-       (LETT |r| (SPADCALL |p| (QREFELT $ 38)) |POLYCAT-;isTimes;SU;4|)
-       (EXIT
-        (COND
-         ((SPADCALL |r| (|spadConstant| $ 34) (QREFELT $ 39))
-           (COND
-            ((NULL (CDR |lv|)) (CONS 1 "failed"))
-            ((QUOTE T) (CONS 0 |l|))))
-         ((QUOTE T)
-           (CONS 0 (CONS (SPADCALL |r| (QREFELT $ 40)) |l|)))))))))))) 
-
-(DEFUN |POLYCAT-;isExpt;SU;5| (|p| $)
- (PROG (|u| |d|)
-  (RETURN
-   (SEQ
-    (LETT |u| (SPADCALL |p| (QREFELT $ 42)) |POLYCAT-;isExpt;SU;5|)
-    (EXIT 
-     (COND
-      ((OR (QEQCAR |u| 1)
-           (NULL
-            (SPADCALL |p|
-             (SPADCALL (|spadConstant| $ 33)
-              (QCDR |u|)
-              (LETT |d| (SPADCALL |p| (QCDR |u|) (QREFELT $ 36))
-               |POLYCAT-;isExpt;SU;5|)
-              (QREFELT $ 37))
-             (QREFELT $ 24))))
-       (CONS 1 "failed"))
-      ((QUOTE T) (CONS 0 (CONS (QCDR |u|) |d|))))))))) 
-
-(DEFUN |POLYCAT-;coefficient;SVarSetNniS;6| (|p| |v| |n| $)
- (SPADCALL (SPADCALL |p| |v| (QREFELT $ 47)) |n| (QREFELT $ 49))) 
-
-(DEFUN |POLYCAT-;coefficient;SLLS;7| (|p| |lv| |ln| $)
- (COND
-  ((NULL |lv|)
-   (COND
-    ((NULL |ln|) |p|)
-    ((QUOTE T) (|error| "mismatched lists in coefficient"))))
-  ((NULL |ln|) (|error| "mismatched lists in coefficient"))
-  ((QUOTE T)
-   (SPADCALL
-    (SPADCALL
-     (SPADCALL |p| (|SPADfirst| |lv|) (QREFELT $ 47))
-     (|SPADfirst| |ln|)
-     (QREFELT $ 49))
-    (CDR |lv|)
-    (CDR |ln|)
-    (QREFELT $ 52))))) 
-
-(DEFUN |POLYCAT-;monomial;SLLS;8| (|p| |lv| |ln| $)
- (COND
-  ((NULL |lv|) 
-   (COND
-    ((NULL |ln|) |p|)
-    ((QUOTE T) (|error| "mismatched lists in monomial"))))
-  ((NULL |ln|) (|error| "mismatched lists in monomial"))
-  ((QUOTE T)
-   (SPADCALL 
-    (SPADCALL |p| (|SPADfirst| |lv|) (|SPADfirst| |ln|) (QREFELT $ 37))
-    (CDR |lv|)
-    (CDR |ln|)
-    (QREFELT $ 54))))) 
-
-(DEFUN |POLYCAT-;retract;SVarSet;9| (|p| $)
- (PROG (#0=#:G1496 |q|)
-  (RETURN
-   (SEQ
-    (LETT |q|
-     (PROG2
-      (LETT #0# (SPADCALL |p| (QREFELT $ 42)) |POLYCAT-;retract;SVarSet;9|)
-      (QCDR #0#)
-      (|check-union| (QEQCAR #0# 0) (QREFELT $ 9) #0#))
-     |POLYCAT-;retract;SVarSet;9|)
-    (EXIT
-     (COND
-      ((SPADCALL (SPADCALL |q| (QREFELT $ 56)) |p| (QREFELT $ 24)) |q|)
-      ((QUOTE T) (|error| "Polynomial is not a single variable")))))))) 
-
-(DEFUN |POLYCAT-;retractIfCan;SU;10| (|p| $) 
- (PROG (|q| #0=#:G1504) 
-  (RETURN 
-   (SEQ 
-    (EXIT
-     (SEQ
-      (SEQ
-       (LETT |q| (SPADCALL |p| (QREFELT $ 42)) |POLYCAT-;retractIfCan;SU;10|)
-       (EXIT
-        (COND
-         ((QEQCAR |q| 0)
-          (COND
-           ((SPADCALL (SPADCALL (QCDR |q|) (QREFELT $ 56)) |p| (QREFELT $ 24))
-             (PROGN
-              (LETT #0# |q| |POLYCAT-;retractIfCan;SU;10|)
-              (GO #0#))))))))
-      (EXIT (CONS 1 "failed"))))
-     #0#
-     (EXIT #0#))))) 
-
-(DEFUN |POLYCAT-;mkPrim| (|p| $)
- (SPADCALL
-  (|spadConstant| $ 34)
-  (SPADCALL |p| (QREFELT $ 59))
-  (QREFELT $ 60))) 
-
-(DEFUN |POLYCAT-;primitiveMonomials;SL;12| (|p| $)
- (PROG (#0=#:G1509 |q| #1=#:G1510)
-  (RETURN
-   (SEQ
-    (PROGN
-     (LETT #0# NIL |POLYCAT-;primitiveMonomials;SL;12|)
-     (SEQ
-      (LETT |q| NIL |POLYCAT-;primitiveMonomials;SL;12|)
-      (LETT #1# (SPADCALL |p| (QREFELT $ 28)) |POLYCAT-;primitiveMonomials;SL;12|)
-      G190
-      (COND
-       ((OR (ATOM #1#)
-            (PROGN
-             (LETT |q| (CAR #1#) |POLYCAT-;primitiveMonomials;SL;12|)
-             NIL))
-        (GO G191)))
-      (SEQ 
-       (EXIT
-        (LETT #0# (CONS (|POLYCAT-;mkPrim| |q| $) #0#)
-         |POLYCAT-;primitiveMonomials;SL;12|)))
-      (LETT #1# (CDR #1#) |POLYCAT-;primitiveMonomials;SL;12|)
-      (GO G190)
-      G191
-      (EXIT (NREVERSE0 #0#)))))))) 
-
-(DEFUN |POLYCAT-;totalDegree;SNni;13| (|p| $)
- (PROG (#0=#:G1512 |d| |u|)
-  (RETURN
-   (SEQ
-    (COND
-     ((SPADCALL |p| (QREFELT $ 62)) 0)
-     ((QUOTE T)
-      (SEQ
-       (LETT |u|
-        (SPADCALL |p|
-         (PROG2
-          (LETT #0#
-           (SPADCALL |p| (QREFELT $ 42))
-           |POLYCAT-;totalDegree;SNni;13|)
-          (QCDR #0#)
-          (|check-union| (QEQCAR #0# 0) (QREFELT $ 9) #0#))
-         (QREFELT $ 47))
-        |POLYCAT-;totalDegree;SNni;13|)
-       (LETT |d| 0 |POLYCAT-;totalDegree;SNni;13|)
-       (SEQ G190 
-        (COND
-         ((NULL
-          (COND
-           ((SPADCALL |u| (|spadConstant| $ 63) (QREFELT $ 64)) (QUOTE NIL))
-           ((QUOTE T) (QUOTE T)))) (GO G191)))
-        (SEQ
-         (LETT |d|
-          (MAX |d| 
-           (+
-            (SPADCALL |u| (QREFELT $ 65))
-            (SPADCALL (SPADCALL |u| (QREFELT $ 66)) (QREFELT $ 67))))
-          |POLYCAT-;totalDegree;SNni;13|)
-         (EXIT
-          (LETT |u|
-           (SPADCALL |u| (QREFELT $ 68)) |POLYCAT-;totalDegree;SNni;13|)))
-        NIL
-        (GO G190)
-        G191
-        (EXIT NIL))
-       (EXIT |d|)))))))) 
-
-(DEFUN |POLYCAT-;totalDegree;SLNni;14| (|p| |lv| $)
- (PROG (#0=#:G1520 |v| |w| |d| |u|)
-  (RETURN
-   (SEQ
-    (COND
-     ((SPADCALL |p| (QREFELT $ 62)) 0)
-     ((QUOTE T)
-      (SEQ
-       (LETT |u|
-        (SPADCALL |p|
-         (LETT |v|
-          (PROG2
-           (LETT #0# 
-            (SPADCALL |p| (QREFELT $ 42))
-            |POLYCAT-;totalDegree;SLNni;14|)
-           (QCDR #0#)
-           (|check-union| (QEQCAR #0# 0) (QREFELT $ 9) #0#))
-          |POLYCAT-;totalDegree;SLNni;14|)
-         (QREFELT $ 47))
-        |POLYCAT-;totalDegree;SLNni;14|)
-       (LETT |d| 0 |POLYCAT-;totalDegree;SLNni;14|)
-       (LETT |w| 0 |POLYCAT-;totalDegree;SLNni;14|)
-       (COND
-        ((SPADCALL |v| |lv| (QREFELT $ 70))
-          (LETT |w| 1 |POLYCAT-;totalDegree;SLNni;14|)))
-       (SEQ G190
-        (COND
-         ((NULL
-          (COND
-           ((SPADCALL |u| (|spadConstant| $ 63) (QREFELT $ 64)) (QUOTE NIL))
-           ((QUOTE T) (QUOTE T)))) (GO G191)))
-        (SEQ
-         (LETT |d|
-          (MAX |d| 
-           (+ 
-            (* |w| (SPADCALL |u| (QREFELT $ 65)))
-            (SPADCALL (SPADCALL |u| (QREFELT $ 66)) |lv| (QREFELT $ 71))))
-          |POLYCAT-;totalDegree;SLNni;14|)
-         (EXIT
-          (LETT |u|
-           (SPADCALL |u| (QREFELT $ 68))
-           |POLYCAT-;totalDegree;SLNni;14|)))
-         NIL 
-         (GO G190) 
-         G191 
-         (EXIT NIL))
-       (EXIT |d|)))))))) 
-
-(DEFUN |POLYCAT-;resultant;2SVarSetS;15| (|p1| |p2| |mvar| $)
- (SPADCALL
-  (SPADCALL |p1| |mvar| (QREFELT $ 47))
-  (SPADCALL |p2| |mvar| (QREFELT $ 47))
-  (QREFELT $ 73))) 
-
-(DEFUN |POLYCAT-;discriminant;SVarSetS;16| (|p| |var| $)
- (SPADCALL (SPADCALL |p| |var| (QREFELT $ 47)) (QREFELT $ 75))) 
-
-(DEFUN |POLYCAT-;allMonoms| (|l| $)
- (PROG (#0=#:G1532 |p| #1=#:G1533)
-  (RETURN
-   (SEQ
-    (SPADCALL
-     (SPADCALL
-      (PROGN
-       (LETT #0# NIL |POLYCAT-;allMonoms|)
-       (SEQ
-        (LETT |p| NIL |POLYCAT-;allMonoms|)
-        (LETT #1# |l| |POLYCAT-;allMonoms|)
-        G190
-        (COND
-         ((OR (ATOM #1#) (PROGN (LETT |p| (CAR #1#) |POLYCAT-;allMonoms|) NIL))
-          (GO G191)))
-        (SEQ 
-         (EXIT 
-          (LETT #0#
-           (CONS (SPADCALL |p| (QREFELT $ 77)) #0#)
-           |POLYCAT-;allMonoms|)))
-        (LETT #1# (CDR #1#) |POLYCAT-;allMonoms|)
-        (GO G190)
-        G191
-        (EXIT (NREVERSE0 #0#))))
-      (QREFELT $ 79))
-     (QREFELT $ 80)))))) 
-
-(DEFUN |POLYCAT-;P2R| (|p| |b| |n| $)
- (PROG (|w| |bj| #0=#:G1538 |i| #1=#:G1537)
-  (RETURN 
-   (SEQ
-    (LETT |w|
-     (SPADCALL |n| (|spadConstant| $ 22) (QREFELT $ 82))
-     |POLYCAT-;P2R|)
-    (SEQ
-     (LETT |bj| NIL |POLYCAT-;P2R|)
-     (LETT #0# |b| |POLYCAT-;P2R|)
-     (LETT |i| (SPADCALL |w| (QREFELT $ 84)) |POLYCAT-;P2R|)
-     (LETT #1# (QVSIZE |w|) |POLYCAT-;P2R|)
-     G190
-     (COND
-      ((OR (> |i| #1#)
-           (ATOM #0#)
-           (PROGN (LETT |bj| (CAR #0#) |POLYCAT-;P2R|) NIL))
-       (GO G191)))
-     (SEQ
-      (EXIT
-       (SPADCALL |w| |i| (SPADCALL |p| |bj| (QREFELT $ 85)) (QREFELT $ 86))))
-     (LETT |i|
-      (PROG1 (+ |i| 1) (LETT #0# (CDR #0#) |POLYCAT-;P2R|)) |POLYCAT-;P2R|)
-     (GO G190)
-     G191
-     (EXIT NIL))
-    (EXIT |w|))))) 
-
-(DEFUN |POLYCAT-;eq2R| (|l| |b| $)
- (PROG (#0=#:G1542 |bj| #1=#:G1543 #2=#:G1544 |p| #3=#:G1545)
-  (RETURN
-   (SEQ
-    (SPADCALL
-     (PROGN
-      (LETT #0# NIL |POLYCAT-;eq2R|)
-      (SEQ
-       (LETT |bj| NIL |POLYCAT-;eq2R|)
-       (LETT #1# |b| |POLYCAT-;eq2R|)
-       G190
-       (COND
-        ((OR (ATOM #1#) 
-             (PROGN (LETT |bj| (CAR #1#) |POLYCAT-;eq2R|) NIL)) (GO G191)))
-       (SEQ 
-        (EXIT
-         (LETT #0#
-          (CONS
-           (PROGN
-            (LETT #2# NIL |POLYCAT-;eq2R|)
-            (SEQ
-             (LETT |p| NIL |POLYCAT-;eq2R|)
-             (LETT #3# |l| |POLYCAT-;eq2R|)
-             G190
-             (COND
-              ((OR (ATOM #3#) (PROGN (LETT |p| (CAR #3#) |POLYCAT-;eq2R|) NIL))
-               (GO G191)))
-             (SEQ 
-              (EXIT
-               (LETT #2# 
-                (CONS (SPADCALL |p| |bj| (QREFELT $ 85)) #2#)
-                |POLYCAT-;eq2R|)))
-             (LETT #3# (CDR #3#) |POLYCAT-;eq2R|)
-             (GO G190)
-             G191
-             (EXIT (NREVERSE0 #2#))))
-           #0#)
-          |POLYCAT-;eq2R|)))
-       (LETT #1# (CDR #1#) |POLYCAT-;eq2R|)
-       (GO G190)
-       G191
-       (EXIT (NREVERSE0 #0#))))
-     (QREFELT $ 89)))))) 
-
-(DEFUN |POLYCAT-;reducedSystem;MM;20| (|m| $)
- (PROG (#0=#:G1555 |r| #1=#:G1556 |b| #2=#:G1557 |bj| #3=#:G1558 |d| |mm| |l|)
-  (RETURN
-   (SEQ
-    (LETT |l| (SPADCALL |m| (QREFELT $ 92)) |POLYCAT-;reducedSystem;MM;20|)
-    (LETT |b|
-     (SPADCALL
-      (SPADCALL
-       (PROGN
-        (LETT #0# NIL |POLYCAT-;reducedSystem;MM;20|)
-        (SEQ
-         (LETT |r| NIL |POLYCAT-;reducedSystem;MM;20|)
-         (LETT #1# |l| |POLYCAT-;reducedSystem;MM;20|)
-         G190
-        (COND
-         ((OR (ATOM #1#) 
-              (PROGN (LETT |r| (CAR #1#) |POLYCAT-;reducedSystem;MM;20|) NIL))
-          (GO G191)))
-        (SEQ 
-         (EXIT 
-          (LETT #0# 
-           (CONS (|POLYCAT-;allMonoms| |r| $) #0#)
-           |POLYCAT-;reducedSystem;MM;20|)))
-        (LETT #1# (CDR #1#) |POLYCAT-;reducedSystem;MM;20|)
-        (GO G190)
-        G191
-        (EXIT (NREVERSE0 #0#))))
-       (QREFELT $ 79))
-      (QREFELT $ 80))
-     |POLYCAT-;reducedSystem;MM;20|)
-    (LETT |d|
-     (PROGN
-      (LETT #2# NIL |POLYCAT-;reducedSystem;MM;20|)
-      (SEQ
-       (LETT |bj| NIL |POLYCAT-;reducedSystem;MM;20|)
-       (LETT #3# |b| |POLYCAT-;reducedSystem;MM;20|)
-       G190
-       (COND
-        ((OR (ATOM #3#) 
-             (PROGN (LETT |bj| (CAR #3#) |POLYCAT-;reducedSystem;MM;20|) NIL))
-         (GO G191)))
-       (SEQ 
-        (EXIT 
-         (LETT #2# 
-          (CONS (SPADCALL |bj| (QREFELT $ 59)) #2#)
-          |POLYCAT-;reducedSystem;MM;20|)))
-       (LETT #3# (CDR #3#) |POLYCAT-;reducedSystem;MM;20|)
-       (GO G190)
-       G191
-       (EXIT (NREVERSE0 #2#))))
-      |POLYCAT-;reducedSystem;MM;20|)
-    (LETT |mm|
-     (|POLYCAT-;eq2R| (|SPADfirst| |l|) |d| $) |POLYCAT-;reducedSystem;MM;20|)
-    (LETT |l| (CDR |l|) |POLYCAT-;reducedSystem;MM;20|)
-    (SEQ G190
-     (COND
-      ((NULL (COND ((NULL |l|) (QUOTE NIL)) ((QUOTE T) (QUOTE T)))) (GO G191)))
-     (SEQ
-      (LETT |mm| 
-       (SPADCALL |mm| (|POLYCAT-;eq2R| (|SPADfirst| |l|) |d| $) (QREFELT $ 93))
-       |POLYCAT-;reducedSystem;MM;20|)
-      (EXIT (LETT |l| (CDR |l|) |POLYCAT-;reducedSystem;MM;20|)))
-     NIL
-     (GO G190)
-     G191
-     (EXIT NIL))
-    (EXIT |mm|))))) 
-
-(DEFUN |POLYCAT-;reducedSystem;MVR;21| (|m| |v| $)
- (PROG (#0=#:G1570 |s| #1=#:G1571 |b| #2=#:G1572 |bj| #3=#:G1573 |d| |n| 
-        |mm| |w| |l| |r|)
-  (RETURN
-   (SEQ
-    (LETT |l| (SPADCALL |m| (QREFELT $ 92)) |POLYCAT-;reducedSystem;MVR;21|)
-    (LETT |r| (SPADCALL |v| (QREFELT $ 97)) |POLYCAT-;reducedSystem;MVR;21|)
-    (LETT |b| 
-     (SPADCALL 
-      (SPADCALL 
-       (|POLYCAT-;allMonoms| |r| $)
-       (SPADCALL 
-        (PROGN 
-         (LETT #0# NIL |POLYCAT-;reducedSystem;MVR;21|)
-         (SEQ
-          (LETT |s| NIL |POLYCAT-;reducedSystem;MVR;21|)
-          (LETT #1# |l| |POLYCAT-;reducedSystem;MVR;21|)
-          G190
-          (COND
-           ((OR (ATOM #1#) 
-                (PROGN 
-                 (LETT |s| (CAR #1#) |POLYCAT-;reducedSystem;MVR;21|)
-                  NIL))
-            (GO G191)))
-          (SEQ 
-           (EXIT 
-            (LETT #0# 
-             (CONS (|POLYCAT-;allMonoms| |s| $) #0#) 
-             |POLYCAT-;reducedSystem;MVR;21|)))
-          (LETT #1# (CDR #1#) |POLYCAT-;reducedSystem;MVR;21|)
-          (GO G190)
-          G191
-          (EXIT (NREVERSE0 #0#))))
-        (QREFELT $ 79))
-       (QREFELT $ 98))
-      (QREFELT $ 80))
-     |POLYCAT-;reducedSystem;MVR;21|)
-    (LETT |d|
-     (PROGN
-      (LETT #2# NIL |POLYCAT-;reducedSystem;MVR;21|)
-      (SEQ
-       (LETT |bj| NIL |POLYCAT-;reducedSystem;MVR;21|)
-       (LETT #3# |b| |POLYCAT-;reducedSystem;MVR;21|)
-       G190
-       (COND
-        ((OR (ATOM #3#) 
-             (PROGN (LETT |bj| (CAR #3#) |POLYCAT-;reducedSystem;MVR;21|) NIL))
-         (GO G191)))
-       (SEQ 
-        (EXIT 
-         (LETT #2# 
-          (CONS (SPADCALL |bj| (QREFELT $ 59)) #2#)
-          |POLYCAT-;reducedSystem;MVR;21|)))
-       (LETT #3# (CDR #3#) |POLYCAT-;reducedSystem;MVR;21|)
-       (GO G190)
-       G191
-       (EXIT (NREVERSE0 #2#))))
-      |POLYCAT-;reducedSystem;MVR;21|)
-    (LETT |n| (LENGTH |d|) |POLYCAT-;reducedSystem;MVR;21|)
-    (LETT |mm| 
-     (|POLYCAT-;eq2R| (|SPADfirst| |l|) |d| $)
-     |POLYCAT-;reducedSystem;MVR;21|)
-    (LETT |w| 
-     (|POLYCAT-;P2R| (|SPADfirst| |r|) |d| |n| $)
-     |POLYCAT-;reducedSystem;MVR;21|)
-    (LETT |l| (CDR |l|) |POLYCAT-;reducedSystem;MVR;21|)
-    (LETT |r| (CDR |r|) |POLYCAT-;reducedSystem;MVR;21|)
-    (SEQ G190
-     (COND
-      ((NULL (COND ((NULL |l|) (QUOTE NIL)) ((QUOTE T) (QUOTE T))))
-       (GO G191)))
-     (SEQ
-      (LETT |mm| 
-       (SPADCALL |mm| (|POLYCAT-;eq2R| (|SPADfirst| |l|) |d| $) (QREFELT $ 93))
-       |POLYCAT-;reducedSystem;MVR;21|)
-      (LETT |w| 
-       (SPADCALL |w| 
-        (|POLYCAT-;P2R| (|SPADfirst| |r|) |d| |n| $)
-        (QREFELT $ 99))
-       |POLYCAT-;reducedSystem;MVR;21|)
-      (LETT |l| (CDR |l|) |POLYCAT-;reducedSystem;MVR;21|)
-      (EXIT (LETT |r| (CDR |r|) |POLYCAT-;reducedSystem;MVR;21|)))
-      NIL
-      (GO G190)
-      G191
-      (EXIT NIL))
-    (EXIT (CONS |mm| |w|)))))) 
-
-(DEFUN |POLYCAT-;gcdPolynomial;3Sup;22| (|pp| |qq| $)
- (SPADCALL |pp| |qq| (QREFELT $ 104))) 
-
-(DEFUN |POLYCAT-;solveLinearPolynomialEquation;LSupU;23| (|lpp| |pp| $)
- (SPADCALL |lpp| |pp| (QREFELT $ 109))) 
-
-(DEFUN |POLYCAT-;factorPolynomial;SupF;24| (|pp| $)
- (SPADCALL |pp| (QREFELT $ 114))) 
-
-(DEFUN |POLYCAT-;factorSquareFreePolynomial;SupF;25| (|pp| $)
- (SPADCALL |pp| (QREFELT $ 117))) 
-
-(DEFUN |POLYCAT-;factor;SF;26| (|p| $) 
- (PROG (|v| |ansR| #0=#:G1615 |w| #1=#:G1616 |up| |ansSUP| #2=#:G1617 
-        |ww| #3=#:G1618) 
-  (RETURN
-   (SEQ
-    (LETT |v| (SPADCALL |p| (QREFELT $ 42)) |POLYCAT-;factor;SF;26|)
-    (EXIT
-     (COND
-      ((QEQCAR |v| 1)
-       (SEQ
-        (LETT |ansR| 
-         (SPADCALL (SPADCALL |p| (QREFELT $ 38)) (QREFELT $ 120))
-         |POLYCAT-;factor;SF;26|)
-        (EXIT 
-         (SPADCALL 
-          (SPADCALL (SPADCALL |ansR| (QREFELT $ 122)) (QREFELT $ 40))
-          (PROGN 
-           (LETT #0# NIL |POLYCAT-;factor;SF;26|)
-           (SEQ 
-            (LETT |w| NIL |POLYCAT-;factor;SF;26|)
-            (LETT #1#
-             (SPADCALL |ansR| (QREFELT $ 126))
-             |POLYCAT-;factor;SF;26|)
-            G190 
-            (COND
-             ((OR (ATOM #1#) 
-                  (PROGN (LETT |w| (CAR #1#) |POLYCAT-;factor;SF;26|) NIL))
-              (GO G191)))
-            (SEQ 
-             (EXIT 
-              (LETT #0# 
-               (CONS 
-                (VECTOR (QVELT |w| 0) 
-                  (SPADCALL (QVELT |w| 1) (QREFELT $ 40)) (QVELT |w| 2))
-                #0#)
-               |POLYCAT-;factor;SF;26|)))
-            (LETT #1# (CDR #1#) |POLYCAT-;factor;SF;26|)
-            (GO G190)
-            G191
-            (EXIT (NREVERSE0 #0#))))
-          (QREFELT $ 130)))))
-      ((QUOTE T)
-       (SEQ
-        (LETT |up|
-         (SPADCALL |p| (QCDR |v|) (QREFELT $ 47)) |POLYCAT-;factor;SF;26|)
-        (LETT |ansSUP| (SPADCALL |up| (QREFELT $ 114)) |POLYCAT-;factor;SF;26|)
-        (EXIT
-         (SPADCALL
-          (SPADCALL 
-           (SPADCALL |ansSUP| (QREFELT $ 131)) (QCDR |v|) (QREFELT $ 132))
-          (PROGN 
-           (LETT #2# NIL |POLYCAT-;factor;SF;26|)
-           (SEQ 
-            (LETT |ww| NIL |POLYCAT-;factor;SF;26|)
-            (LETT #3# 
-             (SPADCALL |ansSUP| (QREFELT $ 135))
-             |POLYCAT-;factor;SF;26|)
-            G190
-            (COND
-             ((OR (ATOM #3#)
-                  (PROGN (LETT |ww| (CAR #3#) |POLYCAT-;factor;SF;26|) NIL))
-              (GO G191)))
-            (SEQ 
-             (EXIT 
-              (LETT #2# 
-               (CONS 
-                (VECTOR (QVELT |ww| 0) (SPADCALL (QVELT |ww| 1) (QCDR |v|) 
-                        (QREFELT $ 132)) (QVELT |ww| 2))
-                #2#) 
-               |POLYCAT-;factor;SF;26|)))
-            (LETT #3# (CDR #3#) |POLYCAT-;factor;SF;26|)
-            (GO G190)
-            G191
-            (EXIT (NREVERSE0 #2#))))
-          (QREFELT $ 130))))))))))) 
-
-(DEFUN |POLYCAT-;conditionP;MU;27| (|mat| $)
- (PROG (|ll| #0=#:G1653 |z| #1=#:G1654 |ch| |l| #2=#:G1655 #3=#:G1656 
-        #4=#:G1625 #5=#:G1623 #6=#:G1624 #7=#:G1657 |vars| |degs| 
-        #8=#:G1658 |d| #9=#:G1659 |nd| #10=#:G1652 #11=#:G1632 |deg1| 
-        |redmons| #12=#:G1660 |v| #13=#:G1662 |u| #14=#:G1661 |llR| 
-        |monslist| |ans| #15=#:G1663 #16=#:G1664 |mons| #17=#:G1665 |m| 
-        #18=#:G1666 |i| #19=#:G1648 #20=#:G1646 #21=#:G1647)
-  (RETURN
-   (SEQ
-    (EXIT
-     (SEQ
-      (LETT |ll|
-       (SPADCALL (SPADCALL |mat| (QREFELT $ 137)) (QREFELT $ 92))
-       |POLYCAT-;conditionP;MU;27|)
-      (LETT |llR|
-       (PROGN
-        (LETT #0# NIL |POLYCAT-;conditionP;MU;27|)
-        (SEQ
-         (LETT |z| NIL |POLYCAT-;conditionP;MU;27|)
-         (LETT #1# (|SPADfirst| |ll|) |POLYCAT-;conditionP;MU;27|)
-         G190
-         (COND
-          ((OR (ATOM #1#) 
-               (PROGN (LETT |z| (CAR #1#) |POLYCAT-;conditionP;MU;27|) NIL))
-           (GO G191)))
-         (SEQ (EXIT (LETT #0# (CONS NIL #0#) |POLYCAT-;conditionP;MU;27|)))
-         (LETT #1# (CDR #1#) |POLYCAT-;conditionP;MU;27|)
-         (GO G190)
-         G191
-         (EXIT (NREVERSE0 #0#))))
-       |POLYCAT-;conditionP;MU;27|)
-      (LETT |monslist| NIL |POLYCAT-;conditionP;MU;27|)
-      (LETT |ch| (SPADCALL (QREFELT $ 138)) |POLYCAT-;conditionP;MU;27|)
-      (SEQ
-       (LETT |l| NIL |POLYCAT-;conditionP;MU;27|)
-       (LETT #2# |ll| |POLYCAT-;conditionP;MU;27|)
-       G190
-       (COND
-        ((OR (ATOM #2#) 
-             (PROGN (LETT |l| (CAR #2#) |POLYCAT-;conditionP;MU;27|) NIL))
-         (GO G191)))
-       (SEQ
-        (LETT |mons|
-         (PROGN
-          (LETT #6# NIL |POLYCAT-;conditionP;MU;27|)
-          (SEQ
-           (LETT |u| NIL |POLYCAT-;conditionP;MU;27|)
-           (LETT #3# |l| |POLYCAT-;conditionP;MU;27|)
-           G190
-           (COND
-            ((OR (ATOM #3#) 
-                 (PROGN (LETT |u| (CAR #3#) |POLYCAT-;conditionP;MU;27|) NIL))
-             (GO G191)))
-           (SEQ
-            (EXIT
-             (PROGN
-              (LETT #4# 
-               (SPADCALL |u| (QREFELT $ 77))
-               |POLYCAT-;conditionP;MU;27|)
-              (COND
-               (#6# 
-                (LETT #5# 
-                 (SPADCALL #5# #4# (QREFELT $ 139))
-                 |POLYCAT-;conditionP;MU;27|))
-               ((QUOTE T)
-                (PROGN 
-                 (LETT #5# #4# |POLYCAT-;conditionP;MU;27|)
-                 (LETT #6# (QUOTE T) |POLYCAT-;conditionP;MU;27|)))))))
-           (LETT #3# (CDR #3#) |POLYCAT-;conditionP;MU;27|)
-           (GO G190)
-           G191
-           (EXIT NIL))
-          (COND (#6# #5#) ((QUOTE T) (|IdentityError| (QUOTE |setUnion|)))))
-         |POLYCAT-;conditionP;MU;27|)
-        (LETT |redmons| NIL |POLYCAT-;conditionP;MU;27|)
-        (SEQ
-         (LETT |m| NIL |POLYCAT-;conditionP;MU;27|)
-         (LETT #7# |mons| |POLYCAT-;conditionP;MU;27|)
-         G190
-         (COND
-          ((OR (ATOM #7#) 
-               (PROGN (LETT |m| (CAR #7#) |POLYCAT-;conditionP;MU;27|) NIL)) 
-            (GO G191)))
-         (SEQ 
-          (LETT |vars|
-           (SPADCALL |m| (QREFELT $ 31))
-           |POLYCAT-;conditionP;MU;27|)
-          (LETT |degs|
-           (SPADCALL |m| |vars| (QREFELT $ 140))
-           |POLYCAT-;conditionP;MU;27|)
-          (LETT |deg1|
-           (PROGN
-            (LETT #8# NIL |POLYCAT-;conditionP;MU;27|)
-            (SEQ
-             (LETT |d| NIL |POLYCAT-;conditionP;MU;27|)
-             (LETT #9# |degs| |POLYCAT-;conditionP;MU;27|)
-             G190
-             (COND
-              ((OR (ATOM #9#) 
-                   (PROGN
-                    (LETT |d| (CAR #9#) |POLYCAT-;conditionP;MU;27|)
-                    NIL))
-               (GO G191)))
-             (SEQ 
-              (EXIT
-               (LETT #8# 
-                (CONS 
-                 (SEQ
-                  (LETT |nd|
-                   (SPADCALL |d| |ch| (QREFELT $ 142))
-                   |POLYCAT-;conditionP;MU;27|)
-                  (EXIT
-                   (COND
-                    ((QEQCAR |nd| 1)
-                      (PROGN
-                        (LETT #10# 
-                         (CONS 1 "failed") |POLYCAT-;conditionP;MU;27|)
-                        (GO #10#)))
-                    ((QUOTE T) 
-                      (PROG1 
-                       (LETT #11# (QCDR |nd|) |POLYCAT-;conditionP;MU;27|)
-                       (|check-subtype| 
-                        (>= #11# 0) (QUOTE (|NonNegativeInteger|)) #11#))))))
-                 #8#)
-                |POLYCAT-;conditionP;MU;27|)))
-            (LETT #9# (CDR #9#) |POLYCAT-;conditionP;MU;27|)
-            (GO G190)
-            G191
-            (EXIT (NREVERSE0 #8#))))
-           |POLYCAT-;conditionP;MU;27|)
-          (LETT |redmons| 
-           (CONS 
-            (SPADCALL (|spadConstant| $ 33) |vars| |deg1| (QREFELT $ 54))
-            |redmons|)
-           |POLYCAT-;conditionP;MU;27|)
-          (EXIT
-           (LETT |llR|
-            (PROGN
-             (LETT #12# NIL |POLYCAT-;conditionP;MU;27|)
-             (SEQ
-              (LETT |v| NIL |POLYCAT-;conditionP;MU;27|)
-              (LETT #13# |llR| |POLYCAT-;conditionP;MU;27|)
-              (LETT |u| NIL |POLYCAT-;conditionP;MU;27|)
-              (LETT #14# |l| |POLYCAT-;conditionP;MU;27|)
-              G190
-              (COND
-               ((OR (ATOM #14#)
-                 (PROGN
-                  (LETT |u| (CAR #14#) |POLYCAT-;conditionP;MU;27|)
-                   NIL) 
-                 (ATOM #13#)
-                 (PROGN (LETT |v| (CAR #13#) |POLYCAT-;conditionP;MU;27|) NIL))
-                (GO G191)))
-              (SEQ 
-               (EXIT 
-                (LETT #12#
-                 (CONS
-                  (CONS
-                   (SPADCALL
-                    (SPADCALL |u| |vars| |degs| (QREFELT $ 52))
-                    (QREFELT $ 143))
-                   |v|)
-                  #12#)
-                 |POLYCAT-;conditionP;MU;27|)))
-              (LETT #14#
-               (PROG1
-                (CDR #14#)
-                (LETT #13# (CDR #13#) |POLYCAT-;conditionP;MU;27|))
-               |POLYCAT-;conditionP;MU;27|)
-              (GO G190)
-              G191
-              (EXIT (NREVERSE0 #12#))))
-            |POLYCAT-;conditionP;MU;27|)))
-         (LETT #7# (CDR #7#) |POLYCAT-;conditionP;MU;27|)
-         (GO G190)
-         G191
-         (EXIT NIL))
-        (EXIT
-         (LETT |monslist| 
-          (CONS |redmons| |monslist|)
-          |POLYCAT-;conditionP;MU;27|)))
-       (LETT #2# (CDR #2#) |POLYCAT-;conditionP;MU;27|)
-       (GO G190)
-       G191
-       (EXIT NIL))
-      (LETT |ans|
-       (SPADCALL (SPADCALL (SPADCALL |llR| (QREFELT $ 89)) (QREFELT $ 144))
-                 (QREFELT $ 146))
-       |POLYCAT-;conditionP;MU;27|)
-      (EXIT
-       (COND 
-        ((QEQCAR |ans| 1) (CONS 1 "failed"))
-        ((QUOTE T)
-         (SEQ
-          (LETT |i| 0 |POLYCAT-;conditionP;MU;27|)
-          (EXIT
-           (CONS 0
-            (PRIMVEC2ARR
-             (PROGN
-              (LETT #15# (GETREFV (SIZE |monslist|)) 
-               |POLYCAT-;conditionP;MU;27|)
-              (SEQ
-               (LETT #16# 0 |POLYCAT-;conditionP;MU;27|)
-               (LETT |mons| NIL |POLYCAT-;conditionP;MU;27|)
-               (LETT #17# |monslist| |POLYCAT-;conditionP;MU;27|)
-               G190
-               (COND 
-                ((OR (ATOM #17#) 
-                     (PROGN 
-                      (LETT |mons| (CAR #17#) |POLYCAT-;conditionP;MU;27|)
-                      NIL))
-                 (GO G191)))
-               (SEQ 
-                (EXIT
-                 (SETELT #15# #16# 
-                  (PROGN
-                   (LETT #21# NIL |POLYCAT-;conditionP;MU;27|)
-                   (SEQ
-                    (LETT |m| NIL |POLYCAT-;conditionP;MU;27|)
-                    (LETT #18# |mons| |POLYCAT-;conditionP;MU;27|)
-                    G190
-                    (COND
-                     ((OR (ATOM #18#)
-                       (PROGN 
-                        (LETT |m| (CAR #18#) |POLYCAT-;conditionP;MU;27|)
-                         NIL))
-                      (GO G191)))
-                    (SEQ
-                     (EXIT
-                      (PROGN
-                       (LETT #19#
-                        (SPADCALL |m| 
-                         (SPADCALL 
-                          (SPADCALL 
-                           (QCDR |ans|)
-                           (LETT |i| (+ |i| 1) |POLYCAT-;conditionP;MU;27|)
-                           (QREFELT $ 147))
-                          (QREFELT $ 40))
-                         (QREFELT $ 148))
-                        |POLYCAT-;conditionP;MU;27|)
-                       (COND
-                        (#21#
-                         (LETT #20# 
-                          (SPADCALL #20# #19# (QREFELT $ 149))
-                          |POLYCAT-;conditionP;MU;27|))
-                        ((QUOTE T)
-                          (PROGN
-                           (LETT #20# #19# |POLYCAT-;conditionP;MU;27|)
-                           (LETT #21# 
-                            (QUOTE T)
-                            |POLYCAT-;conditionP;MU;27|)))))))
-                    (LETT #18# (CDR #18#) |POLYCAT-;conditionP;MU;27|)
-                    (GO G190)
-                    G191
-                    (EXIT NIL))
-                   (COND (#21# #20#) ((QUOTE T) (|spadConstant| $ 21)))))))
-               (LETT #17# 
-                (PROG1 
-                 (CDR #17#)
-                 (LETT #16# (QSADD1 #16#) |POLYCAT-;conditionP;MU;27|))
-                |POLYCAT-;conditionP;MU;27|)
-               (GO G190)
-               G191
-               (EXIT NIL))
-              #15#))))))))))
-   #10#
-   (EXIT #10#))))) 
-
-(DEFUN |POLYCAT-;charthRoot;SU;28| (|p| $)
- (PROG (|vars| |ans| |ch|)
-  (RETURN
-   (SEQ
-    (LETT |vars| (SPADCALL |p| (QREFELT $ 31)) |POLYCAT-;charthRoot;SU;28|)
-    (EXIT
-     (COND
-      ((NULL |vars|)
-        (SEQ
-         (LETT |ans|
-          (SPADCALL (SPADCALL |p| (QREFELT $ 143)) (QREFELT $ 151))
-          |POLYCAT-;charthRoot;SU;28|)
-         (EXIT
-          (COND
-           ((QEQCAR |ans| 1) (CONS 1 "failed"))
-           ((QUOTE T) (CONS 0 (SPADCALL (QCDR |ans|) (QREFELT $ 40))))))))
-      ((QUOTE T)
-       (SEQ
-        (LETT |ch| (SPADCALL (QREFELT $ 138)) |POLYCAT-;charthRoot;SU;28|)
-        (EXIT (|POLYCAT-;charthRootlv| |p| |vars| |ch| $)))))))))) 
-
-(DEFUN |POLYCAT-;charthRootlv| (|p| |vars| |ch| $)
- (PROG (|v| |dd| |cp| |d| #0=#:G1687 |ans| |ansx| #1=#:G1694)
-  (RETURN
-   (SEQ
-    (EXIT 
-     (COND
-      ((NULL |vars|)
-       (SEQ
-        (LETT |ans| 
-         (SPADCALL (SPADCALL |p| (QREFELT $ 143)) (QREFELT $ 151))
-         |POLYCAT-;charthRootlv|)
-        (EXIT
-         (COND
-          ((QEQCAR |ans| 1) (CONS 1 "failed"))
-          ((QUOTE T) (CONS 0 (SPADCALL (QCDR |ans|) (QREFELT $ 40))))))))
-      ((QUOTE T)
-       (SEQ
-        (LETT |v| (|SPADfirst| |vars|) |POLYCAT-;charthRootlv|)
-        (LETT |vars| (CDR |vars|) |POLYCAT-;charthRootlv|)
-        (LETT |d| (SPADCALL |p| |v| (QREFELT $ 36)) |POLYCAT-;charthRootlv|)
-        (LETT |ans| (|spadConstant| $ 21) |POLYCAT-;charthRootlv|)
-        (SEQ G190
-         (COND ((NULL (< 0 |d|)) (GO G191)))
-         (SEQ
-          (LETT |dd|
-           (SPADCALL |d| |ch| (QREFELT $ 142))
-           |POLYCAT-;charthRootlv|)
-          (EXIT
-           (COND
-            ((QEQCAR |dd| 1)
-              (PROGN
-               (LETT #1# (CONS 1 "failed") |POLYCAT-;charthRootlv|)
-               (GO #1#)))
-            ((QUOTE T)
-             (SEQ
-              (LETT |cp|
-               (SPADCALL |p| |v| |d| (QREFELT $ 154))
-               |POLYCAT-;charthRootlv|)
-              (LETT |p|
-               (SPADCALL |p|
-                (SPADCALL |cp| |v| |d| (QREFELT $ 37))
-                (QREFELT $ 155))
-               |POLYCAT-;charthRootlv|)
-              (LETT |ansx|
-               (|POLYCAT-;charthRootlv| |cp| |vars| |ch| $)
-               |POLYCAT-;charthRootlv|)
-              (EXIT
-               (COND
-                ((QEQCAR |ansx| 1)
-                  (PROGN 
-                   (LETT #1# (CONS 1 "failed") |POLYCAT-;charthRootlv|)
-                   (GO #1#)))
-                ((QUOTE T) 
-                 (SEQ
-                  (LETT |d|
-                   (SPADCALL |p| |v| (QREFELT $ 36))
-                   |POLYCAT-;charthRootlv|)
-                  (EXIT
-                   (LETT |ans|
-                    (SPADCALL |ans|
-                     (SPADCALL (QCDR |ansx|) |v| 
-                      (PROG1 
-                       (LETT #0# (QCDR |dd|) |POLYCAT-;charthRootlv|)
-                       (|check-subtype| (>= #0# 0) 
-                        (QUOTE (|NonNegativeInteger|)) #0#))
-                      (QREFELT $ 37))
-                     (QREFELT $ 149))
-                    |POLYCAT-;charthRootlv|)))))))))))
-         NIL 
-         (GO G190) 
-         G191 
-         (EXIT NIL))
-        (LETT |ansx|
-         (|POLYCAT-;charthRootlv| |p| |vars| |ch| $)
-         |POLYCAT-;charthRootlv|)
-        (EXIT
-         (COND
-          ((QEQCAR |ansx| 1)
-           (PROGN
-            (LETT #1# (CONS 1 "failed") |POLYCAT-;charthRootlv|)
-            (GO #1#)))
-          ((QUOTE T)
-           (PROGN
-            (LETT #1#
-             (CONS 0 (SPADCALL |ans| (QCDR |ansx|) (QREFELT $ 149)))
-             |POLYCAT-;charthRootlv|)
-            (GO #1#)))))))))
-    #1# 
-    (EXIT #1#))))) 
-
-(DEFUN |POLYCAT-;monicDivide;2SVarSetR;30| (|p1| |p2| |mvar| $) 
- (PROG (|result|) 
-  (RETURN
-   (SEQ
-    (LETT |result|
-     (SPADCALL
-      (SPADCALL |p1| |mvar| (QREFELT $ 47))
-      (SPADCALL |p2| |mvar| (QREFELT $ 47))
-      (QREFELT $ 157))
-     |POLYCAT-;monicDivide;2SVarSetR;30|)
-    (EXIT
-     (CONS
-      (SPADCALL (QCAR |result|) |mvar| (QREFELT $ 132))
-      (SPADCALL (QCDR |result|) |mvar| (QREFELT $ 132)))))))) 
-
-(DEFUN |POLYCAT-;squareFree;SF;31| (|p| $)
- (SPADCALL |p| (QREFELT $ 160))) 
-
-(DEFUN |POLYCAT-;squareFree;SF;32| (|p| $)
- (SPADCALL |p| (QREFELT $ 163))) 
-
-(DEFUN |POLYCAT-;squareFree;SF;33| (|p| $)
- (SPADCALL |p| (QREFELT $ 163))) 
-
-(DEFUN |POLYCAT-;squareFreePart;2S;34| (|p| $)
- (PROG (|s| |f| #0=#:G1710 #1=#:G1708 #2=#:G1706 #3=#:G1707)
-  (RETURN
-   (SEQ
-    (SPADCALL
-     (SPADCALL 
-      (LETT |s| (SPADCALL |p| (QREFELT $ 164)) |POLYCAT-;squareFreePart;2S;34|)
-      (QREFELT $ 165))
-     (PROGN
-      (LETT #3# NIL |POLYCAT-;squareFreePart;2S;34|)
-      (SEQ
-       (LETT |f| NIL |POLYCAT-;squareFreePart;2S;34|)
-       (LETT #0# (SPADCALL |s| (QREFELT $ 168)) |POLYCAT-;squareFreePart;2S;34|)
-       G190
-       (COND
-        ((OR (ATOM #0#) 
-             (PROGN (LETT |f| (CAR #0#) |POLYCAT-;squareFreePart;2S;34|) NIL))
-         (GO G191)))
-       (SEQ 
-        (EXIT
-         (PROGN
-          (LETT #1# (QCAR |f|) |POLYCAT-;squareFreePart;2S;34|)
-          (COND
-           (#3#
-            (LETT #2#
-             (SPADCALL #2# #1# (QREFELT $ 148))
-             |POLYCAT-;squareFreePart;2S;34|))
-           ((QUOTE T)
-            (PROGN
-             (LETT #2# #1# |POLYCAT-;squareFreePart;2S;34|)
-             (LETT #3# (QUOTE T) |POLYCAT-;squareFreePart;2S;34|)))))))
-       (LETT #0# (CDR #0#) |POLYCAT-;squareFreePart;2S;34|)
-       (GO G190)
-       G191
-       (EXIT NIL))
-      (COND (#3# #2#) ((QUOTE T) (|spadConstant| $ 33))))
-     (QREFELT $ 148)))))) 
-
-(DEFUN |POLYCAT-;content;SVarSetS;35| (|p| |v| $)
- (SPADCALL (SPADCALL |p| |v| (QREFELT $ 47)) (QREFELT $ 170))) 
-
-(DEFUN |POLYCAT-;primitivePart;2S;36| (|p| $)
- (PROG (#0=#:G1713)
-  (RETURN
-   (COND
-    ((SPADCALL |p| (QREFELT $ 172)) |p|)
-    ((QUOTE T)
-     (QVELT
-      (SPADCALL
-       (PROG2
-        (LETT #0# 
-         (SPADCALL |p| (SPADCALL |p| (QREFELT $ 173)) (QREFELT $ 174))
-         |POLYCAT-;primitivePart;2S;36|)
-        (QCDR #0#)
-        (|check-union| (QEQCAR #0# 0) (QREFELT $ 6) #0#))
-       (QREFELT $ 176))
-      1)))))) 
-
-(DEFUN |POLYCAT-;primitivePart;SVarSetS;37| (|p| |v| $)
- (PROG (#0=#:G1720)
-  (RETURN 
-   (COND 
-    ((SPADCALL |p| (QREFELT $ 172)) |p|)
-    ((QUOTE T) 
-     (QVELT 
-      (SPADCALL
-       (PROG2
-        (LETT #0#
-         (SPADCALL |p| (SPADCALL |p| |v| (QREFELT $ 178)) (QREFELT $ 179))
-         |POLYCAT-;primitivePart;SVarSetS;37|)
-        (QCDR #0#)
-        (|check-union| (QEQCAR #0# 0) (QREFELT $ 6) #0#))
-       (QREFELT $ 176))
-      1)))))) 
-
-(DEFUN |POLYCAT-;<;2SB;38| (|p| |q| $)
- (PROG (|dp| |dq|)
-  (RETURN
-   (SEQ
-    (LETT |dp| (SPADCALL |p| (QREFELT $ 59)) |POLYCAT-;<;2SB;38|)
-    (LETT |dq| (SPADCALL |q| (QREFELT $ 59)) |POLYCAT-;<;2SB;38|)
-    (EXIT
-     (COND
-      ((SPADCALL |dp| |dq| (QREFELT $ 181))
-        (SPADCALL
-         (|spadConstant| $ 22)
-         (SPADCALL |q| (QREFELT $ 38))
-         (QREFELT $ 182)))
-      ((SPADCALL |dq| |dp| (QREFELT $ 181))
-        (SPADCALL
-         (SPADCALL |p| (QREFELT $ 38))
-         (|spadConstant| $ 22)
-         (QREFELT $ 182)))
-      ((QUOTE T)
-       (SPADCALL
-        (SPADCALL (SPADCALL |p| |q| (QREFELT $ 155)) (QREFELT $ 38))
-        (|spadConstant| $ 22)
-        (QREFELT $ 182))))))))) 
-
-(DEFUN |POLYCAT-;patternMatch;SP2Pmr;39| (|p| |pat| |l| $)
- (SPADCALL |p| |pat| |l| (QREFELT $ 187))) 
-
-(DEFUN |POLYCAT-;patternMatch;SP2Pmr;40| (|p| |pat| |l| $)
- (SPADCALL |p| |pat| |l| (QREFELT $ 193))) 
-
-(DEFUN |POLYCAT-;convert;SP;41| (|x| $)
- (SPADCALL (ELT $ 196) (ELT $ 197) |x| (QREFELT $ 201))) 
-
-(DEFUN |POLYCAT-;convert;SP;42| (|x| $) 
- (SPADCALL (ELT $ 203) (ELT $ 204) |x| (QREFELT $ 208))) 
-
-(DEFUN |POLYCAT-;convert;SIf;43| (|p| $)
- (SPADCALL (ELT $ 211) (ELT $ 212) |p| (QREFELT $ 216))) 
-
-(DEFUN |PolynomialCategory&| (|#1| |#2| |#3| |#4|)
- (PROG (DV$1 DV$2 DV$3 DV$4 |dv$| $ |pv$|)
-  (RETURN
-   (PROGN
-    (LETT DV$1 (|devaluate| |#1|) . #0=(|PolynomialCategory&|))
-    (LETT DV$2 (|devaluate| |#2|) . #0#)
-    (LETT DV$3 (|devaluate| |#3|) . #0#)
-    (LETT DV$4 (|devaluate| |#4|) . #0#)
-    (LETT |dv$| (LIST (QUOTE |PolynomialCategory&|) DV$1 DV$2 DV$3 DV$4) . #0#)
-    (LETT $ (GETREFV 226) . #0#)
-    (QSETREFV $ 0 |dv$|)
-    (QSETREFV $ 3
-     (LETT |pv$| 
-      (|buildPredVector| 0 0 
-       (LIST 
-        (|HasCategory| |#2| (QUOTE (|PolynomialFactorizationExplicit|)))
-        (|HasAttribute| |#2| (QUOTE |canonicalUnitNormal|))
-        (|HasCategory| |#2| (QUOTE (|GcdDomain|)))
-        (|HasCategory| |#2| (QUOTE (|CommutativeRing|)))
-        (|HasCategory| |#4| (QUOTE (|PatternMatchable| (|Float|))))
-        (|HasCategory| |#2| (QUOTE (|PatternMatchable| (|Float|))))
-        (|HasCategory| |#4| (QUOTE (|PatternMatchable| (|Integer|))))
-        (|HasCategory| |#2| (QUOTE (|PatternMatchable| (|Integer|))))
-        (|HasCategory| |#4| (QUOTE (|ConvertibleTo| (|Pattern| (|Float|)))))
-        (|HasCategory| |#2| (QUOTE (|ConvertibleTo| (|Pattern| (|Float|)))))
-        (|HasCategory| |#4| (QUOTE (|ConvertibleTo| (|Pattern| (|Integer|)))))
-        (|HasCategory| |#2| (QUOTE (|ConvertibleTo| (|Pattern| (|Integer|)))))
-        (|HasCategory| |#4| (QUOTE (|ConvertibleTo| (|InputForm|))))
-        (|HasCategory| |#2| (QUOTE (|ConvertibleTo| (|InputForm|))))
-        (|HasCategory| |#2| (QUOTE (|OrderedSet|)))))
-     . #0#))
-    (|stuffDomainSlots| $)
-    (QSETREFV $ 6 |#1|)
-    (QSETREFV $ 7 |#2|)
-    (QSETREFV $ 8 |#3|)
-    (QSETREFV $ 9 |#4|)
-    (COND 
-     ((|testBitVector| |pv$| 4)
-      (PROGN 
-       (QSETREFV $ 74 
-        (CONS (|dispatchFunction| |POLYCAT-;resultant;2SVarSetS;15|) $))
-       (QSETREFV $ 76 
-        (CONS (|dispatchFunction| |POLYCAT-;discriminant;SVarSetS;16|) $)))))
-    (COND 
-     ((|HasCategory| |#2| (QUOTE (|IntegralDomain|)))
-      (PROGN
-       (QSETREFV $ 95 
-        (CONS (|dispatchFunction| |POLYCAT-;reducedSystem;MM;20|) $))
-       (QSETREFV $ 102 
-        (CONS (|dispatchFunction| |POLYCAT-;reducedSystem;MVR;21|) $)))))
-    (COND 
-     ((|testBitVector| |pv$| 1)
-      (PROGN 
-       (QSETREFV $ 105
-        (CONS (|dispatchFunction| |POLYCAT-;gcdPolynomial;3Sup;22|) $))
-       (QSETREFV $ 112
-        (CONS 
-         (|dispatchFunction| 
-           |POLYCAT-;solveLinearPolynomialEquation;LSupU;23|) 
-         $))
-       (QSETREFV $ 116 
-        (CONS (|dispatchFunction| |POLYCAT-;factorPolynomial;SupF;24|) $))
-       (QSETREFV $ 118 
-        (CONS 
-         (|dispatchFunction| |POLYCAT-;factorSquareFreePolynomial;SupF;25|)
-         $))
-       (QSETREFV $ 136 (CONS (|dispatchFunction| |POLYCAT-;factor;SF;26|) $))
-       (COND
-        ((|HasCategory| |#2| (QUOTE (|CharacteristicNonZero|)))
-         (PROGN 
-          (QSETREFV $ 150 
-           (CONS (|dispatchFunction| |POLYCAT-;conditionP;MU;27|) $))))))))
-    (COND 
-     ((|HasCategory| |#2| (QUOTE (|CharacteristicNonZero|)))
-      (PROGN 
-       (QSETREFV $ 152 
-        (CONS (|dispatchFunction| |POLYCAT-;charthRoot;SU;28|) $)))))
-    (COND 
-     ((|testBitVector| |pv$| 3)
-      (PROGN 
-       (COND 
-        ((|HasCategory| |#2| (QUOTE (|EuclideanDomain|)))
-         (COND 
-          ((|HasCategory| |#2| (QUOTE (|CharacteristicZero|)))
-           (QSETREFV $ 161 
-            (CONS (|dispatchFunction| |POLYCAT-;squareFree;SF;31|) $)))
-          ((QUOTE T) 
-           (QSETREFV $ 161 
-            (CONS (|dispatchFunction| |POLYCAT-;squareFree;SF;32|) $)))))
-        ((QUOTE T) 
-         (QSETREFV $ 161 
-          (CONS (|dispatchFunction| |POLYCAT-;squareFree;SF;33|) $))))
-      (QSETREFV $ 169  
-       (CONS (|dispatchFunction| |POLYCAT-;squareFreePart;2S;34|) $))
-      (QSETREFV $ 171 
-       (CONS (|dispatchFunction| |POLYCAT-;content;SVarSetS;35|) $))
-      (QSETREFV $ 177 
-       (CONS (|dispatchFunction| |POLYCAT-;primitivePart;2S;36|) $))
-      (QSETREFV $ 180 
-       (CONS (|dispatchFunction| |POLYCAT-;primitivePart;SVarSetS;37|) $)))))
-    (COND 
-     ((|testBitVector| |pv$| 15)
-      (PROGN 
-       (QSETREFV $ 183 (CONS (|dispatchFunction| |POLYCAT-;<;2SB;38|) $))
-       (COND 
-        ((|testBitVector| |pv$| 8)
-         (COND 
-          ((|testBitVector| |pv$| 7)
-           (QSETREFV $ 189 
-            (CONS 
-             (|dispatchFunction| |POLYCAT-;patternMatch;SP2Pmr;39|)
-             $))))))
-       (COND
-        ((|testBitVector| |pv$| 6)
-         (COND 
-         ((|testBitVector| |pv$| 5)
-          (QSETREFV $ 195 
-           (CONS 
-            (|dispatchFunction| |POLYCAT-;patternMatch;SP2Pmr;40|)
-            $)))))))))
-    (COND 
-     ((|testBitVector| |pv$| 12)
-      (COND 
-       ((|testBitVector| |pv$| 11)
-        (QSETREFV $ 202 
-         (CONS (|dispatchFunction| |POLYCAT-;convert;SP;41|) $))))))
-    (COND 
-     ((|testBitVector| |pv$| 10)
-      (COND 
-       ((|testBitVector| |pv$| 9)
-        (QSETREFV $ 209 
-         (CONS (|dispatchFunction| |POLYCAT-;convert;SP;42|) $))))))
-    (COND
-     ((|testBitVector| |pv$| 14)
-      (COND 
-       ((|testBitVector| |pv$| 13)
-         (QSETREFV $ 217
-          (CONS (|dispatchFunction| |POLYCAT-;convert;SIf;43|) $))))))
-    $)))) 
-
-(MAKEPROP
- (QUOTE |PolynomialCategory&|)
- (QUOTE |infovec|)
- (LIST (QUOTE
-  #(NIL NIL NIL NIL NIL NIL (|local| |#1|) (|local| |#2|) (|local| |#3|)
-    (|local| |#4|) (|Equation| 6) (0 . |lhs|) (|Union| 9 (QUOTE "failed"))
-    (5 . |retractIfCan|) (10 . |retract|) (15 . |rhs|) (|List| 9) (|List| $)
-    (20 . |eval|) (|List| 221) |POLYCAT-;eval;SLS;1| (27 . |Zero|)
-    (31 . |Zero|) (|Boolean|) (35 . =) (41 . |leadingMonomial|)
-    (46 . |reductum|) |POLYCAT-;monomials;SL;2| (51 . |monomials|)
-    (|Union| 17 (QUOTE "failed")) |POLYCAT-;isPlus;SU;3| (56 . |variables|)
-    (61 . |monomial?|) (66 . |One|) (70 . |One|) (|NonNegativeInteger|)
-    (74 . |degree|) (80 . |monomial|) (87 . |leadingCoefficient|) (92 . =)
-    (98 . |coerce|) |POLYCAT-;isTimes;SU;4| (103 . |mainVariable|)
-    (|Record| (|:| |var| 9) (|:| |exponent| 35))
-    (|Union| 43 (QUOTE "failed")) |POLYCAT-;isExpt;SU;5|
-    (|SparseUnivariatePolynomial| $) (108 . |univariate|)
-    (|SparseUnivariatePolynomial| 6) (114 . |coefficient|)
-    |POLYCAT-;coefficient;SVarSetNniS;6| (|List| 35) (120 . |coefficient|)
-    |POLYCAT-;coefficient;SLLS;7| (127 . |monomial|)
-    |POLYCAT-;monomial;SLLS;8| (134 . |coerce|)
-    |POLYCAT-;retract;SVarSet;9| |POLYCAT-;retractIfCan;SU;10|
-    (139 . |degree|) (144 . |monomial|) |POLYCAT-;primitiveMonomials;SL;12| 
-    (150 . |ground?|) (155 . |Zero|) (159 . =) (165 . |degree|) 
-    (170 . |leadingCoefficient|) (175 . |totalDegree|) (180 . |reductum|)
-    |POLYCAT-;totalDegree;SNni;13| (185 . |member?|) (191 . |totalDegree|) 
-    |POLYCAT-;totalDegree;SLNni;14| (197 . |resultant|) (203 . |resultant|)
-    (210 . |discriminant|) (215 . |discriminant|) (221 . |primitiveMonomials|)
-    (|List| 6) (226 . |concat|) (231 . |removeDuplicates!|) (|Vector| 7)
-    (236 . |new|) (|Integer|) (242 . |minIndex|) (247 . |coefficient|)
-    (253 . |qsetelt!|) (|List| 220) (|Matrix| 7) (260 . |matrix|)
-    (|List| 78) (|Matrix| 6) (265 . |listOfLists|) (270 . |vertConcat|)
-    (|Matrix| $) (276 . |reducedSystem|) (|Vector| 6) (281 . |entries|)
-    (286 . |concat|) (292 . |concat|) 
-    (|Record| (|:| |mat| 88) (|:| |vec| 81)) (|Vector| $)
-    (298 . |reducedSystem|) (|GeneralPolynomialGcdPackage| 8 9 7 6)
-    (304 . |gcdPolynomial|) (310 . |gcdPolynomial|)
-    (|Union| 107 (QUOTE "failed")) (|List| 48)
-    (|PolynomialFactorizationByRecursion| 7 8 9 6) 
-    (316 . |solveLinearPolynomialEquationByRecursion|)
-    (|Union| 111 (QUOTE "failed")) (|List| 46)
-    (322 . |solveLinearPolynomialEquation|) (|Factored| 48)
-    (328 . |factorByRecursion|) (|Factored| 46) (333 . |factorPolynomial|)
-    (338 . |factorSquareFreeByRecursion|)
-    (343 . |factorSquareFreePolynomial|) (|Factored| $) (348 . |factor|)
-    (|Factored| 7) (353 . |unit|) 
-    (|Union| (QUOTE "nil") (QUOTE "sqfr") (QUOTE "irred") (QUOTE "prime"))
-    (|Record| (|:| |flg| 123) (|:| |fctr| 7) (|:| |xpnt| 83))
-    (|List| 124) (358 . |factorList|)
-    (|Record| (|:| |flg| 123) (|:| |fctr| 6) (|:| |xpnt| 83))
-    (|List| 127) (|Factored| 6) (363 . |makeFR|) (369 . |unit|)
-    (374 . |multivariate|) 
-    (|Record| (|:| |flg| 123) (|:| |fctr| 48) (|:| |xpnt| 83))
-    (|List| 133) (380 . |factorList|) (385 . |factor|) (390 . |transpose|)
-    (395 . |characteristic|) (399 . |setUnion|) (405 . |degree|)
-    (|Union| $ (QUOTE "failed")) (411 . |exquo|) (417 . |ground|)
-    (422 . |transpose|) (|Union| 101 (QUOTE "failed")) (427 . |conditionP|)
-    (432 . |elt|) (438 . *) (444 . +) (450 . |conditionP|)
-    (455 . |charthRoot|) (460 . |charthRoot|) (465 . |Zero|)
-    (469 . |coefficient|) (476 . -) 
-    (|Record| (|:| |quotient| $) (|:| |remainder| $))
-    (482 . |monicDivide|) |POLYCAT-;monicDivide;2SVarSetR;30|
-    (|MultivariateSquareFree| 8 9 7 6) (488 . |squareFree|)
-    (493 . |squareFree|) (|PolynomialSquareFree| 9 8 7 6)
-    (498 . |squareFree|) (503 . |squareFree|) (508 . |unit|)
-    (|Record| (|:| |factor| 6) (|:| |exponent| 83)) (|List| 166)
-    (513 . |factors|) (518 . |squareFreePart|) (523 . |content|)
-    (528 . |content|) (534 . |zero?|) (539 . |content|) (544 . |exquo|)
-    (|Record| (|:| |unit| $) (|:| |canonical| $) (|:| |associate| $))
-    (550 . |unitNormal|) (555 . |primitivePart|) (560 . |content|)
-    (566 . |exquo|) (572 . |primitivePart|) (578 . <) (584 . <) (590 . <)
-    (|PatternMatchResult| 83 6) (|Pattern| 83)
-    (|PatternMatchPolynomialCategory| 83 8 9 7 6) (596 . |patternMatch|)
-    (|PatternMatchResult| 83 $) (603 . |patternMatch|)
-    (|PatternMatchResult| (|Float|) 6) (|Pattern| (|Float|))
-    (|PatternMatchPolynomialCategory| (|Float|) 8 9 7 6) 
-    (610 . |patternMatch|) (|PatternMatchResult| (|Float|) $)
-    (617 . |patternMatch|) (624 . |convert|) (629 . |convert|)
-    (|Mapping| 185 9) (|Mapping| 185 7)
-    (|PolynomialCategoryLifting| 8 9 7 6 185) (634 . |map|)
-    (641 . |convert|) (646 . |convert|) (651 . |convert|) (|Mapping| 191 9)
-    (|Mapping| 191 7) (|PolynomialCategoryLifting| 8 9 7 6 191)
-    (656 . |map|) (663 . |convert|) (|InputForm|) (668 . |convert|)
-    (673 . |convert|) (|Mapping| 210 9) (|Mapping| 210 7)
-    (|PolynomialCategoryLifting| 8 9 7 6 210) (678 . |map|)
-    (685 . |convert|) (|Record| (|:| |mat| 219) (|:| |vec| (|Vector| 83)))
-    (|Matrix| 83) (|List| 7) (|Equation| $) (|Union| 83 (QUOTE "failed"))
-    (|Union| 224 (QUOTE "failed")) (|Fraction| 83)
-    (|Union| 7 (QUOTE "failed"))))
-  (QUOTE #(|totalDegree| 690 |squareFreePart| 701 |squareFree| 706 
-   |solveLinearPolynomialEquation| 711 |retractIfCan| 717 |retract| 722 
-   |resultant| 727 |reducedSystem| 734 |primitivePart| 745 
-   |primitiveMonomials| 756 |patternMatch| 761 |monomials| 775 
-   |monomial| 780 |monicDivide| 787 |isTimes| 794 |isPlus| 799 
-   |isExpt| 804 |gcdPolynomial| 809 |factorSquareFreePolynomial| 815 
-   |factorPolynomial| 820 |factor| 825 |eval| 830 |discriminant| 836 
-   |convert| 842 |content| 857 |conditionP| 863 |coefficient| 868 
-   |charthRoot| 882 < 887))
-  (QUOTE NIL)
-  (CONS (|makeByteWordVec2| 1 (QUOTE NIL))
-   (CONS (QUOTE #())
-    (CONS (QUOTE #())
-     (|makeByteWordVec2| 217 (QUOTE
-      (1 10 6 0 11 1 6 12 0 13 1 6 9 0 14 1 10 6 0 15 3 6 0 0 16 17 18 0 6 0
-       21 0 7 0 22 2 6 23 0 0 24 1 6 0 0 25 1 6 0 0 26 1 6 17 0 28 1 6 16 0
-       31 1 6 23 0 32 0 6 0 33 0 7 0 34 2 6 35 0 9 36 3 6 0 0 9 35 37 1 6 7
-       0 38 2 7 23 0 0 39 1 6 0 7 40 1 6 12 0 42 2 6 46 0 9 47 2 48 6 0 35
-       49 3 6 0 0 16 51 52 3 6 0 0 16 51 54 1 6 0 9 56 1 6 8 0 59 2 6 0 7 8
-       60 1 6 23 0 62 0 48 0 63 2 48 23 0 0 64 1 48 35 0 65 1 48 6 0 66 1 6
-       35 0 67 1 48 0 0 68 2 16 23 9 0 70 2 6 35 0 16 71 2 48 6 0 0 73 3 0
-       0 0 0 9 74 1 48 6 0 75 2 0 0 0 9 76 1 6 17 0 77 1 78 0 17 79 1 78 0
-       0 80 2 81 0 35 7 82 1 81 83 0 84 2 6 7 0 8 85 3 81 7 0 83 7 86 1 88
-       0 87 89 1 91 90 0 92 2 88 0 0 0 93 1 0 88 94 95 1 96 78 0 97 2 78 0
-       0 0 98 2 81 0 0 0 99 2 0 100 94 101 102 2 103 48 48 48 104 2 0 46 46
-       46 105 2 108 106 107 48 109 2 0 110 111 46 112 1 108 113 48 114 1 0
-       115 46 116 1 108 113 48 117 1 0 115 46 118 1 7 119 0 120 1 121 7 0
-       122 1 121 125 0 126 2 129 0 6 128 130 1 113 48 0 131 2 6 0 46 9 132
-       1 113 134 0 135 1 0 119 0 136 1 91 0 0 137 0 6 35 138 2 78 0 0 0 139
-       2 6 51 0 16 140 2 83 141 0 0 142 1 6 7 0 143 1 88 0 0 144 1 7 145 94
-       146 2 81 7 0 83 147 2 6 0 0 0 148 2 6 0 0 0 149 1 0 145 94 150 1 7
-       141 0 151 1 0 141 0 152 0 8 0 153 3 6 0 0 9 35 154 2 6 0 0 0 155 2
-       48 156 0 0 157 1 159 129 6 160 1 0 119 0 161 1 162 129 6 163 1 6 119
-       0 164 1 129 6 0 165 1 129 167 0 168 1 0 0 0 169 1 48 6 0 170 2 0 0 0
-       9 171 1 6 23 0 172 1 6 7 0 173 2 6 141 0 7 174 1 6 175 0 176 1 0 0 0
-       177 2 6 0 0 9 178 2 6 141 0 0 179 2 0 0 0 9 180 2 8 23 0 0 181 2 7 23
-       0 0 182 2 0 23 0 0 183 3 186 184 6 185 184 187 3 0 188 0 185 188 189
-       3 192 190 6 191 190 193 3 0 194 0 191 194 195 1 9 185 0 196 1 7 185
-       0 197 3 200 185 198 199 6 201 1 0 185 0 202 1 9 191 0 203 1 7 191 0
-       204 3 207 191 205 206 6 208 1 0 191 0 209 1 9 210 0 211 1 7 210 0
-       212 3 215 210 213 214 6 216 1 0 210 0 217 2 0 35 0 16 72 1 0 35 0 69
-       1 0 0 0 169 1 0 119 0 161 2 0 110 111 46 112 1 0 12 0 58 1 0 9 0 57
-       3 0 0 0 0 9 74 1 0 88 94 95 2 0 100 94 101 102 2 0 0 0 9 180 1 0 0 0
-       177 1 0 17 0 61 3 0 188 0 185 188 189 3 0 194 0 191 194 195 1 0 17 0
-       27 3 0 0 0 16 51 55 3 0 156 0 0 9 158 1 0 29 0 41 1 0 29 0 30 1 0 44
-       0 45 2 0 46 46 46 105 1 0 115 46 118 1 0 115 46 116 1 0 119 0 136 2
-       0 0 0 19 20 2 0 0 0 9 76 1 0 210 0 217 1 0 185 0 202 1 0 191 0 209 2
-       0 0 0 9 171 1 0 145 94 150 3 0 0 0 16 51 53 3 0 0 0 9 35 50 1 0 141
-       0 152 2 0 23 0 0 183))))))
-  (QUOTE |lookupComplete|))) 
-
-@
 \section{package POLYLIFT PolynomialCategoryLifting}
 <<dot>>=
 "POLYLIFT" -> "PACKAGE"
@@ -2144,1890 +62,6 @@ PolynomialCategoryLifting(E,Vars,R,P,S): Exports == Implementation where
       ans + map(fv, fc, leadingCoefficient up)
 
 @
-\section{category UPOLYC UnivariatePolynomialCategory}
-<<category UPOLYC UnivariatePolynomialCategory>>=
-)abbrev category UPOLYC UnivariatePolynomialCategory
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions: Ring, monomial, coefficient, reductum, differentiate,
-++ elt, map, resultant, discriminant
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The category of univariate polynomials over a ring R.
-++ No particular model is assumed - implementations can be either
-++ sparse or dense.
-
-UnivariatePolynomialCategory(R:Ring): Category ==
- Join(PolynomialCategory(R, NonNegativeInteger, SingletonAsOrderedSet),
-      Eltable(R, R), Eltable(%, %), DifferentialRing,
-      DifferentialExtension R) with
-    vectorise        : (%,NonNegativeInteger) -> Vector R
-      ++ vectorise(p, n) returns \spad{[a0,...,a(n-1)]} where
-      ++ \spad{p = a0 + a1*x + ... + a(n-1)*x**(n-1)} + higher order terms.
-      ++ The degree of polynomial p can be different from \spad{n-1}.
-    makeSUP: % -> SparseUnivariatePolynomial R
-      ++ makeSUP(p) converts the polynomial p to be of type
-      ++ SparseUnivariatePolynomial over the same coefficients.
-    unmakeSUP: SparseUnivariatePolynomial R -> %
-      ++ unmakeSUP(sup) converts sup of type \spadtype{SparseUnivariatePolynomial(R)}
-      ++ to be a member of the given type.
-      ++ Note: converse of makeSUP.
-    multiplyExponents: (%,NonNegativeInteger) -> %
-      ++ multiplyExponents(p,n) returns a new polynomial resulting from
-      ++ multiplying all exponents of the polynomial p by the non negative
-      ++ integer n.
-    divideExponents: (%,NonNegativeInteger) -> Union(%,"failed")
-      ++ divideExponents(p,n) returns a new polynomial resulting from
-      ++ dividing all exponents of the polynomial p by the non negative
-      ++ integer n, or "failed" if some exponent is not exactly divisible
-      ++ by n.
-    monicDivide: (%,%) -> Record(quotient:%,remainder:%)
-      ++ monicDivide(p,q) divide the polynomial p by the monic polynomial q,
-      ++ returning the pair \spad{[quotient, remainder]}.
-      ++ Error: if q isn't monic.
--- These three are for Karatsuba
-    karatsubaDivide: (%,NonNegativeInteger) -> Record(quotient:%,remainder:%)
-      ++ \spad{karatsubaDivide(p,n)} returns the same as \spad{monicDivide(p,monomial(1,n))}
-    shiftRight: (%,NonNegativeInteger) -> %
-      ++ \spad{shiftRight(p,n)} returns \spad{monicDivide(p,monomial(1,n)).quotient}
-    shiftLeft: (%,NonNegativeInteger) -> %
-      ++ \spad{shiftLeft(p,n)} returns \spad{p * monomial(1,n)}
-    pseudoRemainder: (%,%) -> %
-       ++ pseudoRemainder(p,q) = r, for polynomials p and q, returns the remainder when
-       ++ \spad{p' := p*lc(q)**(deg p - deg q + 1)}
-       ++ is pseudo right-divided by q, i.e. \spad{p' = s q + r}.
-    differentiate: (%, R -> R, %) -> %
-       ++ differentiate(p, d, x') extends the R-derivation d to an
-       ++ extension D in \spad{R[x]} where Dx is given by x', and returns \spad{Dp}.
-    if R has StepThrough then StepThrough
-    if R has CommutativeRing then
-      discriminant: % -> R
-        ++ discriminant(p) returns the discriminant of the polynomial p.
-      resultant: (%,%) -> R
-        ++ resultant(p,q) returns the resultant of the polynomials p and q.
-    if R has IntegralDomain then
-        Eltable(Fraction %, Fraction %)
-        elt  : (Fraction %, Fraction %) -> Fraction %
-             ++ elt(a,b) evaluates the fraction of univariate polynomials \spad{a}
-             ++ with the distinguished variable replaced by b.
-        order: (%, %) -> NonNegativeInteger
-             ++ order(p, q) returns the largest n such that \spad{q**n} divides polynomial p
-             ++ i.e. the order of \spad{p(x)} at \spad{q(x)=0}.
-        subResultantGcd: (%,%) -> %
-           ++ subResultantGcd(p,q) computes the gcd of the polynomials p and q
-           ++ using the SubResultant GCD algorithm.
-        composite: (%, %) -> Union(%, "failed")
-           ++ composite(p, q) returns h if \spad{p = h(q)}, and "failed" no such h exists.
-        composite: (Fraction %, %) -> Union(Fraction %, "failed")
-           ++ composite(f, q) returns h if f = h(q), and "failed" is no such h exists.
-        pseudoQuotient: (%,%) -> %
-           ++ pseudoQuotient(p,q) returns r, the quotient when
-           ++ \spad{p' := p*lc(q)**(deg p - deg q + 1)}
-           ++ is pseudo right-divided by q, i.e. \spad{p' = s q + r}.
-        pseudoDivide: (%, %) -> Record(coef:R, quotient: %, remainder:%)
-           ++ pseudoDivide(p,q) returns \spad{[c, q, r]}, when
-           ++ \spad{p' := p*lc(q)**(deg p - deg q + 1) = c * p}
-           ++ is pseudo right-divided by q, i.e. \spad{p' = s q + r}.
-    if R has GcdDomain then
-        separate: (%, %) -> Record(primePart:%, commonPart: %)
-           ++ separate(p, q) returns \spad{[a, b]} such that polynomial \spad{p = a b} and
-           ++ \spad{a} is relatively prime to q.
-    if R has Field then
-        EuclideanDomain
-        additiveValuation
-          ++ euclideanSize(a*b) = euclideanSize(a) + euclideanSize(b)
-        elt      : (Fraction %, R) -> R
-            ++ elt(a,r) evaluates the fraction of univariate polynomials \spad{a}
-            ++ with the distinguished variable replaced by the constant r.
-    if R has Algebra Fraction Integer then
-      integrate: % -> %
-        ++ integrate(p) integrates the univariate polynomial p with respect
-        ++ to its distinguished variable.
-  add
-    pp,qq: SparseUnivariatePolynomial %
-    variables(p) ==
-      zero? p or zero?(degree p) => []
-      [create()]
-    degree(p:%,v:SingletonAsOrderedSet) == degree p
-    totalDegree(p:%,lv:List SingletonAsOrderedSet) ==
-       empty? lv => 0
-       totalDegree p
-    degree(p:%,lv:List SingletonAsOrderedSet) ==
-       empty? lv => []
-       [degree p]
-    eval(p:%,lv: List SingletonAsOrderedSet,lq: List %):% ==
-      empty? lv => p
-      not empty? rest lv => error "can only eval a univariate polynomial once"
-      eval(p,first lv,first lq)$%
-    eval(p:%,v:SingletonAsOrderedSet,q:%):% == p(q)
-    eval(p:%,lv: List SingletonAsOrderedSet,lr: List R):% ==
-      empty? lv => p
-      not empty? rest lv => error "can only eval a univariate polynomial once"
-      eval(p,first lv,first lr)$%
-    eval(p:%,v:SingletonAsOrderedSet,r:R):% == p(r)::%
-    eval(p:%,le:List Equation %):% == 
-      empty? le  => p
-      not empty? rest le => error "can only eval a univariate polynomial once"
-      mainVariable(lhs first le) case "failed" => p
-      p(rhs first le)
-    mainVariable(p:%) ==
-      zero? degree p =>  "failed"
-      create()$SingletonAsOrderedSet
-    minimumDegree(p:%,v:SingletonAsOrderedSet) == minimumDegree p
-    minimumDegree(p:%,lv:List SingletonAsOrderedSet) ==
-       empty? lv => []
-       [minimumDegree p]
-    monomial(p:%,v:SingletonAsOrderedSet,n:NonNegativeInteger) ==
-       mapExponents(#1+n,p)
-    coerce(v:SingletonAsOrderedSet):% == monomial(1,1)
-    makeSUP p ==
-      zero? p => 0
-      monomial(leadingCoefficient p,degree p) + makeSUP reductum p
-    unmakeSUP sp ==
-      zero? sp => 0
-      monomial(leadingCoefficient sp,degree sp) + unmakeSUP reductum sp
-    karatsubaDivide(p:%,n:NonNegativeInteger) == monicDivide(p,monomial(1,n))
-    shiftRight(p:%,n:NonNegativeInteger) == monicDivide(p,monomial(1,n)).quotient
-    shiftLeft(p:%,n:NonNegativeInteger) == p * monomial(1,n)
-    if R has PolynomialFactorizationExplicit then
-       PFBRU ==>PolynomialFactorizationByRecursionUnivariate(R,%)
-       pp,qq:SparseUnivariatePolynomial %
-       lpp:List SparseUnivariatePolynomial %
-       SupR ==> SparseUnivariatePolynomial R
-       sp:SupR
-
-       solveLinearPolynomialEquation(lpp,pp) ==
-         solveLinearPolynomialEquationByRecursion(lpp,pp)$PFBRU
-       factorPolynomial(pp) ==
-         factorByRecursion(pp)$PFBRU
-       factorSquareFreePolynomial(pp) ==
-         factorSquareFreeByRecursion(pp)$PFBRU
-       import FactoredFunctions2(SupR,S)
-       factor p ==
-         zero? degree p  =>
-           ansR:=factor leadingCoefficient p
-           makeFR(unit(ansR)::%,
-                  [[w.flg,w.fctr::%,w.xpnt] for w in factorList ansR])
-         map(unmakeSUP,factorPolynomial(makeSUP p)$R)
-
-    vectorise(p, n) ==
-      m := minIndex(v := new(n, 0)$Vector(R))
-      for i in minIndex v .. maxIndex v repeat
-        qsetelt_!(v, i, coefficient(p, (i - m)::NonNegativeInteger))
-      v
-    retract(p:%):R ==
-      zero? p => 0
-      zero? degree p => leadingCoefficient p
-      error "Polynomial is not of degree 0"
-    retractIfCan(p:%):Union(R, "failed") ==
-      zero? p => 0
-      zero? degree p => leadingCoefficient p
-      "failed"
-
-    if R has StepThrough then
-       init() == init()$R::%
-       nextItemInner: % -> Union(%,"failed")
-       nextItemInner(n) ==
-         zero? n => nextItem(0$R)::R::% -- assumed not to fail
-         zero? degree n =>
-           nn:=nextItem leadingCoefficient n
-           nn case "failed" => "failed"
-           nn::R::%
-         n1:=reductum n
-         n2:=nextItemInner n1 -- try stepping the reductum
-         n2 case % => monomial(leadingCoefficient n,degree n) + n2
-         1+degree n1 < degree n => -- there was a hole between lt n and n1
-           monomial(leadingCoefficient n,degree n)+
-             monomial(nextItem(init()$R)::R,1+degree n1)
-         n3:=nextItem leadingCoefficient n
-         n3 case "failed" => "failed"
-         monomial(n3,degree n)
-       nextItem(n) ==
-         n1:=nextItemInner n
-         n1 case "failed" => monomial(nextItem(init()$R)::R,1+degree(n))
-         n1
-
-    if R has GcdDomain then
-
-      content(p:%,v:SingletonAsOrderedSet) == content(p)::%
-
-      primeFactor: (%, %) -> %
-
-      primeFactor(p, q) ==
-        (p1 := (p exquo gcd(p, q))::%) = p => p
-        primeFactor(p1, q)
-
-      separate(p, q) ==
-        a := primeFactor(p, q)
-        [a, (p exquo a)::%]
-
-    if R has CommutativeRing then
-      differentiate(x:%, deriv:R -> R, x':%) ==
-        d:% := 0
-        while (dg := degree x) > 0 repeat
-          lc := leadingCoefficient x
-          d := d + x' * monomial(dg * lc, (dg - 1)::NonNegativeInteger)
-                 + monomial(deriv lc, dg)
-          x := reductum x
-        d + deriv(leadingCoefficient x)::%
-    else
-      ncdiff: (NonNegativeInteger, %) -> %
-      -- computes d(x**n) given dx = x', non-commutative case
-      ncdiff(n, x') ==
-        zero? n => 0
-        zero?(n1 := (n - 1)::NonNegativeInteger) => x'
-        x' * monomial(1, n1) + monomial(1, 1) * ncdiff(n1, x')
-
-      differentiate(x:%, deriv:R -> R, x':%) ==
-        d:% := 0
-        while (dg := degree x) > 0 repeat
-          lc := leadingCoefficient x
-          d := d + monomial(deriv lc, dg) + lc * ncdiff(dg, x')
-          x := reductum x
-        d + deriv(leadingCoefficient x)::%
-    differentiate(x:%, deriv:R -> R) == differentiate(x, deriv, 1$%)$%
-    differentiate(x:%) ==
-        d:% := 0
-        while (dg := degree x) > 0 repeat
-          d := d + monomial(dg * leadingCoefficient x, (dg - 1)::NonNegativeInteger)
-          x := reductum x
-        d
-    differentiate(x:%,v:SingletonAsOrderedSet) == differentiate x
-    if R has IntegralDomain then
-      elt(g:Fraction %, f:Fraction %) == ((numer g) f) / ((denom g) f)
-
-      pseudoQuotient(p, q) ==
-        (n := degree(p)::Integer - degree q + 1) < 1 => 0
-        ((leadingCoefficient(q)**(n::NonNegativeInteger) * p
-          - pseudoRemainder(p, q)) exquo q)::%
-
-      pseudoDivide(p, q) ==
-        (n := degree(p)::Integer - degree q + 1) < 1 => [1, 0, p]
-        prem := pseudoRemainder(p, q)
-        lc   := leadingCoefficient(q)**(n::NonNegativeInteger)
-        [lc,((lc*p - prem) exquo q)::%, prem]
-
-      composite(f:Fraction %, q:%) ==
-        (n := composite(numer f, q)) case "failed" => "failed"
-        (d := composite(denom f, q)) case "failed" => "failed"
-        n::% / d::%
-
-      composite(p:%, q:%) ==
-        ground? p => p
-        cqr := pseudoDivide(p, q)
-        ground?(cqr.remainder) and
-          ((v := cqr.remainder exquo cqr.coef) case %) and
-            ((u := composite(cqr.quotient, q)) case %) and
-              ((w := (u::%) exquo cqr.coef) case %) =>
-                v::% + monomial(1, 1) * w::%
-        "failed"
-
-      elt(p:%, f:Fraction %) ==
-        zero? p => 0
-        ans:Fraction(%) := (leadingCoefficient p)::%::Fraction(%)
-        n := degree p
-        while not zero?(p:=reductum p) repeat
-          ans := ans * f ** (n - (n := degree p))::NonNegativeInteger +
-                    (leadingCoefficient p)::%::Fraction(%)
-        zero? n => ans
-        ans * f ** n
-
-      order(p, q) ==
-        zero? p => error "order: arguments must be nonzero"
-        degree(q) < 1 => error "order: place must be non-trivial"
-        ans:NonNegativeInteger := 0
-        repeat
-          (u  := p exquo q) case "failed" => return ans
-          p   := u::%
-          ans := ans + 1
-
-    if R has GcdDomain then
-      squareFree(p:%) ==
-        squareFree(p)$UnivariatePolynomialSquareFree(R, %)
-
-      squareFreePart(p:%) ==
-        squareFreePart(p)$UnivariatePolynomialSquareFree(R, %)
-
-    if R has PolynomialFactorizationExplicit then
-
-      gcdPolynomial(pp,qq) ==
-            zero? pp => unitCanonical qq  -- subResultantGcd can't handle 0
-            zero? qq => unitCanonical pp
-            unitCanonical(gcd(content (pp),content(qq))*
-                   primitivePart
-                      subResultantGcd(primitivePart pp,primitivePart qq))
-
-      squareFreePolynomial pp ==
-         squareFree(pp)$UnivariatePolynomialSquareFree(%,
-                                    SparseUnivariatePolynomial %)
-
-    if R has Field then
-      elt(f:Fraction %, r:R) == ((numer f) r) / ((denom f) r)
-
-      euclideanSize x ==
-            zero? x =>
-              error "euclideanSize called on 0 in Univariate Polynomial"
-            degree x
-      divide(x,y) ==
-            zero? y => error "division by 0 in Univariate Polynomials"
-            quot:=0
-            lc := inv leadingCoefficient y
-            while not zero?(x) and (degree x >= degree y) repeat
-               f:=lc*leadingCoefficient x
-               n:=(degree x - degree y)::NonNegativeInteger
-               quot:=quot+monomial(f,n)
-               x:=x-monomial(f,n)*y
-            [quot,x]
-    if R has Algebra Fraction Integer then
-      integrate p ==
-        ans:% := 0
-        while p ^= 0 repeat
-          l := leadingCoefficient p
-          d := 1 + degree p
-          ans := ans + inv(d::Fraction(Integer)) * monomial(l, d)
-          p := reductum p
-        ans
-
-@
-\section{UPOLYC.lsp BOOTSTRAP}
-{\bf UPOLYC} depends on itself. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf UPOLYC}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf UPOLYC.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.
-
-<<UPOLYC.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |UnivariatePolynomialCategory;CAT| (QUOTE NIL)) 
-
-(SETQ |UnivariatePolynomialCategory;AL| (QUOTE NIL)) 
-
-(DEFUN |UnivariatePolynomialCategory| (#1=#:G103214) 
-  (LET (#2=#:G103215) 
-    (COND 
-      ((SETQ #2# (|assoc| (|devaluate| #1#) |UnivariatePolynomialCategory;AL|))
-         (CDR #2#))
-      (T 
-        (SETQ |UnivariatePolynomialCategory;AL| 
-          (|cons5| 
-            (CONS 
-              (|devaluate| #1#)
-              (SETQ #2# (|UnivariatePolynomialCategory;| #1#)))
-            |UnivariatePolynomialCategory;AL|))
-         #2#)))) 
-
-(DEFUN |UnivariatePolynomialCategory;| (|t#1|) 
-  (PROG (#1=#:G103213) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|sublisV| 
-            (PAIR (QUOTE (|t#1|)) (LIST (|devaluate| |t#1|)))
-            (|sublisV| 
-              (PAIR 
-                (QUOTE (#2=#:G103211 #3=#:G103212))
-                (LIST 
-                  (QUOTE (|NonNegativeInteger|))
-                  (QUOTE (|SingletonAsOrderedSet|))))
-              (COND 
-                (|UnivariatePolynomialCategory;CAT|)
-                ((QUOTE T) 
-                  (LETT |UnivariatePolynomialCategory;CAT| 
-                    (|Join| 
-                      (|PolynomialCategory| 
-                        (QUOTE |t#1|) (QUOTE #2#) (QUOTE #3#))
-                      (|Eltable| (QUOTE |t#1|) (QUOTE |t#1|))
-                      (|Eltable| (QUOTE |$|) (QUOTE |$|))
-                      (|DifferentialRing|)
-                      (|DifferentialExtension| (QUOTE |t#1|))
-                      (|mkCategory| 
-                        (QUOTE |domain|)
-                        (QUOTE (
-                          ((|vectorise| 
-                            ((|Vector| |t#1|) |$| (|NonNegativeInteger|))) T)
-                          ((|makeSUP| 
-                            ((|SparseUnivariatePolynomial| |t#1|) |$|)) T)
-                          ((|unmakeSUP| 
-                            (|$| (|SparseUnivariatePolynomial| |t#1|))) T)
-                          ((|multiplyExponents| 
-                            (|$| |$| (|NonNegativeInteger|))) T)
-                          ((|divideExponents| 
-                            ((|Union| |$| "failed")
-                             |$| 
-                             (|NonNegativeInteger|))) T)
-                          ((|monicDivide| 
-                            ((|Record| 
-                               (|:| |quotient| |$|)
-                               (|:| |remainder| |$|))
-                             |$| 
-                             |$|)) T)
-                          ((|karatsubaDivide| 
-                            ((|Record| 
-                               (|:| |quotient| |$|)
-                               (|:| |remainder| |$|)) 
-                             |$| 
-                             (|NonNegativeInteger|))) T)
-                          ((|shiftRight| (|$| |$| (|NonNegativeInteger|))) T)
-                          ((|shiftLeft| (|$| |$| (|NonNegativeInteger|))) T)
-                          ((|pseudoRemainder| (|$| |$| |$|)) T)
-                          ((|differentiate| 
-                            (|$| |$| (|Mapping| |t#1| |t#1|) |$|)) T)
-                          ((|discriminant| (|t#1| |$|)) 
-                            (|has| |t#1| (|CommutativeRing|)))
-                          ((|resultant| (|t#1| |$| |$|)) 
-                            (|has| |t#1| (|CommutativeRing|)))
-                          ((|elt| 
-                             ((|Fraction| |$|) 
-                              (|Fraction| |$|)
-                              (|Fraction| |$|)))
-                            (|has| |t#1| (|IntegralDomain|)))
-                          ((|order| ((|NonNegativeInteger|) |$| |$|)) 
-                            (|has| |t#1| (|IntegralDomain|)))
-                          ((|subResultantGcd| (|$| |$| |$|)) 
-                            (|has| |t#1| (|IntegralDomain|)))
-                          ((|composite| ((|Union| |$| "failed") |$| |$|)) 
-                            (|has| |t#1| (|IntegralDomain|)))
-                          ((|composite| 
-                             ((|Union| (|Fraction| |$|) "failed")
-                              (|Fraction| |$|)
-                              |$|)) 
-                            (|has| |t#1| (|IntegralDomain|)))
-                          ((|pseudoQuotient| (|$| |$| |$|)) 
-                            (|has| |t#1| (|IntegralDomain|)))
-                          ((|pseudoDivide| 
-                             ((|Record| 
-                               (|:| |coef| |t#1|)
-                               (|:| |quotient| |$|)
-                               (|:| |remainder| |$|)) 
-                             |$| 
-                             |$|)) 
-                            (|has| |t#1| (|IntegralDomain|)))
-                          ((|separate| 
-                             ((|Record| 
-                               (|:| |primePart| |$|)
-                               (|:| |commonPart| |$|)) 
-                             |$| 
-                             |$|)) 
-                            (|has| |t#1| (|GcdDomain|)))
-                          ((|elt| (|t#1| (|Fraction| |$|) |t#1|)) 
-                            (|has| |t#1| (|Field|)))
-                          ((|integrate| (|$| |$|)) 
-                            (|has| |t#1| 
-                              (|Algebra| (|Fraction| (|Integer|)))))))
-                         (QUOTE (
-                           ((|StepThrough|) (|has| |t#1| (|StepThrough|)))
-                           ((|Eltable| 
-                              (|Fraction| |$|)
-                              (|Fraction| |$|)) 
-                             (|has| |t#1| (|IntegralDomain|)))
-                           ((|EuclideanDomain|) (|has| |t#1| (|Field|)))
-                           (|additiveValuation| (|has| |t#1| (|Field|)))))
-                         (QUOTE (
-                           (|Fraction| |$|)
-                           (|NonNegativeInteger|)
-                           (|SparseUnivariatePolynomial| |t#1|)
-                           (|Vector| |t#1|)))
-                         NIL))
-                    . #4=(|UnivariatePolynomialCategory|))))))
-            . #4#)
-         (SETELT #1# 0 
-           (LIST 
-             (QUOTE |UnivariatePolynomialCategory|)
-             (|devaluate| |t#1|))))))) 
-
-@
-\section{UPOLYC-.lsp BOOTSTRAP}
-{\bf UPOLYC-} depends on {\bf UPOLYC}. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf UPOLYC-}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf UPOLYC-.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.
-
-<<UPOLYC-.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(DEFUN |UPOLYC-;variables;SL;1| (|p| |$|) 
-  (COND 
-    ((OR 
-      (SPADCALL |p| (QREFELT |$| 9))
-      (ZEROP (SPADCALL |p| (QREFELT |$| 11)))) 
-     NIL)
-    ((QUOTE T) (LIST (SPADCALL (QREFELT |$| 13)))))) 
-
-(DEFUN |UPOLYC-;degree;SSaosNni;2| (|p| |v| |$|) 
-  (SPADCALL |p| (QREFELT |$| 11))) 
-
-(DEFUN |UPOLYC-;totalDegree;SLNni;3| (|p| |lv| |$|) 
-  (COND ((NULL |lv|) 0) ((QUOTE T) (SPADCALL |p| (QREFELT |$| 17))))) 
-
-(DEFUN |UPOLYC-;degree;SLL;4| (|p| |lv| |$|) 
-  (COND ((NULL |lv|) NIL) ((QUOTE T) (LIST (SPADCALL |p| (QREFELT |$| 11)))))) 
-
-(DEFUN |UPOLYC-;eval;SLLS;5| (|p| |lv| |lq| |$|) 
-  (COND 
-    ((NULL |lv|) |p|)
-    ((NULL (NULL (CDR |lv|))) 
-      (|error| "can only eval a univariate polynomial once"))
-    ((QUOTE T) 
-      (SPADCALL |p| (|SPADfirst| |lv|) (|SPADfirst| |lq|) (QREFELT |$| 21))))) 
-
-(DEFUN |UPOLYC-;eval;SSaos2S;6| (|p| |v| |q| |$|) 
-  (SPADCALL |p| |q| (QREFELT |$| 24))) 
-
-(DEFUN |UPOLYC-;eval;SLLS;7| (|p| |lv| |lr| |$|) 
-  (COND 
-    ((NULL |lv|) |p|)
-    ((NULL (NULL (CDR |lv|))) 
-      (|error| "can only eval a univariate polynomial once"))
-    ((QUOTE T) 
-      (SPADCALL |p| (|SPADfirst| |lv|) (|SPADfirst| |lr|) (QREFELT |$| 26))))) 
-
-(DEFUN |UPOLYC-;eval;SSaosRS;8| (|p| |v| |r| |$|) 
-  (SPADCALL (SPADCALL |p| |r| (QREFELT |$| 29)) (QREFELT |$| 30))) 
-
-(DEFUN |UPOLYC-;eval;SLS;9| (|p| |le| |$|) 
-  (COND 
-    ((NULL |le|) |p|)
-    ((NULL (NULL (CDR |le|))) 
-      (|error| "can only eval a univariate polynomial once"))
-    ((QUOTE T) 
-      (COND 
-        ((QEQCAR 
-           (SPADCALL 
-             (SPADCALL (|SPADfirst| |le|) (QREFELT |$| 33))
-             (QREFELT |$| 35))
-            1)
-          |p|)
-        ((QUOTE T) 
-          (SPADCALL |p| 
-            (SPADCALL (|SPADfirst| |le|) (QREFELT |$| 36))
-            (QREFELT |$| 24))))))) 
-
-(DEFUN |UPOLYC-;mainVariable;SU;10| (|p| |$|) 
-  (COND 
-    ((ZEROP (SPADCALL |p| (QREFELT |$| 11))) (CONS 1 "failed"))
-    ((QUOTE T) (CONS 0 (SPADCALL (QREFELT |$| 13)))))) 
-
-(DEFUN |UPOLYC-;minimumDegree;SSaosNni;11| (|p| |v| |$|) 
-  (SPADCALL |p| (QREFELT |$| 40))) 
-
-(DEFUN |UPOLYC-;minimumDegree;SLL;12| (|p| |lv| |$|) 
-  (COND ((NULL |lv|) NIL) ((QUOTE T) (LIST (SPADCALL |p| (QREFELT |$| 40)))))) 
-
-(DEFUN |UPOLYC-;monomial;SSaosNniS;13| (|p| |v| |n| |$|) 
-  (SPADCALL 
-    (CONS (FUNCTION |UPOLYC-;monomial;SSaosNniS;13!0|) (VECTOR |$| |n|))
-    |p|
-    (QREFELT |$| 45))) 
-
-(DEFUN |UPOLYC-;monomial;SSaosNniS;13!0| (|#1| |$$|) 
-  (SPADCALL |#1| (QREFELT |$$| 1) (QREFELT (QREFELT |$$| 0) 43))) 
-
-(DEFUN |UPOLYC-;coerce;SaosS;14| (|v| |$|) 
-  (SPADCALL (|spadConstant| |$| 48) 1 (QREFELT |$| 49))) 
-
-(DEFUN |UPOLYC-;makeSUP;SSup;15| (|p| |$|) 
-  (COND 
-    ((SPADCALL |p| (QREFELT |$| 9)) (|spadConstant| |$| 52))
-    ((QUOTE T) 
-      (SPADCALL 
-        (SPADCALL 
-          (SPADCALL |p| (QREFELT |$| 53))
-          (SPADCALL |p| (QREFELT |$| 11))
-          (QREFELT |$| 54))
-        (SPADCALL 
-          (SPADCALL |p| (QREFELT |$| 55))
-          (QREFELT |$| 56))
-        (QREFELT |$| 57))))) 
-
-(DEFUN |UPOLYC-;unmakeSUP;SupS;16| (|sp| |$|) 
-  (COND 
-    ((SPADCALL |sp| (QREFELT |$| 59)) (|spadConstant| |$| 60))
-    ((QUOTE T) 
-      (SPADCALL 
-        (SPADCALL 
-          (SPADCALL |sp| (QREFELT |$| 61))
-          (SPADCALL |sp| (QREFELT |$| 62))
-          (QREFELT |$| 49)) 
-        (SPADCALL (SPADCALL |sp| (QREFELT |$| 63)) (QREFELT |$| 64))
-      (QREFELT |$| 65))))) 
-
-(DEFUN |UPOLYC-;karatsubaDivide;SNniR;17| (|p| |n| |$|) 
-  (SPADCALL |p| 
-    (SPADCALL (|spadConstant| |$| 48) |n| (QREFELT |$| 49))
-    (QREFELT |$| 68))) 
-
-(DEFUN |UPOLYC-;shiftRight;SNniS;18| (|p| |n| |$|) 
-  (QCAR 
-    (SPADCALL |p| 
-      (SPADCALL (|spadConstant| |$| 48) |n| (QREFELT |$| 49))
-      (QREFELT |$| 68)))) 
-
-(DEFUN |UPOLYC-;shiftLeft;SNniS;19| (|p| |n| |$|) 
-  (SPADCALL |p| 
-    (SPADCALL (|spadConstant| |$| 48) |n| (QREFELT |$| 49)) (QREFELT |$| 71))) 
-
-(DEFUN |UPOLYC-;solveLinearPolynomialEquation;LSupU;20| (|lpp| |pp| |$|) 
-  (SPADCALL |lpp| |pp| (QREFELT |$| 77))) 
-
-(DEFUN |UPOLYC-;factorPolynomial;SupF;21| (|pp| |$|) 
-  (SPADCALL |pp| (QREFELT |$| 83))) 
-
-(DEFUN |UPOLYC-;factorSquareFreePolynomial;SupF;22| (|pp| |$|) 
-  (SPADCALL |pp| (QREFELT |$| 86))) 
-
-(DEFUN |UPOLYC-;factor;SF;23| (|p| |$|) 
-  (PROG (|ansR| #1=#:G103310 |w| #2=#:G103311) 
-    (RETURN 
-      (SEQ 
-        (COND 
-          ((ZEROP (SPADCALL |p| (QREFELT |$| 11)))
-            (SEQ 
-              (LETT |ansR| 
-                (SPADCALL 
-                  (SPADCALL |p| (QREFELT |$| 53))
-                  (QREFELT |$| 89)) 
-                |UPOLYC-;factor;SF;23|)
-              (EXIT 
-                (SPADCALL 
-                  (SPADCALL 
-                    (SPADCALL |ansR| (QREFELT |$| 91))
-                    (QREFELT |$| 30)) 
-                  (PROGN 
-                    (LETT #1# NIL |UPOLYC-;factor;SF;23|)
-                    (SEQ 
-                      (LETT |w| NIL |UPOLYC-;factor;SF;23|)
-                      (LETT #2# 
-                        (SPADCALL |ansR| (QREFELT |$| 95))
-                        |UPOLYC-;factor;SF;23|)
-                      G190
-                      (COND 
-                        ((OR 
-                          (ATOM #2#)
-                          (PROGN 
-                            (LETT |w| (CAR #2#) |UPOLYC-;factor;SF;23|)
-                            NIL))
-                         (GO G191)))
-                      (SEQ 
-                        (EXIT 
-                          (LETT #1# 
-                            (CONS 
-                              (VECTOR 
-                                (QVELT |w| 0)
-                                (SPADCALL (QVELT |w| 1) (QREFELT |$| 30))
-                                (QVELT |w| 2)) 
-                               #1#)
-                             |UPOLYC-;factor;SF;23|)))
-                      (LETT #2# (CDR #2#) |UPOLYC-;factor;SF;23|)
-                      (GO G190)
-                      G191
-                      (EXIT (NREVERSE0 #1#))))
-                  (QREFELT |$| 99)))))
-          ((QUOTE T) 
-            (SPADCALL 
-              (ELT |$| 64)
-              (SPADCALL (SPADCALL |p| (QREFELT |$| 56)) (QREFELT |$| 100))
-              (QREFELT |$| 104)))))))) 
-
-(DEFUN |UPOLYC-;vectorise;SNniV;24| (|p| |n| |$|) 
-  (PROG (|v| |m| |i| #1=#:G103316 #2=#:G103312) 
-    (RETURN 
-      (SEQ 
-        (LETT |m| 
-          (SPADCALL 
-            (LETT |v| 
-              (SPADCALL |n| (|spadConstant| |$| 106) (QREFELT |$| 108))
-              |UPOLYC-;vectorise;SNniV;24|)
-            (QREFELT |$| 110))
-          |UPOLYC-;vectorise;SNniV;24|)
-        (SEQ 
-          (LETT |i| 
-            (SPADCALL |v| (QREFELT |$| 110))
-            |UPOLYC-;vectorise;SNniV;24|)
-          (LETT #1# (QVSIZE |v|) |UPOLYC-;vectorise;SNniV;24|)
-          G190
-          (COND ((|>| |i| #1#) (GO G191)))
-          (SEQ 
-            (EXIT 
-              (SPADCALL |v| |i| 
-                (SPADCALL |p| 
-                  (PROG1 
-                    (LETT #2# (|-| |i| |m|) |UPOLYC-;vectorise;SNniV;24|)
-                    (|check-subtype| 
-                      (|>=| #2# 0)
-                      (QUOTE (|NonNegativeInteger|))
-                      #2#)) 
-                  (QREFELT |$| 111))
-                (QREFELT |$| 112))))
-          (LETT |i| (|+| |i| 1) |UPOLYC-;vectorise;SNniV;24|)
-          (GO G190)
-          G191
-          (EXIT NIL))
-        (EXIT |v|))))) 
-
-(DEFUN |UPOLYC-;retract;SR;25| (|p| |$|) 
-  (COND 
-    ((SPADCALL |p| (QREFELT |$| 9)) (|spadConstant| |$| 106))
-    ((ZEROP (SPADCALL |p| (QREFELT |$| 11))) (SPADCALL |p| (QREFELT |$| 53)))
-    ((QUOTE T) (|error| "Polynomial is not of degree 0")))) 
-
-(DEFUN |UPOLYC-;retractIfCan;SU;26| (|p| |$|) 
-  (COND 
-    ((SPADCALL |p| (QREFELT |$| 9)) (CONS 0 (|spadConstant| |$| 106)))
-    ((ZEROP (SPADCALL |p| (QREFELT |$| 11)))
-       (CONS 0 (SPADCALL |p| (QREFELT |$| 53))))
-    ((QUOTE T) (CONS 1 "failed")))) 
-
-(DEFUN |UPOLYC-;init;S;27| (|$|) 
-  (SPADCALL (|spadConstant| |$| 117) (QREFELT |$| 30))) 
-
-(DEFUN |UPOLYC-;nextItemInner| (|n| |$|) 
-  (PROG (|nn| |n1| |n2| #1=#:G103337 |n3|) 
-    (RETURN 
-      (SEQ 
-        (COND 
-          ((SPADCALL |n| (QREFELT |$| 9))
-            (CONS 
-              0 
-              (SPADCALL 
-                (PROG2 
-                  (LETT #1# 
-                    (SPADCALL (|spadConstant| |$| 106) (QREFELT |$| 120))
-                    |UPOLYC-;nextItemInner|) 
-                  (QCDR #1#)
-                  (|check-union| (QEQCAR #1# 0) (QREFELT |$| 7) #1#))
-                (QREFELT |$| 30))))
-          ((ZEROP (SPADCALL |n| (QREFELT |$| 11)))
-            (SEQ 
-              (LETT |nn| 
-                (SPADCALL (SPADCALL |n| (QREFELT |$| 53)) (QREFELT |$| 120))
-                |UPOLYC-;nextItemInner|)
-              (EXIT 
-                (COND 
-                  ((QEQCAR |nn| 1) (CONS 1 "failed"))
-                  ((QUOTE T) 
-                    (CONS 0 (SPADCALL (QCDR |nn|) (QREFELT |$| 30))))))))
-          ((QUOTE T) 
-            (SEQ 
-              (LETT |n1| 
-                (SPADCALL |n| (QREFELT |$| 55))
-                |UPOLYC-;nextItemInner|)
-              (LETT |n2| 
-                (|UPOLYC-;nextItemInner| |n1| |$|)
-                |UPOLYC-;nextItemInner|)
-              (EXIT 
-                (COND 
-                  ((QEQCAR |n2| 0)
-                    (CONS 
-                      0 
-                      (SPADCALL 
-                        (SPADCALL 
-                          (SPADCALL |n| (QREFELT |$| 53))
-                          (SPADCALL |n| (QREFELT |$| 11))
-                          (QREFELT |$| 49)) 
-                        (QCDR |n2|) 
-                        (QREFELT |$| 65))))
-                  ((|<| 
-                     (|+| 1 (SPADCALL |n1| (QREFELT |$| 11)))
-                     (SPADCALL |n| (QREFELT |$| 11)))
-                    (CONS 
-                      0 
-                      (SPADCALL 
-                        (SPADCALL 
-                          (SPADCALL |n| (QREFELT |$| 53))
-                          (SPADCALL |n| (QREFELT |$| 11))
-                          (QREFELT |$| 49))
-                        (SPADCALL 
-                          (PROG2 
-                            (LETT #1# 
-                              (SPADCALL 
-                                (|spadConstant| |$| 117)
-                                (QREFELT |$| 120))
-                              |UPOLYC-;nextItemInner|)
-                            (QCDR #1#)
-                            (|check-union| (QEQCAR #1# 0) (QREFELT |$| 7) #1#))
-                          (|+| 1 (SPADCALL |n1| (QREFELT |$| 11)))
-                          (QREFELT |$| 49))
-                        (QREFELT |$| 65))))
-                  ((QUOTE T) 
-                    (SEQ 
-                      (LETT |n3| 
-                        (SPADCALL 
-                          (SPADCALL |n| (QREFELT |$| 53))
-                          (QREFELT |$| 120))
-                        |UPOLYC-;nextItemInner|)
-                      (EXIT 
-                        (COND 
-                          ((QEQCAR |n3| 1) (CONS 1 "failed"))
-                          ((QUOTE T) 
-                            (CONS 
-                              0 
-                              (SPADCALL 
-                                (QCDR |n3|)
-                                (SPADCALL |n| (QREFELT |$| 11))
-                                (QREFELT |$| 49))))))))))))))))) 
-
-(DEFUN |UPOLYC-;nextItem;SU;29| (|n| |$|) 
-  (PROG (|n1| #1=#:G103350) 
-    (RETURN 
-      (SEQ 
-        (LETT |n1| (|UPOLYC-;nextItemInner| |n| |$|) |UPOLYC-;nextItem;SU;29|)
-        (EXIT 
-          (COND 
-            ((QEQCAR |n1| 1)
-              (CONS 
-                0 
-                (SPADCALL 
-                  (PROG2 
-                    (LETT #1# 
-                      (SPADCALL (|spadConstant| |$| 117) (QREFELT |$| 120))
-                      |UPOLYC-;nextItem;SU;29|)
-                    (QCDR #1#)
-                    (|check-union| (QEQCAR #1# 0) (QREFELT |$| 7) #1#))
-                 (|+| 1 (SPADCALL |n| (QREFELT |$| 11)))
-               (QREFELT |$| 49))))
-            ((QUOTE T) |n1|))))))) 
-
-(DEFUN |UPOLYC-;content;SSaosS;30| (|p| |v| |$|) 
-  (SPADCALL (SPADCALL |p| (QREFELT |$| 123)) (QREFELT |$| 30))) 
-
-(DEFUN |UPOLYC-;primeFactor| (|p| |q| |$|) 
-  (PROG (#1=#:G103356 |p1|) 
-    (RETURN 
-      (SEQ 
-        (LETT |p1| 
-           (PROG2 
-             (LETT #1# 
-               (SPADCALL |p| 
-                 (SPADCALL |p| |q| (QREFELT |$| 125))
-                 (QREFELT |$| 126))
-               |UPOLYC-;primeFactor|)
-             (QCDR #1#)
-             (|check-union| (QEQCAR #1# 0) (QREFELT |$| 6) #1#))
-           |UPOLYC-;primeFactor|)
-        (EXIT 
-          (COND 
-            ((SPADCALL |p1| |p| (QREFELT |$| 127)) |p|)
-            ((QUOTE T) (|UPOLYC-;primeFactor| |p1| |q| |$|)))))))) 
-
-(DEFUN |UPOLYC-;separate;2SR;32| (|p| |q| |$|) 
-  (PROG (|a| #1=#:G103362) 
-    (RETURN 
-      (SEQ 
-        (LETT |a| 
-          (|UPOLYC-;primeFactor| |p| |q| |$|)
-          |UPOLYC-;separate;2SR;32|)
-        (EXIT 
-          (CONS 
-            |a| 
-            (PROG2 
-              (LETT #1# 
-                (SPADCALL |p| |a| (QREFELT |$| 126))
-                |UPOLYC-;separate;2SR;32|)
-              (QCDR #1#)
-              (|check-union| (QEQCAR #1# 0) (QREFELT |$| 6) #1#)))))))) 
-
-(DEFUN |UPOLYC-;differentiate;SM2S;33| (|x| |deriv| |x'| |$|) 
-  (PROG (|dg| |lc| #1=#:G103367 |d|) 
-    (RETURN 
-      (SEQ 
-        (LETT |d| (|spadConstant| |$| 60) |UPOLYC-;differentiate;SM2S;33|)
-        (SEQ G190 
-          (COND 
-            ((NULL 
-               (|<| 0 
-                 (LETT |dg| 
-                   (SPADCALL |x| (QREFELT |$| 11))
-                   |UPOLYC-;differentiate;SM2S;33|)))
-              (GO G191)))
-          (SEQ 
-            (LETT |lc| 
-              (SPADCALL |x| (QREFELT |$| 53))
-              |UPOLYC-;differentiate;SM2S;33|)
-            (LETT |d| 
-              (SPADCALL 
-                (SPADCALL |d| 
-                  (SPADCALL |x'| 
-                    (SPADCALL 
-                      (SPADCALL |dg| |lc| (QREFELT |$| 131))
-                      (PROG1 
-                        (LETT #1# (|-| |dg| 1) |UPOLYC-;differentiate;SM2S;33|)
-                        (|check-subtype| 
-                          (|>=| #1# 0) 
-                          (QUOTE (|NonNegativeInteger|)) 
-                          #1#))
-                      (QREFELT |$| 49)) 
-                    (QREFELT |$| 71)) 
-                  (QREFELT |$| 65)) 
-                  (SPADCALL 
-                    (SPADCALL |lc| |deriv|)
-                    |dg|
-                    (QREFELT |$| 49)) 
-                (QREFELT |$| 65))
-              |UPOLYC-;differentiate;SM2S;33|)
-            (EXIT 
-              (LETT |x| 
-                (SPADCALL |x| (QREFELT |$| 55))
-                |UPOLYC-;differentiate;SM2S;33|)))
-           NIL
-           (GO G190)
-           G191
-           (EXIT NIL))
-        (EXIT 
-          (SPADCALL |d| 
-            (SPADCALL 
-              (SPADCALL 
-                (SPADCALL |x| (QREFELT |$| 53))
-                |deriv|)
-              (QREFELT |$| 30)) 
-            (QREFELT |$| 65))))))) 
-
-(DEFUN |UPOLYC-;ncdiff| (|n| |x'| |$|) 
-  (PROG (#1=#:G103385 |n1|) 
-    (RETURN 
-      (COND 
-        ((ZEROP |n|) (|spadConstant| |$| 60))
-        ((ZEROP 
-          (LETT |n1| 
-            (PROG1 
-              (LETT #1# (|-| |n| 1) |UPOLYC-;ncdiff|)
-              (|check-subtype| 
-                (|>=| #1# 0)
-                (QUOTE (|NonNegativeInteger|))
-                #1#))
-            |UPOLYC-;ncdiff|))
-          |x'|)
-        ((QUOTE T) 
-          (SPADCALL 
-            (SPADCALL |x'| 
-              (SPADCALL (|spadConstant| |$| 48) |n1| (QREFELT |$| 49))
-              (QREFELT |$| 71)) 
-            (SPADCALL 
-              (SPADCALL (|spadConstant| |$| 48) 1 (QREFELT |$| 49))
-              (|UPOLYC-;ncdiff| |n1| |x'| |$|)
-              (QREFELT |$| 71)) 
-            (QREFELT |$| 65))))))) 
-
-(DEFUN |UPOLYC-;differentiate;SM2S;35| (|x| |deriv| |x'| |$|) 
-  (PROG (|dg| |lc| |d|) 
-    (RETURN 
-      (SEQ 
-        (LETT |d| (|spadConstant| |$| 60) |UPOLYC-;differentiate;SM2S;35|)
-        (SEQ G190 
-          (COND 
-            ((NULL 
-               (|<| 0 
-                 (LETT |dg| 
-                   (SPADCALL |x| (QREFELT |$| 11))
-                   |UPOLYC-;differentiate;SM2S;35|)))
-              (GO G191)))
-          (SEQ 
-            (LETT |lc| 
-              (SPADCALL |x| (QREFELT |$| 53))
-              |UPOLYC-;differentiate;SM2S;35|)
-            (LETT |d| 
-              (SPADCALL 
-                (SPADCALL |d| 
-                  (SPADCALL 
-                    (SPADCALL |lc| |deriv|)
-                    |dg|
-                    (QREFELT |$| 49)) 
-                  (QREFELT |$| 65)) 
-                (SPADCALL |lc| 
-                  (|UPOLYC-;ncdiff| |dg| |x'| |$|)
-                  (QREFELT |$| 134)) 
-              (QREFELT |$| 65)) 
-              |UPOLYC-;differentiate;SM2S;35|)
-            (EXIT 
-              (LETT |x| 
-                (SPADCALL |x| (QREFELT |$| 55))
-                |UPOLYC-;differentiate;SM2S;35|)))
-           NIL 
-           (GO G190) 
-           G191 
-           (EXIT NIL))
-        (EXIT 
-          (SPADCALL |d| 
-            (SPADCALL 
-              (SPADCALL (SPADCALL |x| (QREFELT |$| 53)) |deriv|)
-              (QREFELT |$| 30)) 
-            (QREFELT |$| 65))))))) 
-
-(DEFUN |UPOLYC-;differentiate;SMS;36| (|x| |deriv| |$|) 
-  (SPADCALL |x| |deriv| (|spadConstant| |$| 47) (QREFELT |$| 135))) 
-
-(DEFUN |UPOLYC-;differentiate;2S;37| (|x| |$|) 
-  (PROG (|dg| #1=#:G103394 |d|) 
-    (RETURN 
-      (SEQ 
-        (LETT |d| (|spadConstant| |$| 60) |UPOLYC-;differentiate;2S;37|)
-        (SEQ G190 
-          (COND 
-            ((NULL 
-              (|<| 0 
-                (LETT |dg| 
-                  (SPADCALL |x| (QREFELT |$| 11))
-                  |UPOLYC-;differentiate;2S;37|))) 
-            (GO G191)))
-          (SEQ 
-            (LETT |d| 
-              (SPADCALL |d| 
-                (SPADCALL 
-                  (SPADCALL |dg| 
-                    (SPADCALL |x| (QREFELT |$| 53)) (QREFELT |$| 131))
-                  (PROG1 
-                    (LETT #1# (|-| |dg| 1) |UPOLYC-;differentiate;2S;37|)
-                    (|check-subtype| 
-                      (|>=| #1# 0) 
-                      (QUOTE (|NonNegativeInteger|))
-                      #1#))
-                  (QREFELT |$| 49))
-                (QREFELT |$| 65))
-              |UPOLYC-;differentiate;2S;37|)
-            (EXIT 
-              (LETT |x| 
-                (SPADCALL |x| (QREFELT |$| 55))
-                |UPOLYC-;differentiate;2S;37|)))
-           NIL
-           (GO G190)
-           G191
-           (EXIT NIL))
-        (EXIT |d|))))) 
-
-(DEFUN |UPOLYC-;differentiate;SSaosS;38| (|x| |v| |$|) 
-  (SPADCALL |x| (QREFELT |$| 138))) 
-
-(DEFUN |UPOLYC-;elt;3F;39| (|g| |f| |$|) 
-  (SPADCALL 
-    (SPADCALL 
-      (SPADCALL |g| (QREFELT |$| 141))
-      |f|
-      (QREFELT |$| 143)) 
-    (SPADCALL (SPADCALL |g| (QREFELT |$| 144)) |f| (QREFELT |$| 143))
-    (QREFELT |$| 145))) 
-
-(DEFUN |UPOLYC-;pseudoQuotient;3S;40| (|p| |q| |$|) 
-  (PROG (|n| #1=#:G103440 #2=#:G103442) 
-    (RETURN 
-      (SEQ 
-        (LETT |n| 
-          (|+| 
-            (|-| 
-              (SPADCALL |p| (QREFELT |$| 11))
-              (SPADCALL |q| (QREFELT |$| 11))) 1)
-           |UPOLYC-;pseudoQuotient;3S;40|)
-        (EXIT 
-          (COND 
-            ((|<| |n| 1) (|spadConstant| |$| 60))
-            ((QUOTE T) 
-              (PROG2 
-                (LETT #2# 
-                  (SPADCALL 
-                    (SPADCALL 
-                      (SPADCALL 
-                        (SPADCALL 
-                          (SPADCALL |q| (QREFELT |$| 53))
-                          (PROG1 
-                            (LETT #1# |n| |UPOLYC-;pseudoQuotient;3S;40|)
-                            (|check-subtype| 
-                              (|>=| #1# 0) 
-                              (QUOTE (|NonNegativeInteger|))
-                              #1#))
-                          (QREFELT |$| 147)) 
-                        |p| 
-                        (QREFELT |$| 134)) 
-                      (SPADCALL |p| |q| (QREFELT |$| 148))
-                      (QREFELT |$| 149)) 
-                    |q| 
-                    (QREFELT |$| 126))
-                  |UPOLYC-;pseudoQuotient;3S;40|)
-                (QCDR #2#)
-                (|check-union| (QEQCAR #2# 0) (QREFELT |$| 6) #2#))))))))) 
-
-(DEFUN |UPOLYC-;pseudoDivide;2SR;41| (|p| |q| |$|) 
-  (PROG (|n| |prem| #1=#:G103448 |lc| #2=#:G103450) 
-    (RETURN 
-      (SEQ 
-        (LETT |n| 
-          (|+| 
-            (|-| 
-              (SPADCALL |p| (QREFELT |$| 11))
-              (SPADCALL |q| (QREFELT |$| 11))) 1)
-          |UPOLYC-;pseudoDivide;2SR;41|)
-        (EXIT 
-          (COND 
-            ((|<| |n| 1)
-              (VECTOR (|spadConstant| |$| 48) (|spadConstant| |$| 60) |p|))
-            ((QUOTE T) 
-              (SEQ 
-                (LETT |prem| 
-                  (SPADCALL |p| |q| (QREFELT |$| 148))
-                  |UPOLYC-;pseudoDivide;2SR;41|)
-                (LETT |lc| 
-                  (SPADCALL 
-                    (SPADCALL |q| (QREFELT |$| 53))
-                    (PROG1 
-                      (LETT #1# |n| |UPOLYC-;pseudoDivide;2SR;41|)
-                      (|check-subtype| 
-                        (|>=| #1# 0)
-                        (QUOTE (|NonNegativeInteger|)) #1#))
-                    (QREFELT |$| 147))
-                  |UPOLYC-;pseudoDivide;2SR;41|)
-                (EXIT 
-                  (VECTOR |lc| 
-                    (PROG2 
-                      (LETT #2# 
-                        (SPADCALL 
-                          (SPADCALL 
-                            (SPADCALL |lc| |p| (QREFELT |$| 134))
-                            |prem|
-                            (QREFELT |$| 149))
-                          |q|
-                          (QREFELT |$| 126))
-                        |UPOLYC-;pseudoDivide;2SR;41|)
-                      (QCDR #2#)
-                      (|check-union| (QEQCAR #2# 0) (QREFELT |$| 6) #2#))
-                    |prem|)))))))))) 
-
-(DEFUN |UPOLYC-;composite;FSU;42| (|f| |q| |$|) 
-  (PROG (|n| |d|) 
-    (RETURN 
-      (SEQ 
-        (LETT |n| 
-          (SPADCALL (SPADCALL |f| (QREFELT |$| 141)) |q| (QREFELT |$| 153))
-          |UPOLYC-;composite;FSU;42|)
-        (EXIT 
-          (COND 
-            ((QEQCAR |n| 1) (CONS 1 "failed"))
-            ((QUOTE T) 
-              (SEQ 
-                (LETT |d| 
-                  (SPADCALL 
-                    (SPADCALL |f| (QREFELT |$| 144)) |q| (QREFELT |$| 153))
-                  |UPOLYC-;composite;FSU;42|)
-                (EXIT 
-                  (COND 
-                    ((QEQCAR |d| 1) (CONS 1 "failed"))
-                    ((QUOTE T) 
-                      (CONS 
-                        0 
-                        (SPADCALL 
-                          (QCDR |n|) 
-                          (QCDR |d|) 
-                          (QREFELT |$| 154)))))))))))))) 
-
-(DEFUN |UPOLYC-;composite;2SU;43| (|p| |q| |$|) 
-  (PROG (|cqr| |v| |u| |w| #1=#:G103476) 
-    (RETURN 
-      (SEQ 
-        (COND 
-          ((SPADCALL |p| (QREFELT |$| 157)) (CONS 0 |p|))
-          ((QUOTE T) 
-            (SEQ 
-              (EXIT 
-                (SEQ 
-                  (LETT |cqr| 
-                    (SPADCALL |p| |q| (QREFELT |$| 158))
-                    |UPOLYC-;composite;2SU;43|)
-                  (COND 
-                    ((SPADCALL (QVELT |cqr| 2) (QREFELT |$| 157))
-                      (SEQ 
-                        (LETT |v| 
-                          (SPADCALL 
-                            (QVELT |cqr| 2)
-                            (QVELT |cqr| 0)
-                            (QREFELT |$| 159))
-                          |UPOLYC-;composite;2SU;43|)
-                        (EXIT 
-                          (COND 
-                            ((QEQCAR |v| 0)
-                              (SEQ 
-                                (LETT |u| 
-                                  (SPADCALL 
-                                    (QVELT |cqr| 1) 
-                                    |q| 
-                                    (QREFELT |$| 153))
-                                  |UPOLYC-;composite;2SU;43|)
-                                (EXIT 
-                                  (COND 
-                                    ((QEQCAR |u| 0)
-                                      (SEQ 
-                                        (LETT |w| 
-                                          (SPADCALL 
-                                            (QCDR |u|)
-                                            (QVELT |cqr| 0)
-                                            (QREFELT |$| 159))
-                                          |UPOLYC-;composite;2SU;43|)
-                                        (EXIT 
-                                          (COND 
-                                            ((QEQCAR |w| 0)
-                                              (PROGN 
-                                                (LETT #1# 
-                                                  (CONS 
-                                                    0 
-                                                    (SPADCALL 
-                                                      (QCDR |v|)
-                                                      (SPADCALL 
-                                                        (SPADCALL 
-                                                       (|spadConstant| |$| 48)
-                                                       1
-                                                       (QREFELT |$| 49)) 
-                                                     (QCDR |w|) 
-                                                     (QREFELT |$| 71))
-                                                    (QREFELT |$| 65)))
-                                                  |UPOLYC-;composite;2SU;43|)
-                                                (GO #1#))))))))))))))))
-                  (EXIT (CONS 1 "failed"))))
-              #1# 
-              (EXIT #1#)))))))) 
-
-(DEFUN |UPOLYC-;elt;S2F;44| (|p| |f| |$|) 
-  (PROG (|n| #1=#:G103483 |ans|) 
-    (RETURN 
-      (SEQ 
-        (COND 
-          ((SPADCALL |p| (QREFELT |$| 9)) (|spadConstant| |$| 161))
-          ((QUOTE T) 
-            (SEQ 
-              (LETT |ans| 
-                (SPADCALL 
-                  (SPADCALL (SPADCALL |p| (QREFELT |$| 53)) (QREFELT |$| 30))
-                  (QREFELT |$| 162))
-                |UPOLYC-;elt;S2F;44|)
-              (LETT |n| (SPADCALL |p| (QREFELT |$| 11)) |UPOLYC-;elt;S2F;44|)
-              (SEQ G190 
-                (COND 
-                  ((NULL 
-                    (COND 
-                      ((SPADCALL 
-                        (LETT |p| 
-                          (SPADCALL |p| (QREFELT |$| 55))
-                          |UPOLYC-;elt;S2F;44|)
-                        (QREFELT |$| 9))
-                       (QUOTE NIL))
-                      ((QUOTE T) (QUOTE T))))
-                   (GO G191)))
-                (SEQ 
-                  (EXIT 
-                    (LETT |ans| 
-                      (SPADCALL 
-                        (SPADCALL |ans| 
-                          (SPADCALL |f| 
-                            (PROG1 
-                              (LETT #1# 
-                                (|-| |n| 
-                                  (LETT |n| 
-                                    (SPADCALL |p| (QREFELT |$| 11))
-                                    |UPOLYC-;elt;S2F;44|))
-                                |UPOLYC-;elt;S2F;44|)
-                              (|check-subtype| 
-                                (|>=| #1# 0)
-                                (QUOTE (|NonNegativeInteger|))
-                                #1#))
-                            (QREFELT |$| 163))
-                          (QREFELT |$| 164))
-                        (SPADCALL 
-                          (SPADCALL 
-                            (SPADCALL |p| (QREFELT |$| 53))
-                            (QREFELT |$| 30))
-                          (QREFELT |$| 162))
-                        (QREFELT |$| 165))
-                      |UPOLYC-;elt;S2F;44|)))
-                NIL 
-                (GO G190)
-                G191
-                (EXIT NIL))
-              (EXIT 
-                (COND 
-                  ((ZEROP |n|) |ans|)
-                  ((QUOTE T) 
-                    (SPADCALL |ans| 
-                      (SPADCALL |f| |n| (QREFELT |$| 166))
-                      (QREFELT |$| 164)))))))))))) 
-
-(DEFUN |UPOLYC-;order;2SNni;45| (|p| |q| |$|) 
-  (PROG (|u| #1=#:G103497 |ans|) 
-    (RETURN 
-      (SEQ 
-        (EXIT 
-          (COND 
-            ((SPADCALL |p| (QREFELT |$| 9))
-              (|error| "order: arguments must be nonzero"))
-            ((|<| (SPADCALL |q| (QREFELT |$| 11)) 1)
-              (|error| "order: place must be non-trivial"))
-            ((QUOTE T) 
-              (SEQ 
-                (LETT |ans| 0 |UPOLYC-;order;2SNni;45|)
-                (EXIT 
-                  (SEQ G190 
-                    NIL 
-                    (SEQ 
-                      (LETT |u| 
-                        (SPADCALL |p| |q| (QREFELT |$| 126))
-                        |UPOLYC-;order;2SNni;45|)
-                      (EXIT 
-                        (COND 
-                          ((QEQCAR |u| 1)
-                            (PROGN 
-                              (LETT #1# |ans| |UPOLYC-;order;2SNni;45|)
-                              (GO #1#)))
-                          ((QUOTE T) 
-                            (SEQ 
-                              (LETT |p| (QCDR |u|) |UPOLYC-;order;2SNni;45|)
-                              (EXIT 
-                                (LETT 
-                                  |ans|
-                                  (|+| |ans| 1)
-                                  |UPOLYC-;order;2SNni;45|)))))))
-                    NIL 
-                    (GO G190)
-                    G191
-                    (EXIT NIL)))))))
-         #1# 
-         (EXIT #1#))))) 
-
-(DEFUN |UPOLYC-;squareFree;SF;46| (|p| |$|) 
-  (SPADCALL |p| (QREFELT |$| 170))) 
-
-(DEFUN |UPOLYC-;squareFreePart;2S;47| (|p| |$|) 
-  (SPADCALL |p| (QREFELT |$| 172))) 
-
-(DEFUN |UPOLYC-;gcdPolynomial;3Sup;48| (|pp| |qq| |$|) 
-  (COND 
-    ((SPADCALL |pp| (QREFELT |$| 174)) (SPADCALL |qq| (QREFELT |$| 175)))
-    ((SPADCALL |qq| (QREFELT |$| 174)) (SPADCALL |pp| (QREFELT |$| 175)))
-    ((QUOTE T) 
-      (SPADCALL 
-        (SPADCALL 
-          (SPADCALL 
-            (SPADCALL |pp| (QREFELT |$| 176))
-            (SPADCALL |qq| (QREFELT |$| 176)) (QREFELT |$| 125))
-          (SPADCALL 
-            (SPADCALL 
-              (SPADCALL |pp| (QREFELT |$| 177))
-              (SPADCALL |qq| (QREFELT |$| 177)) (QREFELT |$| 178))
-            (QREFELT |$| 177))
-          (QREFELT |$| 179))
-        (QREFELT |$| 175))))) 
-
-(DEFUN |UPOLYC-;squareFreePolynomial;SupF;49| (|pp| |$|) 
-  (SPADCALL |pp| (QREFELT |$| 182))) 
-
-(DEFUN |UPOLYC-;elt;F2R;50| (|f| |r| |$|) 
-  (SPADCALL 
-    (SPADCALL 
-      (SPADCALL |f| (QREFELT |$| 141))
-      |r|
-      (QREFELT |$| 29))
-    (SPADCALL (SPADCALL |f| (QREFELT |$| 144)) |r| (QREFELT |$| 29))
-    (QREFELT |$| 184))) 
-
-(DEFUN |UPOLYC-;euclideanSize;SNni;51| (|x| |$|) 
-  (COND 
-    ((SPADCALL |x| (QREFELT |$| 9))
-      (|error| "euclideanSize called on 0 in Univariate Polynomial"))
-    ((QUOTE T) (SPADCALL |x| (QREFELT |$| 11))))) 
-
-(DEFUN |UPOLYC-;divide;2SR;52| (|x| |y| |$|) 
-  (PROG (|lc| |f| #1=#:G103510 |n| |quot|) 
-    (RETURN 
-      (SEQ 
-        (COND 
-          ((SPADCALL |y| (QREFELT |$| 9)) 
-            (|error| "division by 0 in Univariate Polynomials"))
-          ((QUOTE T) 
-            (SEQ 
-              (LETT |quot| (|spadConstant| |$| 60) |UPOLYC-;divide;2SR;52|)
-              (LETT |lc| 
-                (SPADCALL (SPADCALL |y| (QREFELT |$| 53)) (QREFELT |$| 187))
-                |UPOLYC-;divide;2SR;52|)
-              (SEQ G190 
-                (COND 
-                  ((NULL 
-                     (COND 
-                       ((OR 
-                          (SPADCALL |x| (QREFELT |$| 9))
-                          (|<| 
-                            (SPADCALL |x| (QREFELT |$| 11))
-                            (SPADCALL |y| (QREFELT |$| 11))))
-                        (QUOTE NIL)) ((QUOTE T) (QUOTE T))))
-                    (GO G191)))
-                (SEQ 
-                  (LETT |f| 
-                    (SPADCALL |lc| 
-                      (SPADCALL |x| (QREFELT |$| 53))
-                      (QREFELT |$| 188))
-                    |UPOLYC-;divide;2SR;52|)
-                  (LETT |n| 
-                    (PROG1 
-                      (LETT #1# 
-                        (|-| 
-                          (SPADCALL |x| (QREFELT |$| 11))
-                          (SPADCALL |y| (QREFELT |$| 11)))
-                         |UPOLYC-;divide;2SR;52|)
-                      (|check-subtype| 
-                        (|>=| #1# 0)
-                        (QUOTE (|NonNegativeInteger|))
-                        #1#))
-                    |UPOLYC-;divide;2SR;52|)
-                  (LETT |quot| 
-                    (SPADCALL |quot| 
-                      (SPADCALL |f| |n| (QREFELT |$| 49))
-                      (QREFELT |$| 65))
-                    |UPOLYC-;divide;2SR;52|)
-                  (EXIT 
-                    (LETT |x| 
-                      (SPADCALL |x| 
-                        (SPADCALL 
-                          (SPADCALL |f| |n| (QREFELT |$| 49))
-                          |y|
-                          (QREFELT |$| 71))
-                        (QREFELT |$| 149))
-                      |UPOLYC-;divide;2SR;52|)))
-                 NIL 
-                 (GO G190)
-                 G191
-                 (EXIT NIL))
-              (EXIT (CONS |quot| |x|))))))))) 
-
-(DEFUN |UPOLYC-;integrate;2S;53| (|p| |$|) 
-  (PROG (|l| |d| |ans|) 
-    (RETURN 
-      (SEQ 
-        (LETT |ans| (|spadConstant| |$| 60) |UPOLYC-;integrate;2S;53|)
-        (SEQ G190 
-          (COND 
-            ((NULL 
-              (COND 
-                ((SPADCALL |p| (|spadConstant| |$| 60) (QREFELT |$| 127))
-                  (QUOTE NIL))
-                ((QUOTE T) (QUOTE T)))) (GO G191)))
-          (SEQ 
-            (LETT |l| 
-              (SPADCALL |p| (QREFELT |$| 53))
-              |UPOLYC-;integrate;2S;53|)
-            (LETT |d| 
-              (|+| 1 (SPADCALL |p| (QREFELT |$| 11)))
-              |UPOLYC-;integrate;2S;53|)
-            (LETT |ans| 
-              (SPADCALL |ans| 
-                (SPADCALL 
-                  (SPADCALL (SPADCALL |d| (QREFELT |$| 191)) (QREFELT |$| 192))
-                  (SPADCALL |l| |d| (QREFELT |$| 49)) (QREFELT |$| 193))
-                (QREFELT |$| 65))
-              |UPOLYC-;integrate;2S;53|)
-            (EXIT 
-              (LETT |p| 
-                (SPADCALL |p| (QREFELT |$| 55))
-                |UPOLYC-;integrate;2S;53|)))
-          NIL
-          (GO G190)
-          G191
-          (EXIT NIL))
-        (EXIT |ans|))))) 
-
-(DEFUN |UnivariatePolynomialCategory&| (|#1| |#2|) 
-  (PROG (|DV$1| |DV$2| |dv$| |$| |pv$|) 
-    (RETURN 
-      (PROGN 
-        (LETT |DV$1| (|devaluate| |#1|) . #1=(|UnivariatePolynomialCategory&|))
-        (LETT |DV$2| (|devaluate| |#2|) . #1#)
-        (LETT |dv$| 
-          (LIST (QUOTE |UnivariatePolynomialCategory&|) |DV$1| |DV$2|) . #1#)
-        (LETT |$| (GETREFV 201) . #1#)
-        (QSETREFV |$| 0 |dv$|)
-        (QSETREFV |$| 3 
-          (LETT |pv$| 
-            (|buildPredVector| 0 0 
-              (LIST 
-                (|HasCategory| |#2| 
-                  (QUOTE (|Algebra| (|Fraction| (|Integer|)))))
-                (|HasCategory| |#2| (QUOTE (|Field|)))
-                (|HasCategory| |#2| (QUOTE (|GcdDomain|)))
-                (|HasCategory| |#2| (QUOTE (|IntegralDomain|)))
-                (|HasCategory| |#2| (QUOTE (|CommutativeRing|)))
-                (|HasCategory| |#2| (QUOTE (|StepThrough|))))) . #1#))
-        (|stuffDomainSlots| |$|)
-        (QSETREFV |$| 6 |#1|)
-        (QSETREFV |$| 7 |#2|)
-        (COND 
-          ((|HasCategory| |#2| (QUOTE (|PolynomialFactorizationExplicit|)))
-            (PROGN 
-              (QSETREFV |$| 81 
-                (CONS 
-                  (|dispatchFunction|
-                     |UPOLYC-;solveLinearPolynomialEquation;LSupU;20|)
-                  |$|))
-              (QSETREFV |$| 85 
-                (CONS 
-                  (|dispatchFunction| |UPOLYC-;factorPolynomial;SupF;21|) 
-                  |$|))
-              (QSETREFV |$| 87 
-                 (CONS 
-                    (|dispatchFunction|
-                       |UPOLYC-;factorSquareFreePolynomial;SupF;22|)
-                    |$|))
-              (QSETREFV |$| 105 
-                (CONS (|dispatchFunction| |UPOLYC-;factor;SF;23|) |$|)))))
-        (COND 
-          ((|testBitVector| |pv$| 6)
-            (PROGN 
-              (QSETREFV |$| 118 
-                (CONS (|dispatchFunction| |UPOLYC-;init;S;27|) |$|))
-              NIL
-              (QSETREFV |$| 122 
-                (CONS (|dispatchFunction| |UPOLYC-;nextItem;SU;29|) |$|)))))
-        (COND 
-          ((|testBitVector| |pv$| 3)
-            (PROGN 
-              (QSETREFV |$| 124 
-                (CONS (|dispatchFunction| |UPOLYC-;content;SSaosS;30|) |$|))
-              NIL
-              (QSETREFV |$| 129 
-                (CONS (|dispatchFunction| |UPOLYC-;separate;2SR;32|) |$|)))))
-        (COND 
-          ((|testBitVector| |pv$| 5)
-            (QSETREFV |$| 133 
-              (CONS 
-                (|dispatchFunction| |UPOLYC-;differentiate;SM2S;33|)
-                |$|))) 
-          ((QUOTE T) 
-            (PROGN 
-              (QSETREFV |$| 133 
-                (CONS 
-                  (|dispatchFunction| |UPOLYC-;differentiate;SM2S;35|)
-                  |$|)))))
-        (COND 
-          ((|testBitVector| |pv$| 4)
-            (PROGN 
-              (QSETREFV |$| 146 
-                (CONS (|dispatchFunction| |UPOLYC-;elt;3F;39|) |$|))
-              (QSETREFV |$| 150 
-                (CONS (|dispatchFunction| |UPOLYC-;pseudoQuotient;3S;40|) |$|))
-              (QSETREFV |$| 152 
-                (CONS (|dispatchFunction| |UPOLYC-;pseudoDivide;2SR;41|) |$|))
-              (QSETREFV |$| 156 
-                (CONS (|dispatchFunction| |UPOLYC-;composite;FSU;42|) |$|))
-              (QSETREFV |$| 160 
-                (CONS (|dispatchFunction| |UPOLYC-;composite;2SU;43|) |$|))
-              (QSETREFV |$| 167 
-                (CONS (|dispatchFunction| |UPOLYC-;elt;S2F;44|) |$|))
-              (QSETREFV |$| 168 
-                (CONS (|dispatchFunction| |UPOLYC-;order;2SNni;45|) |$|)))))
-        (COND 
-          ((|testBitVector| |pv$| 3)
-            (PROGN 
-              (QSETREFV |$| 171 
-                (CONS (|dispatchFunction| |UPOLYC-;squareFree;SF;46|) |$|))
-              (QSETREFV |$| 173 
-                (CONS 
-                  (|dispatchFunction| |UPOLYC-;squareFreePart;2S;47|)
-                  |$|)))))
-        (COND 
-          ((|HasCategory| |#2| (QUOTE (|PolynomialFactorizationExplicit|)))
-            (PROGN 
-              (QSETREFV |$| 180 
-                (CONS 
-                  (|dispatchFunction| |UPOLYC-;gcdPolynomial;3Sup;48|)
-                  |$|))
-              (QSETREFV |$| 183 
-                (CONS 
-                  (|dispatchFunction| |UPOLYC-;squareFreePolynomial;SupF;49|)
-                  |$|)))))
-        (COND 
-          ((|testBitVector| |pv$| 2)
-            (PROGN 
-              (QSETREFV |$| 185 
-                (CONS (|dispatchFunction| |UPOLYC-;elt;F2R;50|) |$|))
-              (QSETREFV |$| 186 
-                (CONS 
-                  (|dispatchFunction| |UPOLYC-;euclideanSize;SNni;51|)
-                  |$|))
-              (QSETREFV |$| 189 
-                (CONS (|dispatchFunction| |UPOLYC-;divide;2SR;52|) |$|)))))
-        (COND 
-          ((|testBitVector| |pv$| 1)
-             (QSETREFV |$| 194 
-               (CONS 
-                 (|dispatchFunction| |UPOLYC-;integrate;2S;53|)
-                 |$|)))) |$|)))) 
-
-(MAKEPROP 
-  (QUOTE |UnivariatePolynomialCategory&|)
-  (QUOTE |infovec|)
-  (LIST 
-    (QUOTE 
-      #(NIL NIL NIL NIL NIL NIL 
-        (|local| |#1|)
-        (|local| |#2|)
-        (|Boolean|)
-        (0 . |zero?|)
-        (|NonNegativeInteger|)
-        (5 . |degree|)
-        (|SingletonAsOrderedSet|)
-        (10 . |create|)
-        (|List| 12)
-        |UPOLYC-;variables;SL;1| 
-        |UPOLYC-;degree;SSaosNni;2| 
-        (14 . |totalDegree|)
-        |UPOLYC-;totalDegree;SLNni;3| 
-        (|List| 10)
-        |UPOLYC-;degree;SLL;4| 
-        (19 . |eval|)
-        (|List| |$|)
-        |UPOLYC-;eval;SLLS;5| 
-        (26 . |elt|)
-        |UPOLYC-;eval;SSaos2S;6| 
-        (32 . |eval|)
-        (|List| 7)
-        |UPOLYC-;eval;SLLS;7| 
-        (39 . |elt|)
-        (45 . |coerce|)
-        |UPOLYC-;eval;SSaosRS;8| 
-        (|Equation| 6)
-        (50 . |lhs|)
-        (|Union| 12 (QUOTE "failed"))
-        (55 . |mainVariable|)
-        (60 . |rhs|)
-        (|List| 197)
-        |UPOLYC-;eval;SLS;9| 
-        |UPOLYC-;mainVariable;SU;10| 
-        (65 . |minimumDegree|)
-        |UPOLYC-;minimumDegree;SSaosNni;11| 
-        |UPOLYC-;minimumDegree;SLL;12| 
-        (70 . |+|)
-        (|Mapping| 10 10)
-        (76 . |mapExponents|)
-        |UPOLYC-;monomial;SSaosNniS;13| 
-        (82 . |One|)
-        (86 . |One|)
-        (90 . |monomial|)
-        |UPOLYC-;coerce;SaosS;14| 
-        (|SparseUnivariatePolynomial| 7)
-        (96 . |Zero|)
-        (100 . |leadingCoefficient|)
-        (105 . |monomial|)
-        (111 . |reductum|)
-        (116 . |makeSUP|)
-        (121 . |+|)
-        |UPOLYC-;makeSUP;SSup;15| 
-        (127 . |zero?|)
-        (132 . |Zero|)
-        (136 . |leadingCoefficient|)
-        (141 . |degree|)
-        (146 . |reductum|)
-        (151 . |unmakeSUP|)
-        (156 . |+|)
-        |UPOLYC-;unmakeSUP;SupS;16| 
-        (|Record| (|:| |quotient| |$|) (|:| |remainder| |$|))
-        (162 . |monicDivide|)
-        |UPOLYC-;karatsubaDivide;SNniR;17| 
-        |UPOLYC-;shiftRight;SNniS;18| 
-        (168 . |*|)
-        |UPOLYC-;shiftLeft;SNniS;19| 
-        (|Union| 74 (QUOTE "failed"))
-        (|List| 75)
-        (|SparseUnivariatePolynomial| 6)
-        (|PolynomialFactorizationByRecursionUnivariate| 7 6)
-        (174 . |solveLinearPolynomialEquationByRecursion|)
-        (|Union| 79 (QUOTE "failed"))
-        (|List| 80)
-        (|SparseUnivariatePolynomial| |$|)
-        (180 . |solveLinearPolynomialEquation|)
-        (|Factored| 75)
-        (186 . |factorByRecursion|)
-        (|Factored| 80)
-        (191 . |factorPolynomial|)
-        (196 . |factorSquareFreeByRecursion|)
-        (201 . |factorSquareFreePolynomial|)
-        (|Factored| |$|)
-        (206 . |factor|)
-        (|Factored| 7)
-        (211 . |unit|)
-        (|Union| (QUOTE "nil") (QUOTE "sqfr") (QUOTE "irred") (QUOTE "prime"))
-        (|Record| (|:| |flg| 92) (|:| |fctr| 7) (|:| |xpnt| 109))
-        (|List| 93)
-        (216 . |factorList|)
-        (|Record| (|:| |flg| 92) (|:| |fctr| 6) (|:| |xpnt| 109))
-        (|List| 96)
-        (|Factored| 6)
-        (221 . |makeFR|)
-        (227 . |factorPolynomial|)
-        (|Mapping| 6 51)
-        (|Factored| 51)
-        (|FactoredFunctions2| 51 6)
-        (232 . |map|)
-        (238 . |factor|)
-        (243 . |Zero|)
-        (|Vector| 7)
-        (247 . |new|)
-        (|Integer|)
-        (253 . |minIndex|)
-        (258 . |coefficient|)
-        (264 . |qsetelt!|)
-        |UPOLYC-;vectorise;SNniV;24| 
-        |UPOLYC-;retract;SR;25| 
-        (|Union| 7 (QUOTE "failed"))
-        |UPOLYC-;retractIfCan;SU;26| 
-        (271 . |init|)
-        (275 . |init|)
-        (|Union| |$| (QUOTE "failed"))
-        (279 . |nextItem|)
-        (284 . |One|)
-        (288 . |nextItem|)
-        (293 . |content|)
-        (298 . |content|)
-        (304 . |gcd|)
-        (310 . |exquo|)
-        (316 . |=|)
-        (|Record| (|:| |primePart| |$|) (|:| |commonPart| |$|))
-        (322 . |separate|)
-        (328 . |Zero|)
-        (332 . |*|)
-        (|Mapping| 7 7)
-        (338 . |differentiate|)
-        (345 . |*|)
-        (351 . |differentiate|)
-        |UPOLYC-;differentiate;SMS;36| 
-        |UPOLYC-;differentiate;2S;37| 
-        (358 . |differentiate|)
-        |UPOLYC-;differentiate;SSaosS;38| 
-        (|Fraction| 6)
-        (363 . |numer|)
-        (|Fraction| |$|)
-        (368 . |elt|)
-        (374 . |denom|)
-        (379 . |/|)
-        (385 . |elt|)
-        (391 . |**|)
-        (397 . |pseudoRemainder|)
-        (403 . |-|)
-        (409 . |pseudoQuotient|)
-        (|Record| (|:| |coef| 7) (|:| |quotient| |$|) (|:| |remainder| |$|))
-        (415 . |pseudoDivide|)
-        (421 . |composite|)
-        (427 . |/|)
-        (|Union| 142 (QUOTE "failed"))
-        (433 . |composite|)
-        (439 . |ground?|)
-        (444 . |pseudoDivide|)
-        (450 . |exquo|)
-        (456 . |composite|)
-        (462 . |Zero|)
-        (466 . |coerce|)
-        (471 . |**|)
-        (477 . |*|)
-        (483 . |+|)
-        (489 . |**|)
-        (495 . |elt|)
-        (501 . |order|)
-        (|UnivariatePolynomialSquareFree| 7 6)
-        (507 . |squareFree|)
-        (512 . |squareFree|)
-        (517 . |squareFreePart|)
-        (522 . |squareFreePart|)
-        (527 . |zero?|)
-        (532 . |unitCanonical|)
-        (537 . |content|)
-        (542 . |primitivePart|)
-        (547 . |subResultantGcd|)
-        (553 . |*|)
-        (559 . |gcdPolynomial|)
-        (|UnivariatePolynomialSquareFree| 6 75)
-        (565 . |squareFree|)
-        (570 . |squareFreePolynomial|)
-        (575 . |/|)
-        (581 . |elt|)
-        (587 . |euclideanSize|)
-        (592 . |inv|)
-        (597 . |*|)
-        (603 . |divide|)
-        (|Fraction| 109)
-        (609 . |coerce|)
-        (614 . |inv|)
-        (619 . |*|)
-        (625 . |integrate|)
-        (|Symbol|)
-        (|List| 195)
-        (|Equation| |$|)
-        (|Union| 109 (QUOTE "failed"))
-        (|Union| 190 (QUOTE "failed"))
-        (|OutputForm|))) 
-    (QUOTE 
-      #(|vectorise| 630 |variables| 636 |unmakeSUP| 641 |totalDegree| 646 
-        |squareFreePolynomial| 652 |squareFreePart| 657 |squareFree| 662
-        |solveLinearPolynomialEquation| 667 |shiftRight| 673 |shiftLeft| 679
-        |separate| 685 |retractIfCan| 691 |retract| 696 |pseudoQuotient| 701
-        |pseudoDivide| 707 |order| 713 |nextItem| 719 |monomial| 724
-        |minimumDegree| 731 |makeSUP| 743 |mainVariable| 748
-        |karatsubaDivide| 753 |integrate| 759 |init| 764 |gcdPolynomial| 768
-        |factorSquareFreePolynomial| 774 |factorPolynomial| 779 |factor| 784
-        |eval| 789 |euclideanSize| 823 |elt| 828 |divide| 846
-        |differentiate| 852 |degree| 876 |content| 888 |composite| 894
-        |coerce| 906)) 
-    (QUOTE NIL) 
-    (CONS 
-      (|makeByteWordVec2| 1 (QUOTE NIL))
-      (CONS 
-        (QUOTE #())
-        (CONS 
-          (QUOTE #())
-          (|makeByteWordVec2| 194 
-            (QUOTE 
-              (1 6 8 0 9 1 6 10 0 11 0 12 0 13 1 6 10 0 17 3 6 0 0 12 0 21 2
-               6 0 0 0 24 3 6 0 0 12 7 26 2 6 7 0 7 29 1 6 0 7 30 1 32 6 0 33
-               1 6 34 0 35 1 32 6 0 36 1 6 10 0 40 2 10 0 0 0 43 2 6 0 44 0
-               45 0 6 0 47 0 7 0 48 2 6 0 7 10 49 0 51 0 52 1 6 7 0 53 2 51
-               0 7 10 54 1 6 0 0 55 1 6 51 0 56 2 51 0 0 0 57 1 51 8 0 59 0
-               6 0 60 1 51 7 0 61 1 51 10 0 62 1 51 0 0 63 1 6 0 51 64 2 6 0
-               0 0 65 2 6 67 0 0 68 2 6 0 0 0 71 2 76 73 74 75 77 2 0 78 79
-               80 81 1 76 82 75 83 1 0 84 80 85 1 76 82 75 86 1 0 84 80 87 1
-               7 88 0 89 1 90 7 0 91 1 90 94 0 95 2 98 0 6 97 99 1 7 84 80
-               100 2 103 98 101 102 104 1 0 88 0 105 0 7 0 106 2 107 0 10 7
-               108 1 107 109 0 110 2 6 7 0 10 111 3 107 7 0 109 7 112 0 7 0
-               117 0 0 0 118 1 7 119 0 120 0 75 0 121 1 0 119 0 122 1 6 7 0
-               123 2 0 0 0 12 124 2 6 0 0 0 125 2 6 119 0 0 126 2 6 8 0 0 127
-               2 0 128 0 0 129 0 75 0 130 2 7 0 10 0 131 3 0 0 0 132 0 133 2
-               6 0 7 0 134 3 6 0 0 132 0 135 1 6 0 0 138 1 140 6 0 141 2 6
-               142 0 142 143 1 140 6 0 144 2 140 0 0 0 145 2 0 142 142 142
-               146 2 7 0 0 10 147 2 6 0 0 0 148 2 6 0 0 0 149 2 0 0 0 0 150
-               2 0 151 0 0 152 2 6 119 0 0 153 2 140 0 6 6 154 2 0 155 142 0
-               156 1 6 8 0 157 2 6 151 0 0 158 2 6 119 0 7 159 2 0 119 0 0
-               160 0 140 0 161 1 140 0 6 162 2 140 0 0 109 163 2 140 0 0 0
-               164 2 140 0 0 0 165 2 140 0 0 10 166 2 0 142 0 142 167 2 0 10
-               0 0 168 1 169 98 6 170 1 0 88 0 171 1 169 6 6 172 1 0 0 0 173
-               1 75 8 0 174 1 75 0 0 175 1 75 6 0 176 1 75 0 0 177 2 75 0 0
-               0 178 2 75 0 6 0 179 2 0 80 80 80 180 1 181 82 75 182 1 0 84
-               80 183 2 7 0 0 0 184 2 0 7 142 7 185 1 0 10 0 186 1 7 0 0 187
-               2 7 0 0 0 188 2 0 67 0 0 189 1 190 0 109 191 1 190 0 0 192 2
-               6 0 190 0 193 1 0 0 0 194 2 0 107 0 10 113 1 0 14 0 15 1 0 0
-               51 66 2 0 10 0 14 18 1 0 84 80 183 1 0 0 0 173 1 0 88 0 171 2
-               0 78 79 80 81 2 0 0 0 10 70 2 0 0 0 10 72 2 0 128 0 0 129 1 0
-               115 0 116 1 0 7 0 114 2 0 0 0 0 150 2 0 151 0 0 152 2 0 10 0
-               0 168 1 0 119 0 122 3 0 0 0 12 10 46 2 0 19 0 14 42 2 0 10 0
-               12 41 1 0 51 0 58 1 0 34 0 39 2 0 67 0 10 69 1 0 0 0 194 0 0
-               0 118 2 0 80 80 80 180 1 0 84 80 87 1 0 84 80 85 1 0 88 0 105
-               3 0 0 0 12 0 25 3 0 0 0 14 22 23 3 0 0 0 14 27 28 3 0 0 0 12
-               7 31 2 0 0 0 37 38 1 0 10 0 186 2 0 142 0 142 167 2 0 7 142 7
-               185 2 0 142 142 142 146 2 0 67 0 0 189 3 0 0 0 132 0 133 2 0
-               0 0 132 136 1 0 0 0 137 2 0 0 0 12 139 2 0 10 0 12 16 2 0 19
-               0 14 20 2 0 0 0 12 124 2 0 119 0 0 160 2 0 155 142 0 156 1 0
-               0 12 50)))))) 
-       (QUOTE |lookupComplete|))) 
-
-@
 \section{package UPOLYC2 UnivariatePolynomialCategoryFunctions2}
 <<package UPOLYC2 UnivariatePolynomialCategoryFunctions2>>=
 )abbrev package UPOLYC2 UnivariatePolynomialCategoryFunctions2
@@ -4149,9 +183,7 @@ CommuteUnivariatePolynomialCategory(R, UP, UPUP): Exports == Impl where
 <<*>>=
 <<license>>
 
-<<category POLYCAT PolynomialCategory>>
 <<package POLYLIFT PolynomialCategoryLifting>>
-<<category UPOLYC UnivariatePolynomialCategory>>
 <<package UPOLYC2 UnivariatePolynomialCategoryFunctions2>>
 <<package COMMUPC CommuteUnivariatePolynomialCategory>>
 @
