poly* Plethysm(entry* lambda,_index l,_index n,poly* p) { if (n==0) return poly_one(Lierank(grp)); else if (n==1) return p; { _index i,j; poly* sum= poly_null(Lierank(grp)),**adams=alloc_array(poly*,n+1); poly* chi_lambda=MN_char(lambda,l); for (i=1; i<=n; ++i) { adams[i]=Adams(i,p); setshared(adams[i]); } for (i=0;i<chi_lambda->nrows;i++) { entry* mu=chi_lambda->elm[i]; poly* prod=adams[mu[0]],*t; for (j=1; j<n && mu[j]>0; ++j) { t=prod; prod=Tensor(t,adams[mu[j]]); freepol(t); } sum= Addmul_pol_pol_bin(sum,prod,mult(chi_lambda->coef[i],Classord(mu,n))); } freemem(chi_lambda); setshared(p); /* protect |p|; it coincides with |adams[1]| */ for (i=1; i<=n; ++i) { clrshared(adams[i]); freepol(adams[i]); } freearr(adams); clrshared(p); { bigint* fac_n=fac(n); setshared(fac_n); /* used repeatedly */ for (i=0; i<sum->nrows; ++i) { bigint** cc= &sum->coef[i] ,* c= (clrshared(*cc),isshared(*cc)) ? copybigint(*cc,NULL) : *cc; *cc=divq(c,fac_n); setshared(*cc); if (c->size!=0) error("Internal error (plethysm).\n"); else freemem(c); } clrshared(fac_n); freemem(fac_n); } return sum; } }
local poly* decompose_character(poly* ch) { wt_init(ch->ncols); /* for building result */ while (ch->coef[0]->size!=0) /* i.e., |while (ch!=0)| */ { bigint* c=ch->coef[0]; if (c->size<0) { cmpfn=sav_cmpfn; defaultgrp=sav_dfgrp; error ("Non-virtual decomposition failed.\n"); } { wt_ins(ch->elm[0],c,false); /* contribute weight to result */ c=copybigint(c,NULL); c->size= -c->size; ch=Addmul_pol_pol_bin(ch,Domchar_irr(ch->elm[0],NULL),c); } } { poly* result=wt_collect(); { cmpfn=sav_cmpfn; defaultgrp=sav_dfgrp; clrsorted(result); } return result; } }
poly* LR_tensor(poly* p,poly* q) { _index i,j,n=p->ncols; poly* res=poly_null(n); for (i=0; i<p->nrows; ++i) for (j=0; j<q->nrows; ++j) res=Addmul_pol_pol_bin(res,LR_tensor_irr(p->elm[i],q->elm[j],n) ,mult(p->coef[i],q->coef[j])); return res; }
poly* Vdecomp(poly* p) { lie_Index i,r=Lierank(grp); poly* result=poly_null(r); cur_expon=mkintarray(r); /* large enough */ for (i=0; i<p->nrows; ++i) result=Addmul_pol_pol_bin(result,vdecomp_irr(p->elm[i]),p->coef[i]); freearr(cur_expon); return result; }