[GAP Forum] sorted index of group element

Alexander Konovalov alexk at mcs.st-andrews.ac.uk
Sun Feb 24 20:38:44 GMT 2013


On 23 Feb 2013, at 19:02, Cotton Seed <cotton at alum.mit.edu> wrote:

> Is there way to get the sorted index of a group element?  More
> specifically, let G be a group, and g an element of G.  Is there a function
> that will give me the index i so that MagmaElement(G,i) = g?  Thanks!
> 
> Best,
> Cotton


Dear Cotton,

Let me first start with a hint how the source code of the MagmaElement 
function may be explored to find an answer, and then suggest a more 
efficient approach.

First, looking at the code of MagmaElement function - this may be done by 
typing `ViewSource(MagmaElement);' in GAP - you may spot the call to 
AsSSortedList:

InstallGlobalFunction( MagmaElement, function( M, i )
   M:= AsSSortedList( M );
   if Length( M ) < i then
     return fail;
   else
     return M[i];
   fi;
end );

Thus, MagmaElement returns the i-th element of AsSSortedList(M), where 
the latter contains all elements of M in strictly sorted order, w.r.t. 
the canonical ordering defined on M (depending on the type of M). 
Therefore, the index in which you're interested will be returned by 

Position( AsSSortedList( G ), g ) 

For example,

gap> G:=SmallGroup(8,3);
<pc group of size 8 with 3 generators>
gap> g:=Random(G);
f1*f3
gap> s:=AsSSortedList(G);;
gap> Position(s,g);
6
gap> MagmaElement(G,6);
f1*f3
gap> MagmaElement(G,6)=g;
true

Creating the list of all elements may not be very efficient, especially
when the group is very large. However, if the method for `Enumerator' 
exists for such a group (see `?Enumerator), then there is another
approach. Enumerator(G) need not to store its elements explicitly, 
but it knows how to determine the i-th element and the position of a 
given object. For example, this works:

gap> S:=SymmetricGroup(50);
Sym( [ 1 .. 50 ] )
gap> g:=Random(S);
(1,40,16,24,8,21,19,39,20,12,28,6)(2,5,49,3,45,4,30,25,13,11,47,44,36,9,50,43,
18,32)(7,46,22,15,35,41)(10,14,48,26,17)(23,42,33,29,37,38,27)
gap> enum:=Enumerator(S);
<enumerator of perm group>
gap> pos:=Position(enum,g);
19748951512546719853008099372809900742253637283670495935197327991
gap> enum[pos]=g;
true

while AsSSortedList(S) will run out of memory. There are methods for 
enumerators of various types of algebraic structures defined in the
GAP library.

Please note that the order in which MagmaElement and Enumerator will
sort elements of a domain sometimes may be different: the one for 
MagmaElement is determined by the '\<' relation defined on the domain, 
while the one for Enumerator depends on the algorithm used to enumerate
elements of a domain of some particular type. For example,

gap> F:=FreeGroup("a","b");
<free group on the generators [ a, b ]>
gap> AssignGeneratorVariables(F);
#I  Assigned the global variables [ a, b ]
gap> G:=F/[a^32,b^2,b^-1*a*b*a];
<fp group on the generators [ a, b ]>
gap> First([1..Size(G)],i -> not MagmaElement(G,i)=Enumerator(G)[i]);
3
gap> MagmaElement(G,3);
b
gap> Enumerator(G)[3];
a^-1

However, in most applications it is not the particular order that matters,
but the ability to determine the position of an element in the fixed 
list of elements, and to retrieve the i-th element of that list.

Hope this helps,
Alexander




More information about the Forum mailing list