<html><head><title>[CRISP] 3 Generic group classes</title></head> <body text="#000000" bgcolor="#ffffff"> [<a href = "chapters.htm">Up</a>] [<a href ="CHAP002.htm">Previous</a>] [<a href ="CHAP004.htm">Next</a>] [<a href = "theindex.htm">Index</a>] <h1>3 Generic group classes</h1><p> <P> <H3>Sections</H3> <oL> <li> <A HREF="CHAP003.htm#SECT001">Creating group classes</a> <li> <A HREF="CHAP003.htm#SECT002">Properties of group classes</a> <li> <A HREF="CHAP003.htm#SECT003">Additional properties of group classes</a> <li> <A HREF="CHAP003.htm#SECT004">Attributes of group classes</a> </ol><p> <p> In this chapter, we describe how group classes can be defined by assigning basic attributes and properties, in particular closure properties. <p> A class (see <a href="CHAP002.htm">Set theoretical classes</a>) is a <strong>group class</strong> if it consists of groups, and if it is closed under isomorphisms of groups. Thus if <var>G</var> and <var>H</var> are isomorphic groups, then <var>G</var> is in the group class <var>grpclass</var> if and only if <var>H</var> is. Groups belonging to the same group class may be regarded as sharing a group theoretical property (a property shared by isomorphic groups), and groups sharing a group theoretical property form a class of groups. It not empty, group classes are genuinely infinite objects, so <font face="Gill Sans,Helvetica,Arial">GAP</font> sets can never form group classes. Some authors require every group class to contain the trivial groups. Here we do not make this assumption; in particular every empty class is a group class. <p> The following sections describe how to create group classes and declare some of their basic properties. <p> Note that, for common types of group classes, there are additional functions available to accomplish this task; see the following Chapters <a href="CHAP004.htm">Schunck classes and formations</a> and <a href="CHAP005.htm">Fitting classes and Fitting sets</a>. There are also a number of pre-defined group classes; see Chapter <a href="CHAP006.htm">Examples of group classes</a>. <p> <p> <h2><a name="SECT001">3.1 Creating group classes</a></h2> <p><p> <a name = "I0"></a> Group classes can either be defined by a function deciding membership, or alternatively by a (finite) list of groups containing at least one representative of each isomorphism type of groups contained in the class. <p> <a name = "SSEC001.1"></a> <li><code>GroupClass(</code><var>rec</var><code>) O</code> <li><code>GroupClass(</code><var>func</var><code>) O</code> <li><code>GroupClass(</code><var>group-list</var><code>) O</code> <li><code>GroupClass(</code><var>group-list</var><code>, </code><var>iso-func</var><code>) O</code> <p> The function <code>GroupClass</code> returns a new group class <var>class</var>, specified by its argument(s). <p> In the first form, <var>rec</var> must be a record which has a component <code>\in</code>, and may have further components <code>name</code>, and <code>char</code>. <code>\in</code> must be a function having one argument. When called with a group <var>G</var> as its argument, it must return <code>true</code> or <code>false</code>, depending upon whether <var>G</var> is in <var>class</var> or not. It is the user's responsibility to ensure that the function supplied returns the same value when called with isomorphic groups. If <var>rec</var> has components <code>name</code> or <code>char</code>, their values are stored in the attributes <code>Name</code> (see <a href="badlink:ref:Name">Name</a>) and <code>Characteristic</code> (see <a href="CHAP003.htm#SSEC004.1">Characteristic</a>) of <var>class</var>. <p> <code>GroupClass(</code><var>func</var><code>)</code> is a shorthand for <code>GroupClass(rec(\in := func))</code>. <p> In the other cases, <code>GroupClass</code> returns the group class consisting of the isomorphism classes of the groups in the list <var>group-list</var>. If <var>iso-func</var> is given, <var>iso-func</var> is used to check whether a given group <var>G</var> is isomorphic with one of the groups in the defining list. <var>iso-func</var> must have two arguments, and must return true if two groups, one of which is in <var>group-list</var>, passed as arguments are isomorphic, and false otherwise. If <var>iso-func</var> is not given, the <font face="Gill Sans,Helvetica,Arial">GAP</font> function <code>IsomorphismGroups</code> is used for the isomorphism test. Note that even for relatively small groups, <code>IsomorphismGroups</code> tends to be very slow. <p> <pre> gap> GroupClass(IsNilpotent); GroupClass (in:=<Operation "IsNilpotent">) gap> GroupClass([CyclicGroup(2), CyclicGroup(3)]); GroupClass ([ <pc group of size 2 with 1 generators>, <pc group of size 3 with 1 generators> ]) gap> AbelianIsomorphismTest := function (A,B) > if IsAbelian (A) then > if IsAbelian (B) then > return AbelianInvariants (A) = AbelianInvariants (B); > else > return false; > fi; > elif IsAbelian (B) then > return false; > else # this will not happen if called from GroupClass > Error ("At least one of the groups <A> and <B> must be abelian"); > fi; > end; function( A, B ) ... end gap> cl := GroupClass ([AbelianGroup ([2,2]), AbelianGroup ([3,5])], > AbelianIsomorphismTest); GroupClass ([ <pc group of size 4 with 2 generators>, <pc group of size 15 with 2 generators> ], function( A, B ) ... end) gap> Group ((1,2), (3,4)) in cl; true </pre> <p> <a name = "SSEC001.2"></a> <li><code>Intersection(</code><var>list</var><code>) F</code> <li><code>Intersection(</code><var>C_1</var><code>, </code><var>C_2</var><code>, ..., </code><var>C_n</var><code>) F</code> <p> The intersection of a list <var>list</var> of group classes resp. of the group classes <var>C_1</var>, <var>C_2</var>, ..., <var>C_n</var> is again a group class. The intersection automatically has those closure properties (see <a href="CHAP003.htm#SECT002">Properties of group classes</a>) which all of the intersected classes have. <p> <p> <h2><a name="SECT002">3.2 Properties of group classes</a></h2> <p><p> <a name = "I1"></a> <a name = "I1"></a> <a name = "I2"></a> Since nonempty group classes are infinite, <font face="Gill Sans,Helvetica,Arial">CRISP</font> cannot, in general, decide whether a group class has a certain property. Therefore the user is required to set the appropriate properties and attributes. See Sections <a href="badlink:ref:attributes">attributes</a> and <a href="badlink:ref:properties">properties</a> in the <font face="Gill Sans,Helvetica,Arial">GAP</font> reference manual. To facilitate this task, there are special functions available to create common types of group classes such as formations (see <a href="CHAP004.htm#SECT004">Creating formations</a>), Fitting classes (see <a href="CHAP005.htm#SECT001">Creating Fitting classes</a>), and Schunck classes (see <a href="CHAP004.htm#SECT001">Creating Schunck classes</a>). <p> However, <font face="Gill Sans,Helvetica,Arial">CRISP</font> knows about the implications between the closure properties listed below; for instance it knows that a group class which has <code>IsResiduallyClosed</code> also has <code>IsDirectProductClosed</code>, and that a class having <code>IsSchunckClass</code> also has <code>IsDirectProductClosed</code> and <code>IsSaturated</code>. Moreover, the intersection of group classes all having one of the closure properties in common also has that closure property. <p> The following basic properties are defined for group classes. <p> <a name = "SSEC002.1"></a> <li><code>IsGroupClass(</code><var>grpclass</var><code>) P</code> <p> A generic class (see Chapter <a href="CHAP002.htm">set theoretical classes</a>) is considered a group class if it has the property <code>IsGroupClass</code>. There is no way for <font face="Gill Sans,Helvetica,Arial">CRISP</font> to <strong>know</strong> that a given class defined by a membership function is a group class, i. e., consists of groups and is closed under group isomorphisms. <p> <a name = "SSEC002.2"></a> <li><code>ContainsTrivialGroup(</code><var>grpclass</var><code>) P</code> <p> This property, if bound, indicates whether <var>grpclass</var> contains the trivial group or not. <p> <a name = "SSEC002.3"></a> <li><code>IsSubgroupClosed(</code><var>grpclass</var><code>) P</code> <p> if true, then for every <var>G</var> in <var>grpclass</var>, the subgroups of <var>G</var> likewise belong to <var>grpclass</var>. <p> <a name = "SSEC002.4"></a> <li><code>IsNormalSubgroupClosed(</code><var>grpclass</var><code>) P</code> <p> if true, then for every <var>G</var> in <var>grpclass</var>, the (sub)normal subgroups of <var>G</var> likewise belong to <var>grpclass</var>. <p> <a name = "SSEC002.5"></a> <li><code>IsQuotientClosed(</code><var>grpclass</var><code>) P</code> <p> if true, then for every <var>G</var> in <var>grpclass</var>, the factor groups of <var>G</var> likewise belong to <var>grpclass</var>. <p> <a name = "SSEC002.6"></a> <li><code>IsResiduallyClosed(</code><var>grpclass</var><code>) P</code> <p> if true and <var>G</var> is a group such that <var>G/N<sub>1</sub></var> and <var>G/N<sub>2</sub></var> belong to <var>grpclass</var> for two normal subgroups <var>N<sub>1</sub></var> and <var>N<sub>2</sub></var> of <var>G</var> <strong>which intersect trivially</strong>, then <var>G</var> belongs to <var>grpclass</var>. <p> <a name = "SSEC002.7"></a> <li><code>IsNormalProductClosed(</code><var>grpclass</var><code>) P</code> <p> if true and <var>G</var> is a group which is generated by subnormal subgroups in <var>grpclass</var>, then <var>G</var> belongs to <var>grpclass</var>. <p> <a name = "SSEC002.8"></a> <li><code>IsDirectProductClosed(</code><var>grpclass</var><code>) P</code> <p> if true and the group <var>G</var> is the direct product of <var>N<sub>1</sub></var> and <var>N<sub>2</sub></var> belonging to <var>grpclass</var>, then <var>G</var> likewise belongs to <var>grpclass</var>. <p> <a name = "SSEC002.9"></a> <li><code>IsSchunckClass(</code><var>grpclass</var><code>) P</code> <p> if true, then <var>G</var> belongs to <var>grpclass</var> if and only if its primitive factor groups lie in <var>grpclass</var>. A (finite) group is primitive if it has a faithful primitive permutation representation, or equivalently, if it has a maximal subgroup with trivial core. A Schunck class contains every trivial group. <p> <a name = "SSEC002.10"></a> <li><code>IsSaturated(</code><var>grpclass</var><code>) P</code> <p> if true, <var>G</var> belongs to <var>X</var> whenever <var>G</var>/<code>FrattiniSubgroup(</code><var>G</var><code>)</code> belongs to <var>X</var>. <p> <p> <h2><a name="SECT003">3.3 Additional properties of group classes</a></h2> <p><p> <a name = "I3"></a> <a name = "I4"></a> Note that the following ``properties'' are not properties but only filters in the <font face="Gill Sans,Helvetica,Arial">GAP</font> sense (cf. <a href="badlink:ref:Properties">Properties</a> and <a href="badlink:ref:filters">filters</a> in the <font face="Gill Sans,Helvetica,Arial">GAP</font> reference manual). <p> <a name = "SSEC003.1"></a> <li><code>HasIsFittingClass(</code><var>obj</var><code>) F</code> <p> is true if <var>obj</var> <strong>knows</strong> if it is a Fitting class, that is, if it lies in the filters <code>HasIsGroupClass</code>, <code>HasContainsTrivialGroup</code>, <code>HasIsNormalSubgroupClosed</code> and <code>HasIsNormalProductClosed</code>. <p> <a name = "SSEC003.2"></a> <li><code>IsFittingClass(</code><var>obj</var><code>) F</code> <p> is true if <var>obj</var> is a Fitting class, that is, if it has the properties <code>IsGroupClass</code>, <code>ContainsTrivialGroup</code>, <code>IsNormalSubgroupClosed</code> and <code>IsNormalProductClosed</code>. <p> <a name = "SSEC003.3"></a> <li><code>SetIsFittingClass(</code><var>group class</var><code>, </code><var>bool</var><code>) F</code> <p> If <var>bool</var> is <code>true</code>, this fake setter function sets the properties <code>IsNormalSubgroupClosed</code> and <code>IsNormalProductClosed</code> of <var>group class</var> to <var>true</var>. It is the user's responsibility to ensure that <var>group class</var> is indeed a Fitting class. <p> <pre> gap> nilp := GroupClass (IsNilpotent); GroupClass (in:=<Operation "IsNilpotent">) gap> SetIsFittingClass (nilp, true); gap> nilp; FittingClass (in:=<Operation "IsNilpotent">) </pre> <p> <a name = "SSEC003.4"></a> <li><code>HasIsOrdinaryFormation(</code><var>obj</var><code>) F</code> <p> <a name = "I5"></a> <code>HasIsGroupClass</code>, <code>HasContainsTrivialGroup</code>, <code>HasIsQuotientClosed</code> and <code>HasIsResiduallyClosed</code>. <p> <a name = "SSEC003.5"></a> <li><code>IsOrdinaryFormation(</code><var>obj</var><code>) F</code> <p> <a name = "I6"></a> <code>IsGroupClass</code>, <code>ContainsTrivialGroup</code>, <code>IsQuotientClosed</code> and <code>IsResiduallyClosed</code>. <p> <a name = "SSEC003.6"></a> <li><code>SetIsOrdinaryFormation(</code><var>class</var><code>, </code><var>bool</var><code>) F</code> <p> <a name = "I7"></a> <code>ContainsTrivialGroup</code>, and <code>IsResiduallyClosed</code> of <var>class</var>, making it a formation. <p> <a name = "SSEC003.7"></a> <li><code>HasIsSaturatedFormation(</code><var>obj</var><code>) F</code> <p> returns true if <var>obj</var> <strong>knows</strong> if it is a saturated formation, that is, if it lies in the filters <code>HasIsOrdinaryFormation</code> and <code>HasIsSaturated</code>. <p> <a name = "SSEC003.8"></a> <li><code>IsSaturatedFormation(</code><var>obj</var><code>) F</code> <p> returns true if <var>obj</var> is a saturated formation, that is, if it has the properties <code>IsOrdinaryFormation</code> and <code>IsSaturated</code> <p> <a name = "SSEC003.9"></a> <li><code>SetIsSaturatedFormation(</code><var>class</var><code>, </code><var>bool</var><code>) F</code> <p> If <var>bool</var> is <code>true</code>, this sets the attributes <code>IsQuotientClosed</code>, <code>ContainsTrivialGroup</code>, and <code>IsResiduallyClosed</code> and <code>IsSaturated</code> of <var>class</var>, making it a saturated formation. <p> <a name = "SSEC003.10"></a> <li><code>HasIsFittingFormation(</code><var>obj</var><code>) F</code> <p> returns true if <var>obj</var> <strong>knows</strong> whether it is a Fitting formation, that is, if it lies in the filters <code>HasIsOrdinaryFormation</code> and <code>HasIsFittingClass</code> (see <a href="CHAP003.htm#SSEC003.4">HasIsOrdinaryFormation</a> and <a href="CHAP003.htm#SSEC003.1">HasIsFittingClass</a>). <p> <a name = "SSEC003.11"></a> <li><code>IsFittingFormation(</code><var>obj</var><code>) F</code> <p> returns true if <var>obj</var> is both a formation and a Fitting class. <p> <a name = "SSEC003.12"></a> <li><code>SetIsFittingFormation(</code><var>class</var><code>, </code><var>bool</var><code>) F</code> <p> If <var>bool</var> is <code>true</code>, this function sets the attributes of <var>class</var> to indicate that it is a Fitting formation. <p> <a name = "SSEC003.13"></a> <li><code>HasIsSaturatedFittingFormation(</code><var>obj</var><code>) F</code> <p> returns true if <var>obj</var> <strong>knows</strong> whether it is a saturated Fitting formation, that is, if it lies in the filters <code>HasIsSaturatedFormation</code> and <code>HasIsFittingClass</code> (see <a href="CHAP003.htm#SSEC003.7">HasIsSaturatedFormation</a> and <a href="CHAP003.htm#SSEC003.1">HasIsFittingClass</a>). <p> <a name = "SSEC003.14"></a> <li><code>IsSaturatedFittingFormation(</code><var>obj</var><code>) F</code> <p> returns true if <var>obj</var> is both a saturated formation and a Fitting class, that is, if it lies in the filters <code>IsSaturatedFormation</code> and <code>IsFittingClass</code> (see <a href="CHAP003.htm#SSEC003.8">IsSaturatedFormation</a> and <a href="CHAP003.htm#SSEC003.2">IsFittingClass</a>). <p> <a name = "SSEC003.15"></a> <li><code>SetIsSaturatedFittingFormation(</code><var>class</var><code>, </code><var>bool</var><code>) F</code> <p> If <var>bool</var> is <code>true</code>, this sets the attributes of <var>class</var> to indicate that it is a saturated Fitting formation. <p> <p> <h2><a name="SECT004">3.4 Attributes of group classes</a></h2> <p><p> <a name = "I8"></a> <a name = "I9"></a> In addition to the attribute <code>MemberFunction</code> which has the same meaning as for generic classes, a group class may have the following attribute. <p> <a name = "SSEC004.1"></a> <li><code>Characteristic(</code><var>grpclass</var><code>) A</code> <p> This attribute, if present, stores a class containing all primes <var>p</var> such that <var>grpclass</var> contains a cyclic group of order <var>p</var>. There is a pre-defined class <code>AllPrimes</code> which should be assigned to <code>Characteristic</code> if <var>grpclass</var> contains a cyclic group of order <var>p</var> for every prime <var>p</var>. <p> <p> [<a href = "chapters.htm">Up</a>] [<a href ="CHAP002.htm">Previous</a>] [<a href ="CHAP004.htm">Next</a>] [<a href = "theindex.htm">Index</a>] <P> <address>CRISP manual<br>June 2007 </address></body></html>