123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- module complx;
- % Wed Dec. 17, 1986 by F. Kako;
- %********************************************************************;
- %******************************************************************
- %******* SPLIT REAL AND IMAGINARY PART ******************
- %******************************************************************
- symbolic procedure real!-imag!-sq u;
- %U is a standard quotient,
- %Value is the standard quotient real part and imaginary part of U.
- begin scalar x,y;
- x := real!-imag!-f numr u;
- y := real!-imag!-f denr u;
- u := addf(multf(car y, car y),
- multf(cdr y, cdr y)); % Re Y **2 + Im Y **2;
- return (cancel(addf(multf(car x, car y),
- multf(cdr x, cdr y))
- ./ u) .
- cancel(addf(multf(car y, cdr x),
- negf multf(car x, cdr y))
- ./ u))
- end;
- symbolic procedure real!-imag!-f u;
- %U is a standard form.
- %Value is the standard form real and imag part of U.
- begin scalar x;
- if domainp u then return u . nil;
- x := setkorder list 'i;
- u := reorder u;
- u := if mvar u eq 'i and ldeg u = 1 then red u . lc u
- else u . nil;
- setkorder x;
- return (reorder car u . reorder cdr u)
- end;
- %*****************************************************************
- % hyperbolic functions
- %*****************************************************************;
- symbolic procedure real!-imag!-sincos u;
- begin scalar v,w,z;
- v := real!-imag!-sq u;
- if null cadr v then <<
- u := prepsq u;
- return simp!* list('sinh,u)
- . simp!* list('cosh,u)>>
- else if null caar v then <<
- u := prepsq cdr v;
- return (multsq(!*k2q 'i, simp!* list('sin,u))
- . simp!* list('cos,u))>>;
- u := prepsq cdr v;
- v := prepsq car v;
- w := simp!* list('cos,u);
- u := simp!* list('sin,u);
- u := multsq(!*k2q 'i,u);
- z := simp!* list('cosh,v);
- v := simp!* list('sinh,v);
- return (addsq (multsq(w, v), multsq(u,z)))
- . (addsq (multsq(w,z),multsq(u,v)))
- end;
- % xxxxxxxxxxxxxxxxxxxxxxxx
- %*********************************************************************
- % log and exponential term splitting for summation and product
- %********************************************************************;
- symbolic procedure sum!-split!-log(u,v);
- begin scalar x,y,z,lst,llst,mlst;
- lst := sum!-term!-split(u,v);
- a:
- if null lst then return (llst. mlst);
- u := car lst;
- lst := cdr lst;
- z := numr u;
- if domainp z or red z or not (tdeg (z := lt z) = 1) or
- atom tvar z or not ((car tvar z) eq 'log)
- or depend!-f(tc z,v) or depend!-f(denr u,v)
- then <<mlst := u . mlst;go to a>>;
- y := reorder tc z ./ reorder denr u;
- z := simp!* cadr tvar z;
- if x := assoc(y,llst) then rplacd(x,multsq(cdr x,z))
- else if x := assoc(negsq y,llst)
- then rplacd(x,multsq(cdr x,invsq z))
- else llst := (y . z) . llst;
- go to a
- end;
- symbolic procedure prod!-split!-exp(u,v);
- begin scalar x,y,z,w,klst,lst;
- % lst := kernels(numr u,nil);
- lst := kernels numr u;
- % lst := kernels1denr u,lst);
- lst := kernels1(denr u,lst);
- a:
- if null lst then go to b;
- z := car lst;
- if not atom z and car z eq 'expt and
- not depend!-p(cadr z,v) and depend!-p(caddr z,v)
- then klst := z . klst;
- lst := cdr lst;
- go to a;
- b:
- if null klst then return (nil . list u);
- x := setkorder klst;
- z := reorder numr u;
- y := reorder denr u;
- c:
- if domainp z or red z or not memq(w := mvar z,klst)
- then go to d;
- v := multsq(tdeg lt z ./ 1,simp!* caddr w);
- w := cadr w;
- if u := assoc(w,lst) then rplacd(u,addsq(cdr u,v))
- else lst := (w . v) . lst;
- z := tc lt z;
- go to c;
- d:
- if domainp y or red y or not memq(w := mvar y,klst)
- then go to e;
- v := multsq(tdeg lt y ./ 1,negsq simp!* caddr w);
- w := cadr w;
- if u := assoc(w,lst) then rplacd(u,addsq(cdr u,v))
- else lst := (w . v) . lst;
- y := tc lt y;
- go to d;
- e:
- setkorder x;
- u := reorder z ./ reorder y;
- return (lst . list u)
- end;
- endmodule;
- end;
|