<p>Here we describe all the non-interactive functions of the <strong class="pkg">ANUPQ</strong> package; i.e. <q>one-shot</q> functions that invoke the <code class="code">pq</code> program in such a way that once <strong class="pkg">GAP</strong> has got what it needs, the <code class="code">pq</code> program is allowed to exit. It is expected that most of the time users will only need these functions. The functions interface with three of the four algorithms (see Chapter <a href="chap1.html#X7DFB63A97E67C0A1"><span class="RefLink"><span class="Heading">Introduction</span></span></a>) provided by the ANU <code class="code">pq</code> C program, and are mainly grouped according to the algorithm of the <code class="code">pq</code> program they relate to.</p>
<p>In Section <a href="chap4.html#X80406BD47EB186E9"><span class="RefLink"><span class="Heading">Computing p-Quotients</span></span></a>, we describe the functions that give access to the <span class="SimpleMath">p</span>-quotient algorithm.</p>
<p>Section <a href="chap4.html#X7F05F8DC79733A8E"><span class="RefLink"><span class="Heading">Computing Standard Presentations</span></span></a> describe functions that give access to the standard presentation algorithm.</p>
<p>Section <a href="chap4.html#X8030FAE586423615"><span class="RefLink"><span class="Heading">Testing p-Groups for Isomorphism</span></span></a> describe functions that implement an isomorphism test for <span class="SimpleMath">p</span>-groups using the standard presentation algorithm.</p>
<p>In Section <a href="chap4.html#X8450C72580D91245"><span class="RefLink"><span class="Heading">Computing Descendants of a p-Group</span></span></a>, we describe functions that give access to the <span class="SimpleMath">p</span>-group generation algorithm.</p>
<p>To use any of the functions one must have at some stage previously typed:</p>
<p>(the response of which we have omitted; see <a href="chap3.html#X833D58248067E13B"><span class="RefLink"><span class="Heading">Loading the ANUPQ Package</span></span></a>).</p>
<p>It is strongly recommended that the user try the examples provided. To save typing there is a <code class="code">PqExample</code> equivalent for each manual example. We also suggest that to start with you may find the examples more instructive if you set the <code class="code">InfoANUPQ</code> level to 2 (see <code class="func">InfoANUPQ</code> (<a href="chap3.html#X7CBC9B458497BFF1"><span class="RefLink">3.3-1</span></a>)).</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ Pq</code>( <var class="Arg">F:</var> <var class="Arg">options</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>returns for the fp or pc group <var class="Arg">F</var>, the <span class="SimpleMath">p</span>-quotient of <var class="Arg">F</var> specified by <var class="Arg">options</var>, as a pc group. Following the colon, <var class="Arg">options</var> is a selection of the options from the following list, separated by commas like record components (see Section <a href="../../../doc/ref/chap4_mj.html#X867D54987EF86D1D"><span class="RefLink">Reference: Function Call With Options</span></a> in the <strong class="pkg">GAP</strong> Reference Manual). As a minimum the user <em>must</em> supply a value for the <code class="code">Prime</code> option. Below we list the options recognised by <code class="code">Pq</code> (see Chapter <a href="chap6.html#X7B0946E97E7EB359"><span class="RefLink"><span class="Heading">ANUPQ Options</span></span></a> for detailed descriptions).</p>
</li>
</ul>
<p><em>Notes:</em> <code class="code">Pq</code> may also be called with no arguments or one integer argument, in which case it is being used interactively (see <code class="func">Pq</code> (<a href="chap5.html#X85408C4C790439E7"><span class="RefLink">5.3-1</span></a>)); the same options may be used, except that <code class="code">SetupFile</code> and <code class="code">PqWorkspace</code> are ignored by the interactive <code class="code">Pq</code> function.</p>
<p>See Section <a href="chap3.html#X818175EF85CAA807"><span class="RefLink"><span class="Heading">Attributes and a Property for fp and pc p-groups</span></span></a> for the attributes and property <code class="code">NuclearRank</code>, <code class="code">MultiplicatorRank</code> and <codeclass="code">IsCapable</code> which may be applied to the group returned by <code class="code">Pq</code>.</p>
<p>See also <code class="code">PqEpimorphism</code> (<code class="func">PqEpimorphism</code> (<a href="chap4.html#X7ADE5DDB87B99CC0"><span class="RefLink">4.1-2</span></a>)).</p>
<p>We now give a few examples of the use of <code class="code">Pq</code>. Except for the addition of a few comments and the non-suppression of output (by not using duplicated semicolons) the next 3 examples may be run by typing: <code class="code">PqExample( "Pq" );</code> (see <code class="func">PqExample</code> (<a href="chap3.html#X7BB0EB607F337265"><span class="RefLink">3.4-4</span></a>)).</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">LoadPackage("anupq");; # does nothing if ANUPQ is already loaded</span>
<span class="GAPprompt">gap></span> <span class="GAPinput"># First we get a p-quotient of a free group of rank 2</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F := FreeGroup("a", "b");; a := F.1;; b := F.2;;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Pq( F : Prime := 2, ClassBound := 3 ); </span>
<pc group of size 1024 with 10 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput"># Now let us get a p-quotient of an fp group</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">G := F / [a^4, b^4];</span>
<fp group on the generators [ a, b ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">Pq( G : Prime := 2, ClassBound := 3 ); </span>
<pc group of size 256 with 8 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput"># Now let's get a different p-quotient of the same group
<span class="GAPprompt">gap></span> <span class="GAPinput">Pq( G : Prime := 2, ClassBound := 3, Exponent := 4 ); </span>
<pc group of size 128 with 7 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput"># Now we'll get a p-quotient of another fp group
<span class="GAPprompt">gap></span> <span class="GAPinput"># which we will redo using the `Relators' option
<span class="GAPprompt">gap></span> <span class="GAPinput">R := [ a^25, Comm(Comm(b, a), a), b^5 ];</span>
[ a^25, a^-1*b^-1*a*b*a^-1*b^-1*a^-1*b*a^2, b^5 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">H := F / R;</span>
<fp group on the generators [ a, b ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">Pq( H : Prime := 5, ClassBound := 5, Metabelian );</span>
<pc group of size 78125 with 7 generators>
</pre></div>
<p>Now we redo the last example to show how one may use the <code class="code">Relators</code> option. Observe that <code class="code">Comm(Comm(b, a), a)</code> is a left normed commutator which must be written in square bracket notation for the <code class="code">pq</code> program and embedded in a pair of double quotes. The function <code class="code">PqGAPRelators</code> (see <code class="func">PqGAPRelators</code> (<a href="chap3.html#X7A567432879510A6"><span class="RefLink">3.4-2</span></a>)) can be used to translate a list of strings prepared for the <code class="code">Relators</code> option into <strong class="pkg">GAP</strong> format. Below we use it. Observe that the value of <code class="code">R</code> is the same as before.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">F := FreeGroup("a", "b");;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput"># `F' was defined for `Relators'. We use the same strings that GAP uses</span>
<span class="GAPprompt">gap></span> <span class="GAPinput"># for printing the free group generators. It is *not* necessary to</span>
<span class="GAPprompt">gap></span> <span class="GAPinput"># predefine: a := F.1; etc. (as it was above).</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">rels := [ "a^25", "[b, a, a]", "b^5"];</span>
[ "a^25", "[b, a, a]", "b^5" ]
<span class="GAPprompt">gap></span> <span class="GAPinput">R := PqGAPRelators(F, rels);</span>
[ a^25, a^-1*b^-1*a*b*a^-1*b^-1*a^-1*b*a^2, b^5 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">H := F / R;</span>
<fp group on the generators [ a, b ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">Pq( H : Prime := 5, ClassBound := 5, Metabelian, </span>
<span class="GAPprompt">></span> <span class="GAPinput"> Relators := rels );</span>
<pc group of size 78125 with 7 generators>
</pre></div>
<p>In fact, above we could have just passed <code class="code">F</code> (rather than <code class="code">H</code>), i.e. we could have done:</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">F := FreeGroup("a", "b");;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">rels := [ "a^25", "[b, a, a]", "b^5"];</span>
[ "a^25", "[b, a, a]", "b^5" ]
<span class="GAPprompt">gap></span> <span class="GAPinput">Pq( F : Prime := 5, ClassBound := 5, Metabelian, </span>
<span class="GAPprompt">></span> <span class="GAPinput"> Relators := rels );</span>
<pc group of size 78125 with 7 generators>
</pre></div>
<p>The non-interactive <code class="code">Pq</code> function also allows the options to be passed in two other ways; these alternatives have been included for those familiar with the <strong class="pkg">GAP</strong> 3 version of the <strong class="pkg">ANUPQ</strong> package; the preferred method of passing options is the one already described. Firstly, they may be passed in a record as a second argument; note that any boolean options must be set explicitly e.g.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">Pq( H, rec( Prime := 5, ClassBound := 5, Metabelian := true ) );</span>
<pc group of size 78125 with 7 generators>
</pre></div>
<p>It is also possible to pass them as extra arguments, where each option name appears as a string followed immediately by its value (if not a boolean option) e.g.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">Pq( H, "Prime", 5, "ClassBound", 5, "Metabelian" );</span>
<pc group of size 78125 with 7 generators>
</pre></div>
<p>The preceding two examples can be run from <strong class="pkg">GAP</strong> via <code class="code">PqExample( "Pq-ni" );</code> (see <code class="func">PqExample</code> (<a href="chap3.html#X7BB0EB607F337265"><span class="RefLink">3.4-4</span></a>)).</p>
<p>This method of passing options permits abbreviation; the only restriction is that the abbreviation must be unique. So <code class="code">"Pr"</code> may be used for <code class="code">"Prime"</code>, <code class="code">"Class"</code> or even just <code class="code">"C"</code> for <code class="code">"ClassBound"</code>, etc.</p>
<p>The following example illustrates the use of the option <code class="code">Identities</code>. We compute the largest finite Burnside group of exponent <span class="SimpleMath">5</span> that also satisfies the <span class="SimpleMath">3</span>-Engel identity. Each identity is defined by a function whose arguments correspond to the variables of the identity. The return value of each of those functions is the identity evaluated on the arguments of the function.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">F := FreeGroup(2);</span>
<free group on the generators [ f1, f2 ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">Burnside5 := x->x^5;</span>
function( x ) ... end
<span class="GAPprompt">gap></span> <span class="GAPinput">Engel3 := function( x,y ) return PqLeftNormComm( [x,y,y,y] ); end;</span>
function( x, y ) ... end
<span class="GAPprompt">gap></span> <span class="GAPinput">Pq( F : Prime := 5, Identities := [ Burnside5, Engel3 ] );</span>
#I Class 1 with 2 generators.
#I Class 2 with 3 generators.
#I Class 3 with 5 generators.
#I Class 3 with 5 generators.
<pc group of size 3125 with 5 generators>
</pre></div>
<p>The above example can be run from <strong class="pkg">GAP</strong> via <code class="code">PqExample( "B5-5-Engel3-Id" );</code> (see <code class="func">PqExample</code> (<a href="chap3.html#X7BB0EB607F337265"><span class="RefLink">3.4-4</span></a>)).</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ PqEpimorphism</code>( <var class="Arg">F:</var> <var class="Arg">options</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>returns for the fp or pc group <var class="Arg">F</var> an epimorphism from <var class="Arg">F</var> onto the <span class="SimpleMath">p</span>-quotient of <var class="Arg">F</var> specified by <var class="Arg">options</var>; the possible options <var class="Arg">options</var> and <em>required</em> option (<code class="code">"Prime"</code>) are as for <code class="code">Pq</code> (see <code class="func">Pq</code> (<a href="chap4.html#X86DD32D5803CF2C8"><span class="RefLink">4.1-1</span></a>)). <code class="code">PqEpimorphism</code> only differs from <code class="code">Pq</code> in what it outputs; everything about what must/may be passed as input to <code class="code">PqEpimorphism</code> is the same as for <code class="code">Pq</code>. The same alternative methods of passing options to the non-interactive <code class="code">Pq</code> function are available to the non-interactive version of <code class="code">PqEpimorphism</code>.</p>
<p><em>Notes:</em> <code class="code">PqEpimorphism</code> may also be called with no arguments or one integer argument, in which case it is being used interactively (see <code class="func">PqEpimorphism</code> (<a href="chap5.html#X839E6F578227A8EA"><span class="RefLink">5.3-2</span></a>)), and the options <code class="code">SetupFile</code> and <code class="code">PqWorkspace</code> are ignored by the interactive <code class="code">PqEpimorphism</code> function.</p>
<p>See Section <a href="chap3.html#X818175EF85CAA807"><span class="RefLink"><span class="Heading">Attributes and a Property for fp and pc p-groups</span></span></a> for the attributes and property <code class="code">NuclearRank</code>, <code class="code">MultiplicatorRank</code> and <codeclass="code">IsCapable</code> which may be applied to the image group of the epimorphism returned by <code class="code">PqEpimorphism</code>.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">F := FreeGroup (2, "F");</span>
<free group on the generators [ F1, F2 ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">phi := PqEpimorphism( F : Prime := 5, ClassBound := 2 );</span>
[ F1, F2 ] -> [ f1, f2 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">Image( phi );</span>
<pc group of size 3125 with 5 generators>
</pre></div>
<p>Typing: <code class="code">PqExample( "PqEpimorphism" );</code> runs the above example in <strong class="pkg">GAP</strong> (see <code class="func">PqExample</code> (<a href="chap3.html#X7BB0EB607F337265"><span class="RefLink">3.4-4</span></a>)).</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ PqPCover</code>( <var class="Arg">F:</var> <var class="Arg">options</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>returns for the fp or pc group <var class="Arg">F</var>, the <span class="SimpleMath">p</span>-covering group of the <span class="SimpleMath">p</span>-quotient of <var class="Arg">F</var> specified by <var class="Arg">options</var>, as a pc group, i.e. the <span class="SimpleMath">p</span>-covering group of the <span class="SimpleMath">p</span>-quotient <code class="code">Pq( <var class="Arg">F</var> : <var class="Arg">options</var> )</code>. Thus the options that <code class="code">PqPCover</code> accepts are exactly those expected for <code class="code">Pq</code> (and hence as a minimum the user <em>must</em> supply a value for the <code class="code">Prime</code> option; see <code class="func">Pq</code> (<a href="chap4.html#X86DD32D5803CF2C8"><span class="RefLink">4.1-1</span></a>) for more details), except in the following special case.</p>
<p>If <var class="Arg">F</var> is already a <span class="SimpleMath">p</span>-group, in the sense that <code class="code">IsPGroup(<var class="Arg">F</var>)</code> is <code class="keyw">true</code>, then</p>
<dl>
<dt><strong class="Mark"><code class="code">Prime</code></strong></dt>
<dd><p>defaults to <code class="code">PrimePGroup(<var class="Arg">F</var>)</code>, if not supplied and <code class="code">HasPrimePGroup(<var class="Arg">F</var>) = true</code>; and</p>
</dd>
<dt><strong class="Mark"><code class="code">ClassBound</code></strong></dt>
<dd><p>defaults to <code class="code">PClassPGroup(<var class="Arg">F</var>)</code> if <code class="code">HasPClassPGroup(<var class="Arg">F</var>) = true</code> if not supplied, or to the usual default of 63, otherwise.</p>
</dd>
</dl>
<p>The same alternative methods of passing options to the non-interactive <code class="code">Pq</code> function are available to the non-interactive version of <code class="code">PqPCover</code>.</p>
<p>We now give a few examples of the use of <code class="code">PqPCover</code>. These examples are just a subset of the ones we gave for <code class="code">Pq</code> (see <code class="func">Pq</code> (<a href="chap4.html#X86DD32D5803CF2C8"><span class="RefLink">4.1-1</span></a>)), except that in each instance the command <code class="code">Pq</code> has been replaced with <code class="code">PqPCover</code>. Essentially the same examples may be run by typing: <code class="code">PqExample( "PqPCover" );</code> (see <code class="func">PqExample</code> (<a href="chap3.html#X7BB0EB607F337265"><span class="RefLink">3.4-4</span></a>)).</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">F := FreeGroup("a", "b");; a := F.1;; b := F.2;;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">PqPCover( F : Prime := 2, ClassBound := 3 );</span>
<pc group of size 262144 with 18 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput"></span>
<span class="GAPprompt">gap></span> <span class="GAPinput"># Now let's get a p-cover of a p-quotient of an fp group
<span class="GAPprompt">gap></span> <span class="GAPinput">G := F / [a^4, b^4];</span>
<fp group on the generators [ a, b ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">PqPCover( G : Prime := 2, ClassBound := 3 );</span>
<pc group of size 16384 with 14 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput"></span>
<span class="GAPprompt">gap></span> <span class="GAPinput"># Now let's get a p-cover of a different p-quotient of the same group
<span class="GAPprompt">gap></span> <span class="GAPinput">PqPCover( G : Prime := 2, ClassBound := 3, Exponent := 4 );</span>
<pc group of size 8192 with 13 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput"></span>
<span class="GAPprompt">gap></span> <span class="GAPinput"># Now we'll get a p-cover of a p-quotient of another fp group
<span class="GAPprompt">gap></span> <span class="GAPinput"># which we will redo using the `Relators' option
<span class="GAPprompt">gap></span> <span class="GAPinput">R := [ a^25, Comm(Comm(b, a), a), b^5 ];</span>
[ a^25, a^-1*b^-1*a*b*a^-1*b^-1*a^-1*b*a^2, b^5 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">H := F / R;</span>
<fp group on the generators [ a, b ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">PqPCover( H : Prime := 5, ClassBound := 5, Metabelian );</span>
<pc group of size 48828125 with 11 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput"></span>
<span class="GAPprompt">gap></span> <span class="GAPinput"># Now we redo the previous example using the `Relators' option
<span class="GAPprompt">gap></span> <span class="GAPinput">F := FreeGroup("a", "b");;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">rels := [ "a^25", "[b, a, a]", "b^5"];</span>
[ "a^25", "[b, a, a]", "b^5" ]
<span class="GAPprompt">gap></span> <span class="GAPinput">PqPCover( F : Prime := 5, ClassBound := 5, Metabelian, </span>
<span class="GAPprompt">></span> <span class="GAPinput"> Relators := rels );</span>
<pc group of size 48828125 with 11 generators>
</pre></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ PqStandardPresentation</code>( <var class="Arg">F:</var> <var class="Arg">options</var> )</td><td class="tdright">( function )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ StandardPresentation</code>( <var class="Arg">F:</var> <var class="Arg">options</var> )</td><td class="tdright">( method )</td></tr></table></div>
<p>return the <var class="Arg">p</var>-quotient specified by <var class="Arg">options</var> of the fp or pc <span class="SimpleMath">p</span>-group <var class="Arg">F</var>, as an <em>fp group</em> which has a standard presentation. Here <var class="Arg">options</var> is a selection of the options from the following list (see Chapter <a href="chap6.html#X7B0946E97E7EB359"><span class="RefLink"><span class="Heading">ANUPQ Options</span></span></a> for detailed descriptions). Section <a href="chap3.html#X7BA20FA07B166B37"><span class="RefLink"><span class="Heading">Hints and Warnings regarding the use of Options</span></span></a> gives some important hints and warnings regarding option usage, and Section <a href="../../../doc/ref/chap4_mj.html#X867D54987EF86D1D"><span class="RefLink">Reference: Function Call With Options</span></a> in the <strong class="pkg">GAP</strong> Reference Manual describes their <q>record</q>-like syntax.</p>
</li>
</ul>
<p>Unless <var class="Arg">F</var> is a pc <var class="Arg">p</var>-group, the user <em>must</em> supply either the option <code class="code">Prime</code> or the option <code class="code">pQuotient</code> (if both <code class="code">Prime</code> and <code class="code">pQuotient</code> are supplied, the prime <var class="Arg">p</var> is determined by applying <code class="code">PrimePGroup</code> (see <code class="func">PrimePGroup</code> (<a href="../../../doc/ref/chap39_mj.html#X87356BAA7E9E2142"><span class="RefLink">Reference: PrimePGroup</span></a>) in the Reference Manual) to the value of <code class="code">pQuotient</code>).</p>
<p>The options for <code class="code">PqStandardPresentation</code> may also be passed in the two other alternative ways described for <code class="code">Pq</code> (see <code class="func">Pq</code> (<a href="chap4.html#X86DD32D5803CF2C8"><span class="RefLink">4.1-1</span></a>)). <code class="code">StandardPresentation</code> does not provide these alternative ways of passing options.</p>
<p><em>Notes:</em> In contrast to the function <code class="code">Pq</code> (see <code class="func">Pq</code> (<a href="chap4.html#X86DD32D5803CF2C8"><span class="RefLink">4.1-1</span></a>)) which returns a pc group, <code class="code">PqStandardPresentation</code> or <code class="code">StandardPresentation</code> returns an fp group. This is because the output is mainly used for isomorphism testing for which an fp group is enough. However, the presentation is a polycyclic presentation and if you need to do any further computation with this group (e.g. to find the order) you can use the function <code class="code">PcGroupFpGroup</code> (see <code class="func">PcGroupFpGroup</code> (<a href="../../../doc/ref/chap46_mj.html#X84C10D1F7CB5274F"><span class="RefLink">Reference: PcGroupFpGroup</span></a>) in the <strong class="pkg">GAP</strong> Reference Manual) to form a pc group.</p>
<p>If the user does not supply a <var class="Arg">p</var>-quotient <var class="Arg">Q</var> via the <code class="code">pQuotient</code> option and the prime <var class="Arg">p</var> is either supplied or <var class="Arg">F</var> is a pc <var class="Arg">p</var>-group, then a <var class="Arg">p</var>-quotient <var class="Arg">Q</var> is computed. If the user does supply a <var class="Arg">p</var>-quotient <var class="Arg">Q</var> via the <code class="code">pQuotient</code> option, the package <strong class="pkg">AutPGrp</strong> is called to compute the automorphism group of <var class="Arg">Q</var>; an error will occur that asks the user to install the package <strong class="pkg">AutPGrp</strong> if the automorphism group cannot be computed.</p>
<p>The attributes and property <code class="code">NuclearRank</code>, <code class="code">MultiplicatorRank</code> and <code class="code">IsCapable</code> are set for the group returned by <code class="code">PqStandardPresentation</code> or <code class="code">StandardPresentation</code> (see Section <a href="chap3.html#X818175EF85CAA807"><span class="RefLink"><span class="Heading">Attributes and a Property for fp and pc p-groups</span></span></a>).</p>
<p>We illustrate the method with the following examples.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">F := FreeGroup( "a", "b" );; a := F.1;; b := F.2;;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">G := F / [a^25, Comm(Comm(b, a), a), b^5];</span>
<fp group on the generators [ a, b ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">S := StandardPresentation( G : Prime := 5, ClassBound := 10 );</span>
<fp group on the generators [ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11,
f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26 ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsPcGroup( S );</span>
false
<span class="GAPprompt">gap></span> <span class="GAPinput"># if we need to compute with S we should convert it to a pc group</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Spc := PcGroupFpGroup( S );</span>
<pc group of size 1490116119384765625 with 26 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput"></span>
<span class="GAPprompt">gap></span> <span class="GAPinput">H := F / [ a^625, Comm(Comm(Comm(Comm(b, a), a), a), a)/Comm(b, a)^5,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> Comm(Comm(b, a), b), b^625 ];;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">StandardPresentation( H : Prime := 5, ClassBound := 15, Metabelian );</span>
<fp group on the generators [ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11,
f12, f13, f14, f15, f16, f17, f18, f19, f20 ]>
<span class="GAPprompt">gap></span> <span class="GAPinput"></span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F4 := FreeGroup( "a", "b", "c", "d" );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">a := F4.1;; b := F4.2;; c := F4.3;; d := F4.4;;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">G4 := F4 / [ b^4, b^2 / Comm(Comm (b, a), a), d^16,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> a^16 / (c * d), b^8 / (d * c^4) ];</span>
<fp group on the generators [ a, b, c, d ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">K := Pq( G4 : Prime := 2, ClassBound := 1 );</span>
<pc group of size 4 with 2 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput">StandardPresentation( G4 : pQuotient := K, ClassBound := 14 );</span>
<fp group with 53 generators>
</pre></div>
<p>Typing: <code class="code">PqExample( "StandardPresentation" );</code> runs the above example in <strong class="pkg">GAP</strong> (see <code class="func">PqExample</code> (<a href="chap3.html#X7BB0EB607F337265"><span class="RefLink">3.4-4</span></a>)).</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ EpimorphismPqStandardPresentation</code>( <var class="Arg">F:</var> <var class="Arg">options</var> )</td><td class="tdright">( function )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ EpimorphismStandardPresentation</code>( <var class="Arg">F:</var> <var class="Arg">options</var> )</td><td class="tdright">( method )</td></tr></table></div>
<p>Each of the above functions accepts the same arguments and options as the function <code class="code">StandardPresentation</code> (see <code class="func">StandardPresentation</code> (<a href="chap4.html#X86C9575D7CB65FBB"><span class="RefLink">4.2-1</span></a>)) and returns an epimorphism from the fp or pc group <var class="Arg">F</var> onto the finitely presented group given by a standard presentation, i.e. if <var class="Arg">S</var> is the standard presentation computed for the <span class="SimpleMath">p</span>-quotient of <var class="Arg">F</var> by <code class="code">StandardPresentation</code> then <code class="code">EpimorphismStandardPresentation</code> returns the epimorphism from <var class="Arg">F</var> to the group with presentation <var class="Arg">S</var>.</p>
<p><em>Note:</em> The attributes and property <code class="code">NuclearRank</code>, <code class="code">MultiplicatorRank</code> and <code class="code">IsCapable</code> are set for the image group of the epimorphism returned by <code class="code">EpimorphismPqStandardPresentation</code> or <code class="code">EpimorphismStandardPresentation</code> (see Section <a href="chap3.html#X818175EF85CAA807"><span class="RefLink"><span class="Heading">Attributes and a Property for fp and pc p-groups</span></span></a>).</p>
<p>We illustrate the function with the following example.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">F := FreeGroup(6, "F");</span>
<free group on the generators [ F1, F2, F3, F4, F5, F6 ]>
<span class="GAPprompt">gap></span> <span class="GAPinput"># For printing GAP uses the symbols F1, ... for the generators of F</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">x := F.1;; y := F.2;; z := F.3;; w := F.4;; a := F.5;; b := F.6;;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">R := [x^3 / w, y^3 / w * a^2 * b^2, w^3 / b,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> Comm (y, x) / z, Comm (z, x), Comm (z, y) / a, z^3 ];;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Q := F / R;</span>
<fp group on the generators [ F1, F2, F3, F4, F5, F6 ]>
<span class="GAPprompt">gap></span> <span class="GAPinput"># For printing GAP also uses the symbols F1, ... for the generators of Q</span>
<span class="GAPprompt">gap></span> <span class="GAPinput"># (the same as used for F) ... but the gen'rs of Q and F are different:
<span class="GAPprompt">gap></span> <span class="GAPinput">GeneratorsOfGroup(F) = GeneratorsOfGroup(Q);</span>
false
<span class="GAPprompt">gap></span> <span class="GAPinput">G := Pq( Q : Prime := 3, ClassBound := 3 );</span>
<pc group of size 729 with 6 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput">phi := EpimorphismStandardPresentation( Q : Prime := 3,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> ClassBound := 3 );</span>
[ F1, F2, F3, F4, F5, F6 ] -> [ f1*f2^2*f3*f4^2*f5^2, f1*f2*f3*f5, f3^2,
f4*f6^2, f5, f6 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">Source(phi); # This is the group Q (GAP uses F1, ... for gen'r symbols)
<fp group of size infinity on the generators [ F1, F2, F3, F4, F5, F6 ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">Range(phi); # This is the group G (GAP uses f1, ... for gen'r symbols)
<fp group on the generators [ f1, f2, f3, f4, f5, f6 ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">AssignGeneratorVariables(G);</span>
#I Assigned the global variables [ f1, f2, f3, f4, f5, f6 ]
<span class="GAPprompt">gap></span> <span class="GAPinput"># Just to see that the images of [F1, ..., F6] do generate G</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Group([ f1*f2^2*f3, f1*f2*f3*f4*f5^2*f6^2, f3^2, f4, f5, f6 ]) = G;</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">Size( Image(phi) );</span>
729
</pre></div>
<p>Typing: <code class="code">PqExample( "EpimorphismStandardPresentation" );</code> runs the above example in <strong class="pkg">GAP</strong> (see <code class="func">PqExample</code> (<a href="chap3.html#X7BB0EB607F337265"><span class="RefLink">3.4-4</span></a>)). Note that <code class="code">AssignGeneratorVariables</code> (see <code class="func">AssignGeneratorVariables</code> (<a href="../../../doc/ref/chap37_mj.html#X814203E281F3272E"><span class="RefLink">Reference: AssignGeneratorVariables</span></a>)) has only been available since <strong class="pkg">GAP</strong> 4.3.</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ IsPqIsomorphicPGroup</code>( <var class="Arg">G</var>, <var class="Arg">H</var> )</td><td class="tdright">( function )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ IsIsomorphicPGroup</code>( <var class="Arg">G</var>, <var class="Arg">H</var> )</td><td class="tdright">( method )</td></tr></table></div>
<p>each return true if <var class="Arg">G</var> is isomorphic to <var class="Arg">H</var>, where both <var class="Arg">G</var> and <var class="Arg">H</var> must be pc groups of prime power order. These functions compute and compare in <strong class="pkg">GAP</strong> the fp groups given by standard presentations for <var class="Arg">G</var> and <var class="Arg">H</var> (see <code class="func">StandardPresentation</code> (<a href="chap4.html#X86C9575D7CB65FBB"><span class="RefLink">4.2-1</span></a>)).</p>
<p>Typing: <code class="code">PqExample( "IsIsomorphicPGroup" );</code> runs the above example in <strong class="pkg">GAP</strong> (see <code class="func">PqExample</code> (<a href="chap3.html#X7BB0EB607F337265"><span class="RefLink">3.4-4</span></a>)).</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ PqDescendants</code>( <var class="Arg">G:</var> <var class="Arg">options</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>returns, for the pc group <var class="Arg">G</var> which must be of prime power order with a confluent pc presentation (see <code class="func">IsConfluent</code> (<a href="../../../doc/ref/chap46_mj.html#X7DF4835F79667099"><span class="RefLink">Reference: IsConfluent for pc groups</span></a>) in the <strong class="pkg">GAP</strong> Reference Manual), a list of descendants (pc groups) of <var class="Arg">G</var>. Following the colon <var class="Arg">options</var> a selection of the options listed below should be given, separated by commas like record components (see Section <a href="../../../doc/ref/chap4_mj.html#X867D54987EF86D1D"><span class="RefLink">Reference: Function Call With Options</span></a> in the <strong class="pkg">GAP</strong> Reference Manual). See Chapter <a href="chap6.html#X7B0946E97E7EB359"><span class="RefLink"><span class="Heading">ANUPQ Options</span></span></a> for detailed descriptions of the options.</p>
<p>The automorphism group of each descendant <var class="Arg">D</var> is also computed via a call to the <code class="code">AutomorphismGroupPGroup</code> function of the <strong class="pkg">AutPGrp</strong> package.</p>
</li>
</ul>
<p><em>Notes:</em> The function <code class="code">PqDescendants</code> uses the automorphism group of <var class="Arg">G</var> which it computes via the package <strong class="pkg">AutPGrp</strong>. If this package is not installed an error may be raised. If the automorphism group of <var class="Arg">G</var> is insoluble, the <code class="code">pq</code> program will call <strong class="pkg">GAP</strong> together with the <strong class="pkg">AutPGrp</strong> package for certain orbit-stabilizer calculations. (So, in any case, one should ensure the <strong class="pkg">AutPGrp</strong> package is installed.)</p>
<p>The attributes and property <code class="code">NuclearRank</code>, <code class="code">MultiplicatorRank</code> and <code class="code">IsCapable</code> are set for each group of the list returned by <code class="code">PqDescendants</code> (see Section <a href="chap3.html#X818175EF85CAA807"><span class="RefLink"><span class="Heading">Attributes and a Property for fp and pc p-groups</span></span></a>).</p>
<p>The options <var class="Arg">options</var> for <code class="code">PqDescendants</code> may be passed in an alternative manner to that already described, namely you can pass <code class="code">PqDescendants</code> a record as an argument, which contains as entries some (or all) of the above mentioned. Those parameters which do not occur in the record are set to their default values.</p>
<p>Note that you cannot set both <code class="code">OrderBound</code> and <code class="code">StepSize</code>.</p>
<p>In the first example we compute all descendants of the Klein four group which have exponent-2 class at most 5 and order at most <span class="SimpleMath">2^6</span>.</p>
<p>Below, we compute all capable descendants of order 27 of the elementary abelian group of order 9.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">F := FreeGroup( 2, "g" );</span>
<free group on the generators [ g1, g2 ]>
<span class="GAPprompt">gap></span> <span class="GAPinput">G := PcGroupFpGroup( F / [ F.1^3, F.2^3, Comm(F.1, F.2) ] );</span>
<pc group of size 9 with 2 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput">des := PqDescendants( G : OrderBound := 3, ClassBound := 2,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> CapableDescendants );</span>
[ <pc group of size 27 with 3 generators>,
<pc group of size 27 with 3 generators> ]
<span class="GAPprompt">gap></span> <span class="GAPinput">List(des, d -> Length( PCentralSeries( d, 3 ) ) - 1 );</span>
[ 2, 2 ]
<span class="GAPprompt">gap></span> <span class="GAPinput"># For comparison let us now compute all descendants</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">PqDescendants( G : OrderBound := 3, ClassBound := 2);</span>
[ <pc group of size 27 with 3 generators>,
<pc group of size 27 with 3 generators>,
<pc group of size 27 with 3 generators> ]
</pre></div>
<p>In the third example, we compute all capable descendants of the elementary abelian group of order <span class="SimpleMath">5^2</span> which have exponent-<span class="SimpleMath">5</span> class at most <span class="SimpleMath">3</span>, exponent <span class="SimpleMath">5</span>, and are metabelian.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">F := FreeGroup( 2, "g" );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">G := PcGroupFpGroup( F / [ F.1^5, F.2^5, Comm(F.2, F.1) ] );</span>
<pc group of size 25 with 2 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput">des := PqDescendants( G : Metabelian, ClassBound := 3,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> Exponent := 5, CapableDescendants );</span>
[ <pc group of size 125 with 3 generators>,
<pc group of size 625 with 4 generators>,
<pc group of size 3125 with 5 generators> ]
<span class="GAPprompt">gap></span> <span class="GAPinput">List(des, d -> Length( PCentralSeries( d, 5 ) ) - 1 );</span>
[ 2, 3, 3 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">List(des, d -> Length( DerivedSeries( d ) ) );</span>
[ 3, 3, 3 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">List(des, d -> Maximum( List( d, Order ) ) );</span>
[ 5, 5, 5 ]
</pre></div>
<p>The examples <code class="code">"PqDescendants-1"</code>, <code class="code">"PqDescendants-2"</code> and <code class="code">"PqDescendants-3"</code> (in order) are essentially the same as the above three examples (see <code class="func">PqExample</code> (<a href="chap3.html#X7BB0EB607F337265"><span class="RefLink">3.4-4</span></a>)).</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ PqSupplementInnerAutomorphisms</code>( <var class="Arg">D</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>returns a generating set for a supplement to the inner automorphisms of <var class="Arg">D</var>, in the form of a record with fields <code class="code">agAutos</code>, <code class="code">agOrder</code> and <code class="code">glAutos</code>, as provided by the <code class="code">pq</code> program. One should be very careful in using these automorphisms for a descendant calculation.</p>
<p><em>Note:</em> In principle there must be a way to use those automorphisms in order to compute descendants but there does not seem to be a way to hand back these automorphisms properly to the <code class="code">pq</code> program.</p>
<p>Typing: <code class="code">PqExample( "PqSupplementInnerAutomorphisms" );</code> runs the above example in <strong class="pkg">GAP</strong> (see <code class="func">PqExample</code> (<a href="chap3.html#X7BB0EB607F337265"><span class="RefLink">3.4-4</span></a>)).</p>
<p>Note that by also including <code class="code">PqStart</code> as a second argument to <code class="code">PqExample</code> one can see how it is possible, with the aid of <code class="code">PqSetPQuotientToGroup</code> (see <code class="func">PqSetPQuotientToGroup</code> (<a href="chap5.html#X80CCF6D379E5A3B4"><span class="RefLink">5.3-7</span></a>)), to do the equivalent computations with the interactive versions of <code class="code">Pq</code> and <code class="code">PqDescendants</code> and a single <code class="code">pq</code> process (recall <code class="code">pq</code> is the name of the external C program).</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ PqList</code>( <var class="Arg">filename:</var> [<var class="Arg">SubList</var> <var class="Arg">:=</var> <var class="Arg">sub</var>] )</td><td class="tdright">( function )</td></tr></table></div>
<p>reads a file with name <var class="Arg">filename</var> (a string) and returns the list <var class="Arg">L</var> of pc groups (or with option <code class="code">SubList</code> a sublist of <var class="Arg">L</var> or a single pc group in <var class="Arg">L</var>) defined in that file. If the option <code class="code">SubList</code> is passed and has the value <var class="Arg">sub</var>, then it has the same meaning as for <code class="code">PqDescendants</code>, i.e. if <var class="Arg">sub</var> is an integer then <code class="code">PqList</code> returns <code class="code"><var class="Arg">L</var>[<var class="Arg">sub</var>]</code>; otherwise, if <var class="Arg">sub</var> is a list of integers <codeclass="code">PqList</code> returns <code class="code">Sublist(<var class="Arg">L</var>, <var class="Arg">sub</var> )</code>.</p>
<p>Both <code class="code">PqList</code> and <code class="code">SavePqList</code> (see <code class="func">SavePqList</code> (<a href="chap4.html#X85ADB9E6870EC3D1"><span class="RefLink">4.4-4</span></a>)) can be used to save and restore a list of descendants (see <code class="func">PqDescendants</code> (<a href="chap4.html#X80985CC479CD9FA3"><span class="RefLink">4.4-1</span></a>)).</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ SavePqList</code>( <var class="Arg">filename</var>, <var class="Arg">list</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>writes a list of descendants <var class="Arg">list</var> to a file with name <var class="Arg">filename</var> (a string).</p>
<p><code class="code">SavePqList</code> and <code class="code">PqList</code> (see <code class="func">PqList</code> (<a href="chap4.html#X79AD54E987FCACBA"><span class="RefLink">4.4-3</span></a>)) can be used to save and restore, respectively, the results of <code class="code">PqDescendants</code> (see <code class="func">PqDescendants</code> (<a href="chap4.html#X80985CC479CD9FA3"><span class="RefLink">4.4-1</span></a>)).</p>
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 ist noch experimentell.