diff --git a/changelog b/changelog
index 652e829..684be9c 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,18 @@
+20071215 tpd src/interp/bookvol5 browse and top-level command handling
+20071215 tpd src/interp/setq.lisp move command initialization to bookvol5
+20071215 tpd src/interp/nci.lisp move ncloopInclude to bookvol5
+20071215 tpd src/interp/intint.lisp move setCurrentLine to bookvol5
+20071215 tpd src/interp/int-top.boot move ncloopCommand, etc. to bookvol5
+20071215 tpd src/interp/incl.boot move incBiteOff to bookvol5
+20071215 tpd src/interp/i-syscmd.boot move $SYSCOMMANDS to bookvol5
+20071215 tpd src/interp/bootfuns.lisp move $systemCommands to bookvol5
+20071215 tpd src/hyper/Makefile expand bookvol11 for the browser
+20071215 tpd src/algebra/axserver.spad algebra code to support AJAX
+20071215 tpd src/hyper/axbook.tgz add book pages for browser
+20071215 tpd src/hyper/bigbayou.png add browse rootpage background
+20071215 tpd src/hyper/bookvol11 add the pages for the browser
+20071215 tpd src/hyper/doctitle.png add headline for browser pages
+20071214 tpd faq FAQ 44: I don't have the math fonts
 20071208 tpd src/algebra/axserver.spad add makeDBPage, getShow
 20071208 tpd src/interp/http.lisp add replace-entities
 20071206 tpd src/interp/daase.lisp find the right sourcefile (bug 7020)
diff --git a/faq b/faq
index 2083417..0465fd7 100644
--- a/faq
+++ b/faq
@@ -42,6 +42,7 @@ FAQ 40: Text entry fails in the hypertex browser window
 FAQ 41: How can I work in lisp from Axiom?
 FAQ 42: How can I output equations as lisp s-expressions?
 FAQ 43: Is Axiom's License compatible with the GPL?
+FAQ 44: I don't have the math fonts
 
 ===================================================================
 FAQ 0: How do I use Axiom?
@@ -1590,3 +1591,17 @@ which we quote here:
 Please note that all legal discussions should occur ONLY on the
 axiom-legal@nongnu.org mailing list and not copied to the other
 developer mailing lists. 
+
+===================================================================
+FAQ 44: I don't have the math fonts
+===================================================================
+View the file zips/mathops.html to see if you have all the symbols.
+See http://www.unicode.org/charts/PDF/U2200.pdf
+
+There is a file zips/axiomfonts.tgz which contains some of the fonts
+(mostly the Stix fonts which recently became available). Other 
+missing fonts can be found at:
+
+http://www.stixfonts.org
+http://www.alanwood.net/unicode
+http://support.wolfram.com/mathematica/systems/windows/general/latestfonts.html
diff --git a/src/algebra/axserver.spad.pamphlet b/src/algebra/axserver.spad.pamphlet
index 57ab398..77910f1 100644
--- a/src/algebra/axserver.spad.pamphlet
+++ b/src/algebra/axserver.spad.pamphlet
@@ -28,8 +28,9 @@ AxiomServer: public == private where
    getFile: (SExpression,String) -> Void
    getCommand: (SExpression,String) -> Void
    getDescription: String -> String
-   getLisp: (SExpression,String) -> Void
-   getShow: (SExpression,String) -> Void
+   getInterp: (SExpression,String) -> Void
+   getLisp:   (SExpression,String) -> Void
+   getShow:   (SExpression,String) -> Void
    lastStep: () -> String
    lastType: () -> String
    formatMessages: String -> String
@@ -42,7 +43,7 @@ AxiomServer: public == private where
 
    getDatabase(constructor:String, key:String):String ==
      answer:=string GETDATABASE(INTERN$Lisp constructor,INTERN$Lisp key)$Lisp
-     WriteLine$Lisp concat ["getDatabase: ",constructor," ",key," ",answer]
+--     WriteLine$Lisp concat ["getDatabase: ",constructor," ",key," ",answer]
      answer
 
 @
@@ -51,7 +52,7 @@ When it gets a input on the socket it calls the server
 function on the socket input.
 <<package AXSERV AxiomServer>>=
    axServer(port:Integer,serverfunc:SExpression->Void):Void ==
-     WriteLine("socketServer")$Lisp
+     WriteLine$Lisp "listening on port 8085"
      s := SiSock(port,serverfunc)$Lisp
      -- To listen for just one connection and then close the socket
      -- uncomment i := 0.
@@ -77,7 +78,7 @@ A POST request starts with
 <<package AXSERV AxiomServer>>=
 
    multiServ(s:SExpression):Void ==
-     WriteLine("multiServ begin")$Lisp
+--     WriteLine("multiServ begin")$Lisp
      headers:String := ""
      char:String
      -- read in the http headers
@@ -85,13 +86,13 @@ A POST request starts with
        STRING(READ_-CHAR_-NO_-HANG(s,NIL$Lisp,'EOF)$Lisp)$Lisp) ^= "EOF"_
         repeat
          headers := concat [headers,char]
-     sayTeX$Lisp headers
+--     sayTeX$Lisp headers
      StringMatch("([^ ]*)", headers)$Lisp
      u:UniversalSegment(Integer)
      u := segment(MatchBeginning(1)$Lisp+1,_
                   MatchEnd(1)$Lisp)$UniversalSegment(Integer)
      reqtype:String := headers.u
-     sayTeX$Lisp  concat ["request type: ",reqtype]
+--     sayTeX$Lisp  concat ["request type: ",reqtype]
      if  reqtype = "GET" then
          StringMatch("GET ([^ ]*)",headers)$Lisp
          u:UniversalSegment(Integer)
@@ -104,6 +105,12 @@ A POST request starts with
          u := segment(MatchBeginning(1)$Lisp+1,_
                       MatchEnd(1)$Lisp)$UniversalSegment(Integer)
          getCommand(s,headers.u)
+     if reqtype = "POST" and StringMatch("interpcall=(.*)$",headers)$Lisp > 0
+      then
+         u:UniversalSegment(Integer)
+         u := segment(MatchBeginning(1)$Lisp+1,_
+                      MatchEnd(1)$Lisp)$UniversalSegment(Integer)
+         getInterp(s,headers.u)
      if reqtype = "POST" and StringMatch("lispcall=(.*)$",headers)$Lisp > 0
       then
          u:UniversalSegment(Integer)
@@ -116,8 +123,8 @@ A POST request starts with
          u := segment(MatchBeginning(1)$Lisp+1,_
                       MatchEnd(1)$Lisp)$UniversalSegment(Integer)
          getShow(s,headers.u)
-     WriteLine("multiServ end")$Lisp
-     WriteLine("")$Lisp
+--     WriteLine("multiServ end")$Lisp
+--     WriteLine("")$Lisp
 
 @
 \subsection{getFile}
@@ -127,7 +134,7 @@ then we need to parse the parameters and dynamically construct the
 file contents.
 <<package AXSERV AxiomServer>>=
    getFile(s:SExpression,pathvar:String):Void ==
-     WriteLine("")$Lisp
+--     WriteLine("")$Lisp
      WriteLine$Lisp concat ["getFile: ",pathvar]
      params:=split(pathvar,char "?")
      if #params = 1 
@@ -155,7 +162,7 @@ file contents.
      page:=page "_"http://www.w3.org/TR/xthml1/DTD/xhtml1-strict.dtd_">"
      page:=page "<html xmlns=_"http://www.w3.org/1999/xhtml_">"
      page:=page "<head><title>Error</title></head><body>" msg "</body></html>"
-     WriteLine(page)$Lisp
+--     WriteLine(page)$Lisp
      page
 @
 \subsection{getDescription}
@@ -180,7 +187,7 @@ and do a lookup for the source file.
                  abbreviation:String,_
                  dom:String):String ==
      sourcekey:="@<<" constructorkind " " abbreviation " " dom ">>"
-     WriteLine(sourcekey)$Lisp
+--     WriteLine(sourcekey)$Lisp
      sourcefile:=lowerCase last split(getDatabase(dom,"SOURCEFILE"),char "/") 
      sourcefile:=sourcefile ".pamphlet"
 
@@ -262,13 +269,13 @@ We have q which is a stream which contains the file. We read the file
 into a string-stream to get it all into one string. We return the string.
 <<package AXSERV AxiomServer>>=
    readTheFile(q:SExpression):String ==
-     WriteLine("begin reading file")$Lisp
+--     WriteLine("begin reading file")$Lisp
      r := MAKE_-STRING_-OUTPUT_-STREAM()$Lisp
      SiCopyStream(q,r)$Lisp
      filestream:String := GET_-OUTPUT_-STREAM_-STRING(r)$Lisp
      CLOSE(r)$Lisp
      CLOSE(q)$Lisp
-     WriteLine("end reading file")$Lisp
+--     WriteLine("end reading file")$Lisp
      filestream
 
 @
@@ -287,7 +294,7 @@ prepend it to the file. The resulting string is output to the socket.
      file := concat ["Content-Type: ",contentType,nl,file]
      file := concat ["HTTP/1.1 200 OK",nl,file]
      file := concat [file,filestream]
-     WriteLine(file)$Lisp
+--     WriteLine(file)$Lisp
      f:=MAKE_-STRING_-INPUT_-STREAM(file)$Lisp
      SiCopyStream(f,s)$Lisp
      CLOSE(f)$Lisp
@@ -345,15 +352,75 @@ corresponding functions in the browser HTML.
                   <div class=_"algebra_">",algebra,"</div>_
                   <div class=_"mathml_">",mathml,"</div>_
                   <div class=_"type_">",lastType(),"</div>"]       
-       WriteLine$Lisp concat ["mathml answer: ",mathml]
-       WriteLine$Lisp concat ["algebra answer: ",algebra]
+--       WriteLine$Lisp concat ["mathml answer: ",mathml]
+--       WriteLine$Lisp concat ["algebra answer: ",algebra]
        q:=MAKE_-STRING_-INPUT_-STREAM(axans)$Lisp
        SiCopyStream(q,s)$Lisp
        CLOSE(q)$Lisp
        CLOSE(s)$Lisp
 
+@
+
+\subsection{getInterp}
+The getInterp function is invoked when the HTTP request is a POST
+and contains the string "command". Essentially the game here is
+to rebind the various output streams used by Axiom so we can
+capture the normal output. This function returns a set of HTML 5 div
+blocks:
+\begin{enumerate}
+\item stepnum, the value of lastStep()
+\item command, the value of the  command variable
+\item algebra, the value of the algebra variable
+\item mathml, the value of the mathml variable
+\item type, the value of lastType()
+\end{enumerate}
+The HTML functions in the hyperdoc browser depend on the order
+of these variables so do not change this without changing the
+corresponding functions in the browser HTML.
+<<package AXSERV AxiomServer>>=
+   getInterp(s:SExpression,command:String):Void ==
+       WriteLine$Lisp concat ["getInterp: ",command]
+       SETQ(tmpmathml$Lisp, MAKE_-STRING_-OUTPUT_-STREAM()$Lisp)$Lisp
+       SETQ(tmpalgebra$Lisp, MAKE_-STRING_-OUTPUT_-STREAM()$Lisp)$Lisp
+       SETQ(savemathml$Lisp, _$texOutputStream$Lisp)$Lisp
+       SETQ(savealgebra$Lisp, _$algebraOutputStream$Lisp)$Lisp
+       SETQ(_$texOutputStream$Lisp,tmpmathml$Lisp)$Lisp
+       SETQ(_$algebraOutputStream$Lisp,tmpalgebra$Lisp)$Lisp
+       ans := string parseAndEvalToStringEqNum$Lisp command
+       SETQ(resultmathml$Lisp,_
+            GET_-OUTPUT_-STREAM_-STRING(_$texOutputStream$Lisp)$Lisp)$Lisp
+       SETQ(resultalgebra$Lisp,_
+            GET_-OUTPUT_-STREAM_-STRING(_$algebraOutputStream$Lisp)$Lisp)$Lisp
+       SETQ(_$texOutputStream$Lisp,savemathml$Lisp)$Lisp
+       SETQ(_$algebraOutputStream$Lisp,savealgebra$Lisp)$Lisp
+       CLOSE(tmpmathml$Lisp)$Lisp
+       CLOSE(tmpalgebra$Lisp)$Lisp
+       -- Since strings returned from axiom are going to be displayed in html I
+       -- should really check for the characters &,<,> and replace them with
+       -- &amp;,&lt;,&gt;.  
+       -- At present I only check for ampersands in formatMessages.
+       mathml:String := string(resultmathml$Lisp)
+       algebra:String := string(resultalgebra$Lisp)
+       algebra := formatMessages(algebra)
+       -- At this point mathml contains the mathml for the output but does not
+       -- include step number or type information.  
+       -- We should also save the command.
+       -- I get the type and step number from the $internalHistoryTable
+       axans:String := _
+         concat ["<div class=_"stepnum_">", lastStep(), "</div>_
+                  <div class=_"command_">", command, "</div>_
+                  <div class=_"algebra_">",algebra,"</div>_
+                  <div class=_"mathml_">",mathml,"</div>_
+                  <div class=_"type_">",lastType(),"</div>"]       
+--       WriteLine$Lisp concat ["mathml answer: ",mathml]
+--       WriteLine$Lisp concat ["algebra answer: ",algebra]
+       q:=MAKE_-STRING_-INPUT_-STREAM(axans)$Lisp
+       SiCopyStream(q,s)$Lisp
+       CLOSE(q)$Lisp
+       CLOSE(s)$Lisp
 
 @
+
 \subsection{getLisp}
 The getLisp function is invoked when the HTTP request is a POST
 and contains the string "lispcall".
@@ -362,8 +429,8 @@ and contains the string "lispcall".
        WriteLine$Lisp concat ["getLisp: ",command]
        evalresult:=EVAL(READ_-FROM_-STRING(command)$Lisp)$Lisp
        mathml:String:=string(evalresult)
-       WriteLine$Lisp concat ["getLisp: after ",mathml]
-       WriteLine$Lisp concat ["getLisp output: ",mathml]
+--       WriteLine$Lisp concat ["getLisp: after ",mathml]
+--       WriteLine$Lisp concat ["getLisp output: ",mathml]
        SETQ(tmpalgebra$Lisp, MAKE_-STRING_-OUTPUT_-STREAM()$Lisp)$Lisp
        SETQ(savemathml$Lisp, _$texOutputStream$Lisp)$Lisp
        SETQ(savealgebra$Lisp, _$algebraOutputStream$Lisp)$Lisp
@@ -390,8 +457,8 @@ and contains the string "lispcall".
                  <div class=_"algebra_">",algebra,"</div>_
                  <div class=_"mathml_">",mathml,"</div>_
                  <div class=_"type_">",lastType(),"</div>"]       
-       WriteLine$Lisp concat ["mathml answer: ",mathml]
-       WriteLine$Lisp concat ["algebra answer: ",algebra]
+--       WriteLine$Lisp concat ["mathml answer: ",mathml]
+--       WriteLine$Lisp concat ["algebra answer: ",algebra]
        q:=MAKE_-STRING_-INPUT_-STREAM(axans)$Lisp
        SiCopyStream(q,s)$Lisp
        CLOSE(q)$Lisp
@@ -410,7 +477,7 @@ This is done in the call to replace-entitites (see http.lisp)
        realarg:=SUBSEQ(showarg,6)$Lisp
        show:=_
         "(progn (setq |$options| '((|operations|))) (|show| '|" realarg "|))"
-       WriteLine$Lisp concat ["getShow: ",show]
+--       WriteLine$Lisp concat ["getShow: ",show]
        SETQ(SAVESTREAM$Lisp,_*STANDARD_-OUTPUT_*$Lisp)$Lisp
        SETQ(_*STANDARD_-OUTPUT_*$Lisp,_
              MAKE_-STRING_-OUTPUT_-STREAM()$Lisp)$Lisp
@@ -445,7 +512,7 @@ This is done in the call to replace-entitites (see http.lisp)
                  <div class=_"algebra_">",algebra,"</div>_
                  <div class=_"mathml_">",mathml,"</div>_
                  <div class=_"type_">",lastType(),"</div>"]       
-       WriteLine$Lisp concat ["mathml answer: ",mathml]
+--       WriteLine$Lisp concat ["mathml answer: ",mathml]
        q:=MAKE_-STRING_-INPUT_-STREAM(axans)$Lisp
        SiCopyStream(q,s)$Lisp
        CLOSE(q)$Lisp
@@ -468,11 +535,11 @@ This is done in the call to replace-entitites (see http.lisp)
        string car(car(_$internalHistoryTable$Lisp)$Lisp)$Lisp
 
    formatMessages(str:String):String ==
-       WriteLine("formatMessages")$Lisp
+--       WriteLine("formatMessages")$Lisp
        -- I need to replace any ampersands with &amp; and may also need to
        -- replace < and > with &lt; and &gt;
        strlist:List String
-       WriteLine(str)$Lisp
+--       WriteLine(str)$Lisp
        strlist := split(str,char "&")
        str := ""
        -- oops, if & is the last character in the string this method
@@ -481,19 +548,19 @@ This is done in the call to replace-entitites (see http.lisp)
            str := concat [str,s,"&amp;"]
        strlen:Integer := #str
        str := str.(1..(#str - 5))
-       WriteLine(str)$Lisp
+--       WriteLine(str)$Lisp
        -- Here I split the string into lines and put each line in a "div".
        strlist := split(str, char string NewlineChar$Lisp)
        str := ""
-       WriteLine("formatMessages1")$Lisp
-       WriteLine(concat strlist)$Lisp
+--       WriteLine("formatMessages1")$Lisp
+--       WriteLine(concat strlist)$Lisp
        for s in strlist repeat
-           WriteLine(s)$Lisp
+--           WriteLine(s)$Lisp
            str := concat [str,"<div>",s,"</div>"]
        str
 
    getContentType(pathvar:String):String ==
-       WriteLine("getContentType begin")$Lisp
+--       WriteLine("getContentType begin")$Lisp
        -- set default content type
        contentType:String := "text/plain"
        -- need to test for successful match?
@@ -502,7 +569,7 @@ This is done in the call to replace-entitites (see http.lisp)
        u := segment(MatchBeginning(1)$Lisp+1,_
                     MatchEnd(1)$Lisp)$UniversalSegment(Integer)
        extension:String := pathvar.u
-       WriteLine$Lisp concat ["file extension: ",extension]
+--       WriteLine$Lisp concat ["file extension: ",extension]
        -- test for extensions: html, htm, xml, xhtml, js, css
        if extension = "html" then
            contentType:String := "text/html"
@@ -522,8 +589,8 @@ This is done in the call to replace-entitites (see http.lisp)
            contentType:String := "image/jpeg"
        else if extension = "jpeg" then
            contentType:String := "image/jpeg"
-       WriteLine$Lisp concat ["Content-Type: ",contentType]
-       WriteLine("getContentType end")$Lisp
+--       WriteLine$Lisp concat ["Content-Type: ",contentType]
+--       WriteLine("getContentType end")$Lisp
        contentType
 
 @
diff --git a/src/hyper/Makefile.pamphlet b/src/hyper/Makefile.pamphlet
index cae708f..7d43f87 100644
--- a/src/hyper/Makefile.pamphlet
+++ b/src/hyper/Makefile.pamphlet
@@ -162,11 +162,11 @@ ${MID}/sup.bitmap: ${IN}/bitmaps.pamphlet
 	@${TANGLE} -R"sup.bitmap" ${IN}/bitmaps.pamphlet >${MID}/sup.bitmap
 
 ${MID}/ht-icon: ${IN}/bitmaps.pamphlet
-	@echo 12 making ${OUT}/ht-icon from ${IN}/bitmaps.pamphlet
+	@echo 13 making ${OUT}/ht-icon from ${IN}/bitmaps.pamphlet
 	@${TANGLE} -R"hticon" ${IN}/bitmaps.pamphlet >${MID}/ht-icon
 
 ${DOC}/bitmaps.dvi: ${IN}/bitmaps.pamphlet 
-	@ echo 4 making ${DOC}/bitmaps.dvi from ${IN}/bitmaps.pamphlet
+	@ echo 14 making ${DOC}/bitmaps.dvi from ${IN}/bitmaps.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/bitmaps.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} bitmaps ; \
@@ -178,20 +178,20 @@ ${DOC}/bitmaps.dvi: ${IN}/bitmaps.pamphlet
 \section{cond}
 <<cond>>=
 ${MID}/cond.h: ${IN}/cond.pamphlet
-	@ echo 13 making ${MID}/cond.h from ${IN}/cond.pamphlet
+	@ echo 15 making ${MID}/cond.h from ${IN}/cond.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"cond.h" ${IN}/cond.pamphlet >cond.h )
 
 ${MID}/cond.c: ${IN}/cond.pamphlet
-	@ echo 14 making ${MID}/cond.c from ${IN}/cond.pamphlet
+	@ echo 16 making ${MID}/cond.c from ${IN}/cond.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/cond.pamphlet >cond.c )
 
 ${MIDOBJ}/cond.o: ${MID}/cond.c 
-	@ echo 15 making ${MIDOBJ}/cond.o from ${MID}/cond.c
+	@ echo 17 making ${MIDOBJ}/cond.o from ${MID}/cond.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/cond.c )
 
 ${DOC}/cond.dvi: ${IN}/cond.pamphlet 
-	@ echo 16 making ${DOC}/cond.dvi from ${IN}/cond.pamphlet
+	@ echo 18 making ${DOC}/cond.dvi from ${IN}/cond.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/cond.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} cond ; \
@@ -203,16 +203,16 @@ ${DOC}/cond.dvi: ${IN}/cond.pamphlet
 \section{debug}
 <<debug>>=
 ${MID}/debug.c: ${IN}/debug.pamphlet
-	@ echo 17 making ${MID}/debug.c from ${IN}/debug.pamphlet
+	@ echo 19 making ${MID}/debug.c from ${IN}/debug.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/debug.pamphlet >debug.c )
 
 ${MIDOBJ}/debug.o: ${MID}/debug.c 
-	@ echo 18 making ${MIDOBJ}/debug.o from ${MID}/debug.c
+	@ echo 20 making ${MIDOBJ}/debug.o from ${MID}/debug.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/debug.c )
 
 ${DOC}/debug.dvi: ${IN}/debug.pamphlet 
-	@ echo 19 making ${DOC}/debug.dvi from ${IN}/debug.pamphlet
+	@ echo 21 making ${DOC}/debug.dvi from ${IN}/debug.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/debug.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} debug ; \
@@ -224,20 +224,20 @@ ${DOC}/debug.dvi: ${IN}/debug.pamphlet
 \section{dialog}
 <<dialog>>=
 ${MID}/dialog.h: ${IN}/dialog.pamphlet
-	@ echo 20 making ${MID}/dialog.h from ${IN}/dialog.pamphlet
+	@ echo 22 making ${MID}/dialog.h from ${IN}/dialog.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"dialog.h" ${IN}/dialog.pamphlet >dialog.h )
 
 ${MID}/dialog.c: ${IN}/dialog.pamphlet
-	@ echo 21 making ${MID}/dialog.c from ${IN}/dialog.pamphlet
+	@ echo 23 making ${MID}/dialog.c from ${IN}/dialog.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/dialog.pamphlet >dialog.c )
 
 ${MIDOBJ}/dialog.o: ${MID}/dialog.c 
-	@ echo 22 making ${MIDOBJ}/dialog.o from ${MID}/dialog.c
+	@ echo 24 making ${MIDOBJ}/dialog.o from ${MID}/dialog.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/dialog.c )
 
 ${DOC}/dialog.dvi: ${IN}/dialog.pamphlet 
-	@ echo 23 making ${DOC}/dialog.dvi from ${IN}/dialog.pamphlet
+	@ echo 25 making ${DOC}/dialog.dvi from ${IN}/dialog.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/dialog.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} dialog ; \
@@ -249,20 +249,20 @@ ${DOC}/dialog.dvi: ${IN}/dialog.pamphlet
 \section{display}
 <<display>>=
 ${MID}/display.h: ${IN}/display.pamphlet
-	@ echo 24 making ${MID}/display.h from ${IN}/display.pamphlet
+	@ echo 26 making ${MID}/display.h from ${IN}/display.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"display.h" ${IN}/display.pamphlet >display.h )
 
 ${MID}/display.c: ${IN}/display.pamphlet
-	@ echo 25 making ${MID}/display.c from ${IN}/display.pamphlet
+	@ echo 27 making ${MID}/display.c from ${IN}/display.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/display.pamphlet >display.c )
 
 ${MIDOBJ}/display.o: ${MID}/display.c 
-	@ echo 26 making ${MIDOBJ}/display.o from ${MID}/display.c
+	@ echo 28 making ${MIDOBJ}/display.o from ${MID}/display.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/display.c )
 
 ${DOC}/display.dvi: ${IN}/display.pamphlet 
-	@ echo 27 making ${DOC}/display.dvi from ${IN}/display.pamphlet
+	@ echo 29 making ${DOC}/display.dvi from ${IN}/display.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/display.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} display ; \
@@ -274,20 +274,20 @@ ${DOC}/display.dvi: ${IN}/display.pamphlet
 \section{event}
 <<event>>=
 ${MID}/event.h: ${IN}/event.pamphlet
-	@ echo 28 making ${MID}/event.h from ${IN}/event.pamphlet
+	@ echo 30 making ${MID}/event.h from ${IN}/event.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"event.h" ${IN}/event.pamphlet >event.h )
 
 ${MID}/event.c: ${IN}/event.pamphlet
-	@ echo 29 making ${MID}/event.c from ${IN}/event.pamphlet
+	@ echo 31 making ${MID}/event.c from ${IN}/event.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/event.pamphlet >event.c )
 
 ${MIDOBJ}/event.o: ${MID}/event.c
-	@ echo 30 making ${MIDOBJ}/event.o from ${MID}/event.c
+	@ echo 32 making ${MIDOBJ}/event.o from ${MID}/event.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/event.c )
 
 ${DOC}/event.dvi: ${IN}/event.pamphlet 
-	@ echo 31 making ${DOC}/event.dvi from ${IN}/event.pamphlet
+	@ echo 33 making ${DOC}/event.dvi from ${IN}/event.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/event.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} event ; \
@@ -299,16 +299,16 @@ ${DOC}/event.dvi: ${IN}/event.pamphlet
 \section{ex2ht}
 <<ex2ht>>=
 ${MID}/ex2ht.c: ${IN}/ex2ht.pamphlet
-	@ echo 32 making ${MID}/ex2ht.c from ${IN}/ex2ht.pamphlet
+	@ echo 34 making ${MID}/ex2ht.c from ${IN}/ex2ht.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/ex2ht.pamphlet >ex2ht.c )
 
 ${MIDOBJ}/ex2ht.o: ${MID}/ex2ht.c 
-	@ echo 33 making ${MIDOBJ}/ex2ht.o from ${MID}/ex2ht.c
+	@ echo 35 making ${MIDOBJ}/ex2ht.o from ${MID}/ex2ht.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/ex2ht.c )
 
 ${DOC}/ex2ht.dvi: ${IN}/ex2ht.pamphlet 
-	@ echo 34 making ${DOC}/ex2ht.dvi from ${IN}/ex2ht.pamphlet
+	@ echo 36 making ${DOC}/ex2ht.dvi from ${IN}/ex2ht.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/ex2ht.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} ex2ht ; \
@@ -320,23 +320,23 @@ ${DOC}/ex2ht.dvi: ${IN}/ex2ht.pamphlet
 \section{extent}
 <<extent>>=
 ${MID}/extent.h: ${IN}/extent.pamphlet
-	@ echo 35 making ${MID}/extent.h from ${IN}/extent.pamphlet
+	@ echo 37 making ${MID}/extent.h from ${IN}/extent.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"extent.h" ${IN}/extent.pamphlet >extent.h )
 
 @
 \section{extent1}
 <<extent1>>=
 ${MID}/extent1.c: ${IN}/extent1.pamphlet
-	@ echo 36 making ${MID}/extent1.c from ${IN}/extent1.pamphlet
+	@ echo 38 making ${MID}/extent1.c from ${IN}/extent1.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/extent1.pamphlet >extent1.c )
 
 ${MIDOBJ}/extent1.o: ${MID}/extent1.c 
-	@ echo 37 making ${MIDOBJ}/extent1.o from ${MID}/extent1.c
+	@ echo 39 making ${MIDOBJ}/extent1.o from ${MID}/extent1.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/extent1.c )
 
 ${DOC}/extent1.dvi: ${IN}/extent1.pamphlet 
-	@ echo 38 making ${DOC}/extent1.dvi from ${IN}/extent1.pamphlet
+	@ echo 40 making ${DOC}/extent1.dvi from ${IN}/extent1.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/extent1.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} extent1 ; \
@@ -348,16 +348,16 @@ ${DOC}/extent1.dvi: ${IN}/extent1.pamphlet
 \section{extent2}
 <<extent2>>=
 ${MID}/extent2.c: ${IN}/extent2.pamphlet
-	@ echo 39 making ${MID}/extent2.c from ${IN}/extent2.pamphlet
+	@ echo 41 making ${MID}/extent2.c from ${IN}/extent2.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/extent2.pamphlet >extent2.c )
 
 ${MIDOBJ}/extent2.o: ${MID}/extent2.c
-	@ echo 40 making ${MIDOBJ}/extent2.o from ${MID}/extent2.c
+	@ echo 42 making ${MIDOBJ}/extent2.o from ${MID}/extent2.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/extent2.c )
 
 ${DOC}/extent2.dvi: ${IN}/extent2.pamphlet 
-	@ echo 41 making ${DOC}/extent2.dvi from ${IN}/extent2.pamphlet
+	@ echo 43 making ${DOC}/extent2.dvi from ${IN}/extent2.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/extent2.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} extent2 ; \
@@ -369,16 +369,16 @@ ${DOC}/extent2.dvi: ${IN}/extent2.pamphlet
 \section{form-ext}
 <<formext>>=
 ${MID}/form-ext.c: ${IN}/form-ext.pamphlet
-	@ echo 42 making ${MID}/form-ext.c from ${IN}/form-ext.pamphlet
+	@ echo 44 making ${MID}/form-ext.c from ${IN}/form-ext.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/form-ext.pamphlet >form-ext.c )
 
 ${MIDOBJ}/form-ext.o: ${MID}/form-ext.c
-	@ echo 43 making ${MIDOBJ}/form-ext.o from ${MID}/form-ext.c
+	@ echo 45 making ${MIDOBJ}/form-ext.o from ${MID}/form-ext.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/form-ext.c )
 
 ${DOC}/form-ext.dvi: ${IN}/form-ext.pamphlet 
-	@ echo 44 making ${DOC}/form-ext.dvi from ${IN}/form-ext.pamphlet
+	@ echo 46 making ${DOC}/form-ext.dvi from ${IN}/form-ext.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/form-ext.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} form-ext ; \
@@ -390,20 +390,20 @@ ${DOC}/form-ext.dvi: ${IN}/form-ext.pamphlet
 \section{group}
 <<group>>=
 ${MID}/group.h: ${IN}/group.pamphlet
-	@ echo 45 making ${MID}/group.h from ${IN}/group.pamphlet
+	@ echo 47 making ${MID}/group.h from ${IN}/group.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"group.h" ${IN}/group.pamphlet >group.h )
 
 ${MID}/group.c: ${IN}/group.pamphlet
-	@ echo 46 making ${MID}/group.c from ${IN}/group.pamphlet
+	@ echo 48 making ${MID}/group.c from ${IN}/group.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/group.pamphlet >group.c )
 
 ${MIDOBJ}/group.o: ${MID}/group.c
-	@ echo 47 making ${MIDOBJ}/group.o from ${MID}/group.c
+	@ echo 49 making ${MIDOBJ}/group.o from ${MID}/group.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/group.c )
 
 ${DOC}/group.dvi: ${IN}/group.pamphlet 
-	@ echo 48 making ${DOC}/group.dvi from ${IN}/group.pamphlet
+	@ echo 50 making ${DOC}/group.dvi from ${IN}/group.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/group.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} group ; \
@@ -415,16 +415,16 @@ ${DOC}/group.dvi: ${IN}/group.pamphlet
 \section{halloc}
 <<halloc>>=
 ${MID}/halloc.c: ${IN}/halloc.pamphlet
-	@ echo 49 making ${MID}/halloc.c from ${IN}/halloc.pamphlet
+	@ echo 51 making ${MID}/halloc.c from ${IN}/halloc.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/halloc.pamphlet >halloc.c )
 
 ${MIDOBJ}/halloc.o: ${MID}/halloc.c
-	@ echo 50 making ${MIDOBJ}/halloc.o from ${MID}/halloc.c
+	@ echo 52 making ${MIDOBJ}/halloc.o from ${MID}/halloc.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/halloc.c )
 
 ${DOC}/halloc.dvi: ${IN}/halloc.pamphlet 
-	@ echo 51 making ${DOC}/halloc.dvi from ${IN}/halloc.pamphlet
+	@ echo 53 making ${DOC}/halloc.dvi from ${IN}/halloc.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/halloc.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} halloc ; \
@@ -436,16 +436,16 @@ ${DOC}/halloc.dvi: ${IN}/halloc.pamphlet
 \section{hash}
 <<hash>>=
 ${MID}/hash.c: ${IN}/hash.pamphlet
-	@ echo 52 making ${MID}/hash.c from ${IN}/hash.pamphlet
+	@ echo 54 making ${MID}/hash.c from ${IN}/hash.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/hash.pamphlet >hash.c )
 
 ${MIDOBJ}/hash.o: ${MID}/hash.c 
-	@ echo 53 making ${MIDOBJ}/hash.o from ${MID}/hash.c
+	@ echo 55 making ${MIDOBJ}/hash.o from ${MID}/hash.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/hash.c )
 
 ${DOC}/hash.dvi: ${IN}/hash.pamphlet 
-	@ echo 54 making ${DOC}/hash.dvi from ${IN}/hash.pamphlet
+	@ echo 56 making ${DOC}/hash.dvi from ${IN}/hash.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/hash.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} hash ; \
@@ -457,16 +457,16 @@ ${DOC}/hash.dvi: ${IN}/hash.pamphlet
 \section{htadd}
 <<htadd>>=
 ${MID}/htadd.c: ${IN}/htadd.pamphlet
-	@ echo 55 making ${MID}/htadd.c from ${IN}/htadd.pamphlet
+	@ echo 57 making ${MID}/htadd.c from ${IN}/htadd.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/htadd.pamphlet >htadd.c )
 
 ${MIDOBJ}/htadd.o: ${MID}/htadd.c 
-	@ echo 56 making ${MIDOBJ}/htadd.o from ${MID}/htadd.c
+	@ echo 58 making ${MIDOBJ}/htadd.o from ${MID}/htadd.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/htadd.c )
 
 ${DOC}/htadd.dvi: ${IN}/htadd.pamphlet 
-	@ echo 57 making ${DOC}/htadd.dvi from ${IN}/htadd.pamphlet
+	@ echo 59 making ${DOC}/htadd.dvi from ${IN}/htadd.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/htadd.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} htadd ; \
@@ -478,20 +478,20 @@ ${DOC}/htadd.dvi: ${IN}/htadd.pamphlet
 \section{hterror}
 <<hterror>>=
 ${MID}/hterror.h: ${IN}/hterror.pamphlet
-	@ echo 58 making ${MID}/hterror.h from ${IN}/hterror.pamphlet
+	@ echo 60 making ${MID}/hterror.h from ${IN}/hterror.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"hterror.h" ${IN}/hterror.pamphlet >hterror.h )
 
 ${MID}/hterror.c: ${IN}/hterror.pamphlet
-	@ echo 59 making ${MID}/hterror.c from ${IN}/hterror.pamphlet
+	@ echo 61 making ${MID}/hterror.c from ${IN}/hterror.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/hterror.pamphlet >hterror.c )
 
 ${MIDOBJ}/hterror.o: ${MID}/hterror.c
-	@ echo 60 making ${MIDOBJ}/hterror.o from ${MID}/hterror.c
+	@ echo 62 making ${MIDOBJ}/hterror.o from ${MID}/hterror.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/hterror.c )
 
 ${DOC}/hterror.dvi: ${IN}/hterror.pamphlet 
-	@ echo 61 making ${DOC}/hterror.dvi from ${IN}/hterror.pamphlet
+	@ echo 63 making ${DOC}/hterror.dvi from ${IN}/hterror.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/hterror.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} hterror ; \
@@ -503,16 +503,16 @@ ${DOC}/hterror.dvi: ${IN}/hterror.pamphlet
 \section{hthits}
 <<hthits>>=
 ${MID}/hthits.c: ${IN}/hthits.pamphlet
-	@ echo 62 making ${MID}/hthits.c from ${IN}/hthits.pamphlet
+	@ echo 64 making ${MID}/hthits.c from ${IN}/hthits.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/hthits.pamphlet >hthits.c )
 
 ${MIDOBJ}/hthits.o: ${MID}/hthits.c
-	@ echo 63 making ${MIDOBJ}/hthits.o from ${MID}/hthits.c
+	@ echo 65 making ${MIDOBJ}/hthits.o from ${MID}/hthits.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/hthits.c )
 
 ${DOC}/hthits.dvi: ${IN}/hthits.pamphlet 
-	@ echo 64 making ${DOC}/hthits.dvi from ${IN}/hthits.pamphlet
+	@ echo 66 making ${DOC}/hthits.dvi from ${IN}/hthits.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/hthits.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} hthits ; \
@@ -524,16 +524,16 @@ ${DOC}/hthits.dvi: ${IN}/hthits.pamphlet
 \section{htinp}
 <<htinp>>=
 ${MID}/htinp.c: ${IN}/htinp.pamphlet
-	@ echo 65 making ${MID}/htinp.c from ${IN}/htinp.pamphlet
+	@ echo 67 making ${MID}/htinp.c from ${IN}/htinp.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/htinp.pamphlet >htinp.c )
 
 ${MIDOBJ}/htinp.o: ${MID}/htinp.c
-	@ echo 66 making ${MIDOBJ}/htinp.o from ${MID}/htinp.c
+	@ echo 68 making ${MIDOBJ}/htinp.o from ${MID}/htinp.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/htinp.c )
 
 ${DOC}/htinp.dvi: ${IN}/htinp.pamphlet 
-	@ echo 67 making ${DOC}/htinp.dvi from ${IN}/htinp.pamphlet
+	@ echo 69 making ${DOC}/htinp.dvi from ${IN}/htinp.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/htinp.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} htinp ; \
@@ -545,20 +545,20 @@ ${DOC}/htinp.dvi: ${IN}/htinp.pamphlet
 \section{hyper}
 <<hyper>>=
 ${MID}/hyper.h: ${IN}/hyper.pamphlet
-	@ echo 68 making ${MID}/hyper.h from ${IN}/hyper.pamphlet
+	@ echo 70 making ${MID}/hyper.h from ${IN}/hyper.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"hyper.h" ${IN}/hyper.pamphlet >hyper.h )
 
 ${MID}/hyper.c: ${IN}/hyper.pamphlet
-	@ echo 69 making ${MID}/hyper.c from ${IN}/hyper.pamphlet
+	@ echo 71 making ${MID}/hyper.c from ${IN}/hyper.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/hyper.pamphlet >hyper.c )
 
 ${MIDOBJ}/hyper.o: ${MID}/hyper.c
-	@ echo 70 making ${MIDOBJ}/hyper.o from ${MID}/hyper.c
+	@ echo 72 making ${MIDOBJ}/hyper.o from ${MID}/hyper.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/hyper.c )
 
 ${DOC}/hyper.dvi: ${IN}/hyper.pamphlet 
-	@ echo 71 making ${DOC}/hyper.dvi from ${IN}/hyper.pamphlet
+	@ echo 73 making ${DOC}/hyper.dvi from ${IN}/hyper.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/hyper.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} hyper ; \
@@ -570,20 +570,20 @@ ${DOC}/hyper.dvi: ${IN}/hyper.pamphlet
 \section{initx}
 <<initx>>=
 ${MID}/initx.h: ${IN}/initx.pamphlet
-	@ echo 72 making ${MID}/initx.h from ${IN}/initx.pamphlet
+	@ echo 74 making ${MID}/initx.h from ${IN}/initx.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"initx.h" ${IN}/initx.pamphlet >initx.h )
 
 ${MID}/initx.c: ${IN}/initx.pamphlet
-	@ echo 73 making ${MID}/initx.c from ${IN}/initx.pamphlet
+	@ echo 75 making ${MID}/initx.c from ${IN}/initx.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/initx.pamphlet >initx.c )
 
 ${MIDOBJ}/initx.o: ${MID}/initx.c
-	@ echo 74 making ${MIDOBJ}/initx.o from ${MID}/initx.c
+	@ echo 76 making ${MIDOBJ}/initx.o from ${MID}/initx.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/initx.c )
 
 ${DOC}/initx.dvi: ${IN}/initx.pamphlet 
-	@ echo 75 making ${DOC}/initx.dvi from ${IN}/initx.pamphlet
+	@ echo 77 making ${DOC}/initx.dvi from ${IN}/initx.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/initx.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} initx ; \
@@ -595,16 +595,16 @@ ${DOC}/initx.dvi: ${IN}/initx.pamphlet
 \section{input}
 <<input>>=
 ${MID}/input.c: ${IN}/input.pamphlet
-	@ echo 76 making ${MID}/input.c from ${IN}/input.pamphlet
+	@ echo 78 making ${MID}/input.c from ${IN}/input.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/input.pamphlet >input.c )
 
 ${MIDOBJ}/input.o: ${MID}/input.c 
-	@ echo 77 making ${MIDOBJ}/input.o from ${MID}/input.c
+	@ echo 79 making ${MIDOBJ}/input.o from ${MID}/input.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/input.c )
 
 ${DOC}/input.dvi: ${IN}/input.pamphlet 
-	@ echo 78 making ${DOC}/input.dvi from ${IN}/input.pamphlet
+	@ echo 80 making ${DOC}/input.dvi from ${IN}/input.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/input.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} input ; \
@@ -616,16 +616,16 @@ ${DOC}/input.dvi: ${IN}/input.pamphlet
 \section{item}
 <<item>>=
 ${MID}/item.c: ${IN}/item.pamphlet
-	@ echo 79 making ${MID}/item.c from ${IN}/item.pamphlet
+	@ echo 81 making ${MID}/item.c from ${IN}/item.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/item.pamphlet >item.c )
 
 ${MIDOBJ}/item.o: ${MID}/item.c
-	@ echo 80 making ${MIDOBJ}/item.o from ${MID}/item.c
+	@ echo 82 making ${MIDOBJ}/item.o from ${MID}/item.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/item.c )
 
 ${DOC}/item.dvi: ${IN}/item.pamphlet 
-	@ echo 81 making ${DOC}/item.dvi from ${IN}/item.pamphlet
+	@ echo 83 making ${DOC}/item.dvi from ${IN}/item.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/item.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} item ; \
@@ -637,20 +637,20 @@ ${DOC}/item.dvi: ${IN}/item.pamphlet
 \section{keyin}
 <<keyin>>=
 ${MID}/keyin.h: ${IN}/keyin.pamphlet
-	@ echo 82 making ${MID}/keyin.h from ${IN}/keyin.pamphlet
+	@ echo 84 making ${MID}/keyin.h from ${IN}/keyin.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"keyin.h" ${IN}/keyin.pamphlet >keyin.h )
 
 ${MID}/keyin.c: ${IN}/keyin.pamphlet
-	@ echo 83 making ${MID}/keyin.c from ${IN}/keyin.pamphlet
+	@ echo 85 making ${MID}/keyin.c from ${IN}/keyin.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/keyin.pamphlet >keyin.c )
 
 ${MIDOBJ}/keyin.o: ${MID}/keyin.c
-	@ echo 84 making ${MIDOBJ}/keyin.o from ${MID}/keyin.c
+	@ echo 86 making ${MIDOBJ}/keyin.o from ${MID}/keyin.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/keyin.c )
 
 ${DOC}/keyin.dvi: ${IN}/keyin.pamphlet 
-	@ echo 85 making ${DOC}/keyin.dvi from ${IN}/keyin.pamphlet
+	@ echo 87 making ${DOC}/keyin.dvi from ${IN}/keyin.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/keyin.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} keyin ; \
@@ -662,20 +662,20 @@ ${DOC}/keyin.dvi: ${IN}/keyin.pamphlet
 \section{lex}
 <<lex>>=
 ${MID}/lex.h: ${IN}/lex.pamphlet
-	@ echo 86 making ${MID}/lex.h from ${IN}/lex.pamphlet
+	@ echo 88 making ${MID}/lex.h from ${IN}/lex.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"lex.h" ${IN}/lex.pamphlet >lex.h )
 
 ${MID}/lex.c: ${IN}/lex.pamphlet
-	@ echo 87 making ${MID}/lex.c from ${IN}/lex.pamphlet
+	@ echo 89 making ${MID}/lex.c from ${IN}/lex.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/lex.pamphlet >lex.c )
 
 ${MIDOBJ}/lex.o: ${MID}/lex.c 
-	@ echo 88 making ${MIDOBJ}/lex.o from ${MID}/lex.c
+	@ echo 90 making ${MIDOBJ}/lex.o from ${MID}/lex.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/lex.c )
 
 ${DOC}/lex.dvi: ${IN}/lex.pamphlet 
-	@ echo 89 making ${DOC}/lex.dvi from ${IN}/lex.pamphlet
+	@ echo 91 making ${DOC}/lex.dvi from ${IN}/lex.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/lex.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} lex ; \
@@ -687,16 +687,16 @@ ${DOC}/lex.dvi: ${IN}/lex.pamphlet
 \section{macro}
 <<macro>>=
 ${MID}/macro.c: ${IN}/macro.pamphlet
-	@ echo 90 making ${MID}/macro.c from ${IN}/macro.pamphlet
+	@ echo 92 making ${MID}/macro.c from ${IN}/macro.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/macro.pamphlet >macro.c )
 
 ${MIDOBJ}/macro.o: ${MID}/macro.c
-	@ echo 91 making ${MIDOBJ}/macro.o from ${MID}/macro.c
+	@ echo 93 making ${MIDOBJ}/macro.o from ${MID}/macro.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/macro.c )
 
 ${DOC}/macro.dvi: ${IN}/macro.pamphlet 
-	@ echo 92 making ${DOC}/macro.dvi from ${IN}/macro.pamphlet
+	@ echo 94 making ${DOC}/macro.dvi from ${IN}/macro.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/macro.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} macro ; \
@@ -708,20 +708,20 @@ ${DOC}/macro.dvi: ${IN}/macro.pamphlet
 \section{mem}
 <<mem>>=
 ${MID}/mem.h: ${IN}/mem.pamphlet
-	@ echo 93 making ${MID}/mem.h from ${IN}/mem.pamphlet
+	@ echo 95 making ${MID}/mem.h from ${IN}/mem.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"mem.h" ${IN}/mem.pamphlet >mem.h )
 
 ${MID}/mem.c: ${IN}/mem.pamphlet
-	@ echo 94 making ${MID}/mem.c from ${IN}/mem.pamphlet
+	@ echo 96 making ${MID}/mem.c from ${IN}/mem.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/mem.pamphlet >mem.c )
 
 ${MIDOBJ}/mem.o: ${MID}/mem.c
-	@ echo 95 making ${MIDOBJ}/mem.o from ${MID}/mem.c
+	@ echo 97 making ${MIDOBJ}/mem.o from ${MID}/mem.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/mem.c )
 
 ${DOC}/mem.dvi: ${IN}/mem.pamphlet 
-	@ echo 96 making ${DOC}/mem.dvi from ${IN}/mem.pamphlet
+	@ echo 98 making ${DOC}/mem.dvi from ${IN}/mem.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/mem.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} mem ; \
@@ -733,20 +733,20 @@ ${DOC}/mem.dvi: ${IN}/mem.pamphlet
 \section{parse}
 <<parse>>=
 ${MID}/parse.h: ${IN}/parse.pamphlet
-	@ echo 97 making ${MID}/parse.h from ${IN}/parse.pamphlet
+	@ echo 99 making ${MID}/parse.h from ${IN}/parse.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"parse.h" ${IN}/parse.pamphlet >parse.h )
 
 ${MID}/parse.c: ${IN}/parse.pamphlet
-	@ echo 98 making ${MID}/parse.c from ${IN}/parse.pamphlet
+	@ echo 100 making ${MID}/parse.c from ${IN}/parse.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/parse.pamphlet >parse.c )
 
 ${MIDOBJ}/parse.o: ${MID}/parse.c
-	@ echo 99 making ${MIDOBJ}/parse.o from ${MID}/parse.c
+	@ echo 101 making ${MIDOBJ}/parse.o from ${MID}/parse.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/parse.c )
 
 ${DOC}/parse.dvi: ${IN}/parse.pamphlet 
-	@ echo 100 making ${DOC}/parse.dvi from ${IN}/parse.pamphlet
+	@ echo 102 making ${DOC}/parse.dvi from ${IN}/parse.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/parse.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} parse ; \
@@ -758,20 +758,20 @@ ${DOC}/parse.dvi: ${IN}/parse.pamphlet
 \section{parse-aux}
 <<parseaux>>=
 ${MID}/parse-aux.h: ${IN}/parse-aux.pamphlet
-	@ echo 101 making ${MID}/parse-aux.h from ${IN}/parse-aux.pamphlet
+	@ echo 103 making ${MID}/parse-aux.h from ${IN}/parse-aux.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"parseaux.h" ${IN}/parse-aux.pamphlet >parse-aux.h )
 
 ${MID}/parse-aux.c: ${IN}/parse-aux.pamphlet
-	@ echo 102 making ${MID}/parse-aux.c from ${IN}/parse-aux.pamphlet
+	@ echo 104 making ${MID}/parse-aux.c from ${IN}/parse-aux.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/parse-aux.pamphlet >parse-aux.c )
 
 ${MIDOBJ}/parse-aux.o: ${MID}/parse-aux.c
-	@ echo 103 making ${MIDOBJ}/parse-aux.o from ${MID}/parse-aux.c
+	@ echo 105 making ${MIDOBJ}/parse-aux.o from ${MID}/parse-aux.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/parse-aux.c )
 
 ${DOC}/parse-aux.dvi: ${IN}/parse-aux.pamphlet 
-	@ echo 104 making ${DOC}/parse-aux.dvi from ${IN}/parse-aux.pamphlet
+	@ echo 106 making ${DOC}/parse-aux.dvi from ${IN}/parse-aux.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/parse-aux.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} parse-aux ; \
@@ -783,16 +783,17 @@ ${DOC}/parse-aux.dvi: ${IN}/parse-aux.pamphlet
 \section{parse-input}
 <<parseinput>>=
 ${MID}/parse-input.c: ${IN}/parse-input.pamphlet
-	@ echo 105 making ${MID}/parse-input.c from ${IN}/parse-input.pamphlet
+	@ echo 107 making ${MID}/parse-input.c from ${IN}/parse-input.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/parse-input.pamphlet >parse-input.c )
 
 ${MIDOBJ}/parse-input.o: ${MID}/parse-input.c
-	@ echo 106 making ${MIDOBJ}/parse-input.o from ${MID}/parse-input.c
+	@ echo 108 making ${MIDOBJ}/parse-input.o from ${MID}/parse-input.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/parse-input.c )
 
 ${DOC}/parse-input.dvi: ${IN}/parse-input.pamphlet 
-	@ echo 107 making ${DOC}/parse-input.dvi from ${IN}/parse-input.pamphlet
+	@ echo 109 making ${DOC}/parse-input.dvi \
+           from ${IN}/parse-input.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/parse-input.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} parse-input ; \
@@ -804,20 +805,21 @@ ${DOC}/parse-input.dvi: ${IN}/parse-input.pamphlet
 \section{parse-paste}
 <<parsepaste>>=
 ${MID}/parse-paste.h: ${IN}/parse-paste.pamphlet
-	@ echo 108 making ${MID}/parse-paste.h from ${IN}/parse-paste.pamphlet
+	@ echo 110 making ${MID}/parse-paste.h from ${IN}/parse-paste.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"parsepaste.h" ${IN}/parse-paste.pamphlet >parse-paste.h )
 
 ${MID}/parse-paste.c: ${IN}/parse-paste.pamphlet
-	@ echo 109 making ${MID}/parse-paste.c from ${IN}/parse-paste.pamphlet
+	@ echo 111 making ${MID}/parse-paste.c from ${IN}/parse-paste.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/parse-paste.pamphlet >parse-paste.c )
 
 ${MIDOBJ}/parse-paste.o: ${MID}/parse-paste.c
-	@ echo 110 making ${MIDOBJ}/parse-paste.o from ${MID}/parse-paste.c
+	@ echo 112 making ${MIDOBJ}/parse-paste.o from ${MID}/parse-paste.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/parse-paste.c )
 
 ${DOC}/parse-paste.dvi: ${IN}/parse-paste.pamphlet 
-	@ echo 111 making ${DOC}/parse-paste.dvi from ${IN}/parse-paste.pamphlet
+	@ echo 113 making ${DOC}/parse-paste.dvi \
+           from ${IN}/parse-paste.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/parse-paste.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} parse-paste ; \
@@ -829,20 +831,21 @@ ${DOC}/parse-paste.dvi: ${IN}/parse-paste.pamphlet
 \section{parse-types}
 <<parsetypes>>=
 ${MID}/parse-types.h: ${MID}/hterror.h ${IN}/parse-types.pamphlet
-	@ echo 112 making ${MID}/parse-types.h from ${IN}/parse-types.pamphlet
+	@ echo 114 making ${MID}/parse-types.h from ${IN}/parse-types.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"parsetypes.h" ${IN}/parse-types.pamphlet >parse-types.h )
 
 ${MID}/parse-types.c: ${IN}/parse-types.pamphlet
-	@ echo 113 making ${MID}/parse-types.c from ${IN}/parse-types.pamphlet
+	@ echo 115 making ${MID}/parse-types.c from ${IN}/parse-types.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/parse-types.pamphlet >parse-types.c )
 
 ${MIDOBJ}/parse-types.o: ${MID}/parse-types.c
-	@ echo 114 making ${MIDOBJ}/parse-types.o from ${MID}/parse-types.c
+	@ echo 116 making ${MIDOBJ}/parse-types.o from ${MID}/parse-types.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/parse-types.c )
 
 ${DOC}/parse-types.dvi: ${IN}/parse-types.pamphlet 
-	@ echo 115 making ${DOC}/parse-types.dvi from ${IN}/parse-types.pamphlet
+	@ echo 117 making ${DOC}/parse-types.dvi \
+           from ${IN}/parse-types.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/parse-types.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} parse-types ; \
@@ -854,16 +857,16 @@ ${DOC}/parse-types.dvi: ${IN}/parse-types.pamphlet
 \section{readbitmap}
 <<readbitmap>>=
 ${MID}/readbitmap.c: ${IN}/readbitmap.pamphlet
-	@ echo 116 making ${MID}/readbitmap.c from ${IN}/readbitmap.pamphlet
+	@ echo 118 making ${MID}/readbitmap.c from ${IN}/readbitmap.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/readbitmap.pamphlet >readbitmap.c )
 
 ${MIDOBJ}/readbitmap.o: ${MID}/readbitmap.c
-	@ echo 117 making ${MIDOBJ}/readbitmap.o from ${MID}/readbitmap.c
+	@ echo 119 making ${MIDOBJ}/readbitmap.o from ${MID}/readbitmap.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/readbitmap.c )
 
 ${DOC}/readbitmap.dvi: ${IN}/readbitmap.pamphlet 
-	@ echo 118 making ${DOC}/readbitmap.dvi from ${IN}/readbitmap.pamphlet
+	@ echo 120 making ${DOC}/readbitmap.dvi from ${IN}/readbitmap.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/readbitmap.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} readbitmap ; \
@@ -875,20 +878,20 @@ ${DOC}/readbitmap.dvi: ${IN}/readbitmap.pamphlet
 \section{scrollbar}
 <<scrollbar>>=
 ${MID}/scrollbar.h: ${IN}/scrollbar.pamphlet
-	@ echo 119 making ${MID}/scrollbar.h from ${IN}/scrollbar.pamphlet
+	@ echo 121 making ${MID}/scrollbar.h from ${IN}/scrollbar.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"scrollbar.h" ${IN}/scrollbar.pamphlet >scrollbar.h )
 
 ${MID}/scrollbar.c: ${IN}/scrollbar.pamphlet
-	@ echo 120 making ${MID}/scrollbar.c from ${IN}/scrollbar.pamphlet
+	@ echo 122 making ${MID}/scrollbar.c from ${IN}/scrollbar.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/scrollbar.pamphlet >scrollbar.c )
 
 ${MIDOBJ}/scrollbar.o: ${MID}/scrollbar.c
-	@ echo 121 making ${MIDOBJ}/scrollbar.o from ${MID}/scrollbar.c
+	@ echo 123 making ${MIDOBJ}/scrollbar.o from ${MID}/scrollbar.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/scrollbar.c )
 
 ${DOC}/scrollbar.dvi: ${IN}/scrollbar.pamphlet 
-	@ echo 122 making ${DOC}/scrollbar.dvi from ${IN}/scrollbar.pamphlet
+	@ echo 124 making ${DOC}/scrollbar.dvi from ${IN}/scrollbar.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/scrollbar.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} scrollbar ; \
@@ -900,17 +903,17 @@ ${DOC}/scrollbar.dvi: ${IN}/scrollbar.pamphlet
 \section{search}
 <<search>>=
 ${OUTLIB}/htsearch: ${IN}/search.pamphlet
-	@echo 123 making ${OUTLIB}/htsearch from ${IN}/search.pamphlet
+	@echo 125 making ${OUTLIB}/htsearch from ${IN}/search.pamphlet
 	@${TANGLE} -R"htsearch" ${IN}/search.pamphlet >${OUTLIB}/htsearch
 	@chmod a+x ${OUTLIB}/htsearch
 
 ${OUTLIB}/presea: ${IN}/search.pamphlet
-	@echo 124 making ${OUTLIB}/presea from ${IN}/search.pamphlet
+	@echo 126 making ${OUTLIB}/presea from ${IN}/search.pamphlet
 	@${TANGLE} -R"presea" ${IN}/search.pamphlet >${OUTLIB}/presea
 	@chmod a+x ${OUTLIB}/presea
 
 ${DOC}/search.dvi: ${IN}/search.pamphlet 
-	@ echo 122 making ${DOC}/search.dvi from ${IN}/search.pamphlet
+	@ echo 127 making ${DOC}/search.dvi from ${IN}/search.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/search.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} search ; \
@@ -922,20 +925,20 @@ ${DOC}/search.dvi: ${IN}/search.pamphlet
 \section{show-types}
 <<showtypes>>=
 ${MID}/show-types.h: ${IN}/show-types.pamphlet
-	@ echo 125 making ${MID}/show-types.h from ${IN}/show-types.pamphlet
+	@ echo 128 making ${MID}/show-types.h from ${IN}/show-types.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"showtypes.h" ${IN}/show-types.pamphlet >show-types.h )
 
 ${MID}/show-types.c: ${IN}/show-types.pamphlet
-	@ echo 126 making ${MID}/show-types.c from ${IN}/show-types.pamphlet
+	@ echo 129 making ${MID}/show-types.c from ${IN}/show-types.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/show-types.pamphlet >show-types.c )
 
 ${MIDOBJ}/show-types.o: ${MID}/show-types.c
-	@ echo 127 making ${MIDOBJ}/show-types.o from ${MID}/show-types.c
+	@ echo 130 making ${MIDOBJ}/show-types.o from ${MID}/show-types.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/show-types.c )
 
 ${DOC}/show-types.dvi: ${IN}/show-types.pamphlet 
-	@ echo 128 making ${DOC}/show-types.dvi from ${IN}/show-types.pamphlet
+	@ echo 131 making ${DOC}/show-types.dvi from ${IN}/show-types.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/show-types.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} show-types ; \
@@ -947,16 +950,16 @@ ${DOC}/show-types.dvi: ${IN}/show-types.pamphlet
 \section{spadbuf}
 <<spadbuf>>=
 ${MID}/spadbuf.c: ${IN}/spadbuf.pamphlet
-	@ echo 129 making ${MID}/spadbuf.c from ${IN}/spadbuf.pamphlet
+	@ echo 132 making ${MID}/spadbuf.c from ${IN}/spadbuf.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/spadbuf.pamphlet >spadbuf.c )
 
 ${MIDOBJ}/spadbuf.o: ${MID}/spadbuf.c
-	@ echo 130 making ${MIDOBJ}/spadbuf.o from ${MID}/spadbuf.c
+	@ echo 133 making ${MIDOBJ}/spadbuf.o from ${MID}/spadbuf.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/spadbuf.c )
 
 ${DOC}/spadbuf.dvi: ${IN}/spadbuf.pamphlet 
-	@ echo 131 making ${DOC}/spadbuf.dvi from ${IN}/spadbuf.pamphlet
+	@ echo 134 making ${DOC}/spadbuf.dvi from ${IN}/spadbuf.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/spadbuf.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} spadbuf ; \
@@ -968,16 +971,16 @@ ${DOC}/spadbuf.dvi: ${IN}/spadbuf.pamphlet
 \section{spadint}
 <<spadint>>=
 ${MID}/spadint.c: ${IN}/spadint.pamphlet
-	@ echo 132 making ${MID}/spadint.c from ${IN}/spadint.pamphlet
+	@ echo 135 making ${MID}/spadint.c from ${IN}/spadint.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/spadint.pamphlet >spadint.c )
 
 ${MIDOBJ}/spadint.o: ${MID}/spadint.c
-	@ echo 133 making ${MIDOBJ}/spadint.o from ${MID}/spadint.c
+	@ echo 136 making ${MIDOBJ}/spadint.o from ${MID}/spadint.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/spadint.c )
 
 ${DOC}/spadint.dvi: ${IN}/spadint.pamphlet 
-	@ echo 134 making ${DOC}/spadint.dvi from ${IN}/spadint.pamphlet
+	@ echo 137 making ${DOC}/spadint.dvi from ${IN}/spadint.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/spadint.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} spadint ; \
@@ -989,20 +992,20 @@ ${DOC}/spadint.dvi: ${IN}/spadint.pamphlet
 \section{titlebar}
 <<titlebar>>=
 ${MID}/titlebar.h: ${IN}/titlebar.pamphlet
-	@ echo 135 making ${MID}/titlebar.h from ${IN}/titlebar.pamphlet
+	@ echo 138 making ${MID}/titlebar.h from ${IN}/titlebar.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"titlebar.h" ${IN}/titlebar.pamphlet >titlebar.h )
 
 ${MID}/titlebar.c: ${IN}/titlebar.pamphlet
-	@ echo 136 making ${MID}/titlebar.c from ${IN}/titlebar.pamphlet
+	@ echo 139 making ${MID}/titlebar.c from ${IN}/titlebar.pamphlet
 	@ (cd ${MID} ; ${TANGLE} ${IN}/titlebar.pamphlet >titlebar.c )
 
 ${MIDOBJ}/titlebar.o: ${MID}/titlebar.c
-	@ echo 137 making ${MIDOBJ}/titlebar.o from ${MID}/titlebar.c
+	@ echo 140 making ${MIDOBJ}/titlebar.o from ${MID}/titlebar.c
 	@ ( cd ${MIDOBJ} ; \
 	    ${CC} -I${INC} -I${MID} -c ${CFLAGS} ${MID}/titlebar.c )
 
 ${DOC}/titlebar.dvi: ${IN}/titlebar.pamphlet 
-	@ echo 138 making ${DOC}/titlebar.dvi from ${IN}/titlebar.pamphlet
+	@ echo 141 making ${DOC}/titlebar.dvi from ${IN}/titlebar.pamphlet
 	@ (cd ${DOC} ; \
 	cp ${IN}/titlebar.pamphlet ${DOC} ; \
 	${DOCUMENT} ${NOISE} titlebar ; \
@@ -1014,21 +1017,21 @@ ${DOC}/titlebar.dvi: ${IN}/titlebar.pamphlet
 \section{token}
 <<token>>=
 ${MID}/token.h: ${IN}/token.pamphlet
-	@ echo 139 making ${MID}/token.h from ${IN}/token.pamphlet
+	@ echo 142 making ${MID}/token.h from ${IN}/token.pamphlet
 	@ (cd ${MID} ; ${TANGLE} -R"token.h" ${IN}/token.pamphlet >token.h )
 
 @
 \section{ex2ht binary}
 <<ex2ht (BIN)>>=
 ${OUTLIB}/ex2ht: ${EX2HT_OBJS} 
-	@ echo linking ${OUTLIB}/ex2ht
+	@ echo 143 linking ${OUTLIB}/ex2ht
 	@ ${CC} ${EX2HT_OBJS} -o ${OUTLIB}/ex2ht ${LDFLAGS}
 
 @
 \section{htadd binary}
 <<htadd (BIN)>>=
 ${OUT}/htadd: ${HTADD_OBJS}   ${LIB}/sockio-c.o ${LIB}/bsdsignal.o
-	@ echo linking ${OUT}/htadd
+	@ echo 144 linking ${OUT}/htadd
 	@ ${CC} ${HTADD_OBJS} -o ${OUT}/htadd ${LIB}/sockio-c.o \
                 ${LIB}/bsdsignal.o ${LDFLAGS}
 
@@ -1036,7 +1039,7 @@ ${OUT}/htadd: ${HTADD_OBJS}   ${LIB}/sockio-c.o ${LIB}/bsdsignal.o
 \section{hthits binary}
 <<hthits (BIN)>>=
 ${OUTLIB}/hthits: ${HTHITS_OBJS} 
-	@ echo linking ${OUTLIB}/hthits
+	@ echo 145 linking ${OUTLIB}/hthits
 	@ ${CC} ${HTHITS_OBJS} -o ${OUTLIB}/hthits ${LDFLAGS}
 
 @
@@ -1044,7 +1047,7 @@ ${OUTLIB}/hthits: ${HTHITS_OBJS}
 <<hypertex (BIN)>>=
 ${OUT}/hypertex: ${HYPER_OBJS} ${LIB}/sockio-c.o ${LIB}/pixmap.o \
                     ${LIB}/spadcolors.o ${LIB}/util.o ${LIB}/bsdsignal.o
-	@ echo 139 linking ${OUT}/hypertex
+	@ echo 146 linking ${OUT}/hypertex
 	 (cd ${OUT} ; \
 	 ${CC} -g ${HYPER_OBJS} -o ${OUT}/hypertex ${LIB}/sockio-c.o \
 	   ${LIB}/pixmap.o ${LIB}/spadcolors.o ${LIB}/util.o \
@@ -1054,7 +1057,7 @@ ${OUT}/hypertex: ${HYPER_OBJS} ${LIB}/sockio-c.o ${LIB}/pixmap.o \
 \section{htsearch binary}
 <<htsearch (BIN)>>=
 ${OUT}/htsearch: ${OUTLIB}/htsearch ${OUTLIB}/presea
-	@ echo making ${OUT}/htsearch
+	@ echo 147 making ${OUT}/htsearch
 	@ cp -p ${OUTLIB}/htsearch ${OUT}/htsearch
 	@ cp -p ${OUTLIB}/presea ${OUT}/presea
 
@@ -1064,7 +1067,7 @@ ${OUT}/htsearch: ${OUTLIB}/htsearch ${OUTLIB}/presea
 ${OUTLIB}/spadbuf: ${SPADBUF_OBJS} ${LIB}/sockio-c.o ${LIB}/bsdsignal.o \
                    ${LIB}/wct.o ${LIB}/edin.o ${LIB}/prt.o ${LIB}/cursor.o \
                    ${LIB}/fnct-key.o
-	@ echo making ${OUTLIB}/spadbuf
+	@ echo 148 making ${OUTLIB}/spadbuf
 	@ (cd ${OUTLIB} ; \
 	   ${CC} ${SPADBUF_OBJS} -o ${OUTLIB}/spadbuf ${LIB}/sockio-c.o \
 	         ${LIB}/bsdsignal.o ${LIB}/wct.o ${LIB}/edin.o ${LIB}/prt.o \
@@ -1078,7 +1081,7 @@ is up to date. The file contains absolute offsets into the various
 order to do this we run [[htadd]] in the [[${HYPER}/pages]] directory.
 <<pages>>=
 ${HYPER}/pages/ht.db: ${IN}/pages/*.ht ${IN}/pages/*.pht
-	@echo making ${HYPER}/pages from ${SRC}/pages directory
+	@echo 149 making ${HYPER}/pages from ${SRC}/pages directory
 	@ mkdir -p ${HYPER}/pages
 	@ cp -pr pages/*.ht ${HYPER}/pages
 	@ cp -pr pages/*.pht ${HYPER}/pages
@@ -1090,14 +1093,55 @@ ${HYPER}/pages/ht.db: ${IN}/pages/*.ht ${IN}/pages/*.pht
 	@ cp -pr viewports ${MNT}/${SYS}/doc
 
 @
+<<browse>>=
+${HYPER}/rootpage.xhtml: ${IN}/bookvol11.pamphlet
+	@ echo 150 making ${HYPER}/xhtml from ${IN}/bookvol11.pamphlet
+	( cd ${HYPER} ; \
+          cp ${IN}/bookvol11.pamphlet . ; \
+          ${TANGLE} -t8 bookvol11.pamphlet >Makefile.pages ; \
+          make -j 10 -f Makefile.pages ; \
+          rm -f Makefile.pages ; \
+          rm -f bookvol11.pamphlet )
+
+${HYPER}/bigbayou.png: ${IN}/bigbayou.png
+	@ echo 151 making ${HYPER}/bigbayou.png from ${IN}/bigbayou.png
+	@ cp ${IN}/bigbayou.png ${HYPER}/bigbayou.png
+
+${HYPER}/doctitle.png: ${IN}/doctitle.png
+	@ echo 152 making ${HYPER}/doctitle.png from ${IN}/doctitle.png
+	@ cp ${IN}/doctitle.png ${HYPER}/doctitle.png
+
+${MNT}/${SYS}/doc/bookvol11.dvi: ${IN}/bookvol11.pamphlet 
+	@ echo 153 making ${MNT}/${SYS}/doc/bookvol11.dvi \
+            from ${IN}/bookvol11.pamphlet
+	@ ( cd ${MNT}/${SYS} ; \
+	    cp ${IN}/bookvol11.pamphlet . ; \
+	    ${DOCUMENT} ${NOISE} bookvol11 ; \
+	    rm -f bookvol11.pamphlet ; \
+	    rm -f bookvol11.tex ; \
+	    rm -f bookvol11.idx ; \
+	    rm -f bookvol11 )
+
+@
+<<axbook>>=
+${HYPER}/axbook/book-index.xhtml: ${IN}/axbook.tgz
+	@ echo 154 making ${HYPER}/axbook/*.xhtml from ${IN}/axbook.tgz
+	@( cd ${HYPER} ; tar -zxf ${IN}/axbook.tgz )
+
+@
 <<*>>=
 <<environment>>
 all: ${INCLUDES} ${BITMAPS} ${OBJS} ${SCRIPTS} ${BINFILES} \
-     ${HYPER}/pages/ht.db ${DOCFILES} 
-	@ echo 141 finished ${IN}
+     ${HYPER}/pages/ht.db ${DOCFILES} ${HYPER}/rootpage.xhtml \
+     ${HYPER}/axbook/book-index.xhtml ${MNT}/${SYS}/doc/bookvol11.dvi \
+     ${HYPER}/bigbayou.png ${HYPER}/doctitle.png
+	@ echo 155 finished ${IN}
 
 clean:
-	@echo 142 cleaning ${SRC}/hyper
+	@echo 156 cleaning ${SRC}/hyper
+
+<<browse>>
+<<axbook>>
 
 <<addfile>>
 <<bitmaps>>
@@ -1145,6 +1189,7 @@ clean:
 <<htadd (BIN)>>
 <<hthits (BIN)>>
 <<htsearch (BIN)>>
+
 <<hypertex (BIN)>>
 <<spadbuf (BIN)>>
 
diff --git a/src/hyper/axbook.tgz b/src/hyper/axbook.tgz
new file mode 100644
index 0000000..2baf4bb
Binary files /dev/null and b/src/hyper/axbook.tgz differ
diff --git a/src/hyper/bigbayou.png b/src/hyper/bigbayou.png
new file mode 100644
index 0000000..14a7e2a
Binary files /dev/null and b/src/hyper/bigbayou.png differ
diff --git a/src/hyper/bookvol11.pamphlet b/src/hyper/bookvol11.pamphlet
new file mode 100644
index 0000000..295ffe0
--- /dev/null
+++ b/src/hyper/bookvol11.pamphlet
@@ -0,0 +1,22191 @@
+\documentclass{book}
+\usepackage{axiom}
+\usepackage{makeidx}
+\makeindex
+\usepackage{graphicx}
+\begin{document}
+\begin{titlepage}
+\center{\includegraphics{ps/axiomfront.ps}}
+\vskip 0.1in
+\includegraphics{ps/bluebayou.ps}\\
+\vskip 0.1in
+{\Huge{The 30 Year Horizon}}
+\vskip 0.1in
+$$
+\begin{array}{lll}
+Manuel\ Bronstein      & William\ Burge   & Timothy\ Daly \\
+James\ Davenport       & Michael\ Dewar   & Martin\ Dunstan \\
+Albrecht\ Fortenbacher & Patrizia\ Gianni & Johannes\ Grabmeier \\
+Jocelyn\ Guidry        & Richard\ Jenks   & Larry\ Lambe \\
+Michael\ Monagan       & Scott\ Morrison  & William\ Sit \\
+Jonathan\ Steinbach    & Robert\ Sutor    & Barry\ Trager \\
+Stephen\ Watt          & Jim\ Wen         & Clifton\ Williamson
+\end{array}
+$$
+\center{\large{VOLUME 11: BROWSER}}
+\end{titlepage}
+\pagenumbering{roman}
+\begin{verbatim}
+Portions Copyright (c) 2007 Timothy Daly
+Portions Copyright (c) 2007 Alfredo Portes
+Portions Copyright (c) 2007 Arthur Ralfs
+
+The Blue Bayou image Copyright (c) 2004 Jocelyn Guidry
+
+This book is licensed as follows:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    - Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    - Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in
+      the documentation and/or other materials provided with the
+      distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+\end{verbatim}
+
+Inclusion of names in the list of credits is based on historical
+information and is as accurate as possible. Inclusion of names
+does not in any way imply an endorsement but represents historical
+influence on Axiom development.
+\vfill
+\eject
+\begin{tabular}{lll}
+Cyril Alberga         & Roy Adler             & Richard Anderson\\
+George Andrews        & Henry Baker           & Stephen Balzac\\
+Yurij Baransky        & David R. Barton       & Gerald Baumgartner\\
+Gilbert Baumslag      & Fred Blair            & Vladimir Bondarenko\\
+Mark Botch            & Alexandre Bouyer      & Peter A. Broadbery\\
+Martin Brock          & Manuel Bronstein      & Florian Bundschuh\\
+William Burge         & Quentin Carpent       & Bob Caviness\\
+Bruce Char            & Cheekai Chin          & David V. Chudnovsky\\
+Gregory V. Chudnovsky & Josh Cohen            & Christophe Conil\\
+Don Coppersmith       & George Corliss        & Robert Corless\\
+Gary Cornell          & Meino Cramer          & Claire Di Crescenzo\\
+Timothy Daly Sr.      & Timothy Daly Jr.      & James H. Davenport\\
+Jean Della Dora       & Gabriel Dos Reis      & Michael Dewar\\
+Claire DiCrescendo    & Sam Dooley            & Lionel Ducos\\
+Martin Dunstan        & Brian Dupee           & Dominique Duval\\
+Robert Edwards        & Heow Eide-Goodman     & Lars Erickson\\
+Richard Fateman       & Bertfried Fauser      & Stuart Feldman\\
+Brian Ford            & Albrecht Fortenbacher & George Frances\\
+Constantine Frangos   & Timothy Freeman       & Korrinn Fu\\
+Marc Gaetano          & Rudiger Gebauer       & Kathy Gerber\\
+Patricia Gianni       & Holger Gollan         & Teresa Gomez-Diaz\\
+Laureano Gonzalez-Vega& Stephen Gortler       & Johannes Grabmeier\\
+Matt Grayson          & James Griesmer        & Vladimir Grinberg\\
+Oswald Gschnitzer     & Jocelyn Guidry        & Steve Hague\\
+Vilya Harvey          & Satoshi Hamaguchi     & Martin Hassner\\
+Ralf Hemmecke         & Henderson             & Antoine Hersen\\
+Pietro Iglio          & Richard Jenks         & Kai Kaminski\\
+Grant Keady           & Tony Kennedy          & Paul Kosinski\\
+Klaus Kusche          & Bernhard Kutzler      & Larry Lambe\\
+Frederic Lehobey      & Michel Levaud         & Howard Levy\\
+Rudiger Loos          & Michael Lucks         & Richard Luczak\\
+Camm Maguire          & Bob McElrath          & Michael McGettrick\\
+Ian Meikle            & David Mentre          & Victor S. Miller\\
+Gerard Milmeister     & Mohammed Mobarak      & H. Michael Moeller\\
+Michael Monagan       & Marc Moreno-Maza      & Scott Morrison\\
+Mark Murray           & William Naylor        & C. Andrew Neff\\
+John Nelder           & Godfrey Nolan         & Arthur Norman\\
+Jinzhong Niu          & Michael O'Connor      & Kostas Oikonomou\\
+Julian A. Padget      & Bill Page             & Jaap Weel\\
+Susan Pelzel          & Michel Petitot        & Didier Pinchon\\
+Claude Quitte         & Norman Ramsey         & Michael Richardson\\
+Renaud Rioboo         & Jean Rivlin           & Nicolas Robidoux\\
+Simon Robinson        & Michael Rothstein     & Martin Rubey\\
+Philip Santas         & Alfred Scheerhorn     & William Schelter\\
+Gerhard Schneider     & Martin Schoenert      & Marshall Schor\\
+Fritz Schwarz         & Nick Simicich         & William Sit\\
+Elena Smirnova        & Jonathan Steinbach    & Christine Sundaresan\\
+Robert Sutor          & Moss E. Sweedler      & Eugene Surowitz\\
+James Thatcher        & Baldir Thomas         & Mike Thomas\\
+Dylan Thurston        & Barry Trager          & Themos T. Tsikas\\
+Gregory Vanuxem       & Bernhard Wall         & Stephen Watt\\
+Juergen Weiss         & M. Weller             & Mark Wegman\\
+James Wen             & Thorsten Werther      & Michael Wester\\
+John M. Wiley         & Berhard Will          & Clifton J. Williamson\\
+Stephen Wilson        & Shmuel Winograd       & Robert Wisbauer\\
+Sandra Wityak         & Waldemar Wiwianka     & Knut Wolf\\
+Clifford Yapp         & David Yun             & Richard Zippel\\
+Evelyn Zoernack       & Bruno Zuercher        & Dan Zwillinger 
+\end{tabular}
+\eject
+\tableofcontents
+\vfill
+\eject
+\setlength{\parindent}{0em}
+\setlength{\parskip}{1ex}
+{\Large{\bf New Foreword}}
+\vskip .25in
+
+On October 1, 2001 Axiom was withdrawn from the market and ended
+life as a commercial product.
+On September 3, 2002 Axiom was released under the Modified BSD
+license, including this document.
+On August 27, 2003 Axiom was released as free and open source
+software available for download from the Free Software Foundation's
+website, Savannah.
+
+Work on Axiom has had the generous support of the Center for 
+Algorithms and Interactive Scientific Computation (CAISS) at
+City College of New York. Special thanks go to Dr. Gilbert 
+Baumslag for his support of the long term goal.
+
+The online version of this documentation is roughly 1000 pages.
+In order to make printed versions we've broken it up into three
+volumes. The first volume is tutorial in nature. The second volume
+is for programmers. The third volume is reference material. We've
+also added a fourth volume for developers. All of these changes
+represent an experiment in print-on-demand delivery of documentation.
+Time will tell whether the experiment succeeded.
+
+Axiom has been in existence for over thirty years. It is estimated to
+contain about three hundred man-years of research and has, as of
+September 3, 2003, 143 people listed in the credits. All of these
+people have contributed directly or indirectly to making Axiom
+available.  Axiom is being passed to the next generation. I'm looking
+forward to future milestones.
+
+With that in mind I've introduced the theme of the ``30 year horizon''.
+We must invent the tools that support the Computational Mathematician
+working 30 years from now. How will research be done when every bit of
+mathematical knowledge is online and instantly available? What happens
+when we scale Axiom by a factor of 100, giving us 1.1 million domains?
+How can we integrate theory with code? How will we integrate theorems
+and proofs of the mathematics with space-time complexity proofs and
+running code? What visualization tools are needed? How do we support
+the conceptual structures and semantics of mathematics in effective
+ways? How do we support results from the sciences? How do we teach
+the next generation to be effective Computational Mathematicians?
+
+The ``30 year horizon'' is much nearer than it appears.
+
+\vskip .25in
+%\noindent
+Tim Daly\\
+CAISS, City College of New York\\
+November 10, 2003 ((iHy))
+\vfill
+\eject
+\pagenumbering{arabic}
+\setcounter{chapter}{0} % Chapter 1
+\chapter{Overview}
+This book contains the Firefox browser AJAX routines.
+
+\section{Build Instructions}
+\begin{verbatim}
+  mkdir -p /home/silver/bitmaps
+  cp bookvol11.pamphlet /home/silver
+  cd /home/silver
+  export AXIOM=(where)
+  export PATH=$AXIOM/bin/lib:$AXIOM/bin:$PATH
+  notangle -t8 bookvol11.pamphlet > Makefile
+  make -j 10
+  axiom -nox
+   -> )set mes auto off
+   -> )set out mathml on
+   -> axServer(8085,multiServ)$AXSERV
+
+ Now start your browser and go to:
+   file:///home/silver/rootpage.xhtml
+ and then do:
+   Basic Commands -> Calculus -> Differentiate -> Continue
+   Basic Commands -> Matrix -> Continue
+
+ You should see the result of the differentiate appear inline in the
+ page. You can change the values in the text areas, click continue,
+ and see the new result.
+\end{verbatim}
+
+\section{The Makefile}
+<<*>>=
+TANGLE=${AXIOM}/bin/lib/notangle
+
+%.xhtml: bookvol11.pamphlet
+	@ echo making $*.xhtml
+	@ ${TANGLE} -R"$*.xhtml" bookvol11.pamphlet > $*.xhtml
+
+<<PAGES>>
+
+all: ${PAGES}
+	@ mkdir -p bitmaps
+	@ ${TANGLE} -R"axiom1.bitmap" bookvol11.pamphlet >bitmaps/axiom1.bitmap
+	@ ${TANGLE} -R"rcm3720.input" bookvol11.pamphlet >rcm3720.input
+	@ ${TANGLE} -R"strang.input" bookvol11.pamphlet >strang.input
+	@ ${TANGLE} -R"signatures.txt" bookvol11.pamphlet >signatures.txt
+
+clean:
+	@ rm -rf bitmaps
+	@ rm -f *.xhtml
+	@ rm -f rcm3720.input
+	@ rm -f signatures.txt
+@
+
+\section{Building new pages}
+To add a new page you need to create a page with the default layout below
+and add the name of the page to the PAGES variable below.
+
+Most of the pages have a default layout of the form:
+\begin{verbatim}
+\subsection{pagename.xhtml}
+<<pagename.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <div align="center">Page subtitle goes here</div>
+  <hr/>
+your basic page text goes here.
+<<page foot>>
+@
+\end{verbatim}
+There are several things to observe here:
+<ol>
+ <li>Each page lives in its own subsection and its own chunk.</li>
+ <li>The pagename and the chunkname are the same</li>
+ <li>The chunk includes the @<<standard head>></li>
+ <li>The chunk includes the @<<page head>></li>
+ <li>The chunk includes the @<<page foot>></li>
+</ol>
+The default page layout cannot communicate with Axiom.
+
+\subsection{Communicating with Axiom}
+If your page needs to communicate with Axiom you need to add some
+information in the header of the page.
+The default page that talks to Axiom has the form:
+\begin{verbatim}
+\subsection{pagename.xhtml}
+@<<pagename.xhtml>>=
+@<<standard head>>
+  <script type="text/javascript">
+@<<handlefreevars>>
+@<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+@<<page head>>
+  <div align="center">Page subtitle goes here</div>
+  <hr/>
+your text goes here
+your communication blocks go here
+@<<page foot>>
+\end{verbatim}
+
+\subsection{Handling statements with no free variables}
+Use a makeRequest call with a parameter of the id.
+Note that the div with id of ``ansXX'' will get replaced
+automatically and the ``ans'' prefix is required.
+\begin{verbatim}
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="sin(x)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+\end{verbatim}
+
+\subsection{Handling statements with free variables}
+Free variables exist are used in statements but they are defined in
+other statements. To make sure the free variables have the correct
+values you need to include an explicit list of the other ids that
+need to be executed {\sl before} this statement. You do this with 
+a call to ``handleFree''. It expects a list, enclosed in brackets,
+of the ids to execute in order. Be certain that the current id is
+at the end of the list.
+\begin{verbatim}
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p9','p10']);"
+    value="roman y" />
+  <div id="ansp10"><div></div></div>
+ </li>
+\end{verbatim}
+
+\subsection{Handling domain database lookups}
+Use an anchor tag of the form:
+\begin{verbatim}
+<a href="db.xhtml?Vector">Vector</a>
+\end{verbatim}
+This will be interpreted by Axiom to mean that you want to do a
+lookup on a domain, category, or package whose name follows the 
+question mark. Note that the domain name should NOT be an abbreviation.
+
+\subsection{Handling )show domain}
+Use a block containing a showcall of the form:
+\begin{verbatim}
+ <li>
+  <input type="submit" id="p17" class="subbut" 
+    onclick="showcall('p17');"
+   value=")show DoubleFloat"/>
+  <div id="ansp17"><div></div></div>
+ </li>
+\end{verbatim}
+Note that the ``)show'' must be at the beginning of the line
+and that there can only be one space between the word show and
+the following argument.
+
+\subsection{Handling lisp expressions}
+Use a block containing a lispcall of the form:
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="lispcall('p2');"
+    value="(GETDATABASE '|Matrix| 'CONSTRUCTORMODEMAP)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+Note that this works but you can easily blow away your Axiom 
+session with random statements. Let the coder beware.
+
+\subsection{Handling expressions that have no output}
+Use the CSS class=``noresult'' tag on the input form.
+This causes the item to show up in black text. It is
+still executable and is generally executed by handleFree
+calls because it contains definitions. However, things like
+function definitions in Axiom return no interesting output
+so there is no point in clicking on them.
+\begin{verbatim}
+ <li>
+  <input type="submit" id="p5" class="noresult" 
+    onclick="makeRequest('p5');"
+    value=")set streams calculate 5" />
+  <div id="ansp5"><div></div></div>
+ </li>
+\end{verbatim}
+
+
+\section{Defined Pages}
+Every page in this file is extracted by the Makefile. This is the list
+of pages that will be extracted. It is organized roughly in the hierarchy
+that you see in the browser pages. This is convention and is not required.
+
+The page hierarchy (used by the Makefile) is:
+<<PAGES>>=
+PAGES=rootpage.xhtml \
+        commandline.xhtml \
+        basiccommand.xhtml \
+        tutorial.xhtml \
+        jenks.xhtml \
+          calculus.xhtml \
+            differentiate.xhtml \
+            indefiniteintegral.xhtml \
+            definiteintegral.xhtml \
+            basiclimit.xhtml \
+              reallimit.xhtml \
+              complexlimit.xhtml \
+              summation.xhtml \
+          bcmatrix.xhtml \
+          bcexpand.xhtml \
+          draw.xhtml \
+            draw2donevariable.xhtml \
+            draw2ddefinedcurve.xhtml \
+            draw2dpolynomialequation.xhtml \
+            draw3dtwovariable.xhtml \
+            draw3ddefinedtube.xhtml \
+            draw3ddefinedsurface.xhtml \
+          series.xhtml \
+            seriesexpand.xhtml \
+            taylorseries.xhtml \
+            laurentseries.xhtml \
+            puiseuxseries.xhtml \
+          solve.xhtml \
+            solvelinearequations.xhtml \
+            solvelinearmatrix.xhtml \
+            solvesystempolynomials.xhtml \
+            solvesinglepolynomial.xhtml \
+        topreferencepage.xhtml \
+          releasenotes.xhtml \
+          usersguidepage.xhtml \
+          aldorusersguidepage.xhtml \
+          foundationlibrarydocpage.xhtml \
+          topicspage.xhtml \
+          uglangpage.xhtml \
+          examplesexposedpage.xhtml \
+          ugsyscmdpage.xhtml \
+          operations.xhtml \
+          dblookup.xhtml \
+            dbcharacteristic.xhtml \
+              dbcomplexcomplex.xhtml \
+              dbcomplexconjugate.xhtml \
+              dbcomplexfactor.xhtml \
+              dbcompleximag.xhtml \
+              dbcomplexnorm.xhtml \
+              dbcomplexreal.xhtml \
+            dbcomplexdoublefloat.xhtml \
+            dbcomplexfloat.xhtml \
+            dbcomplexinteger.xhtml \
+            dbexpressioninteger.xhtml \
+            dbfractioninteger.xhtml \
+            dbfractionpolynomialinteger.xhtml \
+            dbopbinary.xhtml \
+            dbopacos.xhtml \
+            dbopacosh.xhtml \
+            dbopacot.xhtml \
+            dbopacoth.xhtml \
+            dbopacsc.xhtml \
+            dbopacsch.xhtml \
+            dbopaddmod.xhtml \
+            dbopairyai.xhtml \
+            dbopairybi.xhtml \
+            dbopapproximants.xhtml \
+            dbopasin.xhtml \
+            dbopasinh.xhtml \
+            dbopasec.xhtml \
+            dbopasech.xhtml \
+            dbopatan.xhtml \
+            dbopatanh.xhtml \
+            dbopbesseli.xhtml \
+            dbopbesselj.xhtml \
+            dbopbesselk.xhtml \
+            dbopbessely.xhtml \
+            dbopbeta.xhtml \
+            dbopcardinalnumber.xhtml \
+            dbopcoefficient.xhtml \
+            dbopcoefficients.xhtml \
+            dbopcoerce.xhtml \
+            dbopcolumn.xhtml \
+            dbopcompactfraction.xhtml \
+            dbopcomplexeigenvectors.xhtml \
+            dbopcomplexelementary.xhtml \
+            dbopcomplexintegrate.xhtml \
+            dbopcomplexlimit.xhtml \
+            dbopcomplexsolve.xhtml \
+            dbopcontent.xhtml \
+            dbopcontinuedfraction.xhtml \
+            dbopconvergents.xhtml \
+            dbopcopy.xhtml \
+            dbopcos.xhtml \
+            dbopcosh.xhtml \
+            dbopcot.xhtml \
+            dbopcoth.xhtml \
+            dbopcount.xhtml \
+            dbopcountableq.xhtml \
+            dbopcsc.xhtml \
+            dbopcsch.xhtml \
+            dbopcycleragits.xhtml \
+            dbopd.xhtml \
+            dbopdecimal.xhtml \
+            dbopdefiningpolynomial.xhtml \
+            dbopdegree.xhtml \
+            dbopdenom.xhtml \
+            dbopdeterminant.xhtml \
+            dbopdiagonalmatrix.xhtml \
+            dbopdigamma.xhtml \
+            dbopdigits.xhtml \
+            dbopdimension.xhtml \
+            dbopdivide.xhtml \
+            dbopeigenmatrix.xhtml \
+            dbopeigenvalues.xhtml \
+            dbopeigenvector.xhtml \
+            dbopeigenvectors.xhtml \
+            dbopelt.xhtml \
+            dbopeval.xhtml \
+            dbopevenq.xhtml \
+            dbopexp.xhtml \
+            dbopfactor.xhtml \
+            dbopfactorfraction.xhtml \
+            dbopfiniteq.xhtml \
+            dbopfirstdenom.xhtml \
+            dbopfirstnumer.xhtml \
+            dbopfractragits.xhtml \
+            dbopgamma.xhtml \
+            dbopgcd.xhtml \
+            dbophex.xhtml \
+            dbophorizconcat.xhtml \
+            dbophtrigs.xhtml \
+            dbophypergeometric0f1.xhtml \
+            dbopinteger.xhtml \
+            dbopintegrate.xhtml \
+            dbopinverse.xhtml \
+            dbopinvmod.xhtml \
+            dboplaurent.xhtml \
+            dboplcm.xhtml \
+            dbopleadingcoefficient.xhtml \
+            dbopleadingmonomial.xhtml \
+            dboplength.xhtml \
+            dboplimit.xhtml \
+            dboplog.xhtml \
+            dboploggamma.xhtml \
+            dbopmainvariable.xhtml \
+            dbopmap.xhtml \
+            dbopmapbang.xhtml \
+            dbopmatrix.xhtml \
+            dbopmax.xhtml \
+            dbopmemberq.xhtml \
+            dbopmin.xhtml \
+            dbopminimumdegree.xhtml \
+            dbopminus.xhtml \
+            dbopmonicdivide.xhtml \
+            dbopmulmod.xhtml \
+            dbopncols.xhtml \
+            dbopnew.xhtml \
+            dbopnorm.xhtml \
+            dbopnrows.xhtml \
+            dbopnthfractionalterm.xhtml \
+            dbopnthroot.xhtml \
+            dbopnullity.xhtml \
+            dbopnullspace.xhtml \
+            dbopnumberoffractionalterms.xhtml \
+            dbopnumer.xhtml \
+            dbopnumeric.xhtml \
+            dbopoperator.xhtml \
+            dboporthonormalbasis.xhtml \
+            dboppadicfraction.xhtml \
+            dboppartialfraction.xhtml \
+            dboppartialquotients.xhtml \
+            dboppattern.xhtml \
+            dboppermanent.xhtml \
+            dboppi.xhtml \
+            dbopplus.xhtml \
+            dboppolygamma.xhtml \
+            dboppositiveremainder.xhtml \
+            dbopprefixragits.xhtml \
+            dbopprimefactor.xhtml \
+            dboppuiseux.xhtml \
+            dbopqelt.xhtml \
+            dbopqseteltbang.xhtml \
+            dbopquatern.xhtml \
+            dbopquo.xhtml \
+            dbopradicaleigenvectors.xhtml \
+            dbopradicalsolve.xhtml \
+            dboprank.xhtml \
+            dbopratdenom.xhtml \
+            dboprealeigenvectors.xhtml \
+            dboprealelementary.xhtml \
+            dbopreduce.xhtml \
+            dbopreductum.xhtml \
+            dboprem.xhtml \
+            dbopresetvariableorder.xhtml \
+            dbopresultant.xhtml \
+            dboprootof.xhtml \
+            dboprootsimp.xhtml \
+            dboprootsof.xhtml \
+            dboprow.xhtml \
+            dboprowechelon.xhtml \
+            dbopsetcolumnbang.xhtml \
+            dbopsetelt.xhtml \
+            dbopseteltbang.xhtml \
+            dbopsetrowbang.xhtml \
+            dbopsetsubmatrixbang.xhtml \
+            dbopsimplify.xhtml\
+            dbopsec.xhtml \
+            dbopsech.xhtml \
+            dbopseries.xhtml \
+            dbopseriessolve.xhtml \
+            dbopsin.xhtml \
+            dbopsingleintegerand.xhtml \
+            dbopsingleintegernot.xhtml \
+            dbopsingleintegeror.xhtml \
+            dbopsingleintegerxor.xhtml \
+            dbopsinh.xhtml \
+            dbopsetvariableorder.xhtml \
+            dbopsolve.xhtml \
+            dbopsqrt.xhtml \
+            dbopstar.xhtml \
+            dbopstarstar.xhtml \
+            dbopsubmatrix.xhtml \
+            dbopsubmatrix.xhtml \
+            dbopsubmod.xhtml \
+            dboptan.xhtml \
+            dboptanh.xhtml \
+            dboptaylor.xhtml \
+            dboptimes.xhtml \
+            dboptotaldegree.xhtml \
+            dboptrace.xhtml \
+            dboptranspose.xhtml \
+            dboptrigs.xhtml \
+            dbopvariables.xhtml \
+            dbopvectorise.xhtml \
+            dbopvectorspace.xhtml \
+            dbopvertconcat.xhtml \
+            dbopwholepart.xhtml \
+            dbopwholeragits.xhtml \
+            dbopzeroof.xhtml \
+            dbopzerosof.xhtml \
+            dbpolynomialinteger.xhtml \
+            dbpolynomialfractioninteger.xhtml \
+          systemvariables.xhtml \
+          glossarypage.xhtml \
+          htxtoppage.xhtml \
+          refsearchpage.xhtml \
+        topicspage.xhtml \
+          numberspage.xhtml \
+            numintegers.xhtml \
+              numgeneralinfo.xhtml \
+              numfactorization.xhtml \
+              numfunctions.xhtml \
+              numexamples.xhtml \
+              numproblems.xhtml \
+            numfractions.xhtml \
+              numrationalnumbers.xhtml \
+              numquotientfields.xhtml \
+            nummachinefloats.xhtml \
+            numfloat.xhtml \
+            numcomplexnumbers.xhtml \
+            numfinitefields.xhtml \
+            numnumericfunctions.xhtml \
+            numcardinalnumbers.xhtml \
+            nummachinesizedintegers.xhtml \
+            numromannumerals.xhtml \
+            numcontinuedfractions.xhtml \
+            numpartialfractions.xhtml \
+            numquaternions.xhtml \
+            numoctonions.xhtml \
+            numrepeatingdecimals.xhtml \
+            numrepeatingbinaryexpansions.xhtml \
+            numrepeatinghexexpansions.xhtml \
+            numotherbases.xhtml \
+          polynomialpage.xhtml \
+            polybasicfunctions.xhtml \
+            polysubstitutions.xhtml \
+            polyfactorization.xhtml \
+              polyfactorization1.xhtml \
+              polyfactorization2.xhtml \
+              polyfactorization3.xhtml \
+              polyfactorization4.xhtml \
+            polygcdandfriends.xhtml \
+            polyroots.xhtml \
+              polyroots1.xhtml \
+              polyroots2.xhtml \
+              polyroots3.xhtml \
+              polyroots4.xhtml \
+            polyspecifictypes.xhtml \
+              polyspecifictypes1.xhtml \
+                factored.xhtml \
+              polyspecifictypes2.xhtml \
+              polyspecifictypes3.xhtml \
+              polyspecifictypes4.xhtml \
+          functionpage.xhtml \
+            funrationalfunctions.xhtml \
+            funalgebraicfunctions.xhtml \
+            funelementaryfunctions.xhtml \
+            funsimplification.xhtml \
+            funpatternmatching.xhtml \
+            funoperatoralgebra.xhtml \
+          equationpage.xhtml \
+            equsystemlinear.xhtml \
+            equdifferential.xhtml \
+              equdifferentiallinear.xhtml \
+              equdifferentialnonlinear.xhtml \
+              equdifferentialpowerseries.xhtml \
+          calculuspage.xhtml \
+            callimits.xhtml \
+            calderivatives.xhtml \
+            calintegrals.xhtml \
+            calmoreintegrals.xhtml \
+            callaplace.xhtml \
+            calseries.xhtml \
+              calseries1.xhtml \
+              calseries2.xhtml \
+              calseries3.xhtml \
+              calseries4.xhtml \
+              calseries5.xhtml \
+              calseries6.xhtml \
+              calseries7.xhtml \
+              calseries8.xhtml \
+          linalgpage.xhtml \
+            linintro.xhtml \
+            lincreate.xhtml \
+            linoperations.xhtml \
+            lineigen.xhtml \
+            linhilbert.xhtml \
+            linpermaent.xhtml \
+            linvectors.xhtml \
+            linsquarematrices.xhtml \
+            lin1darrays.xhtml \
+            lin2darrays.xhtml \
+            linconversion.xhtml \
+          graphicspage.xhtml \
+            graphexamples.xhtml \
+            graph2d.xhtml \
+            graph3d.xhtml \
+            graphviewports.xhtml \
+          algebrapage.xhtml \
+            algnumbertheory.xhtml \
+            alggrouptheory.xhtml \
+          cryptopage.xhtml \
+            cryptoclass1.xhtml \
+            cryptoclass2.xhtml \
+            cryptoclass3.xhtml \
+            cryptoclass4.xhtml \
+            cryptoclass5.xhtml \
+            cryptoclass6.xhtml \
+            cryptoclass7.xhtml \
+            cryptoclass8.xhtml \
+            cryptoclass9.xhtml \
+            cryptoclass10.xhtml \
+            cryptoclass11.xhtml \
+          ocwmit18085.xhtml \
+            ocwmit18085lecture1.xhtml \
+            ocwmit18085lecture2.xhtml \
+        man0page.xhtml \
+        topexamplepage.xhtml \
+        topsettingspage.xhtml \
+        axiomfonts.xhtml \
+        pagelist.xhtml \
+        pagematrix.xhtml \
+        pageonedimensionalarray.xhtml \
+        pagepermanent.xhtml \
+        pageset.xhtml \
+        pagesquarematrix.xhtml \
+        pagetable.xhtml \
+        pagetwodimensionalarray.xhtml \
+        pagevector.xhtml 
+
+@
+
+\section{The Standard Layout}
+Generally a page has a standard layout using a couple of chunks
+to minimize the typing. The defined chunks are:
+\begin{itemize}
+\item ``standard head'' which includes the head element, xmlns, meta, and
+title element. It also contains the ``style'' element for CSS information.
+\item ``page head'' contains the banner information
+\item ``page foot'' contains the trailing page information and the
+body-end and html-end tags
+\end{itemize}
+So the basic layout looks like
+\begin{verbatim}
+@<<standard head>>
+    (local and general javascript goes here)
+ </head>
+ <body>
+@<<page head>>
+    (local page definition goes here)
+@<<page foot>>
+\end{verbatim}
+So all you need to worry about are the actual page forms and the
+javascript to fetch those forms.
+
+For ``active pages'', that is those that communicate with Axiom
+they generally define a javascript function called ``commandline''
+which formats the request to be sent to the host. You also need to
+include the ``axiom talker'' chunk. Note that ``axiom talker''
+expects the ``commandline'' function to exist and calls it. Thus,
+for the page that handles differentiation calls to Axiom we add 
+the local javascript:
+\begin{verbatim}
+
+  <script type="text/javascript">
+   function commandline(arg) {
+    return(document.getElementById('comm').value);
+   }
+@<<axiom talker>>
+  </script>
+
+\end{verbatim}
+This defined the ``commandline'' function and embeds the ``axiom talker''.
+The ``commandline'' function knows how to fetch fields from the rest of
+the page and format them into a single Axiom string. This is page
+specific code. For example, this shows a single input line which
+will be sent to the host when the ``Continue'' is pressed:
+\begin{verbatim}
+  <form id="commreq">
+    <p>
+      Type an input command line to Axiom:<br/>
+      <input type="text" id="comm" name="command" size="80"/>
+     @<<continue button>>
+    </p>
+  </form>
+ @<<answer field>>
+\end{verbatim}
+
+Note that the commandline function takes an argument which it gets
+from the caller, makeRequest. This argument can be used to distinguish
+which button was pressed.
+
+The {\bf div} section with {\bf id=``mathAns''} is replaced by the
+result sent from the server.
+
+\section{Cascading Style Sheet}
+This is the standard CSS style section that gets included with every
+page. We do this here but it could be a separate style sheet. It 
+hardly matters either way as the style sheet is trivial.
+\begin{verbatim}
+\end{verbatim}
+<<style>>=
+  <style>
+
+   html {
+     background-color: #FFFF66;
+   }
+
+   body { 
+     margin: 0px;
+     padding: 0px;
+   }
+
+   div.command { 
+     color:red;
+   }
+
+   div.center {
+     color:blue;
+   }
+
+   div.reset {
+     visibility:hidden;
+   }
+
+   div.mathml { 
+     color:blue;
+   }
+
+   input.subbut {
+     background-color:#FFFF66;
+     border: 0;
+     color:green;
+     font-family: "Courier New", Courier, monospace;
+   }
+
+   input.noresult {
+     background-color:#FFFF66;
+     border: 0;
+     color:black;
+     font-family: "Courier New", Courier, monospace;
+   }
+
+   span.cmd { 
+     color:green;
+     font-family: "Courier New", Courier, monospace;
+   }
+
+   pre {
+     font-family: "Courier New", Courier, monospace;
+   }
+  </style>
+@
+
+\section{standard head}
+This is the standard head section. It is used on pages that do not
+include javascript. Note that it does NOT include the </head> so
+the javascript can be added easily.
+<<standard head>>=
+<?xml version="1.0" encoding="UTF-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml" 
+      xmlns:xlink="http://www.w3.org/1999/xlink">
+ <head>
+  <meta http-equiv="Content-Type" content="text/html" charset="us-ascii"/>
+  <title>Axiom Documentation</title>
+<<style>>
+@
+This is the standard page header.
+<<page head>>=
+  <div align="center"><img align="middle" src="doctitle.png"/></div>
+  <hr/>
+@
+This is the standard page foot.
+<<page foot>>=
+ </body>
+</html>
+@
+This is the standard continue button
+<<continue button>>=
+   <center>
+     <input type="button" value="Continue" name="continue" 
+       onclick="javascript:makeRequest('');"/>
+   </center>
+@
+This is where to place the math answer
+<<answer field>>=
+  <div id="mathAns"><div></div></div>
+@
+
+\section{Javascript functions}
+\subsection{Show only mathml}
+This function will show only the mathml result in the response.
+It is useful for particular pages that have lists of equations
+where all you care about are the answers.
+<<showonlymathml>>=
+<![CDATA[
+// The structure returned from Axiom now is
+// <div class="stepnum"></div>
+// <div class="command"></div>
+// <div class="algebra"></div>
+// <div class="mathml"></div>
+// <div class="type"></div>
+// This function will pick up the mathml and put it into 'indiv'
+ function showanswer(mathString,indiv) {
+    var mystr = mathString.split("</div>");
+    var mymathstr = mystr[3].concat("</div>");
+    // this turns the string into a dom fragment
+    var mathRange = document.createRange();
+    var mathBox=document.createElementNS('http://www.w3.org/1999/xhtml','div');
+    mathRange.selectNodeContents(mathBox);
+    var mymath = mathRange.createContextualFragment(mymathstr);
+    mathBox.appendChild(mymath);
+    // now we need to format it properly
+    // and we stick the result into the requested div block as a child.
+    var mathAns = document.getElementById(indiv);
+    mathAns.removeChild(mathAns.firstChild);
+    mathAns.appendChild(mathBox);
+  }
+]]>
+@
+
+\subsection{Show Full Answer}
+This function will show the full answer in the response including the
+step number, the command, the mathml and the type. The algebra portion
+is currently ignored.
+<<showfullanswer>>=
+// The structure returned from Axiom now is
+// <div class="stepnum"></div>
+// <div class="command"></div>
+// <div class="algebra"></div>
+// <div class="mathml"></div>
+// <div class="type"></div>
+// This function will format the output as a console session
+<![CDATA[
+ function showanswer(mathString,indiv) {
+    var mystr = mathString.split("</div>");
+      // first we prepare the step number
+    var mystept1 = mystr[0].lastIndexOf(">");
+    var mystepstr = mystr[0].substr(mystept1+1);
+      // now we get the command
+    var mycmdt1 = mystr[1].lastIndexOf(">");
+    var mycmdstr = mystr[1].substr(mycmdt1+1);
+    var myprompt = '('+mystepstr+') -> '+mycmdstr;
+      // now we handle the mathml
+    var mymathstr = mystr[3].concat("</div>");
+      // and the type, we need to insert the string "Type: "
+    var mytypet1 = mystr[4].lastIndexOf(">");
+    var mytypet2 = mystr[4].substr(mytypet1+1).concat("</div>");
+    var mytypestr = '<div> Type: '.concat(mytypet2);
+      // bang the whole thing together
+    var finaldiv='<div class="command">'+myprompt+'</div>'+mymathstr+mytypestr;
+      // this turns the string into a dom fragment
+    var mathRange = document.createRange();
+    var mathBox=document.createElementNS('http://www.w3.org/1999/xhtml','div');
+    mathRange.selectNodeContents(mathBox);
+    var answer = mathRange.createContextualFragment(finaldiv);
+    mathBox.appendChild(answer);
+      // and we stick the result into the requested div block as a child.
+    var mathAns = document.getElementById(indiv);
+    mathAns.removeChild(mathAns.firstChild);
+    mathAns.appendChild(mathBox);
+ }
+]]>
+@
+
+\subsection{Handle Free Variables}
+<<handlefreevars>>=
+<![CDATA[
+     // This is a hash table of the values we've evaluated.
+     // This is indexed by a string argument. 
+     // A value of 0 means we need to evaluate the expression
+     // A value of 1 means we have evaluated the expression
+   Evaled = new Array();
+     // this says we should modify the page
+   hiding = 'show';
+     // and this is the id of the div tag to modify (defaulted)
+   thediv = 'mathAns';
+     // commandline will mark that its arg has been evaled so we don't repeat
+   function commandline(arg) {
+     Evaled[arg] = 0;  // remember that we have set this value
+     thediv='ans'+arg; // mark where we should put the output
+     var ans = document.getElementById(arg).value;
+     return(ans);
+   }
+   // the function only modifies the page if when we're showing the
+   // final result, otherwise it does nothing.
+   function showanswer(mathString,indiv) {
+     if (hiding == 'show') { // only do something useful if we're showing
+       indiv = thediv;  // override the argument so we can change it
+       var mystr = mathString.split("</div>");
+       for (var i=0; i < mystr.length; i++) {
+         if (mystr[i].indexOf("mathml") > 0) {
+           var mymathstr = mystr[i].concat("</div>");
+         }
+       }
+       // this turns the string into a dom fragment
+       var mathRange = document.createRange();
+       var mathBox=
+               document.createElementNS('http://www.w3.org/1999/xhtml','div');
+       mathRange.selectNodeContents(mathBox);
+       var mymath = mathRange.createContextualFragment(mymathstr);
+       mathBox.appendChild(mymath);
+       // now we need to format it properly
+       // and we stick the result into the requested div block as a child.
+       var mathAns = document.getElementById(indiv);
+       mathAns.removeChild(mathAns.firstChild);
+       mathAns.appendChild(mathBox);
+     }
+   }
+   // this function takes a list of expressions ids to evaluate
+   // the list contains a list of "free" expression ids that need to
+   // be evaluated before the last expression. 
+   // For each expression id, if it has not yet been evaluated we
+   // evaluate it "hidden" otherwise we can skip the expression.
+   // Once we have evaluated all of the free expressions we can
+   // evaluate the final expression and modify the page.
+   function handleFree(arg) {
+     var placename = arg.pop();      // last array val is real
+     var mycnt = arg.length;         // remaining free vars
+       // we handle all of the prerequired expressions quietly
+     hiding = 'hide';
+     for (var i=0; i<mycnt; i++) {   // for each of the free variables
+       if (Evaled[arg[i]] == null) { // if we haven't evaled it
+         Evaled[arg[i]] = 0;         // remember we evaled it
+         makeRequest(arg[i]);        // initialize the free values
+       }
+     }
+       // and now we start talking to the page again
+     hiding = 'show';                // we want to show this
+     thediv = 'ans'+placename;       // at this div id
+     makeRequest(placename);         // and we eval and show it
+   }
+]]>
+@
+\subsection{axiom talker}
+<<axiom talker>>=
+<![CDATA[
+  function ignoreResponse() {}
+  function resetvars() {
+    http_request = new XMLHttpRequest();         
+    http_request.open('POST', '127.0.0.1:8085', true);
+    http_request.onreadystatechange = ignoreResponse;
+    http_request.setRequestHeader('Content-Type', 'text/plain');
+    http_request.send("command=)clear all");
+    return(false);
+  }
+]]>
+ function init() {
+ }
+ function makeRequest(arg) {
+   http_request = new XMLHttpRequest();         
+   var command = commandline(arg);
+   //alert(command);
+   http_request.open('POST', '127.0.0.1:8085', true);
+   http_request.onreadystatechange = handleResponse;
+   http_request.setRequestHeader('Content-Type', 'text/plain');
+   http_request.send("command="+command);
+   return(false);
+ }
+ function lispcall(arg) {
+   http_request = new XMLHttpRequest();         
+   var command = commandline(arg);
+   //alert(command);
+   http_request.open('POST', '127.0.0.1:8085', true);
+   http_request.onreadystatechange = handleResponse;
+   http_request.setRequestHeader('Content-Type', 'text/plain');
+   http_request.send("lispcall="+command);
+   return(false);
+ }
+ function showcall(arg) {
+   http_request = new XMLHttpRequest();         
+   var command = commandline(arg);
+   //alert(command);
+   http_request.open('POST', '127.0.0.1:8085', true);
+   http_request.onreadystatechange = handleResponse;
+   http_request.setRequestHeader('Content-Type', 'text/plain');
+   http_request.send("showcall="+command);
+   return(false);
+ }
+ function interpcall(arg) {
+   http_request = new XMLHttpRequest();         
+   var command = commandline(arg);
+   //alert(command);
+   http_request.open('POST', '127.0.0.1:8085', true);
+   http_request.onreadystatechange = handleResponse;
+   http_request.setRequestHeader('Content-Type', 'text/plain');
+   http_request.send("interpcall="+command);
+   return(false);
+ }
+ function handleResponse() {
+  if (http_request.readyState == 4) {
+   if (http_request.status == 200) {
+    showanswer(http_request.responseText,'mathAns');
+   } else
+   {
+     alert('There was a problem with the request.'+ http_request.statusText);
+   }
+  }
+ }
+
+@
+
+\section{Pages}
+<<testpage.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Test Page</div>
+  <hr/>
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="showcall('p1');"
+   value="Integer" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="showcall('p2');"
+    value="(GETDATABASE '|Matrix| 'CONSTRUCTORMODEMAP)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="showcall('p3');"
+   value="(progn (setq |$options| '((|operations|))) (|show| '|Integer|))" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+
+<<page foot>>
+@
+%%A
+\subsection{axiomfonts.xhtml}
+<<axiomfonts.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <div align="center">Special Font Characters</div>
+  <hr/>
+<table>
+ <tr valign="top">
+  <th width="80" align="left">Character</th>
+  <th width="80" align="left">Decimal</th>
+  <th width="80" align="left">Hex</th>
+  <th width="80" align="left">Entity</th>
+  <th align="left">Name</th>
+ </tr>
+ <tr valign="top">
+  <td>&#x000AF;</td>
+  <td>175</td>
+  <td>000AF</td>
+  <td>&amp;macr;</td>
+  <td>macron</td>
+ </tr>
+ <tr valign="top">
+  <td>&#x000E8;</td>
+  <td>232</td>
+  <td>000E8</td>
+  <td>&amp;egrave;</td>
+  <td>latin small letter e with grave</td>
+ </tr>
+ <tr valign="top">
+  <td>&#x003C0;</td>
+  <td>960</td>
+  <td>003C0</td>
+  <td>&amp;pi;</td>
+  <td>greek small letter pi</td>
+ </tr>
+ <tr valign="top">
+  <td>&#x003D5;</td>
+  <td>981</td>
+  <td>003D5</td>
+  <td></td>
+  <td>greek phi symbol</td>
+ </tr>
+ <tr valign="top">
+  <td>&#x02026;</td>
+  <td>8230</td>
+  <td>02026</td>
+  <td>&amp;hellip;</td>
+  <td>horizontal ellipsis</td>
+ </tr>
+ <tr valign="top">
+  <td>&#x02032;</td>
+  <td>8242</td>
+  <td>02032</td>
+  <td>&amp;prime;</td>
+  <td>prime</td>
+ </tr>
+ <tr valign="top">
+  <td>&#x02061;</td>
+  <td>8289</td>
+  <td>02061</td>
+  <td></td>
+  <td>function application</td>
+ </tr>
+ <tr valign="top">
+  <td>&#x02062;</td>
+  <td>8290</td>
+  <td>02062</td>
+  <td></td>
+  <td>invisible times</td>
+ </tr>
+ <tr valign="top">
+  <td>&#x02146;</td>
+  <td>8518</td>
+  <td>02146</td>
+  <td></td>
+  <td>double-struck italic small d</td>
+ </tr>
+ <tr valign="top">
+  <td>&#x02147;</td>
+  <td>8519</td>
+  <td>02147</td>
+  <td></td>
+  <td>double-struck italic small e</td>
+ </tr>
+ <tr valign="top">
+  <td>&#x02148;</td>
+  <td>8520</td>
+  <td>02148</td>
+  <td></td>
+  <td>double-struck italic small i</td>
+ </tr>
+ <tr valign="top">
+  <td>&#x02192;</td>
+  <td>8594</td>
+  <td>02192</td>
+  <td>&amp;rarr;</td>
+  <td>rightwards arrow</td>
+ </tr>
+ <tr><td>----</td><td>----</td><td>----</td><td>----</td><td>----</td></tr>
+ <tr valign="top">
+  <td>&#8704;</td>
+  <td>8704</td>
+  <td>2200</td>
+  <td>&amp;forall;</td>
+  <td>for all</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8705;</td>
+  <td>8705</td>
+  <td>2201</td>
+  <td></td>
+  <td>complement</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8706;</td>
+  <td>8706</td>
+  <td>2202</td>
+  <td>&amp;part;</td>
+  <td>partial differential</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8707;</td>
+  <td>8707</td>
+  <td>2203</td>
+  <td>&amp;exist;</td>
+  <td>there exists</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8708;</td>
+  <td>8708</td>
+  <td>2204</td>
+  <td></td>
+  <td>there does not exist</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8709;</td>
+  <td>8709</td>
+  <td>2205</td>
+  <td>&amp;empty;</td>
+  <td>empty set</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8710;</td>
+  <td>8710</td>
+  <td>2206</td>
+  <td></td>
+  <td>increment</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8711;</td>
+  <td>8711</td>
+  <td>2207</td>
+  <td>&amp;nabla;</td>
+  <td>nabla</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8712;</td>
+  <td>8712</td>
+  <td>2208</td>
+  <td>&amp;isin;</td>
+  <td>element of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8713;</td>
+  <td>8713</td>
+  <td>2209</td>
+  <td>&amp;notin;</td>
+  <td>not an element of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8714;</td>
+  <td>8714</td>
+  <td>220A</td>
+  <td></td>
+  <td>small element of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8715;</td>
+  <td>8715</td>
+  <td>220B</td>
+  <td>&amp;ni;</td>
+  <td>contains as member</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8716;</td>
+  <td>8716</td>
+  <td>220C</td>
+  <td></td>
+  <td>does not contain as member</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8717;</td>
+  <td>8717</td>
+  <td>220D</td>
+  <td></td>
+  <td>small contains as member</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8718;</td>
+  <td>8718</td>
+  <td>220E</td>
+  <td></td>
+  <td>end of proof</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8719;</td>
+  <td>8719</td>
+  <td>220F</td>
+  <td>&amp;prod;</td>
+  <td>n-ary product</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8720;</td>
+  <td>8720</td>
+  <td>2210</td>
+  <td></td>
+  <td>n-ary coproduct</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8721;</td>
+  <td>8721</td>
+  <td>2211</td>
+  <td>&amp;sum;</td>
+  <td>n-ary summation</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8722;</td>
+  <td>8722</td>
+  <td>2212</td>
+  <td>&amp;minus;</td>
+  <td>minus sign</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8723;</td>
+  <td>8723</td>
+  <td>2213</td>
+  <td></td>
+  <td>minus-or-plus sign</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8724;</td>
+  <td>8724</td>
+  <td>2214</td>
+  <td></td>
+  <td>dot plus</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8725;</td>
+  <td>8725</td>
+  <td>2215</td>
+  <td></td>
+  <td>division slash</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8726;</td>
+  <td>8726</td>
+  <td>2216</td>
+  <td></td>
+  <td>set minus</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8727;</td>
+  <td>8727</td>
+  <td>2217</td>
+  <td>&amp;lowast;</td>
+  <td>asterisk operator</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8728;</td>
+  <td>8728</td>
+  <td>2218</td>
+  <td></td>
+  <td>ring operator</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8729;</td>
+  <td>8729</td>
+  <td>2219</td>
+  <td></td>
+  <td>bullet operator</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8730;</td>
+  <td>8730</td>
+  <td>221A</td>
+  <td>&amp;radic;</td>
+  <td>square root</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8731;</td>
+  <td>8731</td>
+  <td>221B</td>
+  <td></td>
+  <td>cube root</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8732;</td>
+  <td>8732</td>
+  <td>221C</td>
+  <td></td>
+  <td>fourth root</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8733;</td>
+  <td>8733</td>
+  <td>221D</td>
+  <td>&amp;prop;</td>
+  <td>proportional to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8734;</td>
+  <td>8734</td>
+  <td>221E</td>
+  <td>&amp;infin;</td>
+  <td>infinity</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8735;</td>
+  <td>8735</td>
+  <td>221F</td>
+  <td></td>
+  <td>right angle</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8736;</td>
+  <td>8736</td>
+  <td>2220</td>
+  <td>&amp;ang;</td>
+  <td>angle</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8737;</td>
+  <td>8737</td>
+  <td>2221</td>
+  <td></td>
+  <td>measured angle</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8738;</td>
+  <td>8738</td>
+  <td>2222</td>
+  <td></td>
+  <td>spherical angle</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8739;</td>
+  <td>8739</td>
+  <td>2223</td>
+  <td></td>
+  <td>divides</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8740;</td>
+  <td>8740</td>
+  <td>2224</td>
+  <td></td>
+  <td>does not divide</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8741;</td>
+  <td>8741</td>
+  <td>2225</td>
+  <td></td>
+  <td>parallel to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8742;</td>
+  <td>8742</td>
+  <td>2226</td>
+  <td></td>
+  <td>not parallel to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8743;</td>
+  <td>8743</td>
+  <td>2227</td>
+  <td>&amp;and;</td>
+  <td>logical and</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8744;</td>
+  <td>8744</td>
+  <td>2228</td>
+  <td>&amp;or;</td>
+  <td>logical or</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8745;</td>
+  <td>8745</td>
+  <td>2229</td>
+  <td>&amp;cap;</td>
+  <td>intersection</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8746;</td>
+  <td>8746</td>
+  <td>222A</td>
+  <td>&amp;cup;</td>
+  <td>union</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8747;</td>
+  <td>8747</td>
+  <td>222B</td>
+  <td>&amp;int;</td>
+  <td>integral</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8748;</td>
+  <td>8748</td>
+  <td>222C</td>
+  <td></td>
+  <td>double integral</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8749;</td>
+  <td>8749</td>
+  <td>222D</td>
+  <td></td>
+  <td>triple integral</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8750;</td>
+  <td>8750</td>
+  <td>222E</td>
+  <td></td>
+  <td>contour integral</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8751;</td>
+  <td>8751</td>
+  <td>222F</td>
+  <td></td>
+  <td>surface integral</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8752;</td>
+  <td>8752</td>
+  <td>2230</td>
+  <td></td>
+  <td>volume integral</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8753;</td>
+  <td>8753</td>
+  <td>2231</td>
+  <td></td>
+  <td>clockwise integral</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8754;</td>
+  <td>8754</td>
+  <td>2232</td>
+  <td></td>
+  <td>clockwise contour integral</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8755;</td>
+  <td>8755</td>
+  <td>2233</td>
+  <td></td>
+  <td>anticlockwise contour integral</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8756;</td>
+  <td>8756</td>
+  <td>2234</td>
+  <td>&amp;there4;</td>
+  <td>therefore</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8757;</td>
+  <td>8757</td>
+  <td>2235</td>
+  <td></td>
+  <td>because</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8758;</td>
+  <td>8758</td>
+  <td>2236</td>
+  <td></td>
+  <td>ratio</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8759;</td>
+  <td>8759</td>
+  <td>2237</td>
+  <td></td>
+  <td>proportion</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8760;</td>
+  <td>8760</td>
+  <td>2238</td>
+  <td></td>
+  <td>dot minus</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8761;</td>
+  <td>8761</td>
+  <td>2239</td>
+  <td></td>
+  <td>excess</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8762;</td>
+  <td>8762</td>
+  <td>223A</td>
+  <td></td>
+  <td>geometric proportion</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8763;</td>
+  <td>8763</td>
+  <td>223B</td>
+  <td></td>
+  <td>homothetic</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8764;</td>
+  <td>8764</td>
+  <td>223C</td>
+  <td>&amp;sim;</td>
+  <td>tilde operator</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8765;</td>
+  <td>8765</td>
+  <td>223D</td>
+  <td></td>
+  <td>reversed tilde</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8766;</td>
+  <td>8766</td>
+  <td>223E</td>
+  <td></td>
+  <td>inverted lazy S</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8767;</td>
+  <td>8767</td>
+  <td>223F</td>
+  <td></td>
+  <td>sine wave</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8768;</td>
+  <td>8768</td>
+  <td>2240</td>
+  <td></td>
+  <td>wreath products</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8769;</td>
+  <td>8769</td>
+  <td>2241</td>
+  <td></td>
+  <td>not tilde</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8770;</td>
+  <td>8770</td>
+  <td>2242</td>
+  <td></td>
+  <td>minus tilde</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8771;</td>
+  <td>8771</td>
+  <td>2243</td>
+  <td></td>
+  <td>asymptotically equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8772;</td>
+  <td>8772</td>
+  <td>2244</td>
+  <td></td>
+  <td>not asymptotically equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8773;</td>
+  <td>8773</td>
+  <td>2245</td>
+  <td>&amp;cong;</td>
+  <td>approximately equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8774;</td>
+  <td>8774</td>
+  <td>2246</td>
+  <td></td>
+  <td>approximately but not actually equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8775;</td>
+  <td>8775</td>
+  <td>2247</td>
+  <td></td>
+  <td>neither approximately nor actually equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8776;</td>
+  <td>8776</td>
+  <td>2248</td>
+  <td>&amp;asymp;</td>
+  <td>almost equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8777;</td>
+  <td>8777</td>
+  <td>2249</td>
+  <td></td>
+  <td>not almost equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8778;</td>
+  <td>8778</td>
+  <td>224A</td>
+  <td></td>
+  <td>almost equal or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8779;</td>
+  <td>8779</td>
+  <td>224B</td>
+  <td></td>
+  <td>triple tilde</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8780;</td>
+  <td>8780</td>
+  <td>224C</td>
+  <td></td>
+  <td>all equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8781;</td>
+  <td>8781</td>
+  <td>224D</td>
+  <td></td>
+  <td>equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8782;</td>
+  <td>8782</td>
+  <td>224E</td>
+  <td></td>
+  <td>geometrically equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8783;</td>
+  <td>8783</td>
+  <td>224F</td>
+  <td></td>
+  <td>difference between</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8784;</td>
+  <td>8784</td>
+  <td>2250</td>
+  <td></td>
+  <td>approaches the limit</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8785;</td>
+  <td>8785</td>
+  <td>2251</td>
+  <td></td>
+  <td>geometrically equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8786;</td>
+  <td>8786</td>
+  <td>2252</td>
+  <td></td>
+  <td>approximately equal to or the image of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8787;</td>
+  <td>8787</td>
+  <td>2253</td>
+  <td></td>
+  <td>image of or approximately equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8788;</td>
+  <td>8788</td>
+  <td>2254</td>
+  <td></td>
+  <td>colon equals</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8789;</td>
+  <td>8789</td>
+  <td>2255</td>
+  <td></td>
+  <td>equals colon</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8790;</td>
+  <td>8790</td>
+  <td>2256</td>
+  <td></td>
+  <td>ring in equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8791;</td>
+  <td>8791</td>
+  <td>2257</td>
+  <td></td>
+  <td>ring equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8792;</td>
+  <td>8792</td>
+  <td>2258</td>
+  <td></td>
+  <td>corresponds to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8793;</td>
+  <td>8793</td>
+  <td>2259</td>
+  <td></td>
+  <td>estimates</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8794;</td>
+  <td>8794</td>
+  <td>225A</td>
+  <td></td>
+  <td>equiangular to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8795;</td>
+  <td>8795</td>
+  <td>225B</td>
+  <td></td>
+  <td>star equals</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8796;</td>
+  <td>8796</td>
+  <td>225C</td>
+  <td></td>
+  <td>delta equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8797;</td>
+  <td>8797</td>
+  <td>225D</td>
+  <td></td>
+  <td>equal to by definition</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8798;</td>
+  <td>8798</td>
+  <td>225E</td>
+  <td></td>
+  <td>measured by</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8799;</td>
+  <td>8799</td>
+  <td>225F</td>
+  <td></td>
+  <td>questioned equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8800;</td>
+  <td>8800</td>
+  <td>2260</td>
+  <td>&amp;ne;</td>
+  <td>not equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8801;</td>
+  <td>8801</td>
+  <td>2261</td>
+  <td>&amp;equiv;</td>
+  <td>identical to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8802;</td>
+  <td>8802</td>
+  <td>2262</td>
+  <td></td>
+  <td>not identical to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8803;</td>
+  <td>8803</td>
+  <td>2263</td>
+  <td></td>
+  <td>strictly equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8804;</td>
+  <td>8804</td>
+  <td>2264</td>
+  <td>&amp;le;</td>
+  <td>less-than or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8805;</td>
+  <td>8805</td>
+  <td>2265</td>
+  <td>&amp;ge;</td>
+  <td>greater-than or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8806;</td>
+  <td>8806</td>
+  <td>2266</td>
+  <td></td>
+  <td>less-than over equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8807;</td>
+  <td>8807</td>
+  <td>2267</td>
+  <td></td>
+  <td>greater-than over equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8808;</td>
+  <td>8808</td>
+  <td>2268</td>
+  <td></td>
+  <td>less-than but not equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8809;</td>
+  <td>8809</td>
+  <td>2269</td>
+  <td></td>
+  <td>greater-than but not equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8810;</td>
+  <td>8810</td>
+  <td>226A</td>
+  <td></td>
+  <td>much less-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8811;</td>
+  <td>8811</td>
+  <td>226B</td>
+  <td></td>
+  <td>much greater-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8812;</td>
+  <td>8812</td>
+  <td>226C</td>
+  <td></td>
+  <td>between</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8813;</td>
+  <td>8813</td>
+  <td>226D</td>
+  <td></td>
+  <td>not equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8814;</td>
+  <td>8814</td>
+  <td>226E</td>
+  <td></td>
+  <td>not less-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8815;</td>
+  <td>8815</td>
+  <td>226F</td>
+  <td></td>
+  <td>not greater-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8816;</td>
+  <td>8816</td>
+  <td>2270</td>
+  <td></td>
+  <td>neither less-than nor equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8817;</td>
+  <td>8817</td>
+  <td>2271</td>
+  <td></td>
+  <td>neither greater-than nor equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8818;</td>
+  <td>8818</td>
+  <td>2272</td>
+  <td></td>
+  <td>less-than or equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8819;</td>
+  <td>8819</td>
+  <td>2273</td>
+  <td></td>
+  <td>greater-than or equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8820;</td>
+  <td>8820</td>
+  <td>2274</td>
+  <td></td>
+  <td>neither less-than nor equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8821;</td>
+  <td>8821</td>
+  <td>2275</td>
+  <td></td>
+  <td>neither greater-than nor equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8822;</td>
+  <td>8822</td>
+  <td>2276</td>
+  <td></td>
+  <td>less-than or greater-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8823;</td>
+  <td>8823</td>
+  <td>2277</td>
+  <td></td>
+  <td>greater-than or less-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8824;</td>
+  <td>8824</td>
+  <td>2278</td>
+  <td></td>
+  <td>neither less-than nor greater-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8825;</td>
+  <td>8825</td>
+  <td>2279</td>
+  <td></td>
+  <td>neither greater-than nor less-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8826;</td>
+  <td>8826</td>
+  <td>227A</td>
+  <td></td>
+  <td>precedes</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8827;</td>
+  <td>8827</td>
+  <td>227B</td>
+  <td></td>
+  <td>succeeds</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8828;</td>
+  <td>8828</td>
+  <td>227C</td>
+  <td></td>
+  <td>precedes or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8829;</td>
+  <td>8829</td>
+  <td>227D</td>
+  <td></td>
+  <td>succeeds or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8830;</td>
+  <td>8830</td>
+  <td>227E</td>
+  <td></td>
+  <td>precedes or equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8831;</td>
+  <td>8831</td>
+  <td>227F</td>
+  <td></td>
+  <td>succeeds or equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8832;</td>
+  <td>8832</td>
+  <td>2280</td>
+  <td></td>
+  <td>does not precede</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8833;</td>
+  <td>8833</td>
+  <td>2281</td>
+  <td></td>
+  <td>does not succeed</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8834;</td>
+  <td>8834</td>
+  <td>2282</td>
+  <td>&amp;sub;</td>
+  <td>subset of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8835;</td>
+  <td>8835</td>
+  <td>2283</td>
+  <td>&amp;sup;</td>
+  <td>superset of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8836;</td>
+  <td>8836</td>
+  <td>2284</td>
+  <td>&amp;nsub;</td>
+  <td>not a subset of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8837;</td>
+  <td>8837</td>
+  <td>2285</td>
+  <td></td>
+  <td>not a superset of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8838;</td>
+  <td>8838</td>
+  <td>2286</td>
+  <td>&amp;sube;</td>
+  <td>subset of or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8839;</td>
+  <td>8839</td>
+  <td>2287</td>
+  <td>&amp;supe;</td>
+  <td>superset of or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8840;</td>
+  <td>8840</td>
+  <td>2288</td>
+  <td></td>
+  <td>neither a subset of nor equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8841;</td>
+  <td>8841</td>
+  <td>2289</td>
+  <td></td>
+  <td>neither a superset of nor equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8842;</td>
+  <td>8842</td>
+  <td>228A</td>
+  <td></td>
+  <td>subset of with not equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8843;</td>
+  <td>8843</td>
+  <td>228B</td>
+  <td></td>
+  <td>superset of with not equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8844;</td>
+  <td>8844</td>
+  <td>228C</td>
+  <td></td>
+  <td>multiset</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8845;</td>
+  <td>8845</td>
+  <td>228D</td>
+  <td></td>
+  <td>multiset multiplication</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8846;</td>
+  <td>8846</td>
+  <td>228E</td>
+  <td></td>
+  <td>multiset union</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8847;</td>
+  <td>8847</td>
+  <td>228F</td>
+  <td></td>
+  <td>square image of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8848;</td>
+  <td>8848</td>
+  <td>2290</td>
+  <td></td>
+  <td>square original of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8849;</td>
+  <td>8849</td>
+  <td>2291</td>
+  <td></td>
+  <td>square image of or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8850;</td>
+  <td>8850</td>
+  <td>2292</td>
+  <td></td>
+  <td>square original of or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8851;</td>
+  <td>8851</td>
+  <td>2293</td>
+  <td></td>
+  <td>square cap</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8852;</td>
+  <td>8852</td>
+  <td>2294</td>
+  <td></td>
+  <td>square cup</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8853;</td>
+  <td>8853</td>
+  <td>2295</td>
+  <td>&amp;oplus;</td>
+  <td>circled plus</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8854;</td>
+  <td>8854</td>
+  <td>2296</td>
+  <td></td>
+  <td>circled minus</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8855;</td>
+  <td>8855</td>
+  <td>2297</td>
+  <td>&amp;otimes;</td>
+  <td>circled times</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8856;</td>
+  <td>8856</td>
+  <td>2298</td>
+  <td></td>
+  <td>circled division slash</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8857;</td>
+  <td>8857</td>
+  <td>2299</td>
+  <td></td>
+  <td>circled dot operator</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8858;</td>
+  <td>8858</td>
+  <td>229A</td>
+  <td></td>
+  <td>circled ring operator</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8859;</td>
+  <td>8859</td>
+  <td>229B</td>
+  <td></td>
+  <td>circled asterisk operator</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8860;</td>
+  <td>8860</td>
+  <td>229C</td>
+  <td></td>
+  <td>circled equals</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8861;</td>
+  <td>8861</td>
+  <td>229D</td>
+  <td></td>
+  <td>circled dash</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8862;</td>
+  <td>8862</td>
+  <td>229E</td>
+  <td></td>
+  <td>squared plus</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8863;</td>
+  <td>8863</td>
+  <td>229F</td>
+  <td></td>
+  <td>squared minus</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8864;</td>
+  <td>8864</td>
+  <td>22A0</td>
+  <td></td>
+  <td>squared times</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8865;</td>
+  <td>8865</td>
+  <td>22A1</td>
+  <td></td>
+  <td>squared dot operator</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8866;</td>
+  <td>8866</td>
+  <td>22A2</td>
+  <td></td>
+  <td>right tack</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8867;</td>
+  <td>8867</td>
+  <td>22A3</td>
+  <td></td>
+  <td>left tack</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8868;</td>
+  <td>8868</td>
+  <td>22A4</td>
+  <td></td>
+  <td>down tack</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8869;</td>
+  <td>8869</td>
+  <td>22A5</td>
+  <td>&amp;perp;</td>
+  <td>up tack</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8870;</td>
+  <td>8870</td>
+  <td>22A6</td>
+  <td></td>
+  <td>assertion</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8871;</td>
+  <td>8871</td>
+  <td>22A7</td>
+  <td></td>
+  <td>models</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8872;</td>
+  <td>8872</td>
+  <td>22A8</td>
+  <td></td>
+  <td>true</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8873;</td>
+  <td>8873</td>
+  <td>22A9</td>
+  <td></td>
+  <td>forces</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8874;</td>
+  <td>8874</td>
+  <td>22AA</td>
+  <td></td>
+  <td>triple vertical bar right turnstile</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8875;</td>
+  <td>8875</td>
+  <td>22AB</td>
+  <td></td>
+  <td>double vertical bar double right turnstile</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8876;</td>
+  <td>8876</td>
+  <td>22AC</td>
+  <td></td>
+  <td>does not prove</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8877;</td>
+  <td>8877</td>
+  <td>22AD</td>
+  <td></td>
+  <td>not true</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8878;</td>
+  <td>8878</td>
+  <td>22AE</td>
+  <td></td>
+  <td>does not force</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8879;</td>
+  <td>8879</td>
+  <td>22AF</td>
+  <td></td>
+  <td>negated double vertical bar double right turnstile</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8880;</td>
+  <td>8880</td>
+  <td>22B0</td>
+  <td></td>
+  <td>precedes under relation</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8881;</td>
+  <td>8881</td>
+  <td>22B1</td>
+  <td></td>
+  <td>succeeds under relation</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8882;</td>
+  <td>8882</td>
+  <td>22B2</td>
+  <td></td>
+  <td>normal subgroup of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8883;</td>
+  <td>8883</td>
+  <td>22B3</td>
+  <td></td>
+  <td>contains as normal subgroup</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8884;</td>
+  <td>8884</td>
+  <td>22B4</td>
+  <td></td>
+  <td>normal subgroup of or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8885;</td>
+  <td>8885</td>
+  <td>22B5</td>
+  <td></td>
+  <td>contains as normal subgroup or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8886;</td>
+  <td>8886</td>
+  <td>22B6</td>
+  <td></td>
+  <td>original of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8887;</td>
+  <td>8887</td>
+  <td>22B7</td>
+  <td></td>
+  <td>image of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8888;</td>
+  <td>8888</td>
+  <td>22B8</td>
+  <td></td>
+  <td>multimap</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8889;</td>
+  <td>8889</td>
+  <td>22B9</td>
+  <td></td>
+  <td>hermitian conjugate matrix</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8890;</td>
+  <td>8890</td>
+  <td>22BA</td>
+  <td></td>
+  <td>intercalate</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8891;</td>
+  <td>8891</td>
+  <td>22BB</td>
+  <td></td>
+  <td>xor</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8892;</td>
+  <td>8892</td>
+  <td>22BC</td>
+  <td></td>
+  <td>nand</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8893;</td>
+  <td>8893</td>
+  <td>22BD</td>
+  <td></td>
+  <td>nor</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8894;</td>
+  <td>8894</td>
+  <td>22BE</td>
+  <td></td>
+  <td>right angle with arc</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8895;</td>
+  <td>8895</td>
+  <td>22BF</td>
+  <td></td>
+  <td>right triangle</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8896;</td>
+  <td>8896</td>
+  <td>22C0</td>
+  <td></td>
+  <td>n-ary logical and</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8897;</td>
+  <td>8897</td>
+  <td>22C1</td>
+  <td></td>
+  <td>n-ary logical or</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8898;</td>
+  <td>8898</td>
+  <td>22C2</td>
+  <td></td>
+  <td>n-ary intersection</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8899;</td>
+  <td>8899</td>
+  <td>22C3</td>
+  <td></td>
+  <td>n-ary union</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8900;</td>
+  <td>8900</td>
+  <td>22C4</td>
+  <td></td>
+  <td>diamond operator</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8901;</td>
+  <td>8901</td>
+  <td>22C5</td>
+  <td>&amp;sdot;</td>
+  <td>dot operator</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8902;</td>
+  <td>8902</td>
+  <td>22C6</td>
+  <td></td>
+  <td>star operator</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8903;</td>
+  <td>8903</td>
+  <td>22C7</td>
+  <td></td>
+  <td>division times</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8904;</td>
+  <td>8904</td>
+  <td>22C8</td>
+  <td></td>
+  <td>bowtie</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8905;</td>
+  <td>8905</td>
+  <td>22C9</td>
+  <td></td>
+  <td>left normal factor semidirect product</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8906;</td>
+  <td>8906</td>
+  <td>22CA</td>
+  <td></td>
+  <td>right normal factor semidirect product</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8907;</td>
+  <td>8907</td>
+  <td>22CB</td>
+  <td></td>
+  <td>left semidirect product</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8908;</td>
+  <td>8908</td>
+  <td>22CC</td>
+  <td></td>
+  <td>right semidirect product</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8909;</td>
+  <td>8909</td>
+  <td>22CD</td>
+  <td></td>
+  <td>reversed tilde equals</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8910;</td>
+  <td>8910</td>
+  <td>22CE</td>
+  <td></td>
+  <td>curly logical or</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8911;</td>
+  <td>8911</td>
+  <td>22CF</td>
+  <td></td>
+  <td>curly logical and</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8912;</td>
+  <td>8912</td>
+  <td>22D0</td>
+  <td></td>
+  <td>double subset</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8913;</td>
+  <td>8913</td>
+  <td>22D1</td>
+  <td></td>
+  <td>double superset</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8914;</td>
+  <td>8914</td>
+  <td>22D2</td>
+  <td></td>
+  <td>double intersection</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8915;</td>
+  <td>8915</td>
+  <td>22D3</td>
+  <td></td>
+  <td>double union</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8916;</td>
+  <td>8916</td>
+  <td>22D4</td>
+  <td></td>
+  <td>pitchfork</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8917;</td>
+  <td>8917</td>
+  <td>22D5</td>
+  <td></td>
+  <td>equal and parallel to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8918;</td>
+  <td>8918</td>
+  <td>22D6</td>
+  <td></td>
+  <td>less-than with dot</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8919;</td>
+  <td>8919</td>
+  <td>22D7</td>
+  <td></td>
+  <td>greater-than with dot</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8920;</td>
+  <td>8920</td>
+  <td>22D8</td>
+  <td></td>
+  <td>very much less-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8921;</td>
+  <td>8921</td>
+  <td>22D9</td>
+  <td></td>
+  <td>very much greater-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8922;</td>
+  <td>8922</td>
+  <td>22DA</td>
+  <td></td>
+  <td>less-than equal to or greater-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8923;</td>
+  <td>8923</td>
+  <td>22DB</td>
+  <td></td>
+  <td>greater-than equal to or less-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8924;</td>
+  <td>8924</td>
+  <td>22DC</td>
+  <td></td>
+  <td>equal to or less-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8925;</td>
+  <td>8925</td>
+  <td>22DD</td>
+  <td></td>
+  <td>equal to or greater-than</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8926;</td>
+  <td>8926</td>
+  <td>22DE</td>
+  <td></td>
+  <td>equal to or precedes</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8927;</td>
+  <td>8927</td>
+  <td>22DF</td>
+  <td></td>
+  <td>equal to or succeeds</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8928;</td>
+  <td>8928</td>
+  <td>22E0</td>
+  <td></td>
+  <td>does not precede or equal</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8929;</td>
+  <td>8929</td>
+  <td>22E1</td>
+  <td></td>
+  <td>does not succeed or equal</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8930;</td>
+  <td>8930</td>
+  <td>22E2</td>
+  <td></td>
+  <td>not square image of or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8931;</td>
+  <td>8931</td>
+  <td>22E3</td>
+  <td></td>
+  <td>not square original of or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8932;</td>
+  <td>8932</td>
+  <td>22E4</td>
+  <td></td>
+  <td>square image of or not equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8933;</td>
+  <td>8933</td>
+  <td>22E5</td>
+  <td></td>
+  <td>square original of or not equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8934;</td>
+  <td>8934</td>
+  <td>22E6</td>
+  <td></td>
+  <td>less-than but not equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8935;</td>
+  <td>8935</td>
+  <td>22E7</td>
+  <td></td>
+  <td>greater-than but not equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8936;</td>
+  <td>8936</td>
+  <td>22E8</td>
+  <td></td>
+  <td>precedes but not equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8937;</td>
+  <td>8937</td>
+  <td>22E9</td>
+  <td></td>
+  <td>succeeds but not equivalent to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8938;</td>
+  <td>8938</td>
+  <td>22EA</td>
+  <td></td>
+  <td>not normal subgroup of</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8939;</td>
+  <td>8939</td>
+  <td>22EB</td>
+  <td></td>
+  <td>does not contain as normal subgroup</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8940;</td>
+  <td>8940</td>
+  <td>22EC</td>
+  <td></td>
+  <td>not normal subgroup of or equal to</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8941;</td>
+  <td>8941</td>
+  <td>22ED</td>
+  <td></td>
+  <td>does not contain as normal subgroup or equal</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8942;</td>
+  <td>8942</td>
+  <td>22EE</td>
+  <td></td>
+  <td>vertical ellipsis</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8943;</td>
+  <td>8943</td>
+  <td>22EF</td>
+  <td></td>
+  <td>midline horizontal ellipsis</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8944;</td>
+  <td>8944</td>
+  <td>22F0</td>
+  <td></td>
+  <td>up right diagonal ellipsis</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8945;</td>
+  <td>8945</td>
+  <td>22F1</td>
+  <td></td>
+  <td>down right diagonal ellipsis</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8946;</td>
+  <td>8946</td>
+  <td>22F2</td>
+  <td></td>
+  <td>element of with long horizontal stroke</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8947;</td>
+  <td>8947</td>
+  <td>22F3</td>
+  <td></td>
+  <td>element of with vertical bar at end of horizontal stroke</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8948;</td>
+  <td>8948</td>
+  <td>22F4</td>
+  <td></td>
+  <td>small element of with vertical bar at end of horizontal stroke</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8949;</td>
+  <td>8949</td>
+  <td>22F5</td>
+  <td></td>
+  <td>element of with dot above</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8950;</td>
+  <td>8950</td>
+  <td>22F6</td>
+  <td></td>
+  <td>element of with overbar</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8951;</td>
+  <td>8951</td>
+  <td>22F7</td>
+  <td></td>
+  <td>small element of with overbar</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8952;</td>
+  <td>8952</td>
+  <td>22F8</td>
+  <td></td>
+  <td>element of with underbar</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8953;</td>
+  <td>8953</td>
+  <td>22F9</td>
+  <td></td>
+  <td>element of with two horizontal strokes</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8954;</td>
+  <td>8954</td>
+  <td>22FA</td>
+  <td></td>
+  <td>contains with long horizontal stroke</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8955;</td>
+  <td>8955</td>
+  <td>22FB</td>
+  <td></td>
+  <td>contains with vertical bar at end of horizontal stroke</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8956;</td>
+  <td>8956</td>
+  <td>22FC</td>
+  <td></td>
+  <td>small contains with vertical bar at end of horizontal stroke</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8957;</td>
+  <td>8957</td>
+  <td>22FD</td>
+  <td></td>
+  <td>contains with overbar</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8958;</td>
+  <td>8958</td>
+  <td>22FE</td>
+  <td></td>
+  <td>small contains with overbar</td>
+ </tr>
+ <tr valign="top">
+  <td>&#8959;</td>
+  <td>8959</td>
+  <td>22FF</td>
+  <td></td>
+  <td>z notation bag membership</td>
+ </tr>
+</table>
+<<page foot>>
+@
+\subsection{aldorusersguidepage.xhtml}
+<<aldorusersguidepage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+aldorusersguidepage not implemented
+<<page foot>>
+@
+
+\subsection{algebrapage.xhtml}
+<<algebrapage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+Axiom provides various facilities for treating topics in 
+abstract algebra
+  <table>
+   <tr>
+    <td>
+     <a href="algnumbertheory.xhtml">Number Theory</a>
+    </td>
+    <td>
+     Topics in algebraic number theory
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="alggrouptheory.xhtml">Group Theory</a>
+    </td>
+    <td>
+     Permuation groups; representation theory
+    </td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{alggrouptheory.xhtml}
+<<alggrouptheory.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      alggrouptheory not implemented
+<<page foot>>
+@
+
+\subsection{algnumbertheory.xhtml}
+<<algnumbertheory.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      algnumbertheory not implemented
+<<page foot>>
+@
+
+%%B
+\subsection{basiccommand.xhtml}
+<<basiccommand.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <table>
+   <tr>
+    <td>
+     <a href="calculus.xhtml">
+      <b>Calculus</b>
+     </a>
+    </td>
+    <td>Compute integrals, derivatives, or limits</td>
+   </tr>
+   <tr>
+    <td>
+     <a href="/home/silver/bcmatrix.xhtml">
+      <b>Matrix</b>
+     </a>
+    </td>
+    <td>Create a matrix</td>
+   </tr>
+   <tr>
+    <td><a href="bcexpand.xhtml"><b>Operations</b></a></td>
+    <td>Expand, factor, simplify, substitute, etc.</td>
+   </tr>
+   <tr>
+    <td>
+     <a href="draw.xhtml">
+      <b>Draw</b>
+     </a>
+    </td>
+    <td>Create 2D or 3D plots.</td>
+   </tr>
+   <tr>
+    <td>
+     <a href="series.xhtml">
+      <b>Series</b>
+     </a>
+    </td>
+    <td>Create a power series</td>
+   </tr>
+   <tr>
+    <td>
+     <a href="solve.xhtml">
+      <b>Solve</b>
+     </a>
+    </td>
+    <td>Solve an equation or system of equations</td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{basiclimit.xhtml}
+<<basiclimit.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+   What kind of limit do you want to compute?:<br/>
+   <a href="/home/silver/reallimit.xhtml">
+    <b>A real limit</b>
+   </a><br/>
+   The limit as the variable approaches a real value along the real axis
+   <br/><br/>
+   <a href="/home/silver/complexlimit.xhtml">
+    <b>A complex limit</b>
+   </a><br/>
+   The limit as the variable approaches a complex value along any path in
+   the complex plane.
+<<page foot>>
+@
+
+\subsection{bcexpand.xhtml}
+<<bcexpand.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+Simplification
+<ul>
+<li>Simplify Expressions</li>
+<li>Simplify Radicals</li>
+<li>Factor Expressions</li>
+<li>Factor Complex</li>
+<li>Expand Expressions</li>
+<li>Expand Logarithms</li>
+<li>Contract Logarithms</li>
+<li>Simpify Trigonometrics</li>
+<li>Reduce Trigonometrics</li>
+<li>Expand Trigonometrics</li>
+<li>Canonical Trigonometrics</li>
+<li>Complex to rectangular</li>
+<li>Complex to polar</li>
+<li>Complex to exponentials</li>
+<li>Exponentials to complex</li>
+</ul>
+Calculus
+<ul>
+<li>Integrate</li>
+<li>Risch Integrate</li>
+<li>Change Variable</li>
+<li>Differentiate</li>
+<li>Find Limit</li>
+<li>Get Series</li>
+<li>Pade Approximation</li>
+<li>Calculate Sum</li>
+<li>Calculate Product</li>
+<li>Laplace Transform</li>
+<li>Inverse Laplace Transform</li>
+<li>Greatest Common Divisor</li>
+<li>Least Common Multiple</li>
+<li>Divide Polynomials</li>
+<li>Partial Fractions</li>
+<li>Continued Fractions</li>
+</ul>
+Algebra
+<ul>
+<li>Generate Matrix</li>
+<li>Enter Matrix</li>
+<li>Invert Matrix</li>
+<li>Characteristic Polynomial</li>
+<li>Determinant</li>
+<li>Eigenvalues</li>
+<li>Eigenvectors</li>
+<li>Adjoint Matrix</li>
+<li>Transpose Matrix</li>
+</ul>
+Equations
+<ul>
+<li>Solve</li>
+<li>Solve Numerically</li>
+<li>Roots of Polynomials</li>
+<li>Real Roots of Polynomials</li>
+<li>Solve Linear Systems</li>
+<li>Solve Algebraic System</li>
+<li>Eliminate Variable</li>
+</ul>
+Ordinary Differential Equations
+<ul>
+<li>Solve ODE</li>
+<li>Solve Initial Value Problem</li>
+<li>Solve Boundary Value Problem</li>
+<li>Solve ODE with Laplace</li>
+</ul>
+Data Structures
+<ul>
+<li>Record</li>
+<li>List</li>
+<li>Set</li>
+</ul>
+<<page foot>>
+@
+
+\subsection{bcmatrix.xhtml}
+<<bcmatrix.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<![CDATA[
+   function byformula() {
+      // find out how many rows and columns, must be positive and nonzero
+    var rcnt = parseInt(document.getElementById('rowcnt').value);
+     if (rcnt <= 0) {
+      alert("Rows must be positive and non-zero -- defaulting to 1");
+      rcnt = 1;
+      document.getElementById('rowcnt').value=1;
+      return(false);
+     }
+    var ccnt = parseInt(document.getElementById('colcnt').value);
+     if (ccnt <= 0) {
+      alert("Columns must be positive and non-zero -- defaulting to 1");
+      ccnt = 1;
+      document.getElementById('colcnt').value=1;
+      return(false);
+     }
+      // remove the question and the buttons
+    var quest = document.getElementById('question');
+    var clicks = document.getElementById('clicks');
+    quest.removeChild(clicks);
+    var tbl = document.getElementById('form2');
+    var tblsize = tbl.rows.length;
+      // make the row variable question
+      // row variable left cell
+    var row = tbl.insertRow(tblsize);
+    var cell = row.insertCell(0);
+    var tnode = document.createTextNode("Enter the row variable");
+    cell.appendChild(tnode);
+      // row variable right cell
+    cell = row.insertCell(1);
+    tnode = document.createElement('input');
+    tnode.type = 'text';
+    tnode.name = 'rowvar';
+    tnode.id = 'rowvar';
+    tnode.size=10;
+    tnode.value='i';
+    tnode.tabindex=21;
+    cell.appendChild(tnode);
+      // make the column variable question
+      // column variable left cell
+    tblsize = tblsize + 1;
+    row = tbl.insertRow(tblsize);
+    cell = row.insertCell(0);
+    tnode = document.createTextNode("Enter the column variable");
+    cell.appendChild(tnode);
+      // column variable right cell
+    cell = row.insertCell(1);
+    tnode = document.createElement('input');
+    tnode.type = 'text';
+    tnode.name = 'colvar';
+    tnode.id = 'colvar';
+    tnode.size=10;
+    tnode.tabindex=22;
+    tnode.value='j';
+    cell.appendChild(tnode);
+      // make the formula question
+      // column variable left cell
+    tblsize = tblsize + 1;
+    row = tbl.insertRow(tblsize);
+    cell = row.insertCell(0);
+    tnode = document.createTextNode("Enter the formulas for the elements");
+    cell.appendChild(tnode);
+      // formula input field
+    tblsize = tblsize + 1;
+    row = tbl.insertRow(tblsize);
+    cell = row.insertCell(0);
+    tnode = document.createElement('input');
+    tnode.type = 'text';
+    tnode.name = 'formula1';
+    tnode.id = 'formula1';
+    tnode.size=50;
+    tnode.value = '1/(x-i-j-1)';
+    tnode.tabindex=23;
+    cell.appendChild(tnode);
+      // insert the continue button
+    tblsize = tblsize + 1;
+    row = tbl.insertRow(tblsize);
+    cell = row.insertCell(0);
+    tnode = document.createElement('input');
+    tnode.type = 'button';
+    tnode.id = 'contbutton';
+    tnode.value = 'Continue';
+    tnode.setAttribute("onclick","makeRequest('formula');");
+    tnode.tabindex=24;
+    cell.appendChild(tnode);
+    return(false);
+   }
+   function byelement() {
+      // find out how many rows and columns, must be positive and nonzero
+    var rcnt = parseInt(document.getElementById('rowcnt').value);
+     if (rcnt <= 0) {
+      alert("Rows must be positive and non-zero -- defaulting to 1");
+      rcnt = 1;
+      document.getElementById('rowcnt').value=1;
+      return(false);
+     }
+    var ccnt = parseInt(document.getElementById('colcnt').value);
+     if (ccnt <= 0) {
+      alert("Columns must be positive and non-zero -- defaulting to 1");
+      ccnt = 1;
+      document.getElementById('colcnt').value=1;
+      return(false);
+     }
+      // remove the question and the buttons
+    var quest = document.getElementById('question');
+    var clicks = document.getElementById('clicks');
+    quest.removeChild(clicks);
+      // write "Elements"
+    var tbl = document.getElementById('form2');
+    var tblsize = tbl.rows.length;
+    var row = tbl.insertRow(tblsize);
+    var thecell = row.insertCell(0);
+    var tnode = document.createTextNode("Elements");
+    thecell.appendChild(tnode);
+      // create input boxes for the matrix values
+    tblsize = tblsize + 1;
+    for (var i = 0 ; i < rcnt ; i++) {
+     row = tbl.insertRow(tblsize);
+     for (var j = 0 ; j < ccnt ; j++) {
+      thecell = row.insertCell(j);
+      tnode = document.createElement('input');
+      tnode.type = 'text';
+      tnode.name = 'a'+i+'c'+j;
+      tnode.id = 'a'+i+'c'+j;
+      tnode.size=10;
+      tnode.tabindex=20+(i*10)+j;
+      thecell.appendChild(tnode);
+     }
+     tblsize = tblsize + 1;
+    }
+      // insert the continue button
+    row = tbl.insertRow(tblsize);
+    thecell = row.insertCell(0);
+    tnode = document.createElement('input');
+    tnode.type = 'button';
+    tnode.id = 'contbutton';
+    tnode.value = 'Continue';
+    tnode.setAttribute("onclick","makeRequest('element');");
+    thecell.appendChild(tnode);
+    return(false);
+   }
+   function commandline(arg) {
+    if (arg == 'element') {
+     var rcnt = parseInt(document.getElementById('rowcnt').value);
+     var ccnt = parseInt(document.getElementById('colcnt').value);
+     var cmdhead = 'matrix([';
+     var cmdtail = '])';
+      for (var i = 0 ; i < rcnt ; i++) {
+      var listbody = '[';
+      for (var j = 0 ; j < ccnt ; j++) {
+       var aij = document.getElementById('a'+i+'c'+j).value;
+       listbody = listbody+aij;
+       if (j != (ccnt - 1)) {
+        listbody = listbody+',';
+       }
+      }
+      listbody = listbody+']';
+      if (i != (rcnt - 1)) {
+       listbody = listbody+',';
+      }
+      cmdhead = cmdhead+listbody;
+     }
+     cmd = cmdhead+cmdtail;
+     return(cmd);
+    } else {
+     var rcnt = parseInt(document.getElementById('rowcnt').value);
+     var ccnt = parseInt(document.getElementById('colcnt').value);
+     var cmdhead = 'matrix([[';
+     var cmdtail = '])';
+     var formula = document.getElementById('formula1').value;
+     var rowv = document.getElementById('rowvar').value;
+     var colv = document.getElementById('colvar').value;
+     var cmd = cmdhead+formula+' for '+colv+' in 1..'+ccnt+']'+
+                               ' for '+rowv+' in 1..'+rcnt+cmdtail;
+     return(cmd);
+    }
+   }
+]]>
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+Enter the size of the matrix:
+<table id="form2">
+ <tr>
+  <td size="10">Rows</td>
+  <td><input type="text" id="rowcnt" tabindex="10" size="10" value="2"/></td>
+ </tr>
+ <tr>
+  <td>Columns</td>
+  <td><input type="text" id="colcnt" tabindex="20" size="10" value="3"/></td>
+ </tr>
+</table>
+<div id="question">
+ <div id="clicks">
+  How would you like to enter the matrix elements?
+  <center>
+   <input type="button" value="By Formula" onclick="byformula();"/>
+   <input type="button" value="By Element" onclick="byelement();"/>
+  </center>
+ </div>
+</div>
+<<answer field>>
+<<page foot>>
+@
+
+%%C
+\subsection{calculus.xhtml}
+<<calculus.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <table>
+   <tr>
+    <td>
+     <a href="/home/silver/differentiate.xhtml">
+      <b>Differentiate</b>
+     </a>
+    </td>
+   </tr>
+   <tr>
+    <td><a href="/home/silver/indefiniteintegral.xhtml">
+      <b>Do an Indefinite Integral</b></a></td>
+   </tr>
+   <tr>
+    <td><a href="/home/silver/definiteintegral.xhtml">
+     <b>Do a Definite Integral</b></a></td>
+   </tr>
+   <tr>
+    <td><a href="basiclimit.xhtml"><b>Find a limit</b></a></td>
+   </tr>
+   <tr>
+    <td><a href="/home/silver/summation.xhtml">
+      <b>Do a summation</b>
+     </a>
+    </td>
+   </tr>
+   <tr>
+    <td><a href="(|bcProduct|).xhtml"><b>Compute a product</b></a></td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{calculuspage.xhtml}
+<<calculuspage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <table>
+   <tr>
+    <td>
+     <a href="callimits.xhtml">Limits</a>
+    </td>
+    <td>
+     Compute limits of functional expressions
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="calderivatives.xhtml">Derivatives</a>
+    </td>
+    <td>
+     Compute derivatives and partial derivatives
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="calintegrals.xhtml">Integrals</a>
+    </td>
+    <td>
+     Introduction to Axiom's symbolic integration
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="calmoreintegrals.xhtml">More Integrals</a>
+    </td>
+    <td>
+     More information about symbolic integration
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="callaplace.xhtml">Laplace</a>
+    </td>
+    <td>
+     Computing Laplace transforms
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="calseries.xhtml">Series</a>
+    </td>
+    <td>
+     Compute series expansions of expressions
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="equdifferential.xhtml">Differential Equations</a>
+    </td>
+    <td>
+     Solve differential equations
+    </td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{calderivatives.xhtml}
+<<calderivatives.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Derivatives</div>
+  <hr/>
+Use the Axiom function <a href="dbopd.xhtml">D</a> to differentiate an
+expression. 
+
+To find the derivative of an expression f with respect to a variable x,
+enter D(f,x).
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="f:=exp exp x" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="D(f,x)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+An optional third argument n in <a href="dbopd.xhtml">D</a> asks Axiom for 
+the nth derivative of f. This finds the fourth derivative of f with 
+respect to x.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="D(f,x,4)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+You can also compute partial derivatives by specifying the order of 
+differentiation.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="g:=sin(x^2+y)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p4','p5']);"
+    value="D(g,y)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p4','p6']);"
+    value="D(g,[y,y,x,x])" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+Axiom can manipulate the derivatives (partial or iterated) of expressions
+involving formal operators. All the dependencies must be explicit. This
+returns 0 since F (so far) does not explicitly depend on x.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="D(F,x)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Suppose that we have F a function of x, y, and z, where x and y are 
+themselves functions of z. Start by declaring that F, x, and y are
+operators.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="makeRequest('p8');"
+    value="F:=operator 'F; x:=operator 'x; y:=operator 'y" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+You can use F, x, and y in expressions.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p8','p9']);"
+    value="a:=F(x z, y z, z^2)+x y(z+1)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+Differentiate formally with respect to z. The formal derivatives appearing
+in dadz are not just formal symbols, but do represent derivatives of x, y, and
+F.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p8','p9','p10']);"
+    value="dadz:=D(a,z)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+You can evaluate the above for particular functional values of F, x, and y.
+If x(z) is exp(z) and y(z) is log(z+1), then this evaluates dadz.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p8','p9','p10','p11']);"
+    value="eval(eval(dadz,'x,z+->exp z),'y,z+->log(z+1))" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+You obtain the same result by first evaluating a and then differentiating.
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p8','p9','p10','p12']);"
+    value="m:=eval(eval(a,'x,z+->exp z),'y,z+->log(z+1))" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="handleFree(['p8','p9','p10','p12','p13']);"
+    value="D(m,z)" />
+  <div id="ansp13"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{calintegrals.xhtml}
+<<calintegrals.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Integration</div>
+  <hr/>
+Axiom has extensive library facilities for integration.
+
+The first example is the integration of a fraction with a denominator that
+factors into a quadratic and a quartic irreducible polynomial. The usual
+partial fraction approach used by most other computer algebra systems either
+fails or introduces expensive unneeded algebraic numbers.
+
+We use a factorization-free algorithm.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="integrate((x^2+2*x+1)/((x+1)^6+1),x)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+When real parameters are present, the form of the integral can depend on the
+signs of some expressions.
+
+Rather than query the user or make sign assumptions, Axiom returns all
+possible answers.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="integrate(1/(x^2+a),x)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+The <a href="dbopintegrate.xhtml">integrate</a> operation generally assumes
+that all parameters are real. The only exception is when the integrand has
+complex valued quantities.
+
+If the parameter is complex instead of real, then the notion of sign is
+undefined and there is a unique answer. You can request this answer by
+"prepending" the word "complex" to the command name.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="complexIntegrate(1/(x^2+a),x)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+The following two examples illustrate the limitations of table-based
+approaches. The two integrands are very similar, but the answer to one of
+them requires the addition of two new algebraic numbers.
+
+This is the easy one. The next one looks very similar but the answer is
+much more complicated.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="integrate(x^3/(a+b*x)^(1/3),x)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+Only an algorithmic approach is guaranteed to find what new constants must
+be added in order to find a solution.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="integrate(1/(x^3*(a+b*x)^(1/3)),x)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Some computer algebra systems use heuristics or table-driven approaches to
+integration. When these systems cannot determine the answer to an
+integration problem, they reply "I don't know". Axiom uses an algorithm
+for integration that conclusively proves that an integral cannot be expressed
+in terms of elementary functions.
+
+When Axiom returns an integral sign, it has proved that no answer exists as
+an elementary function.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="integrate(log(1+sqrt(a*x+b))/x,x)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+Axiom can handle complicated mixed functions much beyond what you can find
+in tables. Whenever possible, Axiom tries to express the answer using the
+functions present in the integrand.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="integrate((sinh(1+sqrt(x+b))+2*sqrt(x+b))/(sqrt(x+b)*(x+cosh(1+sqrt(x+b)))),x)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+A strong structure-checking algorithm in Axiom finds hidden algebraic 
+relationships between functions.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="makeRequest('p8');"
+    value="integrate(tan(atan(x)/3),x)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+The discovery of this algebraic relationship is necessary for correct
+integration of this function. Here are the details:
+<ol>
+ <li>
+  If x=tan(t) and g=tan(t/3) then the following algebraic relationship is true:
+<pre>
+      g^3 - 3xg^2 - 3g + x = 0    
+</pre>
+ </li>
+ <li>
+  Integrate g using this algebraic relation; this produces:
+<pre>
+((24g^2-8)log(3g^2-1) + (81x^2+24)g^2 + 72xg - 27x^2 - 16) / (54g^2 - 18)
+</pre>
+ </li>
+ <li>
+  Rationalize the denominator, producing:
+<pre>
+     (8log(3g^2-1) - 3g^2 + 18xg + 16)/18
+</pre>
+  Replace g by the initial definition g=tan(arctan(x)/3) to produce the
+final result.
+ </li>
+</ol>
+This is an example of a mixed function where the algebraic layer is over
+the transcendental one.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="makeRequest('p9');"
+    value="integrate((x+1)/(x*(x+log x)^(3/2)),x)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+While incomplete for non-elementary functions, Axiom can handle some of them.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="makeRequest('p10');"
+    value="integrate(exp(-x^2)*erf(x)/(erf(x)^3-erf(x)^2-erf(x)+1),x)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+More examples of Axiom's integration capabilities are discussed in
+<a href="axbook/section-8.8.xhtml">Integration</a>.
+<<page foot>>
+@
+
+\subsection{callaplace.xhtml}
+<<callaplace.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Laplace Transforms</div>
+  <hr/>
+Axiom can compute some forward Laplace transforms, mostly of elementary
+functions not involving logarithms, although some cases of special functions
+are handled. To compute the forward Laplace transform of F(t) with respect
+to t and express the result as f(s), issue the command laplace(F(t),t,s).
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="laplace(sin(a*t)*cosh(a*t)-cos(a*t)*sinh(a*t),t,s)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Here are some other non-trivial examples.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="laplace((exp(a*t)-exp(b*t))/t,t,s)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="laplace(2/t*(1-cos(a*t)),t,s)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="laplace(exp(-a*t)*sin(b*t)/b^2,t,s)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="laplace((cos(a*t)-cos(b*t))/t,t,s)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Axiom also knows about a few special functions.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="laplace(exp(a*t+b)*Ei(c*t),t,s)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="laplace(a*Ci(b*t)+c*Si(d*t),t,s)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+When Axiom does not know about a particular transform, it keeps it as a
+formal transform in the answer.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="makeRequest('p8');"
+    value="laplace(sin(a*t)-a*t*cos(a*t)+exp(t^2),t,s)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{callimits.xhtml}
+<<callimits.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Limits</div>
+  <hr/>
+To compute a limit, you must specify a functional expression, a variable,
+and a limiting value for that variable. If you do not specify a direction,
+Axiom attempts to compute a two-sided limit.
+
+Issue this to compute the limit of (x^2-2*x+2)/(x^2-1) as x approaches 1.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="limit((x^2-3*x+2)/(x^2-1),x=1)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Sometimes the limit when approached from the left is different from the
+limit from the right and, in this case, you may wish to ask for a one-sided
+limit. Also, if you have a function that is only defined on one side of a
+particular value, you can compute a one-sided limit.
+
+The function log(x) is only defined to the right of zero, that is, for
+x>0. Thus, when computing limits of functions involving log(x), you probably
+want a "right-hand" limit.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value='limit(x*log(x),x=0,"right")' />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+When you do not specify "right" or "left" as the optional fourth argument,
+<a href="dboplimit.xhtml">limit</a> tries to compute a two-sided limit.
+Here the limit from the left does not exist, as Axiom indicates when you
+try to take a two-sided limit.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="limit(x*log(x),x=0)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+A function can be defined on both sides of a particular value, but tend to
+different limits as its variable approaches that value from the left and
+from the right. We can construct an example of this as follows: Since 
+sqrt(y^2) is simply the absolute value of y, the function sqrt(y^2)/y is
+simply the sign (+1 or -1) of the nonzero real number y. Therefore,
+sqrt(y^2)/y=-1 for y&#60;0 and sqrt(y^2)/y=+1 for y>0. This is what happens 
+when we take the limit at y=0. The answer returned by Axiom gives both a
+"left-handed" and a "right-handed" limit.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="limit(sqrt(y^2)/y,y=0)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+Here is another example, this time using a more complicated function.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="limit(sqrt(1-cos(t))/t,t=0)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+You can compute limits at infinity by passing either "plus infinity" or
+"minus infinity" as the third argument of <a href="dboplimit.xhtml">limit</a>.
+To do this, use the constants %plusInfinity and %minusInfinity.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="limit(sqrt(3*x^2+1)/(5*x),x=%plusInfinity)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="limit(sqrt(3*x^2+1)/(5*x),x=%minusInfinity)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+You can take limits of functions with parameters. As you can see, the limit
+is expressed in terms of the parameters.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="makeRequest('p8');"
+    value="limit(sinh(a*x)/tan(b*x),x=0)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+When you use <a href="dboplimit.xhtml">limit</a>, you are taking the limit
+of a real function of a real variable. When you compute this, Axiom returns
+0 because, as a function of a real variable, sin(1/z) is always between -1
+and 1, so z*sin(1/z) tends to 0 as z tends to 0.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="makeRequest('p9');"
+    value="limit(z*sin(1/z),z=0)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+However, as a function of a complex variable, sin(1/z) is badly behaved
+near 0 (one says that sin(1/z) has an essential singularlity at z=0). When
+viewed as a function of a complex variable, z*sin(1/z) does not approach any
+limit as z tends to 0 in the complex plane. Axiom indicates this when we
+call <a href="dbopcomplexlimit.xhtml">complexLimit</a>.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="makeRequest('p10');"
+    value="complexLimit(z*sin(1/z),z=0)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+You can also take complex limits at infinity, that is, limits of a function
+of z as z approaches infinity on the Riemann sphere. Use the symbol
+%infinity to denote "complex infinity". As above, to compute complex limits
+rather than real limits, use <a href="dbopcomplexlimit.xhtml">complexLimit</a>.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="makeRequest('p11');"
+    value="complexLimit((2+z)/(1-z),z=%infinity)" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+In many cases, a limit of a real function of a real variable exists when
+the corresponding complex limit does not. This limit exists.
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="makeRequest('p12');"
+    value="limit(sin(x)/x,x=%plusInfinity)" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+But this limit does not.
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="makeRequest('p13');"
+    value="complexLimit(sin(x)/x,x=%infinity)" />
+  <div id="ansp13"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{calmoreintegrals.xhtml}
+<<calmoreintegrals.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Integration</div>
+  <hr/>
+Integration is the reverse process of differentiation, that is, an integral
+of a function f with respect to a variable x is any function g such that
+D(g,x) is equal to f. The package
+<a href="db.xhtml?FunctionSpaceIntegration">FunctionSpaceIntegration</a>
+provides the top-level integration operation
+<a href="dbopintegrate.xhtml">integrate</a>, for integrating real-valued
+elementary functions.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="integrate(cosh(a*x)*sinh(a*x),x)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Unfortunately, antiderivatives of most functions cannot be expressed in
+terms of elementary functions.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="integrate(log(1+sqrt(a*x+b)),x)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Given an elementary function to integrate, Axiom returns a formal integral
+as above only when it can prove that the integral is not elementary and
+not when it cannot determine the integral. In this rare case it prints a
+message that it cannot determine if an elementary integral exists. Similar
+functions may have antiderivatives that look quite different because the
+form of the antiderivative depends on the sign of a constant that appears
+in the function.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="integrate(1/(x^2-2),x)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="integrate(1/(x^2+2),x)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+If the integrand contains parameters, then there may be several possible
+antiderivatives, depending on the signs of expressions of the parameters.
+In this case Axiom returns a list of answers that cover all possible cases.
+Here you use the answer involving the square root of a when a>0 and the
+answer involving the square root of -a when a&#60;0.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="integrate(x^2/(x^4-a^2),x)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+If the parameters and the variables of integration can be complex numbers
+rather than real, then the notion of sign is not defined. In this case all
+the possible answers can be expressed as one complex function. To get that
+function, rather than a list of real functions, use
+<a href="dbopcomplexintegrate.xhtml">complexIntegrate</a>, which is provided
+by the package
+<a href="db.xhtml?FunctionSpaceComplexIntegration">
+FunctionSpaceComplexIntegration</a>.
+
+This operation is used for integrating complex-valued elementary functions.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="complexIntegrate(x^2/(x^4-a^2),x)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+As with the real case, antiderivatives for most complex-valued functions
+cannot be expressed in terms of elementary functions.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="complexIntegrate(log(1+sqrt(a*x+b))/x,x)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Sometimes <a href="dbopintegrate.xhtml">integrate</a> can involve 
+symbolic algebraic numbers such as those returned by 
+<a href="dboprootof.xhtml">rootOf</a>. To see how to work with these
+strange generated symbols (such as %%a0), see
+<a href="axbook/section-8.3.xhtml#subsec-8.3.2">
+Using All Roots of a Polynomial</a>.
+
+Definite integration is the process of computing the area between the x-axis
+and the curve of a function f(x). The fundamental theorem of calculus 
+states that if f is continuous on an interval a..b and such that D(g,x) is
+equal to f, then the definite integral of f for x in the interval a..b is
+equal to g(b)-g(a).
+
+The package
+<a href="db.xhtml?RationalFunctionDefiniteIntegration">
+RationalFunctionDefiniteIntegration</a>
+provides the top-level definite integration operation,
+<a href="dbopintegrate.xhtml">integrate</a>, 
+for integrating real-valued rational functions.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="makeRequest('p8');"
+    value="integrate((x^4-3*x^2+6)/(x^6-5*x^4+5*x^2+4),x=1..2)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+Axiom checks beforehand that the function you are integrating is defined on
+the interval a..b, and prints an error message if it finds that this is not
+the case, as in the following example:
+<pre>
+ integrate(1/(x^2-2),x=1..2)
+
+ Error detected within library code:
+ Pole in path of integration
+</pre>
+When parameters are present in the function, the function may or may not be
+defined on the interval of integration.
+
+If this is the case, Axiom issues a warning that a pole might lie in the 
+path of integration, and does not compute the integral.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="makeRequest('p9');"
+    value="integrate(1/(x^2-a),x=1..2)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+If you know that you are using values of the parameter for which the 
+function has no pole in the interval of integration, use the string
+"noPole" as a third argument to <a href="dbopintegrate.xhtml">integrate</a>.
+
+The value here is, of course, incorrect if sqrt(a) is between 1 and 2.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="makeRequest('p10');"
+    value='integrate(1/(x^2-a),x=1..2,"noPole")' />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{calseries.xhtml}
+<<calseries.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <div align="center">Working with Power Series</div>
+  <hr/>
+Axiom has very sophisticated facilities for working with power series.
+Infinite series are represented by a list of the coefficients that have
+already been determined, together with a function for computing the
+additional coefficients if needed. The system command that determines how
+many terms of a series is displayed is
+<pre>
+  )set streams calculate
+</pre>
+By default Axiom will display ten terms. Series can be created from
+expressions, from functions for the series coefficients, and from applications
+of operations on existing series. The most general function for creating
+a series is called <a href="dbopseries.xhtml">series</a>, although you can
+also use 
+<a href="dboptaylor.xhtml">taylor</a>,
+<a href="dboplaurent.xhtml">laurent</a>, and
+<a href="dboppuiseux.xhtml">puiseux</a> in situations where you know what 
+kind of exponents are involved.
+
+For information about solving differential equations in terms of power
+series see
+<a href="axbook/section-8.10.xhtml#subsec-8.10.3">
+Power Series Solutions of Differential Equations</a>
+<ul>
+ <li>
+  <a href="calseries1.xhtml">
+   Creation of Power Series
+  </a>
+ </li>
+ <li>
+  <a href="calseries2.xhtml">
+   Coefficients of Power Series
+  </a>
+ </li>
+ <li>
+  <a href="calseries3.xhtml">
+   Power Series Arithmetic
+  </a>
+ </li>
+ <li>
+  <a href="calseries4.xhtml">
+   Functions on Power Series
+  </a>
+ </li>
+ <li>
+  <a href="calseries5.xhtml">
+   Converting to Power Series
+  </a>
+ </li>
+ <li>
+  <a href="calseries6.xhtml">
+   Power Series from Formulas
+  </a>
+ </li>
+ <li>
+  <a href="calseries7.xhtml">
+   Substituting Numerical Values in Power Series
+  </a>
+ </li>
+ <li>
+  <a href="calseries8.xhtml">
+   Example: Bernoulli Polynomials and Sums of Powers
+  </a>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{calseries1.xhtml}
+<<calseries1.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Creation of Power Series</div>
+  <hr/>
+This is the easiest way to create a power series. This tells Axiom that x
+is to be treated as a power series, so funcitons of x are again power series.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="x:=series 'x" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+We didn't say anything about the coefficients of the power series, so the
+coefficients are general expressions over the integers. This allows us to
+introduce denominators, symbolic constants, and other variables as needed.
+Here the coefficents are integers (note that the coefficients are the
+Fibonacci numbers).
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="1/(1-x-x^2)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+This series has coefficients that are rational numbers.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="sin(x)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+When you enter this expression you introduce the symbolic constants sin(1)
+and cos(1).
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p4']);"
+    value="sin(1+x)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+When you enter the expression the variable a appears in the resulting 
+series expansion.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p5']);"
+    value="sin(a*x)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+You can also convert an expression into a series expansion. This expression
+creates the series expansion of 1/log(v) about v=1. For details and more
+examples see
+<a href="axbook/section-8.9.xhtml#subsec-8.9.5">
+Converting to Power Series</a>
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="series(1/log(v),v=1)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+You can create power series with more general coefficients. You normally
+accomplish this via a type declaration, see 
+<a href="axbook/section-2.3.xhtml">Declarations</a>. See
+<a href="axbook/section-8.9.xhtml#subsec-8.9.4">
+Functions on Power Series</a> for some warnings about working with 
+declared series.
+
+We delcare that y is a one-variable Taylor series 
+(<a href="db.xhtml?UnivariateTaylorSeries">UTS</a> is the abbreviation for
+<a href="db.xhtml?UnivariateTaylorSeries">UnivariateTaylorSeries</a> in the
+variable z with <a href="db.xhtml?Float">FLOAT</a> (that is, floating-point)
+coefficients, centered about 0. Then, by assignment, we obtain the Taylor
+expansion of exp(z) with floating-point coefficients.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="y:UTS(FLOAT,'z,0):=exp(z)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+You can also create a power series by giving an explicit formula for the
+nth coefficient. For details and more examples see
+<a href="axbook/section-8.9.xhtml#subsec-8.9.6">
+Power Series from Formulas</a>
+
+To create a series about w=0 whose nth Taylor coefficient is 1/n!, you can
+evaluate this expression. This is the Taylor expansion of exp(w) at w=0.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="makeRequest('p8');"
+    value="series(1/factorial(n),n,w=0)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{calseries2.xhtml}
+<<calseries2.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Coefficients of Power Series</div>
+  <hr/>
+You can extract any coefficient from a power series -- even on that
+hasn't been computed yet. This is possible because in Axiom, infinite
+series are represented by a list of the coefficients that have already
+been determined, together with a function for computing additional 
+coefficients. (This is known as lazy evaluation.) When you ask for a
+coefficient that hasn't yet been computed, Axiom computes whatever
+additional coefficients it needs and then stores them in the representation
+of the power series.
+
+Here's an example of how to extract the coefficients of a power series.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="x:=series('x)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="y:=exp(x)*sin(x)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+This coefficient is readily available
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="coefficient(y,6)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+But let's get the fifteenth coefficient of y
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p2','p4']);"
+    value="coefficient(y,15)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+If you look at y then you see that the coefficients up to order 15 have 
+all been computed.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p2','p4','p5']);"
+    value="y" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{calseries3.xhtml}
+<<calseries3.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Power Series Arithmetic</div>
+  <hr/>
+You can manipulate power series using the usual arithmetic operations
+<a href="dbopplus.xhtml">+</a>,
+<a href="dbopminus.xhtml">-</a>,
+<a href="dbopstar.xhtml">*</a>, and
+<a href="dbopdivide.xhtml">/</a>.
+
+The results of these operations are also power series.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="x:=series 'x" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="(3+x)/(1+7*x)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+You can also compute f(x)^g(x), where f(x) and g(x) are two power series.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="base:=1/(1-x)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p3','p4']);"
+    value="expon:=x*base" />
+  <div id="ansp4"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p3','p4','p5']);"
+    value="base^expon" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{calseries4.xhtml}
+<<calseries4.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Functions on Power Series</div>
+  <hr/>
+Once you have created a power series, you can apply transcendental 
+functions (for example, 
+<a href="dbopexp.xhtml">exp</a>,
+<a href="dboplog.xhtml">log</a>,
+<a href="dbopsin.xhtml">sin</a>,
+<a href="dboptan.xhtml">tan</a>,
+<a href="dbopcosh.xhtml">cosh</a>, etc.) to it.
+
+To demonstrate this, we first create the power series expansion of the
+rational function x^2/(1-6*x+x^2) about x=0.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="x:=series 'x" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="rat:=x^2/(1-6*x+x^2)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+If you want to compute the series expansion of 
+sin(x^2/1-6*x+x^2) you simply compute the sine of rat.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="sin(rat)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+<hr/>
+<b>Warning:</b> the type of the coefficients of a power series may affect
+the kind of computations that you can do with that series. This can only
+happen when you have made a declaration to specify a series domain with a
+certain type of coefficient.
+<hr/>
+If you evaluate then you have declared that y is a one variable Taylor
+series (<a href="db.xhtml?UnivariateTaylorSeries">UTS</a> is the abbreviation
+for <a href="db.xhtml?UnivariateTaylorSeries">UnivariateTaylorSeries</a>) in
+the variable y with <a href="dbfractioninteger.xhtml">FRAC INT</a> (that is,
+fractions of integers) coefficients, centered about 0.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="y:UTS(FRAC INT,'y,0):='y" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+You can now compute certain power series in y, provided that these series
+have rational coefficients.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p4','p5']);"
+    value="exp(y)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+You can get examples of such series by applying transcendental functions
+to series in y that have no constant terms.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p4','p5','p6']);"
+    value="tan(y^2)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p4','p5','p7']);"
+    value="cos(y+y^5)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Similarly, you can compute the logarithm of a power series with rational
+coefficients if the constant coefficient is 1.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p4','p5','p8']);"
+    value="log(1+sin(y))" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+If you wanted to apply, say, the operation <a href="dbopexp.xhtml">exp</a> to
+a power series with a nonzero constant coefficient a0, then the constant
+coefficient of the result would be exp(a0), which is not a rationa number.
+Therefore, evaluating exp(2+tan(y)) would generate an error message.
+
+If you want to compute the Taylor expansion of exp(2+tan(y)), you must 
+ensure that the coefficient domain has an operation 
+<a href="dbopexp.xhtml">exp</a> defined for it. An example of such a domain
+is <a href="dbexpressioninteger.xhtml">Expression Integer</a>, the type of
+formal functional expressions over the integers. When working with 
+coefficients of this type
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="makeRequest('p9');"
+    value="z:UTS(EXPR INT,'z,0):='z" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+this presents no problems.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p9','p10']);"
+    value="exp(2+tan(z))" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+Another way to create Taylor series whose coefficients are expressions over
+the integers is to use <a href="dboptaylor.xhtml">taylor</a> which works
+similarly to <a href="dbopseries.xhtml">series</a>. This is equivalent to
+the previous computation, except that now we are using the variable w 
+instead of z.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="makeRequest('p11');"
+    value="w:=taylor 'w" />
+  <div id="ansp11"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p11','p12']);"
+    value="exp(2+tan(w))" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{calseries5.xhtml}
+<<calseries5.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Converting to Power Series</div>
+  <hr/>
+The <a href="db.xhtml?ExpressionToUnivariatePowerSeries">
+ExpressionToUnivariatePowerSeries</a> package provides operations for
+computing series expansions of functions. 
+
+Evaluate this to compute the Taylor expansion of sin x about x=0. The first
+argument, sin(x), specifies the function whose series expansion is to be
+computed and the second argument, x=0, specifies that the series is to be
+expanded in powers of (x-0), that is, in powers of x.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="taylor(sin(x),x=0)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Here is the Taylor expansion of sin x about x=%pi/6:
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="taylor(sin(x),x=%pi/6)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+The function to be expanded into a series may have variables other than the
+series variable. For example, we may expand tan(x*y) as a Taylor series in x.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="taylor(tan(x*y),x=0)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+or as a Taylor series in y.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="taylor(tan(x*y),y=0)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+A more interesting function it (t*%e^(x*t))/(%e^t-1).
+When we expand this function as a Taylor series in t the nth order
+coefficient is the nth Bernoulli polynomial divided by n!.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="bern:=taylor(t*exp(x*t)/(exp(t)-1),t=0)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Therefore, this and the next expression produce the same result.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p5','p6']);"
+    value="factorial(6)*coefficient(bern,6)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p6','p7']);"
+    value="bernoulliB(6,x)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Technically, a series with terms of negative degree is not considered to
+be a Taylor series, but rather a Laurent series. If you try to compute a
+Taylor series expansion of x/log(x) at x=1 via taylor(x/log(x),x=1) you 
+get an error message. The reason is that the function has a pole at x=1,
+meaning that its series expansion about this point has terms of negative
+degree. A series with finitely many terms of negative degree is called a
+Laurent series. You get the desired series expansion by issuing this.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="makeRequest('p8');"
+    value="laurent(x/log(x),x=1)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+Similarly, a series with terms of fractional degree is neither a Taylor
+series nor a Laurent series. Such a series is called a Puiseux series. The
+expression laurent(sqrt(sec(x)),x=3*%pi/2) results in an error message 
+because the series expansion about this point has terms of fractional degree.
+However, this command produces what you want.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="makeRequest('p9');"
+    value="puiseux(sqrt(sec(x)),x=3*%pi/2)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+Finally, consider the case of functions that do not have Puiseux expansions
+about certain points. An example of this is x^x about x=0. puiseux(x^x,x=0)
+produces an error message because of the type of singularity of the 
+function at x=0. The general function <a href="dbopseries.xhtml">series</a>
+can be used in this case. Notice that the series returned is not, strictly
+speaking, a power series because of the log(x) in the expansion.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="makeRequest('p10');"
+    value="series(x^x,x=0)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+<hr/>
+The operation <a href="dbopseries.xhtml">series</a> returns the most general
+type of infinite series. The user who is not interested in distinguishing
+between various types of infinite series may wish to use this operation
+exclusively.
+<hr/>
+<<page foot>>
+@
+
+\subsection{calseries6.xhtml}
+<<calseries6.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Power Series from Formulas</div>
+  <hr/>
+The <a href="db.xhtml?GenerateUnivariatePowerSeries">
+GenerateUnivariatePowerSeries</a> package enables you to create power series
+from explicit formulas for their nth coefficients. In what follows, we
+construct series expansions for certain transcendental functions by giving
+forumulas for their coefficients. You can also compute such series 
+expansions directly by simply specifying the function and the point about
+which the series is to be expanded. See
+<a href="axbook/section-8.9.xhtml#subsec-8.9.5">
+Converting to Power Series</a> for more information.
+
+Consider the Taylor expansion of %e^x about x=0:
+<pre>
+  %e^x = 1 + x + x^2/2 + x^3/6 + ... 
+       = sum from n=0 to n=%infinity of x^n/n!
+</pre>
+The nth Taylor coefficient is 1/n!. This is how to create this series in
+Axiom.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="series(n+->1/factorial(n),x=0)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+The first argument specifies the formula for the nth coefficient by giving
+a function that maps n to 1/n!. The second argument specifies that the
+series is to be expanded in powers of (x-0), that is, in powers of x. Since
+we did not specify an initial degress, the first term in the series was the
+term of degree 0 (the constant term). Note that the formula was given as
+an anonymous function. These are discussed in
+<a href="axbook/section-6.17.xhtml">Anonymous Functions</a>
+
+Consider the Taylor expansion of log x about x=1:
+<pre>
+ log x = (x-1) - (x-1)^2/2 + (x-1)^3/3 - ... 
+       = sum from n=1 to n=%infinity of (-1_^(n-1) (x-1)^n/n
+</pre>
+If you were to evaluate the expression series(n+->(-1)^(n-1)/n,x=1) you
+would get an error message because Axiom would try to calculate a term of
+degree n=1,... are to be computed.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="series(n+->(-1)^(n-1)/n,x=1,1..)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Next consider the Taylor expansion of an odd function, say, sin(x):
+<pre>
+  sin x = x = x^2/3! + x^5/5! - ...
+</pre>
+Here every other coefficient is zero and we would like to give an explicit
+formula onloy for the odd Taylor coefficients. This is one way to do it.
+The third argument, 1.., specifies that the first term to be computed is
+the term of degree 1. The fourth argument, 2, specifies that we increment
+by 2 to find the degrees of subsequent terms, that is, the next term is of
+degree 1+2, the next of degree 1+2+2, etc.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="series(n+->(-1)^((n-1)/2)/factorial(n),x=0,1..,2)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+The initial degree and the increment do not have to be integers. For
+example, this expression produces a series expansion of sin(x^(1/3)).
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="series(n+->(-1)^((3*n-1)/2)/factorial(3*n),x=0,1/3..,2/3)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+While the increment must be positive, the initial degree may be negative.
+This yields the Laurent expansion of csc(x) at x=0.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="cscx:=series(n+->(-1)^((n-1)/2)*2*(2^n-1)*bernoulli(numer(n+1))/factorial(n+1),x=0,-1..,2)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Of course, the reciprocal of this power series is the Taylor expansion of
+sin(x).
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p5','p6']);"
+    value="1/cscx" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+As a final example, here is the Taylor expansion of asin(x) about x=0.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="asinx:=series(n+->binomial(n-1,(n-1)/2)/(n*2^(n-1)),x=0,1..,2)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+When we compute the sine of this series, we get x (in the sense that all
+higher terms computed so far are zero).
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p7','p8']);"
+    value="sin(asinx)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+As we discussed in 
+<a href="calseries5.xhtml">Converting to Power Series</a>, you can also use
+the operations
+<a href="dboptaylor.xhtml">taylor</a>,
+<a href="dboplaurent.xhtml">laurent</a>, and
+<a href="dboppuiseux.xhtml">puiseux</a>, instead of 
+<a href="dbopseries.xhtml">series</a> if you know ahead of time what
+kind of exponents a series has. You can't go wrong with 
+<a href="dbopseries.xhtml">series</a> though.
+<<page foot>>
+@
+
+\subsection{calseries7.xhtml}
+<<calseries7.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Substituting Numerical Values in Power Series</div>
+  <hr/>
+Use <a href="dbopeval.xhtml">eval</a> to substitute a numerical value for a
+variable in a power series. For example, here's a way to obtain numerical
+approximations of %e from the Taylor series expansion of exp(x).
+
+First you create the desired Taylor expansion.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="f:=taylor(exp(x))" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Then you evaluate the series at the value 1.0. The result is a sequence
+of the partial sums.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="eval(f,1.0)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{calseries8.xhtml}
+<<calseries8.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Example: Bernoulli Polynomials and Sums of Powers</div>
+  <hr/>
+Axiom provides operations for computing definite and indefinite sums.
+
+You can compute the sum of the first ten fourth powers by evaluating this.
+This creates a list whose entries are m^4 as m ranges from 1 to 10, and then
+computes the sum of the entries of that list.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="reduce(+,[m^4 for m in 1..10])" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+You can also compute a formula for the sum of the first k fourth powers, 
+where k is an unspecified positive integer.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="sum4:=sum(m^4,m=1..k)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+This formula is valid for any positive integer k. For instance, if we 
+replace k by 10, we obtain the number we computed earlier.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p2','p3']);"
+    value="eval(sum4,k=10)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+You can compute a formula for the sum of the first k nth powers in a
+similar fashion. Just replace the 4 in the definition of sum4 by any
+expression not involving k. Axiom computes these formulas using Bernoulli 
+polynomials; we use the rest of this section to describe this method.
+
+First consider this function of t and x.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="f:=t*exp(x*t)/(exp(t)-1)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+Since the expressions involved get quite large, we tell Axiom to show us only
+terms of degree up to 5.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="noresult" 
+    onclick="makeRequest('p5');"
+    value=")set streams calculate 5" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+If we look at the Taylor expansion of f(x,t) about t=0, we see that the 
+coefficients of the powers of t are polynomials in x.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p4','p5','p6']);"
+    value="ff:=taylor(f,t=0)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+In fact, the nth coefficient in this series is essentiall the nth Bernoulli
+polynomial: the nth coefficient of the series is 1/n!*Bn(x), where Bn(x) is
+the nth Bernoulli polynomial. Thus, to obtain the nth Bernoulli polynomial,
+we multiply the nth coefficient of the series ff by n!. For example, the
+sixth Bernoulli polynomial is this.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p4','p5','p6','p7']);"
+    value="factorial(6)*coefficient(ff,6)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+We derive some properties of the function f(x,t). First we compute
+f(x+1,t)-f(x-t).
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p4','p8']);"
+    value="g:=eval(f,x=x+1)-f" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+If we normalize g, we see that it has a particularly simple form.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p4','p8','p9']);"
+    value="normalize(g)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+From this it follows that the nth coefficient in the Taylor expansion of
+g(x,t) at t=0 is 1/(n-1)!*x^(n-1). If you want to check this, evaluate the
+next expression.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p4','p5','p8','p9','p10']);"
+    value="taylor(g,t=0)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+However, since 
+<pre>
+  g(x,t)=f(x+1,t)-f(x,t)
+</pre> 
+it follows that the nth coefficient
+is 
+<pre>
+   1/n! * (Bn(x+1) - Bn(x))
+</pre> 
+Equating coefficients, we see that 
+<pre>
+   1/(n-1)! * x^(n-1) = 1/n! * (Bn(x+1) - Bn(x))
+</pre>
+and, therefore
+<pre>
+   x^(n-1) = 1/n * (Bn(x+1) - Bn(x))
+</pre>
+Let's apply this formula repeatedly, letting x vary between two integers
+a and b, with a&#60;b:
+<pre>
+       a^(n-1) = 1/n * (Bn(a+1) - Bn(a))
+   (a+1)^(n-1) = 1/n * (Bn(a+2) - Bn(a+1))
+   (a+2)^(n-1) = 1/n * (Bn(a+3) - Bn(a+2))
+               .
+               .
+   (b-1)^(n-1) = 1/n * (Bn(b)   - Bn(b-1))
+       b^(n-1) = 1/n * (Bn(b+1) - Bn(b))
+</pre>
+When we add these equations we find that the sum of the left-hand sides is
+<pre>
+   sum(m=a..b,m^(n-1)) 
+</pre>
+the sum of the (n-1)-st powers from a to b. The sum
+of the right-hand sides is a "telescoping series". After cancellation, the
+sum is simply 
+<pre>
+   1/n*(Bn(b+1)-Bn(a))
+</pre>
+
+Replacing n by n+1, we have shown that
+<pre>
+   sum(m=a..b,m^n) = 1/(n+1)*(B&#60;n+1>(b+1)-B&#60;n+1>(a))
+</pre>
+
+Let's use this to obtain the formula for the sum of fourth powers. 
+First we obtain the Bernoulli polynomial B5.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p4','p5','p6','p11']);"
+    value="B5:=factorial(5)*coefficient(ff,5)" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+To find the sum of the first k 4th powers, we multiply 1/5 by 
+B5(k+1)-B5(1)
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p4','p5','p6','p11','p12']);"
+    value="1/5*(eval(B5,x=k+1)-eval(B5,x=1))" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+This is the same formula that we obtained via sum(m^4,m=1..k)
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="handleFree(['p2','p13']);"
+    value="sum4" />
+  <div id="ansp13"><div></div></div>
+ </li>
+</ul>
+At this point you may want to do the same computation, but with an exponent
+other than 4. For example, you might try to find a formula for the sum of
+the first k 20th powers.
+<<page foot>>
+@
+
+\subsection{commandline.xhtml}
+<<commandline.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    return(document.getElementById('comm').value);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+  <form id="commreq">
+    <p>
+      Type an input command line to Axiom:<br/>
+      <input type="text" id="p1" 
+       onclick="interpcall('p1');"
+       value="integrate(sin(x),x)" />
+    </p>
+  </form>
+  <center>
+    <input type="button" value="Continue" name="continue" 
+      onclick="intercall('p1');"/>
+  </center>
+  <div id="mathAns"><div></div></div>
+<<page foot>>
+@
+
+
+\subsection{complexlimit.xhtml}
+<<complexlimit.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    var myform = document.getElementById("form2");
+    var myfunct = myform.expr.value;
+    var myvar = myform.vars.value;
+    var ans = "";
+    // decide what the limit point should be
+    var finite = document.getElementById('finite').checked;
+    if (finite == true) {
+      var myreal = document.getElementById('fpreal').value;
+      var mycomplex = document.getElementById('fpcomplex').value;
+      if (myreal == 0) {
+       if (mycomplex == 0) {
+         ans = 'complexLimit('+myfunct+','+myvar+'=0)';
+       } else {
+         ans = 'complexLimit('+myfunct+','+myvar+'='+mycomplex+'*%i)';
+       }
+      } else {
+       if (mycomplex == 0) {
+         ans = 'complexLimit('+myfunct+','+myvar+'='+myreal+')';
+       } else {
+         ans = 
+          'complexLimit('+myfunct+','+myvar+'='+myreal+'+'+mycomplex+'*%i)';
+       }
+      }
+    } else {
+     ans = 'complexLimit('+myfunct+','+myvar+'=%infinity)';
+    }
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+  <form id="form2">
+   Enter the function you want to compute the limit of:<br/>
+   <input type="text" id="expr" tabindex="10" size="50" 
+     value="sin(a*x)/tan(b*x)"/><br/>
+   Enter the name of the variable:<br/>
+   <input type="text" id="vars" tabindex="20" value="x"/><br/>
+   <input type="radio" id="finite" tabindex="30" checked="checked" 
+     name="point"/>
+    A finite point: Real part:
+    <input type="text" id="fpreal" tabindex="40" value="0"/>
+    Complex part:
+    <input type="text" id="fpcomplex" tabindex="50" value="0"/><br/>
+   <input type="radio" id="plus" tabindex="60" name="point"/>
+    %infinity<br/>
+  </form>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+@
+
+\subsection{crytopage.xhtml}
+<<cryptopage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<center>
+ <h2>RCM3720 Cryptography, Network and Computer Security</h2>
+</center>
+<hr/>
+<ol>
+ <li> <a href="cryptoclass1.xhtml">
+       Laboratory Class 1: Introduction to Axiom
+      </a>
+ </li>
+ <li> <a href="cryptoclass2.xhtml">
+       Laboratory Class 2: Strings and Values
+      </a>
+ </li>
+ <li> <a href="cryptoclass3.xhtml">
+       Laboratory Class 3: Number Theory
+      </a>
+ </li>
+ <li> <a href="cryptoclass4.xhtml">
+       Laboratory Class 4: Simple Cryptosystems
+      </a>
+ </li>
+ <li> <a href="cryptoclass5.xhtml">
+       Laboratory Class 5: RSA and public-key cryptosystems
+      </a>
+ </li>
+ <li> <a href="cryptoclass6.xhtml">
+       Laboratory Class 6: Digital Signatures
+      </a>
+ </li>
+ <li> <a href="cryptoclass7.xhtml">
+       Laboratory Class 7: Knapsack cryptosystems
+      </a>
+ </li>
+ <li> <a href="cryptoclass8.xhtml">
+       Laboratory Class 8: Modes of Encryption
+      </a>
+ </li>
+ <li> <a href="cryptoclass9.xhtml">
+       Laboratory Class 9: Hash Functions
+      </a>
+ </li>
+</ol>
+<<page foot>>
+@
+
+\subsection{crytoclass1.xhtml}
+<<cryptoclass1.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<center>
+  <h2>RCM3720 Cryptography, Network and Computer Security</h2>
+  <h3>Laboratory Class 1: Introduction to Axiom</h3>
+</center>
+<hr/>
+
+<b>Numbers and arithmetic</b>
+
+<ul>
+ <li> You can treat Axiom like a glorified calculator.  Enter the following:
+  <ul>
+   <li> <span class="cmd">3+5</span></li>
+   <li> <span class="cmd">5*7</span></li>
+   <li> <span class="cmd">2^3/3^5</span></li>
+   <li> <span class="cmd">(3^4)^5</span></li>
+   <li> <span class="cmd">3^(4^5)</span></li>
+  </ul>
+ </li>
+ <li> What happens if you enter the last command without the brackets?</li>
+
+ <li> To obtain the factorial <tt>n!</tt>, use the Axiom command 
+      <tt>factorial</tt>:
+  <ul>
+   <li> <span class="cmd">factorial(10)</span></li>
+  </ul>
+ </li>
+ <li> By trial and error, find the smallest number whose factorial 
+      ends in six zeros.
+ </li>
+</ul>
+
+<b>Lists</b>
+
+<ul> 
+ <li> Assignment is done using "<tt>:=</tt>" 
+      where the <i>colon-equals</i> symbols are 
+      used for assigning a particular object to a variable.
+  <ul>
+   <li> <span class="cmd">var:=3</span></li>
+  </ul>
+ </li>
+ <li> Lists are created using square brackets;
+  <ul>
+   <li> <span class="cmd">mylist1:=[k^2 for k in 1..10]</span></li>
+  </ul>
+ </li>
+ <li> We can operate on all elements of a list using the 
+      <tt>reduce</tt> command:
+  <ul>
+   <li> <span class="cmd">reduce(+,mylist1)</span></li>
+   <li> <span class="cmd">reduce(*,mylist2)</span></li>
+  </ul>
+ </li>
+ <li> Of course, these could be done as single commands:
+  <ul>
+   <li> <span class="cmd">reduce(+,[k^2 for k in 1..10])</span></li>
+   <li> <span class="cmd">reduce(*,[1/j for j in 5..15])</span></li>
+  </ul>
+ </li>
+ <li> Notice how the last result is given as a single large fraction.  To
+      obtain a decimal result we can do either of two things:
+  <ol>
+   <li> Convert the output to be of type ``Float'':
+    <ul>
+     <li> <span class="cmd">reduce(*,[1/j for j in 5..15])::Float</span></li>
+     <li> Two colons can be used to change the type of an object.</li>
+    </ul>
+   </li>
+   <li> Use floats in the initial command: 
+    <ul>
+     <li> <span class="cmd">reduce(*,[1.0/j for j in 5..15])</span></li>
+    </ul>
+   </li>
+  </ol>
+ </li>
+ <li> Using lists, add up the first 1000 integers.</li>
+  
+ <li> By trial and error, find the smallest number <i>n</i> for which 
+      the sum of the first <i>n</i> reciprocals is bigger than 8.
+ </li>
+ <li> We can also add numbers by using the <tt>sum</tt> function; here's how
+      to add the first 100 reciprocals:
+  <ul>
+   <li> <span class="cmd">sum(1.0/k,k = 1..100)</span></li>
+  </ul>
+ </li>
+</ul>
+
+<b>Functions and maps</b>
+
+<ul>
+ <li> We shall create a simple function, and apply it to <tt>mylist1</tt> from
+      above:
+  <ul>
+   <li> <span class="cmd">f(x) == x-2</span></li>
+   <li> <span class="cmd">map(f,mylist1)</span></li>
+  </ul>
+ </li>  
+ <li> Supposing we want to subtract 2 from every element of a list without
+      having to create a function first.  In this case we can use the 
+      "mapping" symbols:
+  <ul>
+   <li> <span class="cmd">map(x +-> x-2,mylist1)</span></li>
+  </ul>
+ </li>  
+ <li> Create a list called <tt>nums</tt> containing all the integers from 1 
+      to 100.  Now we shall create a simple function <tt>f(x)</tt> which 
+      returns <tt>x</tt> if it is prime, and 0 otherwise.  The Axiom 
+      function <tt>prime?</tt> tests for primality:
+  <ul>
+   <li> <span class="cmd">f(x)==if prime?(x) then x else 0</span></li>
+  </ul>
+ </li>
+ <li> Now apply this function <tt>f</tt> to <tt>nums</tt>.  
+      Remove all the zeros:
+      <i>(% refers to the output of the last command.)</i>
+  <ul>
+   <li> <span class="cmd">remove(0,%)</span></li>
+  </ul>
+ </li>
+ <li> and determine how many primes there are, using the hash symbol #
+      which can be used to count the number of elements in a list:
+  <ul>
+   <li> <span class="cmd">#%</span></li>
+  </ul>
+ </li>
+ <li> These last commands can be done as a single command:
+  <ul>
+   <li> <span class="cmd">#remove(0,map(f,nums))</span></li>
+  </ul>
+ </li>
+ <li> Use the last command to create a function called <tt>numprimes</tt>
+      which will count the number of primes below any given integer.
+ </li>
+ <li> How many primes are there less than 1000?  Less than 10000?</li>
+  
+ <li> Alternatively, we can list all the primes below 100 by creating our 
+      list using the "such that" operator---a vertical stroke:
+  <ul>
+   <li> <span class="cmd">[k for k in 1..100 | prime?(k)]</span></li>
+  </ul>
+ </li>
+ <li> or we could just return the length of the list:
+  <ul>
+   <li> <span class="cmd">#[k for k in 1..100 | prime?(k)]</span></li>
+  </ul>
+ </li>
+ <li> Use this approach to create a function called <tt>numprimes2</tt>
+      which will count the number of primes below any given integer.
+ </li>
+ <li>How many primes are there less than 2000?  Less than 15000?</li>
+</ul>
+
+<b>Housekeeping</b><br/>
+
+Axiom contains many commands for managing your workspace and your
+environment; such commands are all prefixed with a right parenthesis.
+
+<ul>
+ <li> Sometimes you need to clear a variable, say a variable <tt>x</tt>:
+  <ul>
+   <li> <span class="cmd">)clear properties x</span></li>
+  </ul>
+ </li>
+ <li> Most commands of this sort can be abbreviated using their 
+      first two letters:
+  <ul>
+   <li> <span class="cmd">)cl pr x</span></li>
+  </ul>
+ </li>
+ <li> To clean out everything:
+  <ul>
+   <li> <span class="cmd">)cl all</span></li>
+  </ul>
+ </li>
+ <li> To see what variables you've accumulated over your work:
+  <ul>
+   <li> <span class="cmd">)display names</span></li>
+   <li> <i>or abbreviated as</i> )d n</li>
+  </ul>
+ </li>
+ <li> You may have noticed earlier that Axiom poured out lots 
+      of messages when it first "got going".  These can be turned off:
+  <ul>
+   <li> <span class="cmd">)set messages autoload off</span></li>
+  </ul>
+ </li>
+ <li> Note here that if you just type in "<tt>)set</tt>" or its abbreviation
+      "<tt>)se</tt>", you'll be presented with the list of all the possible
+      options.  Likewise "<tt>)se me</tt>" lists all possible options for
+      messages, and so on.
+ </li>
+ <li> Can you find the command which turns on a time function, 
+      so gives the time to compute each command?
+ </li>
+ <li> The command "<tt>)summary</tt> gives a quick summary of these
+      commands.
+ </li>
+ <li> To quit Axiom, type
+  <ul>
+   <li> <span class="cmd">)quit</span></li>
+  </ul>
+ </li>
+ <li> or its one letter abbreviation "<tt>)q</tt>", followed by <tt>y</tt> to
+      confirm.
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{crytoclass2.xhtml}
+<<cryptoclass2.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<center>
+ <h2>RCM3720 Cryptography, Network and Computer Security</h2>
+ <h3>Laboratory Class 2: Strings and Values</h3>
+</center>
+<hr/>
+
+<b>Characters and Strings</b>
+
+<ul>
+ <li> All printable characters have a fixed ASCII value; some of which are:
+<br/>
+<pre>
+      Character |  A   B   Y   Z   a   b   y   z
+    ------------+-------------------------------
+    ASCII Value | 65  66  89  90  97  98  121 122
+                |
+      Character |  0   1   8   9   ,   -   .   /
+    ------------+-------------------------------
+    ASCII Value | 48  49  56  57  44  45  46  47 
+</pre>
+ </li>
+ <li> To obtain values 0 to 25 for A to Z, we need to subtract 65 from 
+      the ASCII values.  
+ </li>
+ <li> In Axiom, the <tt>ord</tt> command gives the ASCII value of a
+      character.  Create a string such as:
+  <ul>
+   <li> <span class="cmd">str:="THISISASTRING"</span></li>
+  </ul>
+ </li>
+ <li> A string can be turned into a list of characters using <tt>members</tt>:
+  <ul>
+   <li> <span class="cmd">members(str)</span></li>
+  </ul>
+ </li>
+ <li> This means a string can be turned into a list of ASCII values by 
+      mapping the <tt>ord</tt> function onto the list of members:
+  <ul>
+   <li> <span class="cmd">map(ord,members(str))</span></li>
+  </ul>
+ </li>
+ <li> To obtain values in the 0--25 range, try using an unnamed function:
+  <ul>
+   <li> <span class="cmd">strn:=map(x +-> ord(x)-65,members(str))</span></li>
+  </ul>
+ </li>
+ <li> Use this last command to create a function <tt>str2lst</tt> which will
+      take a string (assumed to be of capital letters, with no spaces or
+      punctuation), and return a list of values between 0 and 25.
+ </li>
+ <li> To go the other way, we first need to add 65 to all elements of
+      <tt>strn</tt>:
+  <ul>
+   <li> <span class="cmd">map(x +-> x+65,strn)</span></li>
+  </ul>
+ </li>
+ <li> Turn this into characters with <tt>char</tt>:
+  <ul>
+   <li> <span class="cmd">map(char,%)</span></li>
+  </ul>
+ </li>
+ <li> These can be done as a single command:
+  <ul>
+   <li> <span class="cmd">map(x +-> char(x+65),strn)</span></li>
+  </ul>
+ </li>
+ <li> To put them all together as a single string we can concatenate them 
+      with the <tt>concat</tt> function from the <tt>String</tt> domain:
+  <ul>
+   <li> <span class="cmd">concat(%)$String</span></li>
+  </ul>
+ </li>
+ <li> In one line:
+  <ul>
+   <li> <span class="cmd">concat(map(x +-> char(x+65),strn))$String</span></li>
+  </ul>
+ </li>
+ <li> Alternatively, we could convert the characters to type <tt>String</tt>
+      before concatenation:
+  <ul>
+   <li> 
+    <span class="cmd">
+     concat(map(x +-> char(x+65)::String,strn))
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> Use either version of this last command to create a function
+      <tt>lst2str</tt> which will take a list of values between 0 and 25 and
+      return a string.
+ </li>
+ <li> Create a text file in one of your private directories called
+      <tt>my3720.input</tt> and copy your <tt>str2lst</tt> and 
+      <tt>lst2str</tt> functions to it.
+ </li>
+ <li> You can read command line input from a file with the extension
+      <tt>.input</tt> using the <tt>)read</tt> command:
+  <ul>
+   <li> <span class="cmd">)read my3720</span></li>
+  </ul>
+ </li>
+ <li> The Caesar cipher can be implemented by the following three steps:
+  <ol>
+   <li> Turn the string into a list,</li>
+   <li> Add 3 to every number in the list,</li>
+   <li> Turn this new list back into a string.</li>
+  </ol>
+ </li>
+ <li> To ensure that step (2) remains in the 0--25 range, we need to use the
+      <tt>rem</tt> function.  These can all be put together as:
+  <ul>
+   <li> 
+    <span class="cmd">
+     caesar(str) == lst2str(map(x +-> (x+3) rem 26, str2lst(str)))
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> Try this out on a few strings of your choice.</li>
+  
+ <li> By replacing the "<tt>+3</tt>" in the <tt>caesar</tt> function with
+  "<tt>+n</tt>" create a new function called <tt>trans(str,n)</tt> which
+  implements a general translation cipher.
+ </li>
+ <li> Test it out; these two commands should produce the same results.
+  <ul>
+   <li> <span class="cmd">caesar("MYSTRING")</span></li>
+   <li> <span class="cmd">trans("MYSTRING",3)</span></li>
+  </ul>
+ </li>
+ <li> If you like, add the <tt>caesar</tt> and <tt>trans</tt> functions to
+      your <tt>my3720.input</tt> file.
+ </li>
+ <li> Test your <tt>trans</tt> function out on a few other strings and
+      translation values.
+ </li>
+ <li> The <tt>ROT13</tt> cipher is used in Usenet postings to hide information
+      which might be considered offensive.  It is a translation cipher with a
+      shift of 13.  Since 13 is half of 26, this means that encrytion and
+      decryption are exactly the same.  Apply <tt>ROT13</tt> to:
+  <ul>
+   <li> GUVFVFNIRELFREVBHFOHFVARFF</li>
+  </ul>
+ </li>
+ <li> Consider this string which has been produced with a translation cipher.
+      To decrypt it, simply apply all possible shifts until you obtain 
+      understandable text. 
+  <ul>
+   <li> IUDTCUQBBOEKHCEDUO</li>
+  </ul>
+ </li>
+ <li> To apply all the possible shifts do:
+  <ol>
+   <li> <span class="cmd">ct:="IUDTCUQBBOEKHCEDUO"</span></li>
+   <li> <span class="cmd">for i in 1..26 repeat output trans(ct,i)</span></li>
+  </ol>
+ </li>
+ <li> What is the plaintext?</li>
+</ul>
+<<page foot>>
+@
+
+\subsection{crytoclass3.xhtml}
+<<cryptoclass3.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<center>
+ <h2>RCM3720 Cryptography, Network and Computer Security</h2>
+ <h3>Laboratory Class 3: Number Theory</h3>
+</center>
+<hr/>
+
+<ul>
+
+ <li> Check out the commands <tt>gcd</tt> and <tt>factor</tt>, and test them
+  on different numbers, small and large.
+ </li>  
+ <li> Axiom provides a few useful commands for taking apart the factors of an
+  object:
+  <ul>
+   <li> <span class="cmd">n:=5040</span></li>
+   <li> <span class="cmd">f:=factor(n)</span></li>
+   <li> <span class="cmd">numf:=numberOfFactors(f)</span></li>
+   <li> <span class="cmd">fs:=[nthFactor(f,i) for i in 1..numf]</span></li>
+   <li> <span class="cmd">es:=[nthExponent(f,i) for i in 1..numf]</span></li>
+   <li> <span class="cmd">reduce(*,[fs.i^es.i for i in 1..numf])</span></li>
+  </ul>
+ </li>
+ <li> The last command simply multiplies all the factors to their powers.</li>
+ 
+ <li> Check out the commands <tt>prime?</tt>, <tt>nextPrime</tt> and
+      <tt>prevPrime</tt>.
+ </li>
+ <li> To compute the <tt>i</tt>-th prime, we can construct a <i>stream</i>
+      (an infinite list) in Axiom:
+  <ul>
+   <li> 
+    <span class="cmd">
+     primes:Stream Integer:=[i for i in 2.. | prime? i]
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> Now we can find, for example, the 100-th prime, and the 2500-th prime:
+  <ul>
+   <li> <span class="cmd">primes.100</span></li>
+   <li> <span class="cmd">primes.2500</span></li>
+  </ul>
+ </li>
+ <li> Create random 10 digit primes:
+  <ul>
+   <li> <span class="cmd">p := nextPrime(random(10^10))</span></li>
+   <li> <span class="cmd">q := nextPrime(random(10^10))</span></li>
+  </ul>
+ </li>
+ <li> Now multiply them and factor the product.  How long did it take?</li>
+
+ <li> Try the same thing with 12 digit primes and 15 digit primes.</li>
+  
+ <li> The extended Euclidean algorithm is implemented by the command
+  <tt>extendedEuclidean</tt>.  Here's how to use it:
+  <ul>
+   <li> <span class="cmd">a:=1149</span></li>
+   <li> <span class="cmd">b:=3137</span></li>
+   <li> <span class="cmd">g:=extendedEuclidean(a,b)</span></li>
+   <li> <span class="cmd">s:=g.coef1</span></li>
+   <li> <span class="cmd">t:=g.coef2</span></li>
+  </ul>
+ </li>
+ <li> and now test them:
+  <ul>
+   <li> <span class="cmd">s*a+t*b</span></li>
+  </ul>
+ </li>
+ <li> Try this on a few other numbers.</li>
+  
+ <li> Axiom uses the command <tt>positiveRemainder</tt> instead of
+      <tt>mod</tt> command, so let's define <tt>mod</tt> to be a renaming 
+      of the <tt>positiveRemainder</tt> function:
+  <ul>
+   <li> <span class="cmd">mod ==> positiveRemainder</span></li>
+  </ul>
+ </li>
+ <li> Now the commands <tt>addmod</tt>, <tt>submod</tt>, <tt>mulmod</tt>, and
+      <tt>invmod</tt> can be used to perform modular arithmetic.  Here's a few
+      examples; first a simple modulus calculation:
+  <ul>
+   <li> <span class="cmd">-10 mod 3</span></li>
+  </ul>
+ </li>
+ <li> Addition, subtraction and multiplication mod 14:
+  <ul>
+   <li> <span class="cmd">addmod(10,13,14)</span></li>
+   <li> <span class="cmd">submod(17,23,14)</span></li>
+   <li> <span class="cmd">mulmod(13,27,14)</span></li>
+  </ul>
+ </li>
+ <li> Powers and inverses:
+  <ul>
+   <li> <span class="cmd">powmod(19,237,14)</span></li>
+   <li> <span class="cmd">invmod(11,14)</span></li>
+  </ul>
+ </li>
+ <li> Find out what happens if you try to take an inverse of a number not
+      relatively prime to the modulus:
+  <ul>
+   <li> <span class="cmd">invmod(12,14)</span></li>
+  </ul>
+ </li>
+ <li> Try these command with a few other numbers, and test out the examples in
+  the notes.
+ </li>
+ <li> The second method, which can be more powerful, is to treat all numbers
+  as elements of the residue values 0 to <tt>n-1</tt>.  This can be done with 
+  the <tt>IntegerMod</tt> construction, or its abbreviation <tt>ZMOD</tt>.  
+  Here's a few examples:
+  <ul>
+   <li> <span class="cmd">a:=11::ZMOD 14</span></li>
+  </ul>
+ </li>
+ <li> This declares the variable <tt>a</tt> to be a member of the residue 
+      class modulo 14.  Now all arithmetic including <tt>a</tt> will be 
+      reduced to this same class of values:
+  <ul>
+   <li> <span class="cmd">a+25</span></li>
+   <li> <span class="cmd">a*39</span></li>
+   <li> <span class="cmd">a^537</span></li>
+  </ul>
+ </li>
+ <li> Inversion can be done with the <tt>recip</tt> command:
+  <ul>
+   <li> <span class="cmd">recip(a)</span></li>
+  </ul>
+ </li>  
+ <li> We don't have to define a variable first.  All the above commands could
+      be equivalently written as:
+  <ul>
+   <li> <span class="cmd">(11::ZMOD 14)+25</span></li>
+   <li> <span class="cmd">11::ZMOD 14*39</span></li>
+   <li> <span class="cmd">11::ZMOD 14^537</span></li>
+   <li> <span class="cmd">recip(11::ZMOD 14)</span></li>
+  </ul>
+ </li>  
+ <li> If the modulus is a prime, then division (by non-zero values) is also
+      possible.  Axiom provides the alternative construction 
+      <tt>PrimeField</tt> or more simply <tt>PF</tt>.  For example:
+  <ul>
+   <li> <span class="cmd">a:=7::PF 11</span></li>
+  </ul>
+ </li>
+ <li> All the above arithmetic operations of addition, subtraction, 
+      multiplication and powers work, but now we also have inversion:
+  <ul>
+   <li> <span class="cmd">1/a</span></li>
+  </ul>
+ </li>
+ <li> Using any of the methods you like, test out Fermat's theorem for a large
+      prime <tt>p</tt> and an integer <tt>a</tt>.
+ </li>  
+ <li> Euler's totient function is implemented with <tt>eulerPhi</tt>.  Choose
+      a large integer <tt>n</tt>, a random <tt>a</tt> with 
+      <tt>gcd(a,n)=1</tt> , and test Euler's theorem
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{crytoclass4.xhtml}
+<<cryptoclass4.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<center>
+ <h2>RCM3720 Cryptography, Network and Computer Security</h2>
+ <h3>Laboratory Class 4: Simple Cryptosystems</h3>
+</center>
+<hr/>
+
+We have experimented with the Caesar cipher and the more general
+translation cipher.  We shall start looking at the Vigen&#x0E8;re cipher.
+The trick is to add the correct letter of the code to the letter of
+the key:
+<pre>
+ Index of plain text i: 1  2  3  4  5  6  7  8
+             Plaintext: W  I  T  H  D  R  A  W
+                   Key: C  O  D  E  C  O  D  E
+        Index of key j: 1  2  3  4  1  2  3  4
+</pre>
+
+The indices of the key repeat 1, 2, 3, 4.  We can get a repetition of
+length four by using a modulus of 4:
+<pre>
+                     i: 1  2  3  4  5  6  7  8
+             i (mod 4): 1  2  3  0  1  2  3  0
+</pre>
+
+What we need to do is to subtract one before the modulus, and add one after:
+<pre>
+                     i: 1  2  3  4  5  6  7  8
+                   i-1: 0  1  2  3  4  5  6  7
+           i-1 (mod 4): 0  1  2  3  0  1  2  3
+       i-1 (mod 4) + 1: 1  2  3  4  1  2  3  4
+</pre>
+
+This means that in the Vigen&#x0E8;re cipher, we add the <i>i</i>-th
+character of the plaintext, and the <i>j</i>-th character of the key, where
+<pre>
+   j=i-1 (mod n) + 1
+</pre>
+with <i>n</i> being the length of the key.
+
+<ul>
+
+ <li> First read in the <tt>rcm3720.input</tt> file you have created:
+  <ul>
+   <li> <span class="cmd">)read rcm3720</span></li>
+  </ul>
+
+  You may have to include the full path here.
+ </li>
+ <li> Enter a plaintext
+  <ul>
+   <li> <span class="cmd">plaintext:="WITHDRAWONEHUNDREDDOLLARS"</span></li>
+  </ul>
+ </li>
+ <li> and a keyword:
+  <ul>
+   <li> <span class="cmd">key := "CODE"</span></li>
+  </ul>
+ </li>
+ <li> Now we can obtain the lengths of the plaintext and key with the hash
+      symbol:
+  <ul>
+   <li> <span class="cmd">pn:=#plaintext</span></li>
+   <li> <span class="cmd">kn:=#key</span></li>
+  </ul>
+ </li>
+ <li> Turn both plaintext and key into lists of numbers:
+  <ul>
+   <li> <span class="cmd">pl:=str2lst(plaintext)</span></li>
+   <li> <span class="cmd">kl:=str2lst(key)</span></li>
+  </ul>
+ </li>  
+ <li> Now we can add them using the formula for <tt>j</tt> above to obtain 
+      the list corresponding to the ciphertext:
+  <ul>
+   <li> 
+    <span class="cmd">
+     cl:=[(pl.i+kl.((i-1) rem kn+1))::ZMOD 26 for i in 1..pn]
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> And obtain the ciphertext (we need to convert our list to a list of
+      integers first):
+  <ul>
+   <li> <span class="cmd">ciphertext:=lst2str(cl::List INT)</span></li>
+  </ul>
+ </li>
+ <li> Try a few other Vigen&#x0E8;re encryptions.</li>
+  
+ <li> To decrypt, we just <i>subtract</i> the key value from the ciphertext
+  value:
+  <ul>
+   <li> 
+    <span class="cmd">
+     pl:=[(cl.i+kl.((i-1) rem kn+1))::ZMOD 26 for i in 1..pn]
+    </span>
+    </li>
+   <li> <span class="cmd">lst2str(pl::List INT)</span></li>
+  </ul>
+ </li>  
+ <li> Now for the Hill (matrix) cipher.  We shall use <tt>3 x 3</tt>
+  matrices, so first create a plaintext whose length is a multiple of 3:
+  <ul>
+   <li> <span class="cmd">plaintext:="WITHDRAWONEHUNDREDDOLLARSXX"</span></li>
+   <li> <span class="cmd">pl:=str2lst(plaintext)</span></li>
+   <li> <span class="cmd">r:=3</span></li>
+   <li> <span class="cmd">c:INT:=#pl/r</span></li>
+  </ul>
+ </li>
+ <li> The values <tt>r</tt> and <tt>c</tt> are the row and column numbers 
+      of the plaintext matrix.
+ </li>  
+ <li> Now put all the plaintext values into a <tt>r x c</tt> matrix:
+  <ul>
+   <li> 
+    <span class="cmd">
+     S:=matrix([[pl.(r*(i-1)+j) for i in 1..c] for j in 1..r])
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> Create the key matrix:
+  <ul>
+   <li> 
+    <span class="cmd">
+     M:Matrix ZMOD 26:=matrix([[22,11,19],[15,20,24],[25,21,16]])
+    </span>
+   </li>
+  </ul>
+ </li>  
+ <li> Multiply the two matrices:
+  <ul>
+   <li> <span class="cmd">C:=M*S</span></li>
+  </ul>
+ </li>
+ <li> Notice how the results are automatically reduced modulo 26,
+      because that is how the matrix <tt>M</tt> was defined.
+ </li> 
+ <li> Now we have to read off the elements of <tt>C</tt> into a single list;
+  this can be done by transposing the matrix, and reading off the rows as
+  lists:
+  <ul>
+   <li> 
+    <span class="cmd">
+     CL:=concat(transpose(C)::List List ZMOD 26)
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> And finally turn into ciphertext:
+  <ul>
+   <li> <span class="cmd">lst2str(CL::List INT)</span></li>
+  </ul>
+ </li>
+ <li> Finally, here's how we can invert our matrix <tt>M</tt> modulo 26:
+  <ul>
+   <li> <span class="cmd">adj:=adjoint(M).adjMat</span></li>
+   <li> <span class="cmd">invdet:=recip(determinant(M))</span></li>
+   <li> <span class="cmd">MI:=invdet*adj</span></li>
+  </ul>
+ </li>
+ <li> Or alternatively, as one command:
+  <ul>
+   <li> 
+    <span class="cmd">
+     MI:=recip(determinant(M))*adjoint(M).adjMat
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> Check the result:
+  <ul>
+   <li> <span class="cmd">M*MI</span></li>
+  </ul>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{crytoclass5.xhtml}
+<<cryptoclass5.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<center>
+ <h2>RCM3720 Cryptography, Network and Computer Security</h2>
+ <h3>Laboratory Class 5: RSA and public-key cryptosystems</h3>
+</center>
+<hr/>
+<ul>
+ <li> Read in this file:
+  <ul>
+   <li> 
+    <span class="cmd">
+     )read "S:/Samples/RCM3720/rcm3720.input" )quiet
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> You can leave the "<tt>)quiet</tt>" off if you like.  The file
+  is also available <a href="rcm3720.input">here</a>.  
+  If you obtain it from the
+  website, save it to a place of your choice, and <tt>read</tt> it
+  into your Axiom session using the full path, as shown above.
+ </li>
+ <li> Now create some large primes and their product:
+  <ul>
+   <li> <span class="cmd">r() == rand(2^100)</span></li>
+   <li> <span class="cmd">p:=nextPrime(r())</span></li>
+   <li> <span class="cmd">q:=nextPrime(r())</span></li>
+   <li> <span class="cmd">n:=p*q</span></li>
+  </ul>
+ </li>
+ <li> Choose a value <tt>e</tt> and ensure that it is relatively prime 
+      to your <tt>(p-1)(q-1)</tt>, and determine 
+      <tt>d=e^-1 mod (p-1)(q-1)</tt>.  (Use the <tt>invmod</tt> function here).
+ </li>
+ <li> Create a plaintext:
+  <ul>
+   <li> <span class="cmd">pl:="This is my plaintext."</span></li>
+  </ul>
+ </li>
+ <li> (or any plaintext you like), and convert it to a number using the
+      <tt>str2num</tt> procedure from the file above:
+  <ul>
+    <li> <span class="cmd">pln:=str2num(pl)</span></li>
+  </ul>
+ </li>
+ <li> Encrypt this number using the RSA method:
+  <ul>
+   <li> <span class="cmd">ct:=powmod(pln,e,n)</span></li>
+  </ul>
+ </li>
+ <li> and decrypt the result:
+  <ul>
+   <li> <span class="cmd">decrypt:=powmod(ct,d,n)</span></li>
+   <li> <span class="cmd">num2str(decrypt)</span></li>
+  </ul>  
+ </li>
+ <li> With a friend, swap your public keys and use them to send
+      each other a ciphertext encrypted with your friend's public key.
+ </li>
+ <li> Now decrypt the ciphertext you have received using your private key.</li>
+  
+ <li> Now try Rabin: create two large primes <tt>p</tt> and <tt>q</tt> and 
+      ensure that each is equal to 3 mod 4.  (You might have to run the 
+      <tt>nextPrime</tt> command a few times until you get primes which work.)
+ </li>
+ <li> Create <tt>N=pq</tt> and create a plaintext <tt>pl</tt>, and its 
+      numerical equivalent.
+ </li>
+ <li> Determine the ciphertext <tt>c</tt> by squaring your 
+      number mod <tt>N</tt>.
+ </li>
+ <li> Determine the <tt>s</tt> and <tt>t</tt> for which <tt>sp+tq=1</tt> 
+      by using the <tt>extendedEuclidean</tt> function.
+ </li> 
+ <li> Now follow through the Rabin decryption:
+  <ul>
+   <li> <span class="cmd">cp:=powmod(c,(p+1)/4,N) </span></li>
+   <li> <span class="cmd">cq:=powmod(c,(q+1)/4,N)</span></li>
+   <li> 
+    <span class="cmd">
+     c1:=(s*p*cq+t*q*cp)::ZMOD N,num2str(c1::INT)
+    </span>
+   </li>
+   <li> 
+    <span class="cmd">
+     c2:=(s*p*cq-t*q*cp)::ZMOD N,num2str(c2::INT)
+    </span>
+   </li>
+   <li> 
+    <span class="cmd">
+     c3:=(-s*p*cq-t*q*cp)::ZMOD N,num2str(c3::INT)
+    </span>
+   </li>
+   <li> 
+    <span class="cmd">
+     c4:=(-s*p*cq+t*q*cp)::ZMOD N,num2str(c4::INT)
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> One of the outputs <tt>c1</tt>, <tt>c2</tt>, <tt>c3</tt> and
+      <tt>c4</tt> should produce the correct plaintext; the others should be
+      gibberish.
+ </li>
+ <li> As above, swap public keys with a friend, and use those public
+      keys to encrypt a message to him or her.  Now decrypt the ciphertext
+      you have been given.
+ </li>
+ <li> For the el Gamal system, you need a large prime and a primitive
+      root. Create a large prime <tt>p</tt> and find a primitive root 
+      <tt>a</tt> using.
+  <ul>
+   <li> <span class="cmd">a:=primitiveElement()$PF p</span></li>
+  </ul>
+ </li>
+ <li> The <tt>primitiveElement</tt> command is not very efficient, so
+      if it seems to be taking a long time, abort the computation and try
+      with another prime.
+ </li>
+ <li> Do this in pairs with a friend, so that you each agree on a
+      large prime and a primitive root.
+ </li>
+ <li> Now choose a random value <tt>A</tt>:
+  <ul>
+   <li> <span class="cmd">A:=random(p-1)</span></li>
+  </ul>
+ </li>
+ <li> and create your public key <tt>A1=a^A (mod p)</tt>:
+  <ul>
+   <li> <span class="cmd">A1:=a^A</span></li>
+  </ul>
+ </li>
+ <li> Swap public keys with your friend.</li>
+  
+ <li> Create a plaintext <tt>pl</tt> and its number <tt>pln</tt>, and create
+      the ciphertext as follows (where <tt>A1</tt> is your friend's 
+      public key):
+  <ul>
+   <li> <span class="cmd">k:=random(p-1)</span></li>
+   <li> <span class="cmd">K:=A1^k</span></li>
+   <li> <span class="cmd">C:=[a^k, K*pln]</span></li>
+  </ul>
+ </li>
+ <li> This pair <tt>C</tt> is the ciphertext you send to your friend.</li>
+  
+ <li> Now decrypt the ciphertext you have been sent:
+  <ul>
+   <li> <span class="cmd">K:=C.1 ^ A</span></li>
+   <li> <span class="cmd">m:=C.2/K</span></li>
+   <li> <span class="cmd">num2str(m::INT)</span></li>
+  </ul>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{crytoclass6.xhtml}
+<<cryptoclass6.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<center>
+ <h2>RCM3720 Cryptography, Network and Computer Security</h2>
+ <h3>Laboratory Class 6: Digital Signatures</h3>
+</center>
+<hr/>
+
+You will need to read in the <a href="rcm3720.input">rcm3720.input</a>
+file for the <tt>str2num</tt> and <tt>num2str</tt> procedures.
+<br/>
+<b>NOTE:</b> To save typing in all the messages and long signature
+numbers, just copy them from <a href="signatures.txt">signatures.txt</a>
+
+<ul>
+
+ <li> For an RSA signature scheme, I provide the public key <i>(n,e)</i>, where
+<pre>
+      137
+   n=2   -1,  e=17
+</pre>
+ </li>
+ <li> This value <tt>n</tt> has two large prime factors. 
+      Use my public key to verify my signature of the following message:
+<pre>
+   This is my text.
+   68767027465671577191073128495082795700768
+</pre>
+ </li> 
+ <li> Now try with the public key
+<pre>
+      67
+  n=(6   - 1)/5,  e=17
+</pre>
+ </li>
+ <li> to verify my signature:
+<pre>
+   Please feed my dog!
+   1703215098456351993605104919259566435843590978852633
+</pre>
+ </li>
+ <li> For a Rabin signature scheme, I provide the public key 
+<pre>
+       74
+   N=(7  -1)/6,
+</pre>
+  which I know can be factorized into two large primes.
+ </li>
+ <li> Check the following message and signature:
+<pre>
+   Arrive Thursday.
+   189479723122534414019783447271411895509
+</pre>
+ </li> 
+  
+ <li> For an El Gamal signature scheme, I choose the next prime after
+<pre>
+     150
+    2
+</pre>
+  which has a primitive root <tt>a=2</tt>.  My public key is
+<pre>
+    B=1369851585774063312693119161120024351761244461
+</pre>
+ </li>
+ <li> Verify the signature
+<pre>
+    Leave AT ONCE!,
+    1389080525305754392111976715361069425353578198
+    1141326468070168229982976133801721430306004477
+</pre>
+ </li> 
+ <li> For a DSS signature, choose <tt>p</tt> to be the next prime after
+<pre>
+     170
+    2     and q=143441505468590696209
+</pre>
+ </li>
+ <li> Verify that <tt>q</tt> is a divisor of <tt>p-1</tt>.
+  
+  A primitive root of <tt>p</tt> is <tt>a=3</tt>.  
+  Use this primitive root to determine
+<pre>
+         (p-1)/q
+    g = a        mod p
+</pre>
+ </li>
+ <li> The public key value is
+<pre>
+    B=1394256880659595564848116770226045673904445792389839.
+</pre>
+ </li>
+ <li> Now using these values, verify this signature:
+<pre>
+    Now's your chance!
+    64609209464638355801
+    13824808741200493330
+</pre>
+ </li>
+ <li> Now exchange some public keys with a friend, and sign messages to each
+      other. Then verify the signatures you have been sent. Make sure you try
+      each of
+  <ul>
+   <li> RSA signatures,</li>
+   <li> Rabin signatures,</li>
+   <li> El Gamal signatures,</li>
+   <li> DSS.</li>
+  </ul>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{crytoclass7.xhtml}
+<<cryptoclass7.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<center>
+ <h2>RCM3720 Cryptography, Network and Computer Security</h2>
+ <h3>Laboratory Class 7: Knapsack cryptosystems</h3>
+</center>
+<hr/>
+
+You will need to read in the <a href="rcm3720.input">rcm3720.input</a>
+file for various necessary procedures.
+<br/><br/>
+<b>The subset sum problem</b>
+<br/><br/>
+
+We will first experiment with this problem; creating random lists and adding
+up elements from them.
+
+<ul>
+ <li> Start with a list of eight elements:
+  <ul>
+   <li> <span class="cmd">ln:=8</span></li>
+   <li> <span class="cmd">lst:=[random(10^6) for i in 1..ln]</span></li>
+   <li> <span class="cmd">m:=[random(2) for i in 1..ln]</span></li>
+   <li> <span class="cmd">c:=reduce(+,[m.i*lst.i for i in 1..ln])</span></li>
+   <li> <span class="cmd">subsetsum(lst,c)</span></li>
+  </ul>
+ </li>
+ <li> The <tt>subsetsum</tt> command implements a fairly non-efficient 
+      command for attemping to solve the subset sum problem for an 
+      arbitrary list.
+ </li>
+ <li> Try the above commands, but starting with a length <tt>ln</tt> of
+      12. You should find the command is a bit slower this time.  
+      Use this command to time it:
+  <ul>
+   <li> <span class="cmd">)set messages time on</span></li>
+  </ul>
+ </li>
+ <li> Experiment with lengths of 16 and 20.  How long does the
+      <tt>subsetsum</tt> command take for each of these values?
+ </li>
+</ul>
+<br/><br/>
+<b>Superincreasing sequences</b>
+
+<ul>
+ <li> Create a superincreasing sequence with
+  <ul>
+   <li> <span class="cmd">ln:=8</span></li>
+   <li> <span class="cmd">lst:=[random(10^6) for i in 1..ln]</span></li>
+   <li> 
+    <span class="cmd">
+     for i in 2..ln repeat lst.i:=reduce(+,[lst.j for j in 1..i-1])+random(10)+1
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> Now create <tt>m</tt> and <tt>c</tt> as above.  This time, solve the
+      problem with
+  <ul>
+   <li> <span class="cmd">siSolve(lst,c)</span></li>
+  </ul>  
+ </li>
+ <li> Now try with larger lengths: 12, 16 and 20, and time the commands each
+      time.
+ </li>
+ <li> What can you say about solving the subset sum problem for general and
+      superincreasing lists?
+ </li>
+</ul>
+<br/><br/>
+<b>The Merkle-Hellman additive knapsack system</b>
+
+<ul>
+ <li> Create a superincreasing list of length <tt>ln</tt> 10, and call it
+  <tt>a</tt>.  Create a new number <tt>N</tt> greater than the sum of all
+  values of <tt>a</tt>.  Check with
+  <ul>
+   <li> <span class="cmd">N>reduce(+,[a.i for i in 1..ln])</span></li>
+  </ul>
+ </li>
+ <li> Now choose (randomly) a value <b>wN</b> and which is
+      relatively prime to <b>N</b>.  Then construct your public key:
+  <ul>
+   <li> <span class="cmd">b:=map(x +-> x*w rem N,a)</span></li>
+  </ul>  
+ </li>
+ <li> Now for an encryption and decryption. Create a random message <tt>m</tt>
+  as above, and encrypt it to a ciphertext <tt>c</tt> using the public key
+  <tt>b</tt>. 
+ </li>
+ <li> Decrypt it as follows:
+  <ul>
+   <li> <span class="cmd">c1:=inv_mod(w,N)*c rem N</span></li>
+   <li> <span class="cmd">siSolve(a,c1)</span></li>
+  </ul>
+ </li>
+ <li> 
+  Experiment with longer lists and messages: 12, 16, 20 or even larger.
+ </li>
+</ul>
+<br/><br/>
+<b>The Merkle-Hellman multiplicative knapsack system</b>
+
+<ul>
+ <li> Choose <tt>a</tt> to be the first ten primes, 
+      and a large prime <tt>p</tt>:
+  <ul>
+   <li> <span class="cmd">a:=[2,3,5,7,11,13,17,19,23,29]</span></li>
+   <li> <span class="cmd">p:=6469785001</span></li>
+  </ul>
+ </li>
+ <li> Check that <tt>p</tt> is greater than the product of all elements of
+      <tt>a</tt>:
+  <ul>
+   <li> <span class="cmd">p>reduce(*,[a.i for i in 1..10])</span></li>
+  </ul>
+ </li>
+ <li> and that <tt>p-1</tt> has only small factors:
+  <ul>
+   <li> <span class="cmd">factor(p-1)</span></li>
+  </ul>
+ </li>
+ <li> Choose as a primitive root the value 34:
+  <ul>
+   <li> <span class="cmd">r:=34</span></li>
+   <li> <span class="cmd">primitive?(r)$PF(p)</span></li>
+  </ul>  
+ </li>  
+ <li> and compute the public key: 
+  <ul>
+   <li> <span class="cmd">b:=map(x +-> discreteLog(r,x)$PF(p),a)</span></li>
+  </ul>  
+ </li>
+ <li> Create a message of length 10, and encrypt it using the public key
+  <tt>b</tt>:
+  <ul>
+   <li> 
+    <span class="cmd">
+     c:=reduce(+,[m.i*b.i::INT for i in 1..ln])
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> Decryption is now done with:
+  <ul>
+   <li> <span class="cmd">c1:=powmod(r,c,p)</span></li>
+   <li> <span class="cmd">factor(c1)</span></li>
+  </ul>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{crytoclass8.xhtml}
+<<cryptoclass8.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<center>
+ <h2>RCM3720 Cryptography, Network and Computer Security</h2>
+ <h3>Laboratory Class 8: Modes of Encryption</h3>
+</center>
+<hr/>
+
+We will investigate the different modes of encryption using the Hill
+(matrix) cryptosystem.  Start off by entering some matrices:
+  <ul>
+   <li> 
+    <span class="cmd">
+     M:=matrix([[15,9,21],[2,10,7],[16,11,12]])::Matrix ZMOD 26
+    </span>
+   </li>
+   <li> 
+    <span class="cmd">
+     MI:=matrix([[7,17,19],[24,0,23],[12,25,10]])::Matrix ZMOD 26
+    </span>
+   </li>
+  </ul>
+
+Check that you've entered everything correctly with
+  <ul>
+   <li> <span class="cmd">M*MI</span></li>
+  </ul>
+
+Note that because the matrices were defined in terms of numbers mod 26,
+their product is automatically reduced mod 26.
+
+Now enter the following column vector:
+  <ul>
+   <li> 
+    <span class="cmd">
+     zero31:=matrix([[0],[0],[0]])::Matrix ZMOD 26
+    </span>
+   </li>
+  </ul>
+ 
+For this lab, rather than fiddling about with translations between 
+letters and numbers, all our work will be done with numbers alone 
+(in the range 0..25).
+
+<br/><br/>
+<b>ECB</b>
+<br/><br/>
+For electronic codebook mode, encryption is performed by multiplying each
+plaintext block by the matrix, and decryption by multiplying each ciphertext
+block by the inverse matrix:
+<pre>
+                  -1
+    C =M.P ,  P =M  C
+     i    i    i     i
+</pre>
+where all arithmetic is performed mod 26.
+
+<ul>
+ <li> Start by entering a plaintext, which will be a list of column vectors:
+  <ul>
+   <li> 
+    <span class="cmd">
+     P:=[matrix([[3*i],[3*i+1],[3*i+2]]) for i in 0..7]
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> and a list which will receive the ciphertext:
+  <ul>
+   <li> <span class="cmd">C:=[zero31 for i in 1..8]</span></li>
+  </ul>
+ </li>
+ <li> and encrypt it: 
+  <ul>
+   <li> <span class="cmd">for i in 1..8 repeat C.i:=M*P.i</span></li>
+  </ul>
+ </li>
+ <li> Now decrypt (first make an empty list <tt>D</tt>):
+  <ul>
+   <li> <span class="cmd">D:=[zero31 for i in 1..8]</span></li>
+   <li> <span class="cmd">for i in 1..8 repeat D.i:=MI*C.i</span></li>
+  </ul>
+ </li>
+ <li> If all has worked out, the list <tt>D</tt> should be the same 
+      plaintext you obtained earlier.
+ </li>
+ <li> Now change one value in the plaintext:
+  <ul>
+   <li> <span class="cmd">Q:=P</span></li>
+   <li> <span class="cmd">Q.3:=matrix([[6],[19],[8]])</span></li>
+  </ul>
+ </li>
+ <li> Now encrypt the new plaintext <tt>Q</tt> to a ciphertext <tt>E</tt>. How
+  does this ciphertext differ from the ciphertext <tt>C</tt> obtained from
+  <tt>P</tt>?
+ </li>
+ <li> Check that you can decrypt <tt>E</tt> to obtain <tt>Q</tt>.</li>
+</ul>
+<br/><br/>
+<b>CBC</b>
+<br/><br/>
+For cipherblock chaining mode, the encryption formula for the Hill
+cryptosystem is
+<pre>
+   C =M(P +C   )
+    i    i  i-1
+</pre>
+and decryption is
+<pre>
+       -1
+   P =M  C -C
+    i     i  i-1
+</pre>
+
+<ul>
+ <li> To enable us to use these formulas, we shall first add an extra column
+  to the front of <tt>P</tt> and <tt>C</tt>:
+  <ul>
+   <li> <span class="cmd">P:=append([zero31],P)</span></li>
+   <li> <span class="cmd">C:=append([zero31],C)</span></li>
+  </ul>
+ </li>
+ <li> And we need to create a initialization vector:
+  <ul>
+   <li> <span class="cmd">IV:=matrix([[random(26)] for i in 1..3])</span></li>
+  </ul>
+ </li>
+ <li> Now for encryption:
+  <ul>
+   <li> <span class="cmd">C.1:=IV</span></li>
+   <li> 
+    <span class="cmd">
+     for i in 2..9 repeat C.i:=M*(P.i+C.(i-1))
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> Let's try to decrypt the ciphertext, using the CBC formula:
+  <ul>
+   <li> <span class="cmd">D:=[zero31 for i in 1..9]</span></li>
+   <li>
+    <span class="cmd">
+     for i in 2..9 repeat D.i:=MI*(C.i)-C.(i-1)
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> Did it work out?</li>
+  
+ <li> As before, change one value in the plaintext:
+  <ul>
+   <li> <span class="cmd">Q:=P</span></li>
+   <li> <span class="cmd">Q.4:=matrix([[6],[19],[8]])</span></li>
+  </ul>
+ </li>
+ <li> Now encrypt <tt>Q</tt> to <tt>E</tt> following the procedure outlined
+      above.  Compare <tt>E</tt> with <tt>C</tt>---
+      how much difference is there?
+      How does this difference compare with the differences of ciphertexts
+      obtained with ECB?
+ </li>
+ <li> Just to make sure you can do it, decrypt <tt>E</tt> and make sure you
+  end up with a list equal to <tt>Q</tt>.
+ </li>
+</ul>
+<br/><br/>
+<b>OFB</b>
+<br/><br/>
+Output feedback mode works by creating a <i>key stream</i>, and then adding 
+it to the plaintext to obtain the ciphertext.  With the Hill system, and an
+initialization vector <tt>IV</tt>:
+<pre>
+   k =IV,   k =Mk
+    1        i   i-1
+</pre>
+and then
+<pre>
+   c =p +k
+    i  i  i
+</pre>
+
+<ul>
+ <li> First, the key stream:
+  <ul>
+   <li> <span class="cmd">K:=[zero31 for i in 1..9]</span></li>
+   <li> <span class="cmd">K.1:=IV</span></li>
+   <li> <span class="cmd">for i in 2..9 repeat K.i:=M*K.(i-1)</span></li>
+  </ul>
+ </li>
+ <li> and next the encryption:
+  <ul>
+   <li> <span class="cmd">for i in 2..9 repeat C.i:=K.i+P.i</span></li>
+  </ul>
+ </li>
+ <li> What is the formula for decryption?  
+      Apply it to your ciphertext <tt>C</tt>.
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{crytoclass9.xhtml}
+<<cryptoclass9.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<center>
+ <h2>RCM3720 Cryptography, Network and Computer Security</h2>
+ <h3>Laboratory Class 9: Hash Functions</h3>
+</center>
+<hr/>
+<br/><br/>
+<b>A simple hash</b>
+<br/><br/>
+Given two prime numbers <tt>p</tt> and <tt>q</tt>, and their product 
+<tt>N</tt>, we can define a hash of a number <tt>n</tt> to be
+<pre>
+           n
+   hash = g  (mod N)
+</pre>
+
+This is provably collision resistant, because if we want to find two hashes
+which are equal, then we need to find <tt>m</tt> and <tt>n</tt> for which
+<pre>
+    m    n
+   g  = g  (mod N)
+</pre>
+or that
+<pre>
+    m-n
+   g    = 1 (mod N)
+</pre>
+
+By Euler's theorem, we know that
+<pre>
+    &#x3D5;(N)
+   g         = 1 (mod N)
+</pre>
+
+This means that finding a collision requires finding two numbers 
+<tt>m</tt> and <tt>n</tt> for which
+<pre>
+   m = n (mod &#x3D5;(N))
+</pre>
+
+Since computing &#x3D5;(N) requires a knowledge of the factorization of 
+<tt>N</tt>, this will be hard if <tt>p</tt> and <tt>q</tt> are large.
+
+<ul>
+ <li> Enter the following commands:
+  <ul>
+   <li> <span class="cmd">p:=nextPrime(87654321)</span></li>
+   <li> <span class="cmd">q:=nextPrime(98765432)</span></li>
+   <li> <span class="cmd">N:=p*q</span></li>
+   <li> <span class="cmd">g:=17</span></li>
+  </ul>
+ </li>
+ <li> Read in the utility file <a href="rcm3720.input">rcm3720.input</a></li>
+
+ <li> Now experiment with the following hashes:
+  <ul>
+   <li> <span class="cmd">n:=str2num("A cat")</span></li>
+   <li> <span class="cmd">h:=powmod(g,n,N)</span></li>
+   <li> <span class="cmd">n:=str2num("A bat")</span></li>
+   <li> <span class="cmd">h:=powmod(g,n,N)</span></li>
+  </ul>
+ </li>
+   
+ <li> Even though the strings are very similar, 
+      how similar are the hash values?
+ </li>
+ <li> Experiment with hashing some other strings---some short, some long.</li>
+
+ <li> Read in a text file (any text file, of any length) as follows:</li>
+  <ul>
+   <li> 
+    <span class="cmd">
+     f:TextFile:=open("\full\path\to\file","input")
+    </span>
+   </li>
+   <li> <span class="cmd">str:=""</span></li>
+   <li> 
+    <span class="cmd">
+     while not endOfFile?(f) repeat str:=concat(str,readLine(f));
+    </span>
+   </li>
+  </ul>
+  
+ <li> Now the variable <tt>str</tt> will contain the file as one long string.
+      Hash this string, by converting it to a number first.
+ </li> 
+ <li> Try this with a few different text files, 
+      of different lengths---some short, some long.
+ </li>
+</ul>
+
+<br/><br/>
+<b>A simplified version of MASH</b>
+<br/><br/>
+We shall experiment with a simplified version of the MASH hash function:
+
+ <ol>
+  <li> Start with two prime numbers <tt>p</tt> and <tt>q</tt>, 
+      and their product <tt>N</tt>.
+  </li>
+  <li> Turn the data to be hashed into a single integer <tt>n</tt>.</li>
+  
+  <li> Express <tt>n</tt> as ``digits'' in base <tt>N</tt>:</li>
+<pre>
+                    2      3            q
+   n = a + a N + a N  + a N  + ... + a N
+        0   1     2      3            q
+</pre>
+
+  <li> Start with <tt>H</tt> being the largest prime less than <tt>N</tt>.</li>
+
+  <li> For <tt>i</tt> from 0 to <tt>q</tt></li>
+<pre>
+                     2
+      H &#60;-- (H + a_i)  +H (mod N)
+</pre>
+
+  <li> The final value of <tt>H</tt> is the hash.</li>
+ </ol>
+
+<ul>
+ <li> With <tt>p</tt>, <tt>q</tt> and <tt>N</tt> as before, pick a long 
+      string (or the string from a text file) to be hashed, and turn it 
+      into a number <tt>n</tt>.
+ </li>
+ <li> Determine the ``digits'' in base <tt>N</tt>:
+  <ul>
+   <li> 
+    <span class="cmd">
+     a:=wholeRagits(n::RadixExpansion(N))::List ZMOD N
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> Now create the hash:
+  <ul>
+   <li> <span class="cmd">H:=prevPrime(N)</span></li>  
+   <li> <span class="cmd">for i in 1..#a repeat H:=(H+a.i)^2+H</span></li>  
+  </ul>
+ </li> 
+ <li> Note that since the elements of the list <tt>a</tt> are already 
+      defined as being modulo <tt>N</tt>, we don't have to use a mod 
+      function in this last step.
+ </li>  
+ <li> Create the hashes of a few other strings and files.  What happens if you
+      try to hash a really long text file?
+ </li>  
+ <li> Experiment with hashing using some other (large) primes.</li>
+</ul>
+<<page foot>>
+@
+
+\subsection{crytoclass10.xhtml}
+<<cryptoclass10.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<center>
+ <h2>RCM3720 Cryptography, Network and Computer Security</h2>
+ <h3>Laboratory Class 10: The Data Encryption Standard</h3>
+</center>
+<hr/>
+
+The object of this lab will be to build up the necessary functions and
+tools to implement simplified DES (sDES).  All operations will be done on
+binary lists.  Since the definitions of the sDES functions require lists to be
+indexed starting at 0, but in Axiom lists are indexed starting at 1, many of
+the operations will have extra ones added at some stage.
+
+<ul> 
+ <li> Save the file <tt>des.input</tt> to a directory in which you
+      have write access.  Read the file into Axiom, and open up the file
+      with a text editor.  
+ </li>
+
+ <li> Compare the first command <tt>perm(b)</tt> with the initial
+      permutation for sDES defined in page 94 of the notes.  How do the
+      indices in the Axiom command relate to the indices of the
+      permutation in the notes?  
+ </li>
+  
+ <li> Now using the above procedure as a guide, write a procedure called
+      <tt>invperm</tt> to perform the inverse permutation.
+ </li>
+
+ <li> Test this procedure: it should invert the permutation you
+      obtained from the <tt>perm</tt> procedure.  
+ </li>
+  
+<li> The <tt>subkey</tt> procedure creates two lists: one for the
+     first subkey, and one for the second.  Edit the procedure to include
+     the second subkey as given on the bottom of page 95.
+ </li>
+  
+ <li> Write a procedure called <tt>expperm</tt> which implements the
+      expansion permutation on page 96; use the <tt>perm</tt> and
+      <tt>invperm</tt> procedures as guides.
+ </li>
+  
+ <li> Using the <tt>sbox0</tt> procedure as a guide, write a procedure
+      to implement S-box 1.
+ </li>
+  
+ <li> The mixing function shown in figure 8.5 in the notes is
+      implemented as <tt>mix</tt>.  This procedure has been
+      commented.
+ </li>
+  
+ <li> Comment each line of the <tt>feistel</tt> and <tt>sdes</tt>
+      procedures in a similar fashion.
+ </li>
+  
+ <li> Test the <tt>sdes</tt> procedure on the example given in the notes.
+ </li>
+  
+ <li> Modify your procedure to implement sDES decryption, using the
+      scheme given on page 99.
+ </li>
+
+ <li> Test that your decryption procedure works; that it decrypts the
+      ciphertext produced by your encryption procedure to the original
+      plaintext.
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{crytoclass11.xhtml}
+<<cryptoclass11.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<center>
+ <h2>RCM3720 Cryptography, Network and Computer Security</h2>
+ <h3>Laboratory Class 11: Finite Fields</h3>
+</center>
+<hr/>
+
+<ul>
+ <li> Enter the following definition of the finite field 
+<pre>
+           3
+   Z [x]/(x +x+1)
+    2
+</pre>
+  <ul>
+   <li> <span class="cmd">F:=FFP(PF 2,x^3+x+1) </span></li>
+  </ul>
+ </li>
+ <li> To perform field operations, we need to create a generator of the field:
+  a symbol which can be used to generate all elements as polynomials:
+  <ul>
+   <li> <span class="cmd">x:=generator()$F</span>
+    <br/> Now field arithmetic is easy:
+   </li>
+   <li> (x^2+1)(x+1) in the field:
+    <ul>
+     <li> <span class="cmd">(x^2+1)*(x+1)</span> </li>
+    </ul>
+   </li>
+   <li> 1/(x^2+x):
+    <ul>
+     <li> <span class="cmd">1/(x^2+x)</span>
+      <br/>Note that Axiom returns its answer in terms of a dummy variable.
+     </li>
+    </ul>
+   </li>
+   <li> We can also list tables of powers:
+    <ul>
+     <li> 
+      <span class="cmd">
+       for i in 0..7 repeat output (i::String, x^i) 
+      </span>
+     </li>
+    </ul>
+   </li>
+  </ul>
+ </li>
+ <li> Before we enter a new field, we need to clear <tt>x</tt> and its
+  properties:
+  <ul>
+   <li> <span class="cmd">)cl pr x </span></li>
+  </ul>
+  Now for a slightly bigger field: 
+<pre>
+           4  3
+   Z [x]/(x +x +1)
+    2
+</pre>
+  <ul>
+   <li> <span class="cmd">F2:=FFP(PF 2,x^4+x^3+1)</span> </li>
+  </ul>
+  <ul>
+   <li> Create a list of powers of <tt>x</tt>. </li>
+   <li> Evaluate (x^3+x+1)/(x^3+x^2) in this field. </li>
+  </ul>
+ </li>
+ <li> Enter the Rijndael field, 
+<pre>
+         8  4  3
+ Z [x]/(x +x +x +x+1)
+  2
+</pre>
+ and call it <tt>GR</tt>.
+ </li>
+ <li> Determine whether <tt>x</tt> is a primitive element in this field:
+  <ul>
+   <li> <span class="cmd">x:=generator()$GR</span> </li>
+   <li> <span class="cmd">primitive?(x)</span> </li>
+  </ul>
+ </li>
+ <li>
+  Is <tt>x+1</tt> a primitive element?
+ </li>
+ <li> Investigate the workings of MixColumn.  First create the matrix:
+  <ul>
+   <li>
+    <span class="cmd">
+     M:Matrix GR:=matrix([[x,x+1,1,1],[1,x,x+1,1],[1,1,x,x+1],[x+1,1,1,x]])
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li>
+  Instead of multiplying a matrix <tt>C</tt> by <tt>M</tt>, 
+  we shall just look at a single column, created randomly:
+  <ul>
+   <li>
+    <span class="cmd">
+     C:Matrix GR:=matrix([[random()$FR] for j in 1..4]) 
+    </span>
+   </li>
+  </ul>
+ <li>
+ </li>
+  These can be multiplied directly in Axiom:
+  <ul>
+   <li> <span class="cmd">D:=M*C</span> </li>
+  </ul>
+ </li>
+ <li> Remarkably enough, Axiom can operate on matrices over a finite field as
+      easily as it can operate on numerical matrices.  For example, given that
+<pre>
+   D=MC 
+</pre>
+ </li>
+ <li>  it follows that
+<pre>
+      -1
+   C=M  D
+</pre>
+ </li>
+ <li> or that
+<pre>
+    -1
+   M  D-C=0
+</pre>
+ </li>
+ <li> To test this, first create the matrix inverse:
+  <ul>
+   <li> <span class="cmd">MI:=inverse(M)</span> </li>
+  </ul>
+ </li>
+ <li>
+  Now multiply by <tt>D</tt> and subtract <tt>C</tt>.  What does the result
+  tell you about the truth of the final equation?
+ </li>
+ <li> To explore MixColumn a bit more, we shall look at the inverse of
+      <tt>M</tt>.  First, here's a small function which converts from
+      a polynomial to an integer (treating the coefficients of the
+      polynomial as digits of a binary number):
+  <ul>
+   <li>
+    <span class="cmd">
+      poly2int(p)==(tmp:=reverse(coordinates(p)),return 
+          integer wholeRadix(tmp::LIST INT)$RadixExpansion(2))
+    </span>
+   </li>
+  </ul>
+ </li>
+ <li> First check the matrix <tt>M</tt>:
+  <ul>
+   <li> <span class="cmd">map((x +-> poly2int(x)::INT), M)</span></li>
+  </ul>
+ </li>
+ <li>
+  Is this what you should have?
+ </li>
+ <li>
+  Now apply the same command but to <tt>MI</tt> instead of to <tt>M</tt>.
+  What is the result?
+ </li>
+</ul>
+<<page foot>>
+@
+
+%%D
+\subsection{dbopbinary.xhtml}
+<<dbopbinary.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopbinary not implemented
+<<page foot>>
+@
+
+\subsection{dbcharacteristic.xhtml}
+<<dbcharacteristic.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbcharacteristic not implemented
+<<page foot>>
+@
+
+\subsection{dbcomplexcomplex.xhtml}
+<<dbcomplexcomplex.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbcomplexcomplex not implemented
+<<page foot>>
+@
+
+\subsection{dbcomplexconjugate.xhtml}
+<<dbcomplexconjugate.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbcomplexconjugate not implemented
+<<page foot>>
+@
+
+\subsection{dbcomplexfactor.xhtml}
+<<dbcomplexfactor.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbcomplexfactor not implemented
+<<page foot>>
+@
+
+\subsection{dbcomplexdoublefloat.xhtml}
+<<dbcomplexdoublefloat.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbcomplexdoublefloat not implemented
+<<page foot>>
+@
+
+\subsection{dbcomplexfloat.xhtml}
+<<dbcomplexfloat.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbcomplexfloat not implemented
+<<page foot>>
+@
+
+\subsection{dbcompleximag.xhtml}
+<<dbcompleximag.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbcompleximag not implemented
+<<page foot>>
+@
+
+\subsection{dbcomplexnorm.xhtml}
+<<dbcomplexnorm.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbcomplexnorm not implemented
+<<page foot>>
+@
+
+\subsection{dbcomplexreal.xhtml}
+<<dbcomplexreal.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbcomplexreal not implemented
+<<page foot>>
+@
+
+\subsection{dbcomplexinteger.xhtml}
+<<dbcomplexinteger.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbcomplexinteger not implemented
+<<page foot>>
+@
+
+\subsection{dbexpressioninteger.xhtml}
+<<dbexpressioninteger.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbexpressioninteger not implemented
+<<page foot>>
+@
+
+\subsection{dbfractioninteger.xhtml}
+<<dbfractioninteger.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbfractioninteger not implemented
+<<page foot>>
+@
+
+\subsection{dbfractionpolynomialinteger.xhtml}
+<<dbfractionpolynomialinteger.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbfractionpolynomialinteger not implemented
+<<page foot>>
+@
+
+\subsection{dblookup.xhtml}
+<<dblookup.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dblookup not implemented
+<<page foot>>
+@
+
+\subsection{dbopacos.xhtml}
+<<dbopacos.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopacos not implemented
+<<page foot>>
+@
+
+\subsection{dbopacosh.xhtml}
+<<dbopacosh.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopacosh not implemented
+<<page foot>>
+@
+
+\subsection{dbopacot.xhtml}
+<<dbopacot.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopacot not implemented
+<<page foot>>
+@
+
+\subsection{dbopacoth.xhtml}
+<<dbopacoth.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopacoth not implemented
+<<page foot>>
+@
+
+\subsection{dbopacsc.xhtml}
+<<dbopacsc.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopacsc not implemented
+<<page foot>>
+@
+
+\subsection{dbopacsch.xhtml}
+<<dbopacsch.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopacsch not implemented
+<<page foot>>
+@
+
+\subsection{dbopaddmod.xhtml}
+<<dbopaddmod.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopaddmod not implemented
+<<page foot>>
+@
+
+\subsection{dbopairyai.xhtml}
+<<dbopairyai.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopairyai not implemented
+<<page foot>>
+@
+
+\subsection{dbopairybi.xhtml}
+<<dbopairybi.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopairybi not implemented
+<<page foot>>
+@
+
+\subsection{dbopapproximants.xhtml}
+<<dbopapproximants.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopapproximants not implemented
+<<page foot>>
+@
+
+\subsection{dbopasin.xhtml}
+<<dbopasin.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopasin not implemented
+<<page foot>>
+@
+
+\subsection{dbopasinh.xhtml}
+<<dbopasinh.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopasinh not implemented
+<<page foot>>
+@
+
+\subsection{dbopasec.xhtml}
+<<dbopasec.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopasec not implemented
+<<page foot>>
+@
+
+\subsection{dbopasech.xhtml}
+<<dbopasech.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopasech not implemented
+<<page foot>>
+@
+
+\subsection{dbopatan.xhtml}
+<<dbopatan.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopatan not implemented
+<<page foot>>
+@
+
+\subsection{dbopatanh.xhtml}
+<<dbopatanh.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopatanh not implemented
+<<page foot>>
+@
+
+\subsection{dbopbesseli.xhtml}
+<<dbopbesseli.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopbesseli not implemented
+<<page foot>>
+@
+
+\subsection{dbopbesselj.xhtml}
+<<dbopbesselj.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopbesselj not implemented
+<<page foot>>
+@
+
+\subsection{dbopbesselk.xhtml}
+<<dbopbesselk.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopbesselk not implemented
+<<page foot>>
+@
+
+\subsection{dbopbessely.xhtml}
+<<dbopbessely.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopbessely not implemented
+<<page foot>>
+@
+
+\subsection{dbopbeta.xhtml}
+<<dbopbeta.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopbeta not implemented
+<<page foot>>
+@
+
+\subsection{dbopcardinalnumber.xhtml}
+<<dbopcardinalnumber.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcardinalnumber not implemented
+<<page foot>>
+@
+
+\subsection{dbopcoefficient.xhtml}
+<<dbopcoefficient.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcoefficient not implemented
+<<page foot>>
+@
+
+\subsection{dbopcoefficients.xhtml}
+<<dbopcoefficients.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcoefficients not implemented
+<<page foot>>
+@
+
+\subsection{dbopcoerce.xhtml}
+<<dbopcoerce.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcoerce not implemented
+<<page foot>>
+@
+
+\subsection{dbopcolumn.xhtml}
+<<dbopcolumn.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcolumn not implemented
+<<page foot>>
+@
+
+\subsection{dbopcompactfraction.xhtml}
+<<dbopcompactfraction.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcompactfraction not implemented
+<<page foot>>
+@
+
+\subsection{dbopcomplexeigenvectors.xhtml}
+<<dbopcomplexeigenvectors.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcomplexeigenvectors not implemented
+<<page foot>>
+@
+
+\subsection{dbopcomplexelementary.xhtml}
+<<dbopcomplexelementary.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcomplexelementary not implemented
+<<page foot>>
+@
+
+\subsection{dbopcomplexintegrate.xhtml}
+<<dbopcomplexintegrate.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcomplexintegrate not implemented
+<<page foot>>
+@
+
+\subsection{dbopcomplexlimit.xhtml}
+<<dbopcomplexlimit.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcomplexlimit not implemented
+<<page foot>>
+@
+
+\subsection{dbopcomplexsolve.xhtml}
+<<dbopcomplexsolve.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcomplexsolve not implemented
+<<page foot>>
+@
+
+\subsection{dbopcontent.xhtml}
+<<dbopcontent.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcontent not implemented
+<<page foot>>
+@
+
+\subsection{dbopcontinuedfraction.xhtml}
+<<dbopcontinuedfraction.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcontinuedfraction not implemented
+<<page foot>>
+@
+
+\subsection{dbopconvergents.xhtml}
+<<dbopconvergents.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopconvergents not implemented
+<<page foot>>
+@
+
+\subsection{dbopcopy.xhtml}
+<<dbopcopy.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcopy not implemented
+<<page foot>>
+@
+
+\subsection{dbopcos.xhtml}
+<<dbopcos.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopcos not implemented
+<<page foot>>
+@
+
+\subsection{dbopcosh.xhtml}
+<<dbopcosh.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopcosh not implemented
+<<page foot>>
+@
+
+\subsection{dbopcot.xhtml}
+<<dbopcot.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcot not implemented
+<<page foot>>
+@
+
+\subsection{dbopcoth.xhtml}
+<<dbopcoth.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcoth not implemented
+<<page foot>>
+@
+
+\subsection{dbopcount.xhtml}
+<<dbopcount.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcount not implemented
+<<page foot>>
+@
+
+\subsection{dbopcountableq.xhtml}
+<<dbopcountableq.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcountableq not implemented
+<<page foot>>
+@
+
+\subsection{dbopcsc.xhtml}
+<<dbopcsc.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopcsc not implemented
+<<page foot>>
+@
+
+\subsection{dbopcsch.xhtml}
+<<dbopcsch.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopcsch not implemented
+<<page foot>>
+@
+
+\subsection{dbopcycleragits.xhtml}
+<<dbopcycleragits.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopcycleragits not implemented
+<<page foot>>
+@
+
+\subsection{dbopd.xhtml}
+<<dbopd.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopd not implemented
+<<page foot>>
+@
+
+\subsection{dbopdecimal.xhtml}
+<<dbopdecimal.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopdecimal not implemented
+<<page foot>>
+@
+
+\subsection{dbopdefiningpolynomial.xhtml}
+<<dbopdefiningpolynomial.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopdefiningpolynomial not implemented
+<<page foot>>
+@
+
+\subsection{dbopdegree.xhtml}
+<<dbopdegree.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopdegree not implemented
+<<page foot>>
+@
+
+\subsection{dbopdenom.xhtml}
+<<dbopdenom.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopdenom not implemented
+<<page foot>>
+@
+
+\subsection{dbopdeterminant.xhtml}
+<<dbopdeterminant.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopdeterminant not implemented
+<<page foot>>
+@
+
+\subsection{dbopdiagonalmatrix.xhtml}
+<<dbopdiagonalmatrix.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopdiagonalmatrix not implemented
+<<page foot>>
+@
+
+\subsection{dbopdigamma.xhtml}
+<<dbopdigamma.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopdigamma not implemented
+<<page foot>>
+@
+
+\subsection{dbopdigits.xhtml}
+<<dbopdigits.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopdigits not implemented
+<<page foot>>
+@
+
+\subsection{dbopdimension.xhtml}
+<<dbopdimension.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopdimension not implemented
+<<page foot>>
+@
+
+\subsection{dbopdivide.xhtml}
+<<dbopdivide.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopdivide not implemented
+<<page foot>>
+@
+
+\subsection{dbopeigenmatrix.xhtml}
+<<dbopeigenmatrix.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopeigenmatrix not implemented
+<<page foot>>
+@
+
+\subsection{dbopeigenvalues.xhtml}
+<<dbopeigenvalues.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopeigenvalues not implemented
+<<page foot>>
+@
+
+\subsection{dbopeigenvector.xhtml}
+<<dbopeigenvector.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopeigenvector not implemented
+<<page foot>>
+@
+
+\subsection{dbopeigenvectors.xhtml}
+<<dbopeigenvectors.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopeigenvectors not implemented
+<<page foot>>
+@
+
+\subsection{dbopelt.xhtml}
+<<dbopelt.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopelt not implemented
+<<page foot>>
+@
+
+\subsection{dbopeval.xhtml}
+<<dbopeval.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopeval not implemented
+<<page foot>>
+@
+
+\subsection{dbopevenq.xhtml}
+<<dbopevenq.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopevenq not implemented
+<<page foot>>
+@
+
+\subsection{dbopexp.xhtml}
+<<dbopexp.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopexp not implemented
+<<page foot>>
+@
+
+\subsection{dbopfactor.xhtml}
+<<dbopfactor.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopfactor not implemented
+<<page foot>>
+@
+
+\subsection{dbopfactorfraction.xhtml}
+<<dbopfactorfraction.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopfactorfraction not implemented
+<<page foot>>
+@
+
+\subsection{dbopfiniteq.xhtml}
+<<dbopfiniteq.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopfiniteq not implemented
+<<page foot>>
+@
+
+\subsection{dbopfirstdenom.xhtml}
+<<dbopfirstdenom.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopfirstdenom not implemented
+<<page foot>>
+@
+
+\subsection{dbopfirstnumer.xhtml}
+<<dbopfirstnumer.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopfirstnumer not implemented
+<<page foot>>
+@
+
+\subsection{dbopfractragits.xhtml}
+<<dbopfractragits.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopfractragits not implemented
+<<page foot>>
+@
+
+\subsection{dbopgamma.xhtml}
+<<dbopgamma.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopgamma not implemented
+<<page foot>>
+@
+
+\subsection{dbopgcd.xhtml}
+<<dbopgcd.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopgcd not implemented
+<<page foot>>
+@
+
+\subsection{dbophex.xhtml}
+<<dbophex.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbophex not implemented
+<<page foot>>
+@
+
+\subsection{dbophorizconcat.xhtml}
+<<dbophorizconcat.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbophorizconcat not implemented
+<<page foot>>
+@
+
+\subsection{dbophtrigs.xhtml}
+<<dbophtrigs.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbophtrigs not implemented
+<<page foot>>
+@
+
+\subsection{dbophypergeometric0f1.xhtml}
+<<dbophypergeometric0f1.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbophypergeometric0f1 not implemented
+<<page foot>>
+@
+
+\subsection{dbopinteger.xhtml}
+<<dbopinteger.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopinteger not implemented
+<<page foot>>
+@
+
+\subsection{dbopintegrate.xhtml}
+<<dbopintegrate.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopintegrate not implemented
+<<page foot>>
+@
+
+\subsection{dbopinverse.xhtml}
+<<dbopinverse.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopinverse not implemented
+<<page foot>>
+@
+
+\subsection{dbopinvmod.xhtml}
+<<dbopinvmod.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopinvmod not implemented
+<<page foot>>
+@
+
+\subsection{dboplaurent.xhtml}
+<<dboplaurent.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboplaurent not implemented
+<<page foot>>
+@
+
+\subsection{dboplcm.xhtml}
+<<dboplcm.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dboplcm not implemented
+<<page foot>>
+@
+
+\subsection{dbopleadingcoefficient.xhtml}
+<<dbopleadingcoefficient.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopleadingcoefficient not implemented
+<<page foot>>
+@
+
+\subsection{dbopleadingmonomial.xhtml}
+<<dbopleadingmonomial.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopleadingmonomial not implemented
+<<page foot>>
+@
+
+\subsection{dboplength.xhtml}
+<<dboplength.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboplength not implemented
+<<page foot>>
+@
+
+\subsection{dboplimit.xhtml}
+<<dboplimit.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboplimit not implemented
+<<page foot>>
+@
+
+\subsection{dboplog.xhtml}
+<<dboplog.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dboplog not implemented
+<<page foot>>
+@
+
+\subsection{dboploggamma.xhtml}
+<<dboploggamma.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboploggamma not implemented
+<<page foot>>
+@
+
+\subsection{dbopmainvariable.xhtml}
+<<dbopmainvariable.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopmainvariable not implemented
+<<page foot>>
+@
+
+\subsection{dbopmap.xhtml}
+<<dbopmap.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopmap not implemented
+<<page foot>>
+@
+
+\subsection{dbopmapbang.xhtml}
+<<dbopmapbang.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopmapbang not implemented
+<<page foot>>
+@
+
+\subsection{dbopmatrix.xhtml}
+<<dbopmatrix.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopmatrix not implemented
+<<page foot>>
+@
+
+\subsection{dbopmax.xhtml}
+<<dbopmax.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopmax not implemented
+<<page foot>>
+@
+
+\subsection{dbopmemberq.xhtml}
+<<dbopmemberq.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopmemberq not implemented
+<<page foot>>
+@
+
+\subsection{dbopmin.xhtml}
+<<dbopmin.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopmin not implemented
+<<page foot>>
+@
+
+\subsection{dbopminimumdegree.xhtml}
+<<dbopminimumdegree.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopminimumdegree not implemented
+<<page foot>>
+@
+
+\subsection{dbopminus.xhtml}
+<<dbopminus.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopminus not implemented
+<<page foot>>
+@
+
+\subsection{dbopmonicdivide.xhtml}
+<<dbopmonicdivide.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopmonicdivide not implemented
+<<page foot>>
+@
+
+\subsection{dbopmulmod.xhtml}
+<<dbopmulmod.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopmulmod not implemented
+<<page foot>>
+@
+
+\subsection{dbopncols.xhtml}
+<<dbopncols.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopncols not implemented
+<<page foot>>
+@
+
+\subsection{dbopnew.xhtml}
+<<dbopnew.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopnew not implemented
+<<page foot>>
+@
+
+\subsection{dbopnorm.xhtml}
+<<dbopnorm.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopnorm not implemented
+<<page foot>>
+@
+
+\subsection{dbopnrows.xhtml}
+<<dbopnrows.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopnrows not implemented
+<<page foot>>
+@
+
+\subsection{dbopnthfractionalterm.xhtml}
+<<dbopnthfractionalterm.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopnthfractionalterm not implemented
+<<page foot>>
+@
+
+\subsection{dbopnthroot.xhtml}
+<<dbopnthroot.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopnthroot not implemented
+<<page foot>>
+@
+
+\subsection{dbopnumer.xhtml}
+<<dbopnumer.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopnumer not implemented
+<<page foot>>
+@
+
+\subsection{dbopnumeric.xhtml}
+<<dbopnumeric.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopnumeric not implemented
+<<page foot>>
+@
+
+\subsection{dbopoperator.xhtml}
+<<dbopoperator.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopoperator not implemented
+<<page foot>>
+@
+
+\subsection{dboporthonormalbasis.xhtml}
+<<dboporthonormalbasis.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboporthonormalbasis not implemented
+<<page foot>>
+@
+
+\subsection{dboppadicfraction.xhtml}
+<<dboppadicfraction.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboppadicfraction not implemented
+<<page foot>>
+@
+
+\subsection{dbopnullity.xhtml}
+<<dbopnullity.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopnullity not implemented
+<<page foot>>
+@
+
+\subsection{dbopnullspace.xhtml}
+<<dbopnullspace.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopnullspace not implemented
+<<page foot>>
+@
+
+\subsection{dbopnumberoffractionalterms.xhtml}
+<<dbopnumberoffractionalterms.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopnumberoffractionalterms not implemented
+<<page foot>>
+@
+
+\subsection{dboppartialfraction.xhtml}
+<<dboppartialfraction.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboppartialfraction not implemented
+<<page foot>>
+@
+
+\subsection{dboppartialquotients.xhtml}
+<<dboppartialquotients.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboppartialquotients not implemented
+<<page foot>>
+@
+
+\subsection{dbopplus.xhtml}
+<<dbopplus.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopplus not implemented
+<<page foot>>
+@
+
+\subsection{dboppattern.xhtml}
+<<dboppattern.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboppattern not implemented
+<<page foot>>
+@
+
+\subsection{dboppermanent.xhtml}
+<<dboppermanent.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboppermanent not implemented
+<<page foot>>
+@
+
+\subsection{dboppi.xhtml}
+<<dboppi.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboppi not implemented
+<<page foot>>
+@
+
+\subsection{dboppolygamma.xhtml}
+<<dboppolygamma.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboppolygamma not implemented
+<<page foot>>
+@
+
+\subsection{dboppositiveremainder.xhtml}
+<<dboppositiveremainder.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboppositiveremainder not implemented
+<<page foot>>
+@
+
+\subsection{dbopprefixragits.xhtml}
+<<dbopprefixragits.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopprefixragits not implemented
+<<page foot>>
+@
+
+\subsection{dbopprimefactor.xhtml}
+<<dbopprimefactor.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopprimefactor not implemented
+<<page foot>>
+@
+
+\subsection{dboppuiseux.xhtml}
+<<dboppuiseux.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboppuiseux not implemented
+<<page foot>>
+@
+
+\subsection{dbopqelt.xhtml}
+<<dbopqelt.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopqelt not implemented
+<<page foot>>
+@
+
+\subsection{dbopqseteltbang.xhtml}
+<<dbopqseteltbang.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopqseteltbang not implemented
+<<page foot>>
+@
+
+\subsection{dbopquatern.xhtml}
+<<dbopquatern.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopquatern not implemented
+<<page foot>>
+@
+
+\subsection{dbopradicaleigenvectors.xhtml}
+<<dbopradicaleigenvectors.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopradicaleigenvectors not implemented
+<<page foot>>
+@
+
+\subsection{dbopradicalsolve.xhtml}
+<<dbopradicalsolve.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopradicalsolve not implemented
+<<page foot>>
+@
+
+\subsection{dboprank.xhtml}
+<<dboprank.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboprank not implemented
+<<page foot>>
+@
+
+\subsection{dbopratdenom.xhtml}
+<<dbopratdenom.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopratdenom not implemented
+<<page foot>>
+@
+
+\subsection{dboprealeigenvectors.xhtml}
+<<dboprealeigenvectors.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboprealeigenvectors not implemented
+<<page foot>>
+@
+
+\subsection{dboprealelementary.xhtml}
+<<dboprealelementary.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboprealelementary not implemented
+<<page foot>>
+@
+
+\subsection{dbopreduce.xhtml}
+<<dbopreduce.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopreduce not implemented
+<<page foot>>
+@
+
+\subsection{dbopreductum.xhtml}
+<<dbopreductum.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopreductum not implemented
+<<page foot>>
+@
+
+\subsection{dboprem.xhtml}
+<<dboprem.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboprem not implemented
+<<page foot>>
+@
+
+\subsection{dbopquo.xhtml}
+<<dbopquo.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopquo not implemented
+<<page foot>>
+@
+
+\subsection{dbopresetvariableorder.xhtml}
+<<dbopresetvariableorder.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopresetvariableorder not implemented
+<<page foot>>
+@
+
+\subsection{dbopresultant.xhtml}
+<<dbopresultant.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopresultant not implemented
+<<page foot>>
+@
+
+\subsection{dboprootof.xhtml}
+<<dboprootof.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboprootof not implemented
+<<page foot>>
+@
+
+\subsection{dboprootsimp.xhtml}
+<<dboprootsimp.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboprootsimp not implemented
+<<page foot>>
+@
+
+\subsection{dboprootsof.xhtml}
+<<dboprootsof.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboprootsof not implemented
+<<page foot>>
+@
+
+\subsection{dbopseries.xhtml}
+<<dbopseries.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopseries not implemented
+<<page foot>>
+@
+
+\subsection{dboprow.xhtml}
+<<dboprow.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboprow not implemented
+<<page foot>>
+@
+
+\subsection{dboprowechelon.xhtml}
+<<dboprowechelon.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboprowechelon not implemented
+<<page foot>>
+@
+
+\subsection{dbopsetcolumnbang.xhtml}
+<<dbopsetcolumnbang.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsetcolumnbang not implemented
+<<page foot>>
+@
+
+\subsection{dbopseteltbang.xhtml}
+<<dbopseteltbang.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopseteltbang not implemented
+<<page foot>>
+@
+
+\subsection{dbopsetrowbang.xhtml}
+<<dbopsetrowbang.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsetrowbang not implemented
+<<page foot>>
+@
+
+\subsection{dbopsetelt.xhtml}
+<<dbopsetelt.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsetelt not implemented
+<<page foot>>
+@
+
+\subsection{dbopsetsubmatrixbang.xhtml}
+<<dbopsetsubmatrixbang.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsetsubmatrixbang not implemented
+<<page foot>>
+@
+
+\subsection{dbopsimplify.xhtml}
+<<dbopsimplify.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsimplify not implemented
+<<page foot>>
+@
+
+\subsection{dbopseriessolve.xhtml}
+<<dbopseriessolve.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopseriessolve not implemented
+<<page foot>>
+@
+
+\subsection{dbopsin.xhtml}
+<<dbopsin.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsin not implemented
+<<page foot>>
+@
+
+\subsection{dbopsingleintegerand.xhtml}
+<<dbopsingleintegerand.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsingleintegerand not implemented
+<<page foot>>
+@
+
+\subsection{dbopsingleintegernot.xhtml}
+<<dbopsingleintegernot.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsingleintegernot not implemented
+<<page foot>>
+@
+
+\subsection{dbopsingleintegeror.xhtml}
+<<dbopsingleintegeror.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsingleintegeror not implemented
+<<page foot>>
+@
+
+\subsection{dbopsingleintegerxor.xhtml}
+<<dbopsingleintegerxor.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsingleintegerxor not implemented
+<<page foot>>
+@
+
+\subsection{dbopsec.xhtml}
+<<dbopsec.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopsec not implemented
+<<page foot>>
+@
+
+\subsection{dbopsech.xhtml}
+<<dbopsech.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopsech not implemented
+<<page foot>>
+@
+
+\subsection{dbopsetvariableorder.xhtml}
+<<dbopsetvariableorder.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopsetvariableorder not implemented
+<<page foot>>
+@
+
+\subsection{dbopsinh.xhtml}
+<<dbopsinh.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dbopsinh not implemented
+<<page foot>>
+@
+
+\subsection{dbopsolve.xhtml}
+<<dbopsolve.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsolve not implemented
+<<page foot>>
+@
+
+\subsection{dbopsqrt.xhtml}
+<<dbopsqrt.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsqrt not implemented
+<<page foot>>
+@
+
+\subsection{dbopstar.xhtml}
+<<dbopstar.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+       dbopstar not implemented
+<<page foot>>
+@
+
+\subsection{dbopstarstar.xhtml}
+<<dbopstarstar.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopstarstar not implemented
+<<page foot>>
+@
+
+\subsection{dbopsubmatrix.xhtml}
+<<dbopsubmatrix.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsubmatrix not implemented
+<<page foot>>
+@
+
+\subsection{dbopsubmod.xhtml}
+<<dbopsubmod.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopsubmod not implemented
+<<page foot>>
+@
+
+\subsection{dboptan.xhtml}
+<<dboptan.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dboptan not implemented
+<<page foot>>
+@
+
+\subsection{dboptanh.xhtml}
+<<dboptanh.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dboptanh not implemented
+<<page foot>>
+@
+
+\subsection{dboptaylor.xhtml}
+<<dboptaylor.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboptaylor not implemented
+<<page foot>>
+@
+
+\subsection{dboptimes.xhtml}
+<<dboptimes.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     dboptimes not implemented
+<<page foot>>
+@
+
+\subsection{dboptotaldegree.xhtml}
+<<dboptotaldegree.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboptotaldegree not implemented
+<<page foot>>
+@
+
+\subsection{dboptrace.xhtml}
+<<dboptrace.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboptrace not implemented
+<<page foot>>
+@
+
+\subsection{dboptranspose.xhtml}
+<<dboptranspose.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboptranspose not implemented
+<<page foot>>
+@
+
+\subsection{dboptrigs.xhtml}
+<<dboptrigs.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dboptrigs not implemented
+<<page foot>>
+@
+
+\subsection{dbopvariables.xhtml}
+<<dbopvariables.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopvariables not implemented
+<<page foot>>
+@
+
+\subsection{dbopvectorise.xhtml}
+<<dbopvectorise.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopvectorise not implemented
+<<page foot>>
+@
+
+\subsection{dbopvectorspace.xhtml}
+<<dbopvectorspace.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopvectorspace not implemented
+<<page foot>>
+@
+
+\subsection{dbopzeroof.xhtml}
+<<dbopzeroof.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopzeroof not implemented
+<<page foot>>
+@
+
+\subsection{dbopzerosof.xhtml}
+<<dbopzerosof.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopzerosof not implemented
+<<page foot>>
+@
+
+\subsection{dbopvertconcat.xhtml}
+<<dbopvertconcat.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopvertconcat not implemented
+<<page foot>>
+@
+
+\subsection{dbopwholepart.xhtml}
+<<dbopwholepart.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopwholepart not implemented
+<<page foot>>
+@
+
+\subsection{dbpolynomialinteger.xhtml}
+<<dbpolynomialinteger.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbpolynomialinteger not implemented
+<<page foot>>
+@
+
+\subsection{dbpolynomialfractioninteger.xhtml}
+<<dbpolynomialfractioninteger.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbpolynomialfractioninteger not implemented
+<<page foot>>
+@
+
+\subsection{dbopwholeragits.xhtml}
+<<dbopwholeragits.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      dbopwholeragits not implemented
+<<page foot>>
+@
+
+\subsection{definiteintegral.xhtml}
+<<definiteintegral.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    var myform = document.getElementById("form2");
+    var ans='integrate('+myform.expr.value+','+myform.vars.value+'='+
+           myform.lower.value+'..'+myform.upper.value+')';
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+  <form id="form2">
+   Enter the function you want to integrate:<br/>
+   <input type="text" id="expr" tabindex="10" size="50" 
+     value="1/(x^2+6)"/><br/>
+   Enter the variable of integration:<br/>
+   <input type="text" id="vars" tabindex="20" size="5" value="x"/><br/>
+   Enter a lower limit:<br/>
+   <input type="text" id="lower" tabindex="30" value="%minusInfinity"/><br/>
+   Enter an upper limit:<br/>
+   <input type="text" id="upper" tabindex="40" value="%plusInfinity"/><br/>
+  </form>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+
+@
+
+\subsection{differentiate.xhtml}
+<<differentiate.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    var myform = document.getElementById("form2");
+    return('differentiate('+myform.expr.value+',['+
+                            myform.vars.value+'],['+
+                            myform.powers.value+'])');
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+  <form id="form2">
+   Enter the function you want to differentiate:<br/>
+   <input type="text" id="expr" tabindex="10" size="50" value="sin(x*y)"/><br/>
+   List the variables you want to differentiate with respect to:<br/>
+   <input type="text" id="vars" tabindex="20" value="x,y"/><br/>
+   List the number of times you want to differentiate with respect
+   to each variable (leave blank if once for each)<br/>
+   <input type="text" id="powers" tabindex="30" value="1,2"/><br/>
+  </form>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+@
+
+\subsection{draw.xhtml}
+<<draw.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <table>
+   <tr>
+    <td>
+      What would you like to draw?
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <center>
+      <b>Two Dimensional Plots</b>
+     </center>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="/home/silver/draw2donevariable.xhtml">
+      A function of one variable
+     </a>
+    </td>
+    <td> 
+     y = f(x)
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="/home/silver/draw2ddefinedcurve.xhtml">
+      A parametrically defined curve
+     </a>
+    </td>
+    <td>
+     (x(t), y(t))
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="/home/silver/draw2dpolynomialequation.xhtml">
+      A solution to a polynomial equation
+     </a>
+    </td>
+    <td>
+     p(x,y) = 0
+    </td>
+   </tr>
+   <tr>
+    <td>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <center>
+      <b>Three Dimensional Plots</b>
+     </center>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="/home/silver/draw3dtwovariable.xhtml">
+      A function of two variable
+     </a>
+    </td>
+    <td>
+     y = f(x,y)
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="/home/silver/draw3ddefinedtube.xhtml">
+      A parametrically defined tube
+     </a>
+    </td>
+    <td>
+     (x(t), y(t), z(t))
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="/home/silver/draw3ddefinedsurface.xhtml">
+      A parametrically defined surface
+     </a>
+    </td>
+    <td>
+     (x(u,v), y(u,v), z(u,v))
+    </td>
+   </tr>
+   <tr>
+    <td>
+    </td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{draw2donevariable.xhtml}
+<<draw2donevariable.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    myfunc = document.getElementById('function').value;
+    myvar = document.getElementById('var').value;
+    myfrom = document.getElementById('range1').value;
+    myto = document.getElementById('range2').value;
+    mytitle = document.getElementById('title1').value;
+    if (mytitle == "") {
+     ans = 'draw('+myfunc+','+myvar+'='+myfrom+'..'+myto+')';
+    } else {
+     ans = 
+      'draw('+myfunc+','+myvar+'='+myfrom+'..'+myto+',title=="'+mytitle+'")';
+    }
+    alert(ans);
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+ <center>
+  Drawing y=f(x)<br/>
+  where y is the dependent variable and<br/>
+  where x is the independent variable
+ </center>
+  <table>
+   <tr>
+    <td>
+      What function f would you like to draw?
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <input type="text" id="function" size="80" tabindex="10"
+       value="x*cos(x)"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter independent variable and range:<br/>
+     Variable:
+     <input type="text" id="var" size="10" tabindex="30" value="x"/>
+     ranges from:
+     <input type="text" id="range1" size="10" tabindex="40" value="0"/>
+     to:
+     <input type="text" id="range2" size="10" tabindex="45" value="30"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Optionally enter a title for your curve:
+     <input type="text" id="title1" size="20" tabindex="50"
+       value="y=x*cos(x)"/>
+    </td>
+   </tr>
+  </table>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+@
+
+\subsection{draw2ddefinedcurve.xhtml}
+<<draw2ddefinedcurve.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    myfunc1 = document.getElementById('function1').value;
+    myfunc2 = document.getElementById('function2').value;
+    myvar = document.getElementById('var').value;
+    myfrom = document.getElementById('range1').value;
+    myto = document.getElementById('range2').value;
+    mytitle = document.getElementById('title1').value;
+    if (mytitle == "") {
+     ans=
+      'draw(curve('+myfunc1+','+myfunc2+'),'+myvar+'='+myfrom+'..'+myto+')';
+    } else {
+     ans = 
+      'draw(curve('+myfunc1+','+myfunc2+'),'+myvar+'='+myfrom+'..'+myto+
+            ',title=="'+mytitle+'")';
+    }
+    alert(ans);
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+ <center>
+  Drawing a parametrically defined curve<br/>
+  (f1(t),f2(t))<br/>
+  in terms of two functions f1 and f2<br/>
+  and an independent variable t
+ </center>
+  <table>
+   <tr>
+    <td>
+     Enter the two functions:<br/>
+     Function 1:<br/>
+     <input type="text" id="function1" size="80" tabindex="10"
+       value="-9*sin(4*t/5)"/><br/>
+     Function 2:<br/>
+     <input type="text" id="function2" size="80" tabindex="20"
+       value="8*sin(t)"/><br/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+    Enter the independent variable and range:<br/>
+    Variable: 
+     <input type="text" id="var" size="10" tabindex="30" value="t"/>
+     ranges from:
+     <input type="text" id="range1" size="10" tabindex="40" value="-5*%pi"/>
+     to:
+     <input type="text" id="range2" size="10" tabindex="45" value="5*%pi"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Optionally enter a title for your curve:
+     <input type="text" id="title1" size="20" tabindex="50"
+       value="Lissajous"/>
+    </td>
+   </tr>
+  </table>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+@
+
+\subsection{draw2dpolynomialequation.xhtml}
+<<draw2dpolynomialequation.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    myfunc = document.getElementById('function1').value;
+    myvar1 = document.getElementById('var1').value;
+    myfrom1 = document.getElementById('range11').value;
+    myto1 = document.getElementById('range21').value;
+    myvar2 = document.getElementById('var2').value;
+    myfrom2 = document.getElementById('range12').value;
+    myto2 = document.getElementById('range22').value;
+    mytitle = document.getElementById('title1').value;
+    if (mytitle == "") {
+     ans=
+      'draw('+myfunc+'=0,'+myvar1+','+myvar2+',range==['+
+            myfrom1+'..'+myto1+','+myfrom2+'..'+myto2+'])';
+    } else {
+     ans=
+      'draw('+myfunc+'=0,'+myvar1+','+myvar2+',range==['+
+         myfrom1+'..'+myto1+','+myfrom2+'..'+myto2+'],title=="'+mytitle+'")';
+    }
+    alert(ans);
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+ <center>
+  Plotting the solution to p(x,y)=0, where<br/>
+  p is a polynomial in two variables x and y
+ </center>
+  <table>
+   <tr>
+    <td>
+     Enter the polynomial p:<br/>
+     <input type="text" id="function1" size="80" tabindex="10"
+       value="y^2+7*x*y-(x^3+16*x)"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+    Enter the variables:<br/>
+    Variable 1: 
+     <input type="text" id="var1" size="10" tabindex="30" value="x"/>
+     ranges from:
+     <input type="text" id="range11" size="10" tabindex="40" value="-15"/>
+     to:
+     <input type="text" id="range21" size="10" tabindex="45" value="10"/><br/>
+    Variable 2: 
+     <input type="text" id="var2" size="10" tabindex="46" value="y"/>
+     ranges from:
+     <input type="text" id="range12" size="10" tabindex="47" value="-10"/>
+     to:
+     <input type="text" id="range22" size="10" tabindex="48" value="50"/><br/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Optionally enter a title for your curve:
+     <input type="text" id="title1" size="20" tabindex="50"/>
+    </td>
+   </tr>
+  </table>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+@
+
+\subsection{draw3dtwovariable.xhtml}
+<<draw3dtwovariable.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    myfunc = document.getElementById('function1').value;
+    myvar1 = document.getElementById('var1').value;
+    myfrom1 = document.getElementById('range11').value;
+    myto1 = document.getElementById('range21').value;
+    myvar2 = document.getElementById('var2').value;
+    myfrom2 = document.getElementById('range12').value;
+    myto2 = document.getElementById('range22').value;
+    mytitle = document.getElementById('title1').value;
+    if (mytitle == "") {
+     ans=
+      'draw('+myfunc+','+myvar1+'='+myfrom1+'..'+myto1+','+
+                         myvar2+'='+myfrom2+'..'+myto2+')';
+    } else {
+     ans=
+      'draw('+myfunc+','+myvar1+'='+myfrom1+'..'+myto1+','+
+                         myvar2+'='+myfrom2+'..'+myto2+
+                         ',title=="'+mytitle+'")';
+    }
+    alert(ans);
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+ <center>
+  Drawing z=f(x,y)<br/>
+  where z is the dependent variable and<br/>
+  where x, y are the independent variables
+ </center>
+  <table>
+   <tr>
+    <td>
+     What function f which you like to draw?<br/>
+     <input type="text" id="function1" size="80" tabindex="10"
+       value="exp(cos(x-y)-sin(x*y))-2"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+    Enter the independent variables and ranges:<br/>
+    Variable 1: 
+     <input type="text" id="var1" size="10" tabindex="30" value="x"/>
+     ranges from:
+     <input type="text" id="range11" size="10" tabindex="40" value="-5"/>
+     to:
+     <input type="text" id="range21" size="10" tabindex="45" value="5"/><br/>
+    Variable 2: 
+     <input type="text" id="var2" size="10" tabindex="46" value="y"/>
+     ranges from:
+     <input type="text" id="range12" size="10" tabindex="47" value="-5"/>
+     to:
+     <input type="text" id="range22" size="10" tabindex="48" value="5"/><br/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Optionally enter a title for your curve:
+     <input type="text" id="title1" size="20" tabindex="50"/>
+    </td>
+   </tr>
+  </table>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+@
+
+\subsection{draw3ddefinedtube.xhtml}
+<<draw3ddefinedtube.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    myfunc1 = document.getElementById('function1').value;
+    myfunc2 = document.getElementById('function2').value;
+    myfunc3 = document.getElementById('function3').value;
+    myvar1 = document.getElementById('var1').value;
+    myfrom1 = document.getElementById('range1').value;
+    myto1 = document.getElementById('range2').value;
+    mytitle = document.getElementById('title1').value;
+    if (mytitle == "") {
+     ans=
+      'draw(curve('+myfunc1+','+myfunc2+','+myfunc3+'),'+myvar1+'='+
+        myfrom1+'..'+myto1+',tubeRadius==.25,tubePoints==16)';
+    } else {
+     ans=
+      'draw(curve('+myfunc1+','+myfunc2+','+myfunc3+'),'+myvar1+'='+
+        myfrom1+'..'+myto1+',tubeRadius==.25,tubePoints==16,title=="'+
+        mytitle+'")';
+    }
+    alert(ans);
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+ <center>
+  Drawing a parmetrically defined curve: (f1(t), f2(t), f3(t))<br/>
+  in terms of three functions f1, f2, and f3<br/>
+  and an independent variable t
+ </center>
+  <table>
+   <tr>
+    <td>
+     Enter the three functions of the independent variable:<br/>
+     Function f1: 
+     <input type="text" id="function1" size="70" tabindex="10"
+       value="1.3*cos(2*t)*cos(4*t)+sin(4*t)*cos(t)"/><br/>
+     Function f2: 
+     <input type="text" id="function2" size="70" tabindex="20"
+       value="1.3*sin(2*t)*cos(4*t)-sin(4*t)*sin(t)"/><br/>
+     Function f3: 
+     <input type="text" id="function3" size="70" tabindex="30"
+       value="2.5*cos(4*t)"/><br/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+    Enter the independent variable and range:<br/>
+    Variable: 
+     <input type="text" id="var1" size="10" tabindex="40" value="t"/>
+     ranges from:
+     <input type="text" id="range1" size="10" tabindex="50" value="0"/>
+     to:
+     <input type="text" id="range2" size="10" tabindex="60" value="4*%pi"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Optionally enter a title for your surface:
+     <input type="text" id="title1" size="20" tabindex="70" value="knot"/>
+    </td>
+   </tr>
+  </table>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+@
+
+\subsection{draw3ddefinedsurface.xhtml}
+<<draw3ddefinedsurface.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    myfunc1 = document.getElementById('function1').value;
+    myfunc2 = document.getElementById('function2').value;
+    myfunc3 = document.getElementById('function3').value;
+    myvar1 = document.getElementById('var1').value;
+    myfrom1 = document.getElementById('range1').value;
+    myto1 = document.getElementById('range2').value;
+    myvar2 = document.getElementById('var11').value;
+    myfrom2 = document.getElementById('range11').value;
+    myto2 = document.getElementById('range21').value;
+    mytitle = document.getElementById('title1').value;
+    if (mytitle == "") {
+     ans=
+      'draw(surface('+myfunc1+','+myfunc2+','+myfunc3+'),'+
+        myvar1+'='+myfrom1+'..'+myto1+','+
+        myvar2+'='+myfrom2+'..'+myto2+')';
+    } else {
+     ans=
+      'draw(surface('+myfunc1+','+myfunc2+','+myfunc3+'),'+
+        myvar1+'='+myfrom1+'..'+myto1+','+
+        myvar2+'='+myfrom2+'..'+myto2+',title=="'+mytitle+'")';
+    }
+    alert(ans);
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+ <center>
+  Drawing a parametrically defined surface<br/>
+  (f1(u,v), f2(u,v), f3(u,v))<br/>
+  in terms of three functions f1, f2, and f3<br/>
+  and two independent variables u and v
+ </center>
+  <table>
+   <tr>
+    <td>
+     Enter the three functions of the independent variable:<br/>
+     Function f1: 
+     <input type="text" id="function1" size="70" tabindex="10"
+       value="u*sin(v)"/><br/>
+     Function f2: 
+     <input type="text" id="function2" size="70" tabindex="20"
+       value="v*cos(u)"/><br/>
+     Function f3: 
+     <input type="text" id="function3" size="70" tabindex="30"
+       value="u*cos(v)"/><br/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+    Enter the independent variables and range:<br/>
+    Variable 1: 
+     <input type="text" id="var1" size="10" tabindex="40" value="u"/>
+     ranges from:
+     <input type="text" id="range1" size="10" tabindex="50" value="-%pi"/>
+     to:
+     <input type="text" id="range2" size="10" tabindex="60" value="%pi"/>
+    <br/>
+    Variable 2: 
+     <input type="text" id="var11" size="10" tabindex="70" value="v"/>
+     ranges from:
+     <input type="text" id="range11" size="10" tabindex="80" value="-%pi/2"/>
+     to:
+     <input type="text" id="range21" size="10" tabindex="90" value="%pi/2"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Optionally enter a title for your surface:
+     <input type="text" id="title1" size="20" tabindex="100"/>
+    </td>
+   </tr>
+  </table>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+@
+
+%%E
+\subsection{equdifferential.xhtml}
+<<equdifferential.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Solution of Differential Equations</div>
+  <hr/>
+In this section we discuss Axiom's facilities for solving differential 
+equations in closed-form and in series.
+
+Axiom provides facilities for closed-form solution of single differential
+equations of the following kinds:
+<ul>
+ <li>linear ordinary differential equations
+ </li>
+ <li>non-linear first order ordinary differential equations when integrating
+     factors can be found just by integration
+ </li>
+</ul>
+
+For a discussion of the solution of systems of linear and polynomial 
+equations, see <a href="axbook/section-8.5.xhtml">Solution of Linear
+and Polynomial Equations</a>.
+<ul>
+ <li>
+  <a href="equdifferentiallinear.xhtml">
+   Closed-Form Solutions of Linear Differential Equations
+  </a>
+ </li>
+ <li>
+  <a href="equdifferentialnonlinear.xhtml">
+   Closed-Form Solutions of Non-Linear Differential Equations
+  </a>
+ </li>
+ <li>
+  <a href="equdifferentialpowerseries.xhtml">
+   Power Series Solutions of Differential Equations
+  </a>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{equdifferentiallinear.xhtml}
+<<equdifferentiallinear.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">
+   Closed-Form Solutions of Linear Differential Equations
+  </div>
+  <hr/>
+A differential equation is an equation involving an unknown function and
+one or more of its derivatives. The equation is called ordinary if 
+derivatives with respect to only one dependent variable appear in the
+equation (it is called partial otherwise). The package
+<a href="db.xhtml?ElementaryFunctionODESolver">ElementaryFunctionODESolver</a>
+provides the top-level operation
+<a href="dbopsolve.xhtml">solve</a> for finding closed-form solutions of
+ordinary differential equations.
+
+To solve a differential equation, you must first create an operator for the
+unknown function. We let y be the unknown function in terms of x.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="y:=operator 'y" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+You then type the equation using <a href="dbopd.xhtml">D</a> to create the
+derivatives of the unknown function y(x) where x is any symbol you choose
+(the so-called dependent variable). This is how you enter the equation
+<pre>
+    y'' + y' + y = 0
+</pre>
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="deq:=D(y x,x,2)+D(y x,x)+y x=0" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+The simplest way to invoke the <a href="dbopsolve.xhtml">solve</a> command
+is with three arguments, 
+<ul>
+ <li>the differential equation</li>
+ <li>the operator representing the unknown function</li>
+ <li>the dependent variable</li>
+</ul>
+So, to solve the above equation, we enter this.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="solve(deq,y,x)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+Since linear ordinary differential equations have infinitely many solutions,
+<a href="dbopsolve.xhtml">solve</a> returns a particular solution f_p and
+a basis f1,..fn for the solutions of the corresponding homogeneous equation.
+Any expression of the form fp+c1 f1+...+cn fn where the ci do not involve the
+dependent variable is also a solution. This is similar to what you get when
+you solve systems of linear algebraic equations.
+
+A way to select a unique solution is to specify initial conditions: choose a
+value a for the dependent variable and specify the values of the unknown
+function and its derivatives at a. If the number of initial conditions is
+equal to the order of the equation, then the solution is unique (if it exists
+in closed form) and <a href="dbopsolve.xhtml">solve</a> tries to find it. To
+specify initial conditions to <a href="dbopsolve.xhtml">solve</a>, use an
+<a href="db.xhtml?Equation">Equation</a> of the form x=a for the third
+parameter instead of the dependent variable, and add a fourth parameter
+consisting of the list of values y(a), y'(a), ...
+
+To find the solution of y''+y=0 satisfying y(0)=y'(0)=1, do this.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p4']);"
+    value="deq:=D(y x,x,2)+y x" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+You can omit the "=0" when you enter the equation to be solved.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p4','p5']);"
+    value="solve(deq,y,x=0,[1,1])" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Axiom is not limited to linear differential equations with constant
+coefficients. It can also find solutions when the coefficients are
+rational or algebraic functions of the dependent variable. Furthermore,
+Axiom is not limited by the order of the equation. Axiom can solve the
+following thrid order equations with polynomial coefficients.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p6']);"
+    value="deq:=x^3*D(y x,x,3)+x^2*D(y x,x,2)-2*x*D(y x,x)+2*yx=2*x^4" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p1','p6','p7']);"
+    value="solve(deq,y,x)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+On the other hand, and in contrast with the operation
+<a href="dbopintegrate.xhtml">integrate</a> it can happen that Axiom finds
+no solution and that some closed-form solution still exists. While it is
+mathematically complicated to describe exactly when the solutions are
+guaranteed to be found, the following statements are correct and form
+good guidelines for linear ordinary differential equations.
+<ul>
+ <li>If the coefficients are constants, Axiom finds a complete basis of
+     solutions (i.e. all solutions).
+ </li>
+ <li>If the coefficients are rational functions in the dependent variable,
+     Axiom ast least finds all solutions that do not involve algebraic
+     functions.
+ </li>
+</ul>
+Note that this last statement does not mean that Axiom does not find the
+solutions that are algebraic functions. It means that it is not guaranteed
+that the algebraic function solutions will be found. This is an example
+where all the algebraic solutions are found.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p1','p8']);"
+    value="deq:=(x^2+1)*D(y x,x,2)+3*x*D(y x,x)+y x=0" />
+  <div id="ansp8"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p1','p8','p9']);"
+    value="solve(deq,y,x)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+
+<<page foot>>
+@
+
+\subsection{equdifferentialnonlinear.xhtml}
+<<equdifferentialnonlinear.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">
+   Closed-Form Solutions of Non-Linear Differential Equations
+  </div>
+  <hr/>
+This is an example that shows how to solve a non-linear first order 
+ordinary differential equation manually when an integrating factor can
+be found just by integration. At the end, we show you how to solve it
+directly.
+
+Let's solve the differential equation
+<pre>
+  y' = y/(x + y log y)
+</pre>
+Using the notation
+<pre>
+  m(x,y)+n(x,y)y' = 0
+</pre>
+we have m=-y and n=x+y*log y
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="m:=-y" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="n:=x+y*log y" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+We first check for exactness, that is, does dm/dy=dn/dx?
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="D(m,y)-D(n,x)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+This is not zero, so the equation is not exact. Therefore we must look
+for an integrating factor, that is, a function mu(x,y) such that 
+d(mu m)/dy=d(mu n)/dx. Normally, we first search for mu(x,y) depending only
+on x or only on y. Let's search for such a mu(x) first.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="mu:=operator 'mu" />
+  <div id="ansp4"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p2','p4','p5']);"
+    value="a:=D(mu(x)*m,y)-D(mu(x)*n,x)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+If the above is zero for a function mu that does not depend on y, then
+mu(x) is an integrating factor.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p2','p4','p5','p6']);"
+    value="solve(a=0,mu,x)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+The solution depends on y, so there is no integrating factor that depends
+on x only. Let's look for on that depends on y only.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p1','p2','p4','p7']);"
+    value="b:=D(mu(y)*m,y)-D(mu(y)*n,x)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p1','p2','p4','p7','p8']);"
+    value="sb:=solve(b=0,mu,y)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+We've found one. The above mu(y) is an integrating factor. We must multiply
+our initial equation (that is, m and n) by the integrating factor.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p1','p2','p4','p7','p8','p9']);"
+    value="intFactor:=sb.basis.1" />
+  <div id="ansp9"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p1','p2','p4','p7','p8','p9','p10']);"
+    value="m:=intFactor*m" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p1','p2','p4','p7','p8','p9','p11']);"
+    value="n:=intFactor*n" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+Let's check for exactness.
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p1','p2','p4','p7','p8','p9','p10','p11','p12']);"
+    value="D(m,y)-D(n,x)" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+We must solve the exact equation, that is, find a function s(x,y) such that
+ds/dx=m and ds/dy=n. We start by writing 
+<pre>
+  s(x,y) = h(y) + integrate(m,x)
+</pre>
+where h(y) is an unknown function of y. This guarantees that ds/dx=m.
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="makeRequest('p13');"
+    value="h:=operator 'h" />
+  <div id="ansp13"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p14" class="subbut" 
+    onclick="handleFree(['p1','p2','p4','p7','p8','p9','p10','p13','p14']);"
+    value="sol:=h y+integrate(m,x)" />
+  <div id="ansp14"><div></div></div>
+ </li>
+</ul>
+All we want is to find h(y) such that ds/dy=n.
+<ul>
+ <li>
+  <input type="submit" id="p15" class="subbut" 
+    onclick=
+     "handleFree(['p1','p2','p4','p7','p8','p9','p10','p13','p14','p15']);"
+    value="dsol:=D(sol,y)" />
+  <div id="ansp15"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p16" class="subbut" 
+    onclick=
+   "handleFree(['p1','p2','p4','p7','p8','p9','p10','p13','p14','p15','p16']);"
+    value="nsol:=solve(dsol=n,h,y)" />
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+The above particular solution is the h(y) we want, so we just replace h(y)
+by it in the implicit solution.
+<ul>
+ <li>
+  <input type="submit" id="p17" class="subbut" 
+    onclick=
+"handleFree(['p1','p2','p4','p7','p8','p9','p10','p13','p14','p15','p16','p17']);"
+    value="eval(sol,h y=nsol.particular)" />
+  <div id="ansp17"><div></div></div>
+ </li>
+</ul>
+A first integral of the initial equation is obtained by setting this result
+equal to an arbitrary constant.
+
+Now that we've seen how to solve the equation "by hand" we show you how to 
+do it with the <a href="dbopsolve.xhtml">solve</a> operation. First define
+y to be an operator.
+<ul>
+ <li>
+  <input type="submit" id="p18" class="subbut" 
+    onclick="makeRequest('p18');"
+    value="y:=operator 'y" />
+  <div id="ansp18"><div></div></div>
+ </li>
+</ul>
+Next we create the differential equation.
+<ul>
+ <li>
+  <input type="submit" id="p19" class="subbut" 
+    onclick="handleFree(['p18','p19']);"
+    value="deq:=D(y x,x)=y(x)/(x+y(x)*log y x)" />
+  <div id="ansp19"><div></div></div>
+ </li>
+</ul>
+Finally, we solve it.
+<ul>
+ <li>
+  <input type="submit" id="p20" class="subbut" 
+    onclick="handleFree(['p18','p19','p20']);"
+    value="solve(deq,y,x)" />
+  <div id="ansp20"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{equdifferentialpowerseries.xhtml}
+<<equdifferentialpowerseries.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">
+   Power Series Solutions of Differential Equations
+  </div>
+  <hr/>
+The command to solve differential equations in power series around a
+particular initial point with specific initial conditions is called
+<a href="dbopseriessolve.xhtml">seriesSolve</a>. It can take a variety of
+parameters, so we illustrate its use with some examples.
+
+Since the coefficients of some solutions are quite large, we reset the
+default to compute only seven terms.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="noresult" 
+    onclick="makeRequest('p1');"
+    value=")set streams calculate 7" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+You can solve a single nonlinear equation of any order. For example, we 
+solve
+<pre>
+  y''' = sin(y'') * exp(y) + cos(x)
+</pre>
+subject to y(0)=1, y'(0)=0, y''(0)=0
+
+We first tell Axiom that the symbol 'y denotes a new operator.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="y:=operator 'y" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Enter the differential equation using y like any system function.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="eq:=D(y(x),x,3)-sin(D(y(x),x,2))*exp(y(x))=cos(x)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+Solve it around x=0 with the initial conditions y(0)=1, y'(0)=y''(0)=0.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4']);"
+    value="seriesSolve(eq,y,x=0,[1,0,0])" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+You can also solve a system of nonlinear first order equations. For 
+example, we solve a system that has tan(t) and sec(t) as solutions.
+
+We tell Axiom that x is also an operator.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="x:=operator 'x" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Enter the two equations forming our system.
+<ul>
+ <li> <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p5','p6']);"
+    value="eq1:=D(x(t),t)=1+x(t)^2" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p2','p5','p7']);"
+    value="eq2:=D(y(t),t)=x(t)*y(t)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Solve the system around t=0 with the initial conditions x(0)=0 and y(0)=1.
+Notice that since we give the unknowns in the order [x,y], the answer is a
+list of two series in the order [series for x(t), series for y(t)].
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p6','p7','p8']);"
+    value="seriesSolve([eq2,eq1],[x,y],t=0,[y(0)=1,x(0)=0])" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+The order in which we give the equations and the initial conditions has no
+effect on the order of the solution.
+<<page foot>>
+@
+
+\subsection{equationpage.xhtml}
+<<equationpage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+Axiom lets you solve equations of various types:
+  <table>
+   <tr>
+    <td>
+     <a href="equsystemlinear.xhtml">
+      Solution of Systems of Linear Equations
+     </a>
+    </td>
+    <td>
+     Solve systems of linear equations
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="polyroots3.xhtml">
+      Solution of a Single Polynomial Equation
+     </a>
+    </td>
+    <td>
+     Find roots of polynomials
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="polyroots4.xhtml">
+      Solution of a System of Polynomial Equations
+     </a>
+    </td>
+    <td>
+     Solve systems of polynomial equations
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="equdifferential.xhtml">
+      Solution of Differential Equations
+     </a>
+    </td>
+    <td>
+     Closed form and series solutions of differential equations
+    </td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{equsystemlinear.xhtml}
+<<equsystemlinear.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Solution of Systems of Linear Equations</div>
+  <hr/>
+You can use the operation <a href="dbopsolve.xhtml">solve</a> to solve
+systems of linear equations.
+
+The operation <a href="dbopsolve.xhtml">solve</a> takes two arguments, the
+list of equations and the list of the unknowns to be solved for. A system
+of linear equations need not have a unique solution.
+
+To solve the linear system:
+<pre>
+        x + y + x = 8
+    3*x - 2*y + z = 0
+    x + 2*y + 2*z = 17
+</pre>
+evaluate this expression.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="solve([x+y+x=8,3*x-2*y+z=0,x+2*y+2*z=17],[x,y,z])" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Parameters are given as new variables starting with a percent sign and
+"%" and the variables are expressed in terms of the parameters. If the system
+has no solutions then the empty list is returned.
+
+When you solve the linear system
+<pre>
+      x + 2*y + 3*z = 2
+    2*x + 3*y + 4*z = 2
+    3*x + 4*y + 5*z = 2
+</pre>
+with this expression you get a solution involving a parameter.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="solve([x+2*y+3*z=2,2*x+3*y+4*z=2,3*x+4*y+5*z=2],[x,y,z])" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+The system can also be presented as a matrix and a vector. The matrix 
+contains the coefficients of the linear equations and the vector contains
+the numbers appearing on the right-hand sides of the equations. You may 
+input the matrix as a list of rows and the vector as a list of its elements.
+
+To solve the system:
+<pre>
+       x + y + z = 8
+   2*x - 2*y + z = 0
+   x + 2*y + 2*z = 17
+</pre>
+in matrix form you would evaluate this expression.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="solve([[1,1,1],[3,-2,1],[1,2,2]],[8,0,17])" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+The solutions are presented as a Record with two components: the component
+particular contains a particular solution of the given system or the item
+"failed" if there are no solutions, the component basis contains a list of
+vectors that are a basis for the space of solutions of the corresponding
+homogeneous system. If the system of linear equations does not have a unique
+solution, then the basis component contains non-trivial vectors.
+
+This happens when you solve the linear system
+<pre>
+    x + 2*y + 3*z = 2
+  2*x + 3*y + 4*z = 2
+  3*x + 4*y + 5*z = 2
+</pre>
+with this command.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="solve([[1,2,3],[2,3,4],[3,4,5]],[2,2,2])" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+All solutions of this system are obtained by adding the particular solution
+with a linear combination of the basis vectors.
+
+When no solution exists then "failed" is returned as the particular 
+component, as follows:
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="solve([[1,2,3],[2,3,4],[3,4,5]],[2,3,2])" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+When you want to solve a system of homogeneous equations (that is, a system
+where the numbers on the right-hand sides of the equations are all zero)
+in the matrix form you can omit the second argument and use the 
+<a href="dbopnullspace.xhtml">nullSpace</a> operation.
+
+This computes the solutions of the following system of equations:
+<pre>
+    x + 2*y + 3*z = 0
+  2*x + 3*y + 4*z = 0
+  3*x + 4*y + 5*z = 0
+</pre>
+The result is given as a list of vectors and these vectors form a basis for
+the solution space.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="nullSpace([[1,2,3],[2,3,4],[3,4,5]])" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+
+<<page foot>>
+@
+
+\subsection{examplesexposedpage.xhtml}
+<<examplesexposedpage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      examplesexposedpage not implemented
+<<page foot>>
+@
+
+
+%%F
+\subsection{factored.xhtml}
+<<factored.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+factored not implemented
+<<page foot>>
+@
+
+\subsection{foundationlibrarydocpage.xhtml}
+<<foundationlibrarydocpage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      foundationlibrarydocpage not implemented
+<<page foot>>
+@
+
+\subsection{funalgebraicfunctions.xhtml}
+<<funalgebraicfunctions.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Algebraic Functions</div>
+  <hr/>
+Algebraic functions are functions defined by algebraic equations. There are
+two ways of constructing them, either by using rational powers or implicitly.
+For rational powers, use <a href="dbopstarstar.xhtml">**</a> or the system
+functions <a href="dbopsqrt.xhtml">sqrt</a> and 
+<a href="dbopnthroot.xhtml">nthRoot</a> for square and nth roots.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="f:=sqrt(1+x^(1/3))" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+To define an algebraic function implicitly use 
+<a href="dboprootof.xhtml">rootOf</a>. The following line defines a function
+y of x satisfying the equation 
+<pre>
+  y^3 = x*y-y^2-x^3+1
+</pre>
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="y:=rootOf(y^3+y^2-x*y+x^3-1,y)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+You can manipulate, differentiate or integrate an implicitly defined
+algebraic function like any other Axiom function.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p2','p3']);"
+    value="differentiate(y,x)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+Higher powers of algebraic functions are automatically reduced during
+calculations.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p2','p4']);"
+    value="(y+1)^3" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+But denominators are not automatically rationalized.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p5']);"
+    value="g:=inv f" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Use <a href="dbopratdenom.xhtml">ratDenom</a> to remove the algebraic
+quantities from the denominator.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p5','p6']);"
+    value="ratDenom g" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{funelementaryfunctions.xhtml}
+<<funelementaryfunctions.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Elementary Functions</div>
+  <hr/>
+Axiom has most of the usual functions from calculus built-in.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="f:=x*log y * sin(1/(x+y))" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+You can substitute values or another elementary function for variables
+with the function eval.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="eval(f,[x=y,y=x])" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+As you can see, the substitutions are made "in parallel" as in the case
+of polynomials. It's also possible to substitute expressions for kernels
+instead of variables.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="eval(f,log y = acosh(x+sqrt y))" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{funoperatoralgebra.xhtml}
+<<funoperatoralgebra.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Operator</div>
+  <hr/>
+Given any ring R, the ring of the <a href="db.xhtml?Integer">Integer</a>
+linear operators over R is called <a href="db.xhtml?Operator">Operator(R)</a>.
+To create an operator over R, first create a basic operator using the
+operation <a href="dbopoperator.xhtml">operator</a>, and then convert it
+to <a href="db.xhtml?Operator">Operator(R)</a> for the R you want. We choose R
+to be the two by two matrices over the integers.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="R:=SQMATRIX(2,INT)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Create the operator tilde on R
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value='t:=operator("tilde")::OP(R)' />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Since  <a href="db.xhtml?Operator">Operator</a> is unexposed we must either
+package-call operations from it, or expose it explicitly. For convenience
+we will do the latter.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="noresult" 
+    onclick="makeRequest('p3');"
+    value=")set expose add constructor Operator" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+To attach an evaluation function (from R to R) to an operator over R, use
+evaluate(op,f) where op is an operator over R and f is a function R->R.
+This needs to be done only once when the operator is defined. Note that f
+must be <a href="db.xhtml?Integer">Integer</a> linear (that is, 
+<pre>
+  f(ax+y) = a f(x) + f(y)
+</pre>
+for any integer a and any x and y in R). We now attach the transpose map
+to the above operator t.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4']);"
+    value="evaluate(t,m+->transpose m)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+Operators can be manipulated formally as in any ring: 
+<a href="dbopplus.xhtml">+</a> is the pointwise addition and 
+<a href="dbopstar.xhtml">*</a> is composition. Any element x of R can
+be converted to an operator op_x over R, and the evaluation function of
+op_x is left-multiplication by x. Multiplying on the left by this matrix
+swaps the two rows.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p5']);"
+    value="s:R:=matrix [[0,1],[1,0]]" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Can you guess what is the action of the following operator?
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p5','p6']);"
+    value="rho:=t*s" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+Hint: applying rho four times gives the identity, so rho^4-1
+should return 0 when applied to any two by two matrix.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p5','p6','p7']);"
+    value="z:=rho^4-1" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Now check with this matrix
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p8']);"
+    value="m:R:=matrix [[1,2],[3,4]]" />
+  <div id="ansp8"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p5','p6','p7','p8','p9']);"
+    value="z m" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+As you have probably guessed by now, rho acts on matrices by rotating
+the elements clockwise.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p5','p6','p8','p10']);"
+    value="rho m" />
+  <div id="ansp10"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p5','p6','p8','p11']);"
+    value="rho rho m" />
+  <div id="ansp11"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p5','p6','p8','p12']);"
+    value="(rho**3) m" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+Do the swapping of rows and transposition commute? We can check by computing
+their bracket.
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p5','p6','p8','p13']);"
+    value="b:=t*s-s*t" />
+  <div id="ansp13"><div></div></div>
+ </li>
+</ul>
+Now apply it to m.
+<ul>
+ <li>
+  <input type="submit" id="p14" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p5','p6','p8','p13','p14']);"
+    value="b m" />
+  <div id="ansp14"><div></div></div>
+ </li>
+</ul>
+
+Next we demonstrate how to define a differential operator on a polynomial
+ring. This is the recursive definition of the nth Legendre polynomial.
+<ul>
+ <li>
+  <input type="submit" id="p15" class="noresult" 
+    onclick="makeRequest('p15');"
+    value="L n==( n=0 => 1 ; n=1 => x ; (2*n-1)/n*x*L(n-1)-(n-1)/n*L(n-2) )" />
+  <div id="ansp15"><div></div></div>
+ </li>
+</ul>
+Create the differential operator d/dx on polynomials in x over the rational
+numbers.
+<ul>
+ <li>
+  <input type="submit" id="p16" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p16']);"
+    value='dx:=operator("D")::OP(POLY FRAC INT)' />
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+Now attach a map to it.
+<ul>
+ <li>
+  <input type="submit" id="p17" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p16','p17']);"
+    value="evaluate(dx,p+->D(p,'x))" />
+  <div id="ansp17"><div></div></div>
+ </li>
+</ul>
+This is the differential equation satisfied by the nth Legendre polynomial.
+<ul>
+ <li>
+  <input type="submit" id="p18" class="noresult" 
+    onclick="handleFree(['p1','p2','p3','p16','p17','p18']);"
+    value="E n == (1-x^2)*dx^2-2*x*dx+n*(n+1)" />
+  <div id="ansp18"><div></div></div>
+ </li>
+</ul>
+Now we verify this for n=15. Here is the polynomial.
+<ul>
+ <li>
+  <input type="submit" id="p19" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p15','p19']);"
+    value="L 15" />
+  <div id="ansp19"><div></div></div>
+ </li>
+</ul>
+Here is the operator.
+<ul>
+ <li>
+  <input type="submit" id="p20" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p16','p17','p18','p20']);"
+    value="E 15" />
+  <div id="ansp20"><div></div></div>
+ </li>
+</ul>
+Here is the evaluation.
+<ul>
+ <li>
+  <input type="submit" id="p21" class="subbut" 
+    onclick=
+ "handleFree(['p1','p2','p3','p15','p16','p17','p18','p19','p20','p21']);"
+    value="(E 15)(L 15)" />
+  <div id="ansp21"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{functionpage.xhtml}
+<<functionpage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <div align="center">Functions in Axiom</div>
+  <hr/>
+In Axiom, a function is an expression in one or more variables.
+(Think of it as a function of those variables.) You can also
+define a function by rules or use a built-in function. Axiom lets
+you convert expressions to compiled functions.
+  <table>
+   <tr>
+    <td>
+     <a href="funrationalfunctions.xhtml">Rational Functions</a>
+    </td>
+    <td>
+     Quotients of polynomials
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="funalgebraicfunctions.xhtml">Algebraic Functions</a>
+    </td>
+    <td>
+     Those defined by polynomial
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="funelementaryfunctions.xhtml">Elementary Functions</a>
+    </td>
+    <td>
+     The elementary functions of calculus
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="funsimplification.xhtml">Simplification</a>
+    </td>
+    <td>
+     How to simplify expressions
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="funpatternmatching.xhtml">Pattern Matching</a>
+    </td>
+    <td>
+     How to use the pattern matcher
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="funoperatoralgebra.xhtml">Operator Algebra</a>
+    </td>
+    <td>
+     The operator algebra facility
+    </td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{funpatternmatching.xhtml}
+<<funpatternmatching.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Rules and Pattern Matching</div>
+  <hr/>
+A common mathematical formula is 
+<pre>
+log(x)+log(y)==log(x*y)
+</pre>
+for any x and y. The presence of the word "any" indicates that x and y
+can stand for arbitrary mathematical expressions in the above formula. You
+can use such mathematical formulas in Axiom to specify "rewrite rules". 
+Rewrite rules are objects in Axiom that can be assigned to variables for
+later use, often for the purpose of simplification. Rewrite rules look like
+ordinary function definitions except that they are preceded by the reserved
+word rule. For example, a rewrite rule for the above formula is:
+<pre>
+  rule log(x) + log(y) == log(x * y)
+</pre>
+Like function definitions, no action is taken when a rewrite rule is issued.
+Think of rewrite rules as functions that take one argument. When a rewrite
+rule A=B is applied to an argument f, its meaning is "rewrite every
+subexpressions of f that matches A by B". The left-and side of a rewrite rule
+is called a <a href="glossarypage.xhtml#p38600">pattern</a>; 
+its right-hand side is
+called its <a href="glossarypage.xhtml#p49000">substitution</a>. 
+
+Create a rewrite rule named logrule. The generated symbol begins with a
+"%" and is a place holder for any other terms that might occur in the sum.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="logrule:=rule log(x)+log(y)==log(x*y)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Create an expression with logarithms.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="f:=log sin x + log x" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Apply logrule to f.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="logrule f" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+The meaning of our example rewrite rule is "for all expressions x and y,
+rewrite log(x) and log(y) by log(x*y)". Patterns generally have both operation
+names 
+(here, <a href="dboplog.xhtml">log</a> and <a href="dbopplus.xhtml">+</a>)
+and variables (here, x and y). By default, every operation name stands for
+itself. The <a href="dboplog.xhtml">log</a> matches only "log" and not
+any other operation such as <a href="dbopsin.xhtml">sin</a>. On the other
+hand, variables do not stand for themselves. Rather, a variable denotes a
+<a href="glossarypage.xhtml#p39400">pattern variable</a> 
+that is free to match any expression whatsoever.
+
+When a rewrite rule is applied, a process called 
+<a href="glossarypage.xhtml#p38661">pattern matching</a> 
+goes to work by systematically 
+scanning the subexpressions of the argument. When a subexpression is found
+that "matches" the pattern, the subexpression is replaced by the right hand
+side of the rule. The details of what happens will be covered later.
+
+The customary Axiom notation for patterns is actually a shorthand for a
+longer, more general notation. Pattern variables can be made explicit
+by using a percent ("%") as the first character of the variable name. To
+say that a name stands for itself, you can prefix that name with a quote
+operator ("'"). Although the current Axiom parser does not let you quote
+an operation name, this more general notation gives you an alternative way
+of giving the same rewrite rule:
+<pre>
+  rule log(%x) + log(%y) == log(x*y)
+</pre>
+This longer notation gives you patterns that the standard notation won't
+handle. For example, the rule
+<pre>
+  rule %f(c * 'x) == c*%f(x)
+</pre>
+means "for all f and c, replace f(y) by c*f(x) when y is the product
+of c and the explicit variable x".
+
+Thus the pattern can have several adornments on the names that appear there.
+Normally, all of these adornments are dropped in the substitution on the
+right hand side. To summarize:
+<hr/>
+To enter a single rule in Axiom, use the following syntax:
+<pre>
+  rule lefthandside == righthandside
+</pre>
+The lefthandside is a pattern to be matched and the righthandside is its
+substitution. The rule is an object of type
+<a href="db.xhtml?RewriteRule">RewriteRule</a> that can be assigned to a
+variable and applied to expressions to transform them.
+<hr/>
+Rewrite rules can be collected into rulesets so that a set of rules can be
+applied at once. Here is another simplification rule for logarithms.
+<pre>
+  rule y*log(x) == log(x**y)
+</pre>
+for any x and y. If instead of giving a single rule following the reserved
+word rule you give a "pile" of rules, you create what is called a
+ruleset. Like rules, rulesets are objects in Axiom and can be assigned to
+variables. You will find it useful to group commonly used rules into
+input files, and read them in as needed. Create a ruleset named logrules.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="logrules:=rule (log(x)+log(y)==log(x*y) ; y*log(x)==log(x^y))" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+Again, create an expression f containing logarithms.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="f:=a*log(sin x)-2*log x" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Apply the ruleset logrules to f.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p4','p5','p6']);"
+    value="logrules f" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+We have allowed pattern variables to match arbitrary expressions in the
+above examples. Often you want a variable to match onlyh expressions 
+satisfying some predicate. For example, you may want to apply the
+transformation 
+<pre>
+  y*log(x) == log(x^y)
+</pre>
+only when y is an integer. The way to restrict a pattern variable y by a
+predicate f(y) is by using a vertical bar "|", which means "such that",
+in much the same way it is used in function definitions. You do this only
+once but at the earliest (meaning deepest and leftmost) part of the pattern.
+This restricts the logarithmic rule to create integer exponents only.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="logrules2:=rule (log(x)+log(y)==log(x*y) ; (y | integer? y)*log(x)==log(x^y))" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Compare this with the result of applying the previous set of rules.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p5','p8']);"
+    value="f" />
+  <div id="ansp8"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p5','p7','p9']);"
+    value="logrules2 f" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+You should be aware that you might need to apply a function like
+<a href="dbopinteger.xhtml">integer</a> within your predicate expression
+to actually apply the test function. Here we use 
+<a href="dbopinteger.xhtml">integer</a> because n has type 
+<a href="dbexpressioninteger.xhtml">Expression Integer</a> but
+<a href="dbopevenq.xhtml">even?</a> is an operation defined on the integers.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="makeRequest('p10');"
+    value="evenRule:=rule cos(x)^(n | integer? n and even? integer n)==(1-sin(x)^2)^(n/2)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+Here is the application of the rule.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p10','p11']);"
+    value="evenRule(cos(x)^2)" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+This is an example of some of the usual identities involving products of sines and cosines.
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="makeRequest('p12');"
+    value="sinCosProducts:=rule (sin(x)*sin(y)==(cos(x-y)-cos(x+y))/2 ; cos(x)*cos(y)==(cos(x-y)+cos(x+y))/2 ; sin(x)*cos(y)==(sin(x-y)+sin(x+y))/2 )" />
+  <div id="ansp12"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="makeRequest('p13');"
+    value="g:=sin(a)*sin(b)+cos(b)*cos(a)+sin(2*z)*cos(2*a)" />
+  <div id="ansp13"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p14" class="subbut" 
+    onclick="handleFree(['p12','p13','p14']);"
+    value="sinCosProducts g" />
+  <div id="ansp14"><div></div></div>
+ </li>
+</ul>
+Another qualification you will often want to use is to allow a pattern to
+match an identity element. Using the pattern x+y, for example, neither x 
+nor y matches the expression 0. Similarly, if a pattern contains a product
+x*y or an exponentiation x^y, then neither x nor y matches 1. If identical
+elements were matched, pattern matching would generally loop. Here is an
+expansion rule for exponentials.
+<ul>
+ <li>
+  <input type="submit" id="p15" class="subbut" 
+    onclick="makeRequest('p15');"
+    value="exprule:=rule exp(a+b)==exp(a)*exp(b)" />
+  <div id="ansp15"><div></div></div>
+ </li>
+</ul>
+This rule would cause infinite rewriting on this if either a or b were
+allowed to match 0.
+<ul>
+ <li>
+  <input type="submit" id="p16" class="subbut" 
+    onclick="handleFree(['p15','p16']);"
+    value="exprule exp x" />
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+There are occasions when you do want a pattern variable in a sum or product
+to match 0 or 1. If so, prefix its name with a "?" whenever it appears in
+a left-hand side of a rule. For example, consider the following rule for the
+exponential integral
+<pre>
+  integral((y+exp x)/x,x) == integral(y/x,x)+Ei x
+</pre>
+for any x and y. This rule is valid if y=0. One solution is to create a
+<a href="db.xhtml?Ruleset">Ruleset</a> with two rules, one with and one
+without y. A better solution is to use an "optional" pattern variable. 
+Define rule eirule with a pattern variable ?y to indicate that an
+expression may or may not occur.
+<ul>
+ <li>
+  <input type="submit" id="p17" class="subbut" 
+    onclick="makeRequest('p17');"
+    value="eirule:=rule integral((?y+exp x)/x,x)==integral(y/x,x)+Ei x" />
+  <div id="ansp17"><div></div></div>
+ </li>
+</ul>
+Apply rule eirule to an integral without this term.
+<ul>
+ <li>
+  <input type="submit" id="p18" class="subbut" 
+    onclick="handleFree(['p17','p18']);"
+    value="eirule integral (exp m/m,m)" />
+  <div id="ansp18"><div></div></div>
+ </li>
+</ul>
+Apply rule eirule to an integral with this term.
+<ul>
+ <li>
+  <input type="submit" id="p19" class="subbut" 
+    onclick="handleFree(['p17','p19']);"
+    value="eirule integral(sin m+exp m/m,m)" />
+  <div id="ansp19"><div></div></div>
+ </li>
+</ul>
+Here is one final adornment you will find useful. When matching a pattern
+of the form x+y to an expression containing a long sum of the form
+a+...+b, there is no way to predict in advance which subset of the sum
+matches x and which matches y. Aside from efficiency, this is generally
+unimportant since the rule holds for any possible combination of matches
+for x and y. In some situations, however, you many want to say which
+pattern variable is a sum (or product) of several terms, and which should
+match only a single term. To do this, put a prefix colon (":") before the
+pattern variable that you want to match mutliple terms. The remaining rules
+involve operators u and v.
+<ul>
+ <li>
+  <input type="submit" id="p20" class="subbut" 
+    onclick="makeRequest('p20');"
+    value="u:=operator 'u" />
+  <div id="ansp20"><div></div></div>
+ </li>
+</ul>
+These definitions tell Axiom that u and v are formal operators to be
+used in expressions.
+<ul>
+ <li>
+  <input type="submit" id="p21" class="subbut" 
+    onclick="makeRequest('p21');"
+    value="v:=operator 'v" />
+  <div id="ansp21"><div></div></div>
+ </li>
+</ul>
+First define myRule with no restrictions on the pattern variables x and y.
+<ul>
+ <li>
+  <input type="submit" id="p22" class="subbut" 
+    onclick="makeRequest('p22');"
+    value="myRule:=rule u(x+y)==u x + v y" />
+  <div id="ansp22"><div></div></div>
+ </li>
+</ul>
+Apply myRule to an expression.
+<ul>
+ <li>
+  <input type="submit" id="p23" class="subbut" 
+    onclick="handleFree(['p20','p21','p22','p23']);"
+    value="myRule u(a+b+c+d)" />
+  <div id="ansp23"><div></div></div>
+ </li>
+</ul>
+Define myOtherRule to match several terms so that the rule gets applied
+recursively.
+<ul>
+ <li>
+  <input type="submit" id="p24" class="subbut" 
+    onclick="makeRequest('p24');"
+    value="myOtherRule:=rule u(:x+y)==u x + v y" />
+  <div id="ansp24"><div></div></div>
+ </li>
+</ul>
+Apply myOtherRule to the same expression
+<ul>
+ <li>
+  <input type="submit" id="p25" class="subbut" 
+    onclick="handleFree(['p20','p21','p24','p25']);"
+    value="myOtherRule u(a+b+c+d)" />
+  <div id="ansp25"><div></div></div>
+ </li>
+</ul>
+Here are some final remarks on pattern matching. Pattern matching provides
+a very useful paradigm for solving certain classes of problems, namely, 
+those that involve transformations of one form to another and back. However,
+it is important to recognize its limitations.
+
+First, pattern matching slows down as the number of rules you have to
+apply increases. Thus it is good practice to organize the sets of rules
+you use optimally so that irrelevant rules are never included.
+
+Second, careless use of pattern matching can lead to wrong answers. You
+should avoid pattern matching to handle hidden algebraic relationships
+that can go undetected by other programs. As a simple example, a symbol
+such as "J" can easily be used to represent the square root of -1 or some
+other important algebraic quantity. Many algorithms branch on whether an
+expression is zero or not, then divide by that expression if it is not. If 
+you fail to simplify an expresison involving powers of J to -1, algorithms
+may incorrectly assume an expression is no-zero, take a wrong branch, and
+produce a meaningless result.
+
+Pattern matching should also not be used as a substitute for a domain. In
+Axiom, objects of one domain are transformed to objects of other domains
+using well-defined <a href="dbopcoerce.xhtml">coerce</a> operations. 
+Pattern matching should be used on objects that are all of the same type.
+Thus if your application can be handled by type 
+<a href="db.xhtml?Expression">Expression</a> in Axiom and you think you 
+need pattern matching consider this choice carefully. You may well be
+better served by extending an existing domain or by building a new domain
+of objects for your application.
+<<page foot>>
+@
+
+\subsection{funrationalfunctions.xhtml}
+<<funrationalfunctions.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Rational Functions</div>
+  <hr/>
+To create a rational function, just compute the quotient of two
+polynomials.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="f:=(x-y)/(x+y)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Use the functions 
+<a href="dbopnumer.xhtml">numer</a> and
+<a href="dbopdenom.xhtml">denom</a> to recover the numerator and
+denominator of a fraction:
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="numer f" />
+  <div id="ansp2"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="denom f" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+Since these are polynomials, you can apply all of the 
+<a href="polynomialpage.xhtml">polynomial operations</a> to them. 
+You can substitute values or other rational functions for the variables
+using the function <a href="dbopeval.xhtml">eval</a>. The syntax for
+<a href="dbopeval.xhtml">eval</a> is similar to the one for polynomials:
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p4']);"
+    value="eval(f,x=1/x)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p5']);"
+    value="eval(f,[x=y,y=x])" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{funsimplification.xhtml}
+<<funsimplification.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Simplification</div>
+  <hr/>
+Simplifying an expression often means different things at different times.
+Axiom offers a large number of "simplification" functions. The most common
+one, which performs the usual trigonometric simplifications is
+<a href="dbopsimplify.xhtml">simplify</a>.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="f:=cos(x)/sin(x)*log(sin(x)^2/(cos(x)^2+sin(x)^2))" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="g:=simplify f" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+If the result of <a href="dbopsimplify.xhtml">simplify</a> is not 
+satisfactory, specific transformations are available. For example, to
+rewrite g in terms of secants and cosecants instead of sines and cosines,
+issues:
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="h:=sin2csc cos2sec g" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+To apply the logarithm simplification rules to h, issue:
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4']);"
+    value="h:=expandLog h" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+Since the square root of x^2 is the absolute value of x and not x itself,
+algebraic radicals are not automatically simplified, but you can 
+specifically request it by calling 
+<a href="dboprootsimp.xhtml">rootSimp</a>:
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="f1:=sqrt((x+1)^3)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="rootSimp f1" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+There are other transformations which are sometimes useful. Use the 
+functions 
+<a href="dbopcomplexelementary.xhtml">complexElementary</a> and
+<a href="dboptrigs.xhtml">trigs</a> to go back and forth between
+the complex exponential and trigonometric forms of an elementary function.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="g1:=sin(x+cos x)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p7','p8']);"
+    value="g2:=complexElementary g1" />
+  <div id="ansp8"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p7','p8','p9']);"
+    value="trigs g2" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+Similarly, the functions
+<a href="dboprealelementary.xhtml">realElementary</a> and
+<a href="dbophtrigs.xhtml">htrigs</a> convert hyperbolic functions in
+and out of their exponential form.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="makeRequest('p10');"
+    value="h1:=sinh(x+cosh x)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p10','p11']);"
+    value="h2:=realElementary h1" />
+  <div id="ansp11"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p10','p11','p12']);"
+    value="htrigs h2" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+Axiom has other transformations, most of which are in the packages
+<a href="db.xhtml?ElementaryFunctionStructurePackage">
+ElementaryFunctionStructurePackage</a>,
+<a href="db.xhtml?TrigonometricManipulations">
+TrigonometricManipulations</a>,
+<a href="db.xhtml?AlgebraicManipulations">AlgebraicManipulations</a>, and
+<a href="db.xhtml?TranscendentalManipulations">
+TranscendentalManipulations</a>. If you need to apply a simplification
+rule not built into the system you can use Axiom's 
+<a href="funpatternmatching.xhtml">pattern matcher</a>.
+<<page foot>>
+@
+
+
+%%G
+\subsection{glossarypage.xhtml}
+<<glossarypage.xhtml>>=
+<<standard head>>
+ <style>
+  div.glabel    { color:blue; }
+  div.gsyntax   { color:blue; }
+  div.gspad     { color:blue; }
+  div.gfunction { color:blue; }
+  div.gtype     { color:blue; }
+  div.gcmd      { color:blue; }
+ </style>
+ </head>
+ <body>
+<<page head>>
+<ul>
+ <li><a name="p0" class="glabel"/><b>!</b>
+  <div class="gsyntax">(syntax)</div> Suffix character for 
+  <a href="#p14365">destructive operations</a>.
+ </li>
+ <li><a name="p74" class="glabel"/><b>,</b>
+  <div class="gsyntax">(syntax)</div> a separator for items in a 
+  <a href="#p50262">tuple</a>,  e.g. to separate arguments of a function 
+  <div class="gspad">f(x, y)</div>.
+ </li>
+ <li><a name="p210" class="glabel"/><b>=></b>
+  <div class="gsyntax">(syntax)</div> the expression 
+  <div class="gspad">a => b</div> is equivalent to 
+  <div class="gspad">if a then</div> <a href="#p19348">exit</a> 
+  <div class="gspad">b</div>.
+ </li>
+ <li><a name="p317" class="glabel"/><b>?</b>
+  <ol>
+   <li> 
+    <div class="gsyntax">(syntax)</div> a suffix character for 
+    Boolean-valued <div class="gfunction">function</div> names,  
+    e.g. <div class="gfunction">odd?</div>. 
+   </li>
+   <li> 
+    Suffix character for pattern variables. 
+   </li>
+   <li> The special type <div class="gspad">?</div> means 
+    <div class="gsyntax">don't care</div>. For example,  the declaration 
+    <div align="center" class="gspad">x : Polynomial ?</div>  means that 
+    values assigned to <div class="gspad">x</div> must be polynomials over 
+    an arbitrary <a href="#p51532">underlying domain</a>.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p725" class="glabel"/><b>abstract datatype</b>
+  a programming language principle used in Axiom  where a datatype is 
+  defined in two parts: (1) a <div class="gsyntax">public</div> part 
+  describing a set of <a href="#p20171">exports</a>, principally operations
+  that apply to objects of that type,  and (2) a
+  <div class="gsyntax">private</div> part describing the implementation of
+  the datatype usually in terms of a <a href="#p44277">representation</a> for
+  objects of the type. Programs which create and otherwise manipulate objects
+  of the type may only do so through its exports. The representation and
+  other implementation information is specifically hidden.
+ </li>
+ <li><a name="p1287" class="glabel"/><b>abstraction</b>
+  described functionally or conceptually without regard to implementation
+ </li>
+ <li><a name="p1362" class="glabel"/><b>accuracy</b>
+  the degree of exactness of an approximation or measurement. In computer
+  algebra systems,  computations are typically carried out with complete 
+  accuracy using integers or rational numbers of indefinite size. Domain
+  <div class="gtype">Float</div> provides a function
+  <div class="gfunction">precision</div> from
+  <div class="gtype">Float</div> to change the precision for floating point
+  computations. Computations using <div class="gtype">DoubleFloat</div>
+  have a fixed precision but uncertain accuracy.
+ </li>
+ <li><a name="p1794" class="glabel"/><b>add-chain</b>
+  a hierarchy formed by <a href="#p16819">domain extensions</a>. If domain
+  <div class="gspad">A</div> extends domain <div class="gspad">B</div> and
+  domain <div class="gspad">B</div> extends domain <div class="gspad">C</div>,
+  then <div class="gspad">A</div> has <div class="gsyntax">add-chain</div>
+  <div class="gspad">B</div>-<div class="gspad">C</div>.
+ </li>
+ <li><a name="p1993" class="glabel"/><b>aggregate</b>
+  a data structure designed to hold multiple values. Examples of aggregates
+  are <div class="gtype">List</div>,  <div class="gtype">Set</div>, 
+  <div class="gtype">Matrix</div> and <div class="gtype">Bits</div>.
+ </li>
+ <li><a name="p2150" class="glabel"/><b>AKCL</b>
+  Austin Kyoto Common LISP,  a version of
+  <a href="#p30645"><div class="gspad">KCL</div></a> produced by
+  William Schelter, Austin, Texas.
+ </li>
+ <li><a name="p2267" class="glabel"/><b>algorithm</b>
+  a step-by-step procedure for a solution of a problem; a program
+ </li>
+ <li><a name="p2335" class="glabel"/><b>ancestor</b>
+  (of a domain) a category which is a <a href="#p38095">parent</a> of the
+  domain,  or a <a href="#p38095">parent</a> of a
+  <a href="#p38095">parent</a> and so on.
+ </li>
+ <li><a name="p2473" class="glabel"/><b>application</b>
+  <div class="gsyntax">(syntax)</div> an expression denoting "application"
+  of a function to a set of <a href="#p2885">argument</a> parameters.
+  Applications are written as a <a href="#p38004">parameterized form</a>.
+  For example,  the form <div class="gspad">f(x, y)</div> indicates the
+  "application of the function <div class="gspad">f</div> to the tuple of
+  arguments <div class="gspad">x</div> and <div class="gspad">y</div>". 
+  See also <a href="#p19167">evaluation</a> and
+  <a href="#p29675">invocation</a>.
+ </li>
+ <li><a name="p2852" class="glabel"/><b>apply</b>
+  See <a href="#p2473">application</a>.
+ </li>
+ <li><a name="p2885" class="glabel"/><b>argument</b>
+  <ol>
+   <li>
+    (actual argument) a value passed to a function at the time of a
+    <a href="#p22911">function</a> call application; also called an
+    <div class="gsyntax">actual parameter</div>. 
+   </li>
+   <li>
+    (formal argument) a variable used in the definition of a function
+    to denote the actual argument passed when the function is called.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p3173" class="glabel"/><b>arity</b>
+  <ol>
+   <li>
+    (function) the number of arguments. 
+   </li>
+   <li>
+    (operator or operation) corresponds to the arity of a function
+    implementing the operator or operation.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p3322" class="glabel"/><b>assignment</b>
+  <div class="gsyntax">(syntax)</div> an expression of the form
+  <div class="gspad">x := e</div>,  meaning "assign the value of
+  <div class="gspad">e</div> to <div class="gspad">x"</div>. After
+  <a href="#p19167">evaluation</a>,  the <a href="#p52894">variable</a>
+  <div class="gspad">x</div> <a href="#p39600">pointer</a> to an object
+  obtained by evaluating the expression <div class="gspad">e</div>. If
+  <div class="gspad">x</div> has a <a href="#p50664">type</a> as a result
+  of a previous <a href="#p12903">declaration</a>, the object assigned to
+  <div class="gspad">x</div> must have that type. An interpreter must often
+  <a href="#p9572">coercion</a> the value of <div class="gspad">e</div>
+  to make that happen. For example,  in the interpreter,  
+  <div align="center" class="gspad">x : Float := 11</div> first
+  <a href="#p12903">declaration</a> <div class="gspad">x</div> to be a float.
+  This declaration causes the interpreter to coerce 11 to 11.0 in order to
+  assign a floating point value to <div class="gspad">x</div>.
+ </li>
+ <li><a name="p4093" class="glabel"/><b>attribute</b>
+  a name or functional form denoting <div class="gsyntax">any</div> useful
+  computational property. For example,  
+  <div class="gfunction">commutative(<div class="gspad">"*"</div>)</div>
+  asserts that "<div class="gfunction">*</div> is commutative". Also,
+  <div class="gfunction">finiteAggregate</div> is used to assert that an
+  aggregate has a finite number of immediate components.
+ </li>
+ <li><a name="p4380" class="glabel"/><b>basis</b>
+  <div class="gsyntax">(algebra)</div> <div class="gspad">S</div> is a
+  basis of a module <div class="gspad">M</div> over a
+  <a href="#p45405">ring</a> if <div class="gspad">S</div> generates 
+  <div class="gspad">M</div>,  and <div class="gspad">S</div> is linearly
+  independent
+ </li>
+ <li><a name="p4536" class="glabel"/><b>benefactor</b>
+  (of a given domain) a domain or package that the given domain explicitly
+   references (for example,  calls functions from) in its implementation
+ </li>
+ <li><a name="p4684" class="glabel"/><b>binary</b>
+  operation or function with <a href="#p3173">arity</a> 2
+ </li>
+ <li><a name="p4735" class="glabel"/><b>binding</b>
+  the association of a variable with properties such as
+  <a href="#p52710">value</a> and <a href="#p50664">type</a>. The
+  top-level <a href="#p19131">environment</a> in the interpreter consists 
+  of bindings for all user variables and functions. Every
+  <a href="#p22911">function</a> has an associated set of bindings,  one
+  for each formal <a href="#p2885">argument</a> and
+  <a href="#p32278">local variable</a>.
+ </li>
+ <li><a name="p5086" class="glabel"/><b>block</b>
+  <div class="gsyntax">(syntax)</div> a control structure where
+  expressions are sequentially <a href="#p19167">evaluation</a>.
+ </li>
+ <li><a name="p5198" class="glabel"/><b>body</b>
+  a <a href="#p23911">function body</a> or <a href="#p33300">loop body</a>.
+ </li>
+ <li><a name="p5256" class="glabel"/><b>boolean</b>
+  objects denoted by the <a href="#p31774">literals</a>
+  <div class="gspad">true</div> and <div class="gspad">false</div>; 
+  elements of domain <div class="gtype">Boolean</div>. 
+  See also <div class="gtype">Bits</div>.
+ </li>
+ <li><a name="p5399" class="glabel"/><b>built-in function</b>
+  a <a href="#p22911">function</a> in the standard Axiom  library. 
+  Contrast <a href="#p52526">user function</a>.
+ </li>
+ <li><a name="p5499" class="glabel"/><b>cache</b>
+  <ol>
+   <li> 
+    (noun) a mechanism for immediate retrieval of previously computed data.
+    For example,  a function which does a lengthy computation might store
+    its values in a <a href="#p25428">hash table</a> using argument as a
+    key. The hash table then serves as a cache for the function (see also
+    <div class="gcmd">)set function cache</div>). Also,  when
+    <a href="#p43448">recurrence relations</a> which depend upon
+    <div class="gspad">n</div> previous values are compiled,  the previous
+    <div class="gspad">n</div> values are normally cached
+    (use <div class="gcmd">)set functions recurrence</div> to change this). 
+   </li>
+   <li>
+    (verb) to save values in a cache.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p6070" class="glabel"/><b>capsule</b>
+  the part of the <a href="#p23911">function body</a> of a
+  <a href="#p16173">domain constructor</a> that defines the functions 
+  implemented by the constructor.
+ </li>
+ <li><a name="p6220" class="glabel"/><b>case</b>
+  <div class="gsyntax">(syntax)</div> an operator used to
+  conditionally evaluate code based on the branch of a
+  <a href="#p51780">Union</a>. For example,  if value
+  <div class="gspad">u</div> is 
+  <div class="gspad">Union(Integer, "failed")</div>,  the conditional
+  expression <div class="gspad">if u case Integer then A else B</div> 
+  evaluate <div class="gspad">A</div> if <div class="gspad">u</div> is
+  an integer and <div class="gspad">B</div> otherwise.
+ </li>
+ <li><a name="p6537" class="glabel"/><b>Category</b>
+  the distinguished object denoting the type of a category; the class of
+  all categories.
+ </li>
+ <li><a name="p6628" class="glabel"/><b>category</b>
+  <div class="gsyntax">(basic concept)</div> second-order types which
+  serve to define useful "classification worlds" for domains, such as
+  algebraic constructs (e.g. groups, rings, fields), and data structures
+  (e.g. homogeneous aggregates, collections, dictionaries). Examples of
+  categories are <div class="gtype">Ring</div> ("the class of all
+  rings") and <div class="gtype">Aggregate</div> ("the class of all
+  aggregates"). The categories of a given world are arranged in a
+  hierarchy (formally, a directed acyclic graph). Each category inherits
+  the properties of all its ancestors. Thus, for example, the category
+  of ordered rings (<div class="gtype">OrderedRing</div>) inherits the
+  properties of the category of rings (<div class="gtype">Ring</div>)
+  and those of the ordered sets 
+  (<div class="gtype">OrderedSet</div>). Categories provide a database of
+  algebraic knowledge and ensure mathematical correctness, e.g. that
+  "matrices of polynomials" is correct but "polynomials of hash tables"
+  is not, that the multiply operation for "polynomials of continued
+  fractions" is commutative, but that for "matrices of power series" is
+  not. optionally provide "default definitions" for operations they
+  export. Categories are defined in Axiom by functions called 
+  <a href="#p8355">category constructors</a>. Technically, a category
+  designates a class of domains with common 
+  <a href="#p36041">operations</a> and <a href="#p4093">attributes</a> but
+  usually with different <a href="#p22911">functions</a> and 
+  <a href="#p44277">representations</a> for its constituent 
+  <a href="#p35301">objects</a>. Categories are always defined using the
+  Axiom library language (see also 
+  <a href="#p8634">category extension</a>). 
+  See also file <div class="gsyntax">catdef.spad</div>
+  for definitions of basic algebraic categories in Axiom .
+ </li>
+ <li><a name="p8355" class="glabel"/><b>category constructor</b>
+  a function that creates categories, described by an abstract
+  datatype in the Axiom programming language. For example, the category
+  constructor <div class="gtype">Module</div> is a function which takes
+  a domain parameter <div class="gspad">R</div> and creates the category
+  "modules over <div class="gspad">R</div>".
+ </li>
+ <li><a name="p8634" class="glabel"/><b>category extension</b>
+  created by a category definition, an expression usually of the form
+  <div class="gspad">A == B with ...</div>. In English, this means
+  "category A is a <div class="gspad">B</div> with the new operations
+  and attributes as given by ... . See, for example, file 
+  <div class="gsyntax">catdef.spad</div> for a definitions of the algebra
+  categories in Axiom , <div class="gsyntax">aggcat.spad</div> for data
+  structure categories.
+ </li>
+ <li><a name="p8996" class="glabel"/><b>category hierarchy</b>
+  hierarchy formed by category extensions. The root category is 
+  <div class="gtype">Object</div>. A category can be defined as a 
+  <a href="#p30459">Join</a> of two or more categories so as to have
+  multiple <a href="#p38095">parents</a>. Categories may also have
+  parameterized so as to allow conditional inheritance.
+ </li>
+ <li><a name="p9278" class="glabel"/><b>character</b>
+  <ol>
+   <li> 
+    an element of a character set,  as represented by a keyboard key. 
+   </li>
+   <li>
+    a component of a string. For example, the 0th element of the string
+    <div class="gspad">"hello there"</div> is the character 
+    <div class="gsyntax">h</div>.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p9472" class="glabel"/><b>client</b>
+  (of a given domain) any domain or package that explicitly calls
+  functions from the given domain
+ </li>
+ <li><a name="p9572" class="glabel"/><b>coercion</b>
+  an automatic transformation of an object of one 
+  <a href="#p50664">type</a> to an object of a similar or desired target
+  type. In the interpreter, coercions and 
+  <a href="#p45044">retractions</a> are done automatically by the
+  interpreter when a type mismatch occurs. Compare 
+  <a href="#p12242">conversion</a>.
+ </li>
+ <li><a name="p9854" class="glabel"/><b>comment</b>
+  textual remarks imbedded in code. Comments are preceded by a double
+  dash (<div class="gsyntax">--</div>). For Axiom library code,
+  stylized comments for on-line documentation are preceded by a two plus
+  signs (<div class="gsyntax">++</div>).
+ </li>
+ <li><a name="p10064" class="glabel"/><b>Common LISP</b>
+  A version of <a href="#p31518">LISP</a> adopted as an informal
+  standard by major users and suppliers of LISP
+ </li>
+ <li><a name="p10167" class="glabel"/><b>compile-time</b>
+  the time when category or domain constructors are compiled. Contrast
+  <a href="#p45818">run-time</a>.
+ </li>
+ <li><a name="p10262" class="glabel"/><b>compiler</b>
+  a program that generates low-level code from a higher-level source
+  language. Axiom has three compilers. 
+  <ol>
+   <li>
+    A <div class="gsyntax">graphics
+    compiler</div> converts graphical formulas to a compiled subroutine so
+    that points can be rapidly produced for graphics commands. 
+   </li>
+   <li>
+    An <div class="gsyntax">interpreter compiler</div> optionally compiles 
+    <a href="#p52526">user functions</a> when first 
+    <a href="#p29675">invocation</a> 
+    (use <div class="gcmd">)set functions compile</div> 
+    to turn this feature on). 
+   </li>
+   <li> 
+    A <div class="gsyntax">library compiler</div> compiles all 
+    constructors.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p10792" class="glabel"/><b>computational object</b>
+   In Axiom , domains are objects. This term is used to distinquish the
+  objects which are members of domains rather than domains themselves.
+ </li>
+ <li><a name="p10941" class="glabel"/><b>conditional</b>
+  a <a href="#p12001">control structure</a> of the form 
+  <div class="gspad">if A then B else C</div>; The 
+  <a href="#p19167">evaluation</a> of <div class="gspad">A</div> produces
+  <div class="gspad">true</div> or <div class="gspad">false</div>. If
+  <div class="gspad">true</div>, <div class="gspad">B</div> evaluates to
+  produce a value; otherwise <div class="gspad">C</div> evaluates to
+  produce a value. When the value is not used, 
+  <div class="gspad">else C</div> part can be omitted.
+ </li>
+ <li><a name="p11264" class="glabel"/><b>constant</b>
+  <div class="gsyntax">(syntax)</div> a reserved word used in 
+  <a href="#p46813">signatures</a> in Axiom programming language to signify
+  that mark an operation always returns the same value. For example, the
+  signature <div class="gspad">0: constant -> $</div> in the source code
+  of <div class="gtype">AbelianMonoid</div> tells the Axiom compiler
+  that <div class="gspad">0</div> is a constant so that suitable
+  optimizations might be performed.
+ </li>
+ <li><a name="p11642" class="glabel"/><b>constructor</b>
+  a <a href="#p22911">function</a> which creates a 
+  <a href="#p6628">category</a>, <a href="#p15041">domain</a>, or 
+  <a href="#p36778">package</a>.
+ </li>
+ <li><a name="p11755" class="glabel"/><b>continuation</b>
+  when a line of a program is so long that it must be broken into
+  several lines, then all but the first line are called 
+  <div class="gsyntax">continuation lines</div>. If such a line is given
+  interactively, then each incomplete line must end with an underscore.
+ </li>
+ <li><a name="p12001" class="glabel"/><b>control structure</b>
+  program structures which can specify a departure from normal
+  sequential execution. Axiom has four kinds of control structures: 
+  <a href="#p5086">blocks</a>, <a href="#p6220">case</a> statements, 
+  <a href="#p10941">conditionals</a>, and <a href="#p33121">loops</a>.
+ </li>
+ <li><a name="p12242" class="glabel"/><b>conversion</b>
+  the transformation of an object on one <a href="#p50664">type</a> to
+  one of another type. Conversions performed automatically are called 
+  <a href="#p9572">coercions</a>. These happen when the interpreter has a
+  type mismatch and a similar or declared target type is needed. In
+  general, the user must use the infix operation 
+  <div class="gspad">::</div> to cause this transformation.
+ </li>
+ <li><a name="p12604" class="glabel"/><b>copying semantics</b>
+  the programming language semantics used in Pascal but 
+  <div class="gsyntax">not</div> in Axiom . See also 
+  <a href="#p39949">pointer semantics</a> for details.
+ </li>
+ <li><a name="p12740" class="glabel"/><b>data structure</b>
+  a structure for storing data in the computer. Examples are 
+  <a href="#p31730">lists</a> and <a href="#p25428">hash tables</a>.
+ </li>
+ <li><a name="p12850" class="glabel"/><b>datatype</b>
+  equivalent to <a href="#p15041">domain</a> in Axiom .
+ </li>
+ <li><a name="p12903" class="glabel"/><b>declaration</b>
+  <div class="gsyntax">(syntax)</div> an expression of the form 
+  <div class="gspad">x : T</div> where <div class="gspad">T</div> is some
+  <div class="gspad">type</div>. A declaration forces all values 
+  <a href="#p3322">assigned</a> to <div class="gspad">T</div> to be of that
+  type. If a value is of a different type, the interpreter will try to
+  <a href="#p9572">coerce</a> the value to type 
+  <div class="gspad">T</div>. Declarations are necessary in case of 
+  ambiguity or when a user wants to introduce an an 
+  <a href="#p20259">unexposed</a> domain.
+ </li>
+ <li><a name="p13351" class="glabel"/><b>default definition</b>
+  a function defined by a <a href="#p6628">category</a>. Such
+  definitions appear category definitions of the form 
+  <div class="gspad">C: Category == T add I</div> in an optional
+  implmentation part <div class="gspad">I</div> to the right of the
+  keyword <div class="gspad">add</div>.
+ </li>
+ <li><a name="p13571" class="glabel"/><b>default package</b>
+  a optional <a href="#p36778">package</a> of 
+  <a href="#p22911">functions</a> associated with a category. Such
+  functions are necessarily defined in terms over other functions
+  exported by the category.
+ </li>
+ <li><a name="p13754" class="glabel"/><b>definition</b>
+  <div class="gsyntax">(syntax)</div> 
+  <ol>
+   <li> 
+    An expression of the form
+    <div class="gspad">f(a) == b</div> defining function 
+    <div class="gspad">f</div> with <a href="#p21594">formal arguments</a> 
+    <div class="gspad">a</div> and <a href="#p5198">body</a> 
+    <div class="gspad">b</div>; equivalent to the statement 
+    <div class="gspad">f == (a) +-> b</div>. 
+   </li>
+   <li> 
+    An expression of the form 
+    <div class="gspad">a == b</div> where <div class="gspad">a</div> is a 
+    <a href="#p49347">symbol</a>, equivalent to 
+    <div class="gspad">a() == b</div>.
+    See also <a href="#p33585">macro</a> where a similar
+    substitution is done at <a href="#p38242">parse</a> time.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p14178" class="glabel"/><b>delimiter</b>
+  a <a href="#p9278">character</a> which marks the beginning or end of
+  some syntactically correct unit in the language, e.g. " for strings,
+  blanks for identifiers.
+ </li>
+ <li><a name="p14365" class="glabel"/><b>destructive operation</b>
+  An operation which changes a component or structure of a value. In
+  Axiom , all destructive operations have names which end with an
+  exclamation mark (<div class="gsyntax">!</div>). For example, domain
+  <div class="gtype">List</div> has two operations to reverse the
+  elements of a list, one named <div class="gfunction">reverse</div>
+  from <div class="gtype">List</div> which returns a copy of the
+  original list with the elements reversed, another named 
+  <div class="gfunction">reverse!</div> from <div class="gtype">List</div>
+  which reverses the elements <div class="gsyntax">in place</div> thus
+  destructively changing the original list.
+ </li>
+ <li><a name="p14877" class="glabel"/><b>documentation</b>
+  <ol>
+   <li> 
+    on-line or hard copy descriptions of Axiom; 
+   </li>
+   <li> 
+    text in library code preceded by 
+    <div class="gsyntax">++</div> comments as opposed to general comments
+    preceded by <div class="gsyntax">--</div>.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p15041" class="glabel"/><b>domain</b>
+  <div class="gsyntax">(basic concept)</div> a domain corresponds to
+  the usual notion of abstract datatypes: that of a set of values and a
+  set of "exported operations" for the creation and manipulation of
+  these values. Datatypes are parameterized, dynamically constructed,
+  and can combine with others in any meaningful way, e.g. "lists of
+  floats" (<div class="gtype">List Float</div>), "fractions of
+  polynomials with integer coefficients" 
+  (<div class="gtype">Fraction Polynomial Integer</div>), 
+  "matrices of infinite <a href="#p47825">streams</a> of cardinal numbers" 
+  (<div class="gtype">Matrix Stream CardinalNumber</div>). The term 
+  <div class="gsyntax">domain</div> is actually abbreviates 
+  <div class="gsyntax">domain of computation</div>. Technically, a domain
+  denotes a class of objects, a class of 
+  <a href="#p36041">operations</a> for creating and other manipulating
+  these objects, and a class of <a href="#p4093">attributes</a>
+  describing computationally useful properties. Domains also provide 
+  <a href="#p22911">functions</a> for each operation often in terms of some
+  <a href="#p44277">representation</a> for the objects. A domain itself
+  is an <a href="#p35301">object</a> created by a 
+  <a href="#p22911">function</a> called a <a href="#p16173">domain
+  constructor</a>.
+ </li>
+ <li><a name="p16173" class="glabel"/><b>domain constructor</b>
+   a function that creates domains, described by an abstract datatype in
+  the Axiom programming language. Simple domains like 
+  <div class="gtype">Integer</div> and <div class="gtype">Boolean</div> are
+  created by domain constructors with no arguments. Most domain
+  constructors take one or more parameters, one usually denoting an 
+  <a href="#p51532">underlying domain</a>. For example, the domain 
+  <div class="gtype">Matrix(R)</div> denotes "matrices over 
+  <div class="gspad">R"</div>. Domains <div class="gsyntax">Mapping</div>,
+  <div class="gsyntax">Record</div>, and 
+  <div class="gsyntax">Union</div> are primitive domains. All other domains
+  are written in the Axiom programming language and can be modified by
+  users with access to the library source code.
+ </li>
+ <li><a name="p16819" class="glabel"/><b>domain extension</b>
+  a domain constructor <div class="gspad">A</div> is said to 
+  <div class="gsyntax">extend</div> a domain constructor 
+  <div class="gspad">B</div> if <div class="gspad">A</div>
+  <div class="gspad">'s</div> definition has the form 
+  <div class="gspad">A == B add ...</div>. 
+  This intuitively means "functions not defined by <div
+  class="gspad">A</div> are assumed to come from 
+  <div class="gspad">B</div>". Successive domain extensions form 
+  <a href="#p1794">add-chains</a> affecting the the 
+  <a href="#p46200">search order</a> for functions not implemented directly
+  by the domain during <a href="#p17853">dynamic lookup</a>.
+ </li>
+ <li><a name="p17269" class="glabel"/><b>dot notation</b>
+  using an infix dot (<div class="gsyntax">.</div>) for function
+  application. If <div class="gspad">u</div> is the list 
+  <div class="gspad">[7, 4, -11]</div> then both 
+  <div class="gspad">u(2)</div> and <div class="gspad">u.2</div> return
+  4. Dot notation nests to left. Thus <div class="gspad">f . g . h</div>
+  is equivalent to <div class="gspad">(f . g) . h</div>.
+ </li>
+ <li><a name="p17507" class="glabel"/><b>dynamic</b>
+  that which is done at <a href="#p45818">run-time</a> as opposed to 
+  <a href="#p10167">compile-time</a>. For example, the interpreter will
+  build the domain "matrices over integers" dynamically in response to
+  user input. However, the compilation of all functions for matrices and
+  integers is done during <a href="#p10167">compile-time</a>. Constrast
+  <a href="#p47594">static</a>.
+ </li>
+ <li><a name="p17853" class="glabel"/><b>dynamic lookup</b>
+  In Axiom , a <a href="#p17507">domain</a> may or may not explicitly
+  provide <a href="#p22911">function</a> definitions for all of its
+  exported <a href="#p36041">operations</a>. These definitions may
+  instead come from domains in the <a href="#p1794">add-chain</a> or
+  from <a href="#p13571">default packages</a>. When a 
+  <a href="#p2400">function call</a> is made for an operation in the
+  domain, up to five steps are carried out.
+  <ol>
+   <li> 
+    If the domain itself implements a function for the operation,  
+    that function is returned. 
+   </li>
+   <li> 
+    Each of the domains in the <a href="#p1794">add-chain</a> are searched
+    for one which implements the function; if found, the function is returned.
+   </li>
+   <li> 
+    Each of the <a href="#p13571">default packages</a> for the domain are
+    searched in order of the <a href="#p30933">lineage</a>. If any of the
+    default packages implements the function, the first one found is
+    returned.
+   </li>
+   <li> 
+    Each of the <a href="#p13571">default packages</a> for each of the
+    domains in the <a href="#p1794">add-chain</a> are searched in the
+    order of their <a href="#p30933">lineage</a>. If any of the default
+    packages implements the function, the first one found is returned.
+   </li>
+   <li> If all of the above steps fail,  an error message is reported. 
+   </li>
+  </ol>
+ </li>
+ <li><a name="p19071" class="glabel"/><b>empty</b>
+  the unique value of objects with type <div class="gtype">Void</div>.
+ </li>
+ <li><a name="p19131" class="glabel"/><b>environment</b>
+  a set of <a href="#p4735">bindings</a>.
+ </li>
+ <li><a name="p19167" class="glabel"/><b>evaluation</b>
+  a systematic process which transforms an 
+  <a href="#p20659">expression</a> into an object called the 
+  <a href="#p52710">value</a> of the expression. Evaluation may produce 
+  <a href="#p46699">side effects</a>.
+ </li>
+ <li><a name="p19348" class="glabel"/><b>exit</b>
+  <div class="gsyntax">(reserved word)</div> an 
+  <a href="#p36278">operator</a> which forces an exit from the current
+  block. For example, the <a href="#p5086">block</a> 
+  <div class="gspad">(a := 1; if i > 0 then exit a; a := 2)</div> will
+  prematurely exit at the second statement with value 1 if the value of
+  <div class="gspad">i</div> is greater than 0. See 
+  <a href="#p210"><div class="gspad">=></div></a> for an alternate syntax.
+ </li>
+ <li><a name="p19681" class="glabel"/><b>explicit export</b>
+  <ol>
+   <li> 
+    (of a domain <div class="gspad">D</div>) any 
+    <a href="#p4093">attribute</a>, <a href="#p36041">operation</a>, or 
+    <a href="#p6628">category</a> explicitly mentioned in the 
+    <a href="#p50664">type</a> specification part <div class="gspad">T</div>
+    for the domain constructor definition  <div class="gspad">D: T == I</div>
+   </li>
+   <li> 
+    (of a category <div class="gspad">C</div>) any 
+    <a href="#p4093">attribute</a>, <a href="#p36041">operation</a>, or 
+    <a href="#p6628">category</a> explicitly mentioned in the 
+    <a href="#p50664">type</a> specification part <div class="gspad">T</div>
+    for the domain constructor definition 
+    <div class="gspad">C: <a href="#p6537">Category</a> == T</div>
+   </li>
+  </ol>
+ </li>
+ <li><a name="p20171" class="glabel"/><b>export</b>
+   <a href="#p19681">explicit export</a> or <a href="#p27325">implicit
+  export</a> of a domain or category
+ </li>
+ <li><a name="p20259" class="glabel"/><b>expose</b>
+  some constructors are <div class="gsyntax">exposed</div>, others
+  <div class="gsyntax">unexposed</div>. Exposed domains and packages
+  are recognized by the interpreter. Use 
+  <div class="gcmd">)set expose</div> 
+  to control change what is exposed. To see both exposed
+  and unexposed constructors, use the browser with give the system
+  command <div class="gcmd">)set hyperdoc browse exposure
+  on</div>. Unexposed constructors will now appear prefixed by star
+  (<div class="gspad">*</div>).
+ </li>
+ <li><a name="p20659" class="glabel"/><b>expression</b>
+  <ol>
+   <li> any syntactically correct program fragment. 
+   </li>
+   <li> an element of domain <div class="gtype">Expression</div>
+   </li>
+  </ol>
+ </li>
+ <li><a name="p20757" class="glabel"/><b>extend</b>
+  see <a href="#p8634">category extension</a> or <a href="#p16819">domain 
+  extension</a>
+ </li>
+ <li><a name="p20829" class="glabel"/><b>field</b>
+  <div class="gsyntax">(algebra)</div> a <a href="#p17507">domain</a>
+  which is <a href="#p45405">ring</a> where every non-zero element is
+  invertible and where <div class="gspad">xy=yx</div>; a member of
+  category <div class="gtype">Field</div>. For a complete list of
+  fields, click on <div class="gsyntax">Domains</div> under 
+  <div class="gsyntax">Cross Reference</div> for 
+  <div class="gtype">Field</div>.
+ </li>
+ <li><a name="p21109" class="glabel"/><b>file</b>
+  a program or collection of data stored on disk,  tape or other medium.
+ </li>
+ <li><a name="p21186" class="glabel"/><b>float</b>
+  a floating-point number with user-specified precision; an element of
+  domain <div class="gtype">Float</div>. Floats are 
+  <a href="#p31774">literals</a> which are written two ways: without an
+  exponent (e.g. <div class="gspad">3.1416</div>), or with an exponent
+  (e.g. <div class="gspad">3.12E-12</div>). Use function 
+  <a href="#p42318">precision</a> to change the precision of the mantissage
+  (20 digits by default). See also <a href="#p47066">small float</a>.
+ </li>
+ <li><a name="p21594" class="glabel"/><b>formal parameter</b>
+  (of a function) an identifier <a href="#p4735">bound</a> to the value
+  of an actual <a href="#p2885">argument</a> on 
+  <a href="#p29675">invocation</a>. In the function definition 
+  <div class="gspad">f(x, y) == u</div>, for example, 
+  <div class="gspad">x</div> and <div class="gspad">y</div> are the formal
+  parameter.
+ </li>
+ <li><a name="p21847" class="glabel"/><b>frame</b>
+  the basic unit of an interactive session; each frame has its own
+  <a href="#p47691">step number</a>, <a href="#p19131">environment</a>, and
+  <a href="#p26034">history</a>. In one interactive session, users can
+  can create and drop frames, and have several active frames simultaneously.
+ </li>
+ <li><a name="p22113" class="glabel"/><b>free</b>
+   <div class="gsyntax">(syntax)</div> A keyword used in user-defined
+  functions to declare that a variable is a 
+  <a href="#p22739">free variable</a> of that function. 
+  For example, the statement 
+  <div class="gspad">free x</div> declares the variable 
+  <div class="gspad">x</div> within the body of a function 
+  <div class="gspad">f</div> to be a free variable in 
+  <div class="gspad">f</div>. Without such a declaration, any variable 
+  <div class="gspad">x</div> which appears on the left hand side of an
+  assignment is regarded as a <a href="#p32278">local variable</a> of
+  that function. If the intention of the assignment is to give an value
+  to a <a href="#p24833">global variable</a> <div class="gspad">x</div>,
+  the body of that function must contain the statement 
+  <div class="gspad">free x</div>.
+ </li>
+ <li><a name="p22739" class="glabel"/><b>free variable</b>
+   (of a function) a variable which appears in a body of a function but
+  is not <a href="#p4735">bound</a> by that function. See 
+  <a href="#p32278">local variable</a> by default.
+ </li>
+ <li><a name="p22911" class="glabel"/><b>function</b>
+   implementation of <a href="#p36041">operation</a>; it takes zero or
+  more <a href="#p2885">argument</a> parameters and produces zero or
+  more values. Functions are objects which can be passed as parameters
+  to functions and can be returned as values of functions. Functions can
+  also create other functions (see also 
+  <div class="gtype">InputForm</div>). See also 
+  <a href="#p2473">application</a> and 
+  <a href="#p29675">invocation</a>. The terms 
+  <div class="gsyntax">operation</div> and 
+  <div class="gsyntax">function</div> are distinct notions in Axiom . An
+  operation is an abstraction of a function, described by declaring a 
+  <a href="#p46813">signature</a>. A function is created by providing an
+  implementation of that operation by some piece of Axiom code. Consider
+  the example of defining a user-function <div class="gspad">fact</div>
+  to compute the <div class="gfunction">factorial</div> of a nonnegative
+  integer. The Axiom statement 
+  <div class="gspad">fact: Integer -> Integer</div> 
+  describes the operation, whereas the statement 
+  <div class="gspad">fact(n) = reduce(*, [1..n])</div> defines the
+  functions. See also <a href="#p24495">generic function</a>.
+ </li>
+ <li><a name="p23911" class="glabel"/><b>function body</b>
+   the part of a <a href="#p22911">function</a>
+  <div class="gspad">'s</div> definition which is evaluated when the function
+  is called at <a href="#p45818">run-time</a>; the part of the function
+  definition to the right of the <div class="gspad">==</div>.
+ </li>
+ <li><a name="p2400" class="glabel"/><b>function call</b>
+   <div class="gsyntax">(syntax)</div> an expression denoting
+  "application" of a function to a set of <a href="#p2885">argument</a>
+  parameters. Applications are written as a 
+  <a href="#p38004">parameterized form</a>. For example, the form 
+  <div class="gspad">f(x, y)</div> indicates the "application of the function
+  <div class="gspad">f</div> to the tuple of arguments 
+  <div class="gspad">x</div> and <div class="gspad">y</div>". See also 
+  <a href="#p19167">evaluation</a> and <a href="#p29675">invocation</a>.
+ </li>
+ <li><a name="p24123" class="glabel"/><b>garbage collection</b>
+   a system function that automatically recycles memory cells from the
+  <a href="#p25771">heap</a>. Axiom is built upon 
+  <a href="#p10064">Common LISP</a> which provides this facility.
+ </li>
+ <li><a name="p24294" class="glabel"/><b>garbage collector</b>
+  a mechanism for reclaiming storage in the <a href="#p25771">heap</a>.
+ </li>
+ <li><a name="p24359" class="glabel"/><b>Gaussian</b>
+   a complex-valued expression, e.g. one with both a real and imaginary
+  part; a member of a <div class="gtype">Complex</div> domain.
+ </li>
+ <li><a name="p24495" class="glabel"/><b>generic function</b>
+   the use of one function to operate on objects of different types; One
+  might regard Axiom as supporting generic 
+  <a href="#p36041">operations</a> but not generic functions. One operation
+  <div class="gspad">+: (D, D) -> D</div> exists for adding elements in
+  a ring; each ring however provides its own type-specific function for
+  implementing this operation.
+ </li>
+ <li><a name="p24833" class="glabel"/><b>global variable</b>
+   A variable which can be referenced freely by functions. In Axiom ,
+  all top-level user-defined variables defined during an interactive
+  user session are global variables. Axiom does not allow <div
+  class="gsyntax">fluid variables</div>, that is, variables 
+  <a href="#p4735">bound</a> by functions which can be referenced by
+  functions those functions call.
+ </li>
+ <li><a name="p25189" class="glabel"/><b>Groebner basis</b>
+   <div class="gsyntax">(algebra)</div> a special basis for a
+  polynomial ideal that allows a simple test for membership. It is
+  useful in solving systems of polynomial equations.
+ </li>
+ <li><a name="p25348" class="glabel"/><b>group</b>
+   <div class="gsyntax">(algebra)</div> a <a href="#p34266">monoid</a>
+  where every element has a multiplicative inverse.
+ </li>
+ <li><a name="p25428" class="glabel"/><b>hash table</b>
+   A data structure that efficiency maps a given object to another. A
+  hash table consists of a set of <div class="gsyntax">entries</div>,
+  each of which associates a <div class="gsyntax">key</div> with a 
+  <div class="gsyntax">value</div>. Finding the object stored under a key
+  can be very fast even if there are a large number of entries since
+  keys are <div class="gsyntax">hashed</div> into numerical codes for
+  fast lookup.
+ </li>
+ <li><a name="p25771" class="glabel"/><b>heap</b>
+   an area of storage used by data in programs. For example, AXIOM will
+  use the heap to hold the partial results of symbolic
+  computations. When cancellations occur, these results remain in the
+  heap until <a href="#p24294">garbage collected</a>.
+ </li>
+ <li><a name="p26034" class="glabel"/><b>history</b>
+   a mechanism which records the results for an interactive
+  computation. Using the history facility, users can save computations,
+  review previous steps of a computation, and restore a previous
+  interactive session at some later time. For details, issue the system
+  command <div class="gsyntax">)history ?</div> to the interpreter. See
+  also <a href="#p21847">frame</a>.
+ </li>
+ <li><a name="p26380" class="glabel"/><b>ideal</b>
+   <div class="gsyntax">(algebra)</div> a subset of a ring that is
+  closed under addition and multiplication by arbitrary ring elements,
+  i.e. it<div class="gspad">'s</div> a module over the ring.
+ </li>
+ <li><a name="p26553" class="glabel"/><b>identifier</b>
+   <div class="gsyntax">(syntax)</div> an Axiom name; a 
+  <a href="#p31774">literal</a> of type <div class="gtype">Symbol</div>. An
+  identifier begins with an alphabetical character or % and may be
+  followed by alphabetic characters, digits, ? or !. Certain
+  distinquished <a href="#p44698">reserved words</a> are not allowed as
+  identifiers but have special meaning in the Axiom .
+ </li>
+ <li><a name="p26892" class="glabel"/><b>immutable</b>
+   an object is immutable if it cannot be changed by an 
+  <a href="#p36041">operation</a>; not a <a href="#p34398">mutable
+  object</a>. Algebraic objects generally immutable: changing an
+  algebraic expression involves copying parts of the original
+  object. One exception is a matrix object of type 
+  <div class="gtype">Matrix</div>. Examples of mutable objects are data
+  structures such as those of type <div class="gtype">List</div>. See
+  also <a href="#p39949">pointer semantics</a>.
+ </li>
+ <li><a name="p27325" class="glabel"/><b>implicit export</b>
+   (of a domain or category) any <a href="#p4093">attribute</a> or 
+  <a href="#p36041">operation</a> which is either an explicit export or
+  else an explicit export of some category which an explicit category
+  export <a href="#p20757">extends</a>.
+ </li>
+ <li><a name="p27564" class="glabel"/><b>index</b>
+  <ol>
+   <li> 
+    a variable that counts the number of times a 
+    <a href="#p33121">loop</a> is repeated. 
+   </li>
+   <li> 
+    the "address" of an element in a data structure (see also category 
+    <div class="gtype">LinearAggregate</div>).
+   </li>
+  </ol>
+ </li>
+ <li><a name="p27746" class="glabel"/><b>infix</b>
+   <div class="gsyntax">(syntax)</div> an 
+  <a href="#p36278">operator</a> placed between two 
+  <a href="#p35946">operands</a>; also called a 
+  <div class="gsyntax">binary operator</div>, e.g. 
+  <div class="gspad">a + b</div>. An infix operator may also be used as a 
+  <a href="#p42559">prefix</a>, e.g. <div class="gspad">+(a, b)</div> is
+  also permissable in the Axiom language. Infix operators have a
+  relative <a href="#p42098">precedence</a>.
+ </li>
+ <li><a name="p28103" class="glabel"/><b>input area</b>
+  a rectangular area on a screen into which users can enter text.
+ </li>
+ <li><a name="p28185" class="glabel"/><b>instantiate</b>
+  to build a <a href="#p6628">category</a>,  <a href="#p17507">domain</a>,  
+  or <a href="#p36778">package</a> at run-time
+ </li>
+ <li><a name="p28282" class="glabel"/><b>integer</b>
+   a <a href="#p31774">literal</a> object of domain 
+  <div class="gtype">Integer</div>, the class of integers with an unbounded
+  number of digits. Integer literals consist of one or more consecutive
+  digits (0-9) with no embedded blanks. Underscores can be used to
+  separate digits in long integers if desirable.
+ </li>
+ <li><a name="p28570" class="glabel"/><b>interactive</b>
+  a system where the user interacts with the computer step-by-step
+ </li>
+ <li><a name="p28640" class="glabel"/><b>interpreter</b>
+   the subsysystem of Axiom responsible for handling user input during
+  an interactive session. The following somewhat simplified description
+  of the typical action of the interpreter. The interpreter parsers the
+  user<div class="gspad">'s</div> input expression to create an
+  expression tree then does a bottom-up traversal of the tree. Each
+  subtree encountered which is not a value consists of a root node
+  denoting an operation name and one or more leaf nodes denoting 
+  <a href="#p35946">operands</a>. The interpreter resolves type mismatches
+  and uses type-inferencing and a library database to determine
+  appropriate types of the operands and the result, and an operation to
+  be performed. The interpreter then builds a domain to perform the
+  indicated operation, then invokes a function from the domain to
+  compute a value. The subtree is then replaced by that value and the
+  process continues. Once the entire tree has been processed, the value
+  replacing the top node of the tree is displayed back to the user as
+  the value of the expression.
+ </li>
+ <li><a name="p29675" class="glabel"/><b>invocation</b>
+   (of a function) the run-time process involved in 
+  <a href="#p19167">evaluating</a> a <a href="#p22911">function</a> 
+  <a href="#p2473">application</a>. This process has two steps. First, a
+  local <a href="#p19131">environment</a> is created where 
+  <a href="#p21594">formal arguments</a> are locally 
+  <a href="#p4735">bound</a> by <a href="#p3322">assignment</a> to their
+  respective actual <a href="#p2885">argument</a>. Second, the 
+  <a href="#p23911">function body</a> is evaluated in that local
+  environment. The evaluation of a function is terminated either by
+  completely evaluating the function body or by the evaluation of a 
+  <div class="gfunction">return</div> expression.
+ </li>
+ <li><a name="p30286" class="glabel"/><b>iteration</b>
+  repeated evaluation of an expression or a sequence of
+  expressions. Iterations use the reserved words 
+  <div class="gfunction">for</div>, <div class="gfunction">while</div>, and
+  <div class="gfunction">repeat</div>.
+ </li>
+ <li><a name="p30459" class="glabel"/><b>Join</b>
+   a primitive Axiom function taking two or more categories as arguments
+  and producing a category containing all of the operations and
+  attributes from the respective categories.
+ </li>
+ <li><a name="p30645" class="glabel"/><b>KCL</b>
+   Kyoto Common LISP, a version of <a href="#p10064">Common LISP</a>
+  which features compilation of the compilation of LISP into the 
+  <div class="gspad">C</div> Programming Language
+ </li>
+ <li><a name="p30801" class="glabel"/><b>library</b>
+   In Axiom , a coolection of compiled modules respresenting the a 
+  <a href="#p6628">category</a> or <a href="#p17507">domain</a>
+  constructor.
+ </li>
+ <li><a name="p30933" class="glabel"/><b>lineage</b>
+   the sequence of <a href="#p13571">default packages</a> for a given
+  domain to be searched during 
+  <a href="#p17853">dynamic lookup</a>. 
+  This sequence is computed first by ordering the category
+  <a href="#p2335">ancestors</a> of the domain according to their <div
+  class="gsyntax">level number</div>, an integer equal to to the
+  minimum distance of the domain from the category. Parents have level
+  1, parents of parents have level 2, and so on. Among categories with
+  equal level numbers, ones which appear in the left-most branches of
+  <div class="gsyntax">Join</div><div class="gspad">s</div> in the
+  source code come first. See also <a href="#p17853">dynamic lookup</a>.
+ </li>
+ <li><a name="p31518" class="glabel"/><b>LISP</b>
+   acronymn for List Processing Language, a language designed for the
+  manipulation of nonnumerical data. The Axiom library is translated
+  into LISP then compiled into machine code by an underlying LISP.
+ </li>
+ <li><a name="p31730" class="glabel"/><b>list</b>
+  an object of a <div class="gtype">List</div> domain.
+ </li>
+ <li><a name="p31774" class="glabel"/><b>literal</b>
+   an object with a special syntax in the language. In Axiom , there are
+  five types of literals: <a href="#p5256">booleans</a>, 
+  <a href="#p28282">integers</a>, <a href="#p21186">floats</a>, 
+  <a href="#p48077">strings</a>, and <a href="#p49347">symbols</a>.
+ </li>
+ <li><a name="p31998" class="glabel"/><b>local</b>
+   <div class="gsyntax">(syntax)</div> A keyword used in user-defined
+  functions to declare that a variable is a 
+  <a href="#p32278">local variable</a> of that function. 
+  Because of default assumptions on
+  variables, such a declaration is not necessary but is available to the
+  user for clarity when appropriate.
+ </li>
+ <li><a name="p32278" class="glabel"/><b>local variable</b>
+   (of a function) a variable <a href="#p4735">bound</a> by that
+  function and such that its binding is invisible to any function that
+  function calls. Also called a <div class="gsyntax">lexical</div>
+  variable. By default in the interpreter:
+  <ol>
+   <li> 
+    any variable <div class="gspad">x</div> which appears on the left hand
+    side of an assignment is regarded a local variable of that
+    function. If the intention of an assignment is to change the value of
+    a <a href="#p24833">global variable</a> <div class="gspad">x</div>,
+    the body of the function must then contain the statement 
+    <div class="gspad">free x</div>.
+   </li>
+   <li> 
+    any other variable is regarded as a <a href="#p22739">free variable</a>. 
+   </li>
+   <li>
+     An optional declaration <div class="gspad">local x</div> is available
+    to explicitly declare a variable to be a local variable. All 
+    <a href="#p21594">formal parameters</a> to the function can be regarded
+    as local variables to the function.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p33121" class="glabel"/><b>loop</b>
+  <ol>
+   <li> an expression containing a <div class="gfunction">repeat</div>
+   </li>
+   <li> 
+    a collection expression having a <div class="gfunction">for</div> or a
+    <div class="gfunction">while</div>, e.g. 
+    <div class="gspad">[f(i) for i in S]</div>.
+  </li>
+  </ol>
+ </li>
+ <li><a name="p33300" class="glabel"/><b>loop body</b>
+   the part of a loop following the <div class="gfunction">repeat</div>
+  that tells what to do each iteration. For example, the body of the
+  loop <div class="gspad">for x in S repeat B</div> is 
+  <div class="gspad">B</div>. For a collection expression, the body of the
+  loop precedes the initial <div class="gfunction">for</div> or 
+  <div class="gfunction">while</div>.
+ </li>
+ <li><a name="p33585" class="glabel"/><b>macro</b>
+  <ol>
+   <li> 
+    <div class="gsyntax">(syntax)</div> An expression of the form 
+    <div class="gspad">macro a == b</div> where <div class="gspad">a</div> is a
+    <a href="#p49347">symbol</a> causes <div class="gspad">a</div> to be
+    textually replaced by the expression <div class="gspad">b</div> at 
+    <a href="#p38242">parse</a> time.
+   </li>
+   <li> 
+    An expression of the form <div class="gspad">macro f(a) == b</div>
+    defines a parameterized macro expansion for a parameterized form 
+    <div class="gspad">f</div> This macro causes a form 
+    <div class="gspad">f</div>(<div class="gspad">x</div>) to be textually
+    replaced by the expression <div class="gspad">c</div> at parse time,
+    where <div class="gspad">c</div> is the expression obtained by
+    replacing <div class="gspad">a</div> by <div class="gspad">x</div>
+    everywhere in <div class="gspad">b</div>. See also 
+    <a href="#p13754">definition</a> where a similar substitution is done
+    during <a href="#p19167">evaluation</a>.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p34233" class="glabel"/><b>mode</b>
+   a type expression containing a question-mark 
+  (<div class="gsyntax">?</div>). For example, the mode 
+  <div class="gsyntax">P ?</div> designates <div class="gsyntax">the class
+  of all polynomials over an arbitrary ring</div>.
+ </li>
+ <li><a name="p34266" class="glabel"/><b>monoid</b>
+  is a set with a single, associative operation and an identity element
+ </li>
+ <li><a name="p34398" class="glabel"/><b>mutable</b>
+   objects which contain <a href="#p39600">pointers</a> to other objects
+  and which have operations defined on them which alter these
+  pointers. Contrast <a href="#p26892">immutable</a>. Axiom uses 
+  <a href="#p39949">pointer semantics</a> as does 
+  <a href="#p31518">LISP</a> in contrast with many other languages such as
+  Pascal which use <a href="#p12604">copying semantics</a>. See 
+  <a href="#p39949">pointer semantics</a> for details.
+ </li>
+ <li><a name="p34778" class="glabel"/><b>name</b>
+  <ol>
+   <li>
+    a <a href="#p49347">symbol</a> denoting a <a href="#p52894">variable</a>,
+    i.e. the variable <div class="gspad">x</div>. 
+   </li>
+   <li> 
+    a <a href="#p49347">symbol</a> denoting an 
+    <a href="#p36041">operation</a>,  i.e. the operation
+    <div class="gspad">divide: (Integer, Integer) -> Integer</div>.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p35023" class="glabel"/><b>nullary</b>
+  a function with no arguments,  
+  e.g. <div class="gfunction">characteristic</div>.
+ </li>
+ <li><a name="p35104" class="glabel"/><b>nullary</b>
+  operation or function with <a href="#p3173">arity</a> 0
+ </li>
+ <li><a name="p35156" class="glabel"/><b>Object</b>
+   a category with no operations or attributes,  from which most categories
+   in Axiom  are <a href="#p8634">category extensions</a>.
+ </li>
+ <li><a name="p35301" class="glabel"/><b>object</b>
+   a data entity created or manipulated by programs. Elements of
+  domains, functions, and domains themselves are objects. Whereas
+  categories are created by functions, they cannot be dynamically
+  manipulated in the current system and are thus not considered as
+  objects. The most basic objects are <a href="#p31774">literals</a>;
+  all other objects must be created 
+  <a href="#p22911">functions</a>. Objects can refer to other objects using
+  <a href="#p39600">pointers</a>. Axiom language uses 
+  <a href="#p39949">pointer semantics</a> when dealing with 
+  <a href="#p34398">mutable</a> objects.
+ </li>
+ <li><a name="p35854" class="glabel"/><b>object code</b>
+   code which can be directly executed by hardware; also known as 
+  <div class="gsyntax">machine language</div>.
+ </li>
+ <li><a name="p35946" class="glabel"/><b>operand</b>
+   an argument of an <a href="#p36278">operator</a> (regarding an
+  operator as a <a href="#p22911">function</a>).
+ </li>
+ <li><a name="p36041" class="glabel"/><b>operation</b>
+   an abstraction of a <a href="#p22911">function</a>, described by a 
+  <a href="#p46813">signature</a>. For example, 
+  <div align="center" class="gspad">
+   fact: NonNegativeInteger -> NonNegativeInteger
+  </div>
+  describes an operation for "the factorial of a (non-negative) integer".
+ </li>
+ <li><a name="p36278" class="glabel"/><b>operator</b>
+   special reserved words in the language such as 
+  <div class="gfunction">+</div> and <div class="gfunction">*</div>;
+  operators can be either <a href="#p42559">prefix</a> or 
+  <a href="#p27746">infix</a> and have a relative 
+  <a href="#p42098">precedence</a>.
+ </li>
+ <li><a name="p36465" glabel="class"/><b>overloading</b>
+   the use of the same name to denote distinct functions; a function is
+  identified by a <a href="#p46813">signature</a> identifying its name,
+  the number and types of its arguments, and its return types. If two
+  functions can have identical signatures, a
+  <a href="#p37520">package call</a> must be made to distinquish the two.
+ </li>
+ <li><a name="p36778" class="glabel"/><b>package</b>
+   a domain whose exported operations depend solely on the parameters
+  and other explicit domains, e.g. a package for solving systems of
+  equations of polynomials over any field, e.g. floats, rational
+  numbers, complex rational functions, or power series. Facilities for
+  integration, differential equations, solution of linear or polynomial
+  equations, and group theory are provided by "packages". Technically, a
+  package is a domain which has no <a href="#p46813">signature</a>
+  containing the symbol $. While domains intuitively provide
+  computational objects you can compute with, packages intuitively
+  provide functions (<a href="#p41450">polymorphic</a> functions) which
+  will work over a variety of datatypes.
+ </li>
+ <li><a name="p37520" class="glabel"/><b>package call</b>
+   <div class="gsyntax">(syntax)</div> an expression of the form 
+  <div class="gspad">e $ D</div> where <div class="gspad">e</div> is an 
+  <a href="#p2473">application</a> and <div class="gspad">D</div> denotes
+  some <a href="#p36778">package</a> (or <a href="#p17507">domain</a>).
+ </li>
+ <li><a name="p37696" class="glabel"/><b>package call</b>
+   <div class="gsyntax">(syntax)</div> an expression of the form 
+  <div class="gspad">f(x, y)$D</div> used to identify that the function 
+  <div class="gspad">f</div> is to be one from <div class="gspad">D</div>.
+ </li>
+ <li><a name="p37833" class="glabel"/><b>package constructor</b>
+  same as <a href="#p16173">domain constructor</a>.
+ </li>
+ <li><a name="p37878" class="glabel"/><b>parameter</b>
+  see <a href="#p2885">argument</a>
+ </li>
+ <li><a name="p37908" class="glabel"/><b>parameterized datatype</b>
+   a domain that is built on another, for example, polynomials with
+  integer coefficients.
+ </li>
+ <li><a name="p38004" class="glabel"/><b>parameterized form</b>
+   a expression of the form <div class="gspad">f(x, y)</div>, an 
+  <a href="#p2473">application</a> of a function.
+ </li>
+ <li><a name="p38095" class="glabel"/><b>parent</b>
+   (of a domain) a category which is explicitly declared in the source
+  code definition for the domain to be an <a href="#p20171">export</a>
+  of the domain.
+ </li>
+ <li><a name="p38242" class="glabel"/><b>parse</b>
+  <ol>
+   <li>
+     (verb) to produce an internal representation of a user input string;
+    the resultant internal representation is then "interpreted" by Axiom
+    to perform some indicated action.
+   </li>
+   <li>
+    the transformation of a user input string representing a valid Axiom
+    expression into an internal representation as a tree-structure.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p38572" class="glabel"/><b>partially ordered set</b>
+   a set with a reflexive, transitive and antisymetric 
+  <a href="#p4684">binary</a> operation.
+ </li>
+ <li><a name="p38600" class="glabel"/><b>pattern</b>
+  The left hand side of a rewrite rule is called a pattern. Rewrite rules
+  can be used to perform pattern matching, usually for simplification.
+  The right hand side of a rule is called the 
+  <a href="p49000">substitution</a>.
+ </li>
+ <li><a name="p38661" class="glabel"/><b>pattern match</b>
+  <ol>
+   <li>
+     (on expressions) Given a expression called a "subject" 
+    <div class="gspad">u</div>, the attempt to rewrite 
+    <div class="gspad">u</div> using a set of "rewrite rules". Each rule has
+    the form <div class="gspad">A == B</div> where 
+    <div class="gspad">A</div> indicates a expression called a "pattern" and
+    <div class="gspad">B</div> denotes a "replacement". The meaning of
+    this rule is "replace <div class="gspad">A</div> by 
+    <div class="gspad">B"</div>. If a given pattern <div class="gspad">A</div>
+    matches a subexpression of <div class="gspad">u</div>, that
+    subexpression is replaced by <div class="gspad">B</div>. Once
+    rewritten, pattern matching continues until no further changes occur.
+   </li>
+   <li>
+     (on strings) the attempt to match a string indicating a "pattern" to
+    another string called a "subject", for example, for the purpose of
+    identifying a list of names. In a browser, users may enter 
+    <a href="#p46294">search strings</a> for the purpose of identifying
+    constructors, operations, and attributes.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p39400" class="glabel"/><b>pattern variable</b>
+  In a rule a symbol which is not a recognized function acts as a
+  pattern variable and is free to match any subexpression.
+ </li>
+ <li><a name="p39494" class="glabel"/><b>pile</b>
+   alternate syntax for a block, using indentation and column alignment
+  (see also <a href="#p5086">block</a>).
+ </li>
+ <li><a name="p39600" class="glabel"/><b>pointer</b>
+   a reference implemented by a link directed from one object to another
+  in the computer memory. An object is said to 
+  <div class="gsyntax">refer</div> to another if it has a pointer to that
+  other object. Objects can also refer to themselves (cyclic references
+  are legal). Also more than one object can refer to the same
+  object. See also <a href="#p39949">pointer semantics</a>.
+ </li>
+ <li><a name="p39949" class="glabel"/><b>pointer semantics</b>
+   the programming language semantics used in languages such as LISP
+  which allow objects to be <a href="#p34398">mutable</a>. Consider the
+  following sequence of Axiom statements:
+  <ol>
+   <li> <div class="gspad">x : Vector Integer := [1, 4, 7]</div> 
+   </li>
+   <li> <div class="gspad">y := x</div> 
+   </li>
+   <li> <div class="gspad">swap!(x, 2, 3)</div> 
+   </li>
+  </ol>
+  The function <div class="gfunction">swap!</div> from 
+  <div class="gtype">Vector</div> is used to interchange the 2nd and 3rd
+  value in the list <div class="gspad">x</div> producing the value 
+  <div class="gspad">[1, 7, 4]</div>. What value does 
+  <div class="gspad">y</div> have after evaluation of the third statement?
+  The answer is different in Axiom than it is in a language with 
+  <a href="#p12604">copying semantics</a>. In Axiom , first the vector 
+  [1, 2, 3] is created and the variable <div class="gspad">x</div> set to 
+  <a href="#p39600">point</a> to this object. Let
+  <div class="gspad">'s</div> call this object 
+  <div class="gspad">V</div>. Now <div class="gspad">V</div> refers to its 
+  <a href="#p26892">immutable</a> components 1, 2, and 3. Next, the
+  variable <div class="gspad">y</div> is made to point to 
+  <div class="gspad">V</div> just as <div class="gspad">x</div> does. Now the
+  third statement interchanges the last 2 elements of 
+  <div class="gspad">V</div> (the <div class="gsyntax">!</div> at the end of
+  the name <div class="gfunction">swap!</div> from 
+  <div class="gtype">Vector</div> tells you that this operation is
+  destructive, that is, it changes the elements <div class="gsyntax">in
+  place</div>). Both <div class="gspad">x</div> and 
+  <div class="gspad">y</div> perceive this change to 
+  <div class="gspad">V</div>. Thus both <div class="gspad">x</div> and 
+  <div class="gspad">y</div> then have the value 
+  <div class="gspad">[1, 7, 4]</div>. 
+  In Pascal, the second statement causes a copy of 
+  <div class="gspad">V</div> to be stored under 
+  <div class="gspad">y</div>. Thus the change to <div class="gspad">V</div>
+  made by the third statement does not affect 
+  <div class="gspad">y</div>.
+ </li>
+ <li><a name="p41450" class="glabel"/><b>polymorphic</b>
+   a <a href="#p22911">function</a> parameterized by one or more 
+  <a href="#p17507">domains</a>; a <a href="#p2267">algorithm</a> defined
+  <a href="#p6628">categorically</a>. Every function defined in a domain
+  or package constructor with a domain-valued parameter is
+  polymorphic. For example, the same matrix 
+  <div class="gfunction">*</div> function is used to multiply "matrices over
+  integers" as "matrices over matrices over integers"
+ </li>
+ <li><a name="p41972" class="glabel"/><b>postfix</b>
+   an <a href="#p36278">operator</a> that follows its single 
+  <a href="#p35946">operand</a>. Postfix operators are not available in
+  Axiom.
+ </li>
+ <li><a name="p42098" class="glabel"/><b>precedence</b>
+   <div class="gsyntax">(syntax)</div> refers to the so-called 
+  <div class="gsyntax">binding power</div> of an operator. For example, 
+  <div class="gspad">*</div> has higher binding power than 
+  <div class="gspad">+</div> so that the expression
+  <div class="gspad">a + b * c</div> is equivalent to
+  <div class="gspad">a + (b * c)</div>.
+ </li>
+ <li><a name="p42318" class="glabel"/><b>precision</b>
+   the number of digits in the specification of a number, e.g. as set by
+  <div class="gfunction">precision</div> from <div class="gtype">Float</div>.
+ </li>
+ <li><a name="p42440" class="glabel"/><b>predicate</b>
+  <ol>
+   <li> a Boolean valued function,  e.g. 
+        <div class="gspad">odd: Integer -> Boolean</div>. 
+   </li>
+   <li> an Boolean valued expression
+   </li>
+  </ol>
+ </li>
+ <li><a name="p42559" class="glabel"/><b>prefix</b>
+   <div class="gsyntax">(syntax)</div> an 
+  <a href="#p36278">operator</a> such as <div class="gspad">-</div> and
+  <div class="gspad">not</div> that is written 
+  <div class="gsyntax">before</div> its single 
+  <a href="#p35946">operand</a>. Every function of one argument can be used
+  as a prefix operator. For example, all of the following have
+  equivalent meaning in Axiom : <div class="gspad">f(x)</div>, 
+  <div class="gspad">f x</div>, and <div class="gspad">f.x</div>. See also 
+  <a href="#p17269">dot notation</a>.
+ </li>
+ <li><a name="p42917" class="glabel"/><b>quote</b>
+   the prefix <a href="#p36278">operator</a> 
+  <div class="gfunction">'</div> meaning <div class="gsyntax">do not
+  evaluate</div>.
+ </li>
+ <li><a name="p43000" class="glabel"/><b>Record</b>
+   (basic domain constructor) a domain constructor used to create a
+  inhomogeneous aggregate composed of pairs of "selectors" and 
+  <a href="#p52710">values</a>. A Record domain is written in the form 
+  <div class="gspad">Record(a1:D1, ..., an:Dn)</div> 
+  (<div class="gspad">n</div> > 0) where <div class="gspad">a1</div>, ...,
+  <div class="gspad">an</div> are identifiers called the 
+  <div class="gsyntax">selectors</div> of the record, and 
+  <div class="gspad">D1</div>, ..., <div class="gspad">Dn</div> are domains
+  indicating the type of the component stored under selector 
+  <div class="gspad">an</div>.
+ </li>
+ <li><a name="p43448" class="glabel"/><b>recurrence relation</b>
+   A relation which can be expressed as a function 
+  <div class="gspad">f</div> with some argument <div class="gspad">n</div>
+  which depends on the value of <div class="gspad">f</div> at 
+  <div class="gspad">k</div> previous values. In many cases, Axiom will
+  rewrite a recurrence relation on compilation so as to 
+  <a href="#p5499">cache</a> its previous <div class="gspad">k</div> values
+  and therefore make the computation significantly more efficient.
+ </li>
+ <li><a name="p43806" class="glabel"/><b>recursion</b>
+   use of a self-reference within the body of a function. Indirect
+  recursion is when a function uses a function below it in the call
+  chain.
+ </li>
+ <li><a name="p43948" class="glabel"/><b>recursive</b>
+  <ol>
+   <li> A function that calls itself,  either directly or indirectly through
+        another function. 
+   </li>
+   <li> self-referential. See also <a href="#p43948">recursive</a>.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p44097" class="glabel"/><b>reference</b>
+  see <a href="#p39600">pointer</a>
+ </li>
+ <li><a name="p44126" class="glabel"/><b>Rep</b>
+   a special identifier used as <a href="#p32278">local variable</a> of
+  a domain constructor body to denote the representation domain for
+  objects of a domain.
+ </li>
+ <li><a name="p44277" class="glabel"/><b>representation</b>
+   a <a href="#p17507">domain</a> providing a data structure for
+  elements of a domain; generally denoted by the special identifier 
+  <a href="#p44126">Rep</a> in the Axiom programming language. As domains
+  are <a href="#p725">abstract datatypes</a>, this representation is not
+  available to users of the domain, only to functions defined in the 
+  <a href="#p23911">function body</a> for a domain constructor. Any domain
+  can be used as a representation.
+ </li>
+ <li><a name="p44698" class="glabel"/><b>reserved word</b>
+   a special sequence of non-blank characters with special meaning in
+  the Axiom language. Examples of reserved words are names such as 
+  <div class="gfunction">for</div>, <div class="gfunction">if</div>, and 
+  <div class="gfunction">free</div>, operator names such as 
+  <div class="gfunction">+</div> and <div class="gspad">mod</div>, special
+  character strings such as <div class="gspad">==</div> and 
+  <div class="gspad">:=</div>.
+ </li>
+ <li><a name="p45044" class="glabel"/><b>retraction</b>
+   to move an object in a parameterized domain back to the underlying
+  domain, for example to move the object <div class="gspad">7</div> from
+  a "fraction of integers" 
+  (domain <div class="gtype">Fraction Integer</div>) to
+  "the integers" (domain <div class="gtype">Integer</div>).
+ </li>
+ <li><a name="p45280" class="glabel"/><b>return</b>
+   when leaving a function, the value of the expression following 
+  <div class="gfunction">return</div> becomes the value of the function.
+ </li>
+ <li><a name="p45405" class="glabel"/><b>ring</b>
+   a set with a commutative addition, associative multiplication, a unit
+  element, and multiplication distributes over addition and subtraction.
+ </li>
+ <li><a name="p45557" class="glabel"/><b>rule</b>
+   <div class="gsyntax">(syntax)</div> 1. An expression of the form
+  <div class="gspad">rule A == B</div> indicating a "rewrite
+  rule". 2. An expression of the form 
+  <div class="gspad">rule(R1;...;Rn)</div> 
+  indicating a set of "rewrite rules" 
+  <div class="gspad">R1</div>, ..., <div class="gspad">Rn</div>. See 
+  <a href="#p38661">pattern matching</a> for details.
+ </li>
+ <li><a name="p45818" class="glabel"/><b>run-time</b>
+   the time of doing a computation. Contrast 
+  <a href="#p10167">compile-time</a>. rather than prior to it; 
+  <a href="#p17507">dynamic</a> as opposed to 
+  <a href="#p47594">static</a>. For example, the decision of the intepreter
+  to build a structure such as "matrices with power series entries" in
+  response to user input is made at run-time.
+ </li>
+ <li><a name="p46129" class="glabel"/><b>run-time check</b>
+   an error-checking which can be done only when the program receives
+  user input; for example, confirming that a value is in the proper
+  range for a computation.
+ </li>
+ <li><a name="p46200" class="glabel"/><b>search order</b>
+   the sequence of <a href="#p13571">default packages</a> for a given
+  domain to be searched during <a href="#p17853">dynamic
+  lookup</a>. This sequence is computed first by ordering the category
+  <a href="#p2335">ancestors</a> of the domain according to their 
+  <div class="gsyntax">level number</div>, an integer equal to to the
+  minimum distance of the domain from the category. Parents have level
+  1, parents of parents have level 2, and so on. Among categories with
+  equal level numbers, ones which appear in the left-most branches of
+  <div class="gsyntax">Join</div><div class="gspad">s</div> in the
+  source code come first. See also <a href="#p17853">dynamic lookup</a>.
+ </li>
+ <li><a name="p46294" class="glabel"/><b>search string</b>
+  a string entered into an <a href="#p28103">input area</a> on a screen
+ </li>
+ <li><a name="p46372" class="glabel"/><b>selector</b>
+  an identifier used to address a component value of a
+  <a href="p43000">Record</a> datatype.
+ </li>
+ <li><a name="p46454" class="glabel"/><b>semantics</b>
+   the relationships between symbols and their meanings. The rules for
+  obtaining the <div class="gsyntax">meaning</div> of any syntactically
+  valid expression.
+ </li>
+ <li><a name="p46594" class="glabel"/><b>semigroup</b>
+   <div class="gsyntax">(algebra)</div> a <a href="#p34266">monoid</a>
+  which need not have an identity; it is closed and associative.
+ </li>
+ <li><a name="p46699" class="glabel"/><b>side effect</b>
+   action which changes a component or structure of a value. See 
+  <a href="#p14365">destructive operation</a> for details.
+ </li>
+ <li><a name="p46813" class="glabel"/><b>signature</b>
+   <div class="gsyntax">(syntax)</div> an expression describing an 
+  <a href="#p36041">operation</a>. A signature has the form as 
+  <div class="gspad">name : source -> target</div>, where 
+  <div class="gspad">source</div> gives the type of the arguments of the
+  operation, and <div class="gspad">target</div> gives the type of the
+  result.
+ </li>
+ <li><a name="p47066" class="glabel"/><b>small float</b>
+  the domain for hardware floating point arithmetic as provided by the
+  computer hardware.
+ </li>
+ <li><a name="p47159" class="glabel"/><b>small integer</b>
+  the domain for hardware integer arithmetic. as provided by the computer 
+  hardware.
+ </li>
+ <li><a name="p47246" class="glabel"/><b>source</b>
+   the <a href="#p50664">type</a> of the argument of a 
+  <a href="#p22911">function</a>; the type expression before the 
+  <div class="gspad">-></div> in a <a href="#p46813">signature</a>. For
+  example, the source of 
+  <div class="gspad">f : (Integer, Integer) -> Integer</div> 
+  is <div class="gspad">(Integer, Integer)</div>.
+ </li>
+ <li><a name="p47486" class="glabel"/><b>sparse</b>
+   data structure whose elements are mostly identical (a sparse matrix
+  is one filled with mostly zeroes).
+ </li>
+ <li><a name="p47594" class="glabel"/><b>static</b>
+  that computation done before run-time, such as compilation. Contrast
+  <a href="#p17507">dynamic</a>.
+ </li>
+ <li><a name="p47691" class="glabel"/><b>step number</b>
+   the number which precedes user input lines in an interactive session;
+  the output of user results is also labeled by this number.
+ </li>
+ <li><a name="p47825" class="glabel"/><b>stream</b>
+   an object of <div class="gtype">Stream(R)</div>, a generalization of
+  a <a href="#p31730">list</a> to allow an infinite number of
+  elements. Elements of a stream are computed "on demand". Strings are
+  used to implement various forms of power series.
+ </li>
+ <li><a name="p48077" class="glabel"/><b>string</b>
+   an object of domain <div class="gtype">String</div>. Strings are 
+  <a href="#p31774">literals</a> consisting of an arbitrary sequence of 
+  <a href="#p9278">characters</a> surrounded by double-quotes 
+  (<div class="gfunction">"</div>), e.g. 
+  <div class="gspad">"Look here!"</div>.
+ </li>
+ <li><a name="p48303" class="glabel"/><b>subdomain</b>
+   <div class="gsyntax">(basic concept)</div> a 
+  <a href="#p17507">domain</a> together with a 
+  <a href="#p42440">predicate</a> characterizing which members of the
+  domain belong to the subdomain. The exports of a subdomain are usually
+  distinct from the domain itself. A fundamental assumption however is
+  that values in the subdomain are automatically 
+  <a href="#p9572">coerceable</a> to values in the domain. For example, if
+  <div class="gspad">n</div> and <div class="gspad">m</div> are declared
+  to be members of a subdomain of the integers, then 
+  <div class="gsyntax">any</div> <a href="#p4684">binary</a> operation from
+  <div class="gtype">Integer</div> is available on 
+  <div class="gspad">n</div> and <div class="gspad">m</div>. On the other
+  hand, if the result of that operation is to be assigned to, say, 
+  <div class="gspad">k</div>, also declared to be of that subdomain, a 
+  <a href="#p45818">run-time</a> check is generally necessary to ensure
+  that the result belongs to the subdomain.
+ </li>
+ <li><a name="p49000" class="glabel"/><b>substitution</b>
+  The right hand side of a rule is called the substitution.
+  The left hand side of a rewrite rule is called a 
+  <a href="p38600">pattern</a>. Rewrite rules
+  can be used to perform pattern matching, usually for simplification.
+ </li>
+ <li><a name="p49128" class="glabel"/><b>such that clause</b>
+   the use of <div class="gfunction">|</div> followed by an expression
+  to filter an iteration.
+ </li>
+ <li><a name="p49209" class="glabel"/><b>suffix</b>
+   <div class="gsyntax">(syntax)</div> an 
+  <a href="#p36278">operator</a> which placed after its operand. Suffix
+  operators are not allowed in the Axiom language.
+ </li>
+ <li><a name="p49347" class="glabel"/><b>symbol</b>
+   objects denoted by <a href="#p26553">identifier</a> 
+  <a href="#p31774">literals</a>; an element of domain 
+  <div class="gtype">Symbol</div>. The interpreter defaultly converts a
+  symbol <div class="gspad">x</div> into 
+  <div class="gtype">Variable(x)</div>.
+ </li>
+ <li><a name="p49538" class="glabel"/><b>syntax</b>
+  rules of grammar,  punctuation etc. for forming correct expressions.
+ </li>
+ <li><a name="p49613" class="glabel"/><b>system commands</b>
+   top-level Axiom statements that begin with 
+  <div class="gsyntax">)</div>. System commands allow users to query the
+  database, read files, trace functions, and so on.
+ </li>
+ <li><a name="p49773" class="glabel"/><b>tag</b>
+  an identifier used to discriminate a branch of a
+  <a href="#p51780">Union</a> type.
+ </li>
+ <li><a name="p49851" class="glabel"/><b>target</b>
+   the <a href="#p50664">type</a> of the result of a 
+  <a href="#p22911">function</a>; the type expression following the 
+  <div class="gspad">-></div> in a <a href="#p46813">signature</a>.
+ </li>
+ <li><a name="p49990" class="glabel"/><b>top-level</b>
+  refers to direct user interactions with the Axiom  interpreter.
+ </li>
+ <li><a name="p50064" class="glabel"/><b>totally ordered set</b>
+   <div class="gsyntax">(algebra)</div> a partially ordered set where
+  any two elements are comparable.
+ </li>
+ <li><a name="p50148" class="glabel"/><b>trace</b>
+   use of system function <div class="gcmd">)trace</div> to track the
+  arguments passed to a function and the values returned.
+ </li>
+ <li><a name="p50262" class="glabel"/><b>tuple</b>
+   an expression of two or more other expressions separated by commas,
+  e.g. <div class="gspad">4, 7, 11</div>. Tuples are also used for
+  multiple arguments both for <a href="#p2473">applications</a>
+  (e.g. <div class="gspad">f(x, y)</div>) and in 
+  <a href="#p46813">signatures</a> (e.g. 
+  <div class="gspad">(Integer, Integer) -> Integer</div>). 
+  A tuple is not a data structure, rather a
+  syntax mechanism for grouping expressions.
+ </li>
+ <li><a name="p50664" class="glabel"/><b>type</b>
+   The type of any <a href="#p48303">subdomain</a> is the unique symbol
+  <div class="gsyntax">Category</div>. The type of a
+  <a href="#p17507">domain</a> is any <a href="#p6628">category</a> that
+  domain belongs to. The type of any other object is either the (unique)
+  domain that object belongs to or any <a href="#p48303">subdomain</a>
+  of that domain. The type of objects is in general not unique.
+ </li>
+ <li><a name="p51002" class="glabel"/><b>type checking</b>
+  a system function which determines whether the datatype of an object is
+  appropriate for a given operation.
+ </li>
+ <li><a name="p51114" class="glabel"/><b>type constructor</b>
+  a <a href="#p16173">domain constructor</a> or
+  <a href="#p8355">category constructor</a>.
+ </li>
+ <li><a name="p51189" class="glabel"/><b>type inference</b>
+   when the interpreter chooses the type for an object based on
+  context. For example, if the user interactively issues the definition
+  <div align="center" class="gspad">f(x) == (x + %i)**2</div> then
+  issues <div class="gspad">f(2)</div>, the interpreter will infer the
+  type of <div class="gspad">f</div> to be 
+  <div class="gspad">Integer -> Complex Integer</div>.
+ </li>
+ <li><a name="p51480" class="glabel"/><b>unary</b>
+  operation or function with <a href="#p3173">arity</a> 1
+ </li>
+ <li><a name="p51532" class="glabel"/><b>underlying domain</b>
+   for a <a href="#p17507">domain</a> that has a single domain-valued
+  parameter, the <div class="gsyntax">underlying domain</div> refers to
+  that parameter. For example, the domain "matrices of integers" 
+  (<div class="gtype">Matrix Integer</div>) has underlying domain 
+  <div class="gtype">Integer</div>.
+ </li>
+ <li><a name="p51780" class="glabel"/><b>Union</b>
+   <div class="gsyntax">(basic domain constructor)</div> a domain
+  constructor used to combine any set of domains into a single domain. A
+  Union domain is written in the form 
+  <div class="gspad">Union(a1:D1,..., an:Dn)</div> 
+  (<div class="gspad">n</div> > 0) where 
+  <div class="gspad">a1</div>, ..., <div class="gspad">an</div> are
+  identifiers called the <div class="gsyntax">tags</div> of the union,
+  and <div class="gspad">D1</div>, ..., <div class="gspad">Dn</div> are
+  domains called the <div class="gsyntax">branches</div> of the
+  union. The tags <div class="gspad">ai</div> are optional, but required
+  when two of the <div class="gspad">Di</div> are equal, e.g. 
+  <div class="gspad">Union(inches:Integer, centimeters:Integer)</div>. In the
+  interpreter, values of union domains are automatically coerced to
+  values in the branches and vice-versa as appropriate. See also 
+  <a href="#p6220">case</a>.
+ </li>
+ <li><a name="p52482" class="glabel"/><b>unit</b>
+  <div class="gsyntax">(algebra)</div> an invertible element.
+ </li>
+ <li><a name="p52526" class="glabel"/><b>user function</b>
+  a function defined by a user during an interactive session. Contrast
+  <a href="#p5399">built-in function</a>.
+ </li>
+ <li><a name="p52631" class="glabel"/><b>user variable</b>
+  a variable created by the user at top-level during an interactive session
+ </li>
+ <li><a name="p52710" class="glabel"/><b>value</b>
+  <ol>
+   <li>
+    the result of <a href="#p19167">evaluating</a> an expression. 
+   </li>
+   <li> 
+    a property associated with a <a href="#p52894">variable</a> in a
+    <a href="#p4735">binding</a> in an <a href="#p19131">environment</a>.
+   </li>
+  </ol>
+ </li>
+ <li><a name="p52894" class="glabel"/><b>variable</b>
+  a means of referring to an object but itself is not an object. A
+  variable has a name and an associated <a href="#p4735">binding</a>
+  created by <a href="#p19167">evaluation</a> of Axiom expressions such
+  as <a href="#p12903">declarations</a>, 
+  <a href="#p3322">assignments</a>, and 
+  <a href="#p13754">definitions</a>. In the top-level 
+  <a href="#p19131">environment</a> of the interpreter, variables are 
+  <a href="#p24833">global variables</a>. Such variables can be freely
+  referenced in user-defined functions although a 
+  <a href="#p22113">free</a> declaration is needed to assign values to
+  them. See <a href="#p32278">local variable</a> for details.
+ </li>
+ <li><a name="p53484" class="glabel"/><b>Void</b>
+   the type given when the <a href="#p52710">value</a> and <a
+  href="#p50664">type</a> of an expression are not needed. Also used
+  when there is no guarantee at run-time that a value and predictable
+  mode will result.
+ </li>
+ <li><a name="p53681" class="glabel"/><b>wild card</b>
+   a symbol which matches any substring including the empty string; for
+  example, the search string <div class="gsyntax">*an*</div> matches an
+  word containing the consecutive letters <div class="gsyntax">a</div>
+  and <div class="gsyntax">n</div>
+ </li>
+ <li><a name="p53866" class="glabel"/><b>workspace</b>
+   an interactive record of the user input and output held in an
+  interactive history file. Each user input and corresponding output
+  expression in the workspace has a corresponding <a href="#p47691">step
+  number</a>. The current output expression in the workspace is referred
+  to as <div class="gspad">%</div>. The output expression associated
+  with step number <div class="gspad">n</div> is referred to by <div
+  class="gspad">%%(n)</div>. The <div class="gspad">k</div>-th previous
+  output expression relative to the current step number <div
+  class="gspad">n</div> is referred to by <div class="gspad">%%(-
+  k)</div>. Each interactive <a href="#p21847">frame</a> has its own
+  workspace.
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{graphexamples.xhtml}
+<<graphexamples.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      graphexamples not implemented
+<<page foot>>
+@
+
+\subsection{graphicspage.xhtml}
+<<graphicspage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+Axiom can plot curves and surfaces of various types, as well as
+lists of points in the plane.
+  <table>
+   <tr>
+    <td>
+     <a href="graphexamples.xhtml">Examples</a>
+    </td>
+    <td>
+     See examples of Axiom graphics
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="graph2d.xhtml">2D Graphics</a>
+    </td>
+    <td>
+     Graphics in the real and complex plane
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="graph3d.xhtml">3D Graphics</a>
+    </td>
+    <td>
+     Plot surfaces, curves, or tubes around curves
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="graphviewports.xhtml">Viewports</a>
+    </td>
+    <td>
+     Customize graphics using Viewports
+    </td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{graphviewports.xhtml}
+<<graphviewports.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      graphviewports not implemented
+<<page foot>>
+@
+
+\subsection{graph2d.xhtml}
+<<graph2d.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      graph2d not implemented
+<<page foot>>
+@
+
+\subsection{graph3d.xhtml}
+<<graph3d.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      graph3d not implemented
+<<page foot>>
+@
+
+%%H
+\subsection{htxtoppage.xhtml}
+<<htxtoppage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      htxtoppage not implemented
+<<page foot>>
+@
+
+
+%%I
+\subsection{indefiniteintegral.xhtml}
+<<indefiniteintegral.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    var myform = document.getElementById("form2");
+    return('integrate('+myform.expr.value+','+myform.vars.value+')');
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+  <form id="form2">
+   Enter the function you want to integrate:<br/>
+   <input type="text" id="expr" tabindex="10" size="50" 
+     value="1/(x^2+6)"/><br/>
+   Enter the variable of integration:
+   <input type="text" id="vars" size="5" tabindex="20" value="x"/><br/>
+  </form>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+@
+
+%%J
+\subsection{jenks.xhtml}
+<<jenks.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+ <center>
+  <a href="axbook/book-contents.xhtml">
+   <img src="axbook/ps/bluebayou.png"/>
+  </a>
+ </center>
+ <center>
+  <h1>
+   <a href="axbook/book-contents.xhtml">
+    AXIOM -- Richard D. Jenks and Robert S. Sutor
+   </a>
+  </h1>
+ </center>
+ <center>
+  <h2>
+   <a href="axbook/book-contents.xhtml">
+    The Scientific Computation System
+   </a>
+  </h2>
+ </center>
+ <center>
+  <h2>
+   <a href="axbook/book-contents.xhtml">
+    Volume 0 -- The Textbook
+   </a>
+  </h2>
+ </center>
+ <a href="axbook/book-contents.xhtml#chapter0">
+  Chapter 0: Introduction to Axiom
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter1">
+  Chapter 1: An Overview of Axiom
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter2">
+ Chapter 2: Using Types and Modes
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter3">
+ Chapter 3: Using HyperDoc
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter4">
+ Chapter 4: Input Files and Output Styles
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter5">
+ Chapter 5: Overview of Interactive Language
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter6">
+ Chapter 6: User-Defined Functions, Macros and Rules
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter7">
+ Chapter 7: Graphics
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter8">
+ Chapter 8: Advanced Problem Solving
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter9">
+ Chapter 9: Some Examples of Domains and Packages
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter10">
+ Chapter 10: Interactive Programming
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter11">
+ Chapter 11: Packages
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter12">
+ Chapter 12: Categories
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter13">
+ Chapter 13: Domains
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter14">
+ Chapter 14: Browse
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter15">
+ Chapter 15: What's New in Axiom Version 2.0
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter17">
+ Chapter 17: Categories
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter18">
+ Chapter 18: Domains
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter19">
+ Chapter 19: Packages
+ </a><br/>
+ <a href="axbook/book-contents.xhtml#chapter21">
+ Chapter 21: Programs for AXIOM Images
+ </a><br/>
+<<page foot>>
+@
+
+%%K
+%%L
+
+\subsection{laurentseries.xhtml}
+<<laurentseries.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    myfunc = document.getElementById('function').value;
+    myivar = document.getElementById('ivar').value;
+    mypvar = document.getElementById('pvar').value;
+    myevar = document.getElementById('evar').value;
+    myival = document.getElementById('ival').value;
+    mysval = document.getElementById('sval').value;
+    ans = 'series('+myivar+'+->'+myfunc+','+mypvar+'='+myevar+','+
+         myival+'..,'+mysval+')';
+    alert(ans);
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+  <table>
+   <tr>
+    <td>
+      Enter the formula for the general coefficient of the series:
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <input type="text" id="function" size="80" tabindex="10"
+       value="(-1)^(n-1)/(n+2)"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the index variable for your formula:
+     <input type="text" id="ivar" size="10" tabindex="20" value="n"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the power series variable:
+     <input type="text" id="pvar" size="10" tabindex="30" value="x"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the point about which to expand:
+     <input type="text" id="evar" size="10" tabindex="40" value="0"/>
+    </td>
+   </tr>
+  </table>
+For Laurent Series, the exponent of the power series variable ranges
+from an initial value, an arbitrary integer value, to plus
+infinity; the step size is any positive integer.
+  <table>
+   <tr>
+    <td>
+     Enter the initial value of the index (an integer):
+     <input type="text" id="ival" size="10" tabindex="50" value="-1"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the step size (a positive integer):
+     <input type="text" id="sval" size="10" tabindex="60" value="1"/>
+    </td>
+   </tr>
+  </table>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+
+@
+
+\subsection{linalgpage.xhtml}
+<<linalgpage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <table>
+   <tr>
+    <td>
+     <a href="linintro.xhtml">Introduction</a>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Create and manipulate matrices. Work with the entries of a
+     matrix. Perform matrix arithmetic.
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="lincreate.xhtml">Creating Matrices</a>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Create matrices from scratch and from other matrices
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="linoperations.xhtml">Operations on Matrices</a>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Algebraic manipulations with matrices. Compute the inverse,
+     determinant, and trace of a matrix. Find the rank, nullspace,
+     and row echelon form of a matrix.
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="lineigen.xhtml">Eigenvalues and Eigenvectors</a>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     How to compute eigenvalues and eigenvectors
+    </td>
+   </tr>
+  </table>
+<hr/>
+ <ul>
+  <li>
+   <a href="linhilbert.xhtml">
+    Example: Determinant of a Hilbert Matrix
+   </a>
+  </li>
+  <li>
+   <a href="linpermaent.xhtml">
+    Computing the Permanent
+   </a>
+  </li>
+  <li>
+   <a href="linvectors.xhtml">
+    Working with Vectors
+   </a>
+  </li>
+  <li>
+   <a href="linsquarematrices.xhtml">
+    Working with Square Matrices
+   </a>
+  </li>
+  <li>
+   <a href="lin1darrays.xhtml">
+    Working with One-Dimensional Arrays
+   </a>
+  </li>
+  <li>
+   <a href="lin2darrays.xhtml">
+    Working with Two-Dimensional Arrays
+   </a>
+  </li>
+  <li>
+   <a href="linconversion.xhtml">
+    Conversion (Polynomials of Matrices)
+   </a>
+  </li>
+ </ul>
+<<page foot>>
+@
+
+\subsection{linconversion.xhtml}
+<<linconversion.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      linconversion not implemented
+<<page foot>>
+@
+
+\subsection{lincreate.xhtml}
+<<lincreate.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Creating Matrices</div>
+  <hr/>
+There are many ways to create a matrix from a collection of values or
+from existing matrices.
+
+If the matrix has almost all items equal to the same value, use
+<a href="dbopnew.xhtml">new</a> to create a matrix filled with that value
+and then reset the entries that are different.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="m:Matrix(Integer):=new(3,3,0)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+To change the entry in the second row, third column to 5, use
+<a href="dbopsetelt.xhtml">setelt</a>.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="setelt(m,2,3,5)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+An alternative syntax is to use assignment.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="m(1,2):=10" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+The matrix was destructively modified.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p4']);"
+    value="m" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+If you already have the matrix entries as a list of lists, use
+<a href="dbopmatrix.xhtml">matrix</a>.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="matrix [[1,2,3,4],[0,9,8,7]]" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+If the matrix is diagonal, use
+<a href="dbopdiagonalmatrix.xhtml">diagonalMatrix</a>
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="dm:=diagonalMatrix [1,x^2,x^3,x^4,x^5]" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+Use <a href="dbopsetrowbang.xhtml">setRow!</a> and
+<a href="dbopsetcolumnbang.xhtml">setColumn!</a>
+to change a row or column of a matrix.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p6','p7']);"
+    value="setRow!(dm,5,vector [1,1,1,1,1])" />
+  <div id="ansp7"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p6','p7','p8']);"
+    value="setColumn!(dm,2,vector [y,y,y,y,y])" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+Use <a href="dbopcopy.xhtml">copy</a> to make a copy of a matrix.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p6','p7','p8','p9']);"
+    value="cdm:=copy(dm)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+This is useful if you intend to modify a matrix destructively but want a
+copy of the original.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p6','p7','p8','p9','p10']);"
+    value="setelt(dm,4,1,1-x^7)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p6','p7','p8','p9','p10','p11']);"
+    value="[dm,cdm]" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+Use <a href="dbopsubmatrix.xhtml">subMatrix</a>(dm,2,3,2,4) to extract
+part of an existing matrix. The syntax is
+<pre>
+  subMatrix(m,firstrow,lastrow,firstcol,lastcol)
+</pre>
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p6','p7','p8','p9','p10','p11','p12']);"
+    value="subMatrix(dm,2,3,2,4)" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+To change a submatrix, use 
+<a href="dbopsetsubmatrixbang.xhtml">setsubMatrix!</a>.
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="makeRequest('p13');"
+    value="d:=diagonalMatrix [1.2,-1.3,1.4,-1.5]" />
+  <div id="ansp13"><div></div></div>
+ </li>
+</ul>
+If e is too big to fit where you specify, an error message is displayed. Use
+<a href="dbopsubmatrix.xhtml">subMatrix</a>.
+<ul>
+ <li>
+  <input type="submit" id="p14" class="subbut" 
+    onclick="makeRequest('p14');"
+    value="e:=matrix [[6.7,9.11],[-31.33,67.19]]" />
+  <div id="ansp14"><div></div></div>
+ </li>
+</ul>
+This changes the submatrix of d whose upper left corner is at the first row
+and second column and whose size is that of e.
+<ul>
+ <li>
+  <input type="submit" id="p15" class="subbut" 
+    onclick="handleFree(['p13','p14','p15']);"
+    value="setsubMatrix!(d,1,2,e)" />
+  <div id="ansp15"><div></div></div>
+ </li>
+</ul>
+<ul>
+ <li>
+  <input type="submit" id="p16" class="subbut" 
+    onclick="handleFree(['p13','p14','p15','p16']);"
+    value="d" />
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+Matrices can be joined either horizontally or vertically to make new
+matrices.
+<ul>
+ <li>
+  <input type="submit" id="p17" class="subbut" 
+    onclick="makeRequest('p17');"
+    value="a:=matrix [[1/2,1/3,1/4],[1/5,1/6,1/7]]" />
+  <div id="ansp17"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p18" class="subbut" 
+    onclick="makeRequest('p18');"
+    value="b:=matrix [[3/5,3/7,3/11],[3/13,3/17,3/19]]" />
+  <div id="ansp18"><div></div></div>
+ </li>
+</ul>
+Use <a href="dbophorizconcat.xhtml">horizConcat</a> to append them side to
+side. The two matrices must have the same number of rows.
+<ul>
+ <li>
+  <input type="submit" id="p19" class="subbut" 
+    onclick="handleFree(['p17','p18','p19']);"
+    value="horizConcat(a,b)" />
+  <div id="ansp19"><div></div></div>
+ </li>
+</ul>
+Use <a href="dbopvertconcat.xhtml">vertConcat</a> to stack one upon the
+other. The two matrices must have the same number of columns.
+<ul>
+ <li>
+  <input type="submit" id="p20" class="subbut" 
+    onclick="handleFree(['p17','p18','p20']);"
+    value="vab:=vertConcat(a,b)" />
+  <div id="ansp20"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dboptranspose.xhtml">transpose</a> is used to create
+a new matrix by reflection across the main diagonal.
+<ul>
+ <li>
+  <input type="submit" id="p21" class="subbut" 
+    onclick="handleFree(['p17','p18','p20','p21']);"
+    value="transpose vab" />
+  <div id="ansp21"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{lineigen.xhtml}
+<<lineigen.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Computation of Eigenvalues and Eigenvectors</div>
+  <hr/>
+In this section we show you some of Axiom's facilities for computing and
+manipulating eigenvalues and eigenvectors, also called characteristic
+values and characteristic vectors, respectively.
+
+Let's first create a matrix with integer entries.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="m1:=matrix [[1,2,1],[2,1,-2],[1,-2,4]]" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+To get a list of the rational eigenvalues, use the operation
+<a href="dbopeigenvalues.xhtml">eigenvalues</a>.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="leig:=eigenvalues(m1)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Given an explicit eigenvalue, 
+<a href="dbopeigenvector.xhtml">eigenvector</a> computes the eigenvectors
+corresponding to it.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="eigenvector(first(leig),m1)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopeigenvectors.xhtml">eigenvectors</a> returns a
+list of pairs of values and vectors. When an eigenvalue is rational, Axiom
+gives you the value explicitly; otherwise, its minimal polynomial is given,
+(the polynomial of lowest degree with the eigenvalues as roots), together
+with a parametric representation of the eigenvector using the eigenvalue.
+This means that if you ask Axiom to <a href="dbopsolve.xhtml">solve</a>
+the minimal polynomial, then you can substitute these roots into the
+parametric form of the corresponding eigenvectors.
+
+You must be aware that unless an exact eigenvalue has been computed, 
+the eigenvector may be badly in error.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p4']);"
+    value="eigenvectors(m1)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+Another possibility is to use the operation
+<a href="dbopradicaleigenvectors.xhtml">radicalEigenvectors</a> tries to
+compute explicitly the eignevectors in terms of radicals.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p5']);"
+    value="radicalEigenvectors(m1)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Alternatively, Axiom can compute real or complex approximations to the
+eigenvectors and eigenvalues using the operations
+<a href="dboprealeigenvectors.xhtml">realEigenvectors</a> or
+<a href="dbopcomplexeigenvectors.xhtml">complexEigenvectors</a>. They
+each take an additional argument epsilon to specify the "precision"
+required. In the real case, this means that each approximation will be
+within plus or minus epsilon of the actual result. In the complex case, this
+means that each approximation will be within plus or minus epsilon of the
+actual result in each of the real and imaginary parts.
+
+The precision can be specified as a <a href="db.xhtml?Float">Float</a> if
+the results are desired in floating-point notation, or as
+<a href="dbfractioninteger.xhtml">Fraction Integer</a> if the results are
+to be expressed using rational (or complex rational) numbers.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p6']);"
+    value="realEigenvectors(m1,1/1000)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+If an n by n matrix has n distinct eigenvalues (and therefore n eigenvectors)
+the operation <a href="dbopeigenmatrix.xhtml">eigenMatrix</a> gives you a
+matrix of the eigenvectors.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p1','p7']);"
+    value="eigenMatrix(m1)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="makeRequest('p8');"
+    value="m2:=matrix [[-5,-2],[18,7]]" />
+  <div id="ansp8"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p8','p9']);"
+    value="eigenMatrix(m2)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+If a symmetric matrix has a basis of orthonormal eigenvectors, then
+<a href="dboporthonormalbasis.xhtml">orthonormalBasis</a> computes a list
+of these vectors.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="makeRequest('p10');"
+    value="m3:=matrix [[1,2],[2,1]]" />
+  <div id="ansp10"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p10','p11']);"
+    value="orthonormalBasis(m3)" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{linhilbert.xhtml}
+<<linhilbert.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">An Example: Determinant of a Hilbert Matrix</div>
+  <hr/>
+Consider the problem of computing the determinant of a 10 by 10 Hilbert
+matrix. The (i,j)-th entry of a Hilbert matrix is given by 1/(i+j+1).
+
+First do the computation using rational numbers to obtain the exact result.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+value="a:MATRIX FRAC INT:=matrix [[1/(i+j+1) for j in 0..9] for i in 0..9]" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="d:=determinant a" />
+  <div id="ansp2"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="d::Float" />
+  <div id="ansp3"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value=
+  "b:Matrix DFLOAT:=matrix [[1/(i+j+1$DFLOAT) for j in 0..9] for i in 0..9]"/>
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+The result given by hardware floats is correct only to four significant digits
+of precision. In the jargon of numerical analysis, the Hilbert matrix is said
+to be "ill-conditioned".
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p4','p5']);"
+    value="determinant b" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Now repeat the computation at a higher precision using Float.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="digits 40" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p6','p7']);"
+    value=
+  "c:Matrix Float:=matrix [[1/(i+j+1$Float) for j in 0..9] for i in 0..9]" />
+  <div id="ansp7"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p6','p7','p8']);"
+    value="determinant c" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+Reset <a href="dbopdigits.xhtml">digits</a> to its default value.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="makeRequest('p9');"
+    value="digits 20" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{linintro.xhtml}
+<<linintro.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Expanding to Higher Dimensions</div>
+  <hr/>
+To get higher dimensional aggregates, you can create one-dimensional 
+aggregates with elements that are themselves aggregates, for example,
+lists of list, one-dimensional arrays of list of multisets, and so on. For
+applications requiring two-dimensional homogeneous aggregates, you will
+likely find two-dimensional arrays and matrices useful.
+
+The entries in <a href="db.xhtml?TwoDimensionalArray">TwoDimensionalArray</a>
+and <a href="?Matrix">Matrix</a> objects are all the same type, 
+except that those for <a href="db.xhtml?Matrix">Matrix</a> must belong to a
+<a href="db.xhtml?Ring">Ring</a>. You create and access elements in roughly
+the same way. Since matrices have an understood algebraic structure, certain
+algebraic operations are available for matrices but not for arrays. Because
+of this, we limit our discussion here to <a href="db.xhtml?Matrix">Matrix</a>,
+that can be regarded as an extension of
+<a href="db.xhtml?TwoDimensionalArray">TwoDimensionalArray</a>. See
+<a href="pagetwodimensionalarray.xhtml">TwoDimensionalArray</a>
+For more
+information about Axiom's linear algebra facilities see
+<a href="pagematrix.xhtml">Matrix</a>,
+<a href="pagepermanent.xhtml">Permanent</a>,
+<a href="pagesquarematrix.xhtml">SquareMatrix</a>,
+<a href="pagevector.xhtml">Vector</a>,
+<a href="axbook/section-8.4.xhtml">
+Computation of Eigenvalues and Eigenvectors</a>, and
+<a href="axbook/section-8.5.xhtml">
+Solution of Linear and Polynomial Equations</a>.
+
+You can create a matrix from a list of lists, where each of the inner
+lists represents a row of the matrix.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="m:=matrix([[1,2],[3,4]])" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+The "collections" construct (see
+<a href="axbook/section-5.5.xhtml">
+Creating Lists and Streams with Iterators</a>)
+is useful for creating matrices whose entries are given by formulas.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="matrix([[1/(i+j-x) for i in 1..4] for j in 1..4])" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Let vm denote the three by three Vandermonde matrix.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="vm:=matrix [[1,1,1],[x,y,z],[x*x,y*y,z*z]]" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+Use this syntax to extract an entry in the matrix.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p3','p4']);"
+    value="vm(3,3)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+You can also pull out a <a href="dboprow.xhtml">row</a> or a column.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p3','p5']);"
+    value="column(vm,2)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+You can do arithmetic.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p3','p6']);"
+    value="vm*vm" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+You can perform operations such as 
+<a href="dboptranspose.xhtml">transpose</a>,
+<a href="dboptrace.xhtml">trace</a>, and
+<a href="dbopdeterminant.xhtml">determinant</a>
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p3','p7']);"
+    value="factor determinant vm" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{linoperations.xhtml}
+<<linoperations.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Operations on Matrices</div>
+  <hr/>
+Axiom provides both left and right scalar multiplication.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="m:=matrix [[1,2],[3,4]]" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="4*m*(-5)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+You can add, subtract, and multiply matrices provided, of course, that the
+matrices have compatible dimensions. If not, an error message is displayed.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="n:=matrix([[1,0,-2],[-3,5,1]])" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+This following product is defined but n*m is not.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p3','p4']);"
+    value="m*n" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+The operations <a href="dbopnrows.xhtml">nrows</a> and
+<a href="dbopncols.xhtml">ncols</a> return the number of rows and
+columns of a matrix. You can extract a row or a column of a matrix using
+the operations <a href="dboprow.xhtml">row</a> and
+<a href="dbopcolumn.xhtml">column</a>. The object returned ia a
+<a href="db.xhtml?Vector">Vector</a>. Here is the third column of the matrix n.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p3','p5']);"
+    value="vec:=column(n,3)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+You can multiply a matrix on the left by a "row vector" and on the right by
+a "column vector".
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p5','p6']);"
+    value="vec*m" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopinverse.xhtml">inverse</a> computes the inverse
+of a matrix if the matrix is invertible, and returns "failed" if not. This
+Hilbert matrix invertible.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="hilb:=matrix([[1/(i+j) for i in 1..3] for j in 1..3])" />
+  <div id="ansp7"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p7','p8']);"
+    value="inverse(hilb)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+This matrix is not invertible.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="makeRequest('p9');"
+    value="mm:=matrix([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])" />
+  <div id="ansp9"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p9','p10']);"
+    value="inverse(mm)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopdeterminant.xhtml">determinant</a> computes the
+determinant of a matrix provided that the entries of the matrix belong to a
+<a href="db.xhtml?CommutativeRing">CommutativeRing</a>. The above matrix mm
+is not invertible and, hence, must have determinant 0.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p9','p11']);"
+    value="determinant(mm)" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dboptrace.xhtml">trace</a> computes the trace of a
+square matrix.
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p9','p12']);"
+    value="trace(mm)" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dboprank.xhtml">rank</a> computes the rank of a matrix:
+the maximal number of linearly independent rows or columns.
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="handleFree(['p9','p13']);"
+    value="rank(mm)" />
+  <div id="ansp13"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopnullity.xhtml">nullity</a> computes the nullity
+of a matrix: the dimension of its null space.
+<ul>
+ <li>
+  <input type="submit" id="p14" class="subbut" 
+    onclick="handleFree(['p9','p14']);"
+    value="nullity(mm)" />
+  <div id="ansp14"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopnullspace.xhtml">nullSpace</a> returns a list 
+containing a basis for the null space of a matrix. Note that the nullity is
+the number of elements in a basis for the null space.
+<ul>
+ <li>
+  <input type="submit" id="p15" class="subbut" 
+    onclick="handleFree(['p9','p15']);"
+    value="nullSpace(mm)" />
+  <div id="ansp15"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dboprowechelon.xhtml">rowEchelon</a> returns the row
+echelon form of a matrix. It is easy to see that the rank of this matrix is
+two and that its nullity is also two.
+<ul>
+ <li>
+  <input type="submit" id="p16" class="subbut" 
+    onclick="handleFree(['p9','p16']);"
+    value="rowEchelon(mm)" />
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+For more information see
+<a href="axbook/section-1.6.xhtml">Expanding to Higher Dimensions</a>,
+<a href="axbook/section-8.4.xhtml">
+Computation of Eigenvalues and Eigenvectors</a>, and 
+<a href="axbook/section-9.27.xhtml#subsec-9.27.4">
+An Example: Determinant of a Hilbert Matrix</a>. Also see
+<a href="db.xhtml?Permanent">Permanent</a>,
+<a href="db.xhtml?Vector">Vector</a>,
+<a href="db.xhtml?OneDimensionalArray">OneDimensionalArray</a>, and
+<a href="db.xhtml?TwoDimensionalArray">TwoDimensionalArray</a>. Issue the
+system command
+<ul>
+ <li>
+  <input type="submit" id="p17" class="subbut" 
+    onclick="showcall('p17');"
+   value=")show Matrix"/>
+  <div id="ansp17"><div></div></div>
+ </li>
+</ul>
+to display the full ist of operations defined by 
+<a href="db.xhtml?Matrix">Matrix</a>.
+<<page foot>>
+@
+
+\subsection{linpermaent.xhtml}
+<<linpermaent.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Permanent</div>
+  <hr/>
+The package <a href="db.xhtml?Permanent">Permanent</a> provides the function
+<a href="dboppermanent.xhtml">permanent</a> for square matrices. The
+<a href="dboppermanent.xhtml">permanent</a> of a square matrix can be
+computed in the same way as the determinant by expansion of minors except
+that for the permanent the sign for each element is 1, rather than being 1
+if the row plus column indices is positive and -1 otherwise. This function
+is much more difficult to compute efficiently than the 
+<a href="dbopdeterminant.xhtml">determinant</a>. An example of the use of 
+<a href="dboppermanent.xhtml">permanent</a> is the calculation of the nth
+derangement number, defined to be the number of different possibilities
+for n couples to dance but never with their own spouse. Consider an n by x
+matrix with entries 0 on the diagonal and 1 elsewhere. Think of the rows as
+one-half of each couple (for example, the males) and the columns the other
+half. The permanent of such a matrix gives the desired derangement number.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="noresult" 
+    onclick="makeRequest('p1');"
+    value=
+     "kn n == (r:MATRIX INT:=new(n,n,1); for i in 1..n repeat r.i.i:=0; r)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Here are some derangement numbers, which you see grow quite fast.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="permanent(kn(5)::SQMATRIX(5,INT))" />
+  <div id="ansp2"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="[permanent(kn(n)::SQMATRIX(n,INT)) for n in 1..13]" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{linsquarematrices.xhtml}
+<<linsquarematrices.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">SquareMatrix</div>
+  <hr/>
+The top level matrix type in Axiom is 
+<a href="db.xhtml?Matrix">Matrix</a>, see
+(<a href="pagematrix.xhtml">Matrix</a>), which provides basic arithmetic
+and linear algebra functions. However, since the matrices can be of any
+size it is not true that any pair can be added or multiplied. Thus
+<a href="db.xhtml?Matrix">Matrix</a> has little algebraic structure.
+
+Sometimes you want to use matrices as coefficients for polynomials or in
+other algebraic contexts. In this case,
+<a href="db.xhtml?SquareMatrix">SquareMatrix</a> should be used. The
+domain <a href="db.xhtml?SquareMatrix">SquareMatrix(n,R)</a> gives the
+ring of n by n square matrices over R.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="m:=squareMatrix [[1,-%i],[%i,4]]" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+The usual arithmetic operations are available.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="m*m-m" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Square matrices can be used where ring elements are required. For example,
+here is a matrix with matrix entries.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="mm:=squareMatrix [[m,1],[1-m,m^2]]" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+Or you can construct a polynomial with square matrix coefficients.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p4']);"
+    value="p:=(x+m)^2" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+This value can be converted to a square matrix with polynomial coefficients.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p4','p5']);"
+    value="p::SquareMatrix(2,?)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+For more information on related topics see 
+<a href="axbook/section-2.2.xhtml#subsec-2.2.4">Modes</a> and
+<a href="pagematrix.xhtml">Matrix</a>. Issue the system command
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="showcall('p6');"
+   value=")show SquareMatrix"/>
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+to display the full list of operations defined by 
+<a href="db.xhtml?SquareMatrix">SquareMatrix</a>.
+<<page foot>>
+@
+
+\subsection{linvectors.xhtml}
+<<linvectors.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Vector</div>
+  <hr/>
+The <a href="db.xhtml?Vector">Vector</a> domain is used for storing
+data in a one-dimensonal indexed data structure. A vector is a
+homogeneous data structure in that all the components of the vector
+must belong to the same Axiom domain. Each vector has a fixed length
+specified by the user; vectors are not extensible. This domain is
+similar to the 
+<a href="db.xhtml?OneDimensionalArray">OneDimensionalArray</a> domain,
+except that when the components of a
+<a href="db.xhtml?Vector">Vector</a> belong to a 
+<a href="db.xhtml?Ring">Ring</a>, arithmetic operations are provided. 
+For more examples of operations that are defined for both 
+<a href="db.xhtml?Vector">Vector</a> and
+<a href="db.xhtml?OneDimensionalArray">OneDimensionalArray</a>, see
+<a href="pageonedimensionalarray.xhtml">OneDimensionalArray</a>.
+
+As with the <a href="db.xhtml?OneDimensionalArray">OneDimensionalArray</a>
+domain, a 
+<a href="db.xhtml?Vector">Vector</a> can be created by calling the operation
+<a href="dbopnew.xhtml">new</a>, its components can be accessed by calling
+the operations <a href="dbopelt.xhtml">elt</a> and
+<a href="dbopqelt.xhtml">qelt</a>, and its components can be reset by
+calling the operations
+<a href="dbopsetelt.xhtml">setelt</a> and
+<a href="dbopseteltbang.xhtml">setelt!</a>. This creates a vector of 
+integers of length 5 all of whose components are 12.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="u:VECTOR INT:=new(5,12)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+This is how you create a vector from a list of its components.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="v:VECTOR INT:=vector([1,2,3,4,5])" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Indexing for vectors begins at 1. The last element has index equal to
+the length of the vector, which is computed by 
+<a href="dboplength.xhtml">#</a>.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p2','p3']);"
+    value="#(v)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+This is the standard way to use <a href="dbopelt.xhtml">elt</a> to extract
+an element.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p2','p4']);"
+    value="v.2" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+This is the standard way to use setelt to change an element. It is the
+same as if you had typed setelt(v,3,99).
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p2','p5']);"
+    value="v.3:=99" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Now look at v to see the change. You can use 
+<a href="dbopqelt.xhtml">qelt</a> and
+<a href="dbopqseteltbang.xhtml">qsetelt!</a> (instead of
+<a href="dbopelt.xhtml">elt</a> and
+<a href="dbopsetelt.xhtml">setelt</a>, respectively) but only when you
+know that the indexis within the valid range.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p2','p6']);"
+    value="v" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+When the components belong to a 
+<a href="db.xhtml?Ring">Ring</a>, 
+Axiom provides arithmetic operations for
+<a href="db.xhtml?Vector">Vector</a>. These include left and right
+scalar multiplication.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p2','p7']);"
+    value="5*v" />
+  <div id="ansp7"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p2','p8']);"
+    value="v*7" />
+  <div id="ansp8"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="makeRequest('p9');"
+    value="w:VECTOR INT:=vector([2,3,4,5,6])" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+Addition and subtraction are also available
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p2','p9','p10']);"
+    value="v+w" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+Of course, when adding or subtracting, the two vectors must have the 
+same length or an error message is displayed.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p9','p11']);"
+    value="v-w" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+For more information about other aggregate domains, see
+<a href="pagelist.xhtml">List</a>,
+<a href="pagematrix.xhtml">Matrix</a>,
+<a href="pageonedimensionalarray.xhtml">OneDimensionalArray</a>.
+<a href="pageset.xhtml">Set</a>,
+<a href="pagetable.xhtml">Table</a>, and
+<a href="pagetwodimensionalarray.xhtml">TwoDimensionalArray</a>.
+Issue the system command
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="showcall('p12');"
+   value=")show Vector"/>
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+to display the full list of operations defined by 
+<a href="db.xhtml?Vector">Vector</a>.
+<<page foot>>
+@
+
+\subsection{lin1darrays.xhtml}
+<<lin1darrays.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      lin1darrays not implemented
+<<page foot>>
+@
+
+\subsection{lin2darrays.xhtml}
+<<lin2darrays.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      lin2darrays not implemented
+<<page foot>>
+@
+
+%%M
+\subsection{man0page.xhtml}
+<<man0page.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+Enter search string (use <b>*</b> for wild card unless counter-indicated):
+  <form>
+   <input type="text" name="searchbox" size="50"/>
+  </form>
+
+  <table>
+   <tr>
+    <td>
+     <a href="(|kSearch| '|\stringvalue{pattern}|).xhtml">
+      <b>Constructors</b>
+     </a>
+    </td>
+    <td>
+     Search for 
+     <a href="(|cSearch| '|\stringvalue{pattern}|)">
+      <b>categories</b>
+     </a>,
+     <a href="(|dSearch| '|\stringvalue{pattern}|)">
+      <b>domains</b>
+     </a>,
+     or 
+     <a href="(|pSearch| '|\stringvalue{pattern}|)">
+      <b>packages</b>
+     </a>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="(|oSearch| '|\stringvalue{pattern}|).xhtml">
+      <b>Operations</b>
+     </a>
+    </td>
+    <td>Search for operations.</td>
+   </tr>
+   <tr>
+    <td>
+     <a href="(|aSearch| '|\stringvalue{pattern}|).xhtml">
+      <b>Attributes</b>
+     </a>
+    </td>
+    <td>Search for attributes.</td>
+   </tr>
+   <tr>
+    <td>
+     <a href="(|aokSearch| '|\stringvalue{pattern}|).xhtml">
+      <b>General</b>
+     </a>
+    </td>
+    <td>Search for all three of the above.</td>
+   </tr>
+   <tr>
+    <td>
+     <a href="(|docSearch| '|\stringvalue{pattern}|).xhtml">
+      <b>Documentation</b>
+     </a>
+    </td>
+    <td>Search library documentation.
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="(|genSearch| '|\stringvalue{pattern}|).xhtml">
+      <b>Complete</b>
+     </a>
+    </td>
+    <td>All of the above.
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="(|detailedSearch| '|\stringvalue{pattern}|).xhtml">
+      <b>Selectable</b>
+     </a>
+    </td>
+    <td>Detailed search with selectable options.
+    </td>
+   </tr>
+   <hr/>
+   <tr>
+    <td>
+     <a href="htsearch \stringvalue{pattern}.xhtml">
+      <b>Reference</b>
+     </a>
+    </td>
+    <td>Search Reference documentation (<b>*</b> wild card is not accepted).
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="ugSysCmdPage.xhtml">
+      <b>Commands</b>
+     </a>
+    </td>
+    <td>View system command documentation.
+    </td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+%%N
+\subsection{numberspage.xhtml}
+<<numberspage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+The following types of numbers are among those available in Axiom
+  <table>
+   <tr>
+    <td>
+     <a href="numintegers.xhtml">Integers</a>
+    </td>
+    <td>
+     Arithmetic with arbitrarily large integers
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="numfractions.xhtml">Fractions</a>
+    </td>
+    <td>
+     Rational numbers and general fractions
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="nummachinefloats.xhtml">Machine Floats</a>
+    </td>
+    <td>
+     Fixed precision machine floating point
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="numfloat.xhtml">Real Numbers</a>
+    </td>
+    <td>
+     Arbitrary precision decimal arithmetic
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="numcomplexnumbers.xhtml">Complex Numbers</a>
+    </td>
+    <td>
+     Complex numbers in general
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="numfinitefields.xhtml">Finite Fields</a>
+    </td>
+    <td>
+     Arithmetic in characteristic p
+    </td>
+   </tr>
+  </table>
+  <hr/>
+Addtional topics
+ <ul>
+  <li> <a href="numnumericfunctions.xhtml">Numeric Functions</a></li>
+  <li> <a href="numcardinalnumbers.xhtml">Cardinal Numbers</a></li>
+  <li> <a href="nummachinesizedintegers.xhtml">Machine-sized Integers</a></li>
+  <li> <a href="numromannumerals.xhtml">Roman Numerals</a></li>
+  <li> <a href="numcontinuedfractions.xhtml">Continued Fractions</a></li>
+  <li> <a href="numpartialfractions.xhtml">Partial Fractions</a></li>
+  <li> <a href="numquaternions.xhtml">Quaternions</a></li>
+  <li> <a href="numoctonions.xhtml">Octonions</a></li>
+  <li> <a href="numrepeatingdecimals.xhtml">Repeating Decimals</a></li>
+  <li> <a href="numrepeatingbinaryexpansions.xhtml">
+        Repeating Binary Expansions
+       </a>
+  </li>
+  <li> <a href="numrepeatinghexexpansions.xhtml">
+        Repeating Hexadecimal Expansions
+       </a>
+  </li>
+  <li> <a href="numotherbases.xhtml">Expansions in other Bases</a></li>
+ </ul>
+<<page foot>>
+@
+
+\subsection{numcardinalnumbers.xhtml}
+<<numcardinalnumbers.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Cardinal Numbers</div>
+  <hr/>
+The <a href="dbopcardinalnumber.xhtml">CardinalNumber</a> can be used for
+values indicating the cardinality of sets, both finite and infinite. For
+example, the <a href="dbopdimension.xhtml">dimension</a> operation in the
+category <a href="dbopvectorspace.xhtml">VectorSpace</a> returns a cardinal
+number.
+
+The non-negative integers have a natural construction as cardinals
+<pre>
+0=#{ }, 1={0}, 2={0,1}, ..., n={i | 0 &#60;= i &#60; n}
+</pre>
+The fact that 0 acts as a zero for the multiplication of cardinals is
+equivalent to the axiom of choice.
+
+Cardinal numbers can be created by conversion from non-negative integers.
+ <ul>
+  <li>
+   <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+     value="c0:=0::CardinalNumber" />
+   <div id="ansp1"><div></div></div>
+  </li>
+  <li>
+   <input type="submit" id="p2" class="subbut" onclick="makeRequest('p2');"
+     value="c1:=1::CardinalNumber" />
+   <div id="ansp2"><div></div></div>
+  </li>
+  <li>
+   <input type="submit" id="p3" class="subbut" onclick="makeRequest('p3');"
+     value="c2:=2::CardinalNumber" />
+   <div id="ansp3"><div></div></div>
+  </li>
+  <li>
+   <input type="submit" id="p4" class="subbut" onclick="makeRequest('p4');"
+     value="c3:=3::CardinalNumber" />
+   <div id="ansp4"><div></div></div>
+  </li>
+ </ul>
+The can also be obtained as the named cardinal Aleph(n)
+ <ul>
+  <li>
+   <input type="submit" id="p5" class="subbut" onclick="makeRequest('p5');"
+     value="A0:=Aleph 0" />
+   <div id="ansp5"><div></div></div>
+  </li>
+  <li>
+   <input type="submit" id="p6" class="subbut" onclick="makeRequest('p6');"
+     value="A1:=Aleph 1" />
+   <div id="ansp6"><div></div></div>
+  </li>
+ </ul>
+The <a href="dbopfiniteq.xhtml">finite?</a> operation tests whether a value
+is a finite cardinal, that is, a non-negative integer.
+ <ul>
+  <li>
+   <input type="submit" id="p7" class="subbut" 
+     onclick="handleFree(['p3','p7']);"
+     value="finite? c2" />
+   <div id="ansp7"><div></div></div>
+  </li>
+  <li>
+   <input type="submit" id="p8" class="subbut" 
+     onclick="handleFree(['p5','p8']);"
+     value="finite? A0" />
+   <div id="ansp8"><div></div></div>
+  </li>
+ </ul>
+Similarly, the <a href="dbopcountableq.xhtml">countable?</a> operation
+determines whether a value is a countable cardinal, that is, finite or
+Aleph(0).
+ <ul>
+  <li>
+   <input type="submit" id="p9" class="subbut" 
+     onclick="handleFree(['p3','p9']);"
+     value="countable? c2" />
+   <div id="ansp9"><div></div></div>
+  </li>
+  <li>
+   <input type="submit" id="p10" class="subbut" 
+     onclick="handleFree(['p5','p10']);"
+     value="countable? A0" />
+   <div id="ansp10"><div></div></div>
+  </li>
+  <li>
+   <input type="submit" id="p11" class="subbut" 
+     onclick="handleFree(['p6','p11']);"
+     value="countable? A1" />
+   <div id="ansp11"><div></div></div>
+  </li>
+ </ul>
+Arithmetic operations are defined on cardinal numbers as follows:
+<table>
+ <tr>
+  <td>
+   x+y = #(X+Y)
+  </td>
+  <td>
+   cardinality of the disjoint union
+  </td>
+ </tr>
+ <tr>
+  <td>
+   x-y = #(X-Y)
+  </td>
+  <td>
+   cardinality of the relative complement
+  </td>
+ </tr>
+ <tr>
+  <td>
+   x*y = #(X*Y)
+  </td>
+  <td>
+   cardinality of the Cartesian product
+  </td>
+ </tr>
+ <tr>
+  <td>
+   x+*y = #(X**Y)
+  </td>
+  <td>
+   cardinality of the set of maps from Y to X
+  </td>
+ </tr>
+</table>
+Here are some arithmetic examples:
+ <ul>
+  <li>
+   <input type="submit" id="p12" class="subbut" 
+     onclick="handleFree(['p3','p6','p12']);"
+     value="[c2+c2,c1+A1]" />
+   <div id="ansp12"><div></div></div>
+  </li>
+  <li>
+   <input type="submit" id="p13" class="subbut" 
+     onclick="handleFree(['p1','p2','p3','p5','p6','p13']);"
+     value="[c0*c2,c1*c2,c2*c2,c0*A1,c1*A1,c2*A1,A0*A1]" />
+   <div id="ansp13"><div></div></div>
+  </li>
+  <li>
+   <input type="submit" id="p14" class="subbut" 
+     onclick="handleFree(['p1','p2','p3','p6','p14']);"
+     value="[c2**c0,c2**c1,c2**c2,A1**c0,A1**c1,A1**c2]" />
+   <div id="ansp14"><div></div></div>
+  </li>
+ </ul>
+Subtraction is a partial operation; it is not defined when subtracting
+a larger cardinal from a smaller one, nor when subtracting two equal
+infinite cardinals.
+ <ul>
+  <li>
+   <input type="submit" id="p15" class="subbut" 
+     onclick="handleFree(['p2','p3','p4','p5','p6','p15']);"
+     value="[c2-c1,c2-c2,c2-c3,A1-c2,A1-A0,A1-A1]" />
+   <div id="ansp15"><div></div></div>
+  </li>
+ </ul>
+The generalized continuum hypothesis asserts that
+<pre>
+ 2**Aleph i = Aleph(i+1)
+</pre>
+and is independent of the axioms of set theory. (Goedel, The consistency
+of the continuum hypothesis, Ann. Math. Studies, Princeton Univ. Press,
+1940) The <a href="dbopcardinalnumber.xhtml">CardinalNumber</a> domain 
+provides an operation to assert whether the hypothesis is to be assumed.
+ <ul>
+  <li>
+   <input type="submit" id="p16" class="subbut" 
+     onclick="makeRequest('p16');"
+     value="generalizedContinuumHypothesisAssumed true" />
+   <div id="ansp16"><div></div></div>
+  </li>
+ </ul>
+When the generalized continuum hypothesis is assumed, exponentiation to
+a transfinite power is allowed.
+ <ul>
+  <li>
+   <input type="submit" id="p17" class="subbut" 
+     onclick="handleFree(['p1','p2','p3','p5','p6','p17']);"
+     value="[c0**A0,c1**A0,c2**A0,A0**A0,A0**A1,A1**A0,A1**A1]" />
+   <div id="ansp17"><div></div></div>
+  </li>
+ </ul>
+Three commonly encountered cardinal numbers are
+<pre>
+  a = #Z                 countable infinity
+  c = #R                 the continuum
+  f = #{g|g: [0,1]->R}
+</pre>
+In this domain, these values are obtained under the generalized continuum
+hypothesis in this way:
+ <ul>
+  <li>
+   <input type="submit" id="p18" class="subbut" 
+     onclick="makeRequest('p18');"
+     value="a:=Aleph 0" />
+   <div id="ansp18"><div></div></div>
+  </li>
+  <li>
+   <input type="submit" id="p19" class="subbut" 
+     onclick="handleFree(['p18','p19']);"
+     value="c:=2**a" />
+   <div id="ansp19"><div></div></div>
+  </li>
+  <li>
+   <input type="submit" id="p20" class="subbut" 
+     onclick="handleFree(['p18','p19','p20']);"
+     value="f:=2**c" />
+   <div id="ansp20"><div></div></div>
+  </li>
+ </ul>
+<<page foot>>
+@
+
+\subsection{numcomplexnumbers.xhtml}
+<<numcomplexnumbers.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+<div align="center">Complex Numbers</div>
+<hr/>
+The <a href="db.xhtml?Complex">Complex</a> constructor implements 
+complex objects over a commutative ring R. Typically, the ring R is
+<a href="db.xhtml?Integer">Integer</a>,
+<a href="dbfractioninteger.xhtml">Fraction Integer</a>,
+<a href="db.xhtml?Float">Float</a>,
+<a href="db.xhtml?DoubleFloat">DoubleFloat</a>,
+R can also be a symbolic type, like
+<a href="dbpolynomialinteger.xhtml">Polynomial Integer</a>.
+For more information about the numerical and graphical aspects of
+complex numbers, see 
+<a href="axbook/book-contents.xhtml#chapter8">Numeric Functions</a>
+in section 8.1.
+
+Complex objects are created by the
+<a href="dbcomplexcomplex.xhtml">complex</a> operation
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+    value="a:=complex(4/3,5/2)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" onclick="makeRequest('p2');"
+    value="b:=complex(4/3,-5/2)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+The standard arithmetic operations are available.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="a+b" />
+  <div id="ansp3"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p2','p4']);"
+    value="a-b" />
+  <div id="ansp4"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p2','p5']);"
+    value="a*b" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+If R is a field, you can also divide the complex objects.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p2','p6']);"
+    value="a/b" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+Use a conversion 
+(see <a href="axbook/section-2.7.xhtml">Conversion</a> in 
+section 2.7) to view the last object as a fraction of complex
+integers.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p1','p2','p6','p7']);"
+    value="%::Fraction Complex Integer" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+The predefined macro <tt>%i</tt> is defined to be complex(0,1).
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="makeRequest('p8');"
+    value="3.4+6.7*%i" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+You can also compute the 
+<a href="dbcomplexconjugate.xhtml">conjugate</a> and
+<a href="dbcomplexnorm.xhtml">norm</a> of a complex number.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p1','p9']);"
+    value="conjugate a" />
+  <div id="ansp9"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p1','p10']);"
+    value="norm a" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+The <a href="dbcomplexreal.xhtml">real</a> and
+<a href="dbcompleximag.xhtml">imag</a> operations are provided to
+extract the real and imaginary parts, respectively.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p1','p11']);"
+    value="real a" />
+  <div id="ansp11"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p1','p12']);"
+    value="imag a" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+The domain 
+<a href="dbcomplexinteger.xhtml">Complex Integer</a>
+is also called the Gaussian integers. If R is the integers (or, more
+generally, a  
+<a href="db.xhtml?EuclideanDomain">Euclidean Domain</a>),
+you can compute greatest common divisors.
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="makeRequest('p13');"
+    value="gcd(12-12*%i,31+27*%i)" />
+  <div id="ansp13"><div></div></div>
+ </li>
+</ul>
+You can also compute least common multiples
+<ul>
+ <li>
+  <input type="submit" id="p14" class="subbut" 
+    onclick="makeRequest('p14');"
+    value="lcm(13-13*%i,31+27*%i)" />
+  <div id="ansp14"><div></div></div>
+ </li>
+</ul>
+You can <a href="dbcomplexfactor.xhtml">factor</a> Gaussian integers.
+<ul>
+ <li>
+  <input type="submit" id="p15" class="subbut" 
+    onclick="makeRequest('p15');"
+    value="factor(13-13*%i)" />
+  <div id="ansp15"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p16" class="subbut" 
+    onclick="makeRequest('p16');"
+    value="factor complex(2,0)" />
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{numcontinuedfractions.xhtml}
+<<numcontinuedfractions.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Continued Fractions</div>
+  <hr/>
+Continued fractions have been a fascinating and useful tool in mathematics
+for well over three hundred years. Axiom implements continued fractions
+for fractions of any Euclidean domain. In practice, this usually means
+rational numbers. In this section we demonstrate some of the operations
+available for manipulating both finite and infinite continued fractions.
+It may be helpful if you review
+<a href="db.xhtml?Stream">Stream</a> to remind yourself of some of the 
+operations with streams.
+
+The <a href="db.xhtml?ContinuedFraction">ContinuedFraction</a> domain is a
+field and therefore you can add, subtract, multiply, and divide the
+fractions. The 
+<a href="dbopcontinuedfraction.xhtml">continuedFraction</a> operation 
+converts its fractional argument to a continued fraction.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+    value="c:=continuedFraction(314159/100000)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+This display is the compact form of the bulkier
+<pre>
+  3 +             1
+     ---------------------------
+     7 +            1
+         -----------------------
+         15 +         1
+              ------------------
+              1 +        1
+                  --------------
+                  25 +     1
+                       ---------
+                       1 +   1
+                           -----
+                           7 + 1
+                               -
+                               4
+</pre>
+You can write any rational number in a similar form. The fraction will
+be finite and you can always take the "numerators" to be 1. That is, any
+rational number can be written as a simple, finite continued fraction of
+the form
+<pre>
+a(1) +            1
+     ---------------------------
+  a(2) +            1
+         -----------------------
+       a(3) +         1
+                        .
+                         .
+                          .
+                           1
+
+              -----------------
+              a(n-1) +     1
+                       ---------
+                          a(n)
+</pre>
+The a(i) are called partial quotients and the operation
+<a href="dboppartialquotients.xhtml">partialQuotients</a> creates a
+stream of them.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="partialQuotients c" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+By considering more and more of the fraction, you get the
+<a href="dbopconvergents.xhtml">convergents</a>. For example, the
+first convergent is a(1), the second is a(1)+1/a(2) and so on.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="convergents c" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+Since this ia a finite continued fraction, the last convergent is the
+original rational number, in reduced form. The result of
+<a href="dbopapproximants.xhtml">approximants</a> is always an infinite
+stream, though it may just repeat the "last" value.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p4']);"
+    value="approximants c" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+Inverting c only changes the partial quotients of its fraction by 
+inserting a 0 at the beginning of the list.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p5']);"
+    value="pq:=partialQuotients(1/c)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Do this to recover the original continued fraction from this list of
+partial quotients. The three argument form of the 
+<a href="dbopcontinuedfraction.xhtml">continuedFraction</a> operation takes
+an element which is the whole part of the fraction, a stream of elements
+which are the denominators of the fraction.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut"
+    onclick="handleFree(['p1','p5','p6']);"
+    value="continuedFraction(first pq,repeating [1],rest pq)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+The streams need not be finite for 
+<a href="dbopcontinuedfraction.xhtml">continuedFraction</a>. Can you guess
+which irrational number has the following continued fraction? See the end
+of this section for the answer.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" onclick="makeRequest('p7');"
+    value="z:=continuedFraction(3,repeating [1],repeating [3,6])" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+In 1737 Euler discovered the infinite continued fraction expansion
+<pre>
+ e - 1                 1
+ ----- =  ---------------------------
+p          2 +            1
+              -----------------------
+              6  +         1
+                   ------------------
+                  10 +        1
+                       --------------
+                       14 +  ... 
+</pre>
+We use this expansion to compute rational and floating point 
+approximations of e. (For this and other interesting expansions,
+see C. D. Olds, Continued Fractions, New Mathematical Library,
+Random House, New York, 1963 pp.134-139).
+
+By looking at the above expansion, we see that the whole part is 0
+and the numerators are all equal to 1. This constructs the stream of
+denominators.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" onclick="makeRequest('p8');"
+    value="dens:Stream Integer:=cons(1,generate((x+->x+4),6))" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+Therefore this is the continued fraction expansion for (e-1)/2.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p8','p9']);"
+    value="cf:=continuedFraction(0,repeating [1],dens)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+These are the rational number convergents.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut"
+    onclick="handleFree(['p8','p9','p10']);"
+    value="ccf:=convergents cf" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+You can get rational convergents for e by multiplying by 2 and adding 1.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p8','p9','p10','p11']);"
+    value="eConvergents:=[2*e+1 for e in ccf]" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+You can also compute the floating point approximations to these convergents.
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut"
+    onclick="handleFree(['p8','p9','p10','p11','p12']);"
+    value="eConvergents::Stream Float" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+Compare this to the value of e computed by the 
+<a href="dbopexp.xhtml">exp</a> operation in 
+<a href="db.xhtml?Float">Float</a>.
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" onclick="makeRequest('p13');"
+    value="exp 1.0" />
+  <div id="ansp13"><div></div></div>
+ </li>
+</ul>
+In about 1658, Lord Brouncker established the following expansion for 4/pi.
+<pre>
+  1 +             1
+     ---------------------------
+     2 +            9
+         -----------------------
+         2  +         25
+              ------------------
+              2 +        49
+                  --------------
+                  2  +     81
+                       ---------
+                       2 +   ...
+</pre>
+Let's use this expansion to compute rational and floating point 
+approximations for pi.
+<ul>
+ <li>
+  <input type="submit" id="p14" class="subbut" onclick="makeRequest('p14');"
+    value="cf:=continuedFraction(1,[(2*i+1)^2 for i in 0..],repeating [2])" />
+  <div id="ansp14"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p15" class="subbut" 
+    onclick="handleFree(['p14','p15']);"
+    value="ccf:=convergents cf" />
+  <div id="ansp15"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p16" class="subbut" 
+    onclick="handleFree(['p14','p15','p16']);"
+    value="piConvergents:=[4/p for p in ccf]" />
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+As you can see, the values are converging to 
+<pre>
+  pi = 3.14159265358979323846..., but not very quickly.
+</pre>
+<ul>
+ <li>
+  <input type="submit" id="p17" class="subbut" 
+    onclick="handleFree(['p14','p15','p16','p17']);"
+    value="piConvergents::Stream Float" />
+  <div id="ansp17"><div></div></div>
+ </li>
+</ul>
+You need not restrict yourself to continued fractions of integers. Here is
+an expansion for a quotient of Gaussian integers.
+<ul>
+ <li>
+  <input type="submit" id="p18" class="subbut" onclick="makeRequest('p18');"
+    value="continuedFraction((-122+597*%i)/(4-4*%i))" />
+  <div id="ansp18"><div></div></div>
+ </li>
+</ul>
+This is an expansion for a quotient of polynomials in one variable with
+rational number coefficients.
+<ul>
+ <li>
+  <input type="submit" id="p19" class="subbut" onclick="makeRequest('p19');"
+    value="r:Fraction UnivariatePolynomial(x,Fraction Integer)" />
+  <div id="ansp19"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p20" class="subbut" 
+    onclick="handleFree(['p19','p20']);"
+    value="r:=((x-1)*(x-2))/((x-3)*(x-4))" />
+  <div id="ansp20"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p21" class="subbut" 
+    onclick="handleFree(['p19','p20','p21']);"
+    value="continuedFraction r" />
+  <div id="ansp21"><div></div></div>
+ </li>
+</ul>
+To conclude this section, we give you evidence that
+<pre>
+  z =  3 +             1
+          ---------------------------
+          3 +            1
+              -----------------------
+              6 +          1
+                  -------------------
+                   3 +        1
+                       --------------
+                       6  +     1
+                            ---------
+                            3 + ...
+</pre>
+is the expansion of the square root of 11.
+<ul>
+ <li>
+  <input type="submit" id="p22" class="subbut" 
+    onclick="handleFree(['p7','p22']);"
+    value="[i*i for i in convergents(z)]::Stream Float" />
+  <div id="ansp22"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{numexamples.xhtml}
+<<numexamples.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      numexamples not implemented
+<<page foot>>
+@
+
+\subsection{numfactorization.xhtml}
+<<numfactorization.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      numfactorization not implemented
+<<page foot>>
+@
+
+\subsection{numfinitefields.xhtml}
+<<numfinitefields.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+<div align="center">Finite Fields</div>
+<hr/>
+A <sl>finite field</sl> (also called a <sl>Galois field</sl>) is a finite
+algebraic structure where on can add, multiply, and divide under the same
+laws (for example, commutativity, associativity, or distributivity) as 
+apply to the rational, real, or complex numbers. Unlike those three fields,
+for any finite field there exists a positive prime integer p, called the
+<a href="dbcharacteristic.xhtml">characteristic</a>, such that p*x=0 for 
+any element x in the finite field. In fact, the number of elements in a
+finite filed is a power of the characteristic and for each prime p and
+positive integer n there exists exactly one finite field with p**n elements,
+up to an isomorphism. (For more information about the algebraic structure and
+properties of finite fields, see for example, S. Lang <sl>Algebr</sl>, 
+Second Edition, New York, Addison-Wesley Publishing Company, Inc. 1984,
+ISBN 0 201 05476 6; or R. Lidl, H. Niederreiter, <sl>Finite Fields</sl>,
+Encyclopedia of Mathematics and Its Applications, Vol. 20, Cambridge.
+Cambridge Univ. Press, 1983, ISBN 0 521 30240 4)
+
+When n=1, the field has p elements and is called a <sl>prime field</sl>,
+discussed in 
+<a href="axbook/section-8.11.xhtml#subsec-8.11.1">
+Modular Arithmetic and Prime Fields</a>
+in section 8.11.1. There are several ways of implementing extensions of
+finite fields, and Axiom provides quite a bit of freedom to allow you to
+choose the one that is best for your application. Moreover, we provide
+operations for converting among the different representations of extensions
+and different extensions of a single field. Finally, note that you usually
+need to package call operations from finite fields if the operations do not
+take as an argument an object of the field. See
+<a href="">Package Calling and Target Types</a>
+in section 2.9 for more information on package calling.
+<ul>
+ <li>
+  <a href="axbook/section-8.11.xhtml#subsec-8.11.1">
+   Modular Arithmetic and Prime Fields
+  </a>
+ </li>
+ <li>
+  <a href="axbook/section-8.11.xhtml#subsec-8.11.2">
+   Extensions of Finite Fields
+  </a>
+ </li>
+ <li>
+  <a href="axbook/section-8.11.xhtml#subsec-8.11.3">
+   Irreducible Modulus Polynomial Representations
+  </a>
+ </li>
+ <li>
+  <a href="axbook/section-8.11.xhtml#subsec-8.11.4">
+   Cyclic Group Representations
+  </a>
+ </li>
+ <li>
+  <a href="axbook/section-8.11.xhtml#subsec-8.11.5">
+   Normal Basis Representations
+  </a>
+ </li>
+ <li>
+  <a href="axbook/section-8.11.xhtml#subsec-8.11.6">
+   Conversion Operations for Finite Fields
+  </a>
+ </li>
+ <li>
+  <a href="axbook/section-8.11.xhtml#subsec-8.11.7">
+   Utility Operations for Finite Fields
+  </a>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{numfloat.xhtml}
+<<numfloat.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <div align="center">Real Numbers</div>
+  <hr/>
+Axiom provides two kinds of floating point numbers. The domain 
+<a href="db.xhtml?Float">Float</a> 
+(abbreviation <a href="db.xhtml?Float">FLOAT</a>) 
+implements a model of arbitrary precisions floating point numbers. The
+domain
+<a href="db.xhtml?DoubleFloat">DoubleFloat</a> 
+(abbreviation <a href="db.xhtml?DoubleFloat">DFLOAT</a>) 
+is intended to make available hardware floating point arithmetic in Axiom.
+The actual model of floating point 
+<a href="db.xhtml?DoubleFloat">DoubleFloat</a> that Axiom
+provides is system dependent. For example, on the IBM System 370, Axiom
+uses IBM double precision which has fourteen hexadecimal digits of 
+precision or roughly sixteen decimal digits. Arbitrary precision floats
+allow the user to specify the precision at which arithmetic operations 
+are computed. Although this is an attractive facility, it comes at a cost.
+Arbitrary precision floating point arithmetic typically takes twenty to
+two hundred times more time than hardware floating point.
+ 
+For more information about Axiom's numeric and graphic facilities
+see <a href="axbook/book-contents.xhtml#chapter7">Graphics</a> in section 7, 
+<a href="axbook/book-contents.xhtml#chapter8">Numeric Functions</a>
+in section 8.1, and <a href="nummachinefloats.xhtml">DoubleFloat</a>
+<ul>
+ <li>
+  <a href="axbook/section-9.27.xhtml#subsec-9.27.1">
+   Introduction to Float
+  </a>
+ </li>
+ <li>
+  <a href="axbook/section-9.27.xhtml#subsec-9.27.2">
+   Conversion Functions
+  </a>
+ </li>
+ <li>
+  <a href="axbook/section-9.27.xhtml#subsec-9.27.3">
+   Output Functions
+  </a>
+ </li>
+ <li>
+  <a href="axbook/section-9.27.xhtml#subsec-9.27.4">
+   An Example: Determinant of a Hilbert Matrx
+  </a>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{numfractions.xhtml}
+<<numfractions.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Fractions</div>
+  <hr/>
+Axiom handles fractions in many different contexts and will
+automatically simplify fractions whenever possible. Here are
+some examples:
+ <ul>
+  <li> <input type="submit" id="p1" value="1/4-1/5" class="subbut"
+         onclick="makeRequest('p1');"/>
+       <div id="ansp1"><div></div></div>
+  </li>
+  <li> <input type="submit" id="p2" value="f:=(x^2+1)/(x-1)" class="subbut"
+         onclick="makeRequest('p2');"/>
+       <div id="ansp2"><div></div></div>
+  </li>
+  <li> <input type="submit" id="p3" value="g:=(x^2-3*x+2)/(x+2)" class="subbut"
+         onclick="makeRequest('p3');"/>
+       <div id="ansp3"><div></div></div>
+  </li>
+  <li> <input type="submit" id="p4" value="f*g" class="subbut"
+         onclick="handleFree(['p2','p3','p4']);"/>
+       <div id="ansp4"><div></div></div>
+  </li>
+ </ul>
+ <hr/>
+Additional Topics:
+ <table>
+  <tr>
+   <td>
+    <a href="numrationalnumbers.xhtml">Rational Numbers</a>
+   </td>
+   <td>
+    Quotients of integers
+   </td>
+  </tr>
+  <tr>
+   <td>
+    <a href="numquotientfields.xhtml">Quotient Fields</a>
+   </td>
+   <td>
+    Quotients over an arbitrary integral domain
+   </td>
+  </tr>
+ </table>
+<<page foot>>
+@
+
+\subsection{numfunctions.xhtml}
+<<numfunctions.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      numfunctions not implemented
+<<page foot>>
+@
+
+\subsection{numgeneralinfo.xhtml}
+<<numgeneralinfo.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      numgeneralinfo not implemented
+<<page foot>>
+@
+
+\subsection{numintegers.xhtml}
+<<numintegers.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Integers</div>
+  <hr/>
+In Axiom, integers can be as large as you like. Try the following
+examples.
+ <ul>
+  <li> <input type="submit" id="p1" value="x:=factorial(200)" class="subbut"
+         onclick="makeRequest('p1');"/>
+       <div id="ansp1"><div></div></div>
+  </li>
+  <li> <input type="submit" id="p2" value="y:=2^90-1" class="subbut"
+         onclick="makeRequest('p2');"/>
+       <div id="ansp2"><div></div></div>
+  </li>
+ </ul>
+Of course, you can now do arithmetic as usual on these (very) large
+integers:
+ <ul>
+  <li> <input type="submit" id="p3" value="x+y" class="subbut"
+         onclick="handleFree(['p1','p2','p3']);"/>
+       <div id="ansp3"><div></div></div>
+  </li>
+  <li> <input type="submit" id="p4" value="x-y" class="subbut"
+         onclick="handleFree(['p1','p2','p4']);"/>
+       <div id="ansp4"><div></div></div>
+  </li>
+  <li> <input type="submit" id="p5" value="x*y" class="subbut"
+         onclick="handleFree(['p1','p2','p5']);"/>
+       <div id="ansp5"><div></div></div>
+  </li>
+ </ul>
+Axiom can factor integers, but numbers with small prime factors
+ <ul>
+  <li> <input type="submit" id="p6" value="factor(x)" class="subbut"
+         onclick="handleFree(['p1','p6']);"/>
+       <div id="ansp6"><div></div></div>
+  </li>
+ </ul>
+will factor more rapidly than numbers with large prime factors.
+ <ul>
+  <li> <input type="submit" id="p7" value="factor(y)" class="subbut"
+         onclick="handleFree(['p2','p7']);"/>
+       <div id="ansp7"><div></div></div>
+  </li>
+ </ul>
+ <hr/>
+Additional topics
+ <table>
+  <tr>
+   <td>
+    <a href="numgeneralinfo.xhtml">General Info</a>
+   </td>
+   <td>
+    General information and examples of integers
+   </td>
+  </tr>
+  <tr>
+   <td>
+    <a href="numfactorization.xhtml">Factorization</a>
+   </td>
+   <td>
+    Primes and factorization
+   </td>
+  </tr>
+  <tr>
+   <td>
+    <a href="numfunctions.xhtml">Functions</a>
+   </td>
+   <td>
+    Number theoretic functions
+   </td>
+  </tr>
+  <tr>
+   <td>
+    <a href="numexamples.xhtml">Functions</a>
+   </td>
+   <td>
+    Examples from number theory
+   </td>
+  </tr>
+  <tr>
+   <td>
+    <a href="numproblems.xhtml">Problems</a>
+   </td>
+   <td>
+    Problems from number theory
+   </td>
+  </tr>
+ </table>
+<<page foot>>
+@
+
+\subsection{nummachinefloats.xhtml}
+<<nummachinefloats.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Machine Floats</div>
+  <hr/>
+Axiom provides two kinds of floating point numbers. The domain 
+<a href="db.xhtml?Float">Float</a> 
+(abbreviation <a href="db.xhtml?Float">FLOAT</a>) 
+implements a model of arbitrary precisions floating point numbers. The
+domain
+<a href="db.xhtml?DoubleFloat">DoubleFloat</a> 
+(abbreviation <a href="db.xhtml?DoubleFloat">DFLOAT</a>) 
+is intended to make available hardware floating point arithmetic in Axiom.
+The actual model of floating point 
+<a href="db.xhtml?DoubleFloat">DoubleFloat</a> that Axiom
+provides is system dependent. For example, on the IBM System 370, Axiom
+uses IBM double precision which has fourteen hexadecimal digits of 
+precision or roughly sixteen decimal digits. Arbitrary precision floats
+allow the user to specify the precision at which arithmetic operations 
+are computed. Although this is an attractive facility, it comes at a cost.
+Arbitrary precision floating point arithmetic typically takes twenty to
+two hundred times more time than hardware floating point.
+
+By default, floating point numbers that you enter into Axiom are of type
+<a href="db.xhtml?Float">Float</a>.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="2.71828" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+You must therefore tell Axiom that you want to use 
+<a href="db.xhtml?DoubleFloat">DoubleFloat</a> values and operations. The
+following are some conservative guidelines for getting Axiom to use 
+<a href="db.xhtml?DoubleFloat">DoubleFloat</a>.
+
+To get a value of type <a href="db.xhtml?DoubleFloat">DoubleFloat</a>., 
+use a target with
+    "@", ...
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="2.71828@DoubleFloat" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+a conversion,...
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="2.71828::DoubleFloat" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+or an assignment to a declared variable. It is more efficient if you
+use a target rather than an explicit or implicit conversion.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="eApprox:DoubleFloat:=2.71828" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+You also need to declare functions that work with 
+<a href="db.xhtml?DoubleFloat">DoubleFloat</a>.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="noresult" 
+    onclick="makeRequest('p5');"
+    value="avg:List DoubleFloat -> DoubleFloat" />
+  <div id="ansp5"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p6" class="noresult" 
+    onclick="makeRequest('p6');"
+    value="avg l==(empty? l => 0::DoubleFloat; reduce(_+,l)/#l)"/>
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p5','p6','p7']);"
+    value="avg []" />
+  <div id="ansp7"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p5','p6','p8']);"
+    value="avg [3.4,9.7,-6.8]" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+Use package calling for operations from 
+<a href="db.xhtml?DoubleFloat">DoubleFloat</a>
+unless the arguments themselves are already of type
+<a href="db.xhtml?DoubleFloat">DoubleFloat</a>.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="makeRequest('p9');"
+    value="cos(3.1415926)$DoubleFloat" />
+  <div id="ansp9"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="makeRequest('p10');"
+    value="cos(3.1415926)::DoubleFloat" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+By far, the most common usage of 
+<a href="db.xhtml?DoubleFloat">DoubleFloat</a>
+is for functions to be graphied. For more information about Axiom's
+numerical and graphical facilities, see
+<a href="axbook/book-contents.xhtml#chapter7">Graphics</a>
+in section 7, 
+<a href="axbook/book-contents.xhtml#chapter8">Numeric Functions</a>
+in section 8.1, and
+<a href="numfloat.xhtml">Float</a>
+
+The usual arithmetic and elementary functions are available for
+<a href="db.xhtml?DoubleFloat">DoubleFloat</a>. Use 
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="showcall('p11');"
+   value=")show DoubleFloat"/>
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+to get a list of operations.
+<<page foot>>
+@
+
+\subsection{nummachinesizedintegers.xhtml}
+<<nummachinesizedintegers.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+<div align="center">Machine-sized Integers</div>
+<hr/>
+The <a href="db.xhtml?SingleInteger">SingleInteger</a> is intended to
+provide support in Axiom for machine integer arithmetic. It is generally
+much faster than (bignum) <a href="db.xhtml?Integer">Integer</a> arithmetic
+but suffers from a limited range of values. Since Axiom can be implemented
+on top of various dialects of Lisp, the actual representation of small
+integers may not correspond exactly to the host machines integer
+representation.
+
+You can discover the minimum and maximum values in your implementation by
+using <a href="dbopmin.xhtml">min</a> and <a href="dbopmax.xhtml">max</a>
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+    value="min()$SingleInteger" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" onclick="makeRequest('p2');"
+    value="max()$SingleInteger" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+To avoid confusion with <a href="db.xhtml?Integer">Integer</a>, which is
+the default type for integers, you usually need to work with declared
+variables (see <a href="axbook/section-2.3.xhtml">Declarations</a>).
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" onclick="makeRequest('p3');"
+    value="a:=1234::SingleInteger" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+or use package calling (see 
+<a href="axbook/section-2.9.xhtml">Package Calling and Target Types</a>).
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" onclick="makeRequest('p4');"
+    value="b:=1234$SingleInteger" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+You can add, multiply, and subtract
+<a href="db.xhtml?SingleInteger">SingleInteger</a> objects, and ask for the
+greatest common divisor 
+(<a href="dbopgcd.xhtml">gcd</a>).
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p3','p4','p5']);"
+    value="gcd(a,b)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+The least common multiple 
+(<a href="dboplcm.xhtml">lcm</a>) is also available.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p3','p4','p6']);"
+    value="lcm(a,b)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+Operations
+<a href="dbopmulmod.xhtml">mulmod</a>,
+<a href="dbopaddmod.xhtml">addmod</a>,
+<a href="dbopsubmod.xhtml">submod</a>, and
+<a href="dbopinvmod.xhtml">invmod</a>
+are similar -- they provide arithmetic modulo a given small integer.
+Here is 5*6 mod 13.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" onclick="makeRequest('p7');"
+    value="mulmod(5,6,13)$SingleInteger" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+To reduce a small integer modulo a prime, use
+<a href="dboppositiveremainder.xhtml">positiveRemainder</a>
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" onclick="makeRequest('p8');"
+    value="positiveRemainder(37,13)$SingleInteger" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+Operations <a href="dbopsingleintegerand.xhtml">And</a>,
+<a href="dbopsingleintegeror.xhtml">Or</a>,
+<a href="dbopsingleintegerxor.xhtml">xor</a>,
+and <a href="dbopsingleintegernot.xhtml">Not</a>
+provide bit level operations on small integers.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" onclick="makeRequest('p9');"
+    value="And(3,4)$SingleInteger" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+Use shift(int,numToShift) to shift bits, where int is shifted left if
+numToShift is positive, right if negative.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" onclick="makeRequest('p10');"
+    value="shift(1,4)$SingleInteger" />
+  <div id="ansp10"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p11" class="subbut" onclick="makeRequest('p11');"
+    value="shift(31,-1)$SingleInteger" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+Many other operations are available for small integers, including many of
+those provided for <a href="db.xhtml?Integer">Integer</a>. 
+To see other operations use the system command
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="showcall('p12');"
+   value=")show SingleInteger"/>
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{numnumericfunctions.xhtml}
+<<numnumericfunctions.xhtml>>=
+<<standard head>>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Numeric Functions</div>
+  <hr/>
+Axiom provides two basic floating point types: 
+<a href="numfloat.xhtml">Float</a> and
+<a href="nummachinefloats.xhtml">DoubleFloat</a>. This section
+describes how to use numerical operations defined on these types and
+the related complex types. As we mentioned in
+<a href="axbook/book-contents.xhtml#chapter1">An Overview of Axiom</a>
+in chapter 1., the 
+<a href="numfloat.xhtml">Float</a> type is a software implementation of
+floating point numbers in which the exponent and the significand may have
+any number of digits. See
+<a href="numfloat.xhtml">Float</a> for detailed information about this 
+domain. The 
+<a href="nummachinefloats.xhtml">DoubleFloat</a> is usually a hardware
+implementation of floating point numbers, corresponding to machine double
+precision. The types 
+<a href="dbcomplexfloat.xhtml">Complex Float</a> and 
+<a href="dbcomplexdoublefloat.xhtml">Complex DoubleFloat</a> are the
+corresponding software implementations of complex floating point numbers.
+In this section the term floating point type means any of these four
+types. The floating point types immplement the basic elementary functions.
+These include (where $ means
+<a href="nummachinefloats.xhtml">DoubleFloat</a>,
+<a href="numfloat.xhtml">Float</a>,
+<a href="dbcomplexfloat.xhtml">Complex Float</a>,
+<a href="dbcomplexdoublefloat.xhtml">Complex DoubleFloat</a>):<br/>
+<a href="dbopexp.xhtml">exp</a>,
+<a href="dboplog.xhtml">log</a>: $ -> $<br/>
+<a href="dbopsin.xhtml">sin</a>,
+<a href="dbopcos.xhtml">cos</a>,
+<a href="dboptan.xhtml">tan</a>,
+<a href="dbopcot.xhtml">cot</a>,
+<a href="dbopsec.xhtml">sec</a>,
+<a href="dbopcsc.xhtml">csc</a>: $ -> $<br/>
+<a href="dbopasin.xhtml">asin</a>,
+<a href="dbopacos.xhtml">acos</a>,
+<a href="dbopatan.xhtml">atan</a>,
+<a href="dbopacot.xhtml">acot</a>,
+<a href="dbopasec.xhtml">asec</a>,
+<a href="dbopacsc.xhtml">acsc</a>: $ -> $<br/>
+<a href="dbopsinh.xhtml">sinh</a>,
+<a href="dbopcosh.xhtml">cosh</a>,
+<a href="dboptanh.xhtml">tanh</a>,
+<a href="dbopcoth.xhtml">coth</a>,
+<a href="dbopsech.xhtml">sech</a>,
+<a href="dbopcsch.xhtml">csch</a>: $ -> $<br/>
+<a href="dbopasinh.xhtml">asinh</a>,
+<a href="dbopacosh.xhtml">acosh</a>,
+<a href="dbopatanh.xhtml">atanh</a>,
+<a href="dbopacoth.xhtml">acoth</a>,
+<a href="dbopasech.xhtml">asech</a>,
+<a href="dbopacsch.xhtml">acsch</a>: $ -> $<br/>
+<a href="dboppi.xhtml">pi</a>: () -> $<br/>
+<a href="dbopsqrt.xhtml">sqrt</a>: $ -> $<br/>
+<a href="dbopnthroot.xhtml">nthRoot</a>: ($,Integer) -> $<br/>
+<a href="dbopstarstar.xhtml">**</a>: ($,Fraction Integer) -> $<br/>
+<a href="dbopstarstar.xhtml">**</a>: ($,$) -> $<br/>
+The handling of roots depends on whether the floating point type is
+real or complex: for the real floating point types, 
+<a href="nummachinefloats.xhtml">DoubleFloat</a> and
+<a href="numfloat.xhtml">Float</a>, if a real root exists the one with 
+the same sign as the radicand is returned; for the complex floating
+point types, the principal value is returned. Also, for real floating
+point types the inverse functions produce errors if the results are not
+real. This includes cases such as asin(1.2), log(-3.2), sqrt(-1,1).
+The default floating point type is <a href="numfloat.xhtml">Float</a>
+or <a href="dbcomplexfloat.xhtml">Complex Float</a>, just use normal
+decimal notation.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+    value="exp(3.1)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" onclick="makeRequest('p2');"
+    value="exp(3.1+4.5*%i)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+To evaluate functions using 
+<a href="nummachinefloats.xhtml">DoubleFloat</a> or 
+<a href="dbcomplexdoublefloat.xhtml">Complex DoubleFloat</a>, a 
+declaration or conversion is required.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" onclick="makeRequest('p3');"
+    value="(r:DFLOAT:=3.1; t:DFLOAT:=4.5; exp(r+t*%i))" />
+  <div id="ansp3"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p4" class="subbut" onclick="makeRequest('p4');"
+    value="exp(3.1::DFLOAT+4.5::DFLOAT*%i)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+A number of special functions are provided by the package
+<a href="db.xhtml?DoubleFloatSpecialFunctions">DoubleFloatSpecialFunctions</a>
+for the machine precision floating point types. The special functions
+provided are listed below, where F stands for the types
+<a href="numfloat.xhtml">Float</a>
+or <a href="dbcomplexfloat.xhtml">Complex Float</a>. The real versions
+of the functions yield an error if the result is not real.
+<ul>
+ <li> 
+  <a href="dbopgamma.xhtml">Gamma</a>: F -> F<br/>
+  Gamma(z) is the Euler gamma
+  function, Gamma(Z), defined by<br/>
+  Gamma(z) = integrate(t^(z-1)*exp(-t),t=0..%infinity)
+ </li>
+ <li>
+  <a href="dbopbeta.xhtml">Beta</a>: F -> F<br/>
+  Beta(u,v) is the Euler Beta
+  function B(u,v), defined by <br/>
+  Beta(u,v)=integrate(t^(u-1)*(1-t)^(b-1),t=0..1)<br/>
+  This is related to Gamma(z) by<br/>
+  Beta(u,v)=Gamma(u)*Gamma(v)/Gamma(u+v)
+ </li>
+ <li>
+  <a href="dboploggamma.xhtml">logGamma</a>: F -> F<br/>
+  logGamma(z) is the natural logarithm of Gamma(z). This can often be
+  computed even if Gamma(z) cannot.
+ </li>
+ <li>
+  <a href="dbopdigamma.xhtml">digamma</a>: F -> F<br/>
+  digamma(z), also called psi(z), is the function psi(z), defined by<br/>
+  psi(z)=Gamma'(z)/Gamma(z)
+ </li>
+ <li>
+ <a href="dboppolygamma.xhtml">polygamma</a>: (NonNegativeInteger, F) -> F<br/>
+  polygamma(n,z) is the n-th derivative of digamma(z)
+ </li>
+ <li>
+  <a href="dbopbesselj.xhtml">besselJ</a>: (F, F) -> F<br/>
+  besselJ(v,z) is the Bessel function of the first kind, J(v,z). This 
+  function satisfies the differential equation<br/>
+  z^(2w)''(z)+zw'(z)+(z^2-v^2)w(z)=0
+ </li>
+ <li>
+  <a href="dbopbessely.xhtml">besselY</a>: (F, F) -> F<br/>
+  besselY(v,z) is the Bessel function of the second kind, Y(v,z). This
+  function satisfies the same differential equation as 
+  <a href="dbopbesselj.xhtml">besselJ</a>. The implementation simply
+  uses the relation<br/>
+  Y(v,z)=(J(v,z)cos(v*%pi)-J(-v,z))/sin(v*%pi)
+ </li>
+ <li>
+  <a href="dbopbesseli.xhtml">besselI</a>: (F, F) -> F<br/>
+  besselI(v,z) if the modifed Bessel function of the first kind, I(v,z).
+  This function satisfies the differential equation<br/>
+  z^2w''(z)+zw'(z)-(z^2+v^2)w(z)=0
+ </li>
+ <li>
+  <a href="dbopbesselk.xhtml">besselK</a>: (F, F) -> F<br/>
+  besselK(v,z) is the modifed Bessel function of the second kind, K(v,z).
+  This function satisfies the same differential equation as
+  <a href="dbopbesseli.xhtml">besselI</a>. The implementation simply uses
+  the relation<br/>
+  K(v,z)=%pi*(I(v,z)-I(-v,z))/(2sin(v*%pi))
+ </li>
+ <li>
+  <a href="dbopairyai.xhtml">airyAi</a>: F -> F<br/>
+  airyAi(z) is the Airy function Ai(z). This function satisfies the
+  differential equation<br/>
+  w''(z)-zw(z)=0<br/>
+  The implementation simply uses the relation<br/>
+  Ai(-z)=1/3*sqrt(z)*(J(-1/3,2/3*z^(3/2))+J(1/3,2/3*z^(3/2)))
+ </li>
+ <li>
+  <a href="dbopairybi.xhtml">airyBi</a>: F -> F<br/>
+  airyBi(z) is the Airy function Bi(z). This function satisfies the
+  same differential equation as airyAi.
+  The implementation simply uses the relation<br/>
+  Bi(-z)=1/3*sqrt(3*z)*(J(-1/3,2/3*z^(3/2))-J(1/3,2/3*z^(3/2)))
+ </li>
+ <li>
+  <a href="dbophypergeometric0f1.xhtml">hypergeometric0F1</a>: (F, F) -> F<br/>
+  hypergeometric0F1(c,z) is the hypergeometric function 0F1(;c;z). The above
+  special functions are defined only for small floating point types. If you
+  give <a href="numfloat.xhtml">Float</a> arguments, they are converted to
+  <a href="nummachinefloats.xhtml">DoubleFloat</a> by Axiom.
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut" onclick="makeRequest('p5');"
+    value="Gamma(0.5)^2" />
+  <div id="ansp5"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p6" class="subbut" onclick="makeRequest('p6');"
+    value="(a:=2.1; b:=1.1; besselI(a+%i*b,b*a+1))" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{numoctonions.xhtml}
+<<numoctonions.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Octonions</div>
+  <hr/>
+The Octonions, also called the Cayley-Dixon algebra, defined over a
+commutative ring are an eight-dimensional non-associative algebra. Their
+construction from quaternions is similar to the construction of quaternions
+from complex numbers (see <a href="numquaternions.xhtml">Quaternion</a>).
+As <a href="db.xhtml?Octonion">Octonion</a> creates an eight-dimensional
+algebra, you have to give eight components to construct an octonion.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+    value="oci1:=octon(1,2,3,4,5,6,7,8)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" onclick="makeRequest('p2');"
+    value="oci2:=octon(7,2,3,-4,5,6,-7,0)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Or you can use two quaternions to create an octonion.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" onclick="makeRequest('p3');"
+    value="oci3:=octon(quatern(-7,-12,3,-10),quatern(5,6,9,0))" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+You can easily demonstrate the non-associativity of multiplication.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4']);"
+    value="(oci1*oci2)*oci3-oci1*(oci2*oci3)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+As with the quaternions, we have a real part, the imaginary parts i, j,
+k, and four additional imaginary parts E, I, J, and K. These parts 
+correspond to the canonical basis (1,i,j,k,E,I,J,K). For each basis
+element there is a component operation to extract the coefficient of 
+the basis element for a given octonion.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p5']);"
+value="[real oci1, imagi oci1, imagj oci1, imagk oci1, 
+imagE oci1, imagI oci1, imagJ oci1, imagK oci1]"/>
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+A basis with respect to the quaternions is given by (1,E). However, you 
+might ask, what then are the commuting rules? To answer this, we create
+some generic elements. We do this in Axim by simply changing the ground
+ring from
+<a href="db.xhtml?Integer">Integer</a> to
+<a href="dbpolynomialinteger.xhtml">Polynomial Integer</a>.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" onclick="makeRequest('p6');"
+    value="q:Quaternion Polynomial Integer:=quatern(q1,qi,qj,qk)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" onclick="makeRequest('p7');"
+    value="E:Octonion Polynomial Integer:=octon(0,0,0,0,1,0,0,0)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Note that quaternions are automatically converted to octonions in the
+obvious way.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p6','p7','p8']);"
+    value="q*E" />
+  <div id="ansp8"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p6','p7','p9']);"
+    value="E*q" />
+  <div id="ansp9"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p6','p10']);"
+    value="q*1$(Octonion Polynomial Integer)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p6','p11']);"
+    value="1$(Octonion Polynomial Integer)*q" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+Finally, we check that the <a href="dbopnorm.xhtml">norm</a>, defined as 
+the sum of the squares of the coefficients, is a multiplicative map.
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" onclick="makeRequest('p12');"
+    value="o:Octonion Polynomial Integer:=octon(o1,oi,oj,ok,oE,oI,oJ,oK)" />
+  <div id="ansp12"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="handleFree(['p12','p13']);"
+    value="norm o" />
+  <div id="ansp13"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p14" class="subbut" onclick="makeRequest('p14');"
+    value="p:Octonion Polynomial Integer:=octon(p1,pi,pj,pk,pE,pI,pJ,pK)" />
+  <div id="ansp14"><div></div></div>
+ </li>
+</ul>
+Since the result is 0, the norm is multiplicative
+<ul>
+ <li>
+  <input type="submit" id="p15" class="subbut" 
+    onclick="handleFree(['p12','p14','p15']);"
+    value="norm(o*p)-norm(o)*norm(p)" />
+  <div id="ansp15"><div></div></div>
+ </li>
+</ul>
+Issue the system command
+<ul>
+ <li>
+  <input type="submit" id="p16" class="subbut" 
+    onclick="showcall('p16');"
+   value=")show Octonion"/>
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+to display the list of operations defined by 
+<a href="db.xhtml?Octonion">Octonion</a>.
+<<page foot>>
+@
+
+\subsection{numotherbases.xhtml}
+<<numotherbases.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Expansions in other Bases</div>
+  <hr/>
+It is possible to expand numbers in general bases. Here we expand
+111 in base 5. This means 
+<pre>
+    2   1   0      2    1  -
+  10 +10 +10  = 4*5 +2*5 +5
+</pre>
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+    value="111::RadixExpansion(5)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+You can expand fractions to form repeating expansions.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" onclick="makeRequest('p2');"
+    value="(5/24)::RadixExpansion(2)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p3" class="subbut" onclick="makeRequest('p3');"
+    value="(5/24)::RadixExpansion(3)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p4" class="subbut" onclick="makeRequest('p4');"
+    value="(5/24)::RadixExpansion(8)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut" onclick="makeRequest('p5');"
+    value="(5/24)::RadixExpansion(10)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+For bases from 11 to 36 the letters A through Z are used.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" onclick="makeRequest('p6');"
+    value="(5/24)::RadixExpansion(12)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" onclick="makeRequest('p7');"
+    value="(5/24)::RadixExpansion(16)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p8" class="subbut" onclick="makeRequest('p8');"
+    value="(5/24)::RadixExpansion(36)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+For bases greater than 36, the ragits are separated by blanks.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" onclick="makeRequest('p9');"
+    value="(5/24)::RadixExpansion(38)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+The <a href="db.xhtml?RadixExpansion">RadixExpansion</a> type provides 
+operations to obtain the individual ragits. Here is a rational number
+in base 8.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" onclick="makeRequest('p10');"
+    value="a:=(76543/210)::RadixExpansion(8)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopwholeragits.xhtml">wholeRagits</a> returns
+a list of the ragits for the integral part of the number.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p10','p11']);"
+    value="w:=wholeRagits a" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+The operations <a href="dbopprefixragits.xhtml">prefixRagits</a> and 
+<a href="dbopcycleragits.xhtml">cycleRagits</a> returns lists of the
+initial and repeating ragist in the fractional part of the number.
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut"
+    onclick="handleFree(['p10','p12']);"
+    value="f0:=prefixRagits a" />
+  <div id="ansp12"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p13" class="subbut"
+    onclick="handleFree(['p10','p13']);"
+    value="f1:=cycleRagits a" />
+  <div id="ansp13"><div></div></div>
+ </li>
+</ul>
+You can construct any radix expansion by giving the whole, prefix, and 
+cycle parts. The declaration is necessary to let Axiom know the base 
+of the ragits.
+<ul>
+ <li>
+  <input type="submit" id="p14" class="subbut"
+    onclick="handleFree(['p11','p12','p13','p14']);"
+    value="u:RadixExpansion(8):=wholeRadix(w)+fractRadix(f0,f1)" />
+  <div id="ansp14"><div></div></div>
+ </li>
+</ul>
+If there is no repeating part, then the list [0] should be used.
+<ul>
+ <li>
+  <input type="submit" id="p15" class="subbut" onclick="makeRequest('p15');"
+    value="v:RadixExpansion(12):=fractRadix([1,2,3,11],[0])" />
+  <div id="ansp15"><div></div></div>
+ </li>
+</ul>
+If you are not interested in the repeating nature of the expansion,
+an infinite stream of ragits can be obtained using
+<a href="dbopfractragits.xhtml">fractRagits</a>
+<ul>
+ <li>
+  <input type="submit" id="p16" class="subbut"
+     onclick="handleFree(['p14','p16']);"
+    value="fractRagits(u)" />
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+Of course, it's possible to recover the fraction representation:n
+<ul>
+ <li>
+  <input type="submit" id="p17" class="subbut" 
+    onclick="handleFree(['p10','p17']);"
+    value="a::Fraction(Integer)" />
+  <div id="ansp17"><div></div></div>
+ </li>
+</ul>
+Issue the system command
+<ul>
+ <li>
+  <input type="submit" id="p18" class="subbut" 
+    onclick="showcall('p18');"
+   value=")show RadixExpansion"/>
+  <div id="ansp18"><div></div></div>
+ </li>
+</ul>
+to display the full list of operations defined by
+<a href="db.xhtml"?RadixExpansion>RadixExpansion</a>. More examples of
+expansions are available in
+<a href="numrepeatingdecimals.xhtml">DecimalExpansion</a>,
+<a href="numrepeatingbinaryexpansions.xhtml">BinaryExpansion</a>, and
+<a href="numrepeatinghexexpansions.xhtml">HexadecimalExpansion</a>
+<<page foot>>
+@
+
+\subsection{numpartialfractions.xhtml}
+<<numpartialfractions.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Partial Fractions</div>
+  <hr/>
+A partial fraction is a decomposition of a quotient into a sum of quotients
+where the denominators of the summand are powers of primes. (Most people 
+first encounter partial fractions when they are learning integral calculus.
+For a technical discussion of partial fractions see, for example, Lang's
+Algebra.) For example, the rational number 1/6 is decomposed into 1/2-1/3.
+You can compute partial fractions of quotients of objects from domains
+belonging to the category 
+<a href="db.xhtml?EuclideanDomain">EuclideanDomain</a>. For example,
+<a href="db.xhtml?Integer">Integer</a>,
+<a href="dbcomplexinteger.xhtml">Complex Integer</a>, and
+<a href="db.xhtml?UnivariatePolynomial">
+UnivariatePolynomial(x,Fraction Integer)</a>
+all belong to 
+<a href="db.xhtml?EuclideanDomain">EuclideanDomain</a>. 
+In the examples following, we demonstrate how to decompose quotients of
+each of these kinds of objects into partial fractions. 
+
+It is necessary that we know how to factor the denominator when we want to 
+compute a partial fraction. Although the interpreter can often do this
+automatically, it may be necessary for you to include a call to 
+<a href="dbopfactor.xhtml">factor</a>. In these examples, it is not
+necessary to factor the denominators explicitly. The main operation for
+computing partial fractions is called 
+<a href="dboppartialfraction.xhtml">partialFraction</a> and we use this
+to compute a decomposition of 1/10!. The first argument top
+<a href="dboppartialfraction.xhtml">partialFraction</a> is the numerator
+of the quotient and the second argument is the factored denominator.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+    value="partialFraction(1,factorial 10)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Since the denominators are powers of primes, it may be possible to expand
+the numerators further with respect to those primes. Use the operation
+<a href="dboppadicfraction.xhtml">padicFraction</a> to do this.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" onclick="makeRequest('p2');"
+    value="f:=padicFraction(%)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopcompactfraction.xhtml">compactFraction</a>
+returns an expanded fraction into the usual form. The compacted version
+is used internally for computational efficiency.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p2','p3']);"
+    value="compactFraction(f)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+You can add, subtract, multiply, and divide partial fractions. In addition,
+you can extract the parts of the decomposition.
+<a href="dbopnumberoffractionalterms.xhtml">numberOfFractionalTerms</a>
+computes the number of terms in the fractional part. This does not include
+the whole part of the fraction, which you get by calling
+<a href="dbopwholepart.xhtml">wholePart</a>. In this example, the whole part
+is 0.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p2','p4']);"
+    value="numberOfFractionalTerms(f)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+The operation 
+<a href="dbopnthfractionalterm.xhtml">nthFractionalTerm</a>
+returns the individual terms in the decomposition. Notice that the object
+returned is a partial fraction itself. 
+<a href="dbopfirstnumer.xhtml">firstNumer</a> and
+<a href="dbopfirstdenom.xhtml">firstDenom</a> extract the numerator and
+denominator of the first term of the fraction.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p2','p5']);"
+    value="nthFractionalTerm(f,3)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Given two gaussian integers (see <a href="db.xhtml?Complex">Complex</a>),
+you can decompose their quotient into a partial fraction.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" onclick="makeRequest('p6');"
+    value="g:=partialFraction(1,-13+14*%i)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+To convert back to a quotient, simply use the conversion
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p6','p7']);"
+    value="g::Fraction Complex Integer" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+To conclude this section, we compute the decomposition of
+<pre>
+                   1
+     -------------------------------
+                   2       3       4
+     (x + 1)(x + 2) (a + 3) (x + 4)
+</pre>
+The polynomials in this object have type
+<a href="db.xhtml?UnivariatePolynomial">
+UnivariatePolynomial(x,Fraction Integer)</a>.
+We use the <a href="dbopprimefactor.xhtml">primeFactor</a> operation
+(see <a href="db.xhtml?Factored">Factored</a>) to create the denominator
+in factored form directly.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" onclick="makeRequest('p8');"
+   value="u:FR UP(x,FRAC INT):=reduce(*,[primeFactor(x+i,i) for i in 1..4])"/>
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+These are the compact and expanded partial fractions for the quotient.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p8','p9']);"
+    value="pu:=partialFraction(1,u)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p8','p9','p10']);"
+    value="padicFraction pu" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+Also see
+<a href="db.xhtml?FullPartialFractionExpansion">
+FullPartialFractionExpansion</a> for examples of factor-free conversion of
+quotients to full partial fractions.
+
+Issue the system
+command
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="showcall('p11');"
+   value=")show PartialFraction"/>
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+to display the full list of operations defined by 
+<a href="db.xhtml?PartialFraction">PartialFraction</a>.
+
+<<page foot>>
+@
+
+\subsection{numproblems.xhtml}
+<<numproblems.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      numproblems not implemented
+<<page foot>>
+@
+
+\subsection{numquaternions.xhtml}
+<<numquaternions.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Quaternions</div>
+  <hr/>
+The domain contructor <a href="db.xhtml?Quaternion">Quaternion</a>
+implements quaternions over commutative rings. 
+
+The basic operation for creating quaternions is 
+<a href="dbopquatern.xhtml">quatern</a>. This is a quaternion
+over the rational numbers.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+    value="q:=quatern(2/11,-8,3/4,1)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+The four arguments are the real part, the i imaginary part, 
+the j imaginary part, and the k imaginary part, respectively.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="[real q, imagI q, imagJ q, imagK q]" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Because q is over the rationals (and nonzero), you can invert it.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="inv q" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+The usual arithmetic (ring) operations are available.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p4']);"
+    value="q^6" />
+  <div id="ansp4"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut"  onclick="makeRequest('p5');"
+    value="r:=quatern(-2,3,23/9,-89)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p5','p6']);"
+    value="q+r" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+In general, multiplication is not commutative.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut"
+    onclick="handleFree(['p1','p5','p7']);"
+    value="q*r-r*q" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+There are no predefined constants for the imaginary i, j, and k parts, 
+but you can easily define them
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" onclick="makeRequest('p8');"
+    value="i:=quatern(0,1,0,0)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p9" class="subbut" onclick="makeRequest('p9');"
+    value="j:=quatern(0,0,1,0)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p10" class="subbut" onclick="makeRequest('p10');"
+    value="k:=quatern(0,0,0,1)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+These satisfy the normal identities.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p1','p8','p9','p10','p11']);"
+    value="[i*i,j*j,k*k,i*j,j*k,k*i,q*i]" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+The norm is the quaternion times its conjugate.
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p1','p12']);"
+    value="norm q" />
+  <div id="ansp12"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="handleFree(['p1','p13']);"
+    value="c:=conjugate q" />
+  <div id="ansp13"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p14" class="subbut" 
+    onclick="handleFree(['p1','p13','p14']);"
+    value="q*c" />
+  <div id="ansp14"><div></div></div>
+ </li>
+</ul>
+For information on
+related topics, see <a href="db.xhtml?Complex">Complex</a> and
+<a href="db.xhtml?Octonion">Octonion</a>. You can also issue the
+system command
+<ul>
+ <li>
+  <input type="submit" id="p15" class="subbut" 
+    onclick="showcall('p15');"
+   value=")show Quaternion"/>
+  <div id="ansp15"><div></div></div>
+ </li>
+</ul>
+to display the full list of operations defined by 
+<a href="db.xhtml?Quaternion">Quaternion</a>.
+<<page foot>>
+@
+
+\subsection{numquotientfields.xhtml}
+<<numquotientfields.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      numquotientfields not implemented
+<<page foot>>
+@
+
+\subsection{numrationalnumbers.xhtml}
+<<numrationalnumbers.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      numrationalnumbers not implemented
+<<page foot>>
+@
+
+\subsection{numrepeatingbinaryexpansions.xhtml}
+<<numrepeatingbinaryexpansions.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Repeating Binary Expansions</div>
+  <hr/>
+All rational numbers have repeating binary expansions. Operations to 
+access the individual bits of a binary expansion can be obtained by
+converting the value to 
+<a href="db.xhtml?RadixExpansion">RadixExpansion(2)</a>. More examples
+of expansions are available in
+<a href="numrepeatingdecimals.xhtml">DecimalExpansion</a>,
+<a href="numrepeatinghexexpansions.xhtml">HexadecimalExpansion</a>, and
+<a href="db.xhtml?RadixExpansion">RadixExpansion</a>. 
+
+The expansion (of type 
+<a href="db.xhtml?BinaryExpansion">BinaryExpansion</a>)
+of a rational number is returned by the 
+<a href="dbopbinary.xhtml">binary</a> operation.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+    value="r:=binary(22/7)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Arithmetic is exact.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="r+binary(6/7)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+The period of the expansion can be short or long...
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" onclick="makeRequest('p3');"
+    value="[binary(1/i) for i in 102..106]" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+or very long
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" onclick="makeRequest('p4');"
+    value="binary(1/1007)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+These numbers are bona fide algebraic objects.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" onclick="makeRequest('p5');"
+    value="p:=binary(1/4)*x^2+binary(2/3)*x+binary(4/9)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p5','p6']);"
+    value="q:=D(p,x)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut"
+    onclick="handleFree(['p5','p6','p7']);"
+    value="g:=gcd(p,q)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{numrepeatingdecimals.xhtml}
+<<numrepeatingdecimals.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Repeating Decimals</div>
+  <hr/>
+All rationals have repeating decimal expansions. Operations to access
+the individual digits of a decimal expansion can be obtained by converting
+the value to <a href="db.xhtml?RadixExpansion">RadixExpansion(10)</a>.
+
+The operation <a href="dbopdecimal.xhtml">decimal</a> is used to create
+this expansion of type
+<a href="db.xhtml?DecimalExpansion">DecimalExpansion</a>.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+    value="r:=decimal(22/7)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Arithmetic is exact.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="r+decimal(6/7)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+The period of the expansion can be short or long...
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" onclick="makeRequest('p3');"
+    value="[decimal(1/i) for i in 350..354]" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+or very long
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" onclick="makeRequest('p4');"
+    value="decimal(1/2049)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+These numbers are bona fide algebraic objects.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" onclick="makeRequest('p5');"
+    value="p:=decimal(1/4)*x^2+decimal(2/3)*x+decimal(4/9)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p5','p6']);"
+    value="q:=differentiate(p,x)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut"
+    onclick="handleFree(['p5','p6','p7']);"
+    value="g:=gcd(p,q)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+More examples of expansions are available in
+<a href="numrepeatingbinaryexpansions.xhtml">BinaryExpansion</a>,
+<a href="numrepeatinghexexpansions.xhtml">HexadecimalExpansion</a>, and
+<a href="db.xhtml?RadixExpansion">RadixExpansion</a>. Issue the system
+command
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="showcall('p8');"
+   value=")show RadixExpansion"/>
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+to display the full list of operations defined by
+<a href="db.xhtml?RadixExpansion">RadixExpansion</a>.
+<<page foot>>
+@
+
+\subsection{numrepeatinghexexpansions.xhtml}
+<<numrepeatinghexexpansions.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Repeating Hexadecimal Expansions</div>
+  <hr/>
+All rationals have repeating hexadecimals expansions. The operation
+<a href="dbophex.xhtml">hex</a> returns these expansions of type
+<a href="db.xhtml?HexadecimalExpansion">HexadecimalExpansion</a>.
+Operations to access the individual numerals of a hexadecimal expansion
+can be obtained by converting the value to 
+<a href="db.xhtml?RadixExpansion">RadixExpansion(16)</a>. More examples of
+expansions are available in 
+<a href="numrepeatingdecimals.xhtml">DecimalExpansion</a>,
+<a href="numrepeatingbinaryexpansions.xhtml">BinaryExpansion</a>, and 
+<a href="db.xhtml?RadixExpansion">RadixExpansion</a>.
+
+This is a hexadecimal expansion of a rational number.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+    value="r:=hex(22/7)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Arithmetic is exact.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="r+hex(6/7)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+The period of the expansion can be short or long...
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" onclick="makeRequest('p3');"
+    value="[hex(1/i) for i in 350..354]" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+or very long.
+.<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" onclick="makeRequest('p4');"
+    value="hex(1/1007)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+These numbers are bona fide algebraic objects.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" onclick="makeRequest('p5');"
+    value="p:=hex(1/4)*x^2+hex(2/3)*x+hex(4/9)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p5','p6']);"
+    value="q:=D(p,x)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut"
+    onclick="handleFree(['p5','p6','p7']);"
+    value="g:=gcd(p,q)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Issue the system command
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="showcall('p8');"
+   value=")show HexadecimalExpansion"/>
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+to display the full list of operations defined by
+<a href="db.xhtml?HexadecimalExpansion">HexadecimalExpansion</a>.
+
+<<page foot>>
+@
+
+\subsection{numromannumerals.xhtml}
+<<numromannumerals.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Roman Numerals</div>
+  <hr/>
+The Roman numeral package was added to Axiom in MCMLXXXVI for use in
+denoting higher order derivatives.
+
+For example, let f be a symbolic operator.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" onclick="makeRequest('p1');"
+    value="f:=operator 'f" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+This is the seventh derivative of f with respect to x
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" onclick="makeRequest('p2');"
+    value="D(f x,x,7)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+You can have integers printed as Roman numerals by declaring variables
+to be of type 
+<a href="db.xhtml?RomanNumeral">RomanNumeral</a> 
+(abbreviation <a href="db.xhtml?RomanNumeral">ROMAN</a>).
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" onclick="makeRequest('p3');"
+    value="a:=roman(1978-1965)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+This package now has a small but devoted group of followers that claim
+this domain has shown its efficacy in many other contexts. They claim
+that Roman numerals are every bit as useful as ordinary integers.
+In a sense, they are correct, because Roman numerals form a ring and
+you can therefore construct polynomials with Roman numeral 
+coefficients, matrices over Roman numerals,etc..
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" onclick="makeRequest('p4');"
+    value="x:UTS(ROMAN,'x,0):=x" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+Was Fibonacci Italian or ROMAN?
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p4','p5']);"
+    value="recip(1-x-x^2)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+You can also construct fractions with Roman numeral numerators and 
+denominators, as this matrix Hilberticus illustrates.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" onclick="makeRequest('p6');"
+    value="m:MATRIX FRAC ROMAN" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p6','p7']);"
+    value="m:=matrix [ [1/(i+j) for i in 1..3] for j in 1..3]" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Note that the inverse of the matrix has integral 
+<a href="db.xhtml?RomanNumeral">ROMAN</a> entries.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p6','p7','p8']);"
+    value="inverse m" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+Unfortunately, the spoil-sports say that the fun stops when the
+numbers get big -- mostly because the Romans didn't establish
+conventions about representing very large numbers.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" onclick="makeRequest('p9');"
+    value="y:=factorial 10" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+You work it out!
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p9','p10']);"
+    value="roman y" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+Issue the system command
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="showcall('p11');"
+   value=")show RomanNumeral"/>
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+to display the full list of operations defined by 
+<a href="db.xhtml?RomanNumeral">RomanNumeral</a>).
+<<page foot>>
+@
+
+%%O
+\subsection{ocwmit18085.xhtml}
+<<ocwmit18085.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+18.085 Mathematical Methods for Engineers I Course Notes
+<hr/>
+These are course notes based on the 
+<a href="http://ocw.mit.edu/OcwWeb/Mathematics/18-085Fall-2005/VideoLectures/index.htm">
+ M.I.T. Open Courseware lectures by Gilbert Strang. 
+</a> 
+<ul>
+ <li>
+  <a href="ocwmit18085lecture1.xhtml">
+   Positive Definite Matrices K=A'CA
+  </a>
+ </li>
+ <li>
+  <a href="ocwmit18085lecture2.xhtml">
+   One-dimensional Applications: A = Difference Matrix
+  </a>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{ocwmit18085lecture1.xhtml}
+<<ocwmit18085lecture1.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+ Positive Definite Matrices K=A'CA
+<hr/>
+In applied mathematics we have 2 basic tasks:
+<ul>
+<li>Find the equations</li>
+<li>Solve the equations</li>
+</ul>
+<h4>Positive Definite Matrices</h4>
+Certain matrices occur frequently in applied math. These three
+matrices (K,T,and M) are canonical examples.
+We have 3 3x3 matrices, 
+<pre>
+K:Matrix(Integer):=[[2,-1,0],[-1,2,-1],[0,-1,2]]
+
+        + 2   - 1   0 +
+        |             |
+        |- 1   2   - 1|
+        |             |
+        + 0   - 1   2 +
+               Type: Matrix Integer
+T:Matrix(Integer):=[[1,-1,0],[-1,2,-1],[0,-1,2]]
+
+        + 1   - 1   0 +
+        |             |
+        |- 1   2   - 1|
+        |             |
+        + 0   - 1   2 +
+               Type: Matrix Integer
+B:Matrix(Integer):=[[1,-1,0],[-1,2,-1],[0,-1,1]]
+
+        + 1   - 1   0 +
+        |             |
+        |- 1   2   - 1|
+        |             |
+        + 0   - 1   1 +
+               Type: Matrix Integer
+</pre>
+These matrices are similar and can be generalized to square matrices
+of order N, with n x n elements. All of these matrices have the same
+element along the diagonal. T (aka Top) differs from K in the first row.
+B (aka Both) differs from K in the first and last row. These represent
+different boundary conditions in the problem.
+
+We can create K(n), T(n) and B(n) with the following commands:
+<pre>
+k(n) == 
+ M := diagonalMatrix([2 for i in 1..n]) 
+ for i in 1..n-1 repeat M(i,i+1):=-1 
+ for i in 1..n-1 repeat M(i+1,i):=-1 
+ M::SquareMatrix(n,Fraction(Integer))
+</pre>
+<pre>
+t(n) == 
+ M:=k(n)
+ N:=M::Matrix(Fraction(Integer)) 
+ qsetelt!(N,1,1,1) 
+ N::SquareMatrix(n,Fraction(Integer))
+</pre>
+<pre>
+b(n) == 
+ M:=k(n)
+ N:=M::Matrix(Fraction(Integer)) 
+ qsetelt!(N,1,1,1) 
+ qsetelt!(N,n,n,1)
+ N::SquareMatrix(n,Fraction(Integer))
+</pre>
+
+K:=k(n) has a few key properties:
+<ul>
+<li> K is symmetric, that is K=K^T</li>
+<li> K might be nonsingular, that is, it is invertible</li>
+<li> K has a non-zero determinant</li>
+<li> K is banded (main diagonal and neighbors)</li>
+<li> K is tri-diagonal (main diagonal and nearest neighbors</li>
+<li> K is extremely sparse</li>
+<li> K has constant diagonals, (shift invariant, time invariant)</li>
+<li> K is Toeplitz (constant diagonal, shows up in filters)</li>
+<li> K is good for Fourier analysis</li>
+</ul>
+
+<h5>The inverse of T</h5>
+If we look at the inverse of the T matrix we see:
+<pre>
+T^-1
+
+        +3  2  1+
+        |       |
+        |2  2  1|
+        |       |
+        +1  1  1+
+               Type: Matrix Fraction Integer
+</pre>
+Notice that these are all integers because the determinant of
+this matrix is 1
+<pre>
+determinant T
+
+     1
+               Type: Fraction Integer
+
+</pre>
+We can check that this matrix is the inverse of T. 
+
+When computing the inverse the row pattern [-1 2 -1] is a 
+``second difference''. The first column of the inverse matrix
+is [3 2 1] which is linear. When we take the second difference
+of a linear object we should get 0. Thus,
+<pre>
+[[-1,2,-1]]::MATRIX(INT)*[[3],[2],[1]]
+
+     [0]
+               Type: Matrix Integer
+
+</pre>
+The third column of the T matrix is linear and constant. If we
+take the second difference of that we also find it is zero:
+<pre>
+ [[-1,2,-1]]::MATRIX(INT)*[[1],[1],[1]]
+
+    [0]
+               Type: Matrix Integer
+</pre>
+and the diagonal element of the unit matrix must be one. So
+the second difference of the second column is:
+<pre>
+ [[-1,2,-1]]::MATRIX(INT)*[[2],[2],[1]]
+
+    [1]
+               Type: Matrix Integer
+</pre>
+So these simple checks show that we're getting the correct 
+row and column values for the identity matrix by multiplying
+T times its inverse.
+
+<br/>
+<h5>The inverse of B</h5>
+If we look for the inverse of the B matrix we can observe
+that the rows sum to zero which implies that it is not
+invertible. Thus it is singular.
+
+K and T are positive definite. B is only positive semi-definite.
+
+If we can find a vector that it takes to zero, that is if we can
+solve for x,y,z in:
+<pre>
+        + 1   - 1   0 + + x +    + 0 +
+        |             | |   |    |   |
+        |- 1   2   - 1| | y | =  | 0 |
+        |             | |   |    |   |
+        + 0   - 1   1 + + z +    + 0 +
+
+</pre>
+The constant vector [1 1 1] solves this equation. When
+the rows sum to zero we are adding each row by a constant
+and thus we add each row times the constant one and we
+get zeros. If the matrix takes some vector to zero it
+cannot have an inverse since if
+<pre>
+   B x = 0
+</pre>
+and x is not zero. If B had an inverse only x=0 would
+solve the equation. Since x=1 solves the equation B has
+no inverse. The vector x is in the nullspace of B. In
+fact any constant vector, e.g. [3 3 3] is in the nullspace.
+Thus the nullspace of B is cx for any constant c.
+
+When doing matrix multiplication one way to think about the
+work is to consider the problem by columns. Thus in the
+multiplication
+<pre>
+        + 1   - 1   0 + + x +    + 0 +
+        |             | |   |    |   |
+        |- 1   2   - 1| | y | =  | 0 |
+        |             | |   |    |   |
+        + 0   - 1   1 + + z +    + 0 +
+
+</pre>
+we can think about this as 
+<pre>
+x*(first column) + y*(second column) + z*(third column).
+</pre>
+and for the constant vector [1 1 1] this means that we
+just need to sum the columns.
+
+Alternatively this can be computed by thinking of the 
+multiplication as 
+<pre>
+ (first row)*(vector)
+ (second row)*(vector)
+ (third row)*(vector)
+</pre>
+
+<br/>
+<h5>The inverse of K</h5>
+Now we consider the K matrix we see the inverse
+<pre>
+K
+
+         + 2   - 1   0 +
+         |             |
+         |- 1   2   - 1|
+         |             |
+         + 0   - 1   2 +
+               Type: SquareMatrix(3,Fraction Integer)
+kinv:=K^-1
+
+         +3  1  1+
+         |-  -  -|
+         |4  2  4|
+         |       |
+         |1     1|
+         |-  1  -|
+         |2     2|
+         |       |
+         |1  1  3|
+         |-  -  -|
+         +4  2  4+
+               Type: SquareMatrix(3,Fraction Integer)
+</pre>
+We can take the determinant of k 
+<pre>
+determinant K
+
+    4
+               Type: Fraction Integer
+</pre>
+Thus there is a constant 1/4 which can be factored out
+<pre>
+4*kinv
+
+         +3  2  1+
+         |       |
+         |2  4  2|
+         |       |
+         +1  2  3+
+               Type: SquareMatrix(3,Fraction Integer)
+</pre>
+Notice that the inverse is a symmetric matrix but not tri-diagonal.
+The inverse is not a sparse matrix so much more computation would
+be involved when using the inverse.
+
+In order to solve the system
+<pre>
+ K u = f
+</pre>
+by elimination which implies multiplying and subtracting rows.
+<pre>
+       K    u  =  f    ==>   U     u  =    f
+</pre>                                        
+For the 2x2 case we see:
+<pre>
+                             +2  -1+        +  f1  +
+    +2  -1+  +x+   +f1+      |     |  +x+   |      |
+    |     |  | | = |  |  ==> |    3|  | | = |   1  |
+    +-1  2+  +y+   +f2+      |0   -|  +y+   |f2+-f1|
+                             +    2+        +   2  +
+
+
+</pre>
+By multiplying row1 by 1/2 and adding it to row2 we create an
+upper triangular matrix U. Since we chose K(1,1), the number 2
+is called the first pivot. K(2,2), the number 3/2, is called 
+the second pivot.
+
+For K 2x2 above is symmetric and invertible (since the pivots
+are all non-zero).
+
+For the K 3x3 case the pivots are 2, 3/2, and 4/3. (The next pivots
+would be 5/4, 6/5, etc. for larger matrices).
+
+For the T 3x3 case the pivots are 1, 1, and 1.
+
+For the B 3x3 case the third pivot would be zero.
+
+<hr/>
+<h5>Generalizing the matrix pivot operations</h5>
+For the 2x2 case we see contruct an elimination matrix E which we can use
+to pre-multipy by K to give us the upper triangular matrix U
+<pre>
+      E     K    =   U
+</pre>
+In detail we see
+<pre>
+
+    +1  0+            +2  -1+
+    |    |  +2  -1+   |     |
+    |1   |  |     | = |    3|
+    |-  1|  +-1  2+   |0   -|
+    +2   +            +    2+
+
+</pre>
+We wish to rewrite this as
+<pre>
+       K = L U 
+</pre>
+
+<hr/>
+<h5>The big 4 solve operations in Linear Algebra</h5>
+<ol>
+<li>Elimination</li>
+<li>Gram-Schmidt Orthoginalization</li>
+<li>Eigenvalues</li>
+<li>Singular Value Decomposition</li>
+</ol>
+Each of these operations is described by a factorization of K.
+Elimination is written 
+<pre>
+  K = L U
+</pre>
+where L is lower triangular and U is upper triangular.
+Thus we need a matrix L which when multiplied by U gives K.
+The required matrix is the inverse of the E matrix above since
+<pre>
+
+1)      E K =     U
+
+     -1        -1
+2)  E   E K = E   U
+
+               -1
+3)      I K = E   U
+
+               -1
+4)  but   L = E
+
+5)  so    K = L U
+</pre>
+Given the matrix operations above we had
+<pre>
+      E       K   =   U
+
+    +1  0+            +2  -1+
+    |    |  +2  -1+   |     |
+    |1   |  |     | = |    3|
+    |-  1|  +-1  2+   |0   -|
+    +2   +            +    2+
+
+</pre>
+and the inverse of E is the same matrix with a minus sign in
+the second row, thus:
+<pre>
+        +  1  0+ 
+   -1   |      | 
+  E   = |  1   | = L 
+        |- -  1| 
+        +  2   + 
+
+</pre>
+
+<hr/>
+<h5>Making the matrices symmetric</h5>
+We would like to preserve the symmetry property which we can
+do with a further decomposition of LU as follows:
+<pre>
+      L        U     =     L        D       U'
+
+  +  1  0+  +2  -1+    +  1  0+  +2  0+  +1   1+
+  |      |  |     |    |      |  |    |  |  - -|
+  |  1   |  |    3|  = |  1   |  |   3|  |    2|
+  |- -  1|  |0   -|    |- -  1|  |0  -|  |     |
+  +  2   +  +    2+    +  2   +  +   2+  +0   1+
+
+</pre>
+So now we have 3 matrices; L is the lower triangular,
+D is symmetric and contains the pivots, and U' is upper triangular and
+is the transpose of the lower. So the real form we have is
+<pre>
+           T
+    L  D  L
+</pre>
+This result will always be symmetric. We can check this by taking
+its transpose. If we get the same matrix we must have a symmetric
+matrix. So the transpose of
+<pre>
+            T  T     TT  T   T        T T        T
+  (  L  D  L  )   = L   D   L   =  L D L  = L D L
+</pre>
+<hr/>
+<h5>Positive Definite Matrices</h5>
+There are several ways to recognize a positive definite matrix.
+First, it must be symmetric. The "positive" aspect comes from
+the pivots, all of which must be positive. Note that T is also
+positive definite. B is positive semi-definite because one of
+the pivots is zero. So
+<pre>
+   positive definite      == all pivots >  0
+   positive semi-definite == all pivots >= 0
+</pre>
+When all the pivots are positive then all the eigenvalues are positive.
+
+So a positive definite matrix K and any non-zero vector X
+<pre>
+    T
+   X  K X  > 0
+</pre>
+X transpose is just a row and X is just a column.
+
+<<page foot>>
+@
+
+\subsection{ocwmit18085lecture2.xhtml}
+<<ocwmit18085lecture2.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+ One-dimensional Applications: A = Difference Matrix
+<hr/>
+<h5>Difference Matrices</h5>
+<hr/>
+<h5>Second Differences</h5>
+<hr/>
+<h5>Stiffness Matrix</h5>
+<hr/>
+<h5>Boundary Conditions</h5>
+<<page foot>>
+@
+
+\subsection{operations.xhtml}
+<<operations.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      operations not implemented
+<<page foot>>
+@
+
+
+%%P
+\subsection{pagelist.xhtml}
+<<pagelist.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      pagelist not implemented
+<<page foot>>
+@
+
+\subsection{pagematrix.xhtml}
+<<pagematrix.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      pagematrix not implemented
+<<page foot>>
+@
+
+\subsection{pageonedimensionalarray.xhtml}
+<<pageonedimensionalarray.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      pageonedimensionalarray not implemented
+<<page foot>>
+@
+
+\subsection{pageset.xhtml}
+<<pageset.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      pageset not implemented
+<<page foot>>
+@
+
+\subsection{pagetable.xhtml}
+<<pagetable.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      pagetable not implemented
+<<page foot>>
+@
+
+\subsection{pagepermanent.xhtml}
+<<pagepermanent.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      pagepermanent not implemented
+<<page foot>>
+@
+
+\subsection{pagesquarematrix.xhtml}
+<<pagesquarematrix.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      pagesquarematrix not implemented
+<<page foot>>
+@
+
+\subsection{pagetwodimensionalarray.xhtml}
+<<pagetwodimensionalarray.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">TwoDimensionalArray</div>
+  <hr/>
+The <a href="db.xhtml?TwoDimensionalArray">TwoDimensionalArray</a> is used for
+storing data in a two-dimensional data structure indexed by row and column.
+Such an array is a homogeneous data structure in that all the entries of the
+array must belong to the same Axiom domain (although see 
+<a href="axbook/section-2.6.xhtml">The Any Domain</a>). Each array has a fixed 
+number of rows and columns specified by the user and arrays are not 
+extensible. In Axiom, the indexing of two-dimensional arrays is one-based.
+This means that both the "first" row of an array and the "first" column of
+an array are given the index 1. Thus, the entry in the upper left corner
+of an array is in position (1,1).
+
+The operation <a href="dbopnew.xhtml">new</a> creates an array with a 
+specified number of rows and columns and fills the components of that array 
+with a specified entry. The arguments of this operation specify the number
+of rows, the number of columns, and the entry. This creates a five-by-four
+array of integers, all of whose entries are zero.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="arr:ARRAY2 INT:=new(5,4,0)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+The entries of this array can be set to other integers using the operation
+<a href="dbopsetelt.xhtml">setelt</a>. 
+
+Issue this to set the element in the upper left corner of this array to 17.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="setelt(arr,1,1,17)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Now the first element of the array is 17.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="arr" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+Likewise, elements of an array are extracted using the operation
+<a href="dbopelt.xhtml">elt</a>.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p2','p4']);"
+    value="elt(arr,1,1)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+Another way to use these two operations is as follows. This sets the
+element in position (3,2) of the array to 15.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p2','p5']);"
+    value="arr(3,2):=15" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+This extracts the element in position (3,2) of the array.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p6']);"
+    value="arr(3,2)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopelt.xhtml">elt</a> and 
+<a href="dbopsetelt.xhtml">setelt</a> come equipped with an error check
+which verifies that the indices are in the proper ranges. For example,
+the above array has five rows and four columns, so if you ask for the
+entry in position (6,2) with arr(6,2) Axiom displays an error message.
+If there is no need for an error check, you can call the operations
+<a href="dbopqelt.xhtml">qelt</a> and
+<a href="dbopqseteltbang.xhtml">qsetelt!</a> 
+which provide the same functionality
+but without the error check. Typically, these operations are called in
+well-tested programs.
+
+The operations <a href="dboprow.xhtml">row</a> and
+<a href="dbopcolumn.xhtml">column</a> extract rows and columns, respectively,
+and return objects of 
+<a href="db.xhtml?OneDimensionalArray">OneDimensionalArray</a> with the
+same underlying element type.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p7']);"
+    value="row(arr,1)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p8']);"
+    value="column(arr,1)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+You can determine the dimensions of an array by calling the operations
+<a href="dbopnrows.xhtml">nrows</a> and
+<a href="dbopncols.xhtml">ncols</a>, which return the number of rows
+and columns, respectively.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p9']);"
+    value="nrows(arr)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p10']);"
+    value="ncols(arr)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+To apply an operation to every element of an array, use
+<a href="dbopmap.xhtml">map</a>. This creates a new array. This 
+expression negates every element.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p11']);"
+    value="map(-,arr)" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+This creates an array where all the elements are doubled.
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p11','p12']);"
+    value="map((x+->x+x),arr)" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+To change the array destructively, use 
+<a href="dbopmapbang.xhtml">map!</a> instead of 
+<a href="dbopmap.xhtml">map</a>.
+If you need to make a copy of an array,
+use <a href="dbopcopy.xhtml">copy</a>.
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p11','p12','p13']);"
+    value="arrc:=copy(arr)" />
+  <div id="ansp13"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p14" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p11','p12','p13','p14']);"
+    value="map!(-,arrc)" />
+  <div id="ansp14"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p15" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p11','p12','p13','p14','p15']);"
+    value="arrc" />
+  <div id="ansp15"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p16" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p11','p12','p16']);"
+    value="arr" />
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+Use <a href="dbopmemberq.xhtml">member?</a> to see if a given element is in
+an array.
+<ul>
+ <li>
+  <input type="submit" id="p17" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p11','p12','p17']);"
+    value="member?(17,arr)" />
+  <div id="ansp17"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p18" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p11','p12','p18']);"
+    value="member?(10317,arr)" />
+  <div id="ansp18"><div></div></div>
+ </li>
+</ul>
+To see how many times an element appears in an array, use 
+<a href="dbopcount.xhtml">count</a>.
+<ul>
+ <li>
+  <input type="submit" id="p19" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p11','p12','p19']);"
+    value="count(17,arr)" />
+  <div id="ansp19"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p20" class="subbut" 
+    onclick="handleFree(['p1','p2','p5','p11','p12','p20']);"
+    value="count(0,arr)" />
+  <div id="ansp20"><div></div></div>
+ </li>
+</ul>
+For more information about the operations available for 
+<a href="db.xhtml?TwoDimensionalArray">TwoDimensionalArray</a>, issue
+<ul>
+ <li>
+  <input type="submit" id="p21" class="subbut" 
+    onclick="showcall('p21');"
+   value=")show TwoDimensionalArray"/>
+  <div id="ansp21"><div></div></div>
+ </li>
+</ul>
+For more information on related topics, see
+<a href="pagematrix.xhtml">Matrix</a> and
+<a href="pageonedimensionalarray.xhtml">OneDimensionalArray</a>.
+<<page foot>>
+@
+
+\subsection{pagevector.xhtml}
+<<pagevector.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      pagevector not implemented
+<<page foot>>
+@
+
+
+\subsection{polybasicfunctions.xhtml}
+<<polybasicfunctions.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Basic Operations on Polynomials</div>
+  <hr/>
+You create polynomials using the usual operations of
+<a href="dbopplus.xhtml">+</a>, 
+<a href="dbopminus.xhtml">-</a>, 
+<a href="dboptimes.xhtml">*</a>
+(for multiplication), and 
+<a href="dbopstarstar.xhtml">**</a> (or 
+<a href="dbopstarstar.xhtml">^</a>. Here are two examples:
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="p:=a*x**2+b*x*y+c*y**2" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="q:=12*x^2+3*z" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+These operations can also be used to combine polynomials. Try the following:
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="p+q" />
+  <div id="ansp3"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p2','p4']);"
+    value="p-3*q" />
+  <div id="ansp4"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p2','p5']);"
+    value="p**2+p*q" />
+  <div id="ansp5"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p2','p6']);"
+    value="r:=(p+q)**2" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+As you can see from the above examples, the variables are ordered by defaults
+<pre>
+  z > y > x > c > b > a
+</pre>
+That is, z is the main variable, then y and so on in reverse alphabetical
+order. You can redefine this ordering (for display purposes) with the
+<a href="dbopsetvariableorder.xhtml">setVariableOrder</a>. For example, the
+following makes a the main variable, then b, and so on:
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="setVariableOrder [a,b,c,x,y,z]" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Now compare the way polynomials are displayed:
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p1','p7','p8']);"
+    value="p" />
+  <div id="ansp8"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p2','p7','p9']);"
+    value="q" />
+  <div id="ansp9"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p1','p2','p6','p7','p10']);"
+    value="r" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+To return to the system's default ordering, use
+<a href="dbopresetvariableorder.xhtml">resetVariableOrder</a>.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="makeRequest('p11');"
+    value="resetVariableOrder()" />
+  <div id="ansp11"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p1','p11','p12']);"
+    value="p" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+Polynomial coefficients can be pulled out using the function
+<a href="dbopcoefficient.xhtml">coefficient</a>. For example:
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="handleFree(['p2','p13']);"
+    value="coefficient(q,x,2)" />
+  <div id="ansp13"><div></div></div>
+ </li>
+</ul>
+will give you the coefficient of x**2 in the polynomial q. Try these
+commands:
+<ul>
+ <li>
+  <input type="submit" id="p14" class="subbut" 
+    onclick="handleFree(['p6','p14']);"
+    value="coefficient(r,x,3)" />
+  <div id="ansp14"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p15" class="subbut" 
+    onclick="handleFree(['p6','p15']);"
+    value="c:=coefficient(r,z,1)" />
+  <div id="ansp15"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p16" class="subbut" 
+    onclick="handleFree(['p6','p15','p16']);"
+    value="coefficient(c,x,2)" />
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+Coefficients of monomials can be obtained as follows:
+<ul>
+ <li>
+  <input type="submit" id="p17" class="subbut" 
+    onclick="handleFree(['p2','p17']);"
+    value="coefficient(q**2,[x,z],[2,1])" />
+  <div id="ansp17"><div></div></div>
+ </li>
+</ul>
+This will return the coefficient of x**2*z in the polynomial q**2. Also,
+<ul>
+ <li>
+  <input type="submit" id="p18" class="subbut" 
+    onclick="handleFree(['p1','p2','p6','p18']);"
+    value="coefficient(r,[x,y],[2,2])" />
+  <div id="ansp18"><div></div></div>
+ </li>
+</ul>
+will return the coefficient of x**2*y**2 in the polynomial r(x,y).
+<<page foot>>
+@
+
+\subsection{polyfactorization.xhtml}
+<<polyfactorization.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <div align="center">Polynomial Factorization</div>
+  <hr/>
+The Axiom polynomial factorization facilities are available for all
+polynomial types and a wide variety of coefficient domains. Here are
+some examples.
+<ul>
+ <li>
+  <a href="polyfactorization1.xhtml">
+   Integer and Rational Number Coefficients
+  </a>
+ </li>
+ <li>
+  <a href="polyfactorization2.xhtml">
+   Finite Field Coefficients
+  </a>
+ </li>
+ <li>
+  <a href="polyfactorization3.xhtml">
+   Simple Algebraic Extension Field Coefficients
+  </a>
+ </li>
+ <li>
+  <a href="polyfactorization4.xhtml">
+   Factoring Rational Functions
+  </a>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{polyfactorization1.xhtml}
+<<polyfactorization1.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Integer and Rational Number Coefficients</div>
+  <hr/>
+Polynomials with integer coefficients can be factored.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="v:=(4*x^3+2*y^2+1)*(12*x^5-(1/2)*x^3+12)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="factor v" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Also, Axiom can factor polynomials with rational number coefficients
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="w:=(4*x^3+(2/3)*x^2+1)*(12*x^5-(1/2)*x^3+12)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p3','p4']);"
+    value="factor w" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{polyfactorization2.xhtml}
+<<polyfactorization2.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Finite Field Coefficients</div>
+  <hr/>
+Polynomials with coefficients in a finite filed can also be factored.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="u:POLY(PF(19)):=3*x^4+2*x^2+15*x+18" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+These include the integers mod p, where p is prime, and extensions of these
+fields.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="factor u" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Convert this to have coefficients in the finite field with 
+19**3 elements. See
+<a href="axbook/section-8.11.xhtml">FiniteFields</a> for more information
+about finite fields.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="factor(u::POLY FFX(PF 19,3))" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{polyfactorization3.xhtml}
+<<polyfactorization3.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Simple Algebraic Extension Field Coefficients</div>
+  <hr/>
+Polynomials with coefficients in simple algebraic extensions of the 
+rational numbers can be factored. 
+
+Here, aa and bb are symbolic roots of polynomials.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="aa:=rootOf(aa^2+aa+1)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="p:=(x^2+aa^2*x+y)*(aa*x^2+aa*x+aa*y^2)^2" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Note that the second argument to factor can be a list of algebraic
+extensions to factor over.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="factor(p,[aa])" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+This factors x^2+3 over the integers.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="factor(x^2+3)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+Factor the same polynomial over the field obtained by adjoining aa to the
+rational numbers.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p5']);"
+    value="factor(x^2+3,[aa])" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Factor x^6+108 over the same field.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p6']);"
+    value="factor(x^6+108,[aa])" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="bb:=rootOf(bb^3-2)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p7','p8']);"
+    value="factor(x^6+8,[bb])" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+Factor again over the field obtained by adjoining both aa and bb to the 
+rational numbers.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p1','p7','p9']);"
+    value="factor(x^6+108,[aa,bb])" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{polyfactorization4.xhtml}
+<<polyfactorization4.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Factoring Rational Functions</div>
+  <hr/>
+Since fractions of polynomials form a field, every element (other than zero)
+divides any other, so there is no useful notion of irreducible factors. 
+Thus the <a href="dbopfactor.xhtml">factor</a> operation is not very useful
+for fractions of polynomials.
+
+Instead, there is a specific operation 
+<a href="dbopfactorfraction.xhtml">factorFraction</a> that separately
+factors the numerator and denominator and returns a fraction of the
+factored results.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="factorFraction((x^2-4)/(y^2-4))" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+You can also use <a href="dbopmap.xhtml">map</a>. This expression applies
+the <a href="dbopfactor.xhtml">factor</a> operation to the numerator and
+denominator.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="map(factor,(x^2-4)/(y^2-4))" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{polygcdandfriends.xhtml}
+<<polygcdandfriends.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+<div align="center">
+ Greatest Common Divisors, Resultants, and Discriminants
+</div>
+<hr/>
+You can compute the greatest common divisor of two polynomials using the
+function <a href="dbopgcd.xhtml">gcd</a>. Here's an example:
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="p:=3*x^8+2*x^7+6*x^2+7*x+2" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="q:=2*x^13+9*x^7+2*x^6+10*x+5" />
+  <div id="ansp2"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p2','p3']);"
+    value="gcd(p,q)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+You could also see that p and q have a factor in common by using the
+function <a href="dbopresultant.xhtml">resultant</a>:
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p2','p4']);"
+    value="resultant(p,q,x)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+The resultant of two polynomials vanishes precisely when they have a
+factor in common. (In the example above we specified the variable with which
+we wanted to compute the resultant because the polynomials could have
+involved variables other than x.)
+<<page foot>>
+@
+
+\subsection{polynomialpage.xhtml}
+<<polynomialpage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <div align="center">Polynomials</div>
+  <hr/>
+<table>
+ <tr>
+  <td>
+   <a href="polybasicfunctions.xhtml">Basic Functions</a>
+  </td>
+  <td>
+   Create and manipulate polynomials
+  </td>
+ </tr>
+ <tr>
+  <td>
+   <a href="polysubstitutions.xhtml">Substitutions</a>
+  </td>
+  <td>
+   Evaluate Polynomials
+  </td>
+ </tr>
+ <tr>
+  <td>
+   <a href="polyfactorization.xhtml">Factorization</a>
+  </td>
+  <td>
+   Factor in different contexts
+  </td>
+ </tr>
+ <tr>
+  <td>
+   <a href="polygcdandfriends.xhtml">GCD and Friends</a>
+  </td>
+  <td>
+   Greatest Common Divisors, Resultants, and Discriminants
+  </td>
+ </tr>
+ <tr>
+  <td>
+   <a href="polyroots.xhtml">Roots</a>
+  </td>
+  <td>
+   Work with and solve for roots
+  </td>
+ </tr>
+ <tr>
+  <td>
+   <a href="polyspecifictypes.xhtml">Specific Types</a>
+  </td>
+  <td>
+   More specific information
+  </td>
+ </tr>
+</table>
+<<page foot>>
+@
+
+\subsection{polyroots.xhtml}
+<<polyroots.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <div align="center">Roots of Polynomials</div>
+  <hr/>
+<table>
+ <tr>
+  <td>
+   <a href="polyroots1.xhtml">
+    Using a Single Root of a Polynomial
+   </a>
+  </td>
+  <td>
+   Working with a single root of a polynomial
+  </td>
+ </tr>
+ <tr>
+  <td>
+   <a href="polyroots2.xhtml">
+    Using All Roots of a Polynomial
+   </a>
+  </td>
+  <td>
+   Working with all the roots of a polynomial
+  </td>
+ </tr>
+ <tr>
+  <td>
+   <a href="polyroots3.xhtml">
+    Solution of a Single Polynomial Equation
+   </a>
+  </td>
+  <td>
+   Finding the roots of one polynomial
+  </td>
+ </tr>
+ <tr>
+  <td>
+   <a href="polyroots4.xhtml">
+    Solution of Systems of Polynomial Equations
+   </a>
+  </td>
+  <td>
+   Finding the roots of a system of polynomials
+  </td>
+ </tr>
+</table>
+<<page foot>>
+@
+
+\subsection{polyroots1.xhtml}
+<<polyroots1.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Using a Single Root of a Polynomial</div>
+  <hr/>
+Use <a href="dboprootof.xhtml">rootOf</a> to get a symbolic root of a 
+polynomial. The call rootOf(p,x) returns a root of p(x). 
+
+This creates an algebraic number a, which is a root of the polynomial
+returned in symbolic form.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="aa:=rootOf(a^4+1,a)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+To find the algebraic relation that defines a, use
+<a href="dbopdefiningpolynomial.xhtml">definingPolynomial</a>
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="definingPolynomial aa" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+You can use a in any further expression, including a nested 
+<a href="dboprootof.xhtml">rootOf</a>.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="bb:=rootOf(b^2-aa-1,b)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+Higher powers of the roots are automatically reduced during calculations.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p3','p4']);"
+    value="g:=aa+bb" />
+  <div id="ansp4"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p3','p4','p5']);"
+    value="g^5" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopzeroof.xhtml">zeroOf</a> is similar to 
+<a href="dboprootof.xhtml">rootOf</a>, except that it may express the
+root using radicals in some cases.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="rootOf(c^2+c+1,c)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="zeroOf(d^2+d+1,d)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="makeRequest('p8');"
+    value="rootOf(e^5-2,e)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="makeRequest('p9');"
+    value="zeroOf(f^5-2,f)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{polyroots2.xhtml}
+<<polyroots2.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Using All Roots of a Polynomial</div>
+  <hr/>
+Use <a href="dboprootsof.xhtml">rootsOf</a> to get all symbolic roots 
+of a polynomial. The call rootsOf(p,x) returns a list of all the roots
+of p(x). If p(x) has a multiple root of order n, then that root appears
+n times in the list.
+
+Compute all the roots of x^4+1.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="l:=rootsOf(x^4+1,x)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+As a side effect, the variables %x0, %x1, and %x2 are bound to the first
+three roots of x^4+1.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="%x0^5" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Although they all satisfy x^4+1=0, %x0, %x1, and %x2 are different
+algebraic numbers. To find the algebraic relation that defines each of
+them, use <a href="dbopdefiningpolynomial.xhtml">definingPolynomial</a>.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="definingPolynomial %x0" />
+  <div id="ansp3"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p4']);"
+    value="definingPolynomial %x1" />
+  <div id="ansp4"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p5']);"
+    value="definingPolynomial %x2" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+We can check that the sum and product of the roots of x^4+1 are its
+trace and norm.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p6']);"
+    value="x3:=last l" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p1','p6','p7']);"
+    value="%x0+%x1+%x2+x3" />
+  <div id="ansp7"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p1','p6','p8']);"
+    value="%x0*%x1*%x2*x3" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+Corresponding to the pair of operations
+<a href="dboprootof.xhtml">rootOf</a> and 
+<a href="dbopzeroof.xhtml">zeroOf</a> in 
+<a href="axbook/section-8.5.xhtml#subsec-8.5.2">
+Solution of a Single Polynomial Equation</a>
+there is an operations <a href="dbopzerosof.xhtml">zerosOf</a> that, like
+<a href="dboprootsof.xhtml">rootsOf</a>, computes all the roots of a given
+polynomial, but which expresses some of them in terms of radicals.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="makeRequest('p9');"
+    value="zerosOf(y^4+1,y)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+As you see, only one implicit algebraic number was created (%y1), and its
+defining equation is this. The other three roots are expressed in radicals.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p9','p10']);"
+    value="definingPolynomial %y1" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{polyroots3.xhtml}
+<<polyroots3.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Solution of a Single Polynomial Equation</div>
+  <hr/>
+Axiom can solve polynomial equations producing either approximate or exact
+solutions. Exact solutions are either members of the ground field or can
+be presented symbolically as roots of irreducible polynomials.
+
+This returns one rational root along with an irreducible polynomial 
+describing the other solutions
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="solve(x^3=8,x)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+If you want solutions expressed in terms of radicals you would use this
+instead.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="radicalSolve(x^3=8,x)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+The <a href="dbopsolve.xhtml">solve</a> command always returns a value but
+<a href="dbopradicalsolve.xhtml">radicalSolve</a> returns only the solutions
+that it is able to express in terms of radicals.
+
+If the polynomial equation has rational coefficients you can ask for
+approximations to its real roots by calling solve with a second argument
+that specifies the "precision" epsilon. This means that each approximation
+will be within plus or minus epsilon of the actual result.
+
+Notice that the type of second argument controls the type of the result.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="solve(x^4-10*x^3+35*x^2-50*x+25,.0001)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+If you give a floating point precision you get a floating point result.
+If you give the precision as a ration number you get a rational result.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="solve(x^2-2,1/1000)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+If you want approximate complex results you should use the command
+<a href="dbopcomplexsolve.xhtml">complexSolve</a> that takes the same
+precision argument epsilon.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="complexSolve(x^3-2,.0001)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Each approximation will be within plus or minus epsilon of the actual result
+in each of the real and imaginary parts.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="complexSolve(x^2-2*%i+1,1/100)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+Note that if you omit the = from the first argument Axiom generates
+an equation by equating the first argument to zero. Also, when only one
+variable is present in the equation, you do not need to specify the
+variable to be solved for, that is, you can omit the second argument.
+
+Axiom can also solve equations involving rational functions. Solutions
+where the denominator vanishes are discarded.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="radicalSolve(1/x^3+1/x^2+1/x=0,x)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{polyroots4.xhtml}
+<<polyroots4.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Solution of Systems of Polynomial Equations</div>
+  <hr/>
+Given a system of equations of rational functions with exact coefficients
+<pre>
+     p1(x1,...,xn)
+         .
+         .
+     pm(x1,...,xn)
+</pre>
+Axiom can find numeric or symbolic solutions. The system is first split 
+into irreducible components, then for each component, a triangular system
+of equations is found that reduces the problem to sequential solutions of
+univariate polynomials resulting from substitution of partial solutions
+from the previous stage.
+<pre>
+     q1(x1,...,xn)
+         .
+         .
+     qm(xn)
+</pre>
+Symbolic solutions can be presented using "implicit" algebraic numbers
+defined as roots of irreducible polynomials or in terms of radicals. Axiom
+can also find approximations to the real or complex roots of a system of
+polynomial equations to any user specified accuracy.
+
+The operation <a href="dbopsolve.xhtml">solve</a> for systems is used in
+a way similar to <a href="dbopsolve.xhtml">solve</a> for single equations.
+Instead of a polynomial equation, one has to give a list of equations and
+instead of a single variable to solve for, a list of variables. For 
+solutions of single equations see
+<a href="axbook/section-8.5.xhtml#subsec-8.5.2">
+Solution of a Single Polynomial Equation</a>
+
+Use the operation <a href="dbopsolve.xhtml">solve</a> if you want
+implicitly presented solutions.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="solve([3*x^2+y+1,y^2-4],[x,y])" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="solve([x=y^2-19,y=z^2+x+3,z=3*x],[x,y,z])" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+Use <a href="dbopradialsolve.xhtml">radicalSolve</a> if you want your
+solutions expressed in terms of radicals.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="radicalSolve([3*x^3+y+1,y^2-4],[x,y])" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+To get numeric solutions you only need to give the list of equations and
+the precision desired. The list of variables would be redundant information
+since there can be no parameters for the numerical solver.
+
+If the precision is expressed as a floating point number you get results
+expressed as floats.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="solve([x^2*y-1,x*y^2-2],.01)" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+To get complex numeric solutions, use the operation
+<a href="dbopcomplexsolve.xhtml">complexSolve</a>, which takes the same
+arguments as in the real case.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="makeRequest('p5');"
+    value="complexSolve([x^2*y-1,x*y^2-2],1/1000)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+It is also possible to solve systems of equations in rational functions
+over the rational numbers. Note that [x=0.0,a=0.0] is not returned as
+a solution since the denominator vanishes there.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="solve([x^2/a=a,a=a*x],.001)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+When solving equations with denominators, all solutions where the 
+denominator vanishes are discarded.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="radicalSolve([x^2/a+a+y^3-1,a*y+a+1],[x,y])" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+\subsection{polyspecifictypes.xhtml}
+<<polyspecifictypes.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <div align="center">The Specific Polynomial Types</div>
+  <hr/>
+<table>
+ <tr>
+  <td>
+   <a href="polyspecifictypes1.xhtml">
+    Polynomial
+   </a>
+  </td>
+  <td>
+   The general type
+  </td>
+ </tr>
+ <tr>
+  <td>
+   <a href="polyspecifictypes2.xhtml">
+    UnivariatePolynomial
+   </a>
+  </td>
+  <td>
+   One variable polynomials
+  </td>
+ </tr>
+ <tr>
+  <td>
+   <a href="polyspecifictypes3.xhtml">
+    MultivariatePolynomial
+   </a>
+  </td>
+  <td>
+   Multiple variable polynomials, recursive structure
+  </td>
+ </tr>
+ <tr>
+  <td>
+   <a href="polyspecifictypes4.xhtml">
+    DistributedMultivariatePolynomial
+   </a>
+  </td>
+   Multiple variable polynomials, non-recursive structure
+  <td>
+  </td>
+ </tr>
+</table>
+<<page foot>>
+@
+
+\subsection{polyspecifictypes1.xhtml}
+<<polyspecifictypes1.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Polynomial</div>
+  <hr/>
+The domain constructor <a href="db.xhtml?Polynomial">Polynomial</a>
+(abbreviation: <a href="db.xhtml?Polynomial">POLY</a>) provides polynomials
+with an arbitrary number of unspecified variables.
+
+It is used to create the default polynomial domains in Axiom. Here the
+coefficients are integers.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="x+1" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+Here the coefficients have type <a href="db.xhtml?Float">Float</a>.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="z-2.3" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+And here we have a polynomial in two variables with coefficients which 
+have type <a href="dbfractioninteger.xhtml">Fraction Integer</a>
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="y^2-z+3/4" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+The representation of objects of domains created by 
+<a href="db.xhtml?Polynomial">Polynomial</a> is that of recursive univariate
+polynomials. (The term univariate means "one variable". The term 
+multivariate means "possibly more than one variable".) This recursive
+structure is sometimes obvious from the display of a polynomial.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="r:=y^2+x*y+y" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+In this example, you see that the polynomial is stored as a polynomial in y
+with coefficients that are polynomials in x with integer coefficients. In 
+fact, you really don't need to worry about the representation unless you are
+working on an advanced application where it is critical. The polynomial
+types created from
+<a href="db.xhtml?DistributedMultivariatePolynomial">
+DistributedMultivariatePolynomial</a> and
+<a href="db.xhtml?XDistributedPolynomial">XDistributedPolynomial</a> 
+(discussed in
+<a href="axbook/section-9.16.xhtml">"DistributedMultivariatePolynomial"</a>
+are stored and displayed in a
+non-recursive manner. You see a "flat" display of the above polynomial by
+converting to one of those types.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p4','p5']);"
+    value="r::DMP([y,x],INT)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+We will demonstrate many of the polynomial facilities by using two 
+polynomials with integer coefficients. By default, the interpreter 
+expands polynomial expressions, even if they are written in a factored
+format.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="p:=(y-1)^2*x*z" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+See <a href="axbook/section-9.22.xhtml">Factored</a> 
+to see how to create objects in factored form directly.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="makeRequest('p7');"
+    value="q:=(y-1)*x*(z+5)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+The fully factored form can be recovered by using 
+<a href="dbopfactor.xhtml">factor</a>
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p7','p8']);"
+    value="factor(q)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+This is the same name used for the operation to factor integer.
+Such reuse of names is called 
+<a href="glossarypage.xhtml#p36465">overloading</a> and makes it much
+easier to think of solving problems in general ways. Axiom facilities
+for factoring polynomials created with 
+<a href="db.xhtml?Polynomial">Polynomial</a>
+are currently restricted to the integer and rational number coefficients
+cases. There are more complete facilities for factoring univariate
+polynomials (see 
+<a href="axbook/section-8.2.xhtml">Polynomial Factorization</a>)
+
+The standard arithmetic operations are available for polynomials.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p6','p7','p9']);"
+    value="p-q^2" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopgcd.xhtml">gcd</a> is used to compute the 
+greated common divisor of two polynomials.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p6','p7','p10']);"
+    value="m:=gcd(p,q)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+In the case of p and q, the gcd is obvious from their definitions.
+We factor the gcd to show this relationship better.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p6','p7','p10','p11']);"
+    value="factor m" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+The least common multiple is computed by using 
+<a href="dboplcm.xhtml">lcm</a>.
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p6','p7','p12']);"
+    value="lcm(p,q)" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+Use <a href="dbopcontent.xhtml">content</a> to compute the greatest common
+divisor of the coefficients of the polynomial.
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="handleFree(['p6','p13']);"
+    value="content p" />
+  <div id="ansp13"><div></div></div>
+ </li>
+</ul>
+Many of the operations on polynomials require you to specify a variable.
+For example, <a href="dbopresultant.xhtml">resultant</a> requires you to
+give the variable in which the polynomials should be expressed. This 
+computes the resultant of the values of p and q, considering them as
+polynomials in the variable z. They do not share a root when thought
+of as polynomials in z.
+<ul>
+ <li>
+  <input type="submit" id="p14" class="subbut" 
+    onclick="handleFree(['p6','p7','p14']);"
+    value="resultant(p,q,z)" />
+  <div id="ansp14"><div></div></div>
+ </li>
+</ul>
+This value is 0 because as polynomials in x the polynomials have a
+common root.
+<ul>
+ <li>
+  <input type="submit" id="p15" class="subbut" 
+    onclick="handleFree(['p6','p7','p15']);"
+    value="resultant(p,q,x)" />
+  <div id="ansp15"><div></div></div>
+ </li>
+</ul>
+The data type used for the variables created by 
+<a href="db.xhtml?Polynomial">Polynomial</a> is 
+<a href="db.xhtml?Symbol">Symbol</a>. As mentioned above, the representation
+used by <a href="db.xhtml?Polynomial">Polynomial</a> is recursive and so
+there is a main variable for nonconstant polynomials. The operation
+<a href="dbopmainvariable.xhtml">makeVariable</a> returns this variable.
+The return type is actually a union of <a href="db.xhtml?Symbol">Symbol</a>
+and "failed".
+<ul>
+ <li>
+  <input type="submit" id="p16" class="subbut" 
+    onclick="handleFree(['p6','p16']);"
+    value="mainVariable p" />
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+The latter branch of the union is used if the polynomial has no
+variables, that is, is a constant.
+<ul>
+ <li>
+  <input type="submit" id="p17" class="subbut" 
+    onclick="handleFree(['p6','p17']);"
+    value="ground? p" />
+  <div id="ansp17"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p18" class="subbut" 
+    onclick="makeRequest('p18');"
+    value="ground?(1::POLY INT)" />
+  <div id="ansp18"><div></div></div>
+ </li>
+</ul>
+The complete list of variables actually used in a particular polynomial
+is returned by <a href="dbopvariables.xhtml">variables</a>. For constant
+polynomials, this list is empty.
+<ul>
+ <li>
+  <input type="submit" id="p19" class="subbut" 
+    onclick="handleFree(['p6','p19']);"
+    value="variables p" />
+  <div id="ansp19"><div></div></div>
+ </li>
+</ul>
+The <a href="dbopdegree.xhtml">degree</a> operation returns the degree
+of a polynomial in a specific variable.
+<ul>
+ <li>
+  <input type="submit" id="p20" class="subbut" 
+    onclick="handleFree(['p6','p20']);"
+    value="degree(p,x)" />
+  <div id="ansp20"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p21" class="subbut" 
+    onclick="handleFree(['p6','p21']);"
+    value="degree(p,y)" />
+  <div id="ansp21"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p22" class="subbut" 
+    onclick="handleFree(['p6','p22']);"
+    value="degree(p,z)" />
+  <div id="ansp22"><div></div></div>
+ </li>
+</ul>
+If you give a list of variables for the second argument, a list of the
+degrees in those variables is returned.
+<ul>
+ <li>
+  <input type="submit" id="p23" class="subbut" 
+    onclick="handleFree(['p6','p23']);"
+    value="degree(p,[x,y,z])" />
+  <div id="ansp23"><div></div></div>
+ </li>
+</ul>
+The minimum degree of a variable in a polynomial is computed using
+<a href="dbopminimumdegree.xhtml">minimumDegree</a>.
+<ul>
+ <li>
+  <input type="submit" id="p24" class="subbut" 
+    onclick="handleFree(['p6','p24']);"
+    value="minimumDegree(p,z)" />
+  <div id="ansp24"><div></div></div>
+ </li>
+</ul>
+The total degree of a polynomial is returned by
+<a href="dboptotaldegree.xhtml">totalDegree</a>.
+<ul>
+ <li>
+  <input type="submit" id="p25" class="subbut" 
+    onclick="handleFree(['p6','p25']);"
+    value="totalDegree p" />
+  <div id="ansp25"><div></div></div>
+ </li>
+</ul>
+It is often convenient to think of a polynomial as a leading monomial
+plus the remaining terms, using the operation
+<a href="dbopleadingmonomial.xhtml">leadingMonomial</a>
+<ul>
+ <li>
+  <input type="submit" id="p26" class="subbut" 
+    onclick="handleFree(['p6','p26']);"
+    value="leadingMonomial p" />
+  <div id="ansp26"><div></div></div>
+ </li>
+</ul>
+The <a href="dbopreductum.xhtml">reductum</a> operation returns a polynomial
+consisting of the sum of the monomials after the first.
+<ul>
+ <li>
+  <input type="submit" id="p27" class="subbut" 
+    onclick="handleFree(['p6','p27']);"
+    value="reductum p" />
+  <div id="ansp27"><div></div></div>
+ </li>
+</ul>
+These have the obvious relationship that the original polynomial is equal
+to the leading monomial plus the reductum.
+<ul>
+ <li>
+  <input type="submit" id="p28" class="subbut" 
+    onclick="handleFree(['p6','p28']);"
+    value="p-leadingMonomial p - reductum p" />
+  <div id="ansp28"><div></div></div>
+ </li>
+</ul>
+The value returned by <a href="dbopleadingmonomial.xhtml">leadingMonomial</a>
+includes the coefficient of that term. This is extracted by using 
+<a href="dbopleadingcoefficient.xhtml">leadingCoefficient</a> on the 
+original polynomial.
+<ul>
+ <li>
+  <input type="submit" id="p29" class="subbut" 
+    onclick="handleFree(['p6','p29']);"
+    value="leadingCoefficient p" />
+  <div id="ansp29"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopeval.xhtml">eval</a> is used to substitute a 
+value for a varialbe in a polynomial.
+<ul>
+ <li>
+  <input type="submit" id="p30" class="subbut" 
+    onclick="handleFree(['p6','p30']);"
+    value="p" />
+  <div id="ansp30"><div></div></div>
+ </li>
+</ul>
+This value may be another variable, a constant or a polynomial.
+<ul>
+ <li>
+  <input type="submit" id="p31" class="subbut" 
+    onclick="handleFree(['p6','p31']);"
+    value="eval(p,x,w)" />
+  <div id="ansp31"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p32" class="subbut" 
+    onclick="handleFree(['p6','p32']);"
+    value="eval(p,x,1)" />
+  <div id="ansp32"><div></div></div>
+ </li>
+</ul>
+Actually, all the things being substituted are just polynomials, some 
+more trivial than others.
+<ul>
+ <li>
+  <input type="submit" id="p33" class="subbut" 
+    onclick="handleFree(['p6','p33']);"
+    value="eval(p,x,y^2-1)" />
+  <div id="ansp33"><div></div></div>
+ </li>
+</ul>
+Derivatives are computed using the <a href="dbopd.xhtml">D</a> operation.
+<ul>
+ <li>
+  <input type="submit" id="p34" class="subbut" 
+    onclick="handleFree(['p6','p34']);"
+    value="D(p,x)" />
+  <div id="ansp34"><div></div></div>
+ </li>
+</ul>
+The first argument is the polynomial and the second is the variable.
+<ul>
+ <li>
+  <input type="submit" id="p35" class="subbut" 
+    onclick="handleFree(['p6','p35']);"
+    value="D(p,y)" />
+  <div id="ansp35"><div></div></div>
+ </li>
+</ul>
+Even if the polynomial has only one variable, you must specify it.
+<ul>
+ <li>
+  <input type="submit" id="p36" class="subbut" 
+    onclick="handleFree(['p6','p36']);"
+    value="D(p,z)" />
+  <div id="ansp36"><div></div></div>
+ </li>
+</ul>
+Integration of polynomials is similar and the 
+<a href="dbopintegrate.xhtml">integrate</a> operation is used.
+
+Integration requires that the coefficients support division. 
+Consequently, Axiom converts polynomials over the integers to polynomials
+over the rational numbers before integrating them.
+<ul>
+ <li>
+  <input type="submit" id="p37" class="subbut" 
+    onclick="handleFree(['p6','p37']);"
+    value="integrate(p,y)" />
+  <div id="ansp37"><div></div></div>
+ </li>
+</ul>
+It is not possible, in general, to divide two polynomials. In our example
+using polynomials over the integers, the operation
+<a href="dbopmonicdivide.xhtml">monicDivide</a> divides a polynomial by a
+monic polynomial (that is, a polynomial with leading coefficient equal to
+1). The result is a record of the quotient and remainder of the division.
+You must specify the variable in which to express the polynomial.
+<ul>
+ <li>
+  <input type="submit" id="p38" class="subbut" 
+    onclick="handleFree(['p6','p38']);"
+    value="qr:=monicDivide(p,x+1,x)" />
+  <div id="ansp38"><div></div></div>
+ </li>
+</ul>
+The selectors of the components of the record are quotient and
+remainder. Issue this to extract the remainder:
+<ul>
+ <li>
+  <input type="submit" id="p39" class="subbut" 
+    onclick="handleFree(['p6','p38','p39']);"
+    value="qr.remainder" />
+  <div id="ansp39"><div></div></div>
+ </li>
+</ul>
+Now that we can extract the components, we can demonstrate the 
+relationship among them and the arguments to our original expression
+<pre>
+  qr:=monicDivide(p,x+1,x)
+</pre>
+<ul>
+ <li>
+  <input type="submit" id="p40" class="subbut" 
+    onclick="handleFree(['p6','p38','p40']);"
+    value="p-((x+1)*qr.quotient+qr.remainder)" />
+  <div id="ansp40"><div></div></div>
+ </li>
+</ul>
+If the <a href="dbopdivide.xhtml">/</a> operator is used with polynomials,
+a fraction object is created. In this example, the result is an object of
+type 
+<a href="dbfractionpolynomialinteger.xhtml">Fraction Polynomial Integer</a>.
+<ul>
+ <li>
+  <input type="submit" id="p41" class="subbut" 
+    onclick="handleFree(['p6','p7','p41']);"
+    value="p/q" />
+  <div id="ansp41"><div></div></div>
+ </li>
+</ul>
+If you use rational numbers as polynomial coefficients, the resulting
+object is of type 
+<a href="dbpolynomialfractioninteger.xhtml">Polynomial Fraction Integer</a>
+<ul>
+ <li>
+  <input type="submit" id="p42" class="subbut" 
+    onclick="makeRequest('p42');"
+    value="pfi:=(2/3)*x^2-y+4/5" />
+  <div id="ansp42"><div></div></div>
+ </li>
+</ul>
+This can be converted to a fraction of polynomials and back again, if
+required.
+<ul>
+ <li>
+  <input type="submit" id="p43" class="subbut" 
+    onclick="handleFree(['p42','p43']);"
+    value="fpi:=pfi::FRAC POLY INT" />
+  <div id="ansp43"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p44" class="subbut" 
+    onclick="handleFree(['p42','p43','p44']);"
+    value="fpi::POLY FRAC INT" />
+  <div id="ansp44"><div></div></div>
+ </li>
+</ul>
+To convert the coefficients to floating point, map the 
+<a href="dbopnumeric.xhtml">numeric</a> operation on the coefficients
+of the polynomial.
+<ul>
+ <li>
+  <input type="submit" id="p45" class="subbut" 
+    onclick="handleFree(['p42','p45']);"
+    value="map(numeric,pfi)" />
+  <div id="ansp45"><div></div></div>
+ </li>
+</ul>
+For more information on related topcis, see
+<a href="axbook/section-9.83.xhtml">UnivariatePolynomial</a>,
+<a href="axbook/section-9.54.xhtml">MultivariatePolynomial</a>, and
+<a href="axbook/section-9.16.xhtml">DistributedMultivariatePolynomial</a>.
+You can also issue the system command
+<ul>
+ <li>
+  <input type="submit" id="p46" class="subbut" 
+    onclick="showcall('p46');"
+   value=")show Polynomial"/>
+  <div id="ansp46"><div></div></div>
+ </li>
+</ul>
+to display the full list of operations defined by 
+<a href="db.xhtml?Polynomial">Polynomial</a>.
+<<page foot>>
+@
+
+\subsection{polyspecifictypes2.xhtml}
+<<polyspecifictypes2.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">UnivariatePolynomial</div>
+  <hr/>
+The domain constructor 
+<a href="db.xhtml?UnivariatePolynomial">UnivariatePolynomial</a> 
+(abbreviated <a href="db.xhtml?UnivariatePolynomial">UP</a>)
+creates domains of univariate polynomials in a specified variable.
+For example, the domain UP(a1,POLY FRAC INT) provides polynomials in
+the single variable a1 whose coefficients are general polynomials with
+rational number coefficients.
+<hr/>
+<b>Restriction:</b><br/>
+Axiom does not allow you to create types where
+<a href="db.xhtml?UnivariatePolynomial">UnivariatePolynomial</a> 
+is contained in the coefficient type of 
+<a href="db.xhtml?Polynomial">Polynomial</a>.
+Therefore, UP(x,POLY INT) is legal but POLY UP(x,INT) is not.
+<hr/>
+UP(x,INT) is the domain of polynomials in the single variable x with
+integer coefficients.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="(p,q):UP(x,INT)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="makeRequest('p2');"
+    value="p:=(3*x-1)^2*2*(2*x+8)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="q:=(1-6*x+9*x^2)^2" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+The usual arithmetic operations are available for univariate polynomials.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4']);"
+    value="p^2+p*q" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+The operation 
+<a href="dbopleadingcoefficient.xhtml">leadingCoefficient</a>
+extracts the coefficient of the term of highest degree.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p2','p5']);"
+    value="leadingCoefficient p" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopdegree.xhtml">degree</a> returns the degree of
+the polynomial. Since the polynomial has only one variable, the variable
+is not supplied to operations like <a href="dbopdegree.xhtml">degree</a>.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p2','p6']);"
+    value="degree p" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+The reductum of the polynomial, the polynomial obtained by subtracting
+the term of highest order, is returned by 
+<a href="dbopreductum.xhtml">reductum</a>.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p1','p2','p7']);"
+    value="reductum p" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopgcd.xhtml">gcd</a> computes the greatest common
+divisor of two polynomials.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p8']);"
+    value="gcd(p,q)" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dboplcm.xhtml">lcm</a> computes the least common 
+multiple.
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p9']);"
+    value="lcm(p,q)" />
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopresultant.xhtml">resultant</a> computes the
+resultant of two univariate polynomials. In the case of p and q, the
+resultant is 0 because they share a common root.
+<ul>
+ <li>
+  <input type="submit" id="p10" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p10']);"
+    value="resultant(p,q)" />
+  <div id="ansp10"><div></div></div>
+ </li>
+</ul>
+To compute the derivative of a univariate polynomial with respect to 
+its variable, use <a href="dbopd.xhtml">D</a>.
+<ul>
+ <li>
+  <input type="submit" id="p11" class="subbut" 
+    onclick="handleFree(['p1','p2','p11']);"
+    value="D p" />
+  <div id="ansp11"><div></div></div>
+ </li>
+</ul>
+Univariate polynomials can also be used as if they were functions.
+To evaluate a univariate polynomial at some point, apply the polynomial
+to the point.
+<ul>
+ <li>
+  <input type="submit" id="p12" class="subbut" 
+    onclick="handleFree(['p1','p2','p12']);"
+    value="p(2)" />
+  <div id="ansp12"><div></div></div>
+ </li>
+</ul>
+The same syntax is used for composing two univariate polynomials, i.e.
+substituting one polynomial for the variable in another. This substitutes q
+for the variable in p.
+<ul>
+ <li>
+  <input type="submit" id="p13" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p13']);"
+    value="p(q)" />
+  <div id="ansp13"><div></div></div>
+ </li>
+</ul>
+This substitutes p for the variable in q.
+<ul>
+ <li>
+  <input type="submit" id="p14" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p14']);"
+    value="q(p)" />
+  <div id="ansp14"><div></div></div>
+ </li>
+</ul>
+To obtain a list of coefficients of the polynomial, use
+<a href="dbopcoefficients.xhtml">coefficients</a>.
+<ul>
+ <li>
+  <input type="submit" id="p15" class="subbut" 
+    onclick="handleFree(['p1','p2','p15']);"
+    value="l:=coefficients p" />
+  <div id="ansp15"><div></div></div>
+ </li>
+</ul>
+From this you can use <a href="dbopgcd.xhtml">gcd</a> and
+<a href="dbopreduce.xhtml">reduce</a> to compute the contents of the
+polynomial.
+<ul>
+ <li>
+  <input type="submit" id="p16" class="subbut" 
+    onclick="handleFree(['p1','p2','p15','p16']);"
+    value="reduce(gcd,l)" />
+  <div id="ansp16"><div></div></div>
+ </li>
+</ul>
+Alternatively (and more easily), you can just call
+<a href="dbopcontent.xhtml">content</a>
+<ul>
+ <li>
+  <input type="submit" id="p17" class="subbut" 
+    onclick="handleFree(['p1','p2','p17']);"
+    value="content p" />
+  <div id="ansp17"><div></div></div>
+ </li>
+</ul>
+Note that the operation <a href="dbopcoefficients.xhtml">coefficients</a>
+omits the zero coefficients from the list. Sometimes it is useful to 
+convert a univariate polynomial to a vector whose i-th position contains
+the degree i-1 coefficient of the polynomial.
+<ul>
+ <li>
+  <input type="submit" id="p18" class="subbut" 
+    onclick="makeRequest('p18');"
+    value="ux:=(x^4+2*x+3)::UP(x,INT)" />
+  <div id="ansp18"><div></div></div>
+ </li>
+</ul>
+To get a complete vector of coefficients, use the operation 
+<a href="dbopvectorise.xhtml">vectorise</a>, which takes a univariate
+polynomial and an integer denoting the length of the desired vector.
+<ul>
+ <li>
+  <input type="submit" id="p19" class="subbut" 
+    onclick="handleFree(['p18','p19']);"
+    value="vectorise(ux,5)" />
+  <div id="ansp19"><div></div></div>
+ </li>
+</ul>
+It is common to want to do something to every term of a polynomial, 
+creating a new polynomial in the process. This is a function for
+iterating across the terms of a polynomial, squaring each term.
+<ul>
+ <li>
+  <input type="submit" id="p20" class="subbut" 
+    onclick="makeRequest('p20');"
+    value="squareTerms(m)==reduce(+,[t^2 for t in monomials m])" />
+  <div id="ansp20"><div></div></div>
+ </li>
+</ul>
+Recall what p looked like.
+<ul>
+ <li>
+  <input type="submit" id="p21" class="subbut" 
+    onclick="handleFree(['p1','p2','p21']);"
+    value="p" />
+  <div id="ansp21"><div></div></div>
+ </li>
+</ul>
+We can demonstrate squareTerms on p.
+<ul>
+ <li>
+  <input type="submit" id="p22" class="subbut" 
+    onclick="handleFree(['p1','p2','p20','p22']);"
+    value="squareTerms p" />
+  <div id="ansp22"><div></div></div>
+ </li>
+</ul>
+When the coefficients of the univariate polynomial belong to a field,
+(for example, when the coefficients are rational numbers, as opposed to
+integers. The important property of a field is that non-zero elements can
+be divided and produce another element. The quotient of the integers 2 and 3
+is not another integer.) It is possible to compute quotients and remainders.
+<ul>
+ <li>
+  <input type="submit" id="p23" class="subbut" 
+    onclick="makeRequest('p23');"
+    value="(r,s):UP(a1,FRAC INT)" />
+  <div id="ansp23"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p24" class="subbut" 
+    onclick="handleFree(['p23','p24']);"
+    value="r:=a1^2-2/3" />
+  <div id="ansp24"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p25" class="subbut" 
+    onclick="handleFree(['p23','p25']);"
+    value="s:=a1+4" />
+  <div id="ansp25"><div></div></div>
+ </li>
+</ul>
+When the coefficients are rational numbers or rational expressions, the
+operation <a href="dbopquo.xhtml">quo</a> computes the quotient of two
+polynomials.
+<ul>
+ <li>
+  <input type="submit" id="p26" class="subbut" 
+    onclick="handleFree(['p23','p24','p25','p26']);"
+    value="r quo s" />
+  <div id="ansp26"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dboprem.xhtml">rem</a> computes the remainder.
+<ul>
+ <li>
+  <input type="submit" id="p27" class="subbut" 
+    onclick="handleFree(['p23','p24','p25','p27']);"
+    value="r rem s" />
+  <div id="ansp27"><div></div></div>
+ </li>
+</ul>
+The operation <a href="dbopdivide.xhtml">divide</a> can be used to return
+a record of both components.
+<ul>
+ <li>
+  <input type="submit" id="p28" class="subbut" 
+    onclick="handleFree(['p23','p24','p25','p28']);"
+    value="d:=divide(r,s)" />
+  <div id="ansp28"><div></div></div>
+ </li>
+</ul>
+Now we check the arithmetic.
+<ul>
+ <li>
+  <input type="submit" id="p29" class="subbut" 
+    onclick="handleFree(['p23','p24','p25','p28','p29']);"
+    value="r-(d.quotient*s+d.remainder)" />
+  <div id="ansp29"><div></div></div>
+ </li>
+</ul>
+It is also possible to integrate univariate polynomials when the 
+coefficients belong to a field.
+<ul>
+ <li>
+  <input type="submit" id="p30" class="subbut" 
+    onclick="handleFree(['p23','p24','p30']);"
+    value="integrate r" />
+  <div id="ansp30"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p31" class="subbut" 
+    onclick="handleFree(['p23','p25','p31']);"
+    value="integrate s" />
+  <div id="ansp31"><div></div></div>
+ </li>
+</ul>
+One application of univariate polynomials is to see expressions in terms of
+a specific variable. We start with a polynomial in a1 whose coefficients are
+quotients of polynomials in b1 and b2.
+<ul>
+ <li>
+  <input type="submit" id="p32" class="subbut" 
+    onclick="makeRequest('p32');"
+    value="t:UP(a1,FRAC POLY INT)" />
+  <div id="ansp32"><div></div></div>
+ </li>
+</ul>
+Since in this case we are not talking about using multivariate polynomials
+in only two variables, we use <a href="db.xhtml?Polynomial">Polynomial</a>.
+We also use <a href="db.xhtml?Fraction">Fraction</a> because we want fractions.
+<ul>
+ <li>
+  <input type="submit" id="p33" class="subbut" 
+    onclick="handleFree(['p32','p33']);"
+    value="t:=a1^2-a1/b2+(b1^2-b1)/(b2+3)" />
+  <div id="ansp33"><div></div></div>
+ </li>
+</ul>
+We push all the variables into a single quotient of polynomials.
+<ul>
+ <li>
+  <input type="submit" id="p34" class="subbut" 
+    onclick="handleFree(['p32','p33','p34']);"
+    value="u:FRAC POLY INT:=t" />
+  <div id="ansp34"><div></div></div>
+ </li>
+</ul>
+Alternatively, we can view this as a polynomial in the variable. This is a
+mode-directed conversion: You indicate as much of the structure as you care
+about and let Axiom decide on the full type and how to do the transformation.
+<ul>
+ <li>
+  <input type="submit" id="p35" class="subbut" 
+    onclick="handleFree(['p32','p33','p34','p35']);"
+    value="u::UP(b1,?)" />
+  <div id="ansp35"><div></div></div>
+ </li>
+</ul>
+See <a href="axbook/section-8.2.xhtml">Polynomial Factorization</a> for a
+discussion of the factorization facilities in Axiom for univariate
+polynomials. For more information on related topics, see
+<a href="axbook/section-1.8.xhtml">Polynomials</a>,
+<a href="axbook/section-2.7.xhtml">Conversion</a>,
+<a href="polyspecifictypes1.xhtml">Polynomial</a>,
+<a href="polyspecifictypes3.xhtml">MultivariatePolynomial</a>, and
+<a href="polyspecifictypes4.xhtml">DistributedMultivariatePolynomial</a>.
+Issue the system command
+<ul>
+ <li>
+  <input type="submit" id="p36" class="subbut" 
+    onclick="showcall('p36');"
+   value=")show UnivariatePolynomial"/>
+  <div id="ansp36"><div></div></div>
+ </li>
+</ul>
+to display the full list of operations defined by
+<a href="db.xhtml?UnivariatePolynomial">UnivariatePolynomial</a>.
+<<page foot>>
+@
+
+\subsection{polyspecifictypes3.xhtml}
+<<polyspecifictypes3.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">MultivariatePolynomial</div>
+  <hr/>
+The domain constructor 
+<a href="db.xhtml?MultivariatePolynomial">MultivariatePolynomial</a> is
+similar to <a href="db.xhtml?Polynomial">Polynomial</a> except that it
+specifies the variables to be used. 
+<a href="db.xhtml?Polynomial">Polynomial</a> are available for 
+<a href="db.xhtml?MultivariatePolynomial">MultivariatePolynomial</a>.
+The abbreviation for 
+<a href="db.xhtml?MultivariatePolynomial">MultivariatePolynomial</a> is
+<a href="db.xhtml?MultivariatePolynomial">MPOLY</a>. The type expressions
+<pre>
+   MultivariatePolynomial([x,y],Integer)
+</pre>
+and
+<pre>
+         MPOLY([x,y],INT)
+</pre>
+refer to the domain of multivariate polynomials in the variables x and y
+where the coefficients are restricted to be integers. The first variable
+specified is the main variable and the display of the polynomial reflects
+this. This polynomial appears with terms in descending powers of the 
+variable x.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="m:MPOLY([x,y],INT):=(x^2-x*y^3+3*y)^2" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+It is easy to see a different variable ordering by doing a conversion.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="m::MPOLY([y,x],INT)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+You can use other, unspecified variables, by using
+<a href="db.xhtml?Polynomial">Polynomial</a> in the coefficient type of
+<a href="db.xhtml?MultivariatePolynomial">MPOLY</a>.
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="p:MPOLY([x,y],POLY INT):=(a^2*x-b*y^2+1)^2" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+Conversions can be used to re-express such polynomials in terms of the
+other variables. For example, you can first push all the variables into a
+polynomial with integer coefficients.
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p3','p4']);"
+    value="u:=p::POLY INT" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+Now pull out the variables of interest.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p3','p4','p5']);"
+    value="u::MPOLY([a,b],POLY INT)" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+<hr/>
+<b>Restriction:</b> Axiom does not allow you to create types where
+<a href="db.xhtml?MultivariatePolynomial">MultivariatePolynomial</a> is
+contained in the coefficient type of 
+<a href="db.xhtml?Polynomial">Polynomial</a>. Therefore, 
+<pre>
+     MPOLY([x,y],POLY INT)
+</pre>
+is legal but this is not:
+<pre>
+     POLY MPOLY([x,y],INT)n
+</pre>
+<hr/>
+Multivariate polynomials may be combined with univariate polynomials to 
+create types with special structures.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="q:UP(x,FRAC MPOLY([y,z],INT)):=(x^2-x*(z+1)/y+2)^2" />
+  <div id="ansp6"><div></div></div>
+ </li>
+</ul>
+This is a polynomial in x whose coefficients are quotients of polynomials
+in y and z. Use conversions for the structural rearrangements. z does not
+appear in a denominator and so it can be made the main variable.
+<ul>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p6','p7']);"
+    value="q::UP(z,FRAC MPOLY([x,y],INT))" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Or you can make a multivariate polynomial in x and z whose coefficients
+are fractions in polynomials in y
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p6','p8']);"
+    value="q::MPOLY([x,z],FRAC UP(y,INT))" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+A conversion like 
+<pre>
+  q::MPOLY([x,y],FRAC UP(z,INT))
+</pre>
+is not possible in this example because y appears in the denominator of
+a fraction. As you can see, Axiom provides extraordinary flexibility in
+the manipulation and display of expressions via its conversion facility.
+
+For more information on related topics, see
+<a href="polyspecifictypes1.xhtml">Polynomial</a>,
+<a href="polyspecifictypes2.xhtml">UnivariatePolynomial</a>, and
+<a href="polyspecifictypes4.xhtml">DistributedMultivariatePolynomial</a>.
+Issue the system command
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="showcall('p9');"
+   value=")show MultivariatePolynomial"/>
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+to display the full list of operations defined by 
+<a href="db.xhtml?MultivariatePolynomial">MultivariatePolynomial</a>.
+<<page foot>>
+@
+
+\subsection{polyspecifictypes4.xhtml}
+<<polyspecifictypes4.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">DistributedMultivariatePolynomial</div>
+  <hr/>
+<a href="db.xhtml?DistributedMultivariatePolynomial">
+DistributedMultivariatePolynomial</a> and
+<a href="db.xhtml?HomogeneousDistributedMultivariatePolynomial">
+HomogeneousDistributedMultivariatePolynomial</a>, abbreviated
+<a href="db.xhtml?DistributedMultivariatePolynomial">DMP</a> and
+<a href="db.xhtml?HomogeneousDistributedMultivariatePolynomial">HDMP</a>
+repspectively, are very similar to 
+<a href="db.xhtml?MultivariatePolynomial">MultivariatePolynomial</a>
+except that they are represented and displayed in a non-recursive manner.
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="(d1,d2,d3):DMP([z,y,x],FRAC INT)" />
+  <div id="ansp1"><div></div></div>
+ </li>
+</ul>
+The construction 
+<a href="db.xhtml?DistributedMultivariatePolynomial">DMP</a> orders its 
+monomials lexicographically while
+<a href="db.xhtml?HomogeneousDistributedMultivariatePolynomial">HDMP</a>
+orders them by total order refined by reverse lexicographic order.
+<ul>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="d1:=-4*z+4*y^2*x+16*x^2+1" />
+  <div id="ansp2"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="d2:=2*z*y^2+4*x+1" />
+  <div id="ansp3"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="handleFree(['p1','p4']);"
+    value="d3:=2*z*x^2-2*y^2-x" />
+  <div id="ansp4"><div></div></div>
+ </li>
+</ul>
+These constructors are mostly used in Groebner basis calculations.
+<ul>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p5']);"
+    value="groebner [d1,d2,d3]" />
+  <div id="ansp5"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="makeRequest('p6');"
+    value="(n1,n2,n3):HDMP([z,y,x],FRAC INT)" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p6','p7']);"
+    value="(n1,n2,n3):=(d1,d2,d3)" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+Note that we get a different Groebner basis when we use the 
+<a href="db.xhtml?HomogeneousDistributedMultivariatePolynomial">HDMP</a>
+polynomials, as expected.
+<ul>
+ <li>
+  <input type="submit" id="p8" class="subbut" 
+    onclick="handleFree(['p1','p2','p3','p4','p6','p7','p8']);"
+    value="groebner [n1,n2,n3]" />
+  <div id="ansp8"><div></div></div>
+ </li>
+</ul>
+<a href="db.xhtml?GeneralDistributedMultivariatePolynomial">
+GeneralDistributedMultivariatePolynomial</a> is somewhat more flexible in
+the sense that as well as accepting a list of variables to specify the
+variable ordering, it also takes a predicate on exponent vectors to specify
+the term ordering. With this polynomial type the user can experiment with 
+the effect of using completely arbitrary term orderings. This flexibility
+is mostly important for algorithms such as Groebner basis calculations
+which can be very sensitive to term orderings.
+
+For more information on related topics, see
+<a href="axbook/section-1.8.xhtml">Polynomials</a>,
+<a href="axbook/section-2.7.xhtml">Conversion</a>,
+<a href="polyspecifictypes1.xhtml">Polynomial</a>,
+<a href="polyspecifictypes2.xhtml">UnivariatePolynomial</a>. and
+<a href="polyspecifictypes3.xhtml">MultivariatePolynomial</a>, 
+Issue the system command
+<ul>
+ <li>
+  <input type="submit" id="p9" class="subbut" 
+    onclick="showcall('p9');"
+   value=")show DistributedMultivariatePolynomial"/>
+  <div id="ansp9"><div></div></div>
+ </li>
+</ul>
+to display the full list of operations defined by
+<a href="db.xhtml?DistributedMultivariatePolynomial">
+DistributedMultivariatePolynomial</a> and
+<<page foot>>
+@
+
+\subsection{polysubstitutions.xhtml}
+<<polysubstitutions.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<<handlefreevars>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body onload="resetvars();">
+<<page head>>
+  <div align="center">Polynomial Evaluation and Substitution</div>
+  <hr/>
+The function <a href="dbopeval.xhtml">eval</a> is used to substitute values
+into polynomials. Here's an example of how to use it:
+<ul>
+ <li>
+  <input type="submit" id="p1" class="subbut" 
+    onclick="makeRequest('p1');"
+    value="p:=x^2+y^2" />
+  <div id="ansp1"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p2" class="subbut" 
+    onclick="handleFree(['p1','p2']);"
+    value="eval(p,x=5)" />
+  <div id="ansp2"><div></div></div>
+ </li>
+</ul>
+This example would give you the value of the polynomial p at 5. You can 
+also substitute into polynomials with several variables. First, specify
+the polynomial, then give a list of the bindings of the form
+<pre>
+  variable = value
+</pre>
+For examples:
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="handleFree(['p1','p3']);"
+    value="eval(p,[x=a+b,y=c+d])" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+Here x was replaced by a+b, and y was replaced by c+d. 
+<ul>
+ <li>
+  <input type="submit" id="p4" class="subbut" 
+    onclick="makeRequest('p4');"
+    value="q:=x^3+5*x-y^4" />
+  <div id="ansp4"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p5" class="subbut" 
+    onclick="handleFree(['p4','p5']);"
+    value="eval(q,[x=y,y=x])" />
+  <div id="ansp5"><div></div></div>
+ </li>
+</ul>
+Substitution is done "in parallel". That is, Axiom takes q(x,y) and
+returns q(y,x). 
+
+You can also substitute numerical values for some or all of the variables.
+<ul>
+ <li>
+  <input type="submit" id="p6" class="subbut" 
+    onclick="handleFree(['p1','p6']);"
+    value="px:=eval(p,y=sin(2.0))" />
+  <div id="ansp6"><div></div></div>
+ </li>
+ <li>
+  <input type="submit" id="p7" class="subbut" 
+    onclick="handleFree(['p1','p6','p7']);"
+    value="eval(px,x=cos(2.0))" />
+  <div id="ansp7"><div></div></div>
+ </li>
+</ul>
+<<page foot>>
+@
+
+
+\subsection{puiseuxseries.xhtml}
+<<puiseuxseries.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    myfunc = document.getElementById('function').value;
+    myivar = document.getElementById('ivar').value;
+    mypvar = document.getElementById('pvar').value;
+    myevar = document.getElementById('evar').value;
+    myival = document.getElementById('ival').value;
+    mysval = document.getElementById('sval').value;
+    ans = 'series('+myivar+'+->'+myfunc+','+mypvar+'='+myevar+','+
+         myival+'..,'+mysval+')';
+    alert(ans);
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+  <table>
+   <tr>
+    <td>
+      Enter the formula for the general coefficient of the series:
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <input type="text" id="function" size="80" tabindex="10"
+       value="(-1)^((3*n-4)/6)/factorial(n-1/3)"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the index variable for your formula:
+     <input type="text" id="ivar" size="10" tabindex="20" value="n"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the power series variable:
+     <input type="text" id="pvar" size="10" tabindex="30" value="x"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the point about which to expand:
+     <input type="text" id="evar" size="10" tabindex="40" value="0"/>
+    </td>
+   </tr>
+  </table>
+For Puiseux Series, the exponent of the power series variable ranges
+from an initial value, an arbitrary rational number, to plus
+infinity; the step size is any positive rational number.
+  <table>
+   <tr>
+    <td>
+     Enter the initial value of the index (a rational number):
+     <input type="text" id="ival" size="10" tabindex="50" value="4/3"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the step size (a positive rational number):
+     <input type="text" id="sval" size="10" tabindex="60" value="2"/>
+    </td>
+   </tr>
+  </table>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+
+@
+
+%%Q
+%%R
+\subsection{reallimit.xhtml}
+<<reallimit.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    var myform = document.getElementById("form2");
+    var myfunct = myform.expr.value;
+    var myvar = myform.vars.value;
+    var mypoint = "";
+    // decide what the limit point should be
+    var finite = document.getElementById('finite').checked;
+    if (finite == true) 
+      mypoint = document.getElementById('fpoint').value;
+    if (document.getElementById('plus').checked == true) 
+      mypoint = "%plusInfinity";
+    if (document.getElementById('minus').checked == true) 
+      mypoint = "%minusInfinity"; 
+    // decide what the limit statement is
+    if (document.getElementById('both').checked == true) 
+      ans = 'limit('+myform.expr.value+','+myvar+'='+mypoint+')';
+    // note: ignore direction if limit is %plusInfinity
+    if (document.getElementById('right').checked == true) {
+     if (finite == true) {
+       ans = 'limit('+myform.expr.value+','+myvar+'='+mypoint+',"right")';
+     } else {
+       ans = 'limit('+myform.expr.value+','+myvar+'='+mypoint+')';
+     };
+    };
+    // note: ignore direction if limit is %minutInfinity
+    if (document.getElementById('left').checked == true) {
+     if (finite == true) {
+       ans = 'limit('+myform.expr.value+','+myvar+'='+mypoint+',"left")';
+     } else {
+       ans = 'limit('+myform.expr.value+','+myvar+'='+mypoint+')';
+     };
+    };
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+  <form id="form2">
+   Enter the function you want to compute the limit of:<br/>
+   <input type="text" id="expr" tabindex="10" size="50" 
+     value="x*sin(1/x)"/><br/>
+   Enter the name of the variable:<br/>
+   <input type="text" id="vars" tabindex="20" value="x"/><br/>
+   <input type="radio" id="finite" tabindex="30" checked="checked" 
+     name="point"/>
+    A finite point
+    <input type="text" id="fpoint" tabindex="20" value="0"/><br/>
+   <input type="radio" id="plus" tabindex="40" name="point"/>
+    %plusInfinity<br/>
+   <input type="radio" id="minus" tabindex="50" name="point"/>
+    %minusInfinity<br/><br/><br/>
+   Compute the limit from:<br/>
+   <input type="radio" id="both" tabindex="60" name="direction"
+     checked="checked"/>
+    both directions<br/>
+   <input type="radio" id="right" tabindex="70" name="direction"/>
+    the right<br/>
+   <input type="radio" id="left" tabindex="80" name="direction"/>
+    the left<br/>
+  </form>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+
+@
+\subsection{refsearchpage.xhtml}
+<<refsearchpage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      refsearchpage not implemented
+<<page foot>>
+@
+
+\subsection{releasenotes.xhtml}
+<<releasenotes.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+The <b>November 2007</b> release of Axiom contains
+<ul>
+ <li>
+   New MathML output mode. This mode allows Axiom to output expressions
+   using standard MathML format. This complements the existing ability
+   to output Fortran, IBM script, Latex, OpenMath, and algebra formats.
+ </li>
+ <li>
+   Ninety-five domains have been documented for the )help command. 
+   Type )help to see the list.
+ </li>
+ <li>
+   New regression tests were added to improve the release testing.
+ </li>
+ <li>
+   Hyperdoc can now be restarted. Type )hd
+ </li>
+ <li>
+   Testing has begun against Spiegel's Mathematical Handbook from the
+   Schaum's Outline Series. These tests include Axiom's solutions and
+   have uncovered mistakes in the published text.
+ </li>
+</ul>
+Bug fixes
+<ul>
+ <li>
+   <b>Bug100</b> integrate((z^a+1)^b,z) no longer loops infinitely.
+ </li>
+ <li>
+   <b>Bug101</b> laplace(log(z),z,w) returns "failed" instead of crashing.
+ </li>
+ <li>
+   <b>Bug103</b> solve(z=z,z) returns the correct answer
+ </li>
+</ul>
+Additional information sources:
+<table>
+ <tr>
+  <td>
+   <a href="http://axiom.axiom-developer.org">
+    <b>Online information is available here</b>
+   </a>
+  </td>
+ </tr>
+ <tr>
+  <td>
+   <a href="CHANGELOG.xhtml">
+    The changelog file contains specific file-by-file changes.
+   </a>
+  </td>
+ </tr>
+</table>
+<<page foot>>
+@
+
+\subsection{rootpage.xhtml}
+\begin{verbatim}
+  notangle -R"rootpage.xhtml" bookvol11.pamphlet > rootpage.xhtml
+\end{verbatim}
+<<rootpage.xhtml>>=
+<<standard head>>
+  <style>
+   body { background: url(bigbayou.png) no-repeat; }
+  </style>
+ </head>
+ <body>
+ <center><img src="bitmaps/axiom1.bitmap"/></center>
+  What would you like to do?<br/>
+  <table>
+   <tr>
+    <td>
+     <a href="/home/silver/commandline.xhtml">
+      <b>Any Command</b>
+     </a>
+    </td>
+    <td>Try command line input</td>
+   </tr>
+   <tr>
+    <td>
+     <a href="basiccommand.xhtml">
+      <b>Basic Commands</b>
+     </a>
+    </td>
+    <td>Solve problems by filling in templates</td>
+   </tr>
+   <tr>
+    <td>
+     <a href="jenks.xhtml">
+      <b>Axiom Textbook</b>
+     </a>
+    </td>
+    <td>Read Volume 0 -- The Jenks/Sutor Book</td>
+   </tr>
+   <tr>
+    <td>
+     <a href="tutorial.xhtml">
+      <b>Axiom Tutorial</b>
+     </a>
+    </td>
+    <td>Read Volume 1 -- The Tutorial</td>
+   </tr>
+   <tr>
+    <td>
+     <a href="topreferencepage.xhtml">
+      <b>Reference</b>
+     </a>
+    </td>
+    <td>Scan on-line documentation for AXIOM<br/></td>
+   </tr>
+   <tr>
+    <td>
+     <a href="topicspage.xhtml">
+      <b>Topics</b>
+     </a> 
+    </td>
+    <td> Learn how to use Axiom, by topic<br/></td>
+   </tr>
+   <tr>
+    <td>
+     <a href="man0page.xhtml">
+      <b>Browser</b>
+     </a> 
+    </td>
+    <td> Browse through the AXIOM library<br/></td>
+   </tr>
+   <tr>
+    <td>
+     <a href="topexamplepage.xhtml">
+      <b>Examples</b>
+     </a> 
+    </td>
+    <td> See examples of use of the library<br/></td>
+   </tr>
+   <tr>
+    <td>
+     <a href="topsettingspage.xhtml">
+      <b>Settings</b>
+     </a> 
+    </td>
+    <td> Display and change the system environment<br/></td>
+   </tr>
+   <tr>
+    <td>
+     <a href="releasenotes.xhtml">
+      <b>What's New</b>
+     </a>
+    </td>
+    <td> Enhancements in this version of Axiom<br/></td>
+   </tr>
+   <tr>
+    <td>
+     <a href="axiomfonts.xhtml">
+      <b>Fonts</b>
+     </a>
+    </td>
+    <td> Test Axiom Fonts in your Browser<br/></td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+%%S
+\subsection{series.xhtml}
+<<series.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  Create a series by
+  <table>
+   <tr>
+    <td width="100">
+     <a href="/home/silver/seriesexpand.xhtml">
+      <b>Expansion</b>
+     </a>
+    </td>
+    <td>
+     Expand a function in a series around a point
+    </td>
+   </tr>
+   <tr>
+    <td width="100">
+     <a href="/home/silver/taylorseries.xhtml">
+      <b>Taylor Series</b>
+     </a>
+    </td>
+    <td><br/>
+     Series where the exponent ranges over the integers from a 
+     non-negative integer value to plus infinity by an arbitrary
+     positive integer step size.
+    </td>
+   </tr>
+   <tr>
+    <td width="100">
+     <a href="/home/silver/laurentseries.xhtml">
+      <b>Laurent Series</b>
+     </a>
+    </td>
+    <td><br/>
+     Series where the exponent ranges from an arbitrary integer value
+     to plus infinity by an arbitrary positive integer step size.
+    </td>
+   </tr>
+   <tr>
+    <td width="100">
+     <a href="/home/silver/puiseuxseries.xhtml">
+      <b>Puiseux Series</b>
+     </a>
+    </td>
+    <td><br/>
+     Series where the exponent ranges from an arbitrary rational value
+     to plus infinity by an arbitrary positive rational number step size.
+    </td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{seriesexpand.xhtml}
+<<seriesexpand.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    myfunc = document.getElementById('function').value;
+    myvar = document.getElementById('var').value;
+    mypoint = document.getElementById('point').value;
+    ans = 'series('+myfunc+','+myvar+'='+mypoint+')';
+    alert(ans);
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+  <table>
+   <tr>
+    <td>
+      What function would you like to expand in a power series?
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <input type="text" id="function" size="80" tabindex="10"
+       value="log(cot(x))"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the power series variable:
+     <input type="text" id="var" size="10" tabindex="20" value="x"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Expand around the point:
+     <input type="text" id="point" size="10" tabindex="30" value="%pi/2"/>
+    </td>
+   </tr>
+  </table>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+
+@
+
+\subsection{solve.xhtml}
+<<solve.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+ What do you want to solve?
+  <table>
+   <tr>
+    <td>
+     <a href="/home/silver/solvelinearequations.xhtml">
+      A System of Linear Equations in equation form
+     </a>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="/home/silver/solvelinearmatrix.xhtml">
+      A System of Linear Equations in matrix form
+     </a>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="/home/silver/solvesystempolynomials.xhtml">
+      A System of Polynomial Equations
+     </a>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <a href="/home/silver/solvesinglepolynomial.xhtml">
+      A Single Polynomial Equation
+     </a>
+    </td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+
+\subsection{solvelinearequations.xhtml}
+<<solvelinearequations.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<![CDATA[
+   function indeps(i) {
+    var ans="";
+    for (var j = 0 ; j < i ; j++) {
+     ans=ans+'x'+j
+     if (j != (i - 1)) ans=ans+',';
+    }
+    return(ans);
+   }
+   function equation(i) {
+    var ans="";
+    for (var j = 0 ; j < i ; j++) {
+     ans=ans+Math.floor(Math.random()*100)+'*x'+j;
+     if (j != (i - 1)) ans=ans+'+';
+    }
+    ans=ans+"="+Math.floor(Math.random()*100);
+    return(ans);
+   }
+   function byelement() {
+      // find out how many rows and columns, must be positive and nonzero
+    var rcnt = parseInt(document.getElementById('rowcnt').value);
+    if (rcnt <= 0) {
+      alert("Rows must be positive and non-zero -- defaulting to 1");
+      rcnt = 1;
+      document.getElementById('rowcnt').value=1;
+      return(false);
+    }
+      // remove the question and the buttons
+    var quest = document.getElementById('question');
+    var clicks = document.getElementById('clicks');
+    quest.removeChild(clicks);
+      // write "Elements"
+    var tbl = document.getElementById('form2');
+    var tblsize = tbl.rows.length;
+    var row = tbl.insertRow(tblsize);
+    var thecell = row.insertCell(0);
+    var tnode = document.createTextNode("Enter the equations:");
+    thecell.appendChild(tnode);
+      // create input boxes for the matrix values
+    for (var i = 0 ; i < rcnt ; i++) {
+     tblsize = tblsize + 1;
+     row = tbl.insertRow(tblsize);
+     thecell = row.insertCell(0);
+     tnode = document.createTextNode('equation '+i+': ');
+     thecell.appendChild(tnode);
+     thecell = row.insertCell(1);
+     tnode = document.createElement('input');
+     tnode.type = 'text';
+     tnode.name = 'a'+i;
+     tnode.id = 'a'+i;
+     tnode.size=50;
+     tnode.value=equation(rcnt);
+     tnode.tabindex=20+i;
+     thecell.appendChild(tnode);
+    }
+      // insert the request for the unknown
+    tblsize = tblsize + 1;
+    row = tbl.insertRow(tblsize);
+    thecell = row.insertCell(0);
+    tnode = document.createTextNode("Enter the unknowns (comma separated):");
+    thecell.appendChild(tnode);
+    thecell = row.insertCell(1);
+    tnode = document.createElement('input');
+    tnode.type = 'text';
+    tnode.name = 'unk';
+    tnode.id = 'unk';
+    tnode.size=10;
+    tnode.value=indeps(rcnt);
+    tnode.tabindex=2000;
+    thecell.appendChild(tnode);
+    tblsize = tblsize + 1;
+      // insert a blank line
+    row = tbl.insertRow(tblsize);
+    thecell = row.insertCell(0);
+    tnode = document.createTextNode("");
+    thecell.appendChild(tnode);
+      // insert the continue button
+    var centnode = document.createElement('center');
+    tbl.parentNode.appendChild(centnode);
+    tnode = document.createElement('input');
+    tnode.type = 'button';
+    tnode.id = 'contbutton';
+    tnode.value = 'Continue';
+    tnode.setAttribute("onclick","makeRequest('');");
+    centnode.appendChild(tnode);
+    return(false);
+   }
+   function commandline(arg) {
+     var rcnt = parseInt(document.getElementById('rowcnt').value);
+     var cmdhead = 'solve(';
+     var cmdtail = '])';
+     var listbody = '[';
+     for (var j = 0 ; j < rcnt ; j++) {
+      var aj = document.getElementById('a'+j).value;
+      listbody = listbody+aj;
+      if (j != (rcnt - 1)) listbody = listbody+',';
+     }
+     listbody = listbody+']';
+     cmdhead = cmdhead+listbody;
+     var ans = cmdhead+',['+document.getElementById('unk').value+cmdtail;
+     alert(ans);
+     return(ans);
+   }
+]]>
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+ <table id="form2">
+  <tr>
+   <td>
+    Enter the number of equations:
+    <input type="text" id="rowcnt" tabindex="10" size="10" value="2"/>
+   </td>
+  </tr>
+ </table>
+ <div id="question">
+  <div id="clicks">
+   <center>
+    <input type="button" value="Continue" onclick="byelement();"/>
+   </center>
+  </div>
+ </div>
+<<answer field>>
+<<page foot>>
+@
+
+\subsection{solvelinearmatrix.xhtml}
+<<solvelinearmatrix.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+<![CDATA[
+   function byformula() {
+      // find out how many rows and columns, must be positive and nonzero
+    var rcnt = parseInt(document.getElementById('rowcnt').value);
+     if (rcnt <= 0) {
+      alert("Rows must be positive and non-zero -- defaulting to 1");
+      rcnt = 1;
+      document.getElementById('rowcnt').value=1;
+      return(false);
+     }
+    var ccnt = parseInt(document.getElementById('colcnt').value);
+     if (ccnt <= 0) {
+      alert("Columns must be positive and non-zero -- defaulting to 1");
+      ccnt = 1;
+      document.getElementById('colcnt').value=1;
+      return(false);
+     }
+      // remove the question and the buttons
+    var quest = document.getElementById('question');
+    var clicks = document.getElementById('clicks');
+    quest.removeChild(clicks);
+    var tbl = document.getElementById('form2');
+    var tblsize = tbl.rows.length;
+      // make the row variable question
+      // row variable left cell
+    var row = tbl.insertRow(tblsize);
+    var cell = row.insertCell(0);
+    var tnode = document.createTextNode("Enter the row variable");
+    cell.appendChild(tnode);
+      // row variable right cell
+    cell = row.insertCell(1);
+    tnode = document.createElement('input');
+    tnode.type = 'text';
+    tnode.name = 'rowvar';
+    tnode.id = 'rowvar';
+    tnode.size=10;
+    tnode.value='i';
+    tnode.tabindex=21;
+    cell.appendChild(tnode);
+      // make the column variable question
+      // column variable left cell
+    tblsize = tblsize + 1;
+    row = tbl.insertRow(tblsize);
+    cell = row.insertCell(0);
+    tnode = document.createTextNode("Enter the column variable");
+    cell.appendChild(tnode);
+      // column variable right cell
+    cell = row.insertCell(1);
+    tnode = document.createElement('input');
+    tnode.type = 'text';
+    tnode.name = 'colvar';
+    tnode.id = 'colvar';
+    tnode.size=10;
+    tnode.tabindex=22;
+    tnode.value='j';
+    cell.appendChild(tnode);
+      // make the formula question
+      // column variable left cell
+    tblsize = tblsize + 1;
+    row = tbl.insertRow(tblsize);
+    cell = row.insertCell(0);
+    tnode = document.createTextNode("Enter the formulas for the elements");
+    cell.appendChild(tnode);
+      // formula input field
+    tblsize = tblsize + 1;
+    row = tbl.insertRow(tblsize);
+    cell = row.insertCell(0);
+    tnode = document.createElement('input');
+    tnode.type = 'text';
+    tnode.name = 'formula1';
+    tnode.id = 'formula1';
+    tnode.size=50;
+    tnode.value = '1/(x-i-j-1)';
+    tnode.tabindex=23;
+    cell.appendChild(tnode);
+    tblsize = tblsize + 1;
+    row = tbl.insertRow(tblsize);
+    cell = row.insertCell(0);
+    tnode = document.createTextNode("Enter the vector, one per row:");
+    cell.appendChild(tnode);
+      // formula input field
+    tblsize = tblsize + 1;
+    row = tbl.insertRow(tblsize);
+    cell = row.insertCell(0);
+    tnode = document.createElement('input');
+    tnode.type = 'text';
+    tnode.name = 'vec1';
+    tnode.id = 'vec1';
+    tnode.size=70;
+    tnode.value = '3,5';
+    tnode.tabindex=24;
+    cell.appendChild(tnode);
+      // insert the continue button
+    tblsize = tblsize + 1;
+    row = tbl.insertRow(tblsize);
+    cell = row.insertCell(0);
+    tnode = document.createElement('input');
+    tnode.type = 'button';
+    tnode.id = 'contbutton';
+    tnode.value = 'Continue';
+    tnode.setAttribute("onclick","makeRequest('formula');");
+    tnode.tabindex=24;
+    cell.appendChild(tnode);
+    return(false);
+   }
+   function byelement() {
+      // find out how many rows and columns, must be positive and nonzero
+    var rcnt = parseInt(document.getElementById('rowcnt').value);
+     if (rcnt <= 0) {
+      alert("Rows must be positive and non-zero -- defaulting to 1");
+      rcnt = 1;
+      document.getElementById('rowcnt').value=1;
+      return(false);
+     }
+    var ccnt = parseInt(document.getElementById('colcnt').value);
+     if (ccnt <= 0) {
+      alert("Columns must be positive and non-zero -- defaulting to 1");
+      ccnt = 1;
+      document.getElementById('colcnt').value=1;
+      return(false);
+     }
+      // remove the question and the buttons
+    var quest = document.getElementById('question');
+    var clicks = document.getElementById('clicks');
+    quest.removeChild(clicks);
+      // write "Elements"
+    var tbl = document.getElementById('form2');
+    var tblsize = tbl.rows.length;
+    var row = tbl.insertRow(tblsize);
+    var thecell = row.insertCell(0);
+    var tnode = document.createTextNode("Elements");
+    thecell.appendChild(tnode);
+      // create input boxes for the matrix values
+    tblsize = tblsize + 1;
+    for (var i = 0 ; i < rcnt ; i++) {
+     row = tbl.insertRow(tblsize);
+     for (var j = 0 ; j < ccnt ; j++) {
+      thecell = row.insertCell(j);
+      tnode = document.createElement('input');
+      tnode.type = 'text';
+      tnode.name = 'a'+i+'c'+j;
+      tnode.id = 'a'+i+'c'+j;
+      tnode.size=10;
+      tnode.tabindex=20+(i*10)+j;
+      thecell.appendChild(tnode);
+     }
+      thecell = row.insertCell(j);
+      tnode = document.createTextNode(' = ');
+      thecell.appendChild(tnode);
+      thecell = row.insertCell(j+1);
+      tnode = document.createElement('input');
+      tnode.type = 'text';
+      tnode.name = 'k'+i;
+      tnode.id = 'k'+i;
+      tnode.size=10;
+      tnode.value='0';
+      tnode.tabindex=20+(i*10)+j+10;
+      thecell.appendChild(tnode);
+      tblsize = tblsize + 1;
+    }
+      // insert a blank line
+    row = tbl.insertRow(tblsize);
+    thecell = row.insertCell(0);
+    tnode = document.createTextNode("");
+    thecell.appendChild(tnode);
+      // insert the continue button
+    var centnode = document.createElement('center');
+    tbl.parentNode.appendChild(centnode);
+    tnode = document.createElement('input');
+    tnode.type = 'button';
+    tnode.id = 'contbutton';
+    tnode.value = 'Continue';
+    tnode.setAttribute("onclick","makeRequest('element');");
+    centnode.appendChild(tnode);
+    return(false);
+   }
+   function commandline(arg) {
+    if (arg == 'element') {
+     var rcnt = parseInt(document.getElementById('rowcnt').value);
+     var ccnt = parseInt(document.getElementById('colcnt').value);
+      // get the right side vector into list form
+     var vecbody = '[';
+     var homogeneous = true;
+     for (var k = 0 ; k < rcnt ; k++) {
+       var ki = document.getElementById('k'+k).value;
+         // is it homogeneous?
+       if (parseInt(ki) != 0) homogeneous = false;
+       vecbody = vecbody+ki;
+       if (k != (rcnt - 1)) vecbody = vecbody+',';
+     }
+     vecbody = vecbody+']';
+     alert('vecbody='+vecbody);
+       // get the matrix elements, make them into lists of lists
+     var listbody = '';
+     for (var i = 0 ; i < rcnt ; i++) {
+      var listbody = listbody+'[';
+      for (var j = 0 ; j < ccnt ; j++) {
+       var aij = document.getElementById('a'+i+'c'+j).value;
+       listbody = listbody+aij;
+       if (j != (ccnt - 1)) listbody = listbody+',';
+      }
+      listbody = listbody+']';
+      if (i != (rcnt - 1)) listbody = listbody+',';
+     }
+     var matcmd = 'matrix(['+listbody+'])';
+     alert('matcmd='+matcmd);
+      // now we decide whether to compute the nullSpace or solve
+     if (homogeneous == true) 
+       cmd = 'nullSpace('+matcmd+')';
+     else
+       cmd = 'solve('+matcmd+','+vecbody+')';
+     alert(cmd);
+     return(cmd);
+    } else {
+     var rcnt = parseInt(document.getElementById('rowcnt').value);
+     var ccnt = parseInt(document.getElementById('colcnt').value);
+     var vec = '['+document.getElementById('vec1').value+']';
+     var cmdhead = 'matrix([[';
+     var cmdtail = '])';
+     var formula = document.getElementById('formula1').value;
+     var rowv = document.getElementById('rowvar').value;
+     var colv = document.getElementById('colvar').value;
+     var cmd = cmdhead+formula+' for '+colv+' in 1..'+ccnt+']'+
+                               ' for '+rowv+' in 1..'+rcnt+cmdtail;
+     return(cmd);
+    }
+   }
+]]>
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+Enter the size of the matrix:
+<table id="form2">
+ <tr>
+  <td size="10">Rows</td>
+  <td><input type="text" id="rowcnt" tabindex="10" size="10" value="2"/></td>
+ </tr>
+ <tr>
+  <td>Columns</td>
+  <td><input type="text" id="colcnt" tabindex="20" size="10" value="3"/></td>
+ </tr>
+</table>
+<div id="question">
+ <div id="clicks">
+  How would you like to enter the matrix elements?
+  <center>
+   <input type="button" value="By Formula" onclick="byformula();"/>
+   <input type="button" value="By Element" onclick="byelement();"/>
+  </center>
+ </div>
+</div>
+<<answer field>>
+<<page foot>>
+@
+
+
+@
+
+\subsection{solvesinglepolynomial.xhtml}
+<<solvesinglepolynomial.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      solvesinglepolynomial.xhtml not implemented
+<<page foot>>
+
+@
+
+\subsection{solvesystempolynomials.xhtml}
+<<solvesystempolynomials.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+     solvesystempolynomials.xhtml  not implemented
+<<page foot>>
+
+@
+
+\subsection{summation.xhtml}
+<<summation.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    var myform = document.getElementById("form2");
+    return('sum('+myform.expr.value+','+myform.vars.value+'='+
+                  myform.lower.value+'..'+myform.upper.value+')');
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+  <form id="form2">
+   Enter the function you want to sum:<br/>
+   <input type="text" id="expr" tabindex="10" size="50" value="i^3"/><br/>
+   Enter the summation index:
+   <input type="text" id="vars" tabindex="20" value="i" size="5"/><br/>
+   Enter the limits of the sum: From:
+   <input type="text" id="lower" tabindex="30" value="1" size="5"/>
+   To:
+   <input type="text" id="upper" tabindex="40" value="n" size="5"/><br/>
+  </form>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+@
+
+\subsection{systemvariables.xhtml}
+<<systemvariables.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      systemvariables not implemented
+<<page foot>>
+@
+
+
+%%T
+
+\subsection{taylorseries.xhtml}
+<<taylorseries.xhtml>>=
+<<standard head>>
+  <script type="text/javascript">
+   function commandline(arg) {
+    myfunc = document.getElementById('function').value;
+    myivar = document.getElementById('ivar').value;
+    mypvar = document.getElementById('pvar').value;
+    myevar = document.getElementById('evar').value;
+    myival = document.getElementById('ival').value;
+    mysval = document.getElementById('sval').value;
+    ans = 'series('+myivar+'+->'+myfunc+','+mypvar+'='+myevar+','+
+         myival+'..,'+mysval+')';
+    alert(ans);
+    return(ans);
+   }
+<<showfullanswer>>
+<<axiom talker>>
+  </script>
+ </head>
+ <body>
+<<page head>>
+  <table>
+   <tr>
+    <td>
+      Enter the formula for the general coefficient of the series:
+    </td>
+   </tr>
+   <tr>
+    <td>
+     <input type="text" id="function" size="80" tabindex="10"
+       value="1/factorial(i)"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the index variable for your formula:
+     <input type="text" id="ivar" size="10" tabindex="20" value="i"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the power series variable:
+     <input type="text" id="pvar" size="10" tabindex="30" value="x"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the point about which to expand:
+     <input type="text" id="evar" size="10" tabindex="40" value="0"/>
+    </td>
+   </tr>
+  </table>
+For Taylor Series, the exponent of the power series variable ranges
+from an initial value, an arbitrary non-negative integer, to plus
+infinity; the step size is any positive integer.
+  <table>
+   <tr>
+    <td>
+     Enter the initial value of the index (an integer):
+     <input type="text" id="ival" size="10" tabindex="50" value="0"/>
+    </td>
+   </tr>
+   <tr>
+    <td>
+     Enter the step size (a positive integer):
+     <input type="text" id="sval" size="10" tabindex="60" value="1"/>
+    </td>
+   </tr>
+  </table>
+<<continue button>>
+<<answer field>>
+<<page foot>>
+
+@
+
+\subsection{topexamplepage.xhtml}
+<<topexamplepage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <table>
+   <tr>
+    <td><a href="graphicsexamplepage.xhtml"><b>Graphics</b></a></td>
+    <td>Examples of Axiom Graphics</td>
+   </tr>
+   <tr>
+    <td><a href="examplesexposedpage.xhtml"><b>Domains</b></a></td>
+    <td>Examples of use of Axiom domains and packages</td>
+   </tr>
+   <tr>
+    <td><a href="examplecoverpage.xhtml"><b>Operations</b></a></td>
+    <td>Examples of Axiom Operations, by topic</td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{topicspage.xhtml}
+<<topicspage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <table>
+   <tr>
+    <td><a href="numberspage.xhtml"><b>Numbers</b></a></td>
+    <td>A look at different types of numbers</td>
+   </tr>
+   <tr>
+    <td><a href="polynomialpage.xhtml"><b>Polynomials</b></a></td>
+    <td>Polynomials in Axiom</td>
+   </tr>
+   <tr>
+    <td><a href="functionpage.xhtml"><b>Functions</b></a></td>
+    <td>Built-in and user-defined functions</td>
+   </tr>
+   <tr>
+    <td><a href="equationpage.xhtml"><b>Solving Equations</b></a></td>
+    <td>Facilities for solving equations</td>
+   </tr>
+   <tr>
+    <td><a href="calculuspage.xhtml"><b>Calculus</b></a></td>
+    <td>Using Axiom to do calculus</td>
+   </tr>
+   <tr>
+    <td><a href="linalgpage.xhtml"><b>Linear Algebra</b></a></td>
+    <td>Axiom's linear algebra facilities</td>
+   </tr>
+   <tr>
+    <td><a href="graphicspage.xhtml"><b>Graphics</b></a></td>
+    <td>Axiom's graphics facilities</td>
+   </tr>
+   <tr>
+    <td><a href="algebrapage.xhtml"><b>Algebra</b></a></td>
+    <td>Axiom's abstract algebra facilities</td>
+   </tr>
+   <tr>
+    <td><a href="cryptopage.xhtml"><b>Cryptography</b></a></td>
+    <td>Alasdair McAndrew's Crytography Course Notes</td>
+   </tr>
+   <tr>
+    <td><a href="ocwmit18085.xhtml"><b>Mathematical Methods</b></a></td>
+    <td>MIT 18-08 Mathematical Methods for Engineers Course Notes</td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{topreferencepage.xhtml}
+<<topreferencepage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+  <table>
+   <tr>
+    <td><a href="usersguidepage.xhtml"><b>AXIOM Book</b></a></td>
+    <td>The on-line version of the Jenks/Sutor book.</td>
+   </tr>
+   <tr>
+    <td><a href="aldorusersguidepage.xhtml"><b>Aldor Guide</b></a></td>
+    <td>The on-line Aldor Users Guide.</td>
+   </tr>
+   <tr>
+    <td><a href="foundationlibrarydocpage.xhtml"><b>NAG Library</b></a></td>
+    <td>The on-line NAG Library documentation.</td>
+   </tr>
+   <tr>
+    <td><a href="topicspage.xhtml"><b>Topics</b></a></td>
+    <td>Learn how to use Axiom, by topic.</td>
+   </tr>
+   <tr>
+    <td><a href="uglangpage.xhtml"><b>Language</b></a></td>
+    <td>Introduction to the Axiom language.</td>
+   </tr>
+   <tr>
+    <td><a href="examplesexposedpage.xhtml"><b>Examples</b></a></td>
+    <td>Examples for exposed domains and packages</td>
+   </tr>
+   <tr>
+    <td><a href="ugsyscmdpage.xhtml"><b>Commands</b></a></td>
+    <td>System commands that control your workspace.</td>
+   </tr>
+   <tr>
+    <td><a href="operations.xhtml"><b>Operations</b></a></td>
+    <td>A guide to useful operations</td>
+   </tr>
+   <tr>
+     <td><a href="systemvariables.xhtml"><b>System Variables</b></a></td>
+    <td>View and change a system-defined variable</td>
+   </tr>
+   <tr>
+    <td><a href="glossarypage.xhtml"><b>Glossary</b></a></td>
+    <td>A glossary of Axiom terms.</td>
+   </tr>
+   <tr>
+    <td><a href="htxtoppage.xhtml"><b>HyperDoc</b></a></td>
+    <td>How to write your own HyperDoc pages.</td>
+   </tr>
+   <tr>
+    <td><a href="refsearchpage.xhtml"><b>Search</b></a></td>
+    <td>Reference pages for occurrences of a string.</td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{topsettingspage.xhtml}
+<<topsettingspage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+System commands are used to perform Axiom environment
+management and change Axiom system variables.
+  <hr/>
+  <table>
+   <tr>
+    <td><a href="ugsyscmdpage.xhtml"><b>Commands</b></a></td>
+    <td>System commands that control your environment.</td>
+   </tr>
+   <tr>
+    <td><a href="htSystemVariables.js"><b>Settings</b></a></td>
+    <td>Change an Axiom variable.</td>
+   </tr>
+  </table>
+<<page foot>>
+@
+
+\subsection{tutorial.xhtml}
+<<tutorial.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      tutorial not implemented
+<<page foot>>
+@
+
+%%U
+\subsection{uglangpage.xhtml}
+<<uglangpage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      uglangpage not implemented
+<<page foot>>
+@
+
+\subsection{ugsyscmdpage.xhtml}
+<<ugsyscmdpage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      ugsyscmdpage not implemented
+<<page foot>>
+@
+
+
+\subsection{usersguidepage.xhtml}
+<<usersguidepage.xhtml>>=
+<<standard head>>
+ </head>
+ <body>
+<<page head>>
+      usersguidepage not implemented
+<<page foot>>
+@
+
+
+%%V
+%%W
+%%X
+%%Y
+%%Z
+\subsection{rcm3720.input}
+<<rcm3720.input>>=
+str2lst(str) == [ord(str.i)-65 for i in 1..#str]
+
+lst2str(lst) == concat [char(lst.i+65)::String for i in 1..#lst]
+
+str2num(str) ==
+  local strlst
+  strlst:=[ord(str.i) for i in 1..#str]
+  return wholeRadix(strlst)$RadixExpansion(256)::INT
+
+num2str(n) ==
+  local tmp
+  tmp:=wholeRagits(n::RadixExpansion(256))
+  return concat [char(tmp.i)::String for i in 1..#tmp]
+
+superIncreasing?(lst) ==
+  reduce(/\,[lst.i>reduce(+,[lst.j for j in 1..i-1]) for i in 2..#lst])
+
+siSolve(lst,n) ==
+  local res,m,i
+  if not superIncreasing?(lst) then error "The list is not super-increasing"
+  m := n
+  res := [0 for i in 1..#lst]
+  for i in #lst..1 by -1 repeat
+    if lst.i <= m then
+      res.i := 1
+      m := m - lst.i
+      if m = 0 then return res
+  error "Unsolvable"
+
+subsetsum(L:List(INT),N:INT):List(INT) ==
+  local x,Y
+  if N=0 then return([])
+  if N<0 or #L=0 then return([-1])
+  for x in L repeat
+    Y:=subsetsum(remove(x,L),N)
+    if Y~=[-1] then return(Y)
+    Y:=subsetsum(remove(x,L),N-x)
+    if Y~=[-1] then return(cons(x,Y))
+    return([-1])
+@
+
+\subsection{signatures.txt}
+<<signatures.txt>>=
+RSA --- 
+n = 2^137-1 e = 17 
+message = "This is my text." 
+signature = 68767027465671577191073128495082795700768 
+n = (6^67-1)/5 e = 17 
+message = "Please feed my dog!" 
+signature = 1703215098456351993605104919259566435843590978852633 
+
+Rabin ----- 
+n = (3^59-1)/2 
+message = "Leave now." 
+signature = 
+n = (7^47-1)/6 
+message = "Arrive Thursday." 
+signature = 189479723122534414019783447271411895509 
+
+El Gamal -------- 
+p = next prime after 2^150 
+a = 2 
+B = 1369851585774063312693119161120024351761244461 
+message = "Leave AT ONCE!" 
+signature r = 1389080525305754392111976715361069425353578198 
+s = 1141326468070168229982976133801721430306004477 
+
+DSS --- 
+p = next prime after 2^170 
+q = 143441505468590696209 
+g = 672396402136852996799074813867123583326389281120278 
+B = 1394256880659595564848116770226045673904445792389839 
+message = "Now's your chance!" 
+signature r = 64609209464638355801 
+s = 13824808741200493330 
+@
+
+\subsection{strang.input}
+<<strang.input>>=
+rowmatrix(r:List(Fraction(Integer))):Matrix(Fraction(Integer)) ==
+ [r]::Matrix(Fraction(Integer))
+
+columnmatrix(c:List(Fraction(Integer))):Matrix(Fraction(Integer)) ==
+ [[i] for i in c]::Matrix(Fraction(Integer))
+
+k(n) == 
+ M := diagonalMatrix([2 for i in 1..n]) 
+ for i in 1..n-1 repeat M(i,i+1):=-1 
+ for i in 1..n-1 repeat M(i+1,i):=-1 
+ M::SquareMatrix(n,Fraction(Integer))
+
+t(n) == 
+ M:=k(n)
+ N:=M::Matrix(Fraction(Integer)) 
+ qsetelt!(N,1,1,1) 
+ N::SquareMatrix(n,Fraction(Integer))
+
+b(n) == 
+ M:=k(n)
+ N:=M::Matrix(Fraction(Integer)) 
+ qsetelt!(N,1,1,1) 
+ qsetelt!(N,n,n,1)
+ N::SquareMatrix(n,Fraction(Integer))
+
+K:=k(3)
+T:=t(3)
+B:=b(3)
+
+
+@
+\subsection{bitmaps/axiom1.bitmap}
+<<axiom1.bitmap>>=
+#define axiom_width 270
+#define axiom_height 100
+static char axiom_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x1f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+   0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x80, 0x3f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xf2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x92, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x02,
+   0x00, 0xe0, 0x01, 0xf0, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xe0, 0xff, 0x01, 0x00, 0x00, 0xe0,
+   0x00, 0xc0, 0x7f, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0xd2, 0x02, 0x00, 0xe0,
+   0xff, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0x03, 0xf8, 0xff, 0xff, 0x03,
+   0xe0, 0x07, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0xf8, 0x01, 0xf8,
+   0xff, 0x03, 0x00, 0xf8, 0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
+   0xff, 0x3f, 0xff, 0xff, 0xff, 0x03, 0xf8, 0xff, 0xff, 0x01, 0xf8, 0x07,
+   0x00, 0x80, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x01, 0xfe, 0xff, 0x07,
+   0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x7f,
+   0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xfd, 0xff, 0x07, 0x00, 0xe0,
+   0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff,
+   0xff, 0x03, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x8f, 0xff, 0xff, 0xe0, 0xff,
+   0x7f, 0x00, 0x80, 0xff, 0x3f, 0xfe, 0xff, 0x07, 0x00, 0xf0, 0xff, 0xff,
+   0xff, 0x80, 0xff, 0xff, 0xc0, 0xff, 0xff, 0x1f, 0xc0, 0xff, 0xff, 0x07,
+   0x00, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0xf0, 0xff, 0x81, 0xff, 0x3f, 0x00,
+   0x00, 0xff, 0x07, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xc3,
+   0xff, 0xff, 0xf0, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x0f, 0x00, 0x00,
+   0x00, 0xf0, 0x1f, 0x00, 0xe0, 0xff, 0x01, 0xff, 0x3f, 0x00, 0x00, 0xfe,
+   0x03, 0xe0, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff,
+   0xf8, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xf0,
+   0x0f, 0x00, 0xc0, 0xff, 0x01, 0xfe, 0x3f, 0x00, 0x00, 0xfe, 0x01, 0xc0,
+   0xff, 0x03, 0x80, 0xff, 0x00, 0xfc, 0xff, 0x07, 0xf8, 0xff, 0xfc, 0x01,
+   0xff, 0x3f, 0xfe, 0x80, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00,
+   0xc0, 0xff, 0x03, 0xfe, 0x3f, 0x00, 0x00, 0xff, 0x00, 0x80, 0xff, 0x03,
+   0xc0, 0x3f, 0x00, 0xe0, 0xff, 0x0f, 0xe0, 0xff, 0x3f, 0x00, 0xfe, 0xbf,
+   0x3f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x80, 0xff,
+   0x03, 0xf8, 0x3f, 0x00, 0x80, 0x7f, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x0f,
+   0x00, 0x80, 0xff, 0x1f, 0xe0, 0xff, 0x0f, 0x00, 0xf8, 0xff, 0x0f, 0x00,
+   0xfc, 0x1f, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xff, 0x03, 0xf8,
+   0x7f, 0x00, 0x80, 0x3f, 0x00, 0x80, 0xff, 0x03, 0xf0, 0x0f, 0x00, 0x00,
+   0xff, 0x1f, 0xe0, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xfc, 0x1f,
+   0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xff, 0x03, 0xf0, 0xff, 0x00,
+   0xc0, 0x1f, 0x00, 0x80, 0xff, 0x03, 0xf8, 0x07, 0x00, 0x00, 0xfe, 0x3f,
+   0xe0, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0x3f, 0x00, 0x00,
+   0x00, 0x78, 0x00, 0x00, 0x00, 0xff, 0x03, 0xe0, 0xff, 0x00, 0xc0, 0x0f,
+   0x00, 0x80, 0xff, 0x03, 0xfc, 0x03, 0x00, 0x00, 0xfc, 0x3f, 0xe0, 0xff,
+   0x03, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x3c,
+   0x00, 0x00, 0x00, 0xff, 0x03, 0xc0, 0xff, 0x01, 0xe0, 0x0f, 0x00, 0x80,
+   0xff, 0x03, 0xfc, 0x03, 0x00, 0x00, 0xfc, 0x3f, 0xe0, 0xff, 0x01, 0x00,
+   0xf0, 0xff, 0x01, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
+   0x00, 0xff, 0x03, 0xc0, 0xff, 0x03, 0xf0, 0x07, 0x00, 0x80, 0xff, 0x03,
+   0xfe, 0x01, 0x00, 0x00, 0xf8, 0x7f, 0xe0, 0xff, 0x01, 0x00, 0xf0, 0xff,
+   0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0x03, 0x80, 0xff, 0x07, 0xf8, 0x01, 0x00, 0x80, 0xff, 0x03, 0xff, 0x01,
+   0x00, 0x00, 0xf8, 0x7f, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00,
+   0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00,
+   0xff, 0x0f, 0xf8, 0x01, 0x00, 0x80, 0xff, 0x03, 0xff, 0x01, 0x00, 0x00,
+   0xf0, 0x7f, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x3f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0xfe, 0x1f,
+   0xf8, 0x00, 0x00, 0x80, 0xff, 0x83, 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff,
+   0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0xfc, 0x3f, 0x7e, 0x00,
+   0x00, 0x80, 0xff, 0xc3, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xe0, 0xff,
+   0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0xf8, 0x7f, 0x3e, 0x00, 0x00, 0x80,
+   0xff, 0xc3, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xe0, 0xff, 0x00, 0x00,
+   0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0x03, 0x00, 0xf8, 0x7f, 0x3f, 0x00, 0x00, 0x80, 0xff, 0xc3,
+   0xff, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f,
+   0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff,
+   0x03, 0x00, 0xf0, 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xc3, 0xff, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00,
+   0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x03, 0x00,
+   0xe0, 0xff, 0x0f, 0x00, 0x00, 0x80, 0xff, 0xe3, 0xff, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0xe1, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x3f,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff,
+   0x07, 0x00, 0x00, 0x80, 0xff, 0xe3, 0xff, 0x00, 0x00, 0x00, 0xc0, 0xff,
+   0xe1, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0x7f, 0xff, 0x03, 0x00, 0x80, 0xff, 0x07, 0x00,
+   0x00, 0x80, 0xff, 0xe3, 0xff, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xe1, 0xff,
+   0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00,
+   0xfc, 0xff, 0x07, 0xff, 0x03, 0x00, 0x80, 0xff, 0x07, 0x00, 0x00, 0x80,
+   0xff, 0xe3, 0xff, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xe1, 0xff, 0x00, 0x00,
+   0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f,
+   0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x80, 0xff, 0xe3,
+   0xff, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f,
+   0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x07, 0x00, 0xff,
+   0x03, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xe3, 0xff, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00,
+   0xf8, 0x3f, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x01, 0x00, 0xff, 0x03, 0x00,
+   0x00, 0xfe, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xe3, 0xff, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x1f,
+   0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff,
+   0x3f, 0x00, 0x00, 0x80, 0xff, 0xe3, 0xff, 0x00, 0x00, 0x00, 0xc0, 0xff,
+   0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00,
+   0x00, 0xf8, 0x3f, 0x00, 0x00, 0xff, 0x03, 0x00, 0x80, 0xff, 0x7f, 0x00,
+   0x00, 0x80, 0xff, 0xe3, 0xff, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xe0, 0xff,
+   0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0xfc,
+   0x1f, 0x00, 0x00, 0xff, 0x03, 0x00, 0x80, 0xff, 0xff, 0x00, 0x00, 0x80,
+   0xff, 0xe3, 0xff, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xe0, 0xff, 0x00, 0x00,
+   0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0xfe, 0x1f, 0x00,
+   0x00, 0xff, 0x03, 0x00, 0xc0, 0xef, 0xff, 0x01, 0x00, 0x80, 0xff, 0xe3,
+   0xff, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f,
+   0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0xff,
+   0x03, 0x00, 0xe0, 0xc7, 0xff, 0x01, 0x00, 0x80, 0xff, 0xe3, 0xff, 0x01,
+   0x00, 0x00, 0xc0, 0xff, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00,
+   0xf8, 0x1f, 0x00, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x03, 0x00,
+   0xf0, 0x83, 0xff, 0x07, 0x00, 0x80, 0xff, 0xe3, 0xff, 0x01, 0x00, 0x00,
+   0xc0, 0x7f, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x1f,
+   0x00, 0x00, 0x80, 0xff, 0x07, 0x00, 0x00, 0xff, 0x03, 0x00, 0xf8, 0x83,
+   0xff, 0x0f, 0x00, 0x80, 0xff, 0xe3, 0xff, 0x01, 0x00, 0x00, 0xc0, 0x7f,
+   0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00,
+   0x80, 0xff, 0x07, 0x00, 0x80, 0xff, 0x03, 0x00, 0xf8, 0x01, 0xff, 0x0f,
+   0x00, 0x80, 0xff, 0xc3, 0xff, 0x01, 0x00, 0x00, 0xc0, 0x3f, 0xe0, 0xff,
+   0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x80, 0xff,
+   0x03, 0x00, 0x80, 0xff, 0x03, 0x00, 0xfc, 0x00, 0xfe, 0x1f, 0x00, 0x80,
+   0xff, 0xc3, 0xff, 0x03, 0x00, 0x00, 0xe0, 0x3f, 0xe0, 0xff, 0x00, 0x00,
+   0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x80, 0xff, 0x03, 0x00,
+   0x80, 0xff, 0x03, 0x00, 0xfe, 0x00, 0xfc, 0x3f, 0x00, 0x80, 0xff, 0xc3,
+   0xff, 0x03, 0x00, 0x00, 0xe0, 0x3f, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f,
+   0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x80, 0xff, 0x03, 0x00, 0xc0, 0xff,
+   0x03, 0x00, 0x7f, 0x00, 0xf8, 0x7f, 0x00, 0x80, 0xff, 0xc3, 0xff, 0x07,
+   0x00, 0x00, 0xe0, 0x1f, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00,
+   0xf8, 0x1f, 0x00, 0x00, 0x80, 0xff, 0x03, 0x00, 0xc0, 0xff, 0x03, 0x80,
+   0x3f, 0x00, 0xf8, 0x7f, 0x00, 0x80, 0xff, 0x83, 0xff, 0x07, 0x00, 0x00,
+   0xf0, 0x0f, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x1f,
+   0x00, 0x00, 0x80, 0xff, 0x03, 0x00, 0xe0, 0xff, 0x03, 0x80, 0x1f, 0x00,
+   0xf0, 0xff, 0x00, 0x80, 0xff, 0x83, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0x0f,
+   0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00,
+   0x80, 0xff, 0x07, 0x00, 0xe0, 0xff, 0x03, 0xc0, 0x1f, 0x00, 0xf0, 0xff,
+   0x01, 0x80, 0xff, 0x83, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0x07, 0xe0, 0xff,
+   0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x80, 0xff,
+   0x07, 0x00, 0xf8, 0xff, 0x03, 0xe0, 0x0f, 0x00, 0xe0, 0xff, 0x03, 0x80,
+   0xff, 0x03, 0xff, 0x3f, 0x00, 0x00, 0xf8, 0x03, 0xe0, 0xff, 0x00, 0x00,
+   0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x80, 0xff, 0x0f, 0x00,
+   0xf8, 0xff, 0x03, 0xf0, 0x07, 0x00, 0xc0, 0xff, 0x07, 0x80, 0xff, 0x03,
+   0xfe, 0x7f, 0x00, 0x00, 0xfc, 0x01, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f,
+   0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0xfe, 0xff,
+   0x07, 0xf8, 0x07, 0x00, 0xc0, 0xff, 0x0f, 0x80, 0xff, 0x03, 0xfe, 0xff,
+   0x00, 0x00, 0xfe, 0x00, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00,
+   0xf8, 0x3f, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0x7f, 0xff, 0x0f, 0xf8,
+   0x07, 0x00, 0x80, 0xff, 0x1f, 0x80, 0xff, 0x03, 0xfc, 0xff, 0x01, 0x00,
+   0x7f, 0x00, 0xe0, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x3f,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0xf1, 0x1f, 0xfe, 0xff, 0xff, 0x03, 0x00,
+   0x80, 0xff, 0x3f, 0xc0, 0xff, 0x07, 0xf8, 0xff, 0x1f, 0xf0, 0x3f, 0x00,
+   0xf0, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0x03, 0x00, 0x80, 0xff,
+   0x7f, 0xc0, 0xff, 0x07, 0xf8, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff,
+   0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x00, 0xfc,
+   0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xc0, 0xff, 0xff, 0xe0,
+   0xff, 0x1f, 0xf0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xf8, 0xff, 0x03, 0x00,
+   0xf8, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff,
+   0x01, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0xff, 0xfb, 0xff, 0x3f,
+   0xe0, 0xff, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfc, 0xff,
+   0x07, 0x00, 0xfe, 0xff, 0x01, 0x00, 0x00, 0xf0, 0xff, 0x7f, 0x00, 0xfc,
+   0xff, 0xff, 0x7f, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff,
+   0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0x7f, 0x80,
+   0xff, 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff,
+   0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0x3f,
+   0x00, 0xc0, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x7f, 0xc0, 0xff, 0xff,
+   0x3f, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0x00, 0x1f, 0x00,
+   0xfc, 0x0f, 0xfe, 0xff, 0xcf, 0xff, 0x03, 0xfc, 0xff, 0x0f, 0x00, 0xe0,
+   0xff, 0xff, 0x7f, 0x80, 0xff, 0xff, 0x3f, 0xc0, 0xff, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0xf8, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xe0, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xf0, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
+   0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x1f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
+@
+        
+\section{License}
+<<license>>=
+--Copyright (c) 2007 Arthur C. Ralfs
+--All rights reserved.
+--
+--Redistribution and use in source and binary forms, with or without
+--modification, are permitted provided that the following conditions are
+--met:
+--
+--    - Redistributions of source code must retain the above copyright
+--      notice, this list of conditions and the following disclaimer.
+--
+--    - Redistributions in binary form must reproduce the above copyright
+--      notice, this list of conditions and the following disclaimer in
+--      the documentation and/or other materials provided with the
+--      distribution.
+--
+--    - Neither the name of Arthur C. Ralfs nor the
+--      names of its contributors may be used to endorse or promote products
+--      derived from this software without specific prior written permission.
+--
+--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+--IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+--TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+--PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+--OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+--EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+--PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+--PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+--LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+--NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+@
+
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}
diff --git a/src/hyper/doctitle.png b/src/hyper/doctitle.png
new file mode 100644
index 0000000..cedadc0
Binary files /dev/null and b/src/hyper/doctitle.png differ
diff --git a/src/interp/bookvol5.pamphlet b/src/interp/bookvol5.pamphlet
index 3c4465e..f2e570a 100644
--- a/src/interp/bookvol5.pamphlet
+++ b/src/interp/bookvol5.pamphlet
@@ -962,99 +962,65 @@ SpadInterpretStream(str, source, interactive?) ==
 @
 \section{The Read-Eval-Print Loop}
 \subsection{defun intloopReadConsole}
-\begin{verbatim}
-intloopReadConsole(b, n)==
-    a:= serverReadLine(_*STANDARD_-INPUT_*)
-    not STRINGP a => leaveScratchpad()
-    #a=0 =>
-             PRINC(MKPROMPT())
-             intloopReadConsole('"", n)
-    $DALYMODE and intloopPrefix?('"(",a) =>
-            intnplisp(a)
-            PRINC(MKPROMPT())
-            intloopReadConsole('"",n)
-    pfx := stripSpaces intloopPrefix?('")fi",a)
-    pfx and ((pfx = '")fi") or (pfx = '")fin")) => []
-    b = '"" and (d := intloopPrefix?('")", a)) =>
-             setCurrentLine d
-             c := ncloopCommand(d,n)
-             PRINC(MKPROMPT())
-             intloopReadConsole('"", c)
-    a:=CONCAT(b,a)
-    ncloopEscaped a => intloopReadConsole(SUBSEQ(a, 0, (LENGTH a) - 1),n)
-    c := intloopProcessString(a, n)
-    PRINC(MKPROMPT())
-    intloopReadConsole('"", c)
-\end{verbatim}
+Note that this function relies on the fact that lisp can do tail-recursion.
+The function recursively invokes itself.
+
+The serverReadLine function is a special readline function that handles
+communication with the session manager code, which is a separate process
+running in parallel. 
+
+We read a line from standard input.
+\begin{itemize}
+\item If it is a null line then we exit Axiom.
+\item If it is a zero length line we prompt and recurse
+\item If \$dalymode and open-paren we execute lisp code, prompt and recurse
+The \$dalymode will interpret any input that begins with an open-paren
+as a lisp expression rather than Axiom input. This is useful for debugging
+purposes when most of the input lines will be lisp. Setting \$dalymode
+non-nil will certainly break user expectations and is to be used with 
+caution.
+\item If it is ``)fi'' or ``)fin'' we drop into lisp. Use the (restart)
+      function to return to the interpreter loop.
+\item If it starts with ``)'' we process the command, prompt, and recurse
+\item If it is a command then we remember the current line, process the
+      command, prompt, and recurse.
+\item If the input has a trailing underscore (Axiom line-continuation)
+      then we cut off the continuation character and pass the truncated
+      string to ourselves, prompt, and recurse
+\item otherwise we process the input, prompt, and recurse.
+\end{itemize}
+Notice that all but two paths (a null input or a ``)fi'' or a ``)fin'')
+will end up as a recursive call to ourselves.
 <<defun intloopReadConsole>>=
 (defun |intloopReadConsole| (b n) 
- (prog (c d pfx a) 
-  (declare (special $dalymode)) 
-   (return 
-    (progn 
-     (setq a (|serverReadLine| *standard-input*)) 
-     (cond 
-      ((null (stringp a)) 
-        (|leaveScratchpad|)) 
-      ((eql (length a) 0) 
-        (progn 
-          (princ (mkprompt)) 
-          (|intloopReadConsole| "" n))) 
-      ((and $dalymode (|intloopPrefix?| "(" a)) 
-        (progn 
-          (|intnplisp| a) 
-          (princ (mkprompt)) 
-          (|intloopReadConsole| "" n))) 
-      (t
-       (progn 
-        (setq pfx (|stripSpaces| (|intloopPrefix?| ")fi" a))) 
-        (cond 
-         ((and pfx (or (equal pfx ")fi") (equal pfx ")fin"))) 
-           nil) 
-         ((and (equal b "") (setq d (|intloopPrefix?| ")" a))) 
-           (progn 
-             (|setCurrentLine| d) 
-             (setq c (|ncloopCommand| d n)) 
-             (princ (mkprompt)) 
-             (|intloopReadConsole| "" c))) 
-         (t 
-           (progn 
-             (setq a (concat b a)) 
-             (cond 
-              ((|ncloopEscaped| a) 
-                (|intloopReadConsole| (subseq a 0 (- (length a) 1)) n)) 
-              (t 
-                (progn 
-                  (setq c (|intloopProcessString| a n)) 
-                  (princ (mkprompt)) 
-                  (|intloopReadConsole| "" c))))))))))))))
+ (declare (special $dalymode)) 
+ (let (c d pfx input) 
+   (setq input (|serverReadLine| *standard-input*)) 
+   (when (null (stringp input)) (|leaveScratchpad|)) 
+   (when (eql (length input) 0) 
+     (princ (mkprompt)) 
+     (|intloopReadConsole| "" n))
+   (when (and $dalymode (|intloopPrefix?| "(" input))
+     (|intnplisp| input) 
+     (princ (mkprompt)) 
+     (|intloopReadConsole| "" n))
+   (setq pfx (|intloopPrefix?| ")fi" input))
+   (when (and pfx (or (string= pfx ")fi") (string= pfx ")fin")))
+     (throw '|top-level| nil))
+   (when (and (equal b "") (setq d (|intloopPrefix?| ")" input)))
+     (|setCurrentLine| d) 
+     (setq c (|ncloopCommand| d n)) 
+     (princ (mkprompt)) 
+     (|intloopReadConsole| "" c))
+   (setq input (concat b input)) 
+   (when (|ncloopEscaped| input) 
+     (|intloopReadConsole| (subseq input 0 (- (length input) 1)) n))
+   (setq c (|intloopProcessString| input n)) 
+   (princ (mkprompt)) 
+   (|intloopReadConsole| "" c)))
 
 @
 \section{Helper Functions}
-\subsection{defun reclaim}
-Call the garbage collector on various platforms.
-<<defun reclaim>>=
-#+abcl 
-(defun reclaim () (ext::gc))
-#+:allegro
-(defun reclaim () (excl::gc t))
-#+:CCL
-(defun reclaim () (gc))
-#+clisp
-(defun reclaim () (#+lisp=cl ext::gc #-lisp=cl lisp::gc))
-#+(or :cmulisp :cmu)
-(defun reclaim () (ext:gc))
-#+cormanlisp
-(defun reclaim () (cl::gc))
-#+(OR IBCL KCL GCL)
-(defun reclaim () (si::gbc t))
-#+lispworks 
-(defun reclaim () (hcl::normal-gc))
-#+Lucid
-(defun reclaim () (lcl::gc))
-#+sbcl
-(defun reclaim () (sb-ext::gc))
-@
 \subsection{defun getenviron}
 <<defun getenviron>>=
 (defun getenviron (shellvar)
@@ -1070,6 +1036,7 @@ Call the garbage collector on various platforms.
  #+sbcl (sb-ext:posix-getenv var)
  )
 @
+
 \subsection{defun init-memory-config}
 Austin-Kyoto Common Lisp (AKCL), now known as Gnu Common Lisp (GCL)
 requires some changes to the default memory setup to run Axiom efficently.
@@ -1103,6 +1070,7 @@ This function performs those setup commands.
   nil)
 
 @
+
 \subsection{defun initroot}
 Sets up the system to use the {\bf AXIOM} shell variable if we can
 and default to the {\bf \$spadroot} variable (which was the value
@@ -1112,6 +1080,20 @@ of the {\bf AXIOM} shell variable at build time) if we can't.
   (reroot (or newroot $spadroot (error "setenv AXIOM or (setq $spadroot)"))))
 
 @
+
+\subsection{defun intloopPrefix?}
+If the prefix string is the same as the whole string initial characters
+(ignoring spaces in the whole string) then we return the whole string
+minus any leading spaces.
+<<defun intloopPrefix?>>=
+(defun |intloopPrefix?| (prefix whole)
+ (let ((newprefix (string-left-trim '(#\space) prefix))
+       (newwhole  (string-left-trim '(#\space) whole)))
+  (when (<= (length newprefix) (length newwhole))
+   (when (string= newprefix newwhole :end2 (length prefix))
+    newwhole))))
+
+@
 \subsection{defun loadExposureGroupData}
 <<defun loadExposureGroupData>>=
 #+:AKCL
@@ -1133,6 +1115,7 @@ of the {\bf AXIOM} shell variable at build time) if we can't.
   (t nil) ))
 
 @
+
 \subsection{make-absolute-filename}
 Prefix a filename with the {\bf AXIOM} shell variable.
 <<defun make-absolute-filename>>=
@@ -1140,6 +1123,7 @@ Prefix a filename with the {\bf AXIOM} shell variable.
  (concatenate 'string $spadroot name))
 
 @
+
 \subsection{defun makeInitialModemapFrame}
 \begin{verbatim}
 makeInitialModemapFrame() == COPY $InitialModemapFrame
@@ -1149,6 +1133,45 @@ makeInitialModemapFrame() == COPY $InitialModemapFrame
   (copy |$InitialModemapFrame|)) 
 
 @
+
+\subsection{defun ncloopEscaped}
+The ncloopEscaped function will return true if the last non-blank
+character of a line is an underscore, the Axiom line-continuation
+character. Otherwise, it returns nil.
+<<defun ncloopEscaped>>=
+(defun |ncloopEscaped| (x)
+ (let ((l (length x)))
+  (dotimes (i l)
+   (when (char= (char x (- l i 1)) #\_) (return t))
+   (unless (char= (char x (- l i 1)) #\space) (return nil)))))
+
+@
+
+\subsection{defun reclaim}
+Call the garbage collector on various platforms.
+<<defun reclaim>>=
+#+abcl 
+(defun reclaim () (ext::gc))
+#+:allegro
+(defun reclaim () (excl::gc t))
+#+:CCL
+(defun reclaim () (gc))
+#+clisp
+(defun reclaim () (#+lisp=cl ext::gc #-lisp=cl lisp::gc))
+#+(or :cmulisp :cmu)
+(defun reclaim () (ext:gc))
+#+cormanlisp
+(defun reclaim () (cl::gc))
+#+(OR IBCL KCL GCL)
+(defun reclaim () (si::gbc t))
+#+lispworks 
+(defun reclaim () (hcl::normal-gc))
+#+Lucid
+(defun reclaim () (lcl::gc))
+#+sbcl
+(defun reclaim () (sb-ext::gc))
+@
+
 \subsection{defun reroot}
 The reroot function is used to reset the important variables used by
 the system. In particular, these variables are sensitive to the
@@ -1180,6 +1203,37 @@ where the [[${SYS}]] variable is the same one set at build time.
   (setq $current-directory $spadroot))
 
 @
+
+\subsection{defun setCurrentLine}
+Remember the current line. The cases are:
+\begin{itemize}
+\item If there is no \$currentLine set it to the input
+\item Is the current line a string and the input a string?
+      Make them into a list
+\item Is \$currentLine not a cons cell? Make it one.
+\item Is the input a string? Cons it on the end of the list.
+\item Otherwise stick it on the end of the list
+\end{itemize}
+Note I suspect the last two cases do not occur in practice since
+they result in a dotted pair if the input is not a cons. However,
+this is what the current code does so I won't change it.
+<<defun setCurrentLine>>=
+(defun |setCurrentLine| (s)
+ (cond 
+  ((null |$currentLine|) 
+    (setq |$currentLine| s))
+  ((and (stringp |$currentLine|) (stringp s))
+    (setq |$currentLine| (list |$currentLine| s)))
+  ((not (consp |$currentLine|))
+    (setq |$currentLine| (cons |$currentLine| s)))
+  ((stringp s)
+    (rplacd (last |$currentLine|) (cons s nil)))
+  (t 
+    (rplacd (last |$currentLine|) s)))
+ |$currentLine|)
+
+@
+
 \subsection{defun statisticsInitialization}
 <<defun statisticsInitialization>>=
 (defun |statisticsInitialization| () 
@@ -1188,6 +1242,278 @@ where the [[${SYS}]] variable is the same one set at build time.
  nil)
 
 @
+\chapter{System Command Handling}
+\subsection{defvar \$systemCommands}
+The system commands are the top-level commands available in Axiom
+that can all be invoked by prefixing the symbol with a closed-paren. 
+Thus, to see they copyright you type:
+\begin{verbatim}
+   )copyright
+\end{verbatim}
+New commands need to be added to this table. The command invoked will
+be the first entry of the pair and the ``user level'' of the command
+will be the second entry. 
+<<initvars>>=
+(defvar |$systemCommands| nil)
+
+(eval-when (eval load)
+ (setq |$systemCommands|
+ '(
+   (|abbreviations|		     . |compiler|   )
+   (|boot|			     . |development|)
+   (|browse|                         . |development|)
+   (|cd|			     . |interpreter|)
+   (|clear|			     . |interpreter|)
+   (|close|			     . |interpreter|)
+   (|compiler|			     . |compiler|   )
+   (|copyright|			     . |interpreter|)
+   (|credits|			     . |interpreter|)
+   (|display|			     . |interpreter|)
+   (|edit|			     . |interpreter|)
+   (|fin|			     . |development|)
+   (|frame|			     . |interpreter|)
+   (|help|			     . |interpreter|)
+   (|history|			     . |interpreter|)
+;; (|input|			     . |interpreter|)
+   (|lisp|			     . |development|)
+   (|library|			     . |interpreter|)
+   (|load|			     . |interpreter|)
+   (|ltrace|			     . |interpreter|)
+   (|pquit|			     . |interpreter|)
+   (|quit|			     . |interpreter|)
+   (|read|			     . |interpreter|)
+   (|savesystem|		     . |interpreter|)
+   (|set|			     . |interpreter|)
+   (|show|			     . |interpreter|)
+   (|spool|			     . |interpreter|)
+   (|summary|			     . |interpreter|)
+   (|synonym|			     . |interpreter|)
+   (|system|			     . |interpreter|)
+   (|trace|			     . |interpreter|)
+   (|undo|			     . |interpreter|)
+   (|what|			     . |interpreter|)
+   (|with|			     . |interpreter|)
+   (|workfiles|			     . |development|)
+   (|zsystemdevelopment| . |interpreter|)
+ )))
+
+@
+
+\subsection{defvar \$SYSCOMMANDS}
+This table is used to look up a symbol to see if it might be a command.
+<<initvars>>=
+(defvar $SYSCOMMANDS nil)
+(eval-when (eval load)
+ (setq $SYSCOMMANDS (mapcar #'car |$systemCommands|)))
+
+@
+\subsection{defvar \$noParseCommands}
+This is a list of the commands which have their arguments passed verbatim.
+Certain functions, such as the lisp function need to be able to handle
+all kinds of input that will not be acceptable to the interpreter. 
+<<initvars>>=
+(defvar |$noParseCommands| nil)
+(eval-when (eval load)
+ (setq |$noParseCommands| 
+ '( |boot|
+    |copyright|
+    |credits|
+    |fin|
+    |lisp|
+    |pquit|
+    |quit|
+    |suspend|
+    |synonym|
+    |system|
+    )))
+
+@
+\subsection{defvar \$tokenCommands}
+This is a list of the commands that expect the interpreter to parse
+their arguments. Thus the history command expects that Axiom will have
+tokenized and validated the input before calling the history function.
+<<initvars>>=
+(defvar |$tokenCommands| nil)
+(eval-when (eval load)
+ (setq |$tokenCommands|
+ '( |abbreviations|
+    |cd|
+    |clear|
+    |close|
+    |compiler|
+    |depends|
+    |display|
+    |edit|
+    |frame|
+    |frame|
+    |help|
+    |history|
+    |input|
+    |library|
+    |load|
+    |ltrace|
+    |read|
+    |savesystem|
+    |set|
+    |spool|
+    |undo|
+    |what|
+    |with|
+    |workfiles|
+    |zsystemdevelopment|
+    )))
+
+@
+
+\subsection{defvar \$InitialCommandSynonymAlist}
+Axiom can create ``synonyms'' for commands. We create an initial table
+of synonyms which are in common use.
+<<initvars>>=
+(defvar |$InitialCommandSynonymAlist| nil)
+(eval-when (eval load)
+ (setq |$InitialCommandSynonymAlist|
+   '(
+       (|?|	     . "what commands")
+       (|ap|	     . "what things")
+       (|apr|	     . "what things")
+       (|apropos|    . "what things")
+       (|cache|	     . "set functions cache")
+       (|cl|	     . "clear")
+       (|cls|	     . "zsystemdevelopment )cls")
+       (|cms|	     . "system")
+       (|co|	     . "compiler")
+       (|d|	     . "display")
+       (|dep|	     . "display dependents")
+       (|dependents| . "display dependents")
+       (|e|	     . "edit")
+       (|expose|     . "set expose add constructor")
+       (|fc|	     . "zsystemdevelopment )c")
+       (|fd|	     . "zsystemdevelopment )d")
+       (|fdt|	     . "zsystemdevelopment )dt")
+       (|fct|	     . "zsystemdevelopment )ct")
+       (|fctl|	     . "zsystemdevelopment )ctl")
+       (|fe|	     . "zsystemdevelopment )e")
+       (|fec|	     . "zsystemdevelopment )ec")
+       (|fect|	     . "zsystemdevelopment )ect")
+       (|fns|	     . "exec spadfn")
+       (|fortran|    . "set output fortran")
+       (|h|	     . "help")
+       (|hd|	     . "system hypertex &")
+       (|kclam|	     . "boot clearClams ( )")
+       (|killcaches| . "boot clearConstructorAndLisplibCaches ( )")
+       (|patch|	     . "zsystemdevelopment )patch")
+       (|pause|	     . "zsystemdevelopment )pause")
+       (|prompt|     . "set message prompt")
+       (|recurrence| . "set functions recurrence")
+       (|restore|    . "history )restore")
+       (|save|	     . "history )save")
+       (|startGraphics|    .  "system $AXIOM/lib/viewman &")
+       (|startNAGLink|     .  "system $AXIOM/lib/nagman &")
+       (|stopGraphics|     .  "lisp (|sockSendSignal| 2 15)")
+       (|stopNAGLink|      .  "lisp (|sockSendSignal| 8 15)")
+       (|time|	     . "set message time")
+       (|type|	     . "set message type")
+       (|unexpose|   . "set expose drop constructor")
+       (|up|	     . "zsystemdevelopment )update")
+       (|version|    . "lisp *yearweek*")
+       (|w|	     . "what")
+       (|wc|	     . "what categories")
+       (|wd|	     . "what domains")
+       (|who|        . "lisp (pprint credits)")
+       (|wp|	     . "what packages")
+       (|ws|	     . "what synonyms")
+)))
+
+@
+\subsection{defvar \$CommandSynonymAlist}
+The actual list of synonyms is initialized to be the same as the 
+above initial list of synonyms. The user synonyms that are added
+during a session are pushed onto this list for later lookup.
+<<initvars>>=
+(defvar |$CommandSynonymAlist| nil)
+(eval-when (eval load)
+ (setq |$CommandSynonymAlist| (copy-alist |$InitialCommandSynonymAlist|)))
+
+@
+
+\subsection{defun ncloopCommand}
+The \$systemCommandFunction is set in SpadInterpretStream
+to point to the function InterpExecuteSpadSystemCommand.
+<<defun ncloopCommand>>=
+(defun |ncloopCommand| (line n)
+ (declare (special |$systemCommandFunction|))
+ (let (a)
+  (cond
+   ((setq a (|ncloopPrefix?| ")include" line))
+     (|ncloopInclude1| a n))
+   (t
+     (funcall |$systemCommandFunction| line)
+     n))))
+
+@
+\subsection{defun ncloopPrefix?}
+If we find the prefix string in the whole string starting at position zero
+we return the remainder of the string without the leading prefix.
+<<defun ncloopPrefix?>>=
+(defun |ncloopPrefix?| (prefix whole)
+ (when (eql (search prefix whole) 0)
+  (subseq whole (length prefix))))
+
+@
+\subsection{defun ncloopInclude1}
+<<defun ncloopInclude1>>=
+(defun |ncloopInclude1| (name n)
+ (let (a)
+  (if (setq a (|ncloopIncFileName| name))
+    (|ncloopInclude| a n)
+    n)))
+
+@
+\subsection{defun ncloopIncFileName}
+Returns the first non-blank substring of the given string.
+<<defun ncloopIncFileName>>=
+(defun |ncloopIncFileName| (string)
+ (let (fn)
+  (unless (setq fn (|incFileName| string))
+   (write-line (concat string " not found")))
+ fn))
+
+@
+
+\subsection{defun ncloopInclude}
+Open the file and read it in. The ncloopInclude0 function is part
+of the parser and lives in int-top.boot.
+<<defun ncloopInclude>>=
+(defun |ncloopInclude| (name n)
+  (with-open-file (st name) (|ncloopInclude0| st name n)))
+
+@
+
+\subsection{defun incFileName}
+Given a string we return the first token from the string which is
+the first non-blank substring.
+<<defun incFileName>>=
+(defun |incFileName| (x)
+  (car (|incBiteOff| x)))
+
+@
+
+\subsection{defun incBiteOff}
+Takes a sequence and returns the a list of the first token and the
+remaining string characters. If there are no remaining string characters
+the second string is of length 0. Effectively it "bites off" the first 
+token in the string. If the string only 0 or more blanks it returns nil.
+<<defun incBiteOff>>=
+(defun |incBiteOff| (x)
+ (let (blank nonblank)
+  (setq x (string x))
+  (when (setq nonblank (position #\space x :test-not #'char=))
+    (setq blank (position #\space x :start nonblank))
+    (if blank
+     (list (subseq x nonblank blank) (subseq x blank))
+     (list (subseq x nonblank) "")))))
+
+@
 \chapter{The History Mechanism}
 \section{)history}
 \index{ugSysCmdhistory}
@@ -1403,13 +1729,6 @@ into a call of [[fetchOutput(n)]]. The
   and [[$HistRecord]]
  
 \subsection{Initialized history variables}
-\begin{verbatim}
-SETANDFILEQ($historyFileType,'axh)
-SETANDFILEQ($oldHistoryFileName,'last)
-SETANDFILEQ($internalHistoryTable,NIL)
-SETANDFILEQ($useInternalHistoryTable,NIL)
-\end{verbatim}
- 
 <<initvars>>=
 (defvar |$oldHistoryFileName| '|last| "vm/370 filename name component")
 (defvar |$historyFileType| '|axh|     "vm/370 filename type component")
@@ -5342,6 +5661,204 @@ removeUndoLines u == --called by writeInputLines
 
 @
 
+\chapter{The Help Browser Mechanism}
+The Axiom book on the help browser is a complete rewrite of the 
+hyperdoc mechanism. There are several components that were needed
+to make this function. Most of the web browser components are
+described in bookvol11.pamphlet. This portion describes some of
+the design issues needed to support the interface.
+
+The axServer command takes a port (defaulting to 8085) and a
+program to handle the browser interaction (defaulting to multiServ).
+The axServer function opens the port, constructs the stream, and
+passes the stream to multiServ. The multiServ loop processes one
+interaction at a time.
+
+So the basic process is that the Axiom ``)browse'' command opens a
+socket and listens for http requests. Based on the type of request
+(either 'GET' or 'POST') and the content of the request, which is
+one of:
+\begin{itemize}
+\item command - algebra request/response
+\item lispcall - a lisp s-expression to be evaluated
+\item showcall - an Axiom )show command
+\end{itemize}
+the multiServ function will call a handler function to evaluate
+the command line and construct a response. GET requests result
+in a new browser page. POST requests result in an inline result.
+
+Most responses contain the fields:
+\begin{itemize}
+\item stepnum - this is the Axiom step number 
+\item command - this is the original command from the browser
+\item algebra - this is the Axiom 2D algebra output
+\item mathml - this is the MathML version of the Axiom algebra
+\item type - this is the type of the Axiom result
+\end{itemize}
+
+\section{Browsers, MathML, and Fonts}
+This work has the Firefox browser as its target. Firefox has built-in
+support for MathML, javascript, and XMLHttpRequest handling. More details
+are available in bookvol11.pamphlet but the very basic machinery for 
+communication with the browser involves a dance between the browser
+and the multiServ function (see the axserver.spad.pamphlet). 
+
+In particular, a simple request is embedded in a web page as:
+\begin{verbatim}
+<ul>
+ <li>
+  <input type="submit" id="p3" class="subbut" 
+    onclick="makeRequest('p3');"
+    value="sin(x)" />
+  <div id="ansp3"><div></div></div>
+ </li>
+</ul>
+\end{verbatim}
+which says that this is an html ``input'' field of type ``submit''.
+The CSS display class is ``subbut'' which is of a different color
+than the surrounding text to make it obvious that you can click on
+this field. Clickable fields that have no response text are of class
+``noresult''.
+
+The javascript call to ``makeRequest'' gives the ``id'' of this input
+field, which must be unique in the page, as an argument. In this case,
+the argument is 'p3'. The ``value'' field holds the display text which
+will be passed back to Axiom as a command.
+
+When the result arrives the ``showanswer'' function will select out
+the mathml field of the response, construct the ``id'' of the html
+div to hold the response by concatenating the string ``ans'' (answer)
+to the ``id'' of the request resulting, in this case, as ``ansp3''.
+The ``showanswer'' function will find this div and replace it with a
+div containing the mathml result.
+
+The ``makeRequest'' function is:
+\begin{verbatim}
+ function makeRequest(arg) {
+   http_request = new XMLHttpRequest();         
+   var command = commandline(arg);
+   //alert(command);
+   http_request.open('POST', '127.0.0.1:8085', true);
+   http_request.onreadystatechange = handleResponse;
+   http_request.setRequestHeader('Content-Type', 'text/plain');
+   http_request.send("command="+command);
+   return(false);
+\end{verbatim}
+It contains a request to open a local server connection to Axiom,
+sets ``handleResponse'' as the function to call on reply, sets up
+the type of request, fills in the command field, and sends off the
+http request.
+
+When a response is received, the ``handleResponse'' function checks
+for the correct reply state, strips out the important text, and
+calls ``showanswer''.
+\begin{verbatim}
+ function handleResponse() {
+  if (http_request.readyState == 4) {
+   if (http_request.status == 200) {
+    showanswer(http_request.responseText,'mathAns');
+   } else
+   {
+     alert('There was a problem with the request.'+ http_request.statusText);
+   }
+  }
+ }
+\end{verbatim}
+See bookvol11.pamphlet for further details.
+
+\section{The axServer/multiServ loop}
+The basic call to start an Axiom browser listener is:
+\begin{verbatim}
+  )set message autoload off
+  )set output mathml on
+  axServer(8085,multiServ)$AXSERV
+\end{verbatim}
+
+This call sets the port, opens a socket, attaches it to a stream,
+and then calls ``multiServ'' with that stream. The ``multiServ''
+function loops serving web responses to that port.
+
+\section{The )browse command}
+In order to make the whole process cleaner the function ``)browse''
+handles the details. This code creates the command-line function for )browse
+
+The browse function does the internal equivalent of the following 3 command
+line statments:
+\begin{verbatim}
+  )set message autoload off
+  )set output mathml on
+  axServer(8085,multiServ)$AXSERV
+\end{verbatim}
+which causes Axiom to start serving web pages on port 8085
+
+For those unfamiliar with calling algebra from lisp there are a 
+few points to mention. 
+
+The loadLib needs to be called to load the algebra code into the image.
+Normally this is automatic but we are not using the interpreter so
+we need to do this ``by hand''.
+
+Each algebra file contains a "constructor function" which builds the
+domain, which is a vector, and then caches the vector so that every
+call to the contructor returns an EQ vector, that is, the same vector.
+In this case, we call the constructor $\vert$AxiomServer$\vert$
+
+The axServer function was mangled internally to 
+$\vert$AXSERV;axServer;IMV;2$\vert$.
+The multiServ function was mangled to $\vert$AXSERV;multiServ;SeV;3$\vert$
+Note well that if you change axserver.spad these names might change
+which will generate the error message along the lines of:
+\begin{verbatim}
+    System error:
+    The function $\vert$AXSERV;axServer;IMV;2$\vert$ is undefined.
+\end{verbatim}
+
+To fix this you need to look at int/algebra/AXSERV.nrlib/code.lsp
+and find the new mangled function name. A better solution would
+be to dynamically look up the surface names in the domain vector.
+
+Each Axiom function expects the domain vector as the last argument.
+This is not obvious from the call as the interpreter supplies it.
+We must do that ``by hand''.
+
+We don't call the multiServ function. We pass it as a parameter to
+the axServer function. When it does get called by the SPADCALL
+macro it needs to be a lisp pair whose car is the function and
+whose cdr is the domain vector. We construct that pair here as
+the second argument to axServer. The third, hidden, argument to
+axServer is the domain vector which we supply ``by hand''.
+
+The socket can be supplied on the command line but defaults to 8085.
+Axiom supplies the arguments as a list.
+<<defun browse>>=
+(defun |browse| (socket)
+ (let (axserv browser)
+  (if socket 
+    (setq socket (car socket))
+    (setq socket 8085))
+  (|set| '(|mes| |auto| |off|))
+  (|set| '(|out| |mathml| |on|))
+  (|loadLib| '|AxiomServer|)
+  (setq axserv (|AxiomServer|))
+  (setq browser 
+   (|AXSERV;axServer;IMV;2| socket
+    (cons #'|AXSERV;multiServ;SeV;3| axserv) axserv))))
+
+@
+Now we have to bolt it into Axiom. This involves two lookups.
+
+We create the lisp pair 
+\begin{verbatim}
+(|browse| . |development|)
+\end{verbatim} 
+and cons it into the \$systemCommands command table.  This allows the
+command to be executed in development mode.  This lookup decides if
+this command is allowed. It also has the side-effect of putting the
+command into the \$SYSCOMMANDS variable which is used to determine
+if the token is a command.
+
+\section{The server support code}
+
 \chapter{Axiom Build-time Functions}
 \subsection{defun spad-save}
 The {\bf spad-save} function is just a cover function for more
@@ -5420,6 +5937,8 @@ DEBUGSYS=${OBJ}/${SYS}/bin/debugsys
 
 <<defun addNewInterpreterFrame>>
 
+<<defun browse>>
+
 <<defun changeHistListLen>>
 <<defun changeToNamedInterpreterFrame>>
 <<defun charDigitVal>>
@@ -5453,6 +5972,8 @@ DEBUGSYS=${OBJ}/${SYS}/bin/debugsys
 <<defun histInputFileName>>
 <<defun historySpad2Cmd>>
 
+<<defun incBiteOff>>
+<<defun incFileName>>
 <<defun importFromFrame>>
 <<defun init-memory-config>>
 <<defun initHist>>
@@ -5460,6 +5981,7 @@ DEBUGSYS=${OBJ}/${SYS}/bin/debugsys
 <<defun initializeInterpreterFrameRing>>
 <<defun initroot>>
 <<defun intloop>>
+<<defun intloopPrefix?>>
 <<defun intloopReadConsole>>
 
 <<defun loadExposureGroupData>>
@@ -5469,6 +5991,12 @@ DEBUGSYS=${OBJ}/${SYS}/bin/debugsys
 <<defun makeInitialModemapFrame>>
 
 <<defun ncIntLoop>>
+<<defun ncloopCommand>>
+<<defun ncloopEscaped>>
+<<defun ncloopInclude>>
+<<defun ncloopInclude1>>
+<<defun ncloopIncFileName>>
+<<defun ncloopPrefix?>>
 <<defun ncTopLevel>>
 <<defun nextInterpreterFrame>>
 
@@ -5495,6 +6023,7 @@ DEBUGSYS=${OBJ}/${SYS}/bin/debugsys
 <<defun safeWritify>>
 <<defun saveHistory>>
 <<defun ScanOrPairVec>>
+<<defun setCurrentLine>>
 <<defun setHistoryCore>>
 <<defun set-restart-hook>>
 <<defun showInOut>>
diff --git a/src/interp/bootfuns.lisp.pamphlet b/src/interp/bootfuns.lisp.pamphlet
index 55f2022..6b57dfe 100644
--- a/src/interp/bootfuns.lisp.pamphlet
+++ b/src/interp/bootfuns.lisp.pamphlet
@@ -392,7 +392,7 @@ for primitive domains.	Also used by putInLocalDomainReferences and optCal.")
 (def-boot-var |$suffix|				    "???")
 (def-boot-val |$Symbol| '(|Symbol|)		    "???")
 (def-boot-val |$SymbolOpt| '(|Symbol| . OPT)	    "???")
-(def-boot-var |$systemCommands|			    "Interpreter>System.boot")
+;(def-boot-var |$systemCommands|			    "Interpreter>System.boot")
 (def-boot-val |$systemCreation| (currenttime)	    "???")
 (def-boot-val |$systemLastChanged|
 	  |$systemCreation|			"???")
diff --git a/src/interp/i-syscmd.boot.pamphlet b/src/interp/i-syscmd.boot.pamphlet
index 3f3e57b..0cac608 100644
--- a/src/interp/i-syscmd.boot.pamphlet
+++ b/src/interp/i-syscmd.boot.pamphlet
@@ -130,9 +130,6 @@ SETANDFILEQ($compileRecurrence,true)
 SETANDFILEQ($errorReportLevel,'warning)
 SETANDFILEQ($sourceFileTypes,'(INPUT SPAD BOOT LISP LISP370 META))
 
-SETANDFILEQ($SYSCOMMANDS,[CAR x for x in $systemCommands])
-
-
 SETANDFILEQ($whatOptions, '( _
     operations _
     categories _
diff --git a/src/interp/incl.boot.pamphlet b/src/interp/incl.boot.pamphlet
index 4e0d0c7..2f82cee 100644
--- a/src/interp/incl.boot.pamphlet
+++ b/src/interp/incl.boot.pamphlet
@@ -122,16 +122,6 @@ incDrop(n, b) ==
  
 inclFname(s, info) == incFileName incCommandTail(s, info)
  
-incBiteOff x ==
-          n:=STRPOSL('" ",x,0,true)-- first nonspace
-          if null n
-          then false -- all spaces
-          else
-             n1:=STRPOSL ('" ",x,n,nil)
-             if null n1 -- all nonspaces
-             then [SUBSTRING(x,n,nil),'""]
-             else [SUBSTRING(x,n,n1-n),SUBSTRING(x,n1,nil)]
- 
 incTrunc (n,x)==
      if #x>n
      then SUBSTRING(x,0,n)
diff --git a/src/interp/int-top.boot.pamphlet b/src/interp/int-top.boot.pamphlet
index 2b87d38..59986a4 100644
--- a/src/interp/int-top.boot.pamphlet
+++ b/src/interp/int-top.boot.pamphlet
@@ -9,112 +9,6 @@
 \eject
 \tableofcontents
 \eject
-\section{intloopReadConsole}
-
-This is the top level loop when reading from the input console.  This
-function calls itself after processing the current line.  Because of
-this it is important that the underlying common lisp supports
-tail-recursion.
-
-Normally we never really exit this function.
-
-We read a string from the input. The serverReadLine\cite{1} function
-is a special readline function that handles communication with the 
-session manager code, which is a separate process running in parallel.
-In the usual case it just returns the current string.
-
-If the user enters a blank line ([[#a=]]) then just put up another prompt
-and then tail-recursively call [[intloopReadConsole]].
-
-If the user has set [[$DALYMODE]] to true and the new line starts with
-an open parenthesis then the input is assumed to be a lisp expression
-and is evaluated by the underlying common lisp. This is useful if you
-are doing a lot of debugging. Commands can also be executed in the
-underlying common lisp by using the [[)lisp]] command. In either case we
-tail-recursively call [[intloopReadConsole]].
-
-If the user typed [[)fin]] then we exit the loop and drop into the
-underlying common lisp. You can use the [[(restart)]] function call
-to return to the top level loop.
-
-If the input line starts with a close parenthesis we parse the 
-input line as a command rather than an expression. We execute the command
-and then tail-recursively call [[intloopReadConsole]].
-
-If the input line contains a trailing underscore, which is the standard
-end-of-line escape character, then we continue to read the line by
-tail-recursively calling [[intloopReadConsole]].
-
-If none of the above conditions occur we simply evaluate the input line
-and then tail-recursively call [[intloopReadConsole]].
-
-However, there was a small bug in the test for the system command
-[[)fin]]. Originally, the test took the form:
-\begin{verbatim}
-   intloopPrefix?('")fin",a) => []
-\end{verbatim}
-This test was flawed in two ways. First, it would match {\sl any}
-command beginning with [[)fin]]. Second, it would {\sl only} match
-names beginning with [[)fin]], although [[)fi]] is an acceptable
-abbreviation for this command. The improved test takes the form:
-\begin{verbatim}
-    pfx := stripSpaces intloopPrefix?('")fi",a)
-    pfx and ((pfx = '")fi") or (pfx = '")fin")) => []
-\end{verbatim}
-
-\section{intloopPrefix?}
-The [[intloopPrefix?(prefix, whole)]] function simply tests if the string
-[[prefix]] is a prefix of the string [[whole]]. The original
-implementation discounts {\sl any} whitespace in [[whole]] in deciding a
-match, when a more sensible behavior would be to discount only leading
-whitespace.
-
-Moreover, the function SUBSTRING\cite{2} was being improperly called.
-The reason why this improper call had gone undetected is that
-generally [[intloopPrefix?]] is invoked with a prefix string of length
-one -- hence the start position for the substring would generally
-begin at index [[spaces]] (which is what we want).
-
-The original code read:
-\begin{verbatim}
-intloopPrefix?(prefix,whole) ==
-     #prefix > #whole => false
-     good:=true
-     spaces := 0
-     i := 0
-     len := #prefix
-     wlen := #whole
-     for j in 0.. while (good and i < len and j < wlen) repeat
-       good:= (prefix.i = whole.j) or (whole.j = char " ")
-       if prefix.i = whole.j then i := i+1
-       if whole.j = char " " then spaces := spaces + 1
-     spaces = wlen => nil
-     if good then SUBSTRING(whole,#prefix+spaces-1,nil) else good
-
-\end{verbatim}
-
-The improved version of [[inloopPrefix?(prefix, whole)]] returns the
-string [[whole]] sans leading whitespace if the match succeeds, else nil.
-
-<<intloopPrefix?>>=
-intloopPrefix?(prefix,whole) ==
-     #prefix > #whole => false
-     good := true
-     leading := true
-     spaces := 0
-     i := 0
-     len := #prefix
-     wlen := #whole
-     for j in 0.. while (good and i < len and j < wlen) repeat
-       good := (prefix.i = whole.j) or (leading and (whole.j = char " "))
-       if prefix.i = whole.j then i := i+1
-       if (whole.j = char " ") and leading then 
-         spaces := spaces + 1
-       else leading := false
-     spaces = wlen => nil
-     if good then SUBSTRING(whole,spaces,nil) else good
-
-@
 \section{License}
 <<license>>=
 -- Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
@@ -156,8 +50,6 @@ intloopPrefix?(prefix,whole) ==
 
 --% INTERPRETER TOP LEVEL
  
-<<intloopPrefix?>> 
- 
 intloopProcess(n,interactive,s)==
      StreamNull s => n
      [lines,ptree]:=CAR s
@@ -253,24 +145,6 @@ nonBlank str ==
       return value
   value
       
-ncloopCommand (line,n) ==
-         a:=ncloopPrefix?('")include",line)=>
-                  ncloopInclude1( a,n)
-         FUNCALL($systemCommandFunction,line)
-         n
-
-ncloopEscaped x==
-     esc :=false
-     done:=false
-     for i in (# x) - 1 .. 0 by -1 while not done repeat
-         done:=
-              x.i='" ".0 =>false
-              x.i='"__".0=>
-                       esc:=true
-                       true
-              true
-     esc
-
 ncloopDQlines (dq,stream)==
         StreamNull stream
         a:= poGlobalLinePosn tokPosn CADR dq
@@ -293,13 +167,6 @@ ncloopPrintLines lines ==
         for line in lines repeat WRITE_-LINE CDR line
         WRITE_-LINE '" "
  
-ncloopIncFileName string==
-                fn := incFileName string
-                not fn =>
-                    WRITE_-LINE (CONCAT(string, '" not found"))
-                    []
-                fn
-
 ncloopParse s==
          [dq,stream]:=CAR s
          [lines,rest]:=ncloopDQlines(dq,stream)
@@ -312,11 +179,6 @@ ncloopInclude0(st, name, n) ==
            next(function insertpile,
             next(function lineoftoks,$lines))))
  
-ncloopInclude1(name,n) ==
-          a:=ncloopIncFileName name
-          a => ncloopInclude(a,n)
-          n
-
 incString s== incRenumber incLude(0,[s],0,['"strings"] ,[Top])
 
 ncError() ==
@@ -373,13 +235,6 @@ ncConversationPhase(fn, args) ==
             for m in $ncMsgList repeat
                 ncPutQ(carrier, 'messages, [m, :ncEltQ(carrier, 'messages)])
  
-ncloopPrefix?(prefix,whole) ==
-     #prefix > #whole => false
-     good:=true
-     for i in 0..#prefix-1 for j in 0.. while good repeat
-                good:= prefix.i = whole.j
-     if good then SUBSTRING(whole,#prefix,nil) else good
- 
 phBegin id ==
     $convPhase := id
     if $ncmPhase then intSayKeyedMsg('S2CTP021,[id])
diff --git a/src/interp/intint.lisp.pamphlet b/src/interp/intint.lisp.pamphlet
index d132ad8..a4e29f5 100644
--- a/src/interp/intint.lisp.pamphlet
+++ b/src/interp/intint.lisp.pamphlet
@@ -93,10 +93,6 @@
 ;;(defun |intPackageTran| (sex)
 ;;  (|packageTran| sex))
 
-;;--------------------> NEW DEFINITION (override in i-syscmd.boot.pamphlet)
-(defun |stripSpaces| (str)
-  (string-trim '(#\Space) str))
-
 ;;(defvar |$SessionManager| |$SessionManager|)
 ;;(defvar |$EndOfOutput| |$EndOfOutput|)
 
@@ -128,16 +124,6 @@
 ;;(defun |setCurrentLine| (s)
 ;;  (setq |$currentLine| s))
 
-(defun |setCurrentLine| (s)
-  (setq |$currentLine|
-	(cond ((null |$currentLine|) s)
-	      ((stringp |$currentLine|)
-	       (cons |$currentLine|
-			 (if (stringp s) (cons s nil) s)))
-	      (t (rplacd (last |$currentLine|)
-			 (if (stringp s) (cons s nil) s))
-		 |$currentLine|))))
-
 (defun |intnplisp| (s)
  (setq |$currentLine| s)
  (|nplisp| |$currentLine|))
diff --git a/src/interp/nci.lisp.pamphlet b/src/interp/nci.lisp.pamphlet
index 51917f5..d6bca72 100644
--- a/src/interp/nci.lisp.pamphlet
+++ b/src/interp/nci.lisp.pamphlet
@@ -96,9 +96,6 @@
   (with-open-file (st name)
 		  (|intloopInclude0| st name n)))
 
-(defun |ncloopInclude| (name n)
-  (with-open-file (st name)
-		  (|ncloopInclude0| st name n)))
 @
 \eject
 \begin{thebibliography}{99}
diff --git a/src/interp/setq.lisp.pamphlet b/src/interp/setq.lisp.pamphlet
index 25155d8..c0aa0a8 100644
--- a/src/interp/setq.lisp.pamphlet
+++ b/src/interp/setq.lisp.pamphlet
@@ -188,88 +188,6 @@
 (setq *print-pretty* nil)
 (setq *print-circle* nil)
 
-;; $SYSCOMMANDS is now defined at the top of i-syscmd.boot
-
-(SETQ |$systemCommands| '(
-;;  COMMAND		 USER LEVEL   - )set userlevel
-   (|abbreviations|		     . |compiler|   )
-   (|boot|			     . |development|)
-   (|cd|			     . |interpreter|)
-   (|clear|			     . |interpreter|)
-   (|close|			     . |interpreter|)
-   (|compiler|			     . |compiler|   )
-   (|copyright|			     . |interpreter|)
-   (|credits|			     . |interpreter|)
-   (|display|			     . |interpreter|)
-   (|edit|			     . |interpreter|)
-   (|fin|			     . |development|)
-   (|frame|			     . |interpreter|)
-   (|help|			     . |interpreter|)
-   (|history|			     . |interpreter|)
-;; (|input|			     . |interpreter|)
-   (|lisp|			     . |development|)
-   (|library|			     . |interpreter|)
-   (|load|			     . |interpreter|)
-   (|ltrace|			     . |interpreter|)
-   (|pquit|			     . |interpreter|)
-   (|quit|			     . |interpreter|)
-   (|read|			     . |interpreter|)
-   (|savesystem|		     . |interpreter|)
-   (|set|			     . |interpreter|)
-   (|show|			     . |interpreter|)
-   (|spool|			     . |interpreter|)
-   (|summary|			     . |interpreter|)
-   (|synonym|			     . |interpreter|)
-   (|system|			     . |interpreter|)
-   (|trace|			     . |interpreter|)
-   (|undo|			     . |interpreter|)
-   (|what|			     . |interpreter|)
-   (|with|			     . |interpreter|)
-   (|workfiles|			     . |development|)
-   (|zsystemdevelopment| . |interpreter|)
- ))
-
-(SETQ |$noParseCommands| '(
-    |boot|
-    |copyright|
-    |credits|
-    |fin|
-    |lisp|
-    |pquit|
-    |quit|
-    |suspend|
-    |synonym|
-    |system|
-    ))
-
-(SETQ |$tokenCommands| '(
-    |abbreviations|
-    |cd|
-    |clear|
-    |close|
-    |compiler|
-    |depends|
-    |display|
-    |edit|
-    |frame|
-    |frame|
-    |help|
-    |history|
-    |input|
-    |library|
-    |load|
-    |ltrace|
-    |read|
-    |savesystem|
-    |set|
-    |spool|
-    |undo|
-    |what|
-    |with|
-    |workfiles|
-    |zsystemdevelopment|
-    ))
-
 (SETQ |S:SPADTOK| 'SPADSYSTOK)
 (SETQ APLMODE NIL)
 (SETQ RLGENSYMFG NIL)
@@ -325,60 +243,6 @@
 (SETQ |$spadSystemDisks|  '(I J K L))
 (SETQ |$functorForm| NIL)
 
-(SETQ |$InitialCommandSynonymAlist| '(
-       (|?|	     . "what commands")
-       (|ap|	     . "what things")
-       (|apr|	     . "what things")
-       (|apropos|    . "what things")
-       (|cache|	     . "set functions cache")
-       (|cl|	     . "clear")
-       (|cls|	     . "zsystemdevelopment )cls")
-       (|cms|	     . "system")
-       (|co|	     . "compiler")
-       (|d|	     . "display")
-       (|dep|	     . "display dependents")
-       (|dependents| . "display dependents")
-       (|e|	     . "edit")
-       (|expose|     . "set expose add constructor")
-       (|fc|	     . "zsystemdevelopment )c")
-       (|fd|	     . "zsystemdevelopment )d")
-       (|fdt|	     . "zsystemdevelopment )dt")
-       (|fct|	     . "zsystemdevelopment )ct")
-       (|fctl|	     . "zsystemdevelopment )ctl")
-       (|fe|	     . "zsystemdevelopment )e")
-       (|fec|	     . "zsystemdevelopment )ec")
-       (|fect|	     . "zsystemdevelopment )ect")
-       (|fns|	     . "exec spadfn")
-       (|fortran|    . "set output fortran")
-       (|h|	     . "help")
-       (|hd|	     . "system hypertex &")
-       (|kclam|	     . "boot clearClams ( )")
-       (|killcaches| . "boot clearConstructorAndLisplibCaches ( )")
-       (|patch|	     . "zsystemdevelopment )patch")
-       (|pause|	     . "zsystemdevelopment )pause")
-       (|prompt|     . "set message prompt")
-       (|recurrence| . "set functions recurrence")
-       (|restore|    . "history )restore")
-       (|save|	     . "history )save")
-       (|startGraphics|    .  "system $AXIOM/lib/viewman &")
-       (|startNAGLink|     .  "system $AXIOM/lib/nagman &")
-       (|stopGraphics|     .  "lisp (|sockSendSignal| 2 15)")
-       (|stopNAGLink|      .  "lisp (|sockSendSignal| 8 15)")
-       (|time|	     . "set message time")
-       (|type|	     . "set message type")
-       (|unexpose|   . "set expose drop constructor")
-       (|up|	     . "zsystemdevelopment )update")
-       (|version|    . "lisp *yearweek*")
-       (|w|	     . "what")
-       (|wc|	     . "what categories")
-       (|wd|	     . "what domains")
-       (|who|        . "lisp (pprint credits)")
-       (|wp|	     . "what packages")
-       (|ws|	     . "what synonyms")
-))
-
-(SETQ |$CommandSynonymAlist| (COPY |$InitialCommandSynonymAlist|))
-
 (SETQ |$spadLibFT| 'LISPLIB)
 
 (SETQ |$existingFiles| (MAKE-HASHTABLE 'UEQUAL))
