|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
/*
* This file:
* http://anggtwu.net/MAXIMA/laurent2.mac.html
* http://anggtwu.net/MAXIMA/laurent2.mac
* (find-angg "MAXIMA/laurent2.mac")
* Author: Eduardo Ochs <eduardoochs@gmail.com>
* See: (find-es "maxima" "laurent")
* http://anggtwu.net/eev-maxima.html
*
* Dot notation for Laurent polynomials, version 2.
* I used it in:
*
* 2hT233 (c2m232ncp 5 "maxima")
* (c2m232nca "maxima")
* http://anggtwu.net/LATEX/2023-2-C2-Tudo.pdf#page=233
* 2hT250 (c2m232tap 3 "caixinhas")
* (c2m232taa "caixinhas")
* http://anggtwu.net/LATEX/2023-2-C2-Tudo.pdf#page=250
*
* The next block is a copy of the comments from the version 1, that
* is here:
* (find-angg "MAXIMA/laurent1.mac")
*
* Dot notation for Laurent polynomials, version 1.
* Idea: 456.78 is
*
* 4*10^2 + 5*10^1 + 6*10^0 + 7*10^-1 + 8*10^-2,
*
* and we write it (roughly) as:
*
* [ 4 5 6 . 7 8 ]
*
* We can generalize the 10 to x.
* With the functions of this file we have:
*
* (%i2) lpx(4*x^2 + 5*x^1 + 6*x^0 + 7*x^-1 + 8*x^-2);
* (%o2) [ 4 5 6 . 7 8 ]
*
* The "[ 4 5 6 . 7 8 ]" is a horizontal matrix that has the string
* "." in its fourth position; the "." separates the "integer part"
* from the "fractional part".
*
* These Laurent polynomials are also great for teaching trigonomotric
* identities:
*
* If we define E = e^(ix),
* icos(x) = E + E^-1,
* and isin(x) = E - E^-1,
* then we have cos(x) = 1/2 * icos(x)
* and sin(x) = 1/(2i) * isin(x).
*
* Using Laurent polynomials on E instead of on x we have:
*
* (%i1) lpE(icos(x));
* (%o1) [ 1 0 . 1 ]
* (%i2) lpE(isin(x));
* (%o2) [ 1 0 . - 1 ]
* (%i3) lpE(isin(3*x));
* (%o3) [ 1 0 0 0 . 0 0 - 1 ]
* (%i4) lpE(isin(3*x) * icos(x));
* (%o4) [ 1 0 1 0 0 . 0 - 1 0 - 1 ]
* (%i5) lpE(isin(4*x) + isin(2*x));
* (%o5) [ 1 0 1 0 0 . 0 - 1 0 - 1 ]
* (%i6) lpe( sin(4*x) + sin(2*x));
* (%o6) sin(4 x) + sin(2 x)
* (%i7)
*
* See: (find-es "maxima" "laurent")
* (defun e () (interactive) (find-angg "MAXIMA/laurent1.mac"))
*
* (defun e () (interactive) (find-angg "MAXIMA/laurent2.mac"))
* (defun o () (interactive) (find-angg "MAXIMA/laurent1.mac"))
*/
lowpow(expr,var) := hipow(subst([var=var^-1],expr), var)$
lpdegrees(lp,var) := block(
[revlp,origposdeg,orignegdeg,posdeg,negdeg],
revlp : subst([var=var^-1], lp),
origposdeg : hipow( lp, var),
orignegdeg : -hipow(revlp, var),
posdeg : max(origposdeg, 0),
negdeg : min(orignegdeg, 0),
[posdeg,negdeg])$
lpcoeffs0(lp,var,hilo) := makelist(ratcoef(lp,var,k), k, hilo[1],hilo[2], -1)$
lpcoeffs (lp,var) := apply('lpcoeffs0, [lp,var, lpdegrees(lp,var)]);
lpdot (lp,var) := block([hi,lo,posdigits,negdigits],
[hi,lo] : lpdegrees(lp,var),
posdigits : lpcoeffs0(lp,var,[hi,0]),
negdigits : lpcoeffs0(lp,var,[-1,lo]),
matrix(append(posdigits, ["."], negdigits))
)$
E_th : E = exp(%i*th);
E_x : E = exp(%i*x);
th_E : th = log(E)/%i;
x_E : x = log(E)/%i;
fourierize (f) := expand(demoivre(expand(exponentialize(f))));
fourierizeE(f) := subst(th_E,expand(exponentialize(f)));
lpE(f) := lpdot(fourierizeE(f),E);
lpx(f) := lpdot(expand(f),x)$
lpe(f) := expand(demoivre(expand(exponentialize(f))))$
ccos(th) := 2*cos(th);
csin(th) := 2*%i*sin(th);
/*
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("laurent2.mac");
p : 4*x^2 + 5*x^1 + 6*x^0 + 7*x^-1 + 8*x^-2;
q : 4*E^2 + 5*E^1 + 6*E^0 + 7*E^-1;
lpdot(p, x);
lpdot(q, E);
f : cos(th)^3;
g : ccos(th)^3;
lpe(f);
lpe(g);
exponentialize(f);
expand(exponentialize(f));
demoivre(expand(exponentialize(f)));
expand(demoivre(expand(exponentialize(f))));
subst(th_E,expand(exponentialize(f)));
subst(th_E,expand(exponentialize(g)));
lpE(f);
lpE(g);
lpE( ccos(th)^3);
lpE( ccos(th));
lpE(3*ccos(th));
lpE(ccos(3*th));
lpE(ccos(3*th)+3*ccos(th));
lpE( ccos(th) );
lpE( ccos(th)^2 );
lpE( ccos(th)^3 );
lpE( csin(th) );
lpE( csin(th)^2 );
lpE( csin(th)^3 );
lpE( csin(2*th) );
lpE( csin(2*th)^2 );
*/
/*
* Local Variables:
* coding: utf-8-unix
* End:
*/