__The ribbon rule__

**Ribbon operators and homogeneous (Hall-Littlewood) symmetric functions**

This picture above represents a ribbon (drawn in cartesian rather than matrix notation). Starting from left to right (and top to bottom) number the cells 1 to n where n is the total number of cells. The numbers i where the i+1st cell is below the i-th cell are the descents of a ribbon. The descent set of a ribbon R is the set of i such that i is a descent of R. The descent set of the ribbon above is {1,4,6,7,10} and it is a ribbon of size 11.

Observation 1: The descent set of a ribbon is a subset of {1..n-1} where n is the length of the ribb
on.

Observation 2: The ribbon is determined by its descent set and size (i.e. the ribbons of size n are in bijection with the subsets of {1..n-1}).

Observation 3: A ribbon is also a skew partition. If the outer partition is \la = (\la_1, \la_2, ..., \la_k) then the inner partition is \la^{rc} = (\la_2-1, \la_3-1, ..., \la_k -1). In the example above \la = (6,6,4,4,3,1) and \la^{rc} = (5,3,3,2).

Uses the package SF

`> `
**with(SF):**

Warning, new definition for conjugate

An operator which adds a column to the left of a partition indexing the Schur function (Sw) followed by an operator that adds a sequence of columns (in the shape of a partition \nu).

`> `
**eee:=k->if k=0 then 1; elif k<0 then 0 else top(e.k) fi:**

`> `
**Sw:=proc(m,EX) local degz, PEX, PEXz, rslt,i;
degz:=`SF/stdeg`(EX);
PEX:=top(EX);
PEXz:=expand(subs({seq(p.k=p.k+z^k,k=1..degz)},PEX));
rslt:=PEX*eee(m);
for i from 1 to degz do
rslt:=rslt+(-1)^i*coeff(PEXz,z,i)*eee(m+i);
od;
tos(rslt);
end:**

`> `
**Swnu:=proc(nu,EX) local out,nup,i;
nup:=`SF/conjugate`(nu);
out:=EX;
for i from nops(nup) to 1 by -1 do
out:=Sw(nup[i],out);
od;
out;
end:**

**Test Sw and Swnu:**

The function ribop takes a subset and an n, creates the operator that adds columns in the outer shape of the ribbon and then applys a skew operator in the shape of the inner partition of the ribbon.

`> `
**ribop:=proc(EX,sbset,n) local i,cnt,rslt,partage;
cnt:=1;
rslt:=EX;
partage:=NULL;
for i from n-1 to 1 by -1 do
if not member(i,sbset) then
rslt:=Sw(cnt,rslt);
if cnt>1 then partage:=cnt-1,partage; fi;
else
cnt:=cnt+1;
fi;
od;
tos(skew(s[op(`SF/conjugate`([partage]))],Sw(cnt,rslt)));
end:**

`> `
**tau:=sbset->convert(sbset,`+`):**

h1m adds a column of size m on a homogeneous symmetric function if the partition has length less than or equal to m. It is the sum over all ribbon operators of size m.

`> `
**h1m:=proc(m,EX) local ss,out;
if m=1 then Sw(1,EX);
else
out:=0;
for ss in combinat[powerset](m-1) do
out:=out+ribop(EX,ss,m);
od;
tos(out);
fi;
end:**

H1mt adds a column of size m on the Hall-Littlewood symmetric functions if the indexing partition has length less than or equal to m. It is the sum over all ribbon operators of size m times t^{\sum i} where the sum is over all i that are not a descent of the ribbon.

`> `
**H1mt:=proc(m,EX) local ss,mc2,out;
if m=1 then Sw(1,EX);
else
mc2:=m*(m-1)/2;
out:=0;
for ss in combinat[powerset](m-1) do
out:=out+t^(mc2-tau(ss))*ribop(EX,ss,m);
od;
tos(out);
fi;
end:**

**Test ribop, h1m and H1mt**

lambda is a function to do a substitution of the form p.k -> f(k) for each k

`> `
**lambda:=proc (expr, f) local poly, d, j, res;
poly := top(expr);
d := varset(poly,'p');
res := collect(subs({seq(cat('p',j) = f(j),j = 1 .. d)},
poly),[seq(cat('p',j),j = 1 .. d)],distributed);
map(factor,%);
subs(s[] = 1,%);
end:**

ribopq is a q deformation of ribop. ribopq = (ribop^Y P[q X + (1-q)Y]) |_{Y=X}

`> `
**ribopq:=proc(EX,sbset,n) option remember;
ribop(lambda(EX,k->q^k*pp.k+(1-q^k)*p.k),sbset,n);
tos(subs({seq(pp.k=p.k,k=1..`SF/stdeg`(EX))},%));
end:**

H1mqt adds a column on a Macdonald symmetric function that is indexed by a

partition of length less than or equal to m.

`> `
**H1mqt:=proc(m,EX) local ss,mc2,out;
if m=1 then Sw(1,EX);
else
mc2:=m*(m-1)/2;
out:=0;
for ss in combinat[powerset](m-1) do
out:=out+t^(mc2-tau(ss))*ribopq(EX,ss,m);
od;
tos(out);
fi;
end:**

**Test ribopq and H1mqt**

`> `