makewordlevel:=proc(g,n) local i,j,k,i2,l,word,wordlist,wordlist2; wordlist:=[[g[1]],[g[2]],[g[3]],[g[4]]]; # Start with generator list for l from 1 to n-1 do wordlist2:=[[],[],[],[]]; # For next level, start with empty list for i from 1 to 4 do # Work on list of words ending with g[i] for j from -1 to 1 do # Add new generator to end of each word i2:= (i+ j -1 mod 4) +1; # i2 must be 1, 2, 3, or 4 for k from 1 to nops(wordlist[i]) do # word:=""||(wordlist[i,k])||(g[i2]); # Word concatenation word:=wordlist[i,k].g[i2]; # Matrix multiplication wordlist2[i2]:=[op(wordlist2[i2]),word]; end do; end do; end do; wordlist:=wordlist2; end do; RETURN(wordlist) end proc: makeallwords:=proc(g,n) local wordlist, i; wordlist:=map(op,makewordlevel(g,1)); for i from 2 to n do wordlist:=[op(wordlist), op( map(op,makewordlevel(g,i))) ]; end do: RETURN(wordlist); end proc: