RepRingS3-AdamsOps.mws

>    restart: with(group): with(linalg):

Warning, the protected names norm and trace have been redefined and unprotected

We will use the notational conventions on p.10 in the paper "Chern approximations for generalised group cohomology" by Neil Strickland for the character table of S_3

>    e:=[]: a:=[[1,2]]: b:=[[1,2,3]]: CCR:=[e,a,b]: # ordered list of conj cl reps

>    S3:=permgroup(3,{a,b}):

>    elements(S3);

{[[1, 2]], [[1, 2, 3]], [[2, 3]], [[1, 3]], [[1, 3, 2]], []}

>    nops(elements(S3));

6

>    mulp2:=proc(perm1,perm2)
description "Multiply 2 permutations from right to left (which is conventional) instead of left to right (as mulperms does).";
#  Takes a list of permuations and reverses their order before feeding it to mulperms.";
# mulperms(seq(args[nargs-i],i=0..(nargs-1)));
# argh! mulperms only takes two inputs!!!!
mulperms(perm2,perm1);
end proc:

>    mulp2(a,b);

[[2, 3]]

>    mymulp:=proc()
description "multiply any number of permutations from right to left";
local accumulated,m;
    accumulated := mulp2(args[1],args[2]);
    for m from 3 to nargs do
        accumulated := mulp2(accumulated,args[m]);
    end do;
accumulated;
end proc:

>    conj1by2:=proc(elt1,elt2)
description "Computes (elt2)(elt1)(elt2)^(-1)";
mymulp(elt2,elt1,invperm(elt2)); end proc:

>    conjugacyclass:=proc(elt,gp) local Lgp:
Lgp:=[op(elements(gp))]:
{seq(conj1by2(elt,Lgp[i]),i=1..nops(Lgp))};
end proc:

>    conjugacyclass(e,S3);

{[]}

>    conjugacyclass(a,S3);

{[[1, 2]], [[2, 3]], [[1, 3]]}

>    conjugacyclass(b,S3);

{[[1, 2, 3]], [[1, 3, 2]]}

>    ordconjcl:=proc(ccreps,gp) local Lgp;
description "Takes a list of conjugacy class representatives and a group and produces a list of conjugacy classes in the group in the same order as the list of representatives";
Lgp:=[op(elements(gp))]: # list of group elts
#{seq(conjugacyclass(Lgp[i],gp),i=1..nops(Lgp))};
[ seq( [ op(conjugacyclass(ccreps[i],S3)) ],i=1..nops(ccreps)) ];
end proc:

>    ordconjcl(CCR,S3);

[[[]], [[[1, 2]], [[2, 3]], [[1, 3]]], [[[1, 2, 3]], [[1, 3, 2]]]]

>    ordconjcl(CCR,S3)[2]; # this allows me to index both the list of representatives and their conjugacy classes by the same number

[[[1, 2]], [[2, 3]], [[1, 3]]]

>    nops(ordconjcl(CCR,S3)[2]);

3

Let's define the character matrix of S_3 with the irreducible representations 1, epsilon, sigma indexing the columns from left to right and the conjugacy class representatives e=[], a=[1,2], b=[1,2,3] indexing the rows from top to bottom.

>    CharTableS3:=matrix([[1,1,2],[1,-1,0],[1,1,-1]]);

CharTableS3 := matrix([[1, 1, 2], [1, -1, 0], [1, 1, -1]])

>    subvector(CharTableS3, 1..3, 3);

vector([2, 0, -1])

>    definecharacter:=proc(CharName, CC, gp, MtxCol)
description "CharName is the name of the character, and its values on conjugacy class representatives are listed in order in the matrix column of the character table correspoding to the elements in a list of conjugacy class representatives";
local i,j;
for i from 1 to nops(CC)
   do
      #for j from 1 to nops(ordconjcl(CC,gp)[i]) do print(ordconjcl(CC,gp)[i,j],MtxCol[i]);
      for j from 1 to nops(ordconjcl(CC,gp)[i]) do `CharName`(ordconjcl(CC,gp)[i,j]):=MtxCol[i];
      od:
   od:
return: end proc:

>    definecharacter(ONE,CCR,S3,subvector(CharTableS3, 1..3, 1));

>    # ONE(e); ONE(a);

>    defchars:=proc(CharNames, CCRep, gp, Mtx)
local i;
 for i from 1 to nops(CharNames) do definecharacter(CharNames[i], CCRep, gp, subvector(Mtx, 1..nops(CharNames), i)) od: return:
end proc:

>    defchars( [ONE,epsilon,sigma], CCR, S3, CharTableS3);

>    ONE(e); ONE(a); ONE(b); epsilon(e); epsilon(a); epsilon(b); sigma(e); sigma(a);  sigma(b); # check to make sure it works

1

1

1

1

-1

1

2

0

-1

>    psi:=proc(k,character,conjclassrep)
local i,j;
seq(`character`( mymulp( conjclassrep[i]$k) ),i=1..nops(conjclassrep));
end proc:

>    psi(2,sigma,CCR);

2, 2, -1

>    sigma([]); sigma([]); sigma([[1,3,2]]);

2

2

-1

>   

>    IChar:=[1,epsilon,sigma];

IChar := [1, epsilon, sigma]

>    psik2lincombi:=proc(k,character,CC,IrrChar,Mtx)
local CoeffVect;
CoeffVect:=subvector( gaussjord(augment(Mtx,[ psi(k,`character`,CC) ])), 1..nops(CC), nops(CC)+1);
#print(CoeffVect);
sum(CoeffVect[i]*IrrChar[i],i=1..nops(IrrChar));
#seq(IrrChar[i],i=1..nops(IrrChar));
#add(CoeffMtx[i,nops(CC)+1]*CC[i],i=1..nops(CC));
end proc:

>    psik2lincombi(2,sigma,CCR,IChar,CharTableS3);

1-epsilon+sigma

>    listAdamsOps:=proc(i,j,CC,IrrChar,Mtx)
#seq(seq( lprint(k,IrrChar[l],psik2lincombi(k,IrrChar[l],CC,IrrChar,Mtx)), l=1..nops(L)), k=i..j);
seq(seq( print([psi^k,IrrChar[l],`=`,psik2lincombi(k,IrrChar[l],CC,IrrChar,Mtx)]), l=1..nops(IrrChar)), k=i..j);
end proc:

>    listAdamsOps(2,6,CCR,IChar,CharTableS3);

[psi^2, 1, `=`, 1]

[psi^2, epsilon, `=`, 1]

[psi^2, sigma, `=`, 1-epsilon+sigma]

[psi^3, 1, `=`, 1]

[psi^3, epsilon, `=`, epsilon]

[psi^3, sigma, `=`, 1+epsilon]

[psi^4, 1, `=`, 1]

[psi^4, epsilon, `=`, 1]

[psi^4, sigma, `=`, 1-epsilon+sigma]

[psi^5, 1, `=`, 1]

[psi^5, epsilon, `=`, epsilon]

[psi^5, sigma, `=`, sigma]

[psi^6, 1, `=`, 1]

[psi^6, epsilon, `=`, 1]

[psi^6, sigma, `=`, 2]

Let's check a few of these to make sure we've done things correctly

>    sigma(mymulp(e,e,e)); sigma(mymulp(a,a,a)); sigma(mymulp(b,b,b));

2

0

2

>    gaussjord(augment(CharTableS3,[2,0,2]));

matrix([[1, 0, 0, 1], [0, 1, 0, 1], [0, 0, 1, 0]])

>    mymulp(b,b,b,b); # should be b

[[1, 2, 3]]

>    sigma(mymulp(e,e,e,e)); sigma(mymulp(a,a,a,a)); sigma(mymulp(b,b,b,b));

2

2

-1

>    augment(CharTableS3,[2,2,-1]);

matrix([[1, 1, 2, 2], [1, -1, 0, 2], [1, 1, -1, -1]])

>    gaussjord(%);

matrix([[1, 0, 0, 1], [0, 1, 0, -1], [0, 0, 1, 1]])

>   

We have done things correctly.