Sindbad~EG File Manager

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

/* selection of trig operations for the Term Selection Menu */
/* M. Beeson, for Mathpert */
/* modified 2.21.99
   1.4.00  added itanh and icoth
*/

#define AUTOMODE_DLL
#include <math.h>   /* abs */
#include <string.h>    /* memset */
#include <assert.h>
#include "globals.h"
#include "graphstr.h"
#include "display.h"
#include "document.h"
#include "checkarg.h"
#include "ops.h"
#include "trig.h"
#include "calc.h"
#include "series.h"
#include "display1.h"  /* needed by lterm.h */
#include "bigrect.h"
#include "lterm.h"
#include "selectop.h"
#include "automode.h"
#include "cflags.h"
#include "exec.h"   /* erasecolors, finish_exec */
#include "probtype.h"
#include "ops.h"
#include "trig.h"
#include "calc.h"
#include "pvalaux.h"   /* content_factor         */
                       /* rawcollectpowers       */
#include "order.h"     /* additive_sortargs, common_variables */
#include "prover.h"    /* NOTDEFINED             */
#include "cancel.h"    /* cancel                 */
#include "mplimits.h"  /* LIMITAND               */
#include "match.h"     /* matchstring            */
#include "polynoms.h"  /* ispolyin               */
#include "sigma.h"     /* freevars               */
#include "dowith.h"    /* dowith                 */
#include "factor.h"    /* numerical_poly         */
#include "eqn.h"       /* econstant              */
#include "solvelin.h"  /* is_linear_in           */
#include "intsub.h"    /* readpending            */
#include "exponent.h"  /* possible_int           */
#include "deval.h"

/*_________________________________________________________________*/
static int degrees_complement(term t)
/* return 1 if t has the form deg(90) - x, return 0 otherwise */
{ if(FUNCTOR(t) == '+' &&
     ARITY(t) == 2 &&
     NEGATIVE(ARG(1,t)) &&
     FUNCTOR(ARG(0,t)) == DEG &&
     ISINTEGER(ARG(0,ARG(0,t))) &&
     INTDATA(ARG(0,ARG(0,t))) == 90
    )
     return 1;
  return 0;
}
/*_________________________________________________________________*/
static int radians_complement(term t)
/* return 1 if t has the form pi/2 - x, return 0 otherwise */
{ int j;
  if(FUNCTOR(t) == '+' &&
     ARITY(t) == 2 &&
     NEGATIVE(ARG(1,t)) &&
     equals(ARG(0,t),piover2)
    )
     return 1;
  if(FUNCTOR(t) == '+' && ARITY(t) > 2)
     { for(j=0;j<ARITY(t);j++)
          { if(equals(ARG(j,t),piover2))
               return 1;
          }
     }
  return 0;
}

/*______________________________________________________________________*/
void select_trig_ops(term t, actualop *o, int *nops)
/* finish selectops1 when TRIGFUNCTOR(t)  */
{ term u = ARG(0,t);
  int i=0;
  int k;
  char buffer[DIMREASONBUFFER];
  term w;
  unsigned g = FUNCTOR(u);
  unsigned f = FUNCTOR(t);
  int problemtype = get_problemtype();
  term a,c;
  double z;
  switch(f)
     { case SIN:
          if(problemtype == POWERSERIES)
             { o[i] = sinseries; ++i;
               o[i] = sinseries2; ++i;
               o[i] = sinseries3; ++i;
             }
          if(get_complex() && status(complexsin) >= LEARNING)
             { o[i] = complexsin; ++i;
               if(equals(u,complexi))
                  { o[i] = isinh; ++i;
                  }
               else if(FUNCTOR(u) == '*' && iscomplex(u))
                  { o[i] = isinh; ++i;
                  }
               else if(FRACTION(u) && iscomplex(ARG(0,u)))
                  { o[i] = isinh; ++i;
                  }
             }
          if(contains(u,DEG))
             { if(degrees_complement(u))
                  { o[i] = sintocosdeg; ++i;
                  }
               else
                  { o[i] = sintocos2deg; ++i;
                  }
             }
          else if(radians_complement(u))
             { o[i] = sintocos; ++i;    /* sin(�/2-�) = cos � */
             }
          else
             { o[i] = sintocos2; ++i;   /* sin � = cos(�/2-�) */
             }
          o[i] = sintocsc; ++i;    /* sin u = 1 / csc u */
          if(seminumerical(u))
             { select_trigeval_op(0,t,o+i,&k);
               i+=k;
             }
          else if(!zeroesofsin(t,zero,&w,buffer))
             { o[i] = zeroesofsin; ++i;
             }
          else if(!sin90(t,zero,&w,buffer))
             { o[i] = sin90; ++i;
             }
          else if(!sin45(t,zero,&w,buffer))
             { o[i] = sin45; ++i;
             }
          else if(!sin30(t,zero,&w,buffer))
             { o[i] = sin30; ++i;
             }
          if(NOTDEFINED(u))
             { o[i] = triginfinity; ++i;
             }
          switch(g)
             { case '-':
                  o[i] = sinodd; ++i;
                  break;
               case '+':
                  if(ARITY(u) == 2 && NEGATIVE(ARG(1,u)))
                     { o[i] = sindif; ++i;
                     }
                  else
                     { o[i] = sinsum; ++i;
                     }
                  if(ARITY(u) == 2 && !decompose(u,&a,&c) && !ZERO(c))
                     { /* u = a + c pi */
                       if(iseven(c))
                          { o[i] = sinperiodic; ++i;
                          }
                     }
                  break;
               case '/':
                  if(iseven(ARG(1,u)))
                     { if(seminumerical(t) && !deval(t,&z) && z != BADVAL)
                          { if(z >= 0.0)
                               { o[i] = sinhalf1; ++i;
                               }
                            else if (z <= 0.0)
                               { o[i] = sinhalf2; ++i;
                               }
                          }
                       else
                          { o[i] = sinhalf1; ++i;
                            o[i] = sinhalf2; ++i;
                          }
                     }
                  break;
               case '*':
                  if(!cancel(u,two,&a,&c))
                     { o[i] = doublesin; ++i;
                     }
                  if(!zeroesofsin(t,zero,&w,buffer))
                     { o[i] = zeroesofsin; ++i;
                     }
                  if(!cancel(u,three,&a,&c))
                     { o[i] = triplesin; ++i;
                     }
                  if(ONEHALF(ARG(0,u)))
                     { if(seminumerical(t) && !deval(t,&z) && z != BADVAL)
                          { if(z >= 0.0)
                               { o[i] = sinhalf1; ++i;
                               }
                            else
                               { o[i] = sinhalf2; ++i;
                               }
                          }
                       else
                          { o[i] = sinhalf1; ++i;
                            o[i] = sinhalf2; ++i;
                          }
                     }
                  if(FUNCTOR(u) == '*' && ARITY(u) == 2 &&
                     ISINTEGER(ARG(0,u)) && INTDATA(ARG(0,u)) > 3
                    )
                     { o[i] = expandsin; ++i;
                     }
                  break;
               case ASIN:
                  o[i] = sinasin; ++i;   /* sin(arcsin x) = x          */
                  break;
               case ACOS:
                  o[i] = sinacos; ++i;      /* sin(arccos x) = �(1-x^2)    */
                  break;
               case ATAN:
                  o[i] = sinatan; ++i;      /* sin(arctan x) = x/�(x^2+1)  */
                  break;

             }
          if(NOTDEFINED(u))
             { o[i] = triginfinity; ++i;
             }
          break;
       case COS:
          if(problemtype == POWERSERIES)
             { o[i] = cosseries; ++i;
               o[i] = cosseries2; ++i;
               o[i] = cosseries3; ++i;
             }
          if(get_complex() && status(complexcos) >= LEARNING)
             { o[i] = complexcos; ++i;
               if(equals(u,complexi))
                  { o[i] = icosh; ++i;
                  }
               else if(FUNCTOR(u) == '*' && iscomplex(u))
                  { o[i] = icosh; ++i;
                  }
               else if(FRACTION(u) && iscomplex(ARG(0,u)))
                  { o[i] = icosh; ++i;
                  }
             }
          if(contains(u,DEG))
             { if(degrees_complement(u))
                  { o[i] = costosindeg; ++i;    /* cos(90�-�) = sin � */
                  }
               else
                  { o[i] = costosin2deg; ++i;   /* cos � = sin(90�-�) */
                  }
             }
          else if(radians_complement(u))
             { o[i] = costosin; ++i;   /* cos (�/2-�) = sin � */
             }
          else
             { o[i] = costosin2; ++i;  /* cos � = sin(�/2-�) */
             }
          o[i] = costosec; ++i;        /* cos u = 1/ sec u */
          if(seminumerical(u))
             { select_trigeval_op(0,t,o+i,&k);
               i+= k;
             }
          else if(!sin90(t,zero,&w,buffer))
             { o[i] = sin90; ++i;
             }
          else if(!sin45(t,zero,&w,buffer))
             { o[i] = sin45; ++i;
             }
          else if(!sin30(t,zero,&w,buffer))
             { o[i] = sin30; ++i;
             }
          else if(FUNCTOR(u) == '*' && !onesofcos(t,zero,&w,buffer))
             { o[i] = onesofcos; ++i;
             }
          switch(g)
             { case '-':
                  o[i] = coseven; ++i;
                  break;
               case '+':
                  if(ARITY(u) == 2 && NEGATIVE(ARG(1,u)))
                     { o[i] = cosdif; ++i;
                     }
                  else
                     { o[i] = cossum; ++i;
                     }
                  if(ARITY(u) == 2 && !decompose(u,&a,&c) && !ZERO(c))
                     { /* u = a + c pi */
                       if(iseven(c))
                          { o[i] = cosperiodic; ++i;
                          }
                     }
                  break;
               case '/':
                  if(iseven(ARG(1,u)))
                     { if(seminumerical(t) && !deval(t,&z) && z != BADVAL)
                          { if(z >= 0.0)
                               { o[i] = coshalf1; ++i;
                               }
                            else if (z <= 0.0)
                               { o[i] = coshalf2; ++i;
                               }
                          }
                       else
                          { o[i] = coshalf1; ++i;
                            o[i] = coshalf2; ++i;
                          }
                     }
                  break;
               case '*':
                  if(!cancel(u,two,&a,&c))
                     { o[i] = doublecos1; ++i;
                       o[i] = doublecos2; ++i;
                       o[i] = doublecos3; ++i;
                     }
                  if(!cancel(u,three,&a,&c))
                     { o[i] = triplecos; ++i;
                     }
                  if(ONEHALF(ARG(0,u)))
                     if(seminumerical(t) && !deval(t,&z) && z != BADVAL)
                          { if(z >= 0.0)
                               { o[i] = coshalf1; ++i;
                               }
                            else
                               { o[i] = coshalf2; ++i;
                               }
                          }
                       else
                          { o[i] = coshalf1; ++i;
                            o[i] = coshalf2; ++i;
                          }
                  if(FUNCTOR(u) == '*' && ARITY(u) == 2 &&
                     ISINTEGER(ARG(0,u)) && INTDATA(ARG(0,u)) > 3
                    )
                     { o[i] = expandcos; ++i;
                     }
                  break;
               case ASIN:
                  o[i] = cosasin; ++i;  /* cos(arcsin x) = �(1-x^2)    */
                  break;
               case ACOS:
                  o[i] = cosacos; ++i;  /* cos(arccos x) = x          */
                  break;
               case ATAN:
                  o[i] = cosatan; ++i;   /* cos(arctan x) = 1/�(x^2+1)  */
                  break;

             }
          if(NOTDEFINED(u))
             { o[i] = triginfinity; ++i;
             }
          break;
       case TAN:
          if(ZERO(u) || equals(u,pi))
             { o[i] = zeroesoftan; ++i;
             }
          if(get_complex() && status(complexsin) >= LEARNING)
             {
               if(equals(u,complexi))
                  { o[i] = itanh; ++i;
                  }
               else if(FUNCTOR(u) == '*' && iscomplex(u))
                  { o[i] = itanh; ++i;
                  }
               else if(FRACTION(u) && iscomplex(ARG(0,u)))
                  { o[i] = itanh; ++i;
                  }
             }
          if(contains(u,DEG))
             { if(degrees_complement(u))
                  { o[i] = tantocotdeg; ++i;   /* tan(90�-�) = cot � */
                  }
               else
                  { o[i] = tantocot2deg; ++i;   /* tan � = cot(90�-�) */
                  }
             }
          else if(radians_complement(u))
             { o[i] = tantocot; ++i;      /* tan(�/2-�) = cot � */
             }
          else
             { o[i] = tantocot2; ++i;     /* tan � = cot(�/2-�) */
             }
          o[i] = tanrule; ++i;       /*  tan u = sin u / cos u */
          o[i] = tantodenom; ++i;      /*  tan u = 1/cot u       */
          if(seminumerical(u))
             { select_trigeval_op(0,t,o+i,&k);
               i+=k;
             }
          else if(!zeroesoftan(t,zero,&w,buffer))
             { o[i] = zeroesoftan; ++i;
             }
          else if(!sin90(t,zero,&w,buffer))
             { o[i] = sin90; ++i;
             }
          else if(!sin45(t,zero,&w,buffer))
             { o[i] = sin45; ++i;
             }
          else if(!sin30(t,zero,&w,buffer))
             { o[i] = sin30; ++i;
             }
          switch(g)
             { case '-':
                  o[i] = tanodd; ++i;
                  break;
               case '+':
                  if(ARITY(u) == 2 && NEGATIVE(ARG(1,u)))
                     { o[i] = tandif; ++i;
                     }
                  else
                     { o[i] = tansum; ++i;
                     }
                  if(ARITY(u) == 2 && !decompose(u,&a,&c) && !ZERO(c))
                     { /* u = a + c pi */
                       o[i] = tanperiodic; ++i;
                     }
                  break;
               case '*':
                  if(!cancel(u,two,&a,&c))
                     { o[i] = doubletan; ++i;
                     }
                  if(ONEHALF(ARG(0,u)))
                     { o[i] = tanhalf1; ++i;
                       o[i] = tanhalf2; ++i;
                     }
                  break;
               case '/':
                  if(iseven(ARG(1,u)))
                     { o[i] = tanhalf1; ++i;   /* tan(�/2) = (sin �)/(1+cos �) */
                       o[i] = tanhalf2; ++i;    /* tan(�/2) = (1-cos �)/sin �   */
                     }
                  break;
               case ASIN:
                  o[i] = tanasin; ++i;    /* tan(arcsin x) = x/�(1-x^2)  */
                  break;
               case ACOS:
                  o[i] = tanacos; ++i;    /* tan(arccos x) = �(1-x^2)/x  */
                  break;
               case ATAN:
                  o[i] = tanatan; ++i;    /* tan(arctan x) = x          */
                  break;

             }
          if(NOTDEFINED(u))
             { o[i] = triginfinity; ++i;
             }
          break;
       case COT:
          o[i] = cottotan; ++i;      /* cot u = 1 / tan u      */
          if(contains(u,DEG))
             { if(degrees_complement(u))
                  { o[i] = cotcomplementdeg; ++i;    /* cot(90�-�) = tan � */
                  }
               else
                  { o[i] = cottotan2deg; ++i;        /* cot � = tan(90�-�) */
                  }
             }
          else if(radians_complement(u))
             {  o[i] = cotcomplement; ++i;     /* cot(�/2-�) = tan � */
             }
          else
             { o[i] = cottotan2; ++i;     /* cot � = tan(�/2-�) */
             }
          o[i] = cottosincos; ++i;   /* cot u = cos u / sin u  */
          if(get_complex() && status(complexsin) >= LEARNING)
             { if(equals(u,complexi))
                  { o[i] = icoth; ++i;
                  }
               else if(FUNCTOR(u) == '*' && iscomplex(u))
                  { o[i] = icoth; ++i;
                  }
               else if(FRACTION(u) && iscomplex(ARG(0,u)))
                  { o[i] = icoth; ++i;
                  }
             }
          if(seminumerical(u))
             { select_trigeval_op(0,t,o+i,&k);
               i+=k;
             }
          else if(!sin90(t,zero,&w,buffer))
             { o[i] = sin90; ++i;
             }
          else if(!sin45(t,zero,&w,buffer))
             { o[i] = sin45; ++i;
             }
          else if(!sin30(t,zero,&w,buffer))
             { o[i] = sin30; ++i;
             }
          switch(g)
             { case '-':
                  o[i] = cotodd; ++i;
                  break;
               case '+':
                  if(ARITY(u) == 2 && NEGATIVE(ARG(1,u)))
                     { o[i] = cotdif; ++i;
                     }
                  else
                     { o[i] = cotsum; ++i;
                     }
                  if(ARITY(u) == 2 && !decompose(u,&a,&c) && !ZERO(c))
                     { /* u = a + c pi */
                       o[i] = cotperiodic; ++i;
                     }

                  break;
               case '/':
                  if(iseven(ARG(1,u)))
                     { o[i] = cothalf1; ++i;   /* tan(�/2) = (sin �)/(1+cos �) */
                       o[i] = cothalf2; ++i;    /* tan(�/2) = (1-cos �)/sin �   */
                     }
                  break;
               case '*':
                  if(!cancel(u,two,&a,&c))
                     { o[i] = doublecot; ++i;
                     }
                  if(ONEHALF(ARG(0,u)))
                     { o[i] = cothalf1; ++i;
                       o[i] = cothalf2; ++i;
                     }
                  break;
             }
          if(NOTDEFINED(u))
             { o[i] = triginfinity; ++i;
             }
          break;

       case SEC:
          o[i] = secrule; ++i;  /* sec u = 1 / cos u  */
          if(contains(u,DEG))
             { if(degrees_complement(u))
                  { o[i] = seccomplementdeg; ++i;
                  }
               else
                  { o[i] = sectocsc2deg; ++i;     /* sec � = csc(90�-�) */
                  }
             }
          else if(radians_complement(u))
             { o[i] = seccomplement; ++i;     /* sec(�/2-�) = csc � */
             }
          else
             { o[i] = sectocsc2; ++i; /* sec � = csc(�/2-�) */
             }
          if(seminumerical(u))
             { select_trigeval_op(0,t,o+i,&k);
               i+=k;
             }
          else if(!sin90(t,zero,&w,buffer))
             { o[i] = sin90; ++i;
             }
          else if(!sin45(t,zero,&w,buffer))
             { o[i] = sin45; ++i;
             }
          else if(!sin30(t,zero,&w,buffer))
             { o[i] = sin30; ++i;
             }
          switch(g)
             { case '-':
                  o[i] = seceven; ++i;
                  break;
               case '+':
                  if(ARITY(u) == 2 && !decompose(u,&a,&c) && !ZERO(c))
                     { /* u = a + c pi */
                       if(iseven(c))
                          { o[i] = secperiodic; ++i;
                          }
                     }
                  break;
               case ASIN:
                  o[i] = secasin; ++i;    /* sec(arcsin x) = 1/�(1-x^2)  */
                  break;
               case ACOS:
                  o[i] = secacos; ++i;     /* sec(arccos x) = 1/x        */
                  break;
               case ATAN:
                  o[i] = secatan; ++i;     /* sec(arctan x) = �(x^2+1)    */
                  break;
             }
          if(NOTDEFINED(u))
             { o[i] = triginfinity; ++i;
             }
          break;
       case CSC:
          o[i] = cscrule; ++i;  /* csc u = 1 / sin u  */
          if(contains(u,DEG))
             { if(degrees_complement(u))
                  { o[i] = csccomplementdeg; ++i;   /* csc(90�-�) = sec � */
                  }
               else
                  { o[i] = csctosec2deg; ++i;     /* csc � = sec(90�-�) */
                  }
             }
          else if(radians_complement(u))
             { o[i] = csccomplement; ++i;    /* csc(�/2-�) = sec � */
             }
          else
             { o[i] = csctosec2; ++i; /* csc � = sec(�/2-�) */
             }
          if(seminumerical(u))
             { select_trigeval_op(0,t,o+i,&k);
               i+=k;
             }
          else if(!sin90(t,zero,&w,buffer))
             { o[i] = sin90; ++i;
             }
          else if(!sin45(t,zero,&w,buffer))
             { o[i] = sin45; ++i;
             }
          else if(!sin30(t,zero,&w,buffer))
             { o[i] = sin30; ++i;
             }
          switch(g)
             { case '-':
                  o[i] = cscodd; ++i;
                  break;
               case '+':
                  if(ARITY(u) == 2 && !decompose(u,&a,&c) && !ZERO(c))
                     { /* u = a + c pi */
                       if(iseven(c))
                          { o[i] = cscperiodic; ++i;
                          }
                     }
                  break;
             }
          if(NOTDEFINED(u))
             { o[i] = triginfinity; ++i;
             }
          break;
     }
  *nops = i;
}

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