The Schur-Q functions and their q-analogs G_\mu[X;q]
These procedures compute the functions Q_\la[X] and G_\la[X;q]
main functions:
Qlap( lambda )
returns Schur's Q function in the p-basis
Glaq( lambda )
returns G_\la^q in the p-basis
toSchurQ( expression )
turn an expression to Schur's Q-function basis
paraGq( seqoflambda )
returns the parabolic versions of these functions indexed by a sequence of partitions
requires the package SF from John Stembridge
> with(SF);
Some versions of SF don't have the degree function in the front end
> stdeg:=`SF/stdeg`:
>
Qk:=proc(k) local i,j;
if k=0 then 1;
else add(2*s[i,seq(1,j=1..k-i)],i=1..k);
fi;
end:
>
strict:=proc(la) local i,out;
out:=true;
for i from 1 to nops(la)-1 do
if la[i]=la[i+1] then out:=false; fi;
od;
out;
end:
>
Qkp:=proc(k) option remember;
local i,j;
top(Qk(k));
end:
>
addQkp:=proc(m,EX) local i,PEX;
PEX:=top(EX);
Qkp(m)*PEX + add((-1)^i*Qkp(m+i)*skew(e.i,PEX),i=1..stdeg(PEX));
end:
>
addQkq:=proc(m,EX);
subs({seq(pp.i=p.i,i=1..stdeg(EX))},addQkp(m,
subs({seq(p.i=q^i*pp.i+(1-q^i)*p.i,i=1..stdeg(EX))},top(EX))));
end:
>
Qlap:=proc(la) local out,i;
out:=1;
for i from nops(la) to 1 by -1 do
out:=addQkp(la[i],out);
od;
out;
end:
>
Glaq:=proc(la) local out,i;
out:=1;
for i from nops(la) to 1 by -1 do
out:=addQkq(la[i],out);
od;
tos(out);
end:
>
addQla:=proc(la,EX) local out,i;
out:=EX;
for i from nops(la) to 1 by -1 do
out:=addQkp(la[i],out);
od;
out;
end:
>
addGla:=proc(la,EX);
subs({seq(pp.i=p.i,i=1..stdeg(EX))},addQla(la,
subs({seq(p.i=q^i*pp.i+(1-q^i)*p.i,i=1..stdeg(EX))},top(EX))));
end:
>
paraGla:=proc(R) local out,i;
out:=1;
for i from nops(R) to 1 by -1 do
out:=addGla(R[i],out);
od;
out;
end:
>
toSchurQ:=proc(EX) local sp,prs,d,cfl,i,sln,inds;
if type(EX,'list') then sp:=top(op(EX));
else
RETURN(convert(map(x->toSchurQ([x]),[`SF/homog_cmps`(top(EX))]),`+`));
fi;
prs:=select(strict,Par(stdeg(sp)));
d:=stdeg(sp);
inds:={seq(p.i,i=1..d)};
cfl:={coeffs(collect(sp-add(c[i]*Qlap(prs[i]),i=1..nops(prs)),
inds,'distributed'),inds)};
sln:=readlib(`solve/linear`)(cfl,{seq(c[i],i=1..nops(prs))});
subs(sln,add(c[i]*Q[op(prs[i])],i=1..nops(prs)));
end:
Examples
> Glaq([3,2]);
> toSchurQ(%);
> toSchurQ(Glaq([3,3,2,1]));
> toSchurQ(Glaq([3,2,2,1]));
>
for la in select(strict,Par(6)) do
Gq[op(la)] = toSchurQ(Glaq(la));
od;
> toSchurQ(Glaq([4,3,2,1]));
> toSchurQ(paraGla([[4,3],[2,1]]));
> toSchurQ(paraGla([[4],[3,2],[1]]));