Sindbad~EG File Manager

Current Path : /usr/home/beeson/Otter-Lambda/yyy/series/
Upload File :
Current File : /usr/home/beeson/Otter-Lambda/yyy/series/gseries.c

/* infinite series, variations on geometric series operations */
/* M. Beeson, for Mathpert */
/*
1.13.99 original date
1.21.99 last modified
*/

#include <string.h>
#include <assert.h>
#define SERIES_DLL
#include "globals.h"
#include "series.h"
#include "match.h"
#include "prover.h"  /*  getnewintvar1 */
#include "symbols.h"
#include "errbuf.h"
#include "psubst.h"
#include "pvalaux.h"  /* twoparts */
#include "ssolve.h"
#include "islinear.h"
/*_______________________________________________________________*/
MEXPORT_SERIES int xoveroneminusxseries(term t, term arg, term *next, char *reason)
/* x/(1-x) = sum(x^n,n,1,infinity) */
{ int flag=0;
  term a,temp,denom;
  int err;
  term n;
  short savenextassumption = get_nextassumption();
  if(!FRACTION(t))
     return 1;
  denom = ARG(1,t);
  if(FUNCTOR(denom) != '+' || ARITY(denom) != 2)
     return 1;
  temp = make_fraction(var0,sum(one,tnegate(var0)));
  err = unify1(temp,t,&a,&flag);
  if(err)
     { RELEASE(ARG(1,temp));
       RELEASE(temp);
       return 1;
     }
  n = getnewindexvar(t,"knmjpqrs");
  if(FUNCTOR(n) == ILLEGAL)
     { errbuf(0, english(1448));
       /* Too many subscripted variables, can't make more. */
       return 1;
     }
  err = check(lessthan(abs1(a),one));
  if(err)
     { errbuf(0,english(2325)); /* The resulting series would not be convergent */
       set_nextassumption(savenextassumption);
       return 1;
     }
  err = infer(equation(a,zero));
  if(!err)
     { errbuf(0,english(2326));  /* The resulting series would converge only at isolated points */
       set_nextassumption(savenextassumption);
       return 1;
     }
  *next = sigma(make_power(a,n),n,one,infinity);
  HIGHLIGHT(*next);
  strcpy(reason,"$$x/(1-x) = sum(x^n,n,1,infinity)$$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int xoveroneminusxseries2(term t, term arg, term *next, char *reason)
{ term temp;
  int err = xoveroneminusxseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),tnegate(three));
  HIGHLIGHT(*next);
  strcpy(reason,"$x/(1-x)=x+x^2+x^3+...$");
  return 0;
}

/*_______________________________________________________________*/
MEXPORT_SERIES int xoveroneminusxseries3(term t, term arg, term *next, char *reason)
/* x/(1+x) = ...  with 2 terms and ldots and general term */
{ term temp;
  int err = xoveroneminusxseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),two);
  HIGHLIGHT(*next);
  strcpy(reason,"$x/(1-x)=x+x^2+...x�...$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int xoveroneplusxseries(term t, term arg, term *next, char *reason)
/* x/(1+x) = sum((-1)^(n+1) x^n,n,1,infinity) */
{ int flag=0;
  term a,temp,denom;
  short savenextassumption = get_nextassumption();
  int err;
  term n;
  if(!FRACTION(t))
     return 1;
  denom = ARG(1,t);
  if(FUNCTOR(denom) != '+' || ARITY(denom) != 2)
     return 1;
  if(ONE(ARG(1,denom)))
     temp = make_fraction(var0,sum(var0,one));
  else
     temp = make_fraction(var0,sum(one,var0));
  err = unify1(temp,t,&a,&flag);
  if(err)
      { RELEASE(ARG(1,temp));
        RELEASE(temp);
        return 1;
      }
  n = getnewindexvar(t,"knmjpqrs");
  if(FUNCTOR(n) == ILLEGAL)
     { errbuf(0, english(1448));
       /* Too many subscripted variables, can't make more. */
       return 1;
     }
  err = check(lessthan(abs1(a),one));
  if(err)
     { errbuf(0,english(2325)); /* The resulting series would not be convergent */
       set_nextassumption(savenextassumption);
       return 1;
     }
  err = infer(equation(a,zero));
  if(!err)
     { errbuf(0,english(2326));  /* The resulting series would converge only at isolated points */
       set_nextassumption(savenextassumption);
       return 1;
     }
  *next = sigma(product(make_power(minusone,sum(n,one)),make_power(a,n)),n,one,infinity);
  HIGHLIGHT(*next);
  strcpy(reason,"$$x/(1+x) = sum((-1)^(n+1)x^n,n,1,infinity)$$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int xoveroneplusxseries2(term t, term arg, term *next, char *reason)
{ term temp;
  int err = xoveroneplusxseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),tnegate(three));
  HIGHLIGHT(*next);
  strcpy(reason,"$x/(1+x)=x-x^2+x^3+...$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int xoveroneplusxseries3(term t, term arg, term *next, char *reason)
/* x/(1+x) = ...  with 2 terms and ldots and general term */
{ term temp;
  int err = xoveroneplusxseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),two);
  HIGHLIGHT(*next);
  strcpy(reason,"$x/(1+x) =            x-x^2+...(-1)^nx�...$");
  return 0;
}
/*________________________________________________________________*/
MEXPORT_SERIES int oneoveroneminusxkseries(term t, term arg, term *next, char *reason)
{ int flag=0;
  term a,b,k,w,temp,denom;
  int err;
  term n;
  short savenextassumption = get_nextassumption();
  if(!FRACTION(t))
     return 1;
  denom = ARG(1,t);
  if(FUNCTOR(denom) != '+' || ARITY(denom) != 2)
     return 1;
  temp = make_fraction(one,sum(one,tnegate(var0)));
  err = unify1(temp,t,&b,&flag);
  if(err || FUNCTOR(b)!= '^')
     { RELEASE(ARG(1,temp));
       RELEASE(temp);
       return 1;
     }
  a = ARG(0,b);
  k = ARG(1,b);
  n = getnewindexvar(t,"knmjpqrs");
  if(FUNCTOR(n) == ILLEGAL)
     { errbuf(0, english(1448));
       /* Too many subscripted variables, can't make more. */
       return 1;
     }
  err = check(lessthan(abs1(a),one));
  if(err)
     { errbuf(0,english(2325)); /* The resulting series would not be convergent */
       set_nextassumption(savenextassumption);
       return 1;
     }
  err = infer(equation(a,zero));
  if(!err)
     { errbuf(0,english(2326));  /* The resulting series would converge only at isolated points */
       set_nextassumption(savenextassumption);
       return 1;
     }
  polyval(product(n,k),&w);
  *next = sigma(make_power(a,w),n,zero,infinity);
  HIGHLIGHT(*next);
  strcpy(reason,"$$1/(1-x^k) = sum(x^(nk),n,0,infinity)$$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int oneoveroneminusxkseries2(term t, term arg, term *next, char *reason)
{ term temp;
  int err = oneoveroneminusxkseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),tnegate(three));
  HIGHLIGHT(*next);
  strcpy(reason,"$$1/(1-x^k) = sum(x^(nk),n,0,infinity,-3)$$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int oneoveroneminusxkseries3(term t, term arg, term *next, char *reason)
/* x/(1+x) = ...  with 2 terms and ldots and general term */
{ term temp;
  int err = oneoveroneminusxkseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),two);
  HIGHLIGHT(*next);
  strcpy(reason,"$$1/(1-x^k) = sum(x^(nk),n,0,infinity,2)$$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int oneoveroneplusxkseries(term t, term arg, term *next, char *reason)
{ int flag=0;
  term a,b,k,w,temp,denom;
  int err;
  term n;
  short savenextassumption = get_nextassumption();
  if(!FRACTION(t))
     return 1;
  denom = ARG(1,t);
  if(FUNCTOR(denom) != '+' || ARITY(denom) != 2)
     return 1;
  temp = make_fraction(one,sum(one,var0));
  err = unify1(temp,t,&b,&flag);
  if(err || FUNCTOR(b)!= '^')
     { RELEASE(ARG(1,temp));
       RELEASE(temp);
       return 1;
     }
  a = ARG(0,b);
  k = ARG(1,b);
  n = getnewindexvar(t,"knmjpqrs");
  if(FUNCTOR(n) == ILLEGAL)
     { errbuf(0, english(1448));
       /* Too many subscripted variables, can't make more. */
       return 1;
     }
  err = check(lessthan(abs1(a),one));
  if(err)
     { errbuf(0,english(2325)); /* The resulting series would not be convergent */
       set_nextassumption(savenextassumption);
       return 1;
     }
  err = infer(equation(a,zero));
  if(!err)
     { errbuf(0,english(2326));  /* The resulting series would converge only at isolated points */
       set_nextassumption(savenextassumption);
       return 1;
     }
  polyval(product(n,k),&w);
  polyval(product(make_power(minusone,n),make_power(a,w)),&temp);
  *next = sigma(temp,n,zero,infinity);
  HIGHLIGHT(*next);
  strcpy(reason,"$$1/(1+x^k) = sum((-1)^n x^(nk),n,0,infinity)$$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int oneoveroneplusxkseries2(term t, term arg, term *next, char *reason)
{ term temp;
  int err = oneoveroneplusxkseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),tnegate(three));
  HIGHLIGHT(*next);
  strcpy(reason,"$$1/(1+x^k) = sum((-1)^n x^(nk),n,0,infinity,-3)$$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int oneoveroneplusxkseries3(term t, term arg, term *next, char *reason)
/* x/(1+x) = ...  with 2 terms and ldots and general term */
{ term temp;
  int err = oneoveroneplusxkseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),two);
  HIGHLIGHT(*next);
  strcpy(reason,"$$1/(1+x^k) = sum((-1)^n x^(nk),n,0,infinity,2)$$");
  return 0;
}
/*_________________________________________________________________*/
MEXPORT_SERIES int geometricseriesfromk(term t, term arg, term *next, char *reason)
/* x^k/(1-x) = sum(x^n,n,k,infinity) */
{ int flag[2];
  term a,c[2],temp,denom,k;
  int err;
  term n;
  short savenextassumption = get_nextassumption();
  if(!FRACTION(t))
     return 1;
  denom = ARG(1,t);
  if(FUNCTOR(denom) != '+' || ARITY(denom) != 2)
     return 1;
  temp = make_fraction(make_power(var0,var1),sum(one,tnegate(var0)));
  flag[0] = flag[1] = 0;
  err = unify1(temp,t,c,flag);
  if(err)
     { RELEASE(ARG(1,temp));
       RELEASE(temp);
       return 1;
     }
  k = c[1];
  a = c[0];
  if(!ISINTEGER(k))
     { term q = lpt(type(k,INTEGER));
       if(!equals(q,true))
          return 1;
     }
  n = getnewindexvar(t,"knmjpqrs");
  if(FUNCTOR(n) == ILLEGAL)
     { errbuf(0, english(1448));
       /* Too many subscripted variables, can't make more. */
       return 1;
     }
  err = check(lessthan(abs1(a),one));
  if(err)
     { errbuf(0,english(2325)); /* The resulting series would not be convergent */
       set_nextassumption(savenextassumption);
       return 1;
     }
  err = infer(equation(a,zero));
  if(!err)
     { errbuf(0,english(2326));  /* The resulting series would converge only at isolated points */
       set_nextassumption(savenextassumption);
       return 1;
     }
  *next = sigma(make_power(a,n),n,k,infinity);
  HIGHLIGHT(*next);
  strcpy(reason,"$$x^k/(1-x) = sum(x^n,n,k,infinity)$$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int geometricseriesfromk2(term t, term arg, term *next, char *reason)
{ term temp;
  int err = geometricseriesfromk(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),tnegate(three));
  HIGHLIGHT(*next);
  strcpy(reason,"$x^k/(1-x)=x^k+x^(k+1)+...$");
  return 0;
}

/*_______________________________________________________________*/
MEXPORT_SERIES int geometricseriesfromk3(term t, term arg, term *next, char *reason)
/* x/(1+x) = ...  with 2 terms and ldots and general term */
{ term temp;
  int err = geometricseriesfromk(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),two);
  HIGHLIGHT(*next);
  strcpy(reason,"$x^k/(1-x) =            x^k+x^(k+1)+...x�...$");
  return 0;
}

/*_________________________________________________________________*/
MEXPORT_SERIES int geometricseriesminusfromk(term t, term arg, term *next, char *reason)
{ int flag[2];
  term a,c[2],temp,denom,k;
  int err;
  term n;
  short savenextassumption = get_nextassumption();
  if(!FRACTION(t))
     return 1;
  denom = ARG(1,t);
  if(FUNCTOR(denom) != '+' || ARITY(denom) != 2)
     return 1;
  temp = make_fraction(make_power(var0,var1),sum(one,var0));
  flag[0] = flag[1] = 0;
  err = unify1(temp,t,c,flag);
  if(err)
     { RELEASE(ARG(1,temp));
       RELEASE(temp);
       return 1;
     }
  k = c[1];
  a = c[0];
  if(!ISINTEGER(k))
     { term q = lpt(type(k,INTEGER));
       if(!equals(q,true))
          return 1;
     }
  n = getnewindexvar(t,"knmjpqrs");
  if(FUNCTOR(n) == ILLEGAL)
     { errbuf(0, english(1448));
       /* Too many subscripted variables, can't make more. */
       return 1;
     }
  err = check(lessthan(abs1(a),one));
  if(err)
     { errbuf(0,english(2325)); /* The resulting series would not be convergent */
       set_nextassumption(savenextassumption);
       return 1;
     }
  err = infer(equation(a,zero));
  if(!err)
     { errbuf(0,english(2326));  /* The resulting series would converge only at isolated points */
       set_nextassumption(savenextassumption);
       return 1;
     }
  *next = sigma(product(make_power(minusone,n),make_power(a,n)),n,k,infinity);
  HIGHLIGHT(*next);
  strcpy(reason,"$$x^k/(1+x) = sum((-1)^n x^n,n,k,infinity)$$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int geometricseriesminusfromk2(term t, term arg, term *next, char *reason)
{ term temp;
  int err = geometricseriesminusfromk(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),tnegate(three));
  HIGHLIGHT(*next);
  strcpy(reason,"$x^k/(1+x)=x^k-x^(k+1)+...$");
  return 0;
}

/*_______________________________________________________________*/
MEXPORT_SERIES int geometricseriesminusfromk3(term t, term arg, term *next, char *reason)
/* x/(1+x) = ...  with 2 terms and ldots and general term */
{ term temp;
  int err = geometricseriesminusfromk(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),two);
  HIGHLIGHT(*next);
  strcpy(reason,"$x^k/(1+x) =            x^k-x^(k+1)+...x�...$");
  return 0;
}
/*________________________________________________________________*/
MEXPORT_SERIES int xmoveroneplusxkseries(term t, term arg, term *next, char *reason)
/* x^m/(1+x^k) = sum((-1)^n x^(kn+m),n,0,infinity) */
{ int flag[2];
  term a,c[2],temp,denom,k,power,m;
  int err,saveorderflag;
  term n;
  short savenextassumption = get_nextassumption();
  if(!FRACTION(t))
     return 1;
  denom = ARG(1,t);
  if(FUNCTOR(denom) != '+' || ARITY(denom) != 2)
     return 1;
  temp = make_fraction(var0,sum(one,var1));
  flag[0] = flag[1] = 0;
  err = unify1(temp,t,c,flag);
  if(err)
     { RELEASE(ARG(1,temp));
       RELEASE(temp);
       return 1;
     }
  if(FUNCTOR(c[1]) != '^')
     return 1;
  a = ARG(0,c[1]);
  k = ARG(1,c[1]);
  if(equals(c[0],a))
     m = one;
  else if(FUNCTOR(c[0]) == '^' && equals(ARG(0,c[0]),a))
     m = ARG(1,c[0]);
  else
     return 1;
  n = getnewindexvar(t,"knmjpqrs");
  if(FUNCTOR(n) == ILLEGAL)
     { errbuf(0, english(1448));
       /* Too many subscripted variables, can't make more. */
       return 1;
     }
  err = check(lessthan(abs1(a),one));
  if(err)
     { errbuf(0,english(2325)); /* The resulting series would not be convergent */
       set_nextassumption(savenextassumption);
       return 1;
     }
  err = infer(equation(a,zero));
  if(!err)
     { errbuf(0,english(2326));  /* The resulting series would converge only at isolated points */
       set_nextassumption(savenextassumption);
       return 1;
     }
  saveorderflag = get_orderflag();
  set_orderflag(DESCENDING);
  polyval(sum(product(k,n),m),&power);
  set_orderflag(saveorderflag);
  *next = sigma(product(make_power(minusone,n),make_power(a,power)),n,zero,infinity);
  HIGHLIGHT(*next);
  strcpy(reason,"$$x^m/(1+x^k) = sum((-1)^n x^(kn+m),n,k,infinity)$$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int xmoveroneplusxkseries2(term t, term arg, term *next, char *reason)
{ term temp;
  int err = xmoveroneplusxkseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),tnegate(three));
  HIGHLIGHT(*next);
  strcpy(reason,"$x^m/(1+x^k) =           x^m-x^(k+m)+x^(2k+m)+...$");
  return 0;
}

/*_______________________________________________________________*/
MEXPORT_SERIES int xmoveroneplusxkseries3(term t, term arg, term *next, char *reason)
/* x/(1+x) = ...  with 2 terms and ldots and general term */
{ term temp;
  int err = xmoveroneplusxkseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),two);
  HIGHLIGHT(*next);
  strcpy(reason,"$x^m/(1+x^k) = x^m-x^(k+m)  +...(-1)^nx^(kn+m)...$");
  return 0;
}


/*________________________________________________________________*/
MEXPORT_SERIES int xmoveroneminusxkseries(term t, term arg, term *next, char *reason)
/* x^m/(1-x^k) = sum(x^(kn+m),n,0,infinity) */
{ int flag[2];
  term a,c[2],temp,denom,k,power,m;
  int err,saveorderflag;
  term n;
  short savenextassumption = get_nextassumption();
  if(!FRACTION(t))
     return 1;
  denom = ARG(1,t);
  if(FUNCTOR(denom) != '+' || ARITY(denom) != 2)
     return 1;
  temp = make_fraction(var0,sum(one,tnegate(var1)));
  flag[0] = flag[1] = 0;
  err = unify1(temp,t,c,flag);
  if(err)
     { RELEASE(ARG(1,temp));
       RELEASE(temp);
       return 1;
     }
  if(FUNCTOR(c[1]) != '^')
     return 1;
  a = ARG(0,c[1]);
  k = ARG(1,c[1]);
  if(equals(c[0],a))
     m = one;
  else if(FUNCTOR(c[0]) == '^' && equals(ARG(0,c[0]),a))
     m = ARG(1,c[0]);
  else
     return 1;
  n = getnewindexvar(t,"knmjpqrs");
  if(FUNCTOR(n) == ILLEGAL)
     { errbuf(0, english(1448));
       /* Too many subscripted variables, can't make more. */
       return 1;
     }
  err = check(lessthan(abs1(a),one));
  if(err)
     { errbuf(0,english(2325)); /* The resulting series would not be convergent */
       set_nextassumption(savenextassumption);
       return 1;
     }
  err = infer(equation(a,zero));
  if(!err)
     { errbuf(0,english(2326));  /* The resulting series would converge only at isolated points */
       set_nextassumption(savenextassumption);
       return 1;
     }
  saveorderflag = get_orderflag();
  set_orderflag(DESCENDING);
  polyval(sum(product(k,n),m),&power);
  set_orderflag(saveorderflag);
  *next = sigma(make_power(a,power),n,zero,infinity);
  HIGHLIGHT(*next);
  strcpy(reason,"$$x^m/(1-x^k) = sum(x^(kn+m),n,k,infinity)$$");
  return 0;
}
/*_______________________________________________________________*/
MEXPORT_SERIES int xmoveroneminusxkseries2(term t, term arg, term *next, char *reason)
{ term temp;
  int err = xmoveroneminusxkseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),tnegate(three));
  HIGHLIGHT(*next);
  strcpy(reason,"$x^m/(1+x^k) =           x^m+x^(k+m)+x^(2k+m)+...$");
  return 0;
}

/*_______________________________________________________________*/
MEXPORT_SERIES int xmoveroneminusxkseries3(term t, term arg, term *next, char *reason)
/* x/(1+x) = ...  with 2 terms and ldots and general term */
{ term temp;
  int err = xmoveroneminusxkseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),two);
  HIGHLIGHT(*next);
  strcpy(reason,"$x^m/(1+x^k) =           x^m+x^(k+m)+...x^(kn+m)...$");
  return 0;
}

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