diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index 42c5029..3ef9743 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -24919,6 +24919,285 @@ FiniteDivisorFunctions2(R1, UP1, UPUP1, F1, R2, UP2, UPUP2, F2):
 "FDIV2" -> "FFCAT"
 
 @
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{package FFFACTSE FiniteFieldFactorizationWithSizeParseBySideEffect}
+<<FiniteFieldFactorizationWithSizeParseBySideEffect.input>>=
+)set break resume
+)sys rm -f FiniteFieldFactorizationWithSizeParseBySideEffect.output
+)spool FiniteFieldFactorizationWithSizeParseBySideEffect.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show FiniteFieldFactorizationWithSizeParseBySideEffect
+--R FiniteFieldFactorizationWithSizeParseBySideEffect(K: FiniteFieldCategory,PolK: UnivariatePolynomialCategory K)  is a package constructor
+--R Abbreviation for FiniteFieldFactorizationWithSizeParseBySideEffect is FFFACTSE 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.4.pamphlet to see algebra source code for FFFACTSE 
+--R
+--R------------------------------- Operations --------------------------------
+--R factor : PolK -> Factored PolK        irreducible? : PolK -> Boolean
+--R factorCantorZassenhaus : (PolK,NonNegativeInteger) -> List PolK
+--R factorSquareFree : PolK -> List PolK
+--R factorUsingMusser : PolK -> Factored PolK
+--R factorUsingYun : PolK -> Factored PolK
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+
+<<FiniteFieldFactorizationWithSizeParseBySideEffect.help>>=
+====================================================================
+FiniteFieldFactorizationWithSizeParseBySideEffect examples
+====================================================================
+
+See Also:
+o )show FiniteFieldFactorizationWithSizeParseBySideEffect
+
+@
+\pagehead{FiniteFieldFactorizationWithSizeParseBySideEffect}{FFFACTSE}
+\pagepic{ps/v104finitefieldfactorizationwithsizeparsebysideeffect.ps}{FFFACTSE}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lll}
+\cross{FFFACTSE}{factor} &
+\cross{FFFACTSE}{factorCantorZassenhaus} &
+\cross{FFFACTSE}{factorSquareFree} \\
+\cross{FFFACTSE}{factorUsingMusser} &
+\cross{FFFACTSE}{factorUsingYun} &
+\cross{FFFACTSE}{irreducible?}
+\end{tabular}
+
+
+<<package FFFACTSE FiniteFieldFactorizationWithSizeParseBySideEffect>>=
+)abbrev package FFFACTSE FiniteFieldFactorizationWithSizeParseBySideEffect
+++ Author: Patrice Naudin, Claude Quitte, Kaj Laursen
+++ Date Created: September 1996
+++ Date Last Updated: April 2010 by Tim Daly
+++ Description:
+++ Part of the package for Algebraic Function Fields in one variable (PAFF)
+++ It has been modified (very slitely) so that each time the "factor"
+++ function is used, the variable related to the size of the field
+++ over which the polynomial is factorized is reset. This is done in
+++ order to be used with a "dynamic extension field" which size is not
+++ fixed but set before calling the "factor" function and which is
+++ parse by side effect to this package via the function "size".  See
+++ the local function "initialize" of this package.
+FiniteFieldFactorizationWithSizeParseBySideEffect(K : FiniteFieldCategory,
+                         PolK : UnivariatePolynomialCategory(K)) : with
+
+     factorSquareFree : PolK -> List(PolK)
+     factorCantorZassenhaus : (PolK, NonNegativeInteger) -> List(PolK)
+     factor : PolK -> Factored(PolK)
+     factorUsingYun : PolK -> Factored(PolK)
+     factorUsingMusser : PolK -> Factored(PolK)
+     irreducible? : PolK -> Boolean
+
+  == add
+
+     import FiniteFieldSquareFreeDecomposition(K, PolK)
+     p : NonNegativeInteger := characteristic()$K
+     p' : NonNegativeInteger := p quo 2      -- used for odd p : (p-1)/2
+     q : NonNegativeInteger := size()$K
+     q' : NonNegativeInteger := q quo 2	-- used for odd q : (q-1)/2
+     X : PolK := monomial(1, 1)
+     primeKdim : NonNegativeInteger :=
+         q_quo_p : NonNegativeInteger := q quo p ;  e : NonNegativeInteger := 1
+         while q_quo_p > 1 repeat (e := e + 1 ; q_quo_p := q_quo_p quo p)
+         e
+     
+     initialize(): Void() ==
+        q : NonNegativeInteger := size()$K
+        q' : NonNegativeInteger := q quo 2	-- used for odd q : (q-1)/2
+	primeKdim : NonNegativeInteger :=
+          q_quo_p : NonNegativeInteger := q quo p ;  e:NonNegativeInteger := 1
+          while q_quo_p > 1 repeat (e := e + 1 ; q_quo_p := q_quo_p quo p)
+          e
+	  
+     exp(P : PolK, n : NonNegativeInteger, R : PolK) : PolK ==
+        PP : PolK := P rem R ;  Q : PolK := 1
+        repeat
+           if odd?(n) then Q := Q * PP rem R
+           (n := n quo 2) = 0 => leave
+           PP := PP * PP rem  R
+        return Q
+     
+     pPowers(P : PolK) : PrimitiveArray(PolK) ==  -- P is monic
+        n := degree(P)
+        result : PrimitiveArray(PolK) := new(n, 1)
+        result(1) := Qi := Q := exp(X, p, P)
+        for i in 2 .. n-1 repeat (Qi := Qi*Q rem P ; result(i) := Qi)
+        return result
+     
+     pExp(Q : PolK, Xpowers : PrimitiveArray(PolK)) : PolK ==
+         Q' : PolK := 0
+         while Q ^= 0 repeat
+             Q':=Q' +primeFrobenius(leadingCoefficient(Q)) * Xpowers(degree(Q))
+             Q := reductum(Q)
+         return Q'
+     
+     pTrace(Q : PolK, d : NonNegativeInteger, P : PolK,
+            Xpowers : PrimitiveArray(PolK)) : PolK ==
+         Q : PolK := Q rem P
+         result : PolK := Q
+         for i in 1 .. d-1 repeat result := Q + pExp(result, Xpowers)
+         return result rem P
+     
+     random(n : NonNegativeInteger) : PolK ==
+        repeat
+           if (deg := (random(n)$Integer)::NonNegativeInteger) > 0 then leave
+        repeat
+           if (x : K := random()$K) ^= 0 then leave
+        result : PolK :=
+           monomial(x, deg) + +/[monomial(random()$K, i) for i in 0 .. deg-1]
+        return result
+     
+     internalFactorCZ(P : PolK,          -- P monic-squarefree
+           d:NonNegativeInteger, Xpowers:PrimitiveArray(PolK)) : List(PolK) ==
+     
+         listOfFactors : List(PolK) := [P]
+         degree(P) = d => return listOfFactors
+         result : List(PolK) := []
+         pDim : NonNegativeInteger := d * primeKdim
+         Q : PolK := P
+     
+         repeat
+             G := pTrace(random(degree(Q)), pDim, Q, Xpowers)
+             if p > 2 then G := exp(G, p', Q) - 1
+             Q1 := gcd(G, Q) ;  d1 := degree(Q1)
+             if d1 > 0 and d1 < degree(Q) then
+                 listOfFactors := rest(listOfFactors)
+                 if d1 = d then result := cons(Q1, result)
+                          else listOfFactors := cons(Q1, listOfFactors)
+                 Q1 := Q quo Q1 ;  d1 := degree(Q1)
+                 if d1 = d then result := cons(Q1, result)
+                          else listOfFactors := cons(Q1, listOfFactors)
+                 if empty?(listOfFactors) then leave
+                 Q := first(listOfFactors)
+         return result
+
+     internalFactorSquareFree(P:PolK):List(PolK) ==   -- P is monic-squareFree
+         degree(P) = 1 => [P]
+         result : List(PolK) := []
+         Xpowers : PrimitiveArray(PolK) := pPowers(P)
+         S : PolK := Xpowers(1)
+         for j in 1..primeKdim-1 repeat S := pExp(S, Xpowers)
+         for i in 1 .. repeat  -- S = X**(q**i) mod P
+             if degree(R := gcd(S - X, P)) > 0 then
+                 result := concat(internalFactorCZ(R, i, Xpowers), result)
+                 if degree (P) = degree (R) then return result
+                 P := P quo R
+                 if i >= degree(P) quo 2 then return cons(P, result)
+                 for j in 0 .. degree(P)-1 repeat Xpowers(j):=Xpowers(j) rem P
+                 S := S rem P
+             else if i >= degree(P) quo 2 then return cons(P, result)
+             for j in 1 .. primeKdim repeat S := pExp(S, Xpowers)
+     
+     internalFactor(P:PolK, sqrfree:PolK -> Factored(PolK)) : Factored(PolK) ==
+         result : Factored(PolK)
+         if (d := minimumDegree(P)) > 0 then
+             P := P quo monomial(1, d)
+             result := primeFactor(X, d)
+         else
+             result := 1
+         degree(P) = 0 => P * result
+         if (lcP := leadingCoefficient(P)) ^= 1 then P := inv(lcP) * P
+         degree(P) = 1 => lcP::PolK * primeFactor(P, 1) * result
+         sqfP : Factored(PolK) := sqrfree(P)
+         for x in factors(sqfP) repeat
+             xFactors : List(PolK) := internalFactorSquareFree(x.factor)
+             result:=result * */[primeFactor(Q, x.exponent) for Q in xFactors]
+         return lcP::PolK * result
+     
+     factorUsingYun(P : PolK) : Factored(PolK) == internalFactor(P, Yun)
+
+     factorUsingMusser(P : PolK) : Factored(PolK) == internalFactor(P, Musser)
+
+     factor(P : PolK) : Factored(PolK) == 
+        initialize()
+        factorUsingYun(P)
+     
+     factorSquareFree(P : PolK) : List(PolK) ==
+        degree(P) = 0 => []
+        discriminant(P) = 0 => error("factorSquareFree : non quadratfrei")
+        if (lcP := leadingCoefficient(P)) ^= 1 then P := inv(lcP) * P
+        return internalFactorSquareFree(P)
+     
+     factorCantorZassenhaus(P : PolK, d : NonNegativeInteger) : List(PolK) ==
+        if (lcP := leadingCoefficient(P)) ^= 1 then P := inv(lcP) * P
+        degree(P) = 1 => [P]
+        return internalFactorCZ(P, d, pPowers(P))
+     
+     qExp(Q : PolK, XqPowers : PrimitiveArray(PolK)) : PolK ==
+        Q' : PolK := 0
+        while Q ^= 0 repeat
+           Q' := Q' + leadingCoefficient(Q) * XqPowers(degree(Q))
+           Q := reductum(Q)
+        return Q'
+
+     qPowers (Xq:PolK, P:PolK) : PrimitiveArray(PolK) ==  -- Xq = X**q mod P
+        n := degree(P)
+        result : PrimitiveArray(PolK) := new(n, 1)
+        result(1) := Q := Xq
+        for i in 2 .. n-1 repeat (Q := Q*Xq rem P ; result(i) := Q)
+        return result
+
+     discriminantTest?(P : PolK) : Boolean ==
+         (delta : K := discriminant(P)) = 0 => true
+         StickelbergerTest : Boolean := (delta ** q' = 1) = even?(degree(P))
+         return StickelbergerTest
+
+     evenCharacteristicIrreducible?(P : PolK) : Boolean ==
+         (n := degree(P)) = 0 => false
+         n = 1 => true
+         degree(gcd(P, D(P))) > 0 => false
+         if (lcP := leadingCoefficient(P)) ^= 1 then P := inv(lcP) * P
+         S : PolK := exp(X, q, P)
+         if degree(gcd(S - X, P)) > 0 then
+            return false
+         if n < 4 then return true
+         maxDegreeToTest : NonNegativeInteger := n quo 2
+         XqPowers : PrimitiveArray(PolK) := qPowers(S, P)
+         for i in 2 .. maxDegreeToTest repeat
+            S := qExp(S, XqPowers)
+            if degree(gcd(S - X, P)) > 0 then
+               return false
+         return true
+
+     oddCharacteristicIrreducible?(P : PolK) : Boolean ==
+         (n := degree(P)) = 0 => false
+         n = 1 => true
+         discriminantTest?(P) => false
+         if (lcP := leadingCoefficient(P)) ^= 1 then P := inv(lcP) * P
+         S : PolK := exp(X, q, P)
+         if degree(gcd(S - X, P)) > 0 then
+            return false
+         if n < 6  then return true
+         maxDegreeToTest : NonNegativeInteger := n quo 3
+         XqPowers : PrimitiveArray(PolK) := qPowers(S, P)
+         for i in 2 .. maxDegreeToTest repeat
+            S := qExp(S, XqPowers)
+            if degree(gcd(S - X, P)) > 0 then
+               return false
+         return true
+     if p = 2 then
+         irreducible?(P : PolK) : Boolean == evenCharacteristicIrreducible?(P)
+     else
+         irreducible?(P : PolK) : Boolean == oddCharacteristicIrreducible?(P)
+
+@
+<<FFFACTSE.dotabb>>=
+"FFFACTSE" [color="#FF4488",href="bookvol10.4.pdf#nameddest=FFFACTSE"]
+"FFSQFR" [color="#FF4488",href="bookvol10.4.pdf#nameddest=FFSQFR"]
+"PFECAT" [color="#4488FF",href="bookvol10.2.pdf#nameddest=PFECAT"]
+"FFFACTSE" -> "FFSQFR"
+"FFFACTSE" -> "PFECAT"
+
+@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package FFF FiniteFieldFunctions}
 \pagehead{FiniteFieldFunctions}{FFF}
@@ -154004,6 +154283,7 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 <<package FORDER FindOrderFinite>>
 <<package FAMR2 FiniteAbelianMonoidRingFunctions2>>
 <<package FDIV2 FiniteDivisorFunctions2>>
+<<package FFFACTSE FiniteFieldFactorizationWithSizeParseBySideEffect>>
 <<package FFF FiniteFieldFunctions>>
 <<package FFHOM FiniteFieldHomomorphisms>>
 <<package FFPOLY FiniteFieldPolynomialPackage>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index 344afd6..1fb01cf 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -23912,6 +23912,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|FileName| . FNAME)
    (|FiniteAbelianMonoidRingFunctions2| . FAMR2)
    (|FiniteDivisorFunctions2| . FDIV2)
+   (|FiniteFieldFactorizationWithSizeParseBySideEffect| . FFFACTSE)
    (|FiniteField| . FF)
    (|FiniteFieldCyclicGroup| . FFCG)
    (|FiniteFieldPolynomialPackage2| . FFPOLY2)
diff --git a/books/ps/v104finitefieldfactorizationwithsizeparsebysideeffect.ps b/books/ps/v104finitefieldfactorizationwithsizeparsebysideeffect.ps
new file mode 100644
index 0000000..d433028
--- /dev/null
+++ b/books/ps/v104finitefieldfactorizationwithsizeparsebysideeffect.ps
@@ -0,0 +1,313 @@
+%!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: (atend)
+%%BoundingBox: (atend)
+%%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 202 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 166 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% FFFACTSE
+gsave
+[ /Rect [ 36 72 122 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=FFFACTSE) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 122 108 moveto
+36 108 lineto
+36 72 lineto
+122 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 122 108 moveto
+36 108 lineto
+36 72 lineto
+122 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+44 85.9 moveto 70 (FFFACTSE) alignedtext
+grestore
+% FFSQFR
+gsave
+[ /Rect [ 0 0 70 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=FFSQFR) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 70 36 moveto
+0 36 lineto
+0 0 lineto
+70 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 70 36 moveto
+0 36 lineto
+0 0 lineto
+70 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+7.5 13.9 moveto 55 (FFSQFR) alignedtext
+grestore
+% FFFACTSE->FFSQFR
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 68 72 moveto
+63 64 57 54 51 45 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 53.92 43.04 moveto
+46 36 lineto
+47.8 46.44 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 53.92 43.04 moveto
+46 36 lineto
+47.8 46.44 lineto
+closepath stroke
+grestore
+% PFECAT
+gsave
+[ /Rect [ 88 0 158 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=PFECAT) >>
+  /Subtype /Link
+/ANN pdfmark
+0.606 0.733 1.000 nodecolor
+newpath 158 36 moveto
+88 36 lineto
+88 0 lineto
+158 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.606 0.733 1.000 nodecolor
+newpath 158 36 moveto
+88 36 lineto
+88 0 lineto
+158 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+96 13.9 moveto 54 (PFECAT) alignedtext
+grestore
+% FFFACTSE->PFECAT
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 90 72 moveto
+95 64 101 54 107 45 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 110.2 46.44 moveto
+112 36 lineto
+104.08 43.04 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 110.2 46.44 moveto
+112 36 lineto
+104.08 43.04 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+%%BoundingBox: 36 36 202 152
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 864d216..0193e36 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100421 tpd src/axiom-website/patches.html 20100421.01.tpd.patch
+20100421 tpd src/algebra/Makefile add FFFACTSE
+20100421 tpd books/bookvol5.pamphlet add FFFACTSE
+20100421 tpd books/ps/v104finitefieldfactorizationwithsizeparsebysideeffect.ps
+20100421 tpd books/bookvol10.4 add FFFACTSE
 20100420 tpd src/axiom-website/patches.html 20100420.01.tpd.patch
 20100420 tpd zips/gcl-2.6.8pre4.unixport.makefile.patch
 20100420 tpd zips/gcl-2.6.8pre4.unixport.init_gcl.lsp.in.patch
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 30afa87..fea2dab 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -8691,12 +8691,13 @@ LAYER11=\
 
 @
 \subsection{Layer12}
-Depends on: DIOPS DPOLCAT FINRALG FRAC RMATCAT RRCC UPXSCAT\\
+Depends on: DIOPS DPOLCAT FINRALG FRAC RMATCAT RRCC UPXSCAT FFSQFR\\
 Used by next layer: DIAGG FRAMALG MDAGG SMATCAT UPXSCCA
 <<layer12>>=
 
 LAYER12=\
   ${OUT}/DIAGG.o   ${OUT}/DIAGG-.o   ${OUT}/DSMP.o     ${OUT}/EXPUPXS.o \
+  ${OUT}/FFFACTSE.o \
   ${OUT}/FRAMALG.o ${OUT}/FRAMALG-.o ${OUT}/MDAGG.o    ${OUT}/ODPOL.o   \
   ${OUT}/PLOT.o    ${OUT}/RMCAT2.o   ${OUT}/ROIRC.o    ${OUT}/SDPOL.o   \
   ${OUT}/SMATCAT.o ${OUT}/SMATCAT-.o ${OUT}/TUBETOOL.o ${OUT}/UPXSCCA.o \
@@ -8706,7 +8707,7 @@ LAYER12=\
 @
 <<layerpic>>=
 /* layer 12 */
-/* depends on: DIOPS DPOLCAT FINRALG FRAC RMATCAT RRCC UPXSCAT */
+/* depends on: DIOPS DPOLCAT FFSQFRFINRALG FRAC RMATCAT RRCC UPXSCAT */
 
 "DFLOAT" [color="#88FF44",href="bookvol10.3.pdf#nameddest=DFLOAT",
           shape=ellipse]
@@ -8767,6 +8768,28 @@ LAYER12=\
 /*"EXPUPXS" -> {"EVALAB"; "IEVALAB"; "DIFEXT"; "FLINEXP"; "PATAB"; "FPATMAB"}*/
 /*"EXPUPXS" -> {"TYPE"; "PFECAT"}*/
 
+"FFFACTSE" [color="#FF4488",href="bookvol10.4.pdf#nameddest=FFFACTSE"]
+/*"FFFACTSE" -> {"FFIELDC"; "FPC"; "FIELD"; "EUCDOM"; "PID"}*/
+/*"FFFACTSE" -> {"GCDDOM"; "INTDOM"; "COMRING"; "RING"; "RNG"}*/
+/*"FFFACTSE" -> {"ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"}*/
+/*"FFFACTSE" -> {"SETCAT"; "BASTYPE"; "KOERCE"; "SGROUP"}*/
+/*"FFFACTSE" -> {"MONOID"; "LMODULE"; "BMODULE"; "RMODULE"}*/
+/*"FFFACTSE" -> {"ALGEBRA"; "MODULE"; "ENTIRER"; "UFD"}*/ 
+/*"FFFACTSE" -> {"DIVRING"; "CHARNZ"; "FINITE"; "STEP"; "DIFRING"}*/
+/*"FFFACTSE" -> {"UPOLYC"; "POLYCAT"; "PDRING"; "FAMR"; "AMR"}*/
+/*"FFFACTSE" -> {"CHARZ"; "FRETRCT"; "RETRACT"; "EVALAB"}*/
+/*"FFFACTSE" -> {"IEVALAB"; "FLINEXP"; "LINEXP"; "ORDSET"}*/
+/*"FFFACTSE" -> {"KONVERT"; "PATMAB"}*/
+"FFFACTSE" -> "PFECAT"
+"FFFACTSE" -> "FFSQFR"
+/*"FFFACTSE" -> {"ELTAB"; "DIFEXT"}*/
+/*"FFFACTSE" -> {"NNI"; "INT"; "PI"; "PRIMARR"; "A1AGG"; "FLAGG"}*/
+/*"FFFACTSE" -> {"LNAGG"; "IXAGG"; "HOAGG"; "AGG"; "TYPE"}*/
+/*"FFFACTSE" -> {"ELTAGG"; "CLAGG"; "BOOLEAN"; "SINT"; "LIST"}*/
+/*"FFFACTSE" -> {"ILIST"; "LSAGG-"; "STAGG-"; "INS-"; "INS"}*/
+/*"FFFACTSE" -> {"OINTDOM"; "ORDRING"; "OAGROUP"; "OCAMON"}*/
+/*"FFFACTSE" -> {"OAMON"; "OASGP"; "CFCAT"; "REAL"}*/
+
 "FRAMALG" [color="#4488FF",href="bookvol10.2.pdf#nameddest=FRAMALG"]
 "FRAMALG" -> "FINRALG"
 /*"FRAMALG" -> {"ALGEBRA"; "RING"; "RNG"; "ABELGRP"; "CABMON"; "ABELMON"}*/
@@ -15572,6 +15595,7 @@ New algebra files can depend on new algebra files. Since these files
 are not part of the default database we need to be explicit about the
 new files being loaded with the library command.
 
+This block of files is necessary to build the GUESS package.
 <<newcode>>=
 
 FFFGFDEPS = FAMR2 FFFG
@@ -15751,6 +15775,42 @@ ${MID}/GUESSUP.nrlib/code.o: ${MID}/GUESSUP.spad
 
 @
 
+This block of files is necessary to build the PAPP package.
+
+The domain FFFACTSE does an import of the domain FFSQFR in order to 
+get the Yun function. This works in the interpreter because FFSQFR is
+already in the database after the build. At build time FFSQFR has already
+been compiled but the import does not load the library. We could fix this
+several ways. The optimal way seems to be to have the compimport function
+load the NRLIB. A sub-optimal but successful compromise is to load the
+required file by hand which we do here. Other alternative solutions might
+be
+\begin{itemize}
+\item does bootstrap mode just compile headers? is that all we need?
+\item we could add FFSQFR to the bootstrap layer. However, we are trying
+to shrink and elimiate bootstrap code so this is not good.
+\item we would rebuild the database after every layer. this eliminates
+several problems but we need to investigate what it breaks.
+\item we would rebuild the database after every compile. this eliminates
+several problems but we need to investigate what it breaks.
+\item as mentioned, we could have import do an implicit library call to
+load the imported file if it is not already known.
+\end{itemize}
+<<newcode>>=
+
+PAPPDEPS = FFSQFR
+
+${MID}/FFFACTSE.nrlib/code.o: ${MID}/FFFACTSE.spad
+	@echo P1 making ${MID}/FFFACTSE.nrlib/code.o from ${MID}/FFFACTSE.spad
+	@ (cd ${MID} ; \
+	   if [ -z "${NOISE}" ] ; then \
+	    echo -e ")lib ${PAPPDEPS} \n )co FFFACTSE.spad" | ${INTERPSYS}  ; \
+           else \
+	    echo -e ")lib ${PAPPDEPS} \n )co FFFACTSE.spad" \
+	      | ${INTERPSYS} >${TMP}/trace ; \
+	   fi )
+
+@
 \section{Broken Files}
 These files are Aldor files
 \begin{verbatim}
@@ -16488,6 +16548,7 @@ SPADHELP=\
  ${HELP}/FactoredFunctions2.help \
  ${HELP}/File.help \
  ${HELP}/FileName.help \
+ ${HELP}/FiniteFieldFactorizationWithSizeParseBySideEffect.help \
  ${HELP}/FiniteFieldSquareFreeDecomposition.help \
  ${HELP}/FlexibleArray.help \
  ${HELP}/Float.help \
@@ -16645,6 +16706,7 @@ REGRESS= \
  FactoredFunctions2.regress \
  File.regress \
  FileName.regress \
+ FiniteFieldFactorizationWithSizeParseBySideEffect.regress \
  FiniteFieldSquareFreeDecomposition.regress \
  FlexibleArray.regress \
  Float.regress \
@@ -17101,6 +17163,23 @@ ${HELP}/FileName.help: ${BOOKS}/bookvol10.3.pamphlet
             >${INPUT}/FileName.input
 	@echo "FileName (FNAME)" >>${HELPFILE}
 
+${HELP}/FiniteFieldFactorizationWithSizeParseBySideEffect.help: \
+           ${BOOKS}/bookvol10.4.pamphlet
+	@echo 7303 create \
+           FiniteFieldFactorizationWithSizeParseBySideEffect.help from \
+           ${BOOKS}/bookvol10.4.pamphlet
+	@${TANGLE} -R"FiniteFieldFactorizationWithSizeParseBySideEffect.help" \
+           ${BOOKS}/bookvol10.4.pamphlet \
+           >${HELP}/FiniteFieldFactorizationWithSizeParseBySideEffect.help
+	@cp ${HELP}/FiniteFieldFactorizationWithSizeParseBySideEffect.help \
+            ${HELP}/FFFACTSE.help
+	@${TANGLE} \
+            -R"FiniteFieldFactorizationWithSizeParseBySideEffect.input" \
+            ${BOOKS}/bookvol10.4.pamphlet \
+            >${INPUT}/FiniteFieldFactorizationWithSizeParseBySideEffect.input
+	@echo "FiniteFieldFactorizationWithSizeParseBySideEffect (FFFACTSE)"\
+            >>${HELPFILE}
+
 ${HELP}/FiniteFieldSquareFreeDecomposition.help: ${BOOKS}/bookvol10.4.pamphlet
 	@echo 7305 create FiniteFieldSquareFreeDecomposition.help from \
            ${BOOKS}/bookvol10.4.pamphlet
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 26c6afd..c6d2ba7 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2649,5 +2649,7 @@ books/bookvol10.3 improve UnivariateTaylorSeriesCZero docs<br/>
 books/bookvol4 document how to make graphs in algebra books<br/>
 <a href="patches/20100420.01.tpd.patch">20100420.01.tpd.patch</a>
 zips/gcl-2.6.8pre4.tgz added, fix for ubuntu 9.10<br/>
+<a href="patches/20100421.01.tpd.patch">20100421.01.tpd.patch</a>
+books/bookvol10.4 add FiniteFieldFactorizationWithSizeParseBySideEffect<br/>
  </body>
 </html>
