Artifact b94c6c6445e1de333cf90755b0ed0ca7290e054b051f14629dbfa5ffcf13d834:
- Executable file
r37/packages/tps/tpssum.red
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 3624) [annotate] [blame] [check-ins using] [more...]
- Executable file
r38/packages/tps/tpssum.red
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 3624) [annotate] [blame] [check-ins using]
module tpssum; % Written by Alan Barnes. September 1990 % Allows power series whose general term is given to be manipulated. % % pssum(<sumvar>=<lowlim>, <coeff>, <depvar>, <about>, <power>); % % <sumvar> summation variable (a kernel) % <lowlim> lower limit of summation (an integer) % <coeff> general coefficient of power series (algebraic) % <depvar> expansion variable of series (a kernel) % <about> expansion point of series (algebraic) % <power> general exponent of power series (algebraic) % <power> must be a strictly increasing function of <sumvar> % this is now partially checked by the system symbolic procedure ps!:summation!-erule(a,n); begin scalar power, coeff,sumvar,current!-index,last!-exp,current!-exp; current!-index:= rand2 a; sumvar:= rand1 a; coeff := cdddr a; power:= cadr coeff; coeff:=car coeff; last!-exp:= ieval reval subst(current!-index,sumvar,power); repeat << current!-index:=current!-index+1; current!-exp:= ieval reval subst(current!-index,sumvar,power); if current!-exp leq last!-exp then rerror(tps,39,"Exponent not strictly increasing: ps:summation"); if current!-exp < n then << ps!:set!-term(ps,current!-exp, simp!* subst(current!-index,sumvar,coeff)); rplaca(cddr a,current!-index)>>; last!-exp:=current!-exp>> until current!-exp geq n; return if current!-exp = n then << rplaca(cddr a,current!-index); simp!* subst(current!-index,sumvar,coeff) >> else (nil ./ 1) end; put('ps!:summation, 'ps!:erule, 'ps!:summation!-erule); put('ps!:summation, 'simpfn, 'simpiden); put('pssum, 'simpfn, 'simppssum); symbolic procedure simppssum a; begin scalar !*nosubs,from,sumvar,lowlim,coeff, power,depvar,about,psord,term; if length a neq 5 then rerror(tps,40, "Args should be <FROM>,<coeff>,<depvar>,<point>,<power>: simppssum"); !*nosubs := t; % We don't want left side of eqns to change. from := reval car a; !*nosubs := nil; if not eqexpr from then errpri2(car a,t) else <<sumvar:= cadr from; if not kernp simp!* sumvar then typerr(sumvar, "kernel: simppssum"); lowlim:= ieval caddr from >>; coeff:= prepsqxx simp!* cadr a; a:= cddr a; depvar := car a; about:=prepsqxx simp!* cadr a; if about = 'infinity then about := 'ps!:inf; power:= prepsqxx simp!* caddr a; if not kernp simp!* depvar then typerr(depvar, "kernel: simppssum") else if depvar=sumvar then rerror(tps,41, "Summation and expansion variables are the same: simppssum") else if smember(depvar,about) then rerror(tps,42,"Expansion point depends on depvar: simppssum") else if smember(sumvar,about) then rerror(tps,43, "Expansion point depends on summation var: simppssum") else if not smember(sumvar,power) then rerror(tps,44, "Exponent does not depend on summation variable: simppssum"); lowlim:=lowlim-1; repeat << lowlim:=lowlim+1; psord:= ieval reval subst(lowlim,sumvar,power)>> until (term:=simp!* subst(lowlim,sumvar,coeff)) neq '(nil . 1); ps:=make!-ps(list('ps!:summation,sumvar,lowlim,coeff,power), list('ps!:summation,from,coeff,depvar,about,power), depvar, about); ps!:set!-order(ps,psord); ps!:set!-term(ps,psord, term); return (ps ./ 1) end; endmodule; end;