HOME: | |
BACK: | Maple Packages |
> with(SF);
Functions to compute the operator
nabla
Uses theorems in the articles
"Explicit..." Haiman, Garsia,
Tesler
"Identities and Postivity..."
Bergeron, Haiman, Garsia, Tesler
the function nabla works on
homogeneous functions only
> Dk:=proc(m,EX)
local i,pat,out,pex,te,d,coe,k,H,HH;
pat:={seq(p.i=p.i+(1-t^i)*(1-q^i)*z^i,i=1..10)};
pex:=top(EX);
te:=expand(subs(pat,pex));
d:=degree(te,z);
H:=[seq((-1)^i*top(e.i),i=m..d+m)];
out:=subs(z=0,te)*H[1];
for k from 1 to d do
coe:=coeff(te,z,k);
out:=out+coe*H[1+k];
od;
collect(out,{seq(p.i,i=1..d+m)});
end:
> Dkstar:=proc(m,EX)
local i,pat,out,pex,te,d,coe,k,H,HH;
pat:={seq(p.i=p.i-(1-t^(-i))*(1-q^(-i))*z^i,i=1..10)};
pex:=top(EX);
te:=expand(subs(pat,pex));
d:=degree(te,z);
H:=[seq(top(h.i),i=m..d+m)];
out:=subs(z=0,te)*H[1];
for k from 1 to d do
coe:=coeff(te,z,k);
out:=out+coe*H[1+k];
od;
collect(out,{seq(p.i,i=1..d+m)});
end:
> Wla:=proc(la) option remember; local
i,rslt,cnt;
rslt:=1; cnt:=0;
for i from nops(la) to 1 by -1 do
if la[i]>1 then
rslt:=Dkstar(1,rslt*p1^(la[i]-1));
else cnt:=cnt+1; fi;
od;
rslt:=toe(rslt)*e1^(cnt);
end:
> sgnUla:=proc(la) option remember;
local i,rslt,cnt,j, ttl;
rslt:=1; cnt:=0; ttl:=0;
for i from nops(la) to 1 by -1 do
if la[i]>1 then
for j from 1 to la[i]-1 do
rslt:=Dk(1,rslt); od;
rslt:=rslt*p1; ttl:=ttl+la[i]-1;
else cnt:=cnt+1; fi;
od;
for i from 1 to cnt do
rslt:=Dk(1,rslt); od;
rslt*(-1)^(ttl+cnt);
end:
> toW:=proc(EX) local d,f,sp,vars,i;
f:=toe(EX); d:=`SF/stdeg`(f,'e');
vars:=[seq(e.i,i=1..d)]; sp:=Par(d);
convert([seq(c[i]*Wla(sp[i]),i=1..nops(sp))],`+`);
collect(%-f,vars,'distributed');
readlib(`solve/linear`)({coeffs(%,vars)},{seq(c[i],i=1..nops(sp))});
subs(%,convert([seq(c[i]*W[op(sp[i])],i=1..nops(sp))],`+`));
end:
> nabla:=proc(EX) local d,f,sp,vars,i;
f:=toe(EX); d:=`SF/stdeg`(f,'e');
vars:=[seq(e.i,i=1..d)]; sp:=Par(d);
convert([seq(c[i]*Wla(sp[i]),i=1..nops(sp))],`+`);
collect(%-f,vars,'distributed');
readlib(`solve/linear`)({coeffs(%,vars)},{seq(c[i],i=1..nops(sp))});
subs(%,convert([seq(c[i]*sgnUla(sp[i]),i=1..nops(sp))],`+`));
tos(%);
end:
> diffnab:=proc(EX) local rslt,i,j;
rslt:=top(EX);
for i from 1 to `SF/stdeg`(EX) do
rslt:=collect(subs({e.(-1)=0,e0=1},Dk(-1,rslt/(1-q)/(1-t))),
{seq(p.j,j=1..`SF/stdeg`(EX)-i)});
od;
simplify(rslt);
end:
Here are some experiments that
you can try out yourself with this operator
a q,t analog of n^n
> npn:=n->(-1)^(n)*diffnab(s[n+1])/q^n/t^n:
a q,t analog of (n+1)^(n-1)
> rooted:=n->diffnab(e.n):
a q,t analog of the Catalan numbers
> catqt:=n->scalar(nabla(e.n),e.n):
a q,t-polynomial display function
> qttab:=proc(EX) local i,j;
matrix([seq([seq(coeff(coeff(EX,q,i),t,j),i=0..degree(EX,q))],j=0..degree(EX,t))]);
end:
> qttab(npn(4));
>