Sophie

Sophie

distrib > * > 2010.0 > * > by-pkgid > 0c1f9463f03451b5503f0c33beb88a98 > files > 1079

gap-system-4.4.12-5mdv2010.0.x86_64.rpm

<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&nbsp;<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&gt; GroupClass(IsNilpotent);
GroupClass (in:=&lt;Operation "IsNilpotent"&gt;)
gap&gt; GroupClass([CyclicGroup(2), CyclicGroup(3)]);
GroupClass ([ &lt;pc group of size 2 with 1 generators&gt;, 
  &lt;pc group of size 3 with 1 generators&gt; ])
gap&gt; AbelianIsomorphismTest := function (A,B)
&gt;     if IsAbelian (A) then
&gt;         if IsAbelian (B) then
&gt;             return AbelianInvariants (A) = AbelianInvariants (B);
&gt;         else
&gt;             return false;
&gt;         fi;
&gt;     elif IsAbelian (B) then
&gt;         return false;
&gt;     else # this will not happen if called from GroupClass
&gt;         Error ("At least one of the groups &lt;A&gt; and &lt;B&gt; must be abelian");
&gt;     fi;
&gt; end;
function( A, B ) ... end
gap&gt; cl := GroupClass ([AbelianGroup ([2,2]), AbelianGroup ([3,5])],
&gt; AbelianIsomorphismTest);
GroupClass ([ &lt;pc group of size 4 with 2 generators&gt;, 
  &lt;pc group of size 15 with 2 generators&gt; ], function( A, B ) ... end)
gap&gt; 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.&nbsp;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&gt; nilp := GroupClass (IsNilpotent);
GroupClass (in:=&lt;Operation "IsNilpotent"&gt;)
gap&gt; SetIsFittingClass (nilp, true);
gap&gt; nilp;
FittingClass (in:=&lt;Operation "IsNilpotent"&gt;)
</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&nbsp;<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&nbsp;<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>