Artifact 03072683be492537cb830976790167191684e522336a1c58c9f8baf8610e88f1:
- Executable file
r37/packages/tps/tpsconv.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: 3431) [annotate] [blame] [check-ins using] [more...]
- Executable file
r38/packages/tps/tpsconv.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: 3431) [annotate] [blame] [check-ins using]
module tpsconv; %***************************************************************** % % Functions converting power series objects to prefix forms % %***************************************************************** exports prep!:ps, ps!:print1, ps!:print, ps!:print0; fluid '(ps!:exp!-lim !*fort !*nat ); symbolic procedure prep!:ps(ps, highest!-order); begin scalar x, var, inv; var := ps!:mkvar ps; inv := (ps!:expansion!-point ps = 'ps!:inf); return replus for j := ps!:find!-order ps : highest!-order join << x := prepsq!* ps!:evaluate(ps,j); if x = 0 then nil else {retimes ((if eqcar (x, 'quotient) and eqcar (cadr x, 'minus) then {'minus, {'quotient, cadr cadr x, caddr x}} else x) . ps!:mkpow(var, j, inv))} >>; end; % symbolic procedure ps!:mkpow(bas, exp, inverted); % if exp = 0 then {1} % else if exp > 0 then % (if inverted then {{'quotient, 1, x}} else {x}) % where x = (if exp = 1 then bas else {'expt,bas, exp}) % else % (if inverted then {x} else {{'quotient, 1, x}}) % where x = (if exp = -1 then bas % else {'expt,bas, -exp}); Comment The following coding treats negative order terms in expansions about infinity in the same way as Taylor (ie. 1 over negative powers of x), whereas the code above prints these as positive powers of x; symbolic procedure ps!:mkpow(bas, exp, inverted); if exp = 0 then {1} else (if inverted then {{'quotient, 1, x}} else {x}) where x = (if exp = 1 then bas else {'expt,bas, exp}); symbolic procedure ps!:mkvar ps; begin scalar var0, var; var := ps!:depvar ps; var0 := ps!:expansion!-point ps; if var0 = 0 or var0 = 'ps!:inf then return var else if numberp var0 and var0 < 0 then return {'plus, var, -var0} else if eqcar(var0, 'minus) then return {'plus, var, cadr var0} else if eqcar(var0, 'quotient) and eqcar(cadr var0, 'minus) then return {'plus, var, {'quotient, cadadr var0, caddr var0}} else return {'difference, var, var0}; end; symbolic procedure ps!:big!-o(ps, ord); % % Generates a big-O notation for power series % "O" . ps!:mkpow(ps!:mkvar ps, ord, (ps!:expansion!-point ps = 'ps!:inf)); symbolic procedure ps!:print1 u; begin scalar prepexpr, rest; prepexpr := prep!:ps(u, ps!:exp!-lim); rest := {ps!:big!-o(u, ps!:exp!-lim+1)}; return if not eqcar (prepexpr, 'plus) then 'plus . (prepexpr or 0) . rest else nconc (prepexpr, rest); end; put('!:ps!:, 'fancy!-reform, 'ps!:print1); symbolic procedure ps!:print(u,p); if !*fort then fmprint(prep!:ps(u,ps!:exp!-lim),p) else if null !*nat then maprint('ps . (ps!:value u) . (ps!:depvar u) . {(if about = 'ps!:inf then 'infinity else if about = nil then 'undefined else about) where about = ps!:expansion!-point u}, p) else if constantpsp u then maprint(prepsqxx ps!:get!-term(u, 0), p) else maprint(ps!:print1 u, p); symbolic procedure ps!:print0 u; ps!:print(u,0); Comment We need another printing function for use with the TeX-REDUCE interface; %not yet done; endmodule; end;