Sindbad~EG File Manager
/* M. Beeson, for Mathpert */
/* Original date 5.5.97 */
/* Last modified 6.14.98 */
/* 3.20.06 removed duplicate include polynoms.h
5.5.13 changed malloc.h to stdlib.h
*/
#include <assert.h>
#include <stdlib.h> /* alloca */
#include <math.h> /* fabs */
#include "globals.h"
#include "prover.h"
#include "polynoms.h"
#include "cancel.h"
#include "order.h"
#include "deriv.h"
#include "eqn.h"
#include "algaux.h"
#include "trigpoly.h"
#include "trigdom.h"
#include "reset.h"
#include "userfunc.h"
#include "sturm.h" /* nroots */
#include "pvalaux.h" /* obviously_positive */
#include "polyquo.h" /* make_polyquo */
#include "psubst.h"
#include "islinear.h"
#include "factor.h" /* sqrt_aux */
#include "deval.h"
#include "periodic.h" /* periodic_in */
#include "trigatr.h" /* trig_arctrig_singularities */
#include "trigsimp.h"
/*_____________________________________________________________*/
int trig_arctrig_singularities(unsigned short g, unsigned short h, term x, term *ans, term *jumps)
/* g is a trig functor, h is an arctrig functor.
Find the singularities and jumps of g(h(x)) and return
them in *ans and *jumps. Return 0 for success, 1 for failure.
*/
{ int err;
term temp;
switch(g)
{ case TAN:
switch(h)
{ case ATAN:
return singularities(x,ans,jumps);
case ACOS:
/* tan(arccos x) = sqrt(1-x^2)/x */
err = singularities(x,&temp,jumps);
if(err)
return 1;
return zeroes(x,ans);
case ACSC:
/* tan(acsc x) = 1/sqrt(x^2-1) */
/* fall through */
case ASIN:
/* tan(asin x) = x / sqrt(1-x^2) */
err = singularities(x,&temp,jumps);
if(err)
return 1;
return zeroes(sum(make_power(x,two),minusone),ans);
case ASEC:
/* tan(asec x) = sqrt(x^2-1) */
return singularities(x,ans,jumps);
case ACOT:
/* tan(acot x) = 1/x */
err = singularities(x,&temp,jumps);
if(err)
return 1;
return zeroes(x,ans);
default:
assert(0);
}
break;
case SIN:
switch(h)
{ case ASIN:
return singularities(x,ans,jumps);
case ACOS:
/* sin(arccos x) = sqrt(1-x^2) */
err = singularities(x,ans,jumps);
if(err)
return 1;
*ans = falseterm;
return 0;
case ATAN:
/* sin(arctan x) = x/sqrt(x^2+1) */
/* for large x this is appx 1-1/(2x^2) */
err = singularities(x,ans,jumps);
if(err)
return 1;
*ans = falseterm;
return 0;
case ASEC:
/* sin(arcsec x) = sqrt(x^2-1) */
return singularities(x,ans,jumps);
case ACSC:
/* sin(arccsc x) = 1/x */
err = singularities(x,&temp,jumps);
if(err)
return 1;
return zeroes(x,ans);
case ACOT:
/* sin(arccot x) = 1/sqrt(x^2 + 1) */
err = singularities(x,ans,jumps);
if(err)
return 1;
*ans = falseterm;
return 0;
}
break;
case COS:
switch(h)
{ case ACOS:
/* cos(arccos x) = x */
return singularities(x,ans,jumps);
case ASIN:
/* cos(arcsin x) = sqrt(1-x^2) */
err = singularities(x,&temp,jumps);
if(err)
return 1;
*ans = falseterm;
return 0;
case ATAN:
/* cos(arctan x) = 1/sqrt(x^2+1) */
return singularities(x,ans,jumps);
case ACOT:
/* cos(arccot x) = x/sqrt(x^2+1) */
err = singularities(x,ans,jumps);
if(err)
return 1;
*ans = falseterm;
return 0;
case ACSC:
/* cos(arccsc x) = sqrt(x^2-1)/x */
err = singularities(x,ans,jumps);
if(err)
return 1;
return zeroes(x,ans);
case ASEC:
/* cos(arcsec x) = 1/x */
err = singularities(x,&temp,jumps);
if(err)
return 1;
return zeroes(x,ans);
default:
assert(0);
}
break;
case SEC:
switch(h)
{ case ACOS:
/* sec(arccos x) = 1/x */
err = singularities(x,ans,jumps);
if(err)
return 1;
return zeroes(x,ans);
case ASIN:
/* sec(arcsin x) = 1/sqrt(1-x^2) */
err = singularities(x,&temp,jumps);
if(err)
return 1;
*ans = falseterm;
return 0;
case ATAN:
/* sec(arctan x) = sqrt(x^2+1) */
return singularities(x,ans,jumps);
case ACOT:
/* sec(arccot x) = sqrt(x^2+1)/x */
err = singularities(x,ans,jumps);
if(err)
return 1;
*ans = falseterm;
return 0;
case ACSC:
/* sec(arccsc x) = x/sqrt(x^2-1) */
err = singularities(x,ans,jumps);
if(err)
return 1;
return zeroes(sum(make_power(x,two),minusone),ans);
case ASEC:
/* sec(arcsec x) = x */
return singularities(x,&temp,jumps);
default:
assert(0);
}
break;
case CSC:
switch(h)
{ case ASIN:
/* csc(arcsin x) = 1/x */
err = singularities(x,ans,jumps);
if(err)
return 1;
return zeroes(x,ans);
case ACOS:
/* csc(arccos x) = 1/ sqrt(1-x^2) */
err = singularities(x,ans,jumps);
if(err)
return 1;
*ans = falseterm;
return 0;
case ATAN:
/* csc(arctan x) = sqrt(x^2+1)/x */
err = singularities(x,ans,jumps);
if(err)
return 1;
*ans = falseterm;
return 0;
case ASEC:
/* csc(arcsec x) = 1/sqrt(x^2-1) */
err = singularities(x,ans,jumps);
if(err)
return 1;
return zeroes(sum(make_power(x,two),minusone),ans);
case ACSC:
/* csc(arccsc x) = x */
return singularities(x,&temp,jumps);
case ACOT:
/* csc(arccot x) = sqrt(x^2 + 1) */
err = singularities(x,ans,jumps);
if(err)
return 1;
*ans = falseterm;
return 0;
default:
assert(0);
}
break;
case COT:
switch(h)
{ case ATAN:
/* cot(arctan x) = 1/x */
err = singularities(x,ans,jumps);
if(err)
return 1;
return zeroes(x,ans);
case ACOS:
/* cot(arccos x) = x/sqrt(1-x^2) */
err = singularities(x,&temp,jumps);
if(err)
return 1;
return zeroes(sum(make_power(x,two),minusone),ans);
case ACSC:
/* cot(acsc x) = sqrt(x^2-1) */
return singularities(x,ans,jumps);
case ASIN:
/* cot(asin x) = sqrt(1-x^2)/x */
err = singularities(x,&temp,jumps);
if(err)
return 1;
return zeroes(x,ans);
case ASEC:
/* cot(asec x) = 1/sqrt(x^2-1) */
err = singularities(x,ans,jumps);
if(err)
return 1;
return zeroes(sum(make_power(x,two),minusone),ans);
case ACOT:
/* cot(acot x) = x */
return singularities(x,&temp,jumps);
default:
assert(0);
}
}
return 1;
}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists