123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- module TayConv;
- %*****************************************************************
- %
- % Functions converting Taylor kernels to prefix forms
- %
- %*****************************************************************
- exports prepTaylor!*!*, prepTaylor!*, prepTaylor!*1,
- Taylor!-gen!-big!-O;
- imports
- % from the REDUCE kernel:
- eqcar, lastpair, prepsq!*, replus, retimes, reval,
- % from the header module:
- prepTayExp, TayCfPl, TayCfSq, TayCoeffList, TayTemplate,
- TayTpElNext, TayTpElPoint, TayTpElVars;
- fluid '(convert!-Taylor!*
- TaylorPrintTerms
- Taylor!-truncation!-flag);
- symbolic procedure prepTaylor!*1 (coefflist, template, no!-of!-terms);
- replus for each cc in coefflist join
- begin scalar x; integer count;
- if Taylor!-truncation!-flag then return nil;
- x := prepTaylor!*2 (cc, template);
- if null x or null no!-of!-terms then return x;
- no!-of!-terms := no!-of!-terms - 1;
- if no!-of!-terms < 0
- then << Taylor!-truncation!-flag := t;
- return nil >>;
- return x
- end;
- symbolic procedure prepTaylor!*2 (coeff, template);
- (lambda (pc);
- if pc = 0 then nil
- else {retimes (
- (if eqcar (pc, 'quotient) and eqcar (cadr pc, 'minus)
- then {'minus, {'quotient, cadr cadr pc, caddr pc}}
- else pc) . preptaycoeff (TayCfPl coeff, template))})
- (prepsq!* TayCfSq coeff);
- symbolic procedure checkdifference (var, var0);
- if var0 = 0 then var else {'difference, var, var0};
- symbolic procedure checkexp(bas,exp);
- if exp = 0 then 1
- else if exp = 1 then bas
- else {'expt,bas,prepTayExp exp};
- symbolic smacro procedure checkpower (var, var0, n);
- if var0 eq 'infinity
- then if n = 0 then 1
- else {'quotient, 1, checkexp (var, n)}
- else checkexp (checkdifference (var, reval var0), n);
- symbolic procedure preptaycoeff (cc, template);
- begin scalar result;
- while not null template do begin scalar ccl;
- ccl := car cc;
- for each var in TayTpElVars car template do <<
- result := checkpower (var, TayTpElPoint car template, car ccl)
- . result;
- ccl := cdr ccl >>;
- cc := cdr cc;
- template := cdr template
- end;
- return result
- end;
- put ('taylor!*, 'prepfn2, 'preptaylor!*!*);
- symbolic procedure prepTaylor!*!* u;
- if null convert!-taylor!* then u else preptaylor!* u;
- symbolic procedure prepTaylor!* u;
- prepTaylor!*1 (TayCoeffList u, TayTemplate u, nil);
- symbolic procedure Taylor!-gen!-big!-O tp;
- %
- % Generates a big-O notation for the Taylor template tp
- %
- "O" . for each el in tp collect
- if null cdr TayTpElVars el
- then checkpower(car TayTpElVars el,TayTpElPoint el,
- TayTpElNext el)
- else begin scalar var0;
- var0 := reval TayTpElPoint el;
- return
- if var0 eq 'infinity
- then {'quotient,1,
- checkexp('list . TayTpElVars el,TayTpElNext el)}
- else checkexp(
- 'list .
- for each krnl in TayTpElVars el collect
- checkdifference(krnl,var0),
- TayTpElNext el)
- end;
- endmodule;
- end;
|