diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index c72984e..bd5e00d 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -156347,6 +156347,481 @@ UTSodetools(F, UP, L, UTS): Exports == Implementation where
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{package POLYVEC U32VectorPolynomialOperations}
+<<U32VectorPolynomialOperations.input>>=
+)set break resume
+)sys rm -f U32VectorPolynomialOperations.output
+)spool U32VectorPolynomialOperations.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show U32VectorPolynomialOperations
+--R U32VectorPolynomialOperations  is a package constructor
+--R Abbreviation for U32VectorPolynomialOperations is POLYVEC 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.4.pamphlet to see algebra source code for POLYVEC 
+--R
+--R------------------------------- Operations --------------------------------
+--R degree : U32Vector -> Integer        
+--R copy_first : (U32Vector,U32Vector,Integer) -> Void
+--R copy_slice : (U32Vector,U32Vector,Integer,Integer) -> Void
+--R differentiate : (U32Vector,Integer) -> U32Vector
+--R differentiate : (U32Vector,NonNegativeInteger,Integer) -> U32Vector
+--R divide! : (U32Vector,U32Vector,U32Vector,Integer) -> Void
+--R eval_at : (U32Vector,Integer,Integer,Integer) -> Integer
+--R gcd : (U32Vector,U32Vector,Integer) -> U32Vector
+--R gcd : (PrimitiveArray U32Vector,Integer,Integer,Integer) -> U32Vector
+--R lcm : (PrimitiveArray U32Vector,Integer,Integer,Integer) -> U32Vector
+--R mul : (U32Vector,U32Vector,Integer) -> U32Vector
+--R mul_by_binomial : (U32Vector,Integer,Integer) -> Void
+--R mul_by_binomial : (U32Vector,Integer,Integer,Integer) -> Void
+--R mul_by_scalar : (U32Vector,Integer,Integer,Integer) -> Void
+--R pow : (U32Vector,PositiveInteger,NonNegativeInteger,Integer) -> U32Vector
+--R remainder! : (U32Vector,U32Vector,Integer) -> Void
+--R to_mod_pa : (SparseUnivariatePolynomial Integer,Integer) -> U32Vector
+--R truncated_mul_add : (U32Vector,U32Vector,U32Vector,Integer,Integer) -> Void
+--R truncated_multiplication : (U32Vector,U32Vector,Integer,Integer) -> U32Vector
+--R vector_add_mul : (U32Vector,U32Vector,Integer,Integer,Integer,Integer) -> Void
+--R vector_combination : (U32Vector,Integer,U32Vector,Integer,Integer,Integer,Integer) -> Void
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<U32VectorPolynomialOperations.help>>=
+====================================================================
+U32VectorPolynomialOperations examples
+====================================================================
+
+See Also:
+o )show U32VectorPolynomialOperations
+
+@
+\pagehead{U32VectorPolynomialOperations}{POLYVEC}
+\pagepic{ps/v104u32vectorpolynomialoperations.eps}{POLYVEC}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lll}
+\cross{POLYVEC}{copy\_first} &
+\cross{POLYVEC}{copy\_slice} &
+\cross{POLYVEC}{degree} \\
+\cross{POLYVEC}{differentiate} &
+\cross{POLYVEC}{divide!} &
+\cross{POLYVEC}{eval\_at} \\
+\cross{POLYVEC}{gcd} &
+\cross{POLYVEC}{lcm} &
+\cross{POLYVEC}{mul} \\
+\cross{POLYVEC}{mul\_by\_binomial} &
+\cross{POLYVEC}{mul\_by\_scalar} &
+\cross{POLYVEC}{pow} \\
+\cross{POLYVEC}{remainder!} &
+\cross{POLYVEC}{to\_mod\_pa} &
+\cross{POLYVEC}{truncated\_mul\_add} \\
+\cross{POLYVEC}{truncated\_multiplication} &
+\cross{POLYVEC}{vector\_add\_mul} &
+\cross{POLYVEC}{vector\_combination} 
+\end{tabular}
+
+<<package POLYVEC U32VectorPolynomialOperations>>=
+)abbrev package POLYVEC U32VectorPolynomialOperations
+++ Author: Waldek Hebisch
+++ Description: 
+++ This is a low-level package which implements operations
+++ on vectors treated as univariate modular polynomials.  Most
+++ operations takes modulus as parameter.  Modulus is machine
+++ sized prime which should be small enough to avoid overflow
+++ in intermediate calculations.
+U32VectorPolynomialOperations() : Export == Implementation where
+    PA ==> U32Vector
+    Export ==> with
+        copy__first : (PA, PA, Integer) -> Void
+          ++ copy__first(v1, v2, n) copies first n elements
+          ++ of v2 into n first positions in v1.
+        copy__slice : (PA, PA, Integer, Integer) -> Void
+          ++ copy__first(v1, v2, m, n) copies the slice of v2 starting
+          ++ at m elements and having n elements into corresponding
+          ++ positions in v1.
+        eval__at : (PA, Integer, Integer, Integer) -> Integer
+          ++ eval__at(v, deg, pt, p) treats v as coefficients of
+          ++ polynomial of degree deg and evaluates the
+          ++ polynomial at point pt modulo p
+        vector__add__mul : (PA, PA, Integer, Integer, Integer, Integer) _
+            -> Void
+          ++ vector__add__mul(v1, v2, m, n, c, p) sets v1(m), ...,
+          ++ v1(n) to corresponding extries in v1 + c*v2
+          ++ modulo p.
+        mul__by__binomial : (PA, Integer, Integer) -> Void
+          ++ mul__by__binomial(v,  pt, p) treats v a polynomial
+          ++ and multiplies in place this polynomial by binomial (x + pt).
+          ++ Highest coefficient of product is ignored.
+        mul__by__binomial : (PA, Integer, Integer, Integer) -> Void
+          ++ mul__by__binomial(v, deg, pt, p) treats v as
+          ++ coefficients of polynomial of degree deg and
+          ++ multiplies in place this polynomial by binomial (x + pt).
+          ++ Highest coefficient of product is ignored.
+        mul__by__scalar : (PA, Integer, Integer, Integer) -> Void
+          ++ mul__by__scalar(v, deg, c, p) treats v as
+          ++ coefficients of polynomial of degree deg and
+          ++ multiplies in place this polynomial by scalar c
+        mul : (PA, PA, Integer) -> PA
+          ++ Polynomial multiplication.
+        truncated__multiplication : (PA, PA, Integer, Integer) -> PA
+          ++ truncated__multiplication(x, y, d, p) computes
+          ++ x*y truncated after degree d
+        truncated__mul__add : (PA, PA, PA, Integer, Integer) -> Void
+          ++ truncated__mul__add(x, y, z, d, p) adds to z
+          ++ the produce x*y truncated after degree d
+        pow : (PA, PositiveInteger, NonNegativeInteger, Integer) -> PA
+          ++ pow(u, n, d, p) returns u^n truncated after degree d, except if
+          ++ n=1, in which case u itself is returned
+        differentiate : (PA, Integer) -> PA
+          ++ Polynomial differentiation.
+        differentiate : (PA, NonNegativeInteger, Integer) -> PA
+          ++ Polynomial differentiation.
+        divide! : (PA, PA, PA, Integer) -> Void
+          ++ Polynomial division.
+        remainder! : (PA, PA, Integer) -> Void
+          ++ Polynomial remainder
+        vector__combination : (PA, Integer, PA, Integer, _
+                               Integer, Integer, p : Integer) -> Void
+          ++ vector__combination(v1, c1, v2, c2, n, delta, p) replaces
+          ++ first n + 1 entires of v1 by corresponding entries of
+          ++ c1*v1+c2*x^delta*v2 mod p.
+        to__mod__pa : (SparseUnivariatePolynomial Integer, Integer) -> PA
+          ++ to__mod__pa(s, p) reduces coefficients of polynomial
+          ++ s modulo primte p and converts the resut to vector
+        gcd : (PA, PA, Integer) -> PA
+          ++ Polynomial gcd.
+        gcd : (PrimitiveArray PA, Integer, Integer, Integer) -> PA
+          ++ gcd(a, lo, hi, p) computes gcd of elements
+          ++ a(lo), a(lo+1), ..., a(hi).
+        lcm : (PrimitiveArray PA, Integer, Integer, Integer) -> PA
+          ++ lcm(a, lo, hi, p) computes lcm of elements
+          ++ a(lo), a(lo+1), ..., a(hi).
+        degree : PA -> Integer
+          ++ degree(v) is degree of v treated as polynomial
+
+    Implementation ==> add
+
+        Qmuladdmod ==> QSMULADDMOD64_-32$Lisp
+        Qmuladd  ==> QSMULADD64_-32$Lisp
+        Qmul ==> QSMULMOD32$Lisp
+        Qdot2 ==> QSDOT2MOD64_-32$Lisp
+        Qrem ==> QSMOD64_-32$Lisp
+        modInverse ==> invmod
+
+        copy__first(np : PA, op : PA, n : Integer) : Void ==
+            ns := n pretend SingleInteger
+            for j in 0..(ns - 1) repeat
+                np(j) := op(j)
+
+        copy__slice(np : PA, op : PA, m : Integer, _
+                    n : Integer) : Void ==
+            ms := m pretend SingleInteger
+            ns := n pretend SingleInteger
+            for j in ms..(ms + ns - 1) repeat
+                np(j) := op(j)
+
+        eval__at(v : PA, deg : Integer, pt : Integer, _
+               p : Integer) : Integer ==
+            i : SingleInteger := deg::SingleInteger
+            res : Integer := 0
+            while i >= 0 repeat
+                res := Qmuladdmod(pt, res, v(i), p)
+                i := i - 1
+            res
+
+        to__mod__pa(s : SparseUnivariatePolynomial Integer, p : Integer) : PA ==
+            zero?(s) => new(1, 0)$PA
+            n0 := degree(s) pretend SingleInteger
+            ncoeffs := new((n0+1) pretend NonNegativeInteger, 0)$PA
+            while not(zero?(s)) repeat
+                n := degree(s)
+                ncoeffs(n) := positiveRemainder(leadingCoefficient(s), p)
+                s := reductum(s)
+            ncoeffs
+
+        vector__add__mul(v1 : PA, v2 : PA, m : Integer, n : Integer, _
+                         c : Integer, p : Integer) : Void ==
+            ms := m pretend SingleInteger
+            ns := n pretend SingleInteger
+            for i in ms..ns repeat
+                v1(i) := Qmuladdmod(c, v2(i), v1(i), p)
+
+        mul__by__binomial(v : PA, n : Integer, pt : Integer, _
+                          p : Integer) : Void ==
+            prev__coeff : Integer := 0
+            ns := n pretend SingleInteger
+            for i in 0..(ns - 1) repeat
+                pp := v(i)
+                v(i) := Qmuladdmod(pt, pp, prev__coeff, p)
+                prev__coeff := pp
+
+        mul__by__binomial(v : PA, pt : Integer, _
+                          p : Integer) : Void ==
+            mul__by__binomial(v, #v, pt, p)
+
+        mul__by__scalar(v : PA, n : Integer, c : Integer, _
+                        p : Integer) : Void ==
+            ns := n pretend SingleInteger
+            for i in 0..ns repeat
+                v(i) := Qmul(c, v(i), p)
+
+        degree(v : PA) : Integer ==
+            n := #v
+            for i in (n - 1)..0 by -1 repeat
+                v(i) ~= 0 => return i
+            -1
+
+        vector__combination(v1 : PA, c1 : Integer, _
+                            v2 : PA, c2 : Integer, _
+                            n : Integer, delta : Integer, _
+                            p : Integer) : Void ==
+            ns := n pretend SingleInteger
+            ds := delta pretend SingleInteger
+            if c1 ~= 1 then
+                for i in 0..(ds - 1) repeat
+                    v1(i) := Qmul(v1(i), c1, p)
+                for i in ds..ns repeat
+                    v1(i) := Qdot2(v1(i), c1, v2(i - ds), c2, p)
+            else
+                for i in ds..ns repeat
+                    v1(i) := Qmuladdmod(c2, v2(i - ds), v1(i), p)
+
+        divide!(r0 : PA, r1 : PA, res : PA, p: Integer) : Void ==
+            dr0 := degree(r0)
+            dr1 := degree(r1)
+            c0 := r1(dr1)
+            c0 := modInverse(c0, p)
+            while dr0 >= dr1 repeat
+                delta := dr0 - dr1
+                c1 := Qmul(c0, r0(dr0), p)
+                res(delta) := c1
+                c1 := p - c1
+                r0(dr0) := 0
+                dr0 := dr0 - 1
+                if dr0 < 0 then break
+                vector__combination(r0, 1, r1, c1, dr0, delta, p)
+                while r0(dr0) = 0 repeat
+                    dr0 := dr0 - 1
+                    if dr0 < 0 then break
+
+        remainder!(r0 : PA, r1 : PA, p: Integer) : Void ==
+            dr0 := degree(r0)
+            dr1 := degree(r1)
+            c0 := r1(dr1)
+            c0 := modInverse(c0, p)
+            while dr0 >= dr1 repeat
+                delta := dr0 - dr1
+                c1 := Qmul(c0, r0(dr0), p)
+                c1 := p - c1
+                r0(dr0) := 0
+                dr0 := dr0 - 1
+                if dr0 < 0 then break
+                vector__combination(r0, 1, r1, c1, dr0, delta, p)
+                while r0(dr0) = 0 repeat
+                    dr0 := dr0 - 1
+                    if dr0 < 0 then break
+
+        gcd(x : PA, y : PA, p : Integer) : PA ==
+            dr0 := degree(y) pretend SingleInteger
+            dr1 : SingleInteger
+            if dr0 < 0 then
+                tmpp := x
+                x := y
+                y := tmpp
+                dr1 := dr0
+                dr0 := degree(y) pretend SingleInteger
+            else
+                dr1 := degree(x) pretend SingleInteger
+            dr0 < 0 =>
+                dr1 < 0 =>
+                    return new(1, 0)$PA
+                r1 := new((dr1 + 1) pretend NonNegativeInteger, 0)$PA
+                copy__first(r1, x, dr1 + 1)
+                c := r1(dr1)
+                c := modInverse(c, p)
+                mul__by__scalar(r1, dr1, c, p)
+                return r1
+            r0 := new((dr0 + 1) pretend NonNegativeInteger, 0)$PA
+            copy__first(r0, y, dr0 + 1)
+            r1 := new((dr1 + 1) pretend NonNegativeInteger, 0)$PA
+            copy__first(r1, x, dr1 + 1)
+            while dr1 > 0 repeat
+                while dr0 >= dr1 repeat
+                    delta := dr0 - dr1
+                    c1 := QSDIFFERENCE(p, r0(dr0))$Lisp
+                    c0 := r1(dr1)
+                    if c0 ~= 1 and delta > 30 then
+                        c0 :=  modInverse(c0, p)
+                        mul__by__scalar(r1, dr1, c0, p)
+                        c0 := 1
+                    r0(dr0) := 0
+                    dr0 := dr0 - 1
+                    vector__combination(r0, c0, r1, c1, dr0, delta, p)
+                    while r0(dr0) = 0 repeat
+                        dr0 := dr0 - 1
+                        if dr0 < 0 then break
+                tmpp := r0
+                tmp := dr0
+                r0 := r1
+                dr0 := dr1
+                r1 := tmpp
+                dr1 := tmp
+            dr1 >= 0 =>
+                r1(0) := 1
+                return r1
+            c := r0(dr0)
+            c := modInverse(c, p)
+            mul__by__scalar(r0, dr0, c, p)
+            r0
+
+        gcd(a : PrimitiveArray PA, lo : Integer, hi: Integer, p: Integer) _
+              : PA ==
+            res := a(lo)
+            for i in (lo + 1)..hi repeat
+                res := gcd(a(i), res, p)
+            res
+
+        lcm2(v1 : PA, v2 : PA, p : Integer) : PA ==
+            pp := gcd(v1, v2, p)
+            dv2 := degree(v2)
+            dpp := degree(pp)
+            dv2 = dpp =>
+                v1
+            dpp = 0 => mul(v1, v2, p)
+            tmp1 := new((dv2 + 1) pretend NonNegativeInteger, 0)$PA
+            tmp2 := new((dv2 - dpp + 1) pretend NonNegativeInteger, 0)$PA
+            copy__first(tmp1, v2, dv2 + 1)
+            divide!(tmp1, pp, tmp2, p)
+            mul(v1, tmp2, p)
+
+        lcm(a : PrimitiveArray PA, lo : Integer, hi: Integer, p: Integer) _
+              : PA ==
+            res := a(lo)
+            for i in (lo + 1)..hi repeat
+                res := lcm2(a(i), res, p)
+            res
+
+        inner__mul : (PA, PA, PA,  SingleInteger, SingleInteger, _
+                      SingleInteger, Integer) -> Void
+
+        mul(x : PA, y : PA, p : Integer) : PA ==
+            xdeg := degree(x) pretend SingleInteger
+            ydeg := degree(y) pretend SingleInteger
+            if xdeg > ydeg then
+                tmpp := x
+                tmp := xdeg
+                x := y
+                xdeg := ydeg
+                y := tmpp
+                ydeg := tmp
+            xcoeffs := x
+            ycoeffs := y
+            xdeg < 0 => x
+            xdeg = 0 and xcoeffs(0) = 1 => copy(y)
+            zdeg : SingleInteger := xdeg + ydeg
+            zdeg0 := (zdeg::Integer) pretend NonNegativeInteger
+            zcoeffs := new(zdeg0 + 1, 0)$PA
+            inner__mul(xcoeffs, ycoeffs, zcoeffs, xdeg, ydeg, zdeg, p)
+            zcoeffs
+
+        inner__mul(x, y, z, xdeg, ydeg, zdeg, p) ==
+            if xdeg > ydeg then
+                tmpp := x
+                tmp := xdeg
+                x := y
+                xdeg := ydeg
+                y := tmpp
+                ydeg := tmp
+            xdeg :=
+                xdeg > zdeg => zdeg
+                xdeg
+            ydeg :=
+                ydeg > zdeg => zdeg
+                ydeg
+            ss : Integer
+            i : SingleInteger
+            j : SingleInteger
+            for i in 0..xdeg repeat
+                ss := z(i)
+                for j in 0..i repeat
+                    ss := Qmuladd(x(i - j), y(j), ss)
+                z(i) := Qrem(ss, p)
+            for i in (xdeg+1)..ydeg repeat
+                ss := z(i)
+                for j in 0..xdeg repeat
+                    ss := Qmuladd(x(j), y(i-j), ss)
+                z(i) := Qrem(ss, p)
+            for i in (ydeg+1)..zdeg repeat
+                ss := z(i)
+                for j in (i-xdeg)..ydeg repeat
+                    ss := Qmuladd(x(i - j), y(j), ss)
+                z(i) := Qrem(ss, p)
+
+        truncated__mul__add(x, y, z, m, p) ==
+            xdeg := (#x - 1) pretend SingleInteger
+            ydeg := (#y - 1) pretend SingleInteger
+            inner__mul(x, y, z, xdeg, ydeg, m pretend SingleInteger, p)
+
+        truncated__multiplication(x, y, m, p) ==
+            xdeg := (#x - 1) pretend SingleInteger
+            ydeg := (#y - 1) pretend SingleInteger
+            z := new((m pretend SingleInteger + 1)
+                        pretend NonNegativeInteger, 0)$PA
+            inner__mul(x, y, z, xdeg, ydeg, m pretend SingleInteger, p)
+            z
+
+        pow(x : PA, n : PositiveInteger, d: NonNegativeInteger, _
+            p : Integer) : PA ==
+            one? n => x
+            odd?(n)$Integer =>
+                truncated__multiplication(x,
+                    pow(truncated__multiplication(x, x, d, p),
+                        shift(n,-1) pretend PositiveInteger,
+                        d,
+                        p),
+                    d,
+                    p)
+            pow(truncated__multiplication(x, x, d, p),
+                shift(n,-1) pretend PositiveInteger,
+                d,
+                p)
+
+        differentiate(x: PA, p: Integer): PA ==
+            d := #x - 1
+            if zero? d then empty()$PA
+            else
+                r := new(d::NonNegativeInteger, 0)$PA
+                for i in 0..d-1 repeat
+                    i1 := i+1
+                    r.i := Qmul(i1, x.i1, p)
+                r
+
+        differentiate(x: PA, n: NonNegativeInteger, p: Integer): PA ==
+            zero? n => x
+            d := #x - 1
+            if d < n then empty()$PA
+            else
+                r := new((d-n+1) pretend NonNegativeInteger, 0)$PA
+                for i in n..d repeat
+                    j := i-n
+                    f := j+1
+                    for k in j+2..i repeat f := Qmul(f, k, p)
+                    r.(j pretend NonNegativeInteger) := Qmul(f, x.i, p)
+                r
+
+@
+<<POLYVEC.dotabb>>=
+"POLYVEC" [color="#FF4488",href="bookvol10.4.pdf#nameddest=POLYVEC"]
+"A1AGG" [color="#4488FF",href="bookvol10.2.pdf#nameddest=A1AGG"]
+"POLYVEC" -> "A1AGG"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Chapter V}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package VECTOR2 VectorFunctions2}
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index cc22727..56721b0 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -24011,6 +24011,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|UniversalSegmentFunctions2| . UNISEG2)
    (|UserDefinedVariableOrdering| . UDVO)
    (|U32Vector| . U32VEC)
+   (|U32VectorPolynomialOperations| . POLYVEC)
    (|Vector| . VECTOR)
    (|VectorFunctions2| . VECTOR2)
    (|ViewDefaultsPackage| . VIEWDEF)
diff --git a/books/ps/v104u32vectorpolynomialoperations.eps b/books/ps/v104u32vectorpolynomialoperations.eps
new file mode 100644
index 0000000..8ddd59f
--- /dev/null
+++ b/books/ps/v104u32vectorpolynomialoperations.eps
@@ -0,0 +1,266 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Graphviz version 2.20.2 (Mon Mar 30 10:09:11 UTC 2009)
+%%For: (root) root
+%%Title: pic
+%%Pages: 1
+%%BoundingBox: 36 36 124 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
+       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 text fitted to its expected width
+/alignedtext {			% width text
+	/text exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			[] 0 setdash
+			text stringwidth pop width exch sub text length div 0 text ashow
+		} if
+	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
+setupLatin1
+%%Page: 1 1
+%%PageBoundingBox: 36 36 124 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 88 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% POLYVEC
+gsave
+[ /Rect [ 0 72 80 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=POLYVEC) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 80 108 moveto
+0 108 lineto
+0 72 lineto
+80 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 80 108 moveto
+0 108 lineto
+0 72 lineto
+80 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+7.5 85.9 moveto 65 (POLYVEC) alignedtext
+grestore
+% A1AGG
+gsave
+[ /Rect [ 7 0 73 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=A1AGG) >>
+  /Subtype /Link
+/ANN pdfmark
+0.606 0.733 1.000 nodecolor
+newpath 73 36 moveto
+7 36 lineto
+7 0 lineto
+73 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.606 0.733 1.000 nodecolor
+newpath 73 36 moveto
+7 36 lineto
+7 0 lineto
+73 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+14.5 13.9 moveto 51 (A1AGG) alignedtext
+grestore
+% POLYVEC->A1AGG
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 40 72 moveto
+40 64 40 55 40 46 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 43.5 46 moveto
+40 36 lineto
+36.5 46 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 43.5 46 moveto
+40 36 lineto
+36.5 46 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index e141ec7..fa2c66b 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100801 wxh src/axiom-website/patches.html 20100801.02.wxh.patch
+20100801 wxh src/algebra/Makefile test and help for POLYVEC
+20100801 wxh books/bookvol5 expose U32VectorPolynomialOperations
+20100801 wxh books/bookvol10.4 add U32VectorPolynomialOperations
+20100801 wxh books/ps/v104u32vectorpolynomialoperations.eps added
 20100801 tpd src/axiom-website/patches.html 20100801.01.wxh.patch
 20100801 tpd books/bookvolbib add GCL92, AS64, NIST10, RF94 
 20100801 tpd src/input/Makefile add risch.input
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 48a5d9f..c06e32a 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -4468,8 +4468,8 @@ LAYER9=\
   ${OUT}/DIRPROD2.o ${OUT}/IMATRIX.o  ${OUT}/INTRVL.o  \
   ${OUT}/IVECTOR.o  ${OUT}/LOCPOWC.o  \
   ${OUT}/LODO1.o    ${OUT}/LODO2.o    ${OUT}/LPOLY.o   \
-  ${OUT}/LSMP.o     ${OUT}/LSMP1.o    ${OUT}/MATCAT2.o  ${OUT}/PROJPL.o   \
-  ${OUT}/PTCAT.o    ${OUT}/STRICAT.o  ${OUT}/TRIMAT.o  \
+  ${OUT}/LSMP.o     ${OUT}/LSMP1.o    ${OUT}/MATCAT2.o  ${OUT}/POLYVEC.o \
+  ${OUT}/PROJPL.o   ${OUT}/PTCAT.o    ${OUT}/STRICAT.o  ${OUT}/TRIMAT.o  \
   layer9done
 
 @
@@ -4660,6 +4660,22 @@ LAYER9=\
 "MATCAT2" -> "MATCAT"
 /*"MATCAT2" -> "ARR2CAT"*/
 
+"POLYVEC" [color="#FF4488",href="bookvol10.4.pdf#nameddest=POLYVEC"]
+"POLYVEC" -> "A1AGG"
+/*"POLYVEC" -> {"SINT"; "NNI"; "INT"; "FLAGG"; "LNAGG"; "IXAGG"; "HOAGG"}*/
+/*"POLYVEC" -> {"AGG"; "TYPE"; "SETCAT"; "BASTYPE"; "KOERCE"; "EVALAB"}*/
+/*"POLYVEC" -> {"IEVALAB"; "ELTAGG"; "ELTAB"; "CLAGG"; "KONVERT"; "ORDSET"}*/
+/*"POLYVEC" -> {"BOOLEAN"; "INS"; "UFD"; "GCDDOM"; "INTDOM"; "COMRING"}*/
+/*"POLYVEC" -> {"RING"; "RNG"; "ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"}*/
+/*"POLYVEC" -> {"SGROUP"; "MONOID"; "LMODULE"; "BMODULE"; "RMODULE"; "PI"}*/
+/*"POLYVEC" -> {"ALGEBRA"; "MODULE"; "ENTIRER"; "EUCDOM"; "PID"; "OINTDOM"}*/
+/*"POLYVEC" -> {"ORDRING"; "OAGROUP"; "OCAMON"; "OAMON"; "OASGP"; "DIFRING"}*/
+/*"POLYVEC" -> {"RETRACT"; "LINEXP"; "PATMAB"; "CFCAT"; "REAL"; "CHARZ"}*/
+/*"POLYVEC" -> {"STEP"; "INS-"; "EUCDOM-"; "UFD-"; "GCDDOM-"; "INTDOM-"}*/
+/*"POLYVEC" -> {"ALGEBRA-"; "DIFRING-"; "ORDRING-"; "MODULE-"; "RING-"}*/
+/*"POLYVEC" -> {"ABELGRP-"; "ABELMON-"; "MONOID-"; "ORDSET-"; "ABELSG-"}*/
+/*"POLYVEC" -> {"SGROUP-"; "SETCAT-"; "RETRACT-"; "BASTYPE-"; "PRIMARR"}*/
+
 "PROJPL" [color="#88FF44",href="bookvol10.3.pdf#nameddest=PROJPL"]
 /*"PROJPL" -> {"PRSPCAT"; "SETCATD"; "SETCAT"; "BASTYPE"; "KOERCE"; "FIELD"}*/
 "PROJPL" -> "PROJSP"
@@ -17967,6 +17983,7 @@ SPADHELP=\
  ${HELP}/UnivariateTaylorSeriesCategory.help \
  ${HELP}/UniversalSegment.help \
  ${HELP}/U32Vector.help \
+ ${HELP}/U32VectorPolynomialOperations.help \
  ${HELP}/Variable.help \
  ${HELP}/Vector.help \
  ${HELP}/VectorCategory.help \
@@ -18647,6 +18664,7 @@ REGRESS= \
  UnivariateTaylorSeriesCategory.regress \
  UniversalSegment.regress \
  U32Vector.regress \
+ U32VectorPolynomialOperations.regress \
  Variable.regress \
  Vector.regress \
  VectorCategory.regress \
@@ -26740,6 +26758,18 @@ ${HELP}/U32Vector.help: ${BOOKS}/bookvol10.3.pamphlet
             >${INPUT}/U32Vector.input
 	@echo "U32Vector (U32VEC)" >>${HELPFILE}
 
+${HELP}/U32VectorPolynomialOperations.help: ${BOOKS}/bookvol10.4.pamphlet
+	@echo 8200 create U32VectorPolynomialOperations.help from \
+           ${BOOKS}/bookvol10.4.pamphlet
+	@${TANGLE} -R"U32VectorPolynomialOperations.help" \
+           ${BOOKS}/bookvol10.4.pamphlet \
+           >${HELP}/U32VectorPolynomialOperations.help
+	@cp -f ${HELP}/U32VectorPolynomialOperations.help ${HELP}/POLYVEC.help
+	@${TANGLE} -R"U32VectorPolynomialOperations.input" \
+            ${BOOKS}/bookvol10.4.pamphlet \
+            >${INPUT}/U32VectorPolynomialOperations.input
+	@echo "U32VectorPolynomialOperations (POLYVEC)" >>${HELPFILE}
+
 ${HELP}/Variable.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 5000 create Variable.help from \
            ${BOOKS}/bookvol10.3.pamphlet
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 2ba2c63..c3b5fcb 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -3043,5 +3043,7 @@ books/ps/v104streamtensor.eps added<br/>
 books/bookvol10.3 add U32Vector, move GOPT0 from bookvol10.4<br/>
 <a href="patches/20100801.01.wxh.patch">20100801.01.wxh.patch</a>
 books/bookvolbib Geddes GCL92 Abramowitz AS64 Olver NIST10 Richardson RF94<br/>
+<a href="patches/20100801.02.wxh.patch">20100801.02.wxh.patch</a>
+books/bookvol10.4 add U32VectorPolynomialOperations<br/>
  </body>
 </html>
