home *** CD-ROM | disk | FTP | other *** search
/ HomeWare 14 / HOMEWARE14.bin / educate / algtut.arj / PFSA.DOC next >
Text File  |  1985-10-03  |  26KB  |  667 lines

  1.                                TABLE OF CONTENTS
  2.  
  3.  
  4.  
  5.     I    Introduction                   2
  6.  
  7.     II   Usage                          2
  8.  
  9.     III  Examples                       4
  10.  
  11.          A  Basic Commands              4
  12.  
  13.          B  Procedures                  4
  14.  
  15.          C  Canonical Transformation    5
  16.  
  17.          D  Binomial Expansion          6
  18.  
  19.          E  Inversion of Series         6
  20.  
  21.     IV   Commands                       9
  22.  
  23.     V    Error Messages                13
  24.  
  25.     VI   Technical Details             14
  26.  
  27.                                       -2-
  28.  
  29.     I.  INTRODUCTION
  30.  
  31.          The PFSA program was created to do some rather large but simple
  32.     algebraic computations.  PFSA does not have the large variety of
  33.     commands which more general purpose symbolic algebra programs (muMath
  34.     and Macsyma) have but it is faster and can work with bigger
  35.     expressions.  PfSA ran 90 times faster than Macsyma on a very large
  36.     Hamiltonian canonical transformation project, and it runs more than 200
  37.     times faster than muMath when doing example E.  PFSA is written in
  38.     Fortran and the arithmetic involving coefficients of terms is done with
  39.     the Fortran arithmetic.  Two versions are provided, one which uses only
  40.     rational integer*4 arithmetic (PFSAI.EXE) and another (PFSAF.EXE) which
  41.     uses real*8 arithmetic during calculation of coefficients.
  42.  
  43.          The EXE versions on this PC Blue disk need 300K to run.  The
  44.     program can be compiled with different values for parameters (in
  45.     dimension statements) to get a smaller executable file or to get
  46.     capability to handle bigger expressions.  If you find a bug and want to
  47.     report it to the author, put a minimal example "algin" file on a floppy
  48.     and send it to: Don Stevens, 4 Wash. Sq. Village, NY NY 10012.  If you
  49.     want the floppy returned please include a stamped return envelope.
  50.     Revised versions may be available in the future.
  51.  
  52.          The author of PFSA tried to make the usage of PFSA simple.  PFSA
  53.     reads a file "algin", processes the commands therein, and produces a
  54.     file "algout".  The commands in the algin file are mostly close enough
  55.     to ordinary English so that the algebra to be performed is clear even
  56.     to an inexperienced reader.  PFSA commands allow one to do standard
  57.     operations on polynomial expressions (addition, subtraction,
  58.     multiplication, selection of portions of expressions, substitutions,
  59.     differentiation).  Binomial expansions may be generated with
  60.     non-integer exponents.  Numerical evaluation may be done by doing
  61.     substitutions.  Procedures may be defined.  The commands are listed and
  62.     described in Section IV.  Section III is intended to be a tutorial for
  63.     new users of PFSA.  Section V is a listing of some error messages and
  64.     their meaning.  Section VI contains technical details of little
  65.     interest to most users.
  66.                                       -3-
  67.  
  68.     II.  USAGE
  69.  
  70.          The user prepares a file "algin" which contains commands that
  71.     specify the task to be done by PFSA.  The first command should be the
  72.     "order" command and the last command is the "end input" command.  The
  73.     commands of PFSA have been chosen so that the algin file will be
  74.     approximately a description of the problem in English.  A comment line
  75.     may be inserted by beginning the line with ";" or "*", or a comment may
  76.     be included on a command line after the command by beginning the
  77.     comment with a ";".  The user runs PFSA, which produces an output file
  78.     "algout".  The user can control the amount of output which PFSA
  79.     produces during a run by specifying a parameter (named "np").  If np=0
  80.     only error messages are produced.  After np=1 output from "print" and
  81.     "fortran" commands is produced.  After np=2 the commands are listed as
  82.     they are encountered.  After np=3 time and memory usage information is
  83.     printed after each command is done.
  84.  
  85.          There are three types of objects in PFSA: variables, sums, and
  86.     labels.  A product of variables with a coefficient is called a term,
  87.     and a sum of terms (perhaps only one) is called a sum.  Locations may
  88.     be designated by using the "label" command, and can be referred to by
  89.     the "goto" command.  The names of variables, sums, and labels should
  90.     begin with a letter and should not contain any of the following
  91.     characters: ; + - * / = .  Upper case and lower case are distinguished.
  92.     The default maximum length of names is 15 characters.  It is
  93.     recommended that no names begin with "flu", "lab", or "pro", see the
  94.     discussion at the start of Section IV.
  95.  
  96.          The first command in an algin file should be "order", for example:
  97.     order var1 var2 var3.  This command can be used only once per run.  The
  98.     effects of the above command are:
  99.     1.  In all terms printed, var1 would precede var2, which would precede
  100.         var3.
  101.     2.  All sums printed will be ordered first on the exponent of var1
  102.         (smaller exponents precede larger exponents), then on the exponent
  103.         of var2, etc.
  104.     3.  If subsequently the command    maxe = 2    were given, thereafter
  105.         whenever a term containing var1 raised to a power greater than 2 is
  106.         generated during a computation, this term would be discarded.
  107.         Previously defined sums are not affected.  Only var1 is affected.
  108.  
  109.          The commands "compute" and "define" have some overlap in their use
  110.     but the following distinctions should be noted.  The "compute" command
  111.     is always a one line command operating on sums only, while the "define"
  112.     command may be many lines and may operate on variables also.  Only the
  113.     "compute" command may be used to raise a sum to a non-integer power
  114.     (binomial expansion) or to divide one sum by another sum.
  115.                                       -4-
  116.  
  117.     III.  EXAMPLES
  118.  
  119.          The following examples give the flavor and style of usage of PFSA.
  120.     Section IV has descriptions of the full set of commands for PFSA.  This
  121.     section is intended to introduce the use of PFSA, not specify it.
  122.     Refer to Section IV for more exact definitions.  The examples are algin
  123.     files which may be run using PFSAI.EXE.  The algin files can be run
  124.     with PFSAF.EXE if all the fractional numbers are changed to decimal
  125.     numbers (Fortran real numbers).
  126.  
  127.  
  128.  
  129.          A.   Basic Commands
  130.      
  131.     order x y
  132.     define sum1 = 3/4 x**2
  133.     define sum2
  134.     1
  135.     4 sum1
  136.     7 y
  137.     1/3 z
  138.      
  139.     define sum3 = sum1 * sum2
  140.     print sum3
  141.      
  142.     the derivative of y wrt x is dydx
  143.     differentiate sum4 = d sum3/d x
  144.     print sum4
  145.     substitute 8 for x in sum4
  146.     print sum4
  147.      
  148.     fortran sum4
  149.      
  150.     define one = 1
  151.     define six = 6
  152.     define i = one
  153.      
  154.     label lab2
  155.     compute i = i + one
  156.     print i
  157.     if i.eq.six end
  158.     goto lab2
  159.      
  160.     end input
  161.      
  162.          B.   Procedures
  163.      
  164.     order x y z
  165.     *  This example contains a procedure which computes factorials.
  166.     *  The lines from "procedure factorial" to "return" define the
  167.     *  procedure.  There is no provision for local variables or
  168.     *  sums in procedures.  The sum "facarg" is used to
  169.     *  transmit the argument, and the sum "facans" is used to
  170.     *  transmit the answer.
  171.      
  172.                                       -5-
  173.  
  174.     procedure factorial
  175.     np=0     ;After this command only error messages are printed.
  176.     define one=1
  177.     define facans=one
  178.     if facarg.eq.one goto facend
  179.     define temp=facarg
  180.     if temp.lt.one bomb
  181.     label fact1
  182.     compute facans=facans*temp
  183.     compute temp=temp-one
  184.     if temp.ne.one goto fact1
  185.     label facend
  186.     np=2     ;after this command the usual printing resumes
  187.     return
  188.      
  189.     define facarg=5
  190.     call factorial
  191.     print facans
  192.     end input
  193.  
  194.  
  195.          C.  Canonical Transformation
  196.  
  197.          Here we will find a transformation of coordinates (p,q) to
  198.     coordinates (pb,qb) which transforms an expression
  199.     h=p**2 + q**2 +8*e*p*q to a better form in which there is no term
  200.     having e to the first power.  Here the transformation is specified by
  201.     the generating function f=pb*q + e*pb**2 - e*q**2; the transformation
  202.     is defined by p=df/dq, qb=df/dpb.  One must start from these two
  203.     equations and work out the transformation explicitly.
  204.  
  205.      order e p q pb qb
  206.      *  e is a small parameter (epsilon)
  207.      define h
  208.        p^2
  209.        q^2
  210.        8 e p q
  211.      
  212.      define f
  213.        pb q
  214.        e pb^2
  215.        -e q^2
  216.      
  217.      differentiate dfdq = d f/ d q
  218.      differentiate dfdpb = d f/ d pb
  219.      print dfdq
  220.      print dfdpb
  221.      *  There is no "solve" command in PFSA, one can use various
  222.      *  commands such as "compute" and "extract" to aid in big
  223.      *  computations.  Here we see by a simple calculation:
  224.      *  q=qb - 2 e pb  and p=pb - 2 e qb + 4 e^2 pb .
  225.      define qequals
  226.        qb
  227.        -2 e pb
  228.      
  229.                                       -6-
  230.  
  231.      define pequals
  232.        pb
  233.        -2 e qb
  234.        4 e^2 pb
  235.      
  236.      substitute qequals for q in h
  237.      substitute pequals for p in h
  238.      print h
  239.      
  240.      *  We see that the e term was eliminated.  More transformations
  241.      *  can be done to eliminate other unwanted terms.
  242.      end input
  243.  
  244.  
  245.          D.  Binomial Expansion
  246.      
  247.     order x
  248.     define mhalf = -.5    ;this example should be run with PFSAF.EXE
  249.     maxe=30
  250.     nbinomial=30
  251.     define aa
  252.     1
  253.     -x^2
  254.      
  255.     compute sb = aa^mhalf
  256.     substitute t for x in sb
  257.     the derivative of y wrt t is sb
  258.     define arcsin = y
  259.     taylor order = 31
  260.     taylor expand arcsin in t
  261.     substitute 0 for y in arcsin
  262.     substitute x for t in arcsin
  263.     print arcsin
  264.      
  265.     substitute .5 for x in arcsin
  266.     define pi = 6.*arcsin
  267.     print pi  ;accurate to 10 decimal places
  268.     end input
  269.  
  270.  
  271.          E.  Inversion of Series
  272.      
  273.     *  if y = x + b1 x^2 + b2 x^3 ... is given, this routine finds
  274.     *     x = y + c1 y^2 + c2 y^3 ... in general terms.
  275.     *  This example was contributed by Kaya Imre. PFSAI does this
  276.     *  example in 40 seconds on the XT (Microsoft compiler).  PFSAI
  277.     *  does this example in 29 seconds on a Cromemco (8 Mhz 68000).
  278.     *  The equivalent code in muMath runs in 11160 seconds on the XT.
  279.     *  The muMath code (also by Imre) is given after the algin file.
  280.                                       -7-
  281.  
  282.     order x y
  283.     np=1
  284.     def gen
  285.     x
  286.     b1 x^2
  287.     b2 x^3
  288.     b3 x^4
  289.     b4 x^5
  290.      
  291.     def rev
  292.     y
  293.     c1 y^2
  294.     c2 y^3
  295.     c3 y^4
  296.     c4 y^5
  297.      
  298.     def one = 1
  299.     def two = 2
  300.     def zero= 0
  301.     def yy  = y
  302.     def dup = rev / yy
  303.     com dup = dup - one
  304.     maxe = 6
  305.     sub gen for y in rev
  306.     def cnt = 0
  307.     def six = 6
  308.     def ex  = x
  309.     def rrev= y
  310.     def yp  = y
  311.      
  312.     lab loop
  313.     def tem = rev
  314.     sub q for x in tem
  315.     sub 0 for q in tem
  316.     com rev = rev - tem
  317.     def rev = rev / ex
  318.     com cnt = cnt + one
  319.     if cnt.le.two goto loop
  320.     def yp = yp * yy
  321.     def dup = dup / yy
  322.     def cc  = dup
  323.     sub 0 for y in cc
  324.     com dup = dup -cc
  325.      
  326.     sub zero for cc in tem
  327.     def tt  = -tem
  328.     sub tt for cc in rev
  329.     def rr  = -tem * yp
  330.     com rrev= rrev + rr
  331.     np = 2
  332.     pri rr
  333.     np = 0
  334.     if cnt.lt.six  goto loop
  335.     end input
  336.                                       -8-
  337.  
  338.     FUNCTION INVRT(F,G,N),
  339.     GG:G,
  340.     GH:G,
  341.     H:(EXPAND(EVSUB(G,Y,F))/X-1)/X,
  342.     GH:(GH/Y-1)/Y,
  343.     LOOP
  344.     WHEN N EQ 0 EXIT,
  345.     COEF:EVSUB(GH,Y,0),
  346.     AA:COEF-EVSUB(H,X,0),
  347.     H:EVSUB(H,COEF,AA)/X,
  348.     GH:(GH-COEF)/Y,
  349.     GG:EVSUB(GG,COEF,AA),
  350.     N:N-1,
  351.     ENDLOOP,
  352.     GG
  353.     ENDFUN$
  354.      
  355.     RDS()$
  356.                                       -9-
  357.  
  358.     IV.  COMMANDS
  359.  
  360.          The input for PFSA is fairly free form.  All commands should be in
  361.     lower case.  Commands may be abreviated.  The first 3 letters of the
  362.     command name are sufficient to identify the command, but some commands
  363.     require additional words in the command line.  PFSA reads the algin
  364.     file in segments (delimited by the "flush" command), and looks for
  365.     certain commands during this buffer filling.  If a line has "flu" or
  366.     "lab" or "pro" as the first non blank characters it will be interpreted
  367.     as a command by the preprocessor (generating an error if this were in
  368.     fact part of a "define" or an "order" block).  A line that starts with
  369.     an asterisk or semi-colon in column 1 will be considered by PFSA to be
  370.     a blank line.  PFSA will ignore blank lines, except those blank lines
  371.     used to terminate "define" or "order" blocks.
  372.  
  373.          In the following descriptions v1, v2, and v3 represent variables,
  374.     and s1, s2 and s3 represent sums.  The listed constructions are the
  375.     only valid constructions, for example there is no valid "compute"
  376.     construction involving a variable.  Vors1 and vors2 are used to
  377.     indicate that a variable or a sum may be used.
  378.  
  379.  
  380.     call label1
  381.      
  382.     compute s1=s2
  383.     compute s1=s2+s3
  384.     compute s1=s2-s3
  385.     compute s1=s2*s3
  386.     compute s1=s2/s3
  387.          The above division is done only if the result is expressible as a
  388.          sum of terms.  So if s3 contained only a single term the division
  389.          would be done.  If s3 has more than one term then if possible s1
  390.          will be found such that s1*s3 is equal to s2 up to order maxe in
  391.          the first variable.  This is not implemented for maxe greater than
  392.          2.  So if for instance maxe=2, s2=1, and s3=1+var1, then s1 will
  393.          be 1 - var1 + var1**2.
  394.     compute s1=s2^s3
  395.          S1 will be the binomial expansion of s2 to order nb(nbinomial).
  396.          S2 must have its first term equal to 1, so variable#1 cannot
  397.          appear in s2 with a negtive exponent.  If we write s2=1+z and if
  398.          s3=a, then s1 will be
  399.          1+a*z+a(a-1)z^2/2+..+a(a-1)..(a-nb+1)z^nb/nb!.
  400.      
  401.     count s1 = terms in s2
  402.          This command causes the number of terms in s2 to be counted and s1
  403.          is set equal to this number.
  404.      
  405.     define s1=coefficient vors1 vors2 ....
  406.          In the above form of the define command, "coefficient" represents
  407.          a rational number (or integer or nothing) and vors1 and vors2 are
  408.          variables or sums (perhaps with exponent).  The above form may not
  409.          be used if s1 has more than one term, in which case the form below
  410.          should be used.
  411.                                      -10-
  412.  
  413.     define s1
  414.      coefficient vors1 vors2 ....
  415.      coefficient vors1 vors2 ....
  416.      ..
  417.      (blank line to terminate sequence of terms)
  418.      
  419.     delete s1 s2 ...
  420.         Variables can not be deleted or used as a sum.
  421.      
  422.     derivative specification is done with the "the derivative..." command,
  423.         see below.
  424.      
  425.     differentiate s1=d s2 / d v1
  426.     differentiate s1=d s2 / d v1  order=number
  427.         The order of the derivative to be taken can also be specified by a
  428.         sum s3 which has been set equal to a positive integer, shown below.
  429.     differentiate s1=d s2 / d v1  order=s3
  430.      
  431.     dump
  432.      
  433.     end
  434.     end input
  435.         PFSA reads input lines in algin until it reaches "end input".
  436.      
  437.     extract s1 = term s2 of s3
  438.          In the above form s2 should be a sum which is currently equal to a
  439.          positive integer.  In the form below i and j are integers, and
  440.          there are no spaces between these integers and the "-".
  441.     extract s1 = terms i-j of s2
  442.      
  443.     flush
  444.          The input file algin is stored in a buffer in the running program.
  445.          If algin is too long to fit completely in the buffer, it should be
  446.          segmented using the flush command.  When this command is executed
  447.          the previous buffer contents are discarded and the next segment is
  448.          read in.  The call and goto commands are valid only for labels in
  449.          the current segment.  However, all information about variables and
  450.          sums is kept.
  451.      
  452.     fortran s1
  453.         S1 will be printed in a form suitable for use in a fortran program.
  454.      
  455.     goto label1
  456.      
  457.     if s1.eq.s2 command
  458.     if s1.ne.s2 command
  459.          The above constructions test whether s1 and s2 are identically
  460.          equal; if the relation is true, the command is executed.  The
  461.          command should be a one line command.  One may use the other
  462.          fortran relational operators .lt.  .le.  .gt.  and .ge.  but in
  463.          these cases only the first coefficients of s1 and s2 are compared.
  464.                                      -11-
  465.  
  466.     integration such as z = integral y dx may be done by:
  467.          (1) the deriv of q wrt x is y
  468.          (2) taylor expand q in x
  469.          (3) define z = q
  470.          (4) subst 0 for q in z
  471.      
  472.     label label1
  473.          The next line has label=label1.
  474.      
  475.     maxe = i
  476.          After this command, any terms newly arising which have variable#1
  477.          to a higher power than i will be discarded.
  478.      
  479.     nbinomial=i
  480.          Binomial expansions will be done to order i.
  481.      
  482.     ndump=0  No dump
  483.     ndump=1  A dump will occur after fatal errors.
  484.      
  485.     np=0  only error messages are printed
  486.     np=1  the above plus results of "print" and "fortran"
  487.     np=2  the above plus all commands are printed
  488.     np=3  the above plus time and memory usage are printed
  489.  
  490.  
  491.          The "first" variable must be specified at the start of an algin
  492.          file by the order command.  Other variables will be ordered
  493.          according to the order in which they are encountered as the algin
  494.          file is processed, and they need not be listed in the order
  495.          command.
  496.     order v1 v2...
  497.          The above form of the order command can be used if the list
  498.          v1 v2...  fits on one line.  If there are more variables to be
  499.          ordered than will fit on one line, use the following form:
  500.     order
  501.      v1 v2 ....
  502.      ..  ...
  503.      (blank line to terminate the list of variables)
  504.      
  505.     print s1
  506.      
  507.     procedure label1
  508.          All the lines between the above command and the "return" command
  509.          constitute the procedure with the name label1.  The procedure can
  510.          be invoked in the segment (see the flush command) where it occurs
  511.          by the call command.  Procedures should not call other procedures.
  512.          All names are global and available to to the procedure.
  513.     return
  514.                                      -12-
  515.  
  516.     substitute number for v1 in s1
  517.     substitute v1 for v2 in s1
  518.     substitute s1 for v1 in s2
  519.          In the above command, if v1 occurs to a negative power somewhere
  520.          in s2 and s1 has more than one term, an error message is printed
  521.          and the substitution is not done.
  522.     substitute v1 for s2 in s3
  523.     substitute s1 for s2 in s3
  524.          A limited form of pattern matching is provided by the above
  525.          command.  It is possible to replace any pattern which is
  526.          constituted of a single term.  If a substitute command is given in
  527.          which the pattern is a sum s2 with more than one term, the first
  528.          term (of sum s2) is examined and used in searching for matches and
  529.          the remainder of the terms (in sum s2) are ignored.
  530.      
  531.     taylor expand s1 in v1 v2 ..
  532.          The order of the taylor expansion wanted should have been
  533.          previously specified by the following command:
  534.     taylor order = i
  535.          where i is a positive integer or a sum.  The expansion is made
  536.          about v1=v2=..=0.
  537.      
  538.     the derivative of v1 wrt v2 is vors1
  539.          The above command is used to tell PFSA the derivatives of
  540.          variables.  Subsequently PFSA will use this information when
  541.          differentiating expressions containing these variables.  If the
  542.          derivative vors1 is a sum, a "chain rule" will stop at the sum
  543.          because the substitution of the sum into the place where it will
  544.          eventually go is not done until all chaining is finished.
  545.                                      -13-
  546.  
  547.     V.  ERROR MESSAGES
  548.      
  549.     bad cmnd    bad command
  550.      
  551.     call        an undefined label used in "call" command
  552.      
  553.     comput1     bad syntax in "differentiate" command
  554.     comput2     invalid numerical order of differentiation specified
  555.     comput3     no "/" found in "differentiate" command
  556.     comput4     right hand side not a sum in "compute s1=s2" command
  557.     comput14    order specified incorrectly in "differentiate" command
  558.     comput15    the order for differentiation should be positive
  559.     comput16    the order for differentiation should be an integer
  560.      
  561.     count1      bad syntax in "count" command
  562.     count2      final argument in "count" command should be a sum
  563.      
  564.     deriv2      the thing to be differentiated should be a sum
  565.     deriv4      in doing differentiation a chain rule sequence longer
  566.                 than 5 encountered
  567.      
  568.     expnd1      the item to be raised to a power is not a sum
  569.     expnd2-3    the first term of the item must be 1
  570.      
  571.     extrct1     the final argument in "extract" command should be a sum
  572.     extrct2     a non-reasonable term was requested in "extract" command
  573.     extrct5     bad syntax in "extract" command
  574.     extrct6     terms can be extracted only from sums
  575.     extrct7     j is less than i in "extract s1=terms i-j of s2
  576.      
  577.     gcdout1     an arithmetic mistake has occurred, a denominator is negative
  578.      
  579.     getexp2     input line too long
  580.     getexp4     bad syntax in input line
  581.     getexp6     input line too long
  582.     getexp8     bad syntax in input line
  583.     getexp9     input line too long
  584.      
  585.     iftest1-5   bad syntax in "if" command
  586.      
  587.     max jp      a sum is being raised to a power greater than 30 in a
  588.                 substitution process.  Change PFSA or algin to fix this.
  589.      
  590.     monitr2-6   bad command
  591.     monitr7     a label was searched for and not found in current segment
  592.     monitr8-10  bad command
  593.                
  594.     nxt         bad syntax in input line
  595.     nxtch       bad syntax in input line
  596.     nxtnb       bad syntax in input line
  597.                
  598.     print2      exponents greater than 99 are not handled by print routine
  599.     print3      a term is requiring too many characters in being printed
  600.                                      -14-
  601.  
  602.     putfirst    the "order" command should be the first command and should
  603.                 occur only once.
  604.      
  605.     readin2-10  bad syntax in substitute command
  606.     readin12    one should not substitute a number for a sum.  Use a term as
  607.                 intermediate substitution.
  608.      
  609.     return?     bad command
  610.     taylor1     bad value for order in "taylor" command
  611.     taylor2-5   bad syntax in "taylor" command
  612.     taylor6     only sums can be taylor expanded by PFSA
  613.      
  614.     term1       input line too long
  615.      
  616.     thderv1-2   bad syntax in "the derivative" command
  617.      
  618.     useorder    the first command in the algin file should be "order"
  619.                                      -15-
  620.  
  621.     VI.  TECHNICAL DETAILS
  622.  
  623.          The fortran source file PFSAI.FOR is included so that users can
  624.     change the size or otherwise modify PFSAI.EXE as wanted.  The compiled
  625.     PFSAI.OBJ should be linked with TSUBS.OBJ (obtained by assembling
  626.     TSUBS.ASM) to produce PFSAI.EXE.
  627.  
  628.          The main routine calls subroutine "monitr" which reads in and
  629.     executes segments of the "algin" file.  The segments are delimited by
  630.     the "flush" command, the last segment is delimited by the "end input"
  631.     command.  Each segment is kept in memory while it is being executed,
  632.     and so target locations for "goto" and "call procedure" commands should
  633.     be in the same segment as the command.  (For machines which allow large
  634.     memory usage this can be avoided by using a single segment.) The
  635.     routine "monitr" examines input lines, decides which command is
  636.     intended, and calls the appropriate subroutine to execute the command.
  637.  
  638.          The sums and variables are referenced through a single set of
  639.     lists: list "pv" has the print form of the name, list "ittb" is zero
  640.     for variables and has the beginning term for sums, list "itte" has the
  641.     number of the final term for sums, list "ios" has the ordinal position
  642.     in memory for the sums.  So for example if ittb(1)=30, itte(1)=30,
  643.     ittb(2)=3, itte(2)=29, ittb(3)=1, itte(3)=2, the first two terms in the
  644.     list of terms constitute sum number 3 the next 27 terms constitute sum
  645.     number 2 and term 30 constitutes sum number 1, and ios(1)=3, ios(2)=2,
  646.     ios(3)=1.  An inverse of ios is kept in list "iosi".  A given sum name
  647.     will keep the same sum number (unless it is deleted and reintroduced)
  648.     but it may be moved to different positions in the list of terms.  The
  649.     coefficients of terms are kept in the list "tm" and pointers to the
  650.     list of factors and powers are kept in lists "itb" and "ite".
  651.  
  652.          After every command all the sums are put into a canonical sorted
  653.     order, which is the same order as is displayed when the sum is printed.
  654.     All sorting is done from start to end and if an out of sequence term is
  655.     found the correct location is found by a binary search and then the
  656.     pointers are changed for the affected terms.  When terms are created
  657.     during a multiplication or substitution command the above ordering
  658.     procedure is done.  At the end of generating the terms a packing
  659.     operation is done (by a routine named "pack") which arranges all terms
  660.     in memory so the pointers are ordered.
  661.  
  662.          Derivatives are handled by keeping a list of derivatives of
  663.     variables and searching this list (up to 5 deep) for all chains which
  664.     end with the given independent variable.  Of course, the program knows
  665.     d x**n/ dx, but other derivatives (if any) must have been previously
  666.     specified by a "the derivative of u wrt x is smthng" command.
  667.