void w_refl(entry* lambda, lie_Index wi) { if (type_of(grp)==SIMPGRP) simp_w_refl(lambda,wi,&grp->s); else if (simpgroup(grp)) simp_w_refl(lambda,wi,Liecomp(grp,0)); else { lie_Index i,d,offset=0; for (i=0; wi>=(d=Liecomp(grp,i)->lierank); ++i) { offset+=d; wi-=d; } simp_w_refl(lambda+offset,wi,Liecomp(grp,i)); } }
void Wrtaction(entry* alpha, vector* word) { lie_Index i; entry* w=word->compon; for (i=0; i<word->ncomp; ++i) if(w[i]!=0) { lie_Index wi=w[i]-1; if (type_of(grp)==SIMPGRP) simp_rt_refl(alpha,wi,&grp->s); else if (simpgroup(grp)) simp_rt_refl(alpha,wi,Liecomp(grp,0)); else { lie_Index j,d,offset=0; for (j=0; wi>=(d=Liecomp(grp,j)->lierank); ++j) { offset+=d; wi-=d; } simp_rt_refl(alpha+offset,wi,Liecomp(grp,j)); } } }
matrix* Cartan(void) { if (type_of(grp)==SIMPGRP) return simp_Cartan(&grp->s); if (simpgroup(grp)) return simp_Cartan(Liecomp(grp,0)); { _index i,j, t=0; matrix* cartan=mat_null(Ssrank(grp),Lierank(grp)); for (i=0; i<grp->g.ncomp; ++i) { _index r=Liecomp(grp,i)->lierank; entry** c=simp_Cartan(Liecomp(grp,i))->elm; for (j=0; j<r; ++j) copyrow(c[j],&cartan->elm[t+j][t],r); t+=r; } return cartan; } }
matrix* Posroots(object grp) { if (type_of(grp)==SIMPGRP) return simp_proots(&grp->s); if (simpgroup(grp)) return simp_proots(Liecomp(grp,0)); { _index i,j,t1=0,t2=0; matrix* result=mat_null(Numproots(grp),Ssrank(grp)); entry** m=result->elm; for (i=0; i<grp->g.ncomp; ++i) { matrix* posr=simp_proots(Liecomp(grp,i)); _index r=Liecomp(grp,i)->lierank; for (j=0; j<posr->nrows; ++j) copyrow(posr->elm[j],&m[t1+j][t2],r); t1+=posr->nrows; t2+=r; } return result; } }
vector* Exponents(object grp) { if (type_of(grp)==SIMPGRP) { simp_exponents(&grp->s); return grp->s.exponents; } if (simpgroup(grp)) { simp_exponents(Liecomp(grp,0)); return Liecomp(grp,0)->exponents; } { _index i,t=0; vector* v=mkvector(Lierank(grp)); entry* e=v->compon; { for (i=0; i<grp->g.ncomp; ++i) { simpgrp* g=Liecomp(grp,i); _index r=g->lierank; copyrow(simp_exponents(g),&e[t],r); t+=r; } for (i=0; i<grp->g.toraldim; ++i) e[t+i]=0; } return v; } }
matrix* Icartan(void) { if (simpgroup(grp)) return simp_icart(Liecomp(grp,0)); { matrix* result=mat_null(Lierank(grp),Ssrank(grp)); entry** m=result->elm; _index k,t=0; entry det=Detcartan(); /* product of determinants of simple factors */ for (k=0; k<grp->g.ncomp; ++k) { simpgrp* g=Liecomp(grp,k); _index i,j,r=g->lierank; entry** a=simp_icart(g)->elm; entry f=det/simp_detcart(g); /* multiplication factor */ for (i=0; i<r; ++i) for (j=0; j<r; ++j) m[t+i][t+j]=f*a[i][j]; t+=r; } return result; } }
local poly* vdecomp_irr(entry* lambda) { if (type_of(grp)==SIMPGRP) return simp_vdecomp_irr(lambda,&grp->s); if (simpgroup(grp)) return simp_vdecomp_irr(lambda,Liecomp(grp,0)); { poly* result; lie_Index i; { lie_Index td=grp->g.toraldim; lambda+=Ssrank(grp); result=mkpoly(1,td); copyrow(lambda,*result->elm,td); *result->coef=one; } for (i=grp->g.ncomp-1; i>=0; --i) /* traverse simple components in reverse order */ { simpgrp* g=Liecomp(grp,i); lambda-=g->lierank; result= Disjunct_mul_pol_pol(simp_vdecomp_irr(lambda,g),result); } return result; } }