Sindbad~EG File Manager

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

/* binomial series, for Mathpert, by M. Beeson
Original date 1.15.99
Last modified 1.15.99
*/

#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"
#include "cancel.h"
#include "pathtail.h"
#include "autosimp.h"  /* SetShowStepOperation */

MEXPORT_SERIES int binomialseries(term t, term arg, term *next, char *reason)
/* (1+x)^alpha = sum(binomial(alpha,k)x^k,k,0,infinity) */
{ int sign =1;
  term alpha,u,x;
  int err;
  term n;
  short savenextassumption = get_nextassumption();
  if(FUNCTOR(t) != '^')
     return 1;
  alpha = ARG(1,t);
  u = ARG(0,t);
  if(FUNCTOR(u) != '+' || ARITY(u) != 2)
     return 1;
  if(ONE(ARG(0,u)))
     x = ARG(1,u);
  else if(ONE(ARG(1,u)))
     x = ARG(0,u);
  else
     return 1;
  if(NEGATIVE(x))
     { x = ARG(0,x);
		 sign = -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(x),one));
  if(err)
     { errbuf(0,english(2325)); /* The resulting series would not be convergent */
       set_nextassumption(savenextassumption);
       return 1;
     }
  err = infer(equation(x,zero));
  if(!err)
     { errbuf(0,english(2326));  /* The resulting series would converge only at isolated points */
       set_nextassumption(savenextassumption);
       return 1;
     }
  if(sign == 1)
     *next = sigma(product(make_binomial(alpha,n),make_power(x,n)),n,zero,infinity);
  else
     *next = sigma(product3(make_power(minusone,n),make_binomial(alpha,n),make_power(x,n)),n,zero,infinity);
  HIGHLIGHT(*next);
  strcpy(reason,"$$(1+x)^alpha = sum(binomial(alpha,n)x^n,n,0,infinity)$$");
  return 0;
}
/*__________________________________________________________________________*/
MEXPORT_SERIES int binomialseries2(term t, term arg, term *next, char *reason)
{ term temp;
  int err = binomialseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),tnegate(three));
  strcpy(reason,"$$(1+x)^alpha = sum(binomial(alpha,n)x^n,n,0,infinity,-3)$$");
  return 0;
}
/*__________________________________________________________________________*/
MEXPORT_SERIES int binomialseries3(term t, term arg, term *next, char *reason)
{ term temp;
  int err = binomialseries(t,arg,&temp,reason);
  if(err)
     return 1;
  *next = series(ARG(0,temp),ARG(1,temp),ARG(2,temp),ARG(3,temp),two);
  strcpy(reason,"$$(1+x)^alpha = sum(binomial(alpha,n)x^n,n,0,infinity,2)$$");
  return 0;
}
/*__________________________________________________________________________*/
MEXPORT_SERIES int binomialseriesrev(term t, term arg, term *next, char *reason)
/* sum((binomial(alpha,k)/k!)x^k,k,0,infinity) = (1+x)^alpha */
{ term n,u,v,alpha,x;
  if(FUNCTOR(t) != SUM || !equals(ARG(3,t),infinity) || !ZERO(ARG(2,t)) )
    return 1;
  u = ARG(0,t);
  n = ARG(1,t);
  if(FUNCTOR(u) != '*' || ARITY(u) > 3)
     return 1;
  if(ARITY(u) == 3)
     { v = ARG(0,u);
       if(FUNCTOR(v) != '^' || !equals(ARG(0,v),minusone) || !equals(ARG(1,v),n))
          return 1;
       if(FUNCTOR(ARG(1,u)) != BINOMIAL || FUNCTOR(ARG(2,u)) != '^')
          return 1;
       if(!equals(ARG(1,ARG(2,u)),n))
          return 1;
       x = ARG(0,ARG(2,u));
       if(!equals(ARG(1,ARG(1,u)),n))
          return 1;
       alpha = ARG(0,ARG(1,u));
       *next = make_power(sum(one,tnegate(x)),alpha);
     }
  else
     { if(FUNCTOR(ARG(0,u)) != BINOMIAL || FUNCTOR(ARG(1,u)) != '^')
          return 1;
       if(!equals(ARG(1,ARG(1,u)),n))
          return 1;
       x = ARG(0,ARG(1,u));
       if(!equals(ARG(1,ARG(0,u)),n))
          return 1;
       alpha = ARG(0,ARG(0,u));
       *next = make_power(sum(one,x),alpha);
     }
  HIGHLIGHT(*next);
  if(ARITY(t) == 4)
     strcpy(reason,"$$sum(binomial(alpha,n)x^n,n,0,infinity) = (1+x)^alpha$$");
  else if(NEGATIVE(ARG(4,t)))
     strcpy(reason,"$$sum(binomial(alpha,n)x^n,n,0,infinity,-3) = (1+x)^alpha$$");
  else
     strcpy(reason,"$$sum(binomial(alpha,n)x^n,n,0,infinity,2) = (1+x)^alpha$$");
  return 0;
}
/*__________________________________________________________________________*/
MEXPORT_SERIES int binomialseries2rev(term t, term arg, term *next, char *reason)
{ return binomialseriesrev(t,arg,next,reason);
}
/*__________________________________________________________________________*/
MEXPORT_SERIES int binomialseries3rev(term t, term arg, term *next, char *reason)
{ return binomialseriesrev(t,arg,next,reason);
}

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