Iterators
Some iterators for groups and their isomorphisms Iterators The motivation for adding these operations is partly to give a simple example of an iterator for a list that does not yet exist, and need not be created.

The main &GAP; library contains functions producing complete lists of group homomorphisms such as AllHomomorphisms; AllEndomorphisms and AllAutomorphisms. Here we add the missing AllIsomorphisms(G,H) for a list of isomorphisms from G to H. The method is simple -- find one isomorphism G \to H and compose this with all the automorphisms of G. In all these cases it may not be desirable to construct a list of homomorphisms, but just implement an iterator, and that is what is done here. The operation AllIsomorphismsNumber returns the number of isomorphisms iterated over (this is, of course, just the order of the automorphisms group). The operation AllIsomorphisms produces the list or isomorphisms.

gap> G := DihedralGroup(6);; gap> iter := AllIsomorphismsIterator( G, s3 );; gap> NextIterator( iter ); [ f1, f2 ] -> [ (6,7), (5,6,7) ] gap> n := AllIsomorphismsNumber( G, s3 ); 6 gap> AllIsomorphisms( G, s3 ); [ [ f1, f2 ] -> [ (6,7), (5,6,7) ], [ f1, f2 ] -> [ (5,7), (5,6,7) ], [ f1, f2 ] -> [ (5,6), (5,7,6) ], [ f1, f2 ] -> [ (6,7), (5,7,6) ], [ f1, f2 ] -> [ (5,7), (5,7,6) ], [ f1, f2 ] -> [ (5,6), (5,6,7) ] ] gap> iter := AllIsomorphismsIterator( G, s3 );; gap> for h in iter do Print( ImageElm( h, G.1 ) = (6,7), ", " ); od; true, false, false, true, false, false,
The manual entry for the operation AllSubgroups states that it is only intended to be used on small examples in a classroom situation. Access to all subgroups was required by the XMod package, so this iterator was introduced here. It used the operations LatticeSubgroups(G) and ConjugacyClassesSubgroups(lat), and then iterates over the entries in these classes.

gap> c3c3 := Group( (1,2,3), (4,5,6) );; gap> iter := AllSubgroupsIterator( c3c3 ); <iterator> gap> while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od; Group( () ) Group( [ (4,5,6) ] ) Group( [ (1,2,3) ] ) Group( [ (1,2,3)(4,5,6) ] ) Group( [ (1,3,2)(4,5,6) ] ) Group( [ (4,5,6), (1,2,3) ] )
Operations on iterators This section considers ways of producing an iterator from one or more iterators. It may be that operations equivalent to these are available elsewhere in the library -- if so, the ones here can be removed in due course. This iterator returns all pairs [x,y] where x is the output of a first iterator and y is the output of a second iterator.

gap> it1 := Iterator( [ 1, 2, 3 ] );; gap> it2 := Iterator( [ 4, 5, 6 ] );; gap> iter := CartesianIterator( it1, it2 );; gap> while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od; [ 1, 4 ] [ 1, 5 ] [ 1, 6 ] [ 2, 4 ] [ 2, 5 ] [ 2, 6 ] [ 3, 4 ] [ 3, 5 ] [ 3, 6 ]
This operation returns pairs [x,y] where x,y are output from a given iterator iter. Unlike the output from CartesianIterator(iter,iter), unordered pairs are returned. In the case L = [1,2,3,\ldots] the pairs are ordered as [1,1],[1,2],[2,2],[1,3],[2,3],[3,3],\ldots.

gap> L := [6,7,8,9];; gap> iterL := IteratorList( L );; gap> pairsL := UnorderedPairsIterator( iterL );; gap> while not IsDoneIterator(pairsL) do Print(NextIterator(pairsL),"\n"); od; [ 6, 6 ] [ 6, 7 ] [ 7, 7 ] [ 6, 8 ] [ 7, 8 ] [ 8, 8 ] [ 6, 9 ] [ 7, 9 ] [ 8, 9 ] [ 9, 9 ] gap> iter4 := IteratorList( [ 4 ] ); <iterator> gap> pairs4 := UnorderedPairsIterator(iter4); <iterator> gap> NextIterator( pairs4 ); [ 4, 4 ] gap> IsDoneIterator( pairs4 ); true