Sindbad~EG File Manager
/* 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