############################################################################# ## #W iterator.gi GAP4 package `Utils' Chris Wensley ## #Y Copyright (C) 2015-2025, The GAP Group
############################################################################## ## #M AllIsomorphismsIterator . . . . . . . . . . . . . . . for a pair of groups #M DoAllIsomorphismsIterator . . . . . . . . . . . . . . for a pair of groups #M AllIsomorphismsNumber . . . . . . . . . . . . . . . . for a pair of groups #M AllIsomorphisms . . . . . . . . . . . . . . . . . . . for a pair of groups ##
BindGlobal( "NextIterator_AllIsomorphisms", function ( iter )
local a; if not IsDoneIterator( iter ) then
a := NextIterator( iter!.autoIterator );
return CompositionMapping( iter!.firstiso, a ); fi;
Error( "iterator is exhausted" ); end );
BindGlobal( "IsDoneIterator_AllIsomorphisms",
iter -> IsDoneIterator( iter!.autoIterator ) );
BindGlobal( "DoAllIsomorphismsIterator", function( G, H )
local iso, autoiter, iter;
if not IsGroup( G ) and IsGroup( H ) then
Error( "G,H should be groups" ); fi;
iso := IsomorphismGroups( G, H ); if ( iso = fail ) then ## there are no isomorphisms so return an empty iterator
return IteratorList( [ ] ); fi;
autoiter := Iterator( AutomorphismGroup( G ) );
iter := IteratorByFunctions(
rec( firstiso := iso,
autoIterator := ShallowCopy( autoiter ),
NextIterator := NextIterator_AllIsomorphisms,
IsDoneIterator := IsDoneIterator_AllIsomorphisms,
ShallowCopy := ShallowCopy_AllIsomorphisms ) );
return iter; end );
InstallMethod( AllIsomorphismsIterator, "for a pair of groups",
[ IsGroup, IsGroup ], 0, function( G, H )
return DoAllIsomorphismsIterator( G, H ); end );
InstallMethod( AllIsomorphisms, "for a pair of groups",
[ IsGroup, IsGroup ], 0, function( G, H )
local iter, L, iso;
iter := AllIsomorphismsIterator( G, H ); if IsDoneIterator( iter ) then
return [ ]; fi;
L := [ ]; for iso in iter do
Add( L, iso );
od;
return L; end );
InstallMethod( AllIsomorphismsNumber, "for a pair of groups",
[ IsGroup, IsGroup ], 0, function( G, H )
local iter, n, iso;
iter := AllIsomorphismsIterator( G, H ); if IsDoneIterator( iter ) then
return 0; fi;
n := 0; for iso in iter do
n := n+1;
od;
return n; end );
############################################################################## ## #M AllSubgroupsIterator . . . . . . . . . . . . . . . . . . . . . for a group #M DoAllSubgroupsIterator . . . . . . . . . . . . . . . . . . . . for a group ##
BindGlobal( "NextIterator_AllSubgroups", function ( iter )
local class, i;
if IsDoneIterator( iter!.subgpIterator ) then
class := NextIterator( iter!.classIterator );
iter!.class := class;
iter!.subgpIterator := IteratorList( [1..Size(class)] ); fi;
i := NextIterator( iter!.subgpIterator );
return iter!.class[i]; end );
BindGlobal( "IsDoneIterator_AllSubgroups",
iter -> IsDoneIterator( iter!.classIterator )
and IsDoneIterator( iter!.subgpIterator ) );
BindGlobal( "ShallowCopy_AllSubgroups",
iter -> rec( class := iter!.class,
classIterator := ShallowCopy( iter!.classIterator ),
subgpIterator := ShallowCopy( iter!.subgpIterator ) ) );
BindGlobal( "DoAllSubgroupsIterator", function( G )
local lat, ccs, classIterator, subgpIterator, iter;
lat := LatticeSubgroups( G );
ccs := ConjugacyClassesSubgroups( lat );
classIterator := IteratorList( ccs );
subgpIterator := 0;
iter := IteratorByFunctions(
rec( class := 0,
classIterator := ShallowCopy( classIterator ),
subgpIterator := IteratorList( [ ] ),
NextIterator := NextIterator_AllSubgroups,
IsDoneIterator := IsDoneIterator_AllSubgroups,
ShallowCopy := ShallowCopy_AllSubgroups ) );
return iter; end );
InstallMethod( AllSubgroupsIterator, "for a group", [ IsGroup ], 0, function( G )
return DoAllSubgroupsIterator( G ); end );
############################################################################## ## #M CartesianIterator . . . . . . . . . . . . . . . . . . . for two iterators #M DoCartesianIterator . . . . . . . . . . . . . . . . . . for two iterators ##
BindGlobal( "NextIterator_CartesianIterator", function ( iter )
local first, second;
if IsDoneIterator( iter!.Iterator2Copy ) then
iter!.Iterator2Copy := ShallowCopy( iter!.Iterator2 );
first := NextIterator( iter!.Iterator1 );
iter!.first := first; else
first := iter!.first; fi;
second := NextIterator( iter!.Iterator2Copy );
return [ first, second ]; end );
BindGlobal( "IsDoneIterator_CartesianIterator",
iter -> IsDoneIterator( iter!.Iterator1 )
and IsDoneIterator( iter!.Iterator2Copy ) );
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.