Sindbad~EG File Manager
/* infinite series, variations on geometric series operations */
/* M. Beeson, for Mathpert */
/*
1.13.99 original date
1.21.99 last modified
1.5.15 changed characters in reason strings
9.3.17 changed one more character in a reason string
10.29.23 eliminated OEM symbols
*/
#include <string.h>
#include <assert.h>
#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"
/*_______________________________________________________________*/
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 = check1(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;
}
/*_______________________________________________________________*/
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;
}
/*_______________________________________________________________*/
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^n...$");
return 0;
}
/*_______________________________________________________________*/
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 = check1(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;
}
/*_______________________________________________________________*/
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;
}
/*_______________________________________________________________*/
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;
}
/*________________________________________________________________*/
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 = check1(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;
}
/*_______________________________________________________________*/
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;
}
/*_______________________________________________________________*/
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;
}
/*_______________________________________________________________*/
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 = check1(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;
}
/*_______________________________________________________________*/
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;
}
/*_______________________________________________________________*/
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;
}
/*_________________________________________________________________*/
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,trueterm))
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 = check1(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;
}
/*_______________________________________________________________*/
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;
}
/*_______________________________________________________________*/
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^(k+n)...$");
return 0;
}
/*_________________________________________________________________*/
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,trueterm))
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 = check1(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;
}
/*_______________________________________________________________*/
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;
}
/*_______________________________________________________________*/
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^(k+j)...$");
return 0;
}
/*________________________________________________________________*/
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 = check1(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;
}
/*_______________________________________________________________*/
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;
}
/*_______________________________________________________________*/
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;
}
/*________________________________________________________________*/
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 = check1(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;
}
/*_______________________________________________________________*/
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;
}
/*_______________________________________________________________*/
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