Sindbad~EG File Manager

Current Path : /usr/home/beeson/Otter-Lambda/yyy/automode/
Upload File :
Current File : /usr/home/beeson/Otter-Lambda/yyy/automode/optable.c

/* M. Beeson, for Mathpert
   last modified 1.23.98 before version 1.624
   last modified 6.17.04 
*/

/* Note, optable.rh is prepared from this file by makerh.exe.
There must be no multi-line comments in the definition of
optable: if there are, put comment symbols on each line.
Otherwise, makerh can't cope.  It ignores the part of the file
before and after optable, however.
*/
/*___________________________________________________________________*/
/* optable is the table that gives the names of the (actual code for the)
operators on the menus.  It must match the array menutext in mtext.c.
It is referred to in model.c too so don't change its declaration, but
it's ok to add more items */

#define AUTOMODE_DLL
#include <stdlib.h>
#include "globals.h"
#include "mtext.h"  /* for MAXMENUS */
#include "ops.h"   /* prototypes of MATHPERT operators */
#include "trig.h"
#include "calc.h"
#include "series.h"
#include "operator.h"  /* automode_only */

actualop testop = arithmetic; //DEBUG
/* According to Jeff Richter, this should have a different value than
testop2 a few lines below which has automatic rather than static
storage class.   But, it gets the same value, the large one,
while 'arithmetic' in its home dll, algebra.dll, gets a small value.
*/
actualop optable[MAXMENUS][16] =
{
   {                      /* numerical_calculation           */
     arithmetic,          /* arithmetic                      */
     devalop,             /* decimal calculation             */
     computeroot,         /* calculate decimal � or ��       */
     computepower,        /* decimal value of x�             */
     computefunction,     /* decimal value of function       */
     factorinteger,       /* factor integer                  */
     evalatpoint,         /* evaluate numerically at a point */
     evalpi,              /* decimal value of pi             */
     evaleulere,          /* decimal value of e              */
     evalfunction,        /* compute function value          */
     factornumerically    /* factor polynomial numerically           */

   },
   {                      /* numerical_calculation2           */
     decimaltofraction,   /* convert decimal to fraction     */
     writenumberassquare, /* express as square               */
     writenumberascube,   /* express as cube                 */
     writenumberaspower,  /* express as ?-th power           */
     writenumberaspowerof,/* express as power of ?           */
     writeintegeraspower, /* write integer as a^n            */
     writeassum           /* x = ? + (x-?)                   */
   },
   {                     /* complex_arithmetic */
     defnofi,        /* i� = -1  */
     powersofi0,     /* i^(4n) = 1           */
     powersofi1,     /* i^(4n+1) = i;        */
     powersofi2,     /*  i^(4n+2) = -1       */
     powersofi3,     /*  i^(4n+3) = -i;      */
     weakcomplexarithmetic,  /* complex arithmetic, not powers */
     complexpowers,      /* power of complex number         */
     complexarithmetic,  /* complex arithmetic and powers   */
     cevalop,            /* complex decimal arithmetic      */
     factorinteger,      /* integer factors of integer      */
     complexfactorsofinteger,  /* complex factors of integer */
     factorcomplexinteger, /* factor n+mi (n not zero)      */
     computeroot,        /* calculate decimal � or ��       */
     computepower,       /* decimal value of x�             */
     computefunction,    /* decimal value of function       */
     evalatpoint         /* evaluate numerically at a point */
   },
   {                      /* simplify_sums                  */
     doubleminus,         /* cancel double minus -(-a)=a    */
     pushminusin,         /* push minus in -(a+b) = -a-b    */
     pullminusout,        /* -a-b = -(a+b)                  */
     arithmetic,          /* arithmetic                     */
     regroupterms,        /* regroup terms                  */
     orderterms,          /* put terms in order             */
     dropzero,            /* drop zero terms x+0 = x        */
     additivecancel,      /* cancel � terms                 */
     collectterms,        /* collect � terms (once)         */
     collectall,          /* collect all � terms in a sum   */
     additivecommute,     /* a+b = b+a                      */
     pullminusout2,       /* a(b-c) = -a(c-b)               */
     minusintoproduct1,   /*-ab = a(-b)                     */
     minusintoproduct2,   /* -abc = ab(-c)                  */
     minusintoproduct3    /* a(-b)c = ab(-c)                */
   },
   {                      /* simplify_products              */
     multbyzero,          /* x�0 = 0                        */
     multbyone,           /* x�1 = x                        */
     bringminusout,       /* a(-b) = -ab                    */
     bringminusout2,      /* a(-b-c) = -a(b+c)              */
     bringminusout3,      /* (-a-b)c = -(a+b)c              */
     regroupfactors,      /* regroup factors                */
     collectnumbers,      /* collect numbers                */
     orderfactors,        /* order factors                  */
     collectpowers,       /* collect powers                 */
     distriblaw,          /* a(b+c)=ab+ac                   */
     difofsquares,        /* (a-b)(a+b) = a�-b�             */
     squareofsum,         /* (a + b)� = a� + 2ab + b�       */
     squareofdif,         /* (a - b)� = a� - 2ab + b�       */
     makedifofcubes,      /* (a-b)(a�+ab+b�)=a^3-b^3        */
     makesumofcubes,      /* (a+b)(a�-ab+b�)=a^3+b^3        */
     multcommute          /* ab = ba                        */
   },
   {                      /* expand_menu */
     multiplyout,         /* multiply out product of sums   */
     expandnumerator,     /* multiply out numerator         */
     expanddenominator,   /* multiply out denominator       */
     multdef              /* na = (a+...+a)                 */
   },
   {                      /* fractions */
     zeronum,            /* 0/a = 0    */
     unitdenom,          /* a/1 = a    */
     recip,              /* a(1/a) = 1 */
     multiplyfractions,   /* (a/b)(c/d) = ac/(bd); don't multiply out (3/5) x if (ringflag & RATRING) */
     multiplyfractions2,  /* a(b/c) = ab/c ; do also multiply out (3/5) x; used only in menu mode */
     cancelop,              /* ab/ac = b/c           */
     addfractions,          /* a/c � b/c=(a�b)/c     */
     apart,                 /* (a � b)/c = a/c � b/c */
     apartandcancel,        /* (ac+b)/c = a+b/c      */
     polydivop,
     cancelbypolydiv,
     pulloutrational,       /* au/bv=(a/b)(u/v) (integers a,b)  */
     pulloutdenom,          /* a/b = (1/b) a         */
     pulloutreal,           /* au/b = (a/b) u  (real numbers a,b) */
     breakfraction,         /* ab/cd = (a/c)(b/d)    */
     breakfraction2         /* ab/c = (a/c)b         */
   },
   {                        /* signed_fractions */
     cancelminusinquotient, /* (-a)/(-b) = a/b       */
     minusintonum,          /* -(a/b) = (-a)/b       */
     minusintodenom,        /* -(a/b) = a/(-b)       */
     minusoutfromnum,       /* (-a)/b = -a/b         */
     minusoutfromdenom,     /* a/(-b) = -a/b         */
     minusoutfromnum2,      /* (-a-b)/c = -(a+b)/c   */
     minusoutfromdenom2,    /* a/(-b-c) = -a/(b+c)   */
     minusoutfromdenom3,    /* a/(b-c) = -a/(c-b)    */
     minusoutfromdenom22,   /* -a/(-b-c) = a/(b+c)   */
     minusoutfromdenom33,   /* -a/(b-c) = a/(c-b)    */
     minusoutfromnum22,     /* -(-a-b)/c = (a+b)/c   */
     negatenumdenom,        /* (a-b)/(c-d) = (b-a)/(d-c) */
     breakfraction1         /* ab/c = a(b/c)         */
   },
   {                   /* compound_fractions */
     compoundfractions1,  /* (a/c)/(b/c) = a/b */
     invertandmultiply,   /* a/(b/c)=ac/b     */
     invertandmultiply2,  /* 1/(a/b) = b/a    */
     compoundfractions2,  /* (a/b)/c = a/(bc)  */
     compoundfractions3,  /* a/b = a(1/b) ; only for menu mode */
     compoundfractions4,  /* (a/b)c/d = ac/bd  */
     factordenominator,
     commondenominfraction   /* commondenom in num or denom */
   },
   {                  /* common_denominators */
     factordenominator,
     findcommondenom,
     findcommondenom2,
     multiplyfractions,
     multiplyfractions,
     orderfactors,
     addfractions,
     commondenom,
     commondenom2,
     commondenomandsimp,
     commondenomandsimp2,
     multnumanddenom
   },
   {         /* exponents */
     zeroexponent,       /* a^0 = 1  (a not zero) */
     unitexponent,       /* a^1 = a               */
     zerobase,           /* 0^b = 0  if b > 0     */
     unitbase,           /* 1^b = 1               */
     intpowerofminusone, /* (-1)� = �1 (n even or odd) */
     powertopower,       /* (a^b)^c = a^(bc) if a>0 or c�Z */
     minustopower,       /* (-a)� = (-1)�a�       */
     quotienttopower,    /* (a/b)� = a�/b�        */
     producttopower,     /* (ab)� = a�b�          */
     squareofsum,        /* (a+b)� = a�+2ab+b�    */
     plainbinomialtheorem,  /* expand by binomial theorem */
     collectpowers,      /* a^(b+c) =(a^b)(a^c)   */
     reversecollectpowers,   /* a^(b+c) = a^b a^c */
     poweroutoffraction, /* a�/b� = (a/b)�        */
     powerstonum,        /* a^n/a^m = a^(n-m)     */
     powerstodenom       /* ab^n/b^m = a/b^(m-n)  */
    },
    {                    /* expand_powers */
     expandsquare,       /* a^2 = aa */
     expandcube,         /* a^3 = aaa */
     expandpower,        /* a^n = aaa...(n times) */
     breakpower,         /* a^n = a^?a^(n-?)      */
     squareofsum,        /* (a � b)� = a� � 2ab + b� */
     cubeofsum,          /* (a + b)^3 = a^3 + 3a^2b + 3ab^2 + b^3 */
     cubeofdif,          /* (a - b)^3 = a^3 - 3a^2b + 3ab^2 - b^3 */
     reversepowertopower1, /* a^(bc) = (a^b)^c  if a>0 or c�Z */
     reversepowertopower2, /* a^(bc) = (a^c)^b  if a>0 or c�Z */
     reversepowertopower3, /* a^(b?) = (a^b)^?  (available with products of 3 or more terms in the exponent) */
     poweroutofrecip     /* 1/a^n = (1/a)^n       */
    },
    {                       /* negative_exponents */
     eliminateconstnegexp,  /* a^(-n) = 1/a� (n constant) */
     eliminateconstnegexpnum,  /* a^(-n)/b = 1/(a�b) (n constant) */
     eliminatenegexp1, /* a^-1 = 1/a    */
     eliminatenegexp,  /* a^(-n) = 1/a� */
     eliminatenegexpnum,  /* a^(-n)/b = 1/(a�b) */
     eliminatenegexpdenom,  /*  a/b^(-n) = ab� */
     introducenegexp,      /* a/b� = ab^(-n)  */
     introducenegexp1,     /*  a/b = ab^(-1)  */
     negexpofquotient,     /*  "(a/b)^(-n) = (b/a)�" */
     powerstonum,        /* a^n/a^m = a^(n-m)     */
     powerstodenom,      /* ab^n/b^m = a/b^(m-n)  */
     reversecollectpowers2  /* a^(b-c) = a^b/a^c  */
    },
    {          /* square_roots */
      productofsqrts,   /* �x�y = �(xy)   */
      sqrtofproduct,    /* �(xy) = �x�y   */
      sqrtsimp,         /* �(x�y) = x�y   */
      sqrtofsquare,     /* �(x�)=x if x�0 */
      sqrttoabs,        /* �(x�)= |x| or �(x��)=|x|� */
      factorundersqrt,  /* factor integer x in �x    */
      sqrtofquotient,   /* �(x/y) = �x/�y */
      sqrtofquotient2,  /* �(x/y) = �|x|/�|y| */
      quotientofsqrts,  /* �x/�y = �(x/y) */
      cancelsqrt,       /* x/�x = �x      */
      cancelsqrt2,      /* �x/x = 1/�x    */
      powerofsqrt,      /* (�x)�� = x� if x�0 */
      powerofsqrt2,     /* (�x)^(2n+1) = x��x  */
      evaltorational,
      computesqrt,
      weakarithmetic
     },
     {                               /* advanced_square_roots */
      cancelsqrtgcd,    /* show common factor in �u/�v   */
      factorpolyundersqrt,  /* factor polynomial under � */
      rationalizedenom,     /* rationalize denominator   */
      rationalizenum,       /* rationalize numerator     */
      sqrttoabs,            /* �(x�)= |x| or �(x��)=|x|� */
      cancelsqrt3,          /* cancel �:  �(xy)/�y = �x  */
      multiplyoutundersqrt, /* multiply out under �      */
      lauringson,           /* a�-b = (a-�b)(a+�b)       */
      roottosqrt,           /* root(2,x) = sqrt(x)       */
      sqrttoroot,           /* sqrt(x) = root(2n,x^n)    */
      sqrttoroot2,          /* sqrt(x) = root(2n,x)^n    */
      sqrtofpower,          /* �(x��) = x�    */
      sqrtofpower2,         /* �(x^(2n+1)) = x��x        */
      pushundersqrt,        /* a�b = �(a�b) if a�0       */
      ratdenomandsimp       /* rationalize denom and simplify */
     },
     {                    /* fractional_exponents */
      exponenttosqrt,   /* a ^ � = �a          */
      exponenttosqrt,   /* a^(n/2) = �(a�)     */
      exponenttoroot,   /* a^(b/n) = ��(a^b)   */
      sqrtexp,          /* �a = a ^ �          */
      rootexp,          /* ��a = a^(1/n)       */
      rootpowerexp,     /* ��(a^m) = a^(m/n)   */
      powerrootexp,     /* (��a)^m = a^(m/n)   */
      powersqrtexp,     /* (�a)^m = a^(m/2)    */
      sqrtexpdenom,     /* 1/�a = a^(-�)       */
      rootexpdenom,     /* 1/��a = a^(-1/n)    */
      powerofminusone,  /* evaluate (-1)^(p/q) */
      factorbase,       /* factor integer a in a^(p/q) */
      fractexpdenom,    /* a/b^(p/q) = (a^q/b^p)^(1/q) */
      fractexpnum,      /* a^(p/q)/b = (a^p/b^q)^1/q)  */
      arithmetic
     },
     {             /*nth_roots */
      productofroots,   /* ��x��y = ��(xy)    */
      rootofproduct,    /* ��(xy) = ��x ��y"  */
      rootofpower5,     /* ��x^m = (��x)^m"   */
      rootsimp,         /* ��(x�y) = x ��y or |x|��y */
      rootofpower,      /* ��(x�) = x if x�0 or n odd */
      rootofpower3,     /* ��(x^(nm)) = x^m if x�0 or n odd */
      rootofpower2,     /*  ���(x�) = �x  */
      rootofpower4,     /* root(mn,a�) = root(m,a) */
      powerofroot,      /*  (��x)� = x          */
      powerofroot2,     /*  (��a)^m = ��(a^m)) */
      powerofroot3,     /* (��a)^(qn+r) = a^q ��(a^r)  */
      factorunderroot,  /*  factor x in ��x     */
      rootofminus,      /* ��(-a) = -��a, n odd */
      evaltorational,   /* evaluate to rational */
      factorpolyunderroot, /* factor polynomial under �� */
      multiplyoutunderroot  /* multiply out under �� */
     },
     {                  /* roots_of_roots */
      sqrtofsqrt,       /* sqrt(sqrt(x)) = root(4,x)    */
      sqrtofroot,       /* sqrt(root(n,x)) = root(2n,x) */
      rootofsqrt,
      rootofroot
     },
     {            /* roots_and_fractions  */
      rootofquotient,   /* ��(x/y) = ��x/��y        */
      quotientofroots,  /* ��x/��y = ��(x/y)        */
      cancelroot,       /* x/��x = (��x)^(n-1)      */
      cancelroot2,      /* ��x/x = 1/(��x)^(n-1)    */
      cancelroot3,      /* cancel under ��: ��(ab)/��(bc)=��a/��b */
      cancelroot3,      /* cancel ��:  ��(xy)/��y = ��x  */
      cancelrootgcd,    /* show common factor in ��u/��v */
      pushunderoddroot, /*  a(��b) = ��(a�b) if n odd */
      pushunderevenroot, /*  a(��b) = ��(a�b) if a�0 */
      pushminusunderroot, /* -��a = ��(-a) if n odd  */
      rootdenom,         /* a/��b = ��(a�/b) (n odd or a�0) */
      rootnum,           /* ��a/b = ��(a/b�) (n odd or b>0) */
      sqrtnum,           /* �a/b = �(a/b�) if b>0    */
      sqrtdenom,         /* a/�b = �(a�/b) if a�0    */
      powerofroot4,      /*  root(mn,a)� = root(m,a) */
      powerofroot5     /*   root(2n,a)� = sqrt a */
     },
     {                /* complex_numbers */
      recipofi,       /*  1/i = -i       */
      recipofi2,      /*  a/i = -ai      */
      recipofi3,      /*  a/bi = -ai/b   */
      sqrtofminus1,   /* �(-1) = i       */
      sqrtofneg,      /*  �(-a) = i�a if a�0 */
      cleardenomofi,  /*  clear denominator of i */
      multiplycomplexconjugates,   /* (a-bi)(a+bi) = a^2+b^2 */
      sumofsquares,    /* a^2+b^2 = (a-bi)(a+bi)      */
      squareofabs,         /* |u + vi|� = u� + v� */
      complexabs,      /* |u + vi| = �(u� + v�) */
      complexapart,    /* (u+vi)/w = u/w + (v/w)i */
      complexform,     /* write in form x+yi */
      sqrtofi,         /* sqrt(bi) = (sqrt(b/2) + sqrt(b/2) i) if b >= 0 */
      sqrtofminusi,    /* sqrt(-bi) = sqrt(b/2) - sqrt(b/2) i) if b >= 0 */
      sqrtofaplusbi,   /* sqrt(a+bi) = (sqrt((c+a)/2) + sqrt((c-a)/2) i) if b >= 0, where c^2 = a^2+b^2 */
      sqrtofaminusbi   /* sqrt(a-bi) = (sqrt((c+a)/2) - sqrt((c-a)/2) i) if b >= 0, where c^2 = a^2+b^2 */
     },
     {                          /* factoring                    */
      factoroutnumber,          /* factor out number            */
      cleardenoms,              /* clear numerical denominators */
      contentfactor,            /* ab + ac = a(b+c)             */
      contentfactor,            /* factor out highest power     */
      factorsquareofsum,        /* a�+2ab+b� = (a+b)�           */
      factorsquareofdif,        /* a�-2ab+b� = (a-b)�"          */
      differenceofsquares,      /* a�-b� = (a-b)(a+b)           */
      factorquadratic,          /* factor quadratic trinomial   */
      quadraticformula,         /* use quadratic formula        */
      writeassquare,            /* a�� = (a�)�                  */
      prodofpowers,             /* a�b� = (ab)�                 */
      factorcoefficients,       /* factor integer coefficients  */
      factorinteger,            /* factor integer               */
      makesubstitution,
      unwinddefinition,
      regardvarasconst,
     },
     {                            /* advanced_factoring */
      invisiblesub,         /* write it as a function of ?          */
      makesubstitution2,    /* write it as a function of ? and ?    */
      writeascube,          /* a^(3n) = (a^n)^3                     */
      writeaspower,         /* a^(?n) = (a^n)^?                     */
      differenceofcubes,    /* a^3 - b^3 = (a-b)(a�+ab+b�)          */
      sumofcubes,            /* a^3 + b^3 = (a+b)(a�-ab+b�)         */
      differenceofnthpowers, /* a�-b� = (a-b)(a^(n-1)+...+b^(n-1))  */
      differenceofnth2,      /* a�-b� = (a+b)(a^(n-1)-...-b^(n-1)) (n even)  */
      sumofnthpowers,        /* a�+b� = (a+b)(a^(n-1)-...+b^(n-1)) (n odd) */
      sumoffourthpowers, /* x^4+a^4=(x�-�2ax+a�)(x�+�2ax+a�)        */
      factorquartic,     /* x^4+(2p-q�)x�+p�=(x�-qx+p)(x�+qx+p)     */
      autosubstitution,  /* computer makes substitution             */
      guessfactor,       /* guess a factor                          */
      factorbypolydiv,   /* search for linear factor                */
      factorbygrouping,  /* factor by grouping                      */
      writeaspoly       /* write it as a polynomial in ?           */
     },
     {                   /* solve_equations */
      switchsides,       /* switch sides                */
      changesigns,       /* change signs of both sides  */
      addeqn,            /* add to both sides           */
      subeqn,            /* subtract from both sides    */
      transfer1,         /* transfer term left to right */
      transfer2,         /* transfer term right to left */
      muleqn,            /* multiply both sides         */
      diveqn,            /* divide both sides           */
      squareeqn,         /* square both sides           */
      cancelterm,        /* cancel � term from both sides */
      cancelfactor,      /* cancel common factor of sides */
      alltoleft,         /* subtract to put in form u=0  */
      trueeqn,           /* equation is identically true */
      pseudosquare,      /* a=-b becomes a�=-b� if a,b�0 */
      pseudosquare2,     /* a=-b becomes a=0 if a,b�0    */
      pseudosquare3      /* a=-b becomes b=0 if a,b�0    */
     },
     {                   /* quadratic_equations  */
      spliteqn,          /* if ab = 0 then a=0 or b=0    */
      quadraticformula,
      quadraticformula,    /* no mistake, it's there twice */
      completethesquare,
      sqrteqn,
      crossmultiply,
      negativediscriminant,
      introduceabs,       /* [u�=a, u�=-a] iff u� = |a| */
      arithmetic
     },
     {                          /* numerical_equations*/
      evalatpoint,
      solvenumerically
     },
     {                          /* advanced_equations*/
      crossmultiply,            /* cross multiply (a/b=c/d=>ad=bc) */
      powereqn,                 /* if u=v then u�=v�               */
      sqrteqn,                  /* take � of both sides            */
      rooteqn,                  /* take ��  of both sides          */
      functioneqn,              /* apply function to both sides    */
      commondenom,              /* common denominator              */
      spliteqn,                 /* if ab=0 then a=0 or b=0         */
      spliteqn2,                /* if ab=ac then a=0 or b=c        */
      selecteqn,                /* select one equation             */
      showalleqns,
      collectmultiplesolns,
      makesubstitution,
      unwinddefinition,
      rejecteqn,                /* reject unsolvable equation      */
      checkroot,                /* check root(s) in original eqn   */
      solvelinear               /* solve linear equation at once   */
     },
     {                                  /* cubic_equations       */
      eliminatequadraticterm,
      computediscriminant,
      showcallingcubic,       /* if number changes adjust autosimp.c */
      viete,
      realcardan,
      cardan2,
      cardan,
      reversesub,
      unwinddefinition,
      translatevar,
      arithmetic,
      devalop,
      polyvalop
     },
     {                                  /* logarithmic_equations  */
      powereqn2,                       /* if u=v then a^u = a^v  */
      powereqn3,                       /* if ln u = v then u = e^v */
      powereqn4,                       /* if log u = v then u = 10^v */
      powereqn5,                       /* if log(b,u) = v then u = b^v */
      logbeqn,                         /* if a^u = a^v then u=v  */
      logeqn,                          /* take log of both sides */
      lneqn,                           /* take ln of both sides  */
      rejecteqn                        /* reject eqn--impossible log or ln */
     },
     {                                  /* cramers_rule */
      cramersrule,
      evaluatedeterminant
     },
     {                                  /* several_linear_equations */
      varsleft,
      eqnscollectall,
      lineupvars,        /* if this is changed, change in_loop in top.c */
      addtwoeqns,
      subtwoeqns,
      muleqns,
      diveqns,
      addmuleqns,
      submuleqns,
      swapeqns,
      ordereqns,
      dropeqn,           /* drop identity */
      regardvarasconst,  /* regard variable as constant */
      impossibleeqns
     },
     {                                 /* selection_mode_only           */
      multabs,                         /* a|b| = |ab| if 0 � a          */
      divabs,                          /* |b|/c = |b/c| if 0 < c        */
      divabs2,                         /* a|b|/c = |ab/c| if 0 < a/ c   */
      solvelinearfor
     },
     {                                 /* linear_equations_by_selection   */
                                       /* if these change you must change */
                                       /* execute in execute.c as well as */
                                       /* needs_two_args in needsarg.c    */
      addselectedeqn,
      subselectedeqn,
      mulselectedeqn,
      divselectedeqn,
      addmulselectedeqn,
      submulselectedeqn,
      swapselectedeqn,
      solveselectedeqn,
      addselectedrow,
      subselectedrow,
      mulselectedrow,
      divselectedrow,
      addmulselectedrow,
      submulselectedrow,
      swapselectedrow,
      multbymatrixidentity
     },
     {                                 /* linear_equations_by_substitution */
      eqnscollectall,          /* collect like terms      */
      solveone,                /* solve equation ? for ?  */
      polyvalop,               /* simplify equations      */
      eqnscancelterm,          /* cancel term from both sides */
      eqnsaddterm,             /* add ? to both sides of equation ? */
      eqnssubterm,             /* subtract ? from both sides of equation ? */
      diveqns,                 /* divide equation ? by ?  */
      substforvar,             /* substitute for variable in all equations */
      impossibleeqns
     },
     {                                 /* matrix_methods */
      matrixform,
      multbyidentity,
      swaprows,
      addrows,
      subrows,
      mulrows,
      divrows,
      addmulrows,
      submulrows,
      multiplymatrices,
      dropzerocolumn,
      dropzerorow,
      dropduplicaterow,
      impossibleeqns,
      convertmatrixeqn
     },
     {                                /* advanced matrix methods */
      multiplymatrices,
      dividebymatrix,
      twobytwoinverse,
      exactmatrixinverse,
      decimalmatrixinverse
     },
     {                                  /* absolute_value */
                            /* change needs_index_arg if these change */
      abspos,               /* |u| = u  if u�0            */
      absposandassume,      /* Assume u�0 and set |u| = u */
      absneg,               /* |u| = -u if u�0            */
      abslinear,            /* |cu| = c|u| if c�0         */
      abslinearquo,         /* |u/c| = |u|/c if c>0       */
      multiplyabsval,       /* |u||v| = |uv|              */
      absofproduct,         /* |uv| = |u||v|              */
      absoffraction,        /* |u/v| = |u| / |v|          */
      fractionofabs,        /* |u| / |v| = |u/v|          */
      absevenpower,         /* |u|��=u�� if u is real     */
      abspower,             /* |u�|=|u|� if n is real     */
      abssqrt,              /* |�u| = �|u|                */
      absroot,              /* |��u| = ��|u|              */
      cancelabs3,           /* |ab|/|ac| = |b|/|c|        */
      cancelabs3,           /* |ab|/|a| = |b|             */
      cancelabsgcd          /* show common factor in |u|/|v| */
     },
     {              /* absolute_value_ineq1 */
      abseqn,       /* |u|=c iff u=c or u = -c    */
      abseqn2,      /* |u|/u=c iff c=�1 */
      abslessthan,  /* |u|<v iff -v < u < v */
      absle,       /* |u|�v iff -v � u � v */
      lessthanabs, /* u<|v| iff u<-v or u<v */
      leabs,       /* u�|v| iff u�-v or u�v */
      abseqntoineq1, /* |u| = u iff 0 � u   */
      abseqntoineq2, /* |u| = -u iff u � 0  */
      absineqtrue,  /* 0 � |u| is true */
      absineqtrue2,  /* -c � |u| is true (c�0) */
      absineqtrue3,  /* -c < |u| is true (c>0) */
      absineqfalse,  /* |u| < 0 is false */
      abslessthanneg,    /* |u| < -c is false (c�0) */
      absleneg,   /* |u| � -c is false (c>0) */
      absleneg2,     /* |u| � -c iff u=0 assuming c=0 */
      abseqnneg      /* |u| = -c iff u=0 assuming c=0 */
     },
     {               /* absolute_value_ineq2 */
      absgreaterthan,  /* v > |u| iff -v < u < v */
      absge,          /* v �|u| iff -v � u � v */
      greaterthanabs, /* |v|> u iff v < -u or v > u */
      geabs,          /* |v|�u iff v � -u or v�u */
      absineqtrueg,   /* |u| � 0 is true */
      absineqfalseg,  /* 0 > |u| is false */
      absgreaterthanneg, /* -c > |u| is false (c�0) */
      absgeneg,       /* -c � |u| is false (c>0) */
      absgeneg2,      /* -c � |u| iff u=0 assuming c=0 */
      absineqtrue3g,  /* |u| > -c is true (c>0) */
      absineqtrue2g,  /* |u| � -c is true (c�0) */
      intervaltoabs1, /* -a <= u <= a iff |u| <= a */
      intervaltoabs2, /* -a < u < a iff |u < a */
      absevenpowerrev, /* u^(2n) = |u|^(2n) if u is real */
      abspowerrev     /*|u|^n =  |u^n| if n is real     */
     },
     {                                /* less_than */
      reverselessthan,     /* change u < v to v > u */
      addeqn1,           /* add ? to both sides       */
      subeqn1,           /* subtract ? from both sides */
      changesigns1,      /* change  -u < -v to v < u    */
      changesignsandsense1, /*  change -u < -v to u > v */
      mulineq,           /* multiply both sides by ? */
      mulineqsq,         /* multiply both sides by ?� */
      divineq,           /* divide both sides by ?    */
      numericalineq,     /* evaluate numerical inequality */
      evenpowerineq1,    /*  a < x^2n true if a < 0    */
      evenpowerineq3,    /*  x^2n < a false if a <= 0  */
      squareineq1,       /* square both sides          */
      squareineq3,       /* u < v iff u� < v� or u � 0 provided v > 0 */
      lessthantole,      /* u < v or u = v becomes u � v */
      combineintervals,  /* combine intervals    */
      explicitdomain     /* use assumptions      */
     },
     {                              /* greater_than */
      reversegreaterthan,   /* change x > y to y < x      */
      changesignsandsense3, /*  change -u > -v to u < v   */
      changesigns1g,        /* change  -u > -v to v > u   */
      evenpowerineq1,    /*  x^2n > a is true if a < 0    */
      evenpowerineq3g,   /*  a > x^2n is false if a <= 0  */
      squareineq3g,      /* v > u  iff v� > u� or u < 0 provided 0 � v */
      greaterthantoge    /* u > v or u = v iff u � v */
     },
     {                              /* less_than_or_equal */
      reversele,         /* change x � y to y � x            */
      addeqn2,           /* add ? to both sides    */
      subeqn2,           /* subtract ? from both sides */
      changesigns2,      /* change u � -v to v � u */
      changesignsandsense2, /* change -u � -v to u � v */
      mulineq,           /* multiply both sides by ? */
      mulineqsq,         /* multiply both sides by ?� */
      divineq,           /* divide both sides by ?    */
      numericalineq,     /* evaluate numerical inequality */
      evenpowerineq2,    /* a <= x^2n true if a <= 0  */
      evenpowerineq4,    /*  x^2n <= a false if a < 0  */
      squareineq2,       /* square both sides          */
      squareineq4,       /* u � v => u� � v� or u � 0 */
      combineintervals,  /* combine intervals         */
      explicitdomain     /* use assumptions           */
     },
     {                            /* greater_than_or_equal */
      reversege,         /* change x � y to y � x */
      changesignsandsense4, /* change -u � -v to u � v */
      changesigns2g,     /* change -u � -v to v � u */
      evenpowerineq2g,   /* x�� � a is true if a � 0 */
      evenpowerineq4g,   /* a � x�� is false if a < 0 */
      squareineq4g       /* v � u iff v� � u� or u � 0 provided 0 � v */
     },
     {                            /* square_ineq1 */
      sqrtineq11,   /* u� < a iff |u| < �a         */
      sqrtineq14,   /* u� < a iff -�a < u < �a       */
      sqrtineq12,   /* 0 � a < v� iff �a < |v|     */
      sqrtineq15,   /* a < u� iff u < -�a or �a < u */
      sqrtinterval1,/* a<u�<b iff -�b<u<-�a or �a<u<�b */
      sqrtinterval3,/* -a<u�<b iff u� < b provided 0<a */
      sqrtinterval5,/* -a<u��b iff u� � b provided 0<a */
      powerineq11,  /* �u < v iff u < v�               */
      squareineq1,  /* 0 � a�u < v iff 0 � a�u < v�    */
      powerineq12,  /* a < �v iff a� < v provided 0�a  */
      sqrtineq13,   /* 0 � u < v iff �u < �v           */
      squaretrue1,  /* a < x^2  is true if a < 0       */
      squarefalse1, /* x^2 < a is false if a <= 0      */
      sqsqrtineq1   /* -a < �u  iff 0 � u provided a>0 */
     },
     {                            /* square_ineq2 */
      sqrtineq21,   /* u� � a iff |u| � �a             */
      sqrtineq24,   /* u� � a iff -�a � u � �a         */
      sqrtineq22,   /* a � v� iff �a � |v| provided 0�a*/
      sqrtineq25,   /* a � u� iff u � -�a or �a � u    */
      sqrtinterval2,/* a�u��b iff -�b�u�-�a or �a�u�b */
      sqrtinterval4,/* -a�u��b iff u� � b provided 0�a */
      sqrtinterval6,/* -a�u�<b iff u� < b provided 0�a */
      powerineq21,  /* �u � v iff 0 � u � v�           */
      squareineq2,  /* 0 � a�u � v iff 0 � a�u � v�    */
      powerineq22,  /* a � �v iff a� � v provided 0�a  */
      sqrtineq23,   /* 0 � u � v iff �u � �v",         */
      squaretrue2,  /* a <= x^2 is true if a < 0       */
      squarefalse2, /* x^2 <= a is false if a <= 0     */
      sqsqrtineq2   /* -a � �u iff 0 � u provided a�0  */
     },
     {                             /* recip_ineq1 */
      recipineq11,  /* 1/x < a iff x<0 or 1/a < x provided a > 0 */
      recipineq21,  /* a < 1/x iff 0 < x < 1/a provided a > 0 */
      recipineq31,  /* 1/x < -a iff -1/a < x < 0 provided a > 0 */
      recipineq41,  /* -a < 1/x iff x < -1/a or 0 < x provided a > 0 */
      recipinterval11,  /* a < 1/x < b iff 1/b < x < 1/a provided a,b > 0 */
      recipinterval21,  /* a < 1/x � b iff 1/b � x < 1/a provided a,b > 0 */
      recipinterval31,  /* -a < 1/x < -b iff -1/b < x < -1/a provided a,b > 0 */
      recipinterval41,  /* -a < 1/x � -b iff -1/b � x < -1/a provided a,b > 0 */
      recipinterval51,   /* -a < 1/x < b iff x < - 1/a or 1/b < x (a,b > 0) */
      recipinterval61   /* -a < 1/x � b iff x < -1/a or 1/b � x (a,b > 0) */
     },
     {                             /* recip_ineq2 */
      recipineq12,  /* 1/x � a iff x<0 or 1/a � x provided a > 0 */
      recipineq22,  /* a � 1/x iff 0 < x � 1/a provided a > 0 */
      recipineq32,  /* 1/x � -a iff -1/a � x < 0 provided a > 0 */
      recipineq42,  /* -a � 1/x iff x � -1/a or 0 < x provided a > 0 */
      recipinterval12,  /* a � 1/x < b iff 1/b < x � 1/a provided a,b > 0 */
      recipinterval22,  /* a � 1/x � b iff 1/b � x < 1/a provided a,b > 0 */
      recipinterval32,  /* -a � 1/x < -b iff -1/b < x � -1/a provided a,b > 0 */
      recipinterval42,  /* -a � 1/x � -b iff -1/b � x � -1/a provided a,b > 0 */
      recipinterval52,   /* -a � 1/x < b iff x � - 1/a or 1/b < x (a,b > 0) */
      recipinterval62   /* -a � 1/x � b iff x � -1/a or 1/b � x (a,b > 0) */
     },
     {                             /* root_ineq1 */
      oddrootineq,  /* u < v iff ��u < ��v (n odd) */
      rootineq11,   /* u�� < a iff |u| < ���a      */
      rootineq13,   /* u�� < a iff -���a < u < ���a      */
      rootineq12,   /* 0 � a < v�� iff ���a < |v|  */
      rootineq15,   /* a < u�� iff u < -���a  or ���a < u  */
      rootinterval1,/* a<u��<b iff -���b<u<-���a or ���a<u<���b */
      powerineq14even,  /* ���u < v iff 0 � u < v�� */
      powerineq14odd, /* ��u < v iff u < v� (n odd or u�0)  */
      powerineq13,  /* a(��u) < v iff a�u < v� provided 0 � a(��u) */
      powerineq15,  /* u < ��v iff u� < v  provided 0 � u */
      powerineq16,  /* u < v iff u� < v� (n odd, n>0) */
      powerineq17,  /* u < v iff u� < v� (n > 0 and 0 � u) */
      powerrootineq1 /* a < ���u iff 0 � u   provided a < 0 */
     },
     {                                    /* root_ineq2 */
      oddrootineq2,  /* u � v iff ��u � ��v (n odd) */
      rootineq21,   /* u�� � a iff |u| � ���a */
      rootineq23,   /* u�� � a iff -���a � u � ���a      */
      rootineq22,   /* a � v�� iff ���a � |v| provided a�0 */
      rootineq25,   /* a � u�� iff u iff -���a  or ���a � u  */
      rootinterval2,/* a�u���b iff -���b�u�-���a or ���a�u�b */
      powerineq24even,/* ���u � v iff 0 � u � v��  */
      powerineq24odd, /* ��u � v iff u � v� (n odd or u�0)   */
      powerineq23,  /* a(��u) � v iff a�u � v� provided 0 � a(��u) */
      powerineq25,  /* u � ��v iff u� � v provided 0 � u */
      powerineq26,  /* u � v iff u� � v� (n odd, n � 0) */
      powerineq27,  /* u � v iff u� � v� (n > 0 and 0 � u) */
      powerrootineq2 /* a � ���u iff 0 � u   provided a � 0 */
     },
     {                                 /* zero_ineq1 */
      droppositive1,     /* drop positive factors */
      posnum1,          /* 0 < a/v iff 0 < v provided a > 0 */
      mulineqsqrt1,      /* 0 < u/�v => 0 < uv  */
      mulineqbysquare1,   /* 0 < u/v iff 0 < uv */
      mulineqsqrt2,       /* u/�v < 0 => uv < 0 */
      mulineqbysquare2,    /* u/v < 0 iff uv < 0  */
      normalizelinear1,   /* ax � b < 0 iff a(x�b/a) < 0 */
      reverselessthan,     /* change u < v to v > u  */
      intervalsneg1,     /* (x-a)(x-b)... < 0 iff a<x<b...(where a<b) */
      intervalspos1      /* 0 < (x-a)(x-b)... iff x<a or b<x...(where a<b) */
     },
     {                                 /* zero_ineq2 */
      droppositive2,      /* drop positive factors */
      posnum2,            /* 0 � u/v => 0 � v if u � 0 */
      mulineqsqrt3,       /* 0 � u/�v => 0 � uv   */
      mulineqbysquare3,   /* 0 � u/v => 0 < uv or u = 0 */
      mulineqsqrt4,        /* u/�v � 0 => uv � 0   */
      mulineqbysquare4,    /* u/v � 0 iff uv < 0 or u=0 */
      normalizelinear2,    /* ax � b � 0 iff a(x�b/a) � 0 */
      reversele,        /* change u � v to v � u  */
      intervalsneg2,    /* (x-a)(x-b)...� 0 => a�x�b...(where a�b) */
      intervalspos2     /* 0�(x-a)(x-b)...iff x�a or b�x...(where a�b) */
     },
     {                            /* square_ineq3 */
      sqrtineq11g,          /* a > u� iff �a > |u|               */
      sqrtineq14g,          /* a > u� iff -�a < u < �a           */
      sqrtineq12g,           /* v� > a iff |v| > �a provided a�0 */
      sqrtineq15g,           /* u� > a iff u < -�a  or u > �a    */
      powerineq11g,          /* v > �u iff 0 � u < v�            */
      squareineq1g,          /* v>a�u iff 0�a�u<v� provided 0�a  */
      powerineq12g,          /* �v > a iff v > a� provided 0�a   */
      sqrtineq13g,           /* v > u  iff �v > �u provided u�0  */
      squaretrue1g,          /* x^2 > a is true if a < 0         */
      squarefalse1g,         /* a > x^2 is false if a <= 0       */
      sqsqrtineq1rev         /* �u > -a  iff u � 0 provided a>0  */
     },
     {                            /* square_ineq4 */
      sqrtineq21g,          /* a � u� iff �a � |u|             */
      sqrtineq24g,          /* a � u� iff -�a � u � �a         */
      sqrtineq22g,          /* v� � a iff |v| � �a provided 0�a */
      sqrtineq25g,          /* u� � a iff u � -�a or �a � u    */
      powerineq21g,         /* v � �u iff 0 � u � v�           */
      squareineq2g,         /* v � a�u iff 0�a�u�v� provided 0�a */
      powerineq22g,         /* �v � a iff v � a� provided 0�a  */
      sqrtineq23g,          /* v � u iff �v � �u provided u�0  */
      squaretrue2g,         /* x^2 � a is true if a � 0        */
      squarefalse2g,        /* a � x^2 is false if a < 0       */
      sqsqrtineq2rev        /* �u � -a  iff u � 0 provided a�0 */
     },
     {                           /* recip_ineq3 */
      recipineq11g,  /* a > 1/x  iff x<0 or x > 1/a provided a > 0 */
      recipineq21g,  /* 1/x > a iff 0 < x < 1/a provided a > 0 */
      recipineq31g,  /* -a > 1/x iff -1/a < x < 0 provided a > 0 */
      recipineq41g  /* 1/x > -a  iff x < -1/a or x > 0 provided a > 0 */
     },
     {                           /* recip_ineq4 */
      recipineq12g,  /* a � 1/x  iff x<0 or x � 1/a provided a > 0 */
      recipineq22g,  /* 1/x � a iff 0 < x � 1/a provided a > 0 */
      recipineq32g,  /* -a � 1/x iff -1/a � x < 0 provided a > 0 */
      recipineq42g  /* 1/x � -a  iff x � -1/a or x > 0 provided a > 0 */
     },
     {                             /* root_ineq3 */
      oddrootineqg,  /* u > v iff ��u > ��v (n odd)          */
      rootineq11g,   /* a > u�� iff ���a > |u|               */
      rootineq13g,   /* a > u�� iff -���a < u < ���a         */
      rootineq12g,   /* u�� > a iff |u| > ���a  provided a�0 */
      rootineq15g,   /* u�� > a iff u < -���a  or u > ���a   */
      powerineq14eveng,  /* v > ���u  iff 0 � u < v��            */
      powerineq14oddg, /* v > ��u iff v�> u (n odd or u�0)  */
      powerineq13g,  /* v > a(��u) iff v� > a�u provided 0 � a(��u) */
      powerineq15g,  /* ��v > a iff v > a� provided a�0      */
      powerineq16g,  /* u > v iff u� > v� (n odd, n>0)       */
      powerineq17g,  /* u > v iff u� > v� (n > 0 and 0 � u)  */
      powerrootineq1rev /* ���u > a iff u � 0 provided a < 0 */
     },
     {                                    /* root_ineq4 */
      oddrootineq2g,  /* u � v iff ��u � ��v (n odd)          */
      rootineq21g,   /* a � u�� iff ���a � |u|                */
      rootineq23g,   /* a � u�� iff -���a � u � ���a          */
      rootineq22g,   /* u�� > a iff |u| > ���a  provided a�0  */
      rootineq25g,   /* u�� � a iff u � -���a  or u � ���a    */
      powerineq24eveng,  /* v � ���u iff 0 � u � v��              */
      powerineq24oddg,  /* v � ��u iff v� � u (n odd or u�0)  */
      powerineq23g,  /* v � a(��u) iff v� � a�u provided 0 � a(��u) */
      powerineq25g,  /* ��v � a iff a� � v provided a � 0     */
      powerineq26g,  /* u � v iff u� � v� (n odd, n � 0)      */
      powerineq27g,  /* u � v iff u� � v� (n > 0 and 0 � u)   */
      powerrootineq2rev /* ���u � a iff u � 0 provided a � 0 */
     },
     {                                 /* zero_ineq3 */
      posnum1g,            /* u/v > 0 iff v > 0 provided u > 0 */
      mulineqsqrt1g,       /* change u/�v > 0 to uv > 0        */
      mulineqbysquare1g,   /* u/v > 0 iff uv > 0               */
      mulineqsqrt2g,       /* change 0 > u/�v to 0 > uv        */
      mulineqbysquare2g,   /* 0 > u/v iff 0 > uv               */
      normalizelinear1g,   /* 0 > ax � b iff 0 > a(x�b/a)      */
      intervalsneg1g,      /* 0 > (x-a)(x-b) iff a<x<b  (where a<b) */
      intervalspos1g       /* (x-a)(x-b) > 0 iff x<a or x>b (where a<b) */
     },
     {                                 /* zero_ineq4 */
      posnum2g,            /* u/v � 0 iff v � 0 provided u � 0  */
      mulineqsqrt3g,       /* u/�v � 0 iff uv � 0               */
      mulineqbysquare3g,   /* u/v � 0 iff uv > 0 or u = 0       */
      mulineqsqrt4g,       /* 0 � u/�v iff 0 � uv               */
      mulineqbysquare4g,   /* 0 � u/v iff 0 > uv or u = 0       */
      normalizelinear2g,   /* 0 � ax � b iff 0 � a(x�b/a)       */
      intervalsneg2g,      /* 0 � (x-a)(x-b) iff a�x�b (where a�b) */
      intervalspos2g       /* (x-a)(x-b)�0 iff x�a or b�x (where a�b) */
     },
     {                            /* binomial_theorem */
      plainbinomialtheorem,       /* expand by binomial theorem  */
      binomialtheorem,
      binomialcoeftofactorials,   /*  (n k) = n!/((n-k)!k!) */
      defnoffactorial,             /* n! = n(n-1)(n-2)...1 */
      evaluatefactorial,
      arithmetic,
      evaluatebinomialcoef,
      sigmatosum,       /* expand � notation */
      evaluatesigmatorational,
      factorialrecursion,          /* n! = n (n-1)!  */
      cancelfactorial1,            /* n!/n = (n-1)! */
      cancelfactorial2,            /* n!/(n-1)! = n  */
      cancelfactorial3,            /* n!/k! = n(n-1)...(n-k+1) */
      cancelfactorial1b,           /* n/n! = 1/(n-1)! */
      cancelfactorial2b,           /* (n-1)!/n! = 1/n  */
      cancelfactorial3b            /* k!/n! =1/(n(n-1)...(n-k+1)) */
     },
     {                            /* factor_expansion */
      factorcubeofsum,
      factorcubeofdif,
      factor4thofsum,
      factor4thofdif,
      factornthofsum,    /* a^n+na^(n-1)b+...b^n = (a+b)^n */
      factornthofdif
     },
     {                              /* sigma_notation */
      sigmaconstant,          /* � 1=number of terms */
      minusoutofsigma,        /* � -u = -� u  */
      constantoutofsigma,     /* � cu = c� u (c const) */
      sigmasum,               /*  �(u+v) = �u + �v  */
      sigmasum,               /* �(u-v) = �u - �v */
      sigmatosum,             /* expand � using + */
      sumofi,                 /* 1+2+..+n = n(n+1)/2 */
      sumofisquared,          /* 1�+..+n� = (2n+1)(n+1)n/6 */
      sumofallpowers,         /* 1+x+..+x�=(1-x^(n+1))/(1-x) */
      showfirstterms,         /* show first few terms */
      evaluatesigmatorational,/* evaluate sum for specified value of free var */
      evaluatesigmatodecimal, /* evaluate sum for specified value of free var */
      evalpuresigmatorational,/* evaluate sum with no free variables */
      evalpuresigmatodecimal, /* evaluate sum with no free variables */
      sigmapoly,              /* express summand as polynomial      */
      telescopingsum
     },
     {                      /* advanced_sigma_notation */
      shiftindex,
      renameindexvariable,
      productofsigmas,        /* (�u)(�v) = � � uv */
      splitofflastterm,
      sumoficubed,
      sumofitothefourth,
      difsigma,            /* d/dx �u = � du/dx */
      reversedifsigma,     /* � du/dx = d/dx �u */
      intsigma,            /* � �u dx = � �u dx */
      reverseintsigma,     /* � �u dx = � �u dx */
      constantintosigma,     /*c� u = � cu(c const) */
      sumtodifofsums0,      /* sigma(t,i,a,b)=sigma(t,i,0,b)-sigma(t,i,0,a-1)$$ */
      sumtodifofsums,       /* sigma(t,i,a,b)=sigma(t,i,c,b)-sigma(t,i,c,a-1)$$ */
     },
     {                           /* prove by induction */
      selectinductionvariable,
      basiscase,
      inductionstep,
      useinductionhyp,
      thereforeasdesired
     },
     {                      /* trig_ineq */
       abssinineq,   /* |sin u| � 1 */
       abscosineq,   /* |cos u| � 1 */
       sinineq,      /* sin u � u  if u�0 */
       coslowerbound,   /* 1 - u�/2 � cos u */
       absarctanineq,   /* |arctan u| � �/2  */
       arctanineq,      /* arctan u � u if u�0 */
       tanineq          /* tan u � u if u�0 */
     },
     {                      /* log_ineq1  */
       lnineq1,      /* u < v iff ln u < ln v provided u>0   */
       logineq1,     /* u < v iff log u < log v provided u>0 */
       lnrightineq1, /* u < ln v iff e^u < v                 */
       lnleftineq1,  /* ln u < v iff u < e^v                 */
       logrightineq1,/* u < log v iff 10^u < v               */
       logleftineq1, /* log u < v iff u < 10^v               */
       expineq1     /* u < v iff a^u < a^v  if a > 0, takes arg in menu mode */
     },
     {                      /* log_ineq2  */
       lnineq2,     /* u � v => ln u � ln v provided u>0   */
       logineq2,    /* u � v => log u � log v provided u>0 */
       lnrightineq2, /* u � ln v iff e^u � v                 */
       lnleftineq2,  /* ln u � v iff u � e^v                 */
       logrightineq2,/* u � log v iff 10^u � v               */
       logleftineq2, /* log u � v iff u � 10^v               */
       expineq2     /* u � v iff a^u � a^v  if a > 0, takes arg in menu mode */
     },
     {                      /* log_ineq3  */
       lnineq1g,      /* u > v iff ln u > ln v provided v>0   */
       logineq1g,     /* u > v iff log u > log v provided v>0 */
       lnrightineq1g, /* ln u > v iff u > e^v                 */
       lnleftineq1g,  /* u > ln v iff e^u > v                 */
       logrightineq1g,/* log u > v iff  u > 10^v               */
       logleftineq1g, /* u > log v iff 10^u > v               */
       expineq1g     /* u > v iff a^u > a^v  if a > 0, takes arg in menu mode */
     },
     {                      /* log_ineq4  */
       lnineq2g,     /* u � v iff ln u � ln v provided u>0   */
       logineq2g,     /* u � v => log u � log v provided u>0  */
       lnrightineq2g, /* ln u � v iff u � e^v                 */
       lnleftineq2g,  /* u � ln v iff e^u � v                 */
       logrightineq2g,/* log u � v iff u � 10^v               */
       logleftineq2g, /* u � log v iff 10^u � v               */
       expineq2g     /* u � v iff a^u � a^v  if a > 0, takes arg in menu mode */
     },
     {                   /*logarithms_base10 */
      loginexponent,     /* 10^log a = a     */
      logofpowerof10,    /* log 10� = n      */
      logofone,          /* log 1 = 0        */
      logoften,          /* log 10 = 1       */
      logtoln,           /*  log a = (ln a) / log e  */
      introduceloginexponent,  /* u^v = 10^(v log u) */
      factornumberinlog,
      factoroutbase10,   /* factor out powers of 10  */
      loginexponent2,    /* 10^(n log a) = a^n */
      logrecip,          /* log(a/b) = -log(b/a)  */
      logbrecip          /* log(b,a/c) = -log(b,c/a)  */
     },
     {                 /* logarithms */
      logofpower,         /* log a� = n log a */
      logofproduct,       /* log(ab) = log a + log b */
      logofreciprocal,    /* log(1/a) = - log a */
      logofquotient,      /* log(a/b) = log a - log b */
      collectlogs,        /* log a + log b = log ab */
      collectlogs2,       /* log a - log b = log a/b */
      collectlogs2,       /* log a + log b - log c =log ab/c */
      attractlogs,        /* n log a = log a� */
      logsqrt,            /* log �a = � log a */
      logroot,            /* log ��a = (1/n) log a */
      logofone,           /* log 1 = 0        */
      factornumberinlog,
      factoroutbase,
      logofpowerreverse,   /* log u = (1/a) log u^a     */
      computelog,          /* evaluate logs numerically */
      logtoln
     },
     {                     /* logarithms_base_e  */
      lninexponent,           /* e^ln a = a      */
      lnofe,                  /* ln e = 1        */
      lnofone,                /* ln 1 = 0        */
      lnofpowerofe,           /* ln e� = n       */
      introducelninexponent,  /* u^v = e^(v ln u) */
      lninexponent2           /* e^((ln c) a) = c^a  */
     },
     {                 /* natural_logarithms */    /* menu 70 */
      lnofpower,         /* ln a� = n ln a       */
      lnofproduct,       /* ln ab = ln a + ln b  */
      lnofreciprocal,    /* ln 1/a = -ln a       */
      lnofquotient,      /* ln a/b = ln a - ln b */
      lnofone,           /* ln 1 = 0             */
      factornumberinlog, /* factor number completely */
      collectlns,        /* ln a + ln b = ln ab  */
      collectlns2,       /* ln a - ln b = ln a/b */
      collectlns2,       /* ln a + ln b - ln c = ln (ab/c) */
      attractlns,        /* n ln a = ln a�       */
      lnsqrt,            /* ln �a = � ln a       */
      lnroot,            /* ln ��a = (1/n) ln a  */
      lnofpowerreverse,  /* ln u = (1/a) ln u^a  */
      computeln,         /* evaluate numerically */
      lnrecip            /* ln(a/b) = -ln(b/a)   */
     },
     {                        /* reverse_trig */
      sinsumrev,           /* sin u cos v + cos u sin v = sin(u+v)      */
      sindifrev,           /* sin u cos v - cos u sin v = sin(u-v)      */
      cossumrev,           /* cos u cos v - sin u sin v = cos(u+v)      */
      cosdifrev,           /* cos u cos v + sin u sin v = cos(u-v)      */
      tanhalf1rev,         /* (sin �)/(1+cos �) = tan(�/2)              */
      tanhalf2rev,         /* (1-cos �)/sin � = tan(�/2)                */
      cothalf1rev,         /* (1+cos �)/(sin �) = cot(�/2)              */
      cothalf2rev,         /* sin �/(1-cos �) = cot(�/2)                */
      tansumrev,           /* (tan u+tan v)/(1-tan u tan v) = tan(u+v)  */
      tandifrev,           /* (tan u-tan v)/(1+tan u tan v) = tan(u-v)  */
      cotsumrev,           /* (cot u cot v-1)/(cot u+cot v) = cot(u+v)  */
      cotdifrev,           /* (1+cot u cot v)/(cot v-cot u) = cot(u-v)  */
      reversesinsq         /* (1-cos �) = 2 sin� �/2                    */
     },
     {                     /* complex_polar_form */
      rectangulartopolar,  /* x + iy = r exp(i�) */
      polartorectangular,  /* r e^(i�) = r (cos � + i sin �) */
      absofpolar,          /* |e^(i�)| = 1 */
      absofpolar,          /* |Re^(i�)|=R if R�0 */
      absofpolar,          /* |Re^(i�)| = |R| */
      minustopolar,        /* -a = ae^(i pi)  */
      complexrootminus,    /* ��(-a) = e^(� i/n) ��a if a�0 */
      complexexptonum,     /* a/(be^(ci)) = ae^(-ci)/b  */
      demoivre,            /* de Moivre's theorem */
      explicitparams       /* substitute specific integers */
     },
     {                        /* logs_to_any_base */
      logbinexponent,        /* b^(log(b,a)) = a       */
      logbinexponent2,       /* b^(n log(b,a)) = a^n   */
      logbofb,               /* log(b,b) = 1           */
      logbofpowerofb,        /* logb b� = n            */
      logbofproduct,         /* log xy = log x + log y */
      logbofreciprocal,      /* log (1/x) = -log x     */
      logbofquotient,        /* log x/y = log x-log y  */
      logbofone,             /* log(b,1) = 0           */
      factorlogbase,         /* factor base: log(4,x)=log(2�,x)  */
      logpowerofbofb,        /*  logb(b�,x) = 1/n log(b,x)*/
      logbofpower,           /* logb a� = n logb a */
      factoroutbase,         /* factor out powers of base      */
      collectlogb,         /* log a + log b = log ab */
      collectlogb2,        /* log a - log b = log a/b */
      collectlogb2,        /* log x + log y - log z =log xy/z */
      attractlogb2        /* n log(b,x) = log(b,a�) */
     },
     {                     /* change_base */
      logbtolns,           /* log(b,x) = ln x / ln b */
      logbtologs,          /* log(b,x) = log x/log b */
      changebase,          /* log(b,x) = log(a,x) / log(a,b)  (takes a as arg) */
      logpowerofbofb,      /* log(b�,x) = (1/n) log (b,x) */
      logbtolog,           /* log(10,x) = log x*/
      logbtoln,            /* log(e,x) = ln x */
      logtoln,             /* log x = ln x / ln 10 */
      lntolog,             /* ln x = log x / log e */
      introducelogbinexponent /*  u^v = b^(v log(b,u)) */
     },
     {                    /* evaluate_trig_function        */
      sin0,               /* sin 0 = 0                     */
      cos0,               /* cos 0 = 1                     */
      tan0,               /* tan 0 = 0                     */
      zeroesofsin,        /* sin k� = 0                    */
      onesofcos,          /* cos 2k� = 1                   */
      zeroesoftan,        /* tan k� = 0                    */
      mod360,             /* find coterminal angle < 360�  */
      mod2pi,             /* find coterminal angle < 2�    */
      sin90,              /* angle is multiple of 90�      */
      sin30,              /* use 1-2-�3 triangle           */
      sin45,              /* use 1-1-�2 triangle           */
      radtodeg,           /* change radians to degrees     */
      degtorad,           /* change degrees to radians     */
      combine3045,        /* angle = a 30� + b 45� etc.    */
      computefunction     /* evaluate numerically          */
     },
     {                    /* basic_trig */
      tanrule,            /* tan u = sin u / cos u    */
      cottotan,           /* cot u = 1 / tan u        */
      cottosincos,        /* cot u = cos u / sin u    */
      secrule,            /* sec u = 1 / cos u        */
      cscrule,            /* csc u = 1 / sin u        */
      tanrule2,           /* sin u / cos u = tan u    */
      cotrule2            /* cos u / sin u = cot u    */
    },
    {                     /* trig_reciprocals         */
      cscrule2,           /* 1 / sin u = csc u        */
      secrule2,           /* 1 / cos u = sec u        */
      tanrecip,           /* 1 / tan u = cot u        */
      tanrecip2,          /* 1 / tan u = cos u / sin u */
      cotrecip,           /* 1 / cot u = tan u        */
      cotrecip2,          /* 1 / cot u = sin u / cos u */
      secrecip,           /* 1 / sec u = cos u        */
      cscrecip,           /* 1 / csc u = sin u        */
      sintocsc,           /* sin u = 1 / csc u        */
      costosec,           /* cos u = 1 / sec u        */
      tantodenom,         /* tan u = 1 / cot u        */
     },
     {                          /* trig_squares */
      sinsquare1,       /* sin� u + cos� u = 1 */
      sinsquare2,       /* 1 - sin� u = cos� u */
      sinsquare3,       /* 1 - cos� u = sin� u */
      sinsqtocossq,     /* sin� u = 1 - cos� u */
      cossqtosinsq,     /* cos� u = 1 - sin� u */
      secsqminustansq,  /* sec� u - tan� u = 1 */
      tansquare1,       /* tan� u + 1 = sec� u */
      tansquare2,       /* sec� u - 1 = tan� u */
      secsqtotansq,     /* sec� u = tan� u + 1 */
      tansqtosecsq,     /* tan� u = sec� u - 1 */
      sinoddpower,      /* sin^(2n+1) u = sin u (1-cos� u)� */
      cosoddpower,      /* cos^(2n+1) u = cos u (1-sin� u)� */
      tanoddpower,      /* tan^(2n+1) u = tan u (sec^2 u-1)^n */
      secoddpower,      /* sec^(2n+1) u = sec u (tan^2 u+1)^n */
      makesinpower,     /* (1-cos t)^n(1+cos t)^n = sin^(2n) t */
      makecospower,     /* (1-sin t)^n(1+sin t)^n = cos^(2n) t */
     },
     {                          /* csc_and_cot_identities */
      cscsqminuscotsq,  /* csc� u - cot� u = 1 */
      cotsquare1,       /* cot� u + 1 = csc� u */
      cotsquare2,       /* csc� u - 1 = cot� u */
      cscsqtocotsq,     /* csc� u = cot� u + 1 */
      cotsqtocscsq,     /* cot� u = csc� u - 1 */
      csccomplement,    /* csc(�/2-�) = sec �  */
      cotcomplement,    /* cot(�/2-�) = tan �  */
      cotoddpower,      /* cot^(2n+1) u = cot u (csc^2 u-1)^n */
      cscoddpower       /* csc^(2n+1) u = csc u (cot^2 u+1)^n */
     },
     {                          /* trig_sum */
      sinsum,              /* sin(u+v)= sin u cos v + cos u sin v    */
      sindif,              /* sin(u-v)= sin u cos v - cos u sin v    */
      cossum,              /* cos(u+v)= cos u cos v - sin u sin v    */
      cosdif,              /* cos(u-v)= cos u cos v + sin u sin v    */
      tansum,              /* tan(u+v)=(tan u+tan v)/(1-tan u tan v) */
      tandif,              /* tan(u-v)=(tan u-tan v)/(1+tan u tan v) */
      cotsum,              /* cot(u+v)=(cot u cot v-1)/(cot u+cot v) */
      cotdif              /* cot(u-v)=(1+cot u cot v)/(cot v-cot u) */
     },
     {                          /* double_angle */
      doublesin,           /* sin(2�) = 2 sin � cos �                */
      doublecos1,          /* cos(2�) = cos� � - sin� �              */
      doublecos2,          /* cos(2�) = 1 - 2 sin� �                 */
      doublecos3,          /* cos(2�) = 2 cos� � - 1                 */
      doublecos5,          /* cos 2� + 1 = 2cos� �                   */
      doublecos6,          /* cos 2� - 1 = - 2 sin� �                */
      doubletan,           /* tan(2�) = 2 tan �/(1 - tan� �)         */
      doublecot,           /* cot(2�) = (cot� � -1) / (2 cot �)      */
      reversedoublesin,    /* sin � cos � = � sin 2�                 */
      reversedoublesin2,   /* 2 sin� cos � = sin 2�                  */
      reversedoublecos1,   /* cos� � - sin� � = cos(2�)              */
      reversedoublecos2,   /* 1 - 2 sin� � = cos(2�)                 */
      reversedoublecos3    /* 2 cos� � - 1 = cos(2�)                 */
     },
     {                     /* multiple_angles */
      decrementtrigarg,    /* n� = (n-1)� + � */
      querytrigarg,        /* n� = ?�+(n-?)�  */
      triplesin,           /* sin 3� = 3 sin � - 4 sin^3 � */
      triplecos,           /* cos 3� = -3 cos � + 4 cos^3 � */
      expandsin,           /* expand sin n� in sin �, cos � */
      expandcos            /* expand cos n� in sin �, cos � */
     },
     {                           /* verify_identities */
      crossmultiply,
      switchsides,
      transfer1,
      transfer2,
      addeqn,
      subeqn,
      muleqn,
      cancelterm,
      powereqn,
      sqrteqn,
      rooteqn,
      functioneqn,
      arithmetic,
      checknumerically,
      makesubstitution
     },
     {                       /* solve_by_30_60_90 */
      solvesin30,          /* sin(u)=1/2 iff u=�/6 or 5�/6+2n�     */
      solvesin330,         /* sin(u)=-1/2 iff u=-�/6 or -5�/6+2n�  */
      solvesin60,          /* sin(u)=�3/2 iff u=�/3 or 2�/3+2n�    */
      solvesin300,         /* sin(u)=-�3/2 iff u=-�/3 or -2�/3+2n� */
      solvecos30,          /* cos(u)=�3/2 iff u=��/6 + 2n�         */
      solvecos150,         /* cos(u)=-�3/2 iff u=�5�/6 + 2n�       */
      solvecos60,          /* cos(u)=1/2 iff u=��/3+2n�            */
      solvecos120,         /* cos(u)=-1/2 iff u=� 2�/3+2n�         */
      solvetan30,          /* tan(u)=1/�3 iff u = �/6 + n�         */
      solvetan330,         /* tan(u)=-1/�3 iff u = -�/6 + n�       */
      solvetan60,          /* tan(u)=�3 iff u = �/3 + n�           */
      solvetan120          /* tan(u)=-�3 iff u = 2�/3 + n�         */
     },
     {                       /* solve_by_45_45_90 */
      solvesin45,        /* sin u = 1/�2 if u=�/4 or 3�/4 + 2n� */
      solvesin315,       /* sin u=-1/�2 if u=5�/4 or 7�/4 + 2n� */
      solvecos45,        /* cos u = 1/�2 if u=�/4 or 7�/4 + 2n� */
      solvecos135,       /* cos u=-1/�2 if u=3�/4 or 5�/4 + 2n� */
      solvetan45,        /* tan u = 1   if u= �/4 or 5�/4 + 2n� */
      solvetan135        /* tan u = -1  if u=3�/4 or 7�/4 + 2n� */
     },
     {                       /* zeroes_of_trig_functions */
      solvesin0,       /* sin u = 0 iff u = n�        */
      solvesin90,      /* sin u = 1 iff u = �/2+2n�   */
      solvesin270,     /* sin u = -1 iff u = 3�/2+2n� */
      solvecos90,      /* cos u = 0 iff u = (2n+1)�/2 */
      solvecos0,       /* cos u = 1 iff u = 2n�       */
      solvecos180,     /* cos u = -1 iff u = (2n+1)�  */
      solvetan0,       /* tan u = 0 iff sin u = 0     */
      solvecot90       /* cot u = 0 iff cos u = 0     */
     },
     {                      /* inverse_trig_functions */
      solvesin,        /* sin u=c iff u= (-1)�arcsin c+n�   */
      solvesin2,       /* sin u=c iff u=arcsin(c)+2n� or -arcsin(c)+(2n+1)�" /* 1656 */
      solvecos,        /* cos u=c iff u=�arccos c+2n�       */
      solvetan,        /* tan u=c iff u=arctan c+n� (c not � i) */
      evalarcsin,      /* evaluate arcsin exactly           */
      evalarccos,      /* evaluate arccos exactly           */
      evalarctan,      /* evaluate arctan exactly           */
      evalarccot,      /* arccot x = arctan (1/x)           */
      evalarcsec,      /* arcsec x = arccos (1/x)           */
      evalarccsc,      /* arccsc x = arcsin (1/x)           */
      arcsinodd,       /* arcsin(-x) = -arcsin x            */
      arccosodd,       /* arccos(-x) = �-arccos x           */
      arctanodd,       /* arctan(-x) = -arctan x            */
      periodicform,    /* Put solutions in periodic form    */
      rejectimpossiblesin,  /* reject sin u = c if |c|>1  */
      rejectimpossiblecos   /* reject cos u = c if |c|>1  */
     },
     {                       /* invsimp */
      tanasin,            /* tan(arcsin x) = x/�(1-x�)  */
      tanacos,            /* tan(arccos x) = �(1-x�)/x  */
      tanatan,            /* tan(arctan x) = x          */
      sinasin,            /* sin(arcsin x) = x          */
      sinacos,            /* sin(arccos x) = �(1-x�)    */
      sinatan,            /* sin(arctan x) = x/�(x�+1)  */
      cosasin,            /* cos(arcsin x) = �(1-x�)    */
      cosacos,            /* cos(arccos x) = x          */
      cosatan,            /* cos(arctan x) = 1/�(x�+1)  */
      secasin,            /* sec(arcsin x) = 1/�(1-x�)  */
      secacos,            /* sec(arccos x) = 1/x        */
      secatan,            /* sec(arctan x) = �(x�+1)    */
      atantan,            /* arctan(tan �) = � if -�/2����/2  */
      asinsin,            /* arcsin(sin �) = � if -�/2����/2  */
      acoscos,            /* arccos(cos �) = � if 0����   */
      atantan2            /* arctan(tan x) = x + c1       */
     },
     {                       /* adding_arctrig_functions   */
      sumofarcsin,           /* arcsin x + arccos x = �/2  */
      sumofarctan            /* arctan x + arctan 1/x = �x/2|x| */
     },
     {                       /* complementary_trig */
      sintocos,             /* sin(�/2-�) = cos � */
      costosin,             /* cos(�/2-�) = sin � */
      tantocot,             /* tan(�/2-�) = cot � */
      cotcomplement,        /* cot(�/2-�) = tan � */
      seccomplement,        /* sec(�/2-�) = csc � */
      csccomplement,        /* csc(�/2-�) = sec � */
      sintocos2,            /* sin � = cos(�/2-�) */
      costosin2,            /* cos � = sin(�/2-�) */
      tantocot2,            /* tan � = cot(�/2-�) */
      cottotan2,            /* cot � = tan(�/2-�) */
      sectocsc2,            /* sec � = csc(�/2-�) */
      csctosec2             /* csc � = sec(�/2-�) */
     },
     {                       /* complementary_degrees */
      sintocosdeg,             /* sin(90�-�) = cos � */
      costosindeg,             /* cos(90�-�) = sin � */
      tantocotdeg,             /* tan(90�-�) = cot � */
      cotcomplementdeg,        /* cot(90�-�) = tan � */
      seccomplementdeg,        /* sec(90�-�) = csc � */
      csccomplementdeg,        /* csc(90�-�) = sec � */
      sintocos2deg,            /* sin � = cos(90�-�) */
      costosin2deg,            /* cos � = sin(90�-�) */
      tantocot2deg,            /* tan � = cot(90�-�) */
      cottotan2deg,            /* cot � = tan(90�-�) */
      sectocsc2deg,            /* sec � = csc(90�-�) */
      csctosec2deg,            /* csc � = sec(90�-�) */
      adddegrees,              /* a� + b� = (a+b)�   */
      multdegrees,             /* ca� = (ca)�        */
      divdegrees               /* a�/c = (a/c)�      */
     },
     {                      /* trig_odd_and_even  */
      sinodd,               /* sin(-u) = - sin u  */
      coseven,              /* cos(-u) = cos u    */
      tanodd,               /* tan(-u) = - tan u  */
      cotodd,               /* cot(-u) = - cot u  */
      seceven,              /* sec(-u) = sec u    */
      cscodd,               /* csc(-u) = - csc u  */
      sinsqeven,            /* sin�(-u) = sin� u  */
      cossqeven,            /* cos�(-u) = cos� u  */
      tansqeven,            /* tan�(-u) = tan� u  */
      cotsqeven,            /* cot�(-u) = cot� u  */
      secsqeven,            /* sec�(-u) = sec� u  */
      cscsqeven             /* csc�(-u) = csc� u  */
     },
     {                      /* trig_periodic      */
      sinperiodic,          /* sin(u+2�) = sin u  */
      cosperiodic,          /* cos(u+2�) = cos u  */
      tanperiodic,          /* tan(u+�) = tan u   */
      secperiodic,          /* sec(u+2�) = sec u  */
      cscperiodic,          /* csc(u+2�) = csc u  */
      cotperiodic,          /* cot(u+�) = cot u   */
      sinsqperiodic,        /* sin�(u+�) = sin� u */
      cossqperiodic,        /* cos�(u+�) = cos� u */
      secsqperiodic,        /* sec�(u+�) = sec� u */
      cscsqperiodic,        /* csc�(u+�) = csc� u */
      sinhalfperiod1,       /* sin u = -sin(u-�)  */
      sinhalfperiod2,       /* sin u = sin(�-u)   */
      coshalfperiod1,       /* cos u = -cos(u-�)  */
      coshalfperiod2        /* cos u = -cos(�-u)   */
     },
     {                      /* half_angle_identities   */
      sinsqhalf,            /* sin�(�/2) = (1-cos �)/2 */
      cossqhalf,            /* cos�(�/2) = (1+cos �)/2 */
      sinsqhalf2,           /* sin�(�) = (1-cos 2�)/2  */
      cossqhalf2,           /* cos�(�) = (1+cos 2�)/2  */
      sincossame,           /* sin � cos � = � sin 2�  */
      tanhalf1,             /* tan(�/2) = (sin �)/(1+cos �) */
      tanhalf2,             /* tan(�/2) = (1-cos �)/sin �   */
      cothalf1,             /* cot(�/2) = (1+cos �)/(sin �) */
      cothalf2,             /* cot(�/2) = sin �/(1-cos �)   */
      sinhalf1,             /* sin(�/2) = �((1-cos �)/2)    */
      sinhalf2,             /* sin(�/2) = -�((1-cos �)/2)   */
      coshalf1,             /* cos(�/2) = �((1+cos �)/2)    */
      coshalf2,             /* cos(�/2) = -�((1+cos �)/2)   */
      twicehalf             /* � = 2(�/2)              */
     },
     {                      /* product_and_factor_identities      */
      reversedoublesin,     /* sin x cos x = �sin 2x              */
      sincos,               /* sin x cos y = �[sin(x+y)+sin(x-y)] */
      cossin,               /* cos x sin y = �[sin(x+y)-sin(x-y)] */
      sinsin,               /* sin x sin y = �[cos(x-y)-cos(x+y)] */
      coscos,               /* cos x cos y = �[cos(x+y)+cos(x-y)] */
      sumofsin,             /* sin x + sin y = 2 sin �(x+y) cos �(x-y) */
      difofsin,             /* sin x - sin y = 2 sin �(x-y) cos �(x+y) */
      sumofcos,             /* cos x + cos y = 2 cos �(x+y) cos �(x-y) */
      difofcos,             /* cos x - cos y = -2 sin �(x+y) sin �(x-y) */
      trigdoublesub         /* substitute u,v for expressions in trig functions */
     },
     {                     /* limits */
      testlimit,         /* experiment numerically  */
      limsum,            /* lim u+v = lim u + lim v */
      limdif,            /* lim u-v = lim u - lim v */
      limconst,          /* lim(t\32a,c) = c (c constant) */
      limident,          /* lim(t\32a,t) = a */
      limlinear,         /* lim cu=c lim u (c const)  */
      limminus,          /* lim -u = -lim u  */
      limprod,
      limpower,          /* lim u� = (lim u)�                  */
      limexponent2,      /* lim c^v=c^(lim v) (c constant > 0) */
      limexponent,       /* lim u^v=(lim u)^(lim v) */
      limsqrt,           /* lim �u=�(lim u) if lim u>0  */
      limoddroot,        /* lim ��u = ��(lim u) if n is odd  */
      limevenroot,       /* lim ��u = ��(lim u) if lim u > 0 */
      limpoly,
      limabs             /* lim |u| = |lim u|                */
     },
     {                                 /* limits_of_quotients */
      limlinear,            /* lim cu/v = c lim u/v (c const) */
      limrecip,             /* lim c/v  = c/lim v (c const)   */
      limquotient,          /* lim u/v = lim u/lim v          */
      factorunderlimit,     /* factor out (x-a)� in limit as x\32a */
      limrationalfunction,  /* limit of rational function     */
      quotientofpowers,     /* a�/b� = (a/b)�                 */
      rationalizefraction,
      pulloutnonzerolimit,
      factoroutconstant,
      multnumdenom,         /* mult num and denom by something   */
      divnumdenom2,         /* divide num and denom by something */
      divnumdenom,          /* lim u/v = lim (u/w) / lim (v/w)   */
      limapartandfactor     /* (ab+ac+d)/q = a(b+c)/q + d/q      */
                            /* example : (sin x cos h + cos x sin h - sin x)/h  */
     },
     {                               /* quotients_of_roots */
      limsqrt1,        /* �a/b = �(a/b�)  if b>0          */
      limsqrt2,        /* �a/b = -�(a/b�) if b<0          */
      limroot1,        /* ��a/b = ��(a/b�) (b>0 or n odd) */
      limroot2,        /* ��a/b = -��(a/b�) (b<0, n even) */
      limsqrtdenom1,   /* a/�b = �(a�/b)  if a�0          */
      limsqrtdenom2,   /* a/�b = -�(a�/b) if a�0          */
      limrootdenom1,   /* a/��b = ��(a�/b) (a�0 or n odd) */
      limrootdenom2    /* a/��b = -��(a�/b) (a�0, n even) */
     },
     {                              /* lhopitalmenu   */
      lhopital,
      derivop,
      isolateln,
      isolatelnpower,
      negexptodenom,
      exptodenom,
      trigtodenom,
      createcompoundfraction,
      commondenomandsimp
     },
     {                              /* special_limits */     /* menu 100 */
      limsin1,            /* (sin t)/t                      */
      limtan1,            /* (tan t)/t                      */
      limcos1,            /* (1-cos t)/t                    */
      limcos2,            /* (1-cos t)/t�                   */
      defnofe,            /* (1+t)^(1/t)                    */
      limln1,             /* lim(x->0, ln(1�x)/x) = �1      */
      limexp1,            /* lim(x->0, (e^x-1)/x = 1        */
      limexp2,            /* lim(x->0, (e^(-x)-1)/x = -1    */
      limpowertimeslnabs, /* lim(t->0,t�ln |t|)=0 (n > 0)   */
      limosccos,          /* lim(x->0, cos(1/x) = undefined */
      limoscsin,          /* lim(x->0, sin(1/x) = undefined */
      limosctan,          /* lim(x->0, tan(1/x) = undefined */
      liminfcos,          /* lim(x->�, cos(x) = undefined   */
      liminfsin,          /* lim(x->�, sin(x) = undefined   */
      liminftan           /* lim(x->�, tan(x) = undefined   */
     },
     {                           /* hyper_limits */
      limsinh1,            /* (sinh t)/t                      */
      limtanh1,            /* (tanh t)/t                      */
      limcosh1,            /* (1-cosh t)/t                    */
      limcosh2,            /* (1-cosh t)/t�                   */
     },
     {                              /* advanced_limits */
      limlogisloglim,   /* lim ln u=ln lim u (if lim u > 0) */
      limcontinuous,    /* lim f(u)=f(lim u), f continuous  */
      changelimitvariable, /* lim(t\32a,f(g(t)))=lim(u\32g(a),f(u)) */
      limvalop,         /* evaluate limit in one step       */
      limexptolog,      /* lim u^v = lim e^(v ln u)         */
      createcompoundfraction, /* lim uv = lim v/(1/u)       */
      limundefined,     /* limit undefined due to domain    */
      limlog,           /* lim u = e^(lim ln u)             */
      squeezetheorem,   /* squeeze theorem                  */
      rationalizesum,   /* lim �u-v=lim (�u-v)(�u+v)/�u+v)  */
      limleadingterms,  /* lim u/v = limit of leading terms */
      limleadingterm,   /* leading term: lim(u+a)=lim(u) if a->0 */
      sumleadingterm,   /* replace sum by leading term      */
      undefinedpart,    /* f(undefined) = undefined         */
      limthruexp,          /* lim(e^u) = e^(lim u)   */
      limthrulog          /* lim(ln u) = ln(lim u)  */
     },
     {                  /* logarithmic_limits */
      limtlnt,                /* lim(t\32 0,t ln t) = 0                */
      limtpowerlnt,           /* lim(t\32 0,t^n ln t) = 0$ if n�1      */
      limtlntpower,           /* lim(t\32 0,t (ln t)^n = 0$ if n�1     */
      limtpowerlntpower,     /* lim(t\32 0,t^k (ln t)^n = 0$ if k,n�1 */
      limlntovert,            /* lim(t\32�,ln(t)/t = 0                */
      limlntpowerovert,       /* lim(t\32�,ln(t)^n/t = 0 if n�1       */
      limlntovertpower,       /* lim(t\32�,ln(t)/t^n = 0 if n�1       */
      limlntpowerovertpower, /* lim(t\32�,ln(t)^k/t^n = 0 if k,n�1   */
      limtoverlnt,            /* lim(t\32�,t/ln(t) = �              */
      limtoverlntpower,       /* lim(t\32�,t/ln(t)^n = � if n�1       */
      limtpoweroverlnt,       /* lim(t\32�,t^n/ln(t) = � if n�1       */
      limtpoweroverlntpower   /* lim(t\32�,t^n/ln(t)^k = � if k,n�1   */
     },
     {                             /* limits_at_infinity */
      inflimpower1,    /* 1/t^n */
      inflimpower2,    /* t^n   */
      limexpinf,       /* e^t   */
      limexpinf2,      /* e^t at minus infinity */
      limlnright,      /* ln    */
      limsqrtinf,
      limrootinf,
      limarctaninf,    /* arctan */
      limarccotinf,    /* arccot at infinity       */
      limarccotinf2,   /* arccot at minus infinity */
      limtanhinf,      /* tanh   */
      rationalizesum,
      limthrusin,          /* lim sin u = sin(lim u) */
      limthrucos,          /* lim cos u = cos(lim u) */
      invertlim,
      limleadingterms
     },
     {liminverseevenpower,         /* infinite_limits */
      liminverseoddpower,
      lim1inverseright,
      lim1inverseleft,
      limquoinfinite,
      limlnsing,
      limtansing,
      limcotsing,
      limsecsing,
      limcscsing,
      limprod2left,                /* lim(uv) = lim(u/?) lim(?v) */
      limprod2right                /* lim(uv) = lim(?u) lim(v/?) */
     },
     {                                      /* infinities */
       infinityovernonzero,        /* ��/positive = ��  */
       nonzerooverinfinity,        /* nonzero/�� = 0    */
       timesinfinity,              /* positive��� = ��  */
       infinitytimesinfinity,      /* ��� = ��         */
       addinfinity,                /* �� + finite = ��  */
       infinityplusinfinity,       /* � + � = �         */
       toinfinity1,                /* u^� = � if u > 1  */
       toinfinity0,                /* u^� = 0 if 0 < u < 1 */
       tominusinfinity1,           /* u^(-�) = 0 if u > 1 */
       tominusinfinity0,           /* u^(-�) = � if 0 < u < 1 */
       powerofinfinity,            /* � = � if n > 0   */
       infinityminusinfinity       /* �-� = undefined   */
     },
     {                          /* zero_denom */
       zerodenom,                 /* a/0+ = � if a>0      */
       zerodenom2,                /* a/0- = -� if a>0     */
       zerodenom3,                /* a/0 = undefined      */
       infinityoverzero,          /* �/0+ = �             */
       infinityoverzero2,         /* �/0- = -�            */
       infinityoverzero3,         /* �/0 = undefined      */
       infinityoverzerosq,        /* �/0� = �             */
       infinityoverzero2n,        /* �/0�� = �            */
       zerosqdenom,               /* a/0� = � if a > 0    */
       zerosqdenom2,              /* a/0� = -� if a < 0   */
       zero2ndenom,               /* a/0�� = � if a > 0   */
       zero2ndenom2               /* a/0�� = -� if a < 0  */
     },
     {                          /* more_infinities */
       lninfinity,
       sqrtinfinity,
       rootinfinity,
       ataninfinity,
       acotinfinity,
       acotminusinfinity,
       asecinfinity,
       acscinfinity,
       triginfinity,
       coshinfinity,
       sinhinfinity,
       tanhinfinity,
       lnzero
     },
     {                              /* polynomial_derivs */
      difconstant,
      difidentity,
      difsum,
      difminus,
      diflinear,
      difpower,
      difpoly,
      primerule
     },
     {                              /* derivatives */
      defnofderivative,
      difpoly,
      difsum,
      difminus,
      diflinear,
      diflinear2,
      difpower,
      difproduct,
      difrecip,
      difquotient,
      difsqrt,
      difroots,
      difinversepower,
      difabs,
      primerule
     },
     {                         /* diftrig */
      difsin,
      difcos,
      diftan,
      difsec,
      difcot,
      difcsc
     },
     {                                   /* dif_explog */
      difexp,               /* d/dx e^x = e^x */
      difatox,              /* d/dx c^x = (ln c) c^x, c const */
      difexponential,       /* d/dx u^v=  (d/dx) e^(v ln u)   */
      difln,                /* d/dx ln x = 1/x                */
      diflnabs,             /* d/dx ln |x| = 1/x              */
      logdif,               /* dy/dx = y (d/dx) ln y          */
      difexp2,
      difatox2,
      difln2,
      diflnabs2,
      diflncos,             /* d/dx ln(cos x) = -tan x        */
      diflnsin              /* d/dx ln(sin x) = cot x         */
     },
     {                                 /* dif_inversetrig */
      difatan,
      difasin,
      difacos,
      difacot,
      difasec,
      difacsc,
      difatan2,
      difasin2,
      difacos2,
      difacot2,
      difasec2,
      difacsc
     },
     {                               /* chain_rule */
      difpower2,
      difsqrt2,
      difsin2,
      difcos2,
      diftan2,
      difsec2,
      difcot2,
      difcsc2,
      difabs2,
      chainrule,  /* d/dx f(u) = f'(u) du/dx */
      makesubstitution,
      unwinddefinition
     },

     {                        /* minima_and maxima */
       /* Code in minmax.c depends heavily on exact numbers of these choices. */
       /* if you change them, change the file mpminmax.h to correspond. */
      minmaxexperiment,
      addcriticalpoints,
      addendpoints,
      addundefinedpoints,
      addlimits,
      rejectpoint,
      tabulate,
      tabulateexact,
      selectmax,
      selectmin,
      derivop,
      ssolveop,
      limvalop,
      eliminateparameter,
      functionisconstant
     },
     {                        /* implicit_diff */
      derivop,
      polyvalop,
      ssolveop
     },
     {                        /* related_rates */
      difeqn,              /* differentiate the equation      */
      derivop,             /* evaluate derivative in one step */
      eliminatederivative, /* eliminate derivative by substitution  */
      ssolveop             /* solve simple equation           */
     },
     {                        /* simplify */
      polyvalop,            /* simplify sums and products          */
      ratsimpop,            /*  eliminate compound fractions       */
      commondenomandsimp,   /* common denominator and simplify     */
      contentfactor,        /* factor out common term              */
      factorop,             /* factor out expression (not integer) */
      multiplyoutandsimp,   /* simpprod.c                          */
      cancelgcd,            /* show common factor in u/v           */
      ssolveop,             /* solve simple equation               */
      writeaspoly,          /* write as polynomial in ?            */
      univariatepoly,       /* express as polynomial               */
      monicpoly,            /* make the leading coefficient 1      */
      backtosqrts,          /* x^(1/2) = �x                        */
      backtoroots,          /* change fractional exponents to roots */
      eliminatesqrts        /* change roots to fractional exponents */
     },
     {                      /* higher_derivatives              */
      difeqn,               /* u=v => du/dx = dv/dx            */
      difdif,               /* d�u/dx� = (d/dx)(du/dx)         */
      difdifn,              /* d�u/dx�= d/dx d^(n-1)/dx^(n-1)  */
      secondderiv,          /* d/dx du/dx = d�u/dx�            */
      highderiv,            /* d/dx d�u/dx� = d^(n+1)/dx^(n+1) */
      derivop,              /* evaluate derivative in one step */
      evalatpoint           /* evaluate numerically at a point */
     },
     {                        /* basic_integration */
      int1,
      intconst,
      intident,
      intlinear,   /* if you change positions of these operators you must */
                   /* adjust integrationop  in execute.c */
      intminus,
      intsum,
      intdif,        /* �u-v dt = �u dt - �v dt       */
      intlinearity,  /* �au�bv dt = a�u dt � b�v dt   */
      intpower,      /* �t� dt=t^(n+1)/(n+1) (n # -1) */
      intinversepower, /* �1/t^(n+1) dt= -1/(nt�) (n # 0) */
      intpoly,       /* integrate polynomial          */
      intrecip,      /* �(1/t) dt = ln |t|            */
      intrecip2,     /* �1/(t�a) dt = ln |t�a|        */
      multiplyoutintegrand, /* multiply out integrand */
      expandintegrand,  /* expand (a+b)� in integrand */
      intabs         /* �|t| dt = t|t|/2              */
     },
     {                                     /* trig_integration */
      intsin,
      intcos,
      inttan,
      intcot,
      intsec,
      intcsc,
      intsecsq,
      intcscsq,
      inttansq,
      intcotsq,
      inttosec,
      inttocsc
     },
     {                                     /* trig_integration2 */
      intsin2,
      intcos2,
      inttan2,
      intcot2,
      intsec2,
      intcsc2,
      intsecsq2,
      intcscsq2,
      inttansq2,
      intcotsq2,
      inttosec2,
      inttocsc2
     },
     {                            /* integrate_exp */
      intexp1,            /* �e^t dt = e^t           */
      intexp2,            /* �e^at dt =(1/a) e^(at)  */
      intexp3,            /* �e^(-t)dt = -e^(-t)     */
      intexp4,            /* �e^(-at)dt = -(1/a) e^(-at) */
      intexp5,            /* �e^(t/a)dt = a e^(t/a)   */
      intexp6,            /* �c^t dt = (1/ln c) c^t  */
      intexponential,     /* �u^v dt = �(e^(v ln u) dt --if position changes adjust integrationop in integral.c */
      intln,              /* �ln t = t ln t - t      */
      inttoerf            /* �e^(-t�) dt = ��/2 Erf(t) */
     },
     {                         /*integrate_by_substitution */
      choosesubstitution,
      autochoosesubstitution,
      difsubstitution,
      derivop,                   /* evaluate derivative in one step */
      showcallingproblem,        /* if position changes, adjust at in_loop in top.c */
      trysubstitution,           /* integrand = f(u) � du/dx        */
      changeintegrationvariable, /* � f(u) (du/dx) dx = � f(u) du   */
      unwinddefinition,          /* eliminate defined variable      */
      intsub,
      autointsub
     },
     {                               /*integrate_by_parts */
      integratebyparts,    /* this must remain the first choice, see equatetoproblem */
      autointegratebyparts,
      equatetoproblem,
      transferintegral,
      derivop,
      intsub,
      autointsub,
      simpleint
     },
     {                               /* fundamental_theorem */
      fundamentaltheorem,
      fundamentaltheorem2
     },
     {                               /* definite_integration */
      evalbar,             /* f(t) evaluated from a to b = f(b)-f(a) */
      evalbarln,           /* ln f(t) evaluated from a to b = ln(f(b)/f(a)) */
      switchlimits,        /* change upper and lower limit */
      additivity,          /*  combine two def integrals with same integrand */
      insertpoint,          /*  break an integral up into two integrals */
      breakabsint,         /* break integral |f(t)| dt at zeroes of f */
      integratenumerically,  /* parameters allowed, active line won't advance */
      pureintegratenumerically,  /* no parameters allowed */
      integrateemptyinterval,  /* integral(f(x),x,a,a) = 0.   */
     },
     {                       /* improper_integrals */
      integraltolimit,      /* creates a limit of an integral */
      integraltolimit2,     /* limit at minus infinity  */
      integraltolimit3,     /* limit at left endpoint */
      integraltolimit4,     /* limit at right endpoint */
      intdivtest1,          /* limit of integrand is not zero at infinity */
      intdivtest2           /* limit of integrand is not zero at -infinity */
     },
     {                      /* oddandeven */
      oddintegrand,
      evenintegrand
     },
     {                                /* trig_substitutions */
      trigsubsin,
      trigsubtan,
      trigsubsec,
      trigsubsinh,
      trigsubcosh,
      trigsubtanh,
      yourtrigsub,
      derivop,
      simpleint
     },
     {                                /* trigonometric_integrals */ /* menu 128 */
      intsinsq,    /*  sin� t = (1-cos 2t)/2 in integral  */
      intcossq,    /*   cos� t = (1+cos 2t)/2 in integral */
      intsubcos,   /*  u=cos x after using sin�=1-cos�    */
      intsubsin,   /*  u=sin x after using cos�=1-sin�    */
      intsubtan,   /* u=tan x after using sec�=1+tan�     */
      intsubcot,   /* u = cot x after using csc�=1+cot�   */
      intsubsec,   /* u=sec x after using tan�=sec�-1     */
      intsubcsc,   /* u=csc x after using cot�=csc�-1     */
      tantosecinint,  /* tan� x = sec� x - 1 in integrand */
      cottocscinint,  /* cot� x = csc� x - 1 in integrand */
      intsecpower, /* reduce �sec� x dx                   */
      intcscpower, /* reduce �csc� x dx                   */
      weierstrass  /* u = tan(x/2) (Weierstrass subst.)   */
     },
     {                                /* trigrationalize */
      trigrationalizedenom1, /* multiply num and denom by 1+cos x */
      trigrationalizedenom4, /* multiply num and denom by 1-cos x */
      trigrationalizedenom2, /* multiply num and denom by 1+sin x */
      trigrationalizedenom5, /* multiply num and denom by 1-sin x */
      trigrationalizedenom3, /* mult num and denom by cos x + sin x */
      trigrationalizedenom6  /* mult num and denom by cos x - sin x */
     },
     {                                /* integrate_rational */
       polydivop,               /* polynomial division           */
       factordenominator,
       cancelgcd,               /* show common factor in u/v         */
       squarefreefactors,       /* square-free factorization         */
       factornumerically,       /* factor polynomial numerically     */
       partialfractionsop,      /* expand in partial fractions       */
       completethesquare1,      /* only works in denom or sqrt inside integral or limit */
       intrecip3,               /* �1/(at�b) dt = (1/a) ln |at�b|    */
       intinversepower,         /* �1/(at�b)^(n+1) dt = -1/na(at�b)� */
       inttoatan,               /* �1/(t�+a�)dt=(1/a)arctan(t/a)     */
       inttoacoth,              /* �1/(t�-a�)dt=(1/a)arccoth(t/a)    */
       inttolnratio1,           /* �1/(t�-a�)dt=(1/2a)ln|(t-a)/(t+a)|*/
       inttoatanh,              /* �1/(a�-t�)dt=(1/a)arctanh(t/a)    */
       inttolnratio2            /* �1/(a�-t�)dt=(1/2a)ln|(t+a)/(a-t)|*/
     },
     {                                /* integrate_sqrtdenom */
       completethesquare1,
       inttoasin,      /* CRC formula 19 */
       inttolnratio3,  /* CRC formula 20 */
       inttoacos,      /* CRC formula 21 */
       intsub
     },
     {                                /* integrate_arctrig */
       intasin,
       intacos,
       intatan,
       intacot,
       intacscplus,
       intacscminus,
       intasecplus,
       intasecminus
     },
     {                                /* simplify_calculus */
      polyvalop,    /* simplify sums and products */
      ratsimpop,    /*  eliminate compound fractions */
          /* for the time being polyvalop is put in both places; it */
          /* actually does even more, using content-factor and cancel */
      commondenomandsimp,   /* fractions and non-fractions     */
      contentfactor,
      factorop,
      multiplyoutandsimp,   /* simpprod.c                      */
      cancelgcd,            /* show common factor in u/v       */
      ssolveop,             /* solve simple equation           */
      derivop,              /* evaluate derivative in one step */
      limvalop,             /* evaluate limit in one step      */
      intsub,               /* change integral by substitution */
      simpleint,            /* simple integral in one step     */
      absorbconstant        /* absorb number in const of int   */
     },
     {                               /* integrate_hyperbolic */
      intsinh,
      intcosh,
      inttanh,
      intcoth,
      intcsch,
      intsech
     },
     {                               /* series_geom1 */
      oneminusxseries,           /* $$1/(1-x) = sum(x^n,n,0,infinity)$$ */
      oneminusxseries2,          /* $1/(1-x) = 1+x+x�+...$              */
      oneminusxseries3,          /* $1/(1-x) = 1+x+x�+...x^n...$        */
      oneplusxseries,            /* $$1/(1+x) = sum((-1)^n x^n,n,0,infinity)$$ */
      oneplusxseries2,           /* $1/(1+x) = 1-x+x�+...$ */
      oneplusxseries3,           /* $1/(1+x) = 1-x+x�+...(-1)^nx^n...$  */
      oneminusxseriesrev,
      oneminusxseries2rev,
      oneminusxseries3rev,
      oneplusxseriesrev,
      oneplusxseries2rev,
      oneplusxseries3rev
     },
     {                               /* series_geom2 */
      xoveroneminusxseries,
      xoveroneminusxseries2,
      xoveroneminusxseries3,
      xoveroneplusxseries,
      xoveroneplusxseries2,
      xoveroneplusxseries3,
      xoveroneminusxseriesrev,
      xoveroneminusxseries2rev,
      xoveroneminusxseries3rev,
      xoveroneplusxseriesrev,
      xoveroneplusxseries2rev,
      xoveroneplusxseries3rev
     },
     {                                 /* series_geom3 */
      oneoveroneminusxkseries,
      oneoveroneminusxkseries2,
      oneoveroneminusxkseries3,
      xmoveroneminusxkseries,
      xmoveroneminusxkseries2,
      xmoveroneminusxkseries3,
      oneoveroneminusxkseriesrev,
      oneoveroneminusxkseries2rev,
      oneoveroneminusxkseries3rev,
      xmoveroneminusxkseriesrev,
      xmoveroneminusxkseries2rev,
      xmoveroneminusxkseries3rev
     },

     {                                 /* series_geom4 */
      oneoveroneplusxkseries,
      oneoveroneplusxkseries2,
      oneoveroneplusxkseries3,
      xmoveroneplusxkseries,
      xmoveroneplusxkseries2,
      xmoveroneplusxkseries3,
      oneoveroneplusxkseriesrev,
      oneoveroneplusxkseries2rev,
      oneoveroneplusxkseries3rev,
      xmoveroneplusxkseriesrev,
      xmoveroneplusxkseries2rev,
      xmoveroneplusxkseries3rev
     },
     {                            /* series_geom5 */
      geometricseriesfromk,
      geometricseriesfromk2,
      geometricseriesfromk3,
      geometricseriesminusfromk,
      geometricseriesminusfromk2,
      geometricseriesminusfromk3,
      geometricseriesfromkrev,
      geometricseriesfromk2rev,
      geometricseriesfromk3rev,
      geometricseriesminusfromkrev,
      geometricseriesminusfromk2rev,
      geometricseriesminusfromk3rev
     },
     {                            /* series_ln */
      lnseries,
      lnseries2,
      lnseries3,
      lnseriesminus,
      lnseriesminus2,
      lnseriesminus3,
      lnseriesrev,
      lnseries2rev,
      lnseries3rev,
      lnseriesminusrev,
      lnseriesminus2rev,
      lnseriesminus3
     },
     {                                /* series_trig */
      sinseries,
      sinseries2,
      sinseries3,
      cosseries,
      cosseries2,
      cosseries3,
      sinseriesrev,
      sinseries2rev,
      sinseries3rev,
      cosseriesrev,
      cosseries2rev,
      cosseries3rev
     },
     {                /* series_exp */
      expseries,
      expseries2,
      expseries3,
      expseriesrev,
      expseries2rev,
      expseries3rev,
      negexpseries,
      negexpseries2,
      negexpseries3,
      negexpseriesrev,
      negexpseries2rev,
      negexpseries3rev
     },
     {                /* series_atan */
      atanseries,
      atanseries2,
      atanseries3,
      atanseriesrev,
      atanseries2rev,
      atanseries3rev,
      binomialseries,
      binomialseries2,
      binomialseries3,
      binomialseriesrev,
      binomialseries2rev,
      binomialseries3rev
     },
     {                               /* series_appearance */
      ldots0,         /* express series as $a_0 + a_1 + ...$        */
      ldots1,         /* express series as $a_0 + a_1 + a_2 + ... $ */
      ldots2,         /* express series using ... and general term  */
      ldotstosigma,   /* express series using sigma notation        */
      showanotherterm,/* show another term before ...               */
      showmoreterms,  /* show ? more terms before ...               */
      showevaluatedterms, /* show terms with factorials evaluated   */
      showfactorialsinterms, /* do not evaluate factorials in terms */
      showdevaluatedterms,   /* show the coefficients in decimal form */
      showundevaluatedterms  /* do not use decimal form for coefficients */
     },
     {                /* series_algebra                             */
      telescopingseries,
      multiplyseries,
      multiplypowerseries,
      divideseriesbypoly,    /* divide power series by polynomial */
      dividepolybyseries,    /* divide polynomial by power seres  */
      dividepowerseries,
      squareseries,
      squarepowerseries,
      powerofseries,
      addseries,
      subseries
     },
     {                               /* series_manipulations */
                                     /* if the position of intseries changes,
                                        you must modify integrationop in
                                        execute.c */
      seriesfirstterms,     /* split off first few terms */
      seriesmoreterms,      /* decrease lower limit by subtracting terms */
      seriesaddindex,       /* add ? to index variable */
      seriessubindex,       /* subtract ? from index variable */
      renameindexvariable,
      seriessum,            /* �(u+v) = �u + �v  */
      difseries,            /* d/dx �u = � du/dx */
      reversedifseries,     /* � du/dx = d/dx �u */
      intseries,            /* � �u dx = � �u dx */
      reverseintseries,     /* � �u dx = � �u dx */
      evalfirstterms,       /* calculate sum of first few terms */
      seriesintdif,         /* $$u = integral(diff(u,x),x)$$ */
                           /* if positions in this menu change, see selectop.c,
                              search for seriesintdif */
      seriesintdifdef,    /* $$u = integral(diff(u,t),t,0,x) + u(0)$$ */
      seriesdifint,       /* $$u = diff(integral(u,x),x)$$            */
      eliminatecofi,      /* solve for constant of integration        */
      seriesevenandodd,    /* separate terms with even and odd indices */
     },
     {                               /* series_convergence_tests */
      divergencetest,   /* If these change then change the top of series.h too */
      integraltest,
      ratiotest,
      roottest,
      comparisontest1,
      comparisontest2,
      limitcomparisontest,
      condensationtest,
      finishdivergencetest,   /* must change in_loop if these choice numbers change */
      finishintegraltest,
      finishratiotest,
      finishroottest,
      finishcomparisontest1,
      finishcomparisontest2,
      finishlimitcomparisontest,
      finishcondensationtest
     },
     { statefinalbound1,              /* series_convergence2  */
       statefinalbound2,
       harmonicseries,
       zeta2
     },
     {                                /* complex_functions */
      complexlntopolarform,   /* ln(u+iv) = ln(re^(i�)) */
      complexln,              /* ln(re^(i�)) = ln r + i� (-�<���) */
      lnofi,                  /* ln i = i�/2                      */
      lnofminusone,           /* ln(-1) = i�                      */
      lnofnegative,           /* ln(-a) = ln a + i� (a > 0)       */
      complexcos,             /* cos � = [e^(i�) + e^(-i�)]/2     */
      complexsin,             /* sin � = [e^(i�) - e^(-i�)]/2i    */
      complexsqrt,            /* �(re^(i�))=�r e^(i�/2) (0��<2�)  */
      complexroot,            /* ��(re^(i�))=��r e^(i�/n)(0��<2�) */
      complexexponential,     /* e^(i�) = cos � + i sin �         */
      complexexponential2,    /* e^(x+iy) = e^x cos y + i e^x sin y  */
      etotheipi,              /* e^(i�) = -1                      */
      etotheminusipi,         /* e^(-i�) = -1                     */
      etothei2npi,            /* e^(2n�i) = 1                     */
      etothecoterminal,       /* e^((2n� + �)i) = e^(i�)          */
      introducelninexponent   /* u^v = e^(v ln u)                 */
     },
     {                            /* complex_hyperbolic       */
      isinh,                  /* sin(it) = i sinh t               */
      icosh,                  /* cos(it) = cosh t                 */
      coshi,                  /* cosh(it) = cos t                 */
      sinhi,                  /* sinh(it) = i sin t               */
      itanh,                  /* tan(it) =  i tanh t              */
      icoth,                  /* cot(it) = -i coth t              */
      tanhi,                  /* tanh(it) = i tan t               */
      cothi,                  /* coth(it) = -i cot t              */
      cosisin,                /* cos t + i sin t = e^(it)         */
      cosminusisin,           /* cos t - i sin t = e^(-it)        */
      complexcosrev,          /* [e^(i�) + e^(-i�)]/2 = cos �     */
      complexsinrev,          /* [e^(i�) - e^(-i�)]/2i = sin �    */
      complexcosrev2,         /* e^(i�) + e^(-i�) = 2 cos �       */
      complexsinrev2          /* e^(i�) - e^(-i�) = 2i sin �      */
     },
     {                            /* hyperbolic_functions     */
      coshdef,                    /* cosh u = (e^u+e^(-u))/2  */
      coshdefrev2,                /* e^u + e^-u = 2 cosh u    */
      sinhdef,                    /* sinh u = (e^u-e^(-u))/2  */
      sinhdefrev2,                /* e^u-e^(-u) = 2 sinh u    */
      coshdefrev,                 /* e^u-e^(-u) = 2 sinh u    */
      sinhdefrev,                 /* [e^u-e^(-u)]/2 = sinh u  */
      cosheven,                   /* cosh(-u) = cosh u        */
      sinhodd,                    /* sinh(-u) = -sinh u       */
      coshplussinh,               /* cosh u + sinh u = e^u    */
      coshminussinh,              /* cosh u - sinh u = e^(-u) */
      cosh0,                      /* cosh 0 = 1               */
      sinh0,                      /* sinh 0 = 0               */
      exptohyper1,                /* e^x = cosh x + sinh x    */
      exptohyper2                 /* e^(-x) = cosh x - sinh x */
     },
     {                            /* hyperbolic2              */
      sinhsqplus1,                /* sinh�u + 1 = cosh� u     */
      coshsqminus1,               /* cosh� u - 1 = sinh�u     */
      coshsqminussinhsq,          /* cosh� u - sinh�u = 1     */
      coshsqtosinhsq,             /* cosh� u = sinh�u + 1     */
      sinhsqtocoshsq,             /* sinh�u = cosh� u - 1     */
      oneminustanhsq,             /* 1-tan�u = sech�u         */
      oneminussechsq              /* 1-sech�u = tan�u         */
     },
     {                            /* more_hyperbolic          */
      tanhdef,                    /* tanh u = sinh u / cosh u */
      tanhdefrev,                 /* sinh u / cosh u = tanh u */
      cothdef,                    /* coth u = cosh u / sinh u */
      cothdefrev,                 /* cosh u / sinh u = coth u */
      sechdef,                    /* sech u = 1 / cosh u      */
      sechdefrev,                 /* 1 / cosh u = sech u      */
      cschdef,                    /* csch u = 1 / sinh u      */
      cschdefrev,                 /* 1 / sinh u = csch u      */
      tanhsqplussechsq,           /* tanh� u + sech� u = 1    */
      tanhsqtosechsq,             /* tanh� u = 1 - sech� u    */
      sechsqtotanhsq,             /* sech� u = 1 - tanh� u    */
      sinhsum,                    /* sinh(u�v)=sinh u cosh v � cosh u sinh v */
      coshsum,                    /* cosh(u�v)=cosh u cosh v � sinh u sinh v */
      doublesinh,                 /* sinh 2u = 2 sinh u cosh u */
      doublecosh,                 /* cosh 2u = cosh� u + sinh� u  */
      tanhln                      /* tanh(ln u) = (1-u^2)/(1+u^2) */
     },
     {                            /* inverse_hyperbolic       */
      asinhtoln,                  /* ln(x + �(x�+1))          */
      acoshtoln,                  /* ln(x + �(x�-1))          */
      atanhtoln                   /* arctanh x = (1/2) ln((1+x)/(1-x)) */
     },
     {                           /* dif_hyperbolic */
      difsinh,
      difcosh,
      diftanh,
      difcoth,
      difsech,
      difcsch,
      diflnsinh,
      diflncosh
     },
     {                           /* dif_inversehyperbolic */
      difasinh,
      difacosh,
      difatanh,
      difacoth,
      difasech,
      difacsch
     },
     {                           /* sg_function1      */
      sgpos,                 /* sg(x) = 1 if x > 0   */
      sgneg,                 /* sg(x) = -1 if x < 0  */
      sgzero,                /* sg(0) = 0            */
      sgodd,                 /* sg(-x) = -sg(x)      */
      sgodd2,                /* -sg(x) = sg(-x)      */
      sgabs1,                /* sg(x) = abs(x)/x (x nonzero) */
      sgabs2,                /* sg(x) = x/abs(x) (x nonzero) */
      abssg,                 /* abs(x) = x sg(x)     */
      sgevenpower,           /* sg(x)�� = 1, also sg(x)^(even/odd) */
      sgoddpower,            /* sg(x)^(2n+1) = sg(x), also sg(x)^odd/odd */
      sgrecip,               /* 1/sg(x) = sg(x)      */
      difsg,                 /* d/dx sg(u) = 0 (u nonzero) */
      intsg,                 /* integral sg(x) = x sg(x) */
      sgint,                 /* integral(sg(u)v,x) =
                                sg(u) integral(v,x)  if u is nonzero */
      sgassumepos,           /* sg(x) = 1 assuming x > 0 */
      sgassumeneg            /* sg(x) = -1 assuming x < 0 */
     },
     {                             /* sg_function2  */
      sgprod1,               /* sg(au) = sg(u) if a > 0 */
      sgprod2,               /* sg(au) = -sg(u) if a < 0 */
      sgfract1,              /* sg(au/b) = sg(u) if a/b > 0 */
      sgfract2,              /* sg(au/b) = - sg(u) if a/b < 0 */
      sgpower,               /* sg(x^(2n+1)) = sg(x) */
      sgrecip2,              /* sg(1/u) = sg(u) */
      sgrecip3,              /* sg(c/u) = sg(u) si c > 0 */
      sgtoabs,               /* u sg(u) = |u|    */
      abstimessg             /* |u| sg(u) = u   */
     },
     {                           /* bessel_functions */
      difj0,
      difj1,
      difjn,
      dify0,
      dify1,
      difyn
     },
     {                           /* modified_bessel_functions */
      difi0,
      difi1,
      difin,
      difk0,
      difk1,
      difkn
     },
     {                                 /* functions_menu */
       applyfunction0,
       applyfunction1,
       applyfunction2,
       applyfunction3,
       applyfunction4,
       applyfunction5,
       applyfunction6,
       applyfunction7,
       applyfunction8,
       applyfunction9,
       applyfunction10,
       applyfunction11,
       applyfunction12,
       applyfunction13,
       applyfunction14,
       applyfunction15
     },
     {                         /* automode_only */
                               /* brother array at end of this file must always
                                  match this */
       expand,
       multiplyifcancels,
       ordersimplefactors,
       limsum1,
       limsum2,
       limsum3,
       intsqrt,
       doublecos4,
       eliminatesinsq,
       eliminatecossq,
       eliminatetansq,
       eliminatesecsq,
       maximalsub,
       multiplycoefs,
       preparetocancel
     },
     {                             /* automode_only2 */
       knownroot,
       transfereqn,
       transferstrictineq,
       transferineq,
       transfer,      /* works only on intervals */
       contentgcd,
       fractionalsubstitution,
       gcdsubstitution,
       distribandcancel,
       difofpowers,
       limsum4,
       factorhelper,
       factorandcancel,
       factoroneside
     },
     {                             /* automode_only3 */
       unitelns,
       unitelogs,
       unitelns2,
       unitelogs2,
       trigsuminfraction,
       cleanupexponents
     }
};
/*_____________________________________________________________*/
/* when an automode_only operator is used by think_ahead, its
brother from the following table is entered in 'plan' instead of
itself; so this should tell what operator the user should choose
at the point where automode used this operator */
/*_______________________________________________________*/
actualop brother[3][16] =
{
 {
   multiplyout,      /* brother of expand */
   distriblaw,      /* brother of multiplyifcancels */
   orderfactors,     /* brother of ordersimplefactors */
   orderfactors,     /* finishedfactoring always fails, so it doesn't matter
                        what we put in this array for its brother */
   factordenominator, /* brother of limsum1 */
   commondenom,      /* brother of limsum2 */
   eliminatenegexp,  /* brother of limsum3 */
   sqrtexp,          /* brother of intsqrt (integrate square root)  */
   doublecos1,       /* brother of doublecos4 */
   sinsqtocossq,     /* brother of eliminatesinsq */
   cossqtosinsq,     /* brother of eliminatecossq */
   tansqtosecsq,     /* brother of eliminatetansq */
   secsqtotansq,     /* brother of eliminatesecsq */
   makesubstitution, /* brother of maximalsub     */
   multiplyfractions, /* brother of multiplycoefs  */
   sinsqtocossq     /* brother of preparetocancel--doesn't matter what it is. */
 },
 {           /* brothers of operators in automode_only2  */
   evaltorational,   /* brother of knownroot          */
   addeqn,           /* brother of transfereqn        */
   addeqn1,          /* brother of transferstrictineq */
   addeqn2,          /* brother of transferineq       */
   addeqn1,          /* brother of transfer           */
   factorop,         /* brother of contentgcd         */
   makesubstitution, /* brother of fractionalsubstitution */
   makesubstitution, /* brother of gcdsubstitution    */
   distriblaw,       /* brother of distribandcancel   */
   multiplyoutandsimp,   /* brother of difofpowers    */
   tanrule,          /* brother of limsum4; but it could just as
                        well be secrule, secrule2,... */
   contentfactor,    /* brother of factorhelper       */
   differenceofsquares, /* brother of factorandcancel */
   factorsquareofsum /* brother of factoroneside     */
 },
 {                       /* brothers of operators in automode_only3  */
   lnofpower,        /* brother of unitelns           */
   logofpower,       /* brother of unitelogs          */
   lnofproduct,      /* brother of unitelns2          */
   logofproduct,     /* brother of unitelogs2         */
   sumofsin,         /* brother of trigsuminfraction  */
   arithmetic        /* brother of cleanupexponents   */
 }
};



/*_________________________________________________________*/
MEXPORT_AUTOMODE actualop * access_optable(int n)
/* access_optable(i)[j]  replaces optable[i][j]
   from outside symbols.dll  */
{
  return  optable[n];
}
/*_________________________________________________________*/
MEXPORT_AUTOMODE actualop get_brother(int menu, int i)
/* return brother[0][i], brother[1][i], or brother[2][i]
   according as menu is automode_only, automode_only2, automode_only3
*/
{
   switch(menu)
     { case automode_only:
          return brother[0][i];
       case automode_only2:
          return brother[1][i];
       case automode_only3:
          return brother[2][i];
     }
  return NULL;
}
/*__________________________________________________________*/
MEXPORT_AUTOMODE int cousins(operation a, operation b)
/* return 1 if a and b have the same effect, so that
user could have chosen either one.  This is called by
think_ahead when generating error messages:  if b is what
automode would do at step 2 and user chooses a at step 1,
user will get an error message the same as if he chose b
at step 1.  It is presumed that a and b are not equal
(as operators, though the associated actualop might be the
same).  The automode-op comes in a and the user's op
comes in b; the function is not necessarily symmetrical
as operators never used in auto mode don't have to be
listed in b position.
*/

{ actualop A, B;

  A = optable[a.men][a.choice-1];
  B = optable[b.men][b.choice-1];

  if((void  *) A == (void  *) B)
     return 1;   /* same code at different places in menu */
  if( (void  *) A == (void  *) collectall )
     return (void  *) B == (void  *) collectterms;
  if( (void  *) A == (void  *) collectterms )
     return (void  *) B == (void  *) collectall;
  if( (void  *) A == (void  *) commondenom )
     { if( (void  *) B == (void  *) commondenomandsimp ||
           (void  *) B == (void  *) commondenominfraction ||
           (void  *) B == (void  *) commondenom2 ||
           (void  *) B == (void  *) findcommondenom ||
           (void  *) B == (void  *) commondenomandsimp2
         )
           return 1;
       else
           return 0;
     }
  if( (void  *) A == (void  *) commondenomandsimp )
     { if( (void  *) B == (void  *) commondenom ||
           (void  *) B == (void  *) commondenominfraction ||
           (void  *) B == (void  *) commondenom2 ||
           (void  *) B == (void  *) commondenomandsimp2 ||
           (void  *) B == (void  *) findcommondenom
         )
           return 1;
       else
           return 0;
     }
  if( (void  *) A == (void  *) findcommondenom )
     { if( (void  *) B == (void  *) commondenomandsimp ||
           (void  *) B == (void  *) commondenom ||
           (void  *) B == (void  *) commondenominfraction ||
           (void  *) B == (void  *) commondenom2 ||
           (void  *) B == (void  *) commondenomandsimp2
         )
           return 1;
       else
           return 0;
     }
  return 0;
}

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists