|
|
|
|
Quelle chap4.html
Sprache: HTML
|
|
| products/Sources/formale Sprachen/GAP/pkg/ctbllib/doc2/chap4.html |
 |
<?xml version= "1.0" encoding= "UTF-8"?>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
< html xmlns= "http://www.w3.org/1999/xhtml" xml:lang= "en">
< head>
< title>GAP (CTblLibXpls) - Chapter 4: GAP Computations Concerning Hamiltonian Cycles in the Ge nerating Graphs of Finite Groups</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="generator" content="GAPDoc2HTML" />
<link rel="stylesheet" type="text/css" href="manual.css" />
<script src="manual.js" type="text/javascript"></script>
<script type="text/javascript">overwriteStyle();</script>
</head>
<body class="chap4" onload="jscontent()">
<div class="chlinktop"><span class="chlink1">Goto Chapter: </span><a href="chap0.html">Top</a> <a href="chap1.html">1</a> <a href="chap2.html">2</a> <a href="chap3.html">3</a> <a href="chap4.html">4</a> <a href="chap5.html">5</a> <a href="chap6.html">6</a> <a href="chap7.html">7</a> <a href="chap8.html">8</a> <a href="chap9.html">9</a> <a href="chap10.html">10</a> <a href="chap11.html">11</a> <a href="chapBib.html">Bib</a> <a href="chapInd.html">Ind</a> </div>
<div class="chlinkprevnexttop"> <a href="chap0.html">[Top of Book]</a> <a href="chap0.html#contents">[Contents]</a> <a href="chap3.html">[Previous Chapter]</a> <a href="chap5.html">[Next Chapter]</a> </div>
<p id="mathjaxlink" class="pcenter"><a href="chap4_mj.html">[MathJax on]</a></p>
<p><a id="X7D5919C182B1A462" name="X7D5919C182B1A462"></a></p>
<div class="ChapSects"><a href="chap4.html#X7D5919C182B1A462">4 <span class="Heading"><strong class="pkg">GAP</strong> Computations Concerning Hamiltonian Cycles in the Generating Graphs of Finite Groups</span></a>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap4.html#X8389AD927B74BA4A">4.1 <span class="Heading">Overview</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap4.html#X7B6AEBDF7B857E2E">4.2 <span class="Heading">Theoretical Background</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss"> </span><a href="chap4.html#X7AD3962D7AE4ADFB">4.2-1 <span class="Heading">Character-Theoretic Lower Bounds for Vertex Degrees</span></a>
</span>
<span class="ContSS"><br /><span class="nocss"> </span><a href="chap4.html#X825776BA8687E475">4.2-2 <span class="Heading">Checking the Criteria</span></a>
</span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap4.html#X7B56BE5384BAD54E">4.3 <span class="Heading"><strong class="pkg">GAP</strong> Functions for the Computations</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss"> </span><a href="chap4.html#X802B2ED2802334B0">4.3-1 <span class="Heading">Computing Vertex Degrees from the Group</span></a>
</span>
<span class="ContSS"><br /><span class="nocss"> </span><a href="chap4.html#X87FE2DDD7F086D2F">4.3-2 <span class="Heading">Computing Lower Bounds for Vertex Degrees</span></a>
</span>
<span class="ContSS"><br /><span class="nocss"> </span><a href="chap4.html#X8677A8B1788ACD2C">4.3-3 <span class="Heading">Evaluating the (Lower Bounds for the) Vertex Degrees</span></a>
</span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap4.html#X7A221012861440E2">4.4 <span class="Heading">Character-Theoretic Computations</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss"> </span><a href="chap4.html#X86CE51E180A3D4ED">4.4-1 <span class="Heading">Sporadic Simple Groups</span></a>
</span>
<span class="ContSS"><br /><span class="nocss"> </span><a href="chap4.html#X867D338F7F453092">4.4-2 <span class="Heading">The Monster</span></a>
</span>
<span class="ContSS"><br /><span class="nocss"> </span><a href="chap4.html#X7DC6DFCC83502CC3">4.4-3 <span class="Heading">Nonsimple Automorphism Groups of Sporadic Simple Groups</span></a>
</span>
<span class="ContSS"><br /><span class="nocss"> </span><a href="chap4.html#X8130C9CB7A33140F">4.4-4 <span class="Heading">Alternating and Symmetric Groups <span class="SimpleMath">A_n</span>, <span class="SimpleMath">S_n</span>,
for <span class="SimpleMath">5 ≤ n ≤ 13</span></span></a>
</span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap4.html#X83DACCF07EF62FAE">4.5 <span class="Heading">Computations With Groups</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss"> </span><a href="chap4.html#X7B9ADC91802EE09F">4.5-1 <span class="Heading">Nonabelian Simple Groups of Order up to <span class="SimpleMath">10^7</span></span></a>
</span>
<span class="ContSS"><br /><span class="nocss"> </span><a href="chap4.html#X8033892B7FD6E62B">4.5-2 <span class="Heading">Nonsimple Groups with Nonsolvable Socle of Order at most <span class="SimpleMath">10^6</span></span></a>
</span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap4.html#X84E62545802FAB30">4.6 <span class="Heading">The Groups <span class="SimpleMath">PSL(2,q)</span></span></a>
</span>
</div>
</div>
<h3>4 <span class="Heading"><strong class="pkg">GAP</strong> Computations Concerning Hamiltonian Cycles in the Generating Graphs of Finite Groups</span></h3>
<p>Date: April 24th, 2012</p>
<p>This is a collection of examples showing how the <strong class="pkg">GAP</strong> system <a href="chapBib.html#biBGAP">[GAP24]</a> can be used to compute information about the generating graphs of finite groups. It includes all examples that were needed for the computational results in <a href="chapBib.html#biBGMN">[BGL+10]</a>.</p>
<p>The purpose of this writeup is twofold. On the one hand, the computations are documented this way. On the other hand, the <strong class="pkg">GAP</strong> code shown for the examples can be used as test input for automatic checking of the data and the functions used.</p>
<p>A first version of this document, which was based on <strong class="pkg">GAP</strong> 4.4.12, is available in the arXiv at <span class="URL"><a href="http://arxiv.org/abs/0911.5589v1">http://arxiv.org/abs/0911.5589v1</a></span> since November 2009. The differences between this file and the current document are as follows.</p>
<ul>
<li><p>The format of the <strong class="pkg">GAP</strong> output was adjusted to the changed behaviour of <strong class="pkg">GAP</strong> 4.5.</p>
</li>
<li><p>The records returned by <code class="func">IsomorphismTypeInfoFiniteSimpleGroup</code> (<a href="../../../doc/ref/chap39.html#X7C6AA6897C4409AC"><span class="RefLink">Reference: IsomorphismTypeInfoFiniteSimpleGroup</span></a>) contain a component <code class="code">"shortname"</code> since <strong class="pkg">GAP</strong> 4.11.</p>
</li>
<li><p>The lower bounds computed for the sporadic simple Monster group have been improved in three steps.</p>
<p>First, the existence of exactly one class of maximal subgroups of the type <span class="SimpleMath">PSL(2, 41)</span> (see <a href="chapBib.html#biBNW12">[NW13]</a>) and the nonexistence of maximal subgroups with socle <span class="SimpleMath">PSL(2, 27)</span> (see <a href="chapBib.html#biBWil10">[Wil10]</a>) have been incorporated.</p>
<p>Second, the classification of classes of maximal subgroups of the Monster has been completed in <a href="chapBib.html#biBDLP25">[DLP25]</a>. As a consequence, the nonexistence of maximal subgroups with socle Sz<span class="SimpleMath">(8)</span> and <span class="SimpleMath">PSU(3, 8)</span> and the existence of exactly one class of maximal subgroups with the isomorphism types <span class="SimpleMath">PSL(2, 13).2</span> and <span class="SimpleMath">PSU(3, 4).4</span> have been proved, and the proof of the nonexistence of the previously claimed subgroups of the type <span class="SimpleMath">L_2(59)</span> yields that the Monster has maximal subgroups of the type <span class="SimpleMath">59:29</span>. Moreover, meanwhile also all class fusions of the maximal subgroups are known; previously, we got only candidates for some primitive permutation characters.</p>
<p>Third, all character tables of maximal subgroups of the Monster group and their class fusions are available since version 1.3.10 of <strong class="pkg">CTblLib</strong>, hence no special treatment for the Monster group is needed anymore in order to compute its primitive permutation characters. In particular, the data file <code class="file">data/prim_perm_M.json</code> of <strong class="pkg">CTblLib</strong> is no longer needed. In earlier versions, that file had been used to collect information about primitive permutation characters for which the character table was not yet available.</p>
<p>See Section <a href="chap4.html#X867D338F7F453092"><span class="RefLink">4.4-2</span></a> for comments on earlier versions, and for the bounds that had been computed from the partial information that was available at that time.</p>
</li>
</ul>
<p><a id="X8389AD927B74BA4A" name="X8389AD927B74BA4A"></a></p>
<h4>4.1 <span class="Heading">Overview</span></h4>
<p>The purpose of this note is to document the <strong class="pkg">GAP</strong> computations that were carried out in order to obtain the computational results in <a href="chapBib.html#biBGMN">[BGL+10]</a>.</p>
<p>In order to keep this note self-contained, we first describe the theory needed, in Section <a href="chap4.html#X7B6AEBDF7B857E2E"><span class="RefLink">4.2</span></a>. The translation of the relevant formulae into <strong class="pkg">GAP</strong> functions can be found in Section <a href="chap4.html#X7B56BE5384BAD54E"><span class="RefLink">4.3</span></a>. Then Section <a href="chap4.html#X7A221012861440E2"><span class="RefLink">4.4</span></a> describes the computations that only require (ordinary) character tables in the <strong class="pkg">GAP</strong> Character Table Library <a href="chapBib.html#biBCTblLib">[Bre25]</a>. Computations using also the groups are shown in Section <a href="chap4.html#X83DACCF07EF62FAE"><span class="RefLink">4.5</span></a>.</p>
<p>The examples use the <strong class="pkg">GAP</strong> Character Table Library and the <strong class="pkg">GAP</strong> Library of Tables of Marks, so we first load these packages in the required versions.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">if not CompareVersionNumbers( GAPInfo.Version, "4.5" ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> Error( "need GAP in version at least 4.5" );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">LoadPackage( "ctbllib", "1.2", false );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">LoadPackage( "tomlib", "1.1.1", false );</span>
true
</pre></div>
<p><a id="X7B6AEBDF7B857E2E" name="X7B6AEBDF7B857E2E"></a></p>
<h4>4.2 <span class="Heading">Theoretical Background</span></h4>
<p>Let <span class="SimpleMath">G</span> be a finite noncyclic group and denote by <span class="SimpleMath">G^×</span> the set of nonidentity elements in <span class="SimpleMath">G</span>. We define the <em>generating graph</em> <span class="SimpleMath">Γ(G)</span> as the undirected graph on the vertex set <span class="SimpleMath">G^×</span> by joining two elements <span class="SimpleMath">x, y ∈ G^×</span> by an edge if and only if <span class="SimpleMath">⟨ x, y ⟩ = G</span> holds. For <span class="SimpleMath">x ∈ G^×</span>, the <em>vertex degree</em> <span class="SimpleMath">d(Γ, x)</span> is <span class="SimpleMath">|{ y ∈ G^×; ⟨ x, y ⟩ = G }|</span>. The <em>closure</em> <span class="SimpleMath">cl(Γ)</span> of the graph <span class="SimpleMath">Γ</span> with <span class="SimpleMath">m</span> vertices is defined as the graph with the same vertex set as <span class="SimpleMath">Γ</span>, where the vertices <span class="SimpleMath">x, y</span> are joined by an edge if they are joined by an edge in <span class="SimpleMath">Γ</span> or if <span class="SimpleMath">d(Γ, x) + d(Γ, y) ≥ m</span>. We denote iterated closures by <span class="SimpleMath">cl^(i)(Γ) = cl(cl^(i-1)(Γ))</span>, where <span class="SimpleMath">cl^(0)(Γ) = Γ</span>.</p>
<p>In the following, we will show that the generating graphs of the following groups contain a Hamiltonian cycle:</p>
<ul>
<li><p>Nonabelian simple groups of orders at most <span class="SimpleMath">10^7</span>,</p>
</li>
<li><p>groups <span class="SimpleMath">G</span> containing a unique minimal normal subgroup <span class="SimpleMath">N</span> such that <span class="SimpleMath">N</span> has order at most <span class="SimpleMath">10^6</span>, <span class="SimpleMath">N</span> is nonsolvable, and <span class="SimpleMath">G/N</span> is cyclic,</p>
</li>
<li><p>sporadic simple groups and their automorphism groups.</p>
</li>
</ul>
<p>Clearly the condition that <span class="SimpleMath">G/N</span> is cyclic for all nontrivial normal subgroups <span class="SimpleMath">N</span> of <span class="SimpleMath">G</span> is necessary for <span class="SimpleMath">Γ(G)</span> being connected, and <a href="chapBib.html#biBGMN">[BGL+10, Conjecture 1.6]</a> states that this condition is also sufficient. By <a href="chapBib.html#biBGMN">[BGL+10, Proposition 1.1]</a>, this conjecture is true for all solvable groups, and the second entry in the above list implies that this conjecture holds for all nonsolvable groups of order up to <span class="SimpleMath">10^6</span>.</p>
<p>The question whether a graph <span class="SimpleMath">Γ</span> contains a Hamiltonian cycle (i. e., a closed path in <span class="SimpleMath">Γ</span> that visits each vertex exactly once) can be answered using the following sufficient criteria (see <a href="chapBib.html#biBGMN">[BGL+10]</a>). Let <span class="SimpleMath">d_1 ≤ d_2 ≤ ⋯ ≤ d_m</span> be the vertex degrees in <span class="SimpleMath">Γ</span>.</p>
<dl>
<dt><strong class="Mark">Pósa's criterion:</strong></dt>
<dd><p>If <span class="SimpleMath">d_k ≥ k+1</span> holds for <span class="SimpleMath">1 ≤ k < m/2</span> then <span class="SimpleMath">Γ</span> contains a Hamiltonian cycle.</p>
</dd>
<dt><strong class="Mark">Chvátal's criterion:</strong></dt>
<dd><p>If <span class="SimpleMath">d_k ≥ k+1</span> or <span class="SimpleMath">d_m-k ≥ m-k</span> holds for <span class="SimpleMath">1 ≤ k < m/2</span> then <span class="SimpleMath">Γ</span> contains a Hamiltonian cycle.</p>
</dd>
<dt><strong class="Mark">Closure criterion:</strong></dt>
<dd><p>A graph contains a Hamiltonian cycle if and only if its closure contains a Hamiltonian cycle.</p>
</dd>
</dl>
<p><a id="X7AD3962D7AE4ADFB" name="X7AD3962D7AE4ADFB"></a></p>
<h5>4.2-1 <span class="Heading">Character-Theoretic Lower Bounds for Vertex Degrees</span></h5>
<p>Using character-theoretic methods similar to those used to obtain the results in <a href="chapBib.html#biBBGK">[BGK08]</a> (the computations for that paper are shown in <a href="chapBib.html#biBProbGenArxiv">[Breb]</a>), we can compute lower bounds for the vertex degrees in generating graphs, as follows.</p>
<p>Let <span class="SimpleMath">R</span> be a set of representatives of conjugacy classes of nonidentity elements in <span class="SimpleMath">G</span>, fix <span class="SimpleMath">s ∈ G^×</span>, let <span class="SimpleMath">(G,s)</span> denote the set of those maximal subgroups of <span class="SimpleMath">G</span> that contain <span class="SimpleMath">s</span>, let <span class="SimpleMath">(G,s)/∼</span> denote a set of representatives in <span class="SimpleMath">(G,s)</span> w. r. t. conjugacy in <span class="SimpleMath">G</span>. For a subgroup <span class="SimpleMath">M</span> of <span class="SimpleMath">G</span>, the <em>permutation character</em> <span class="SimpleMath">1_M^G</span> is defined by</p>
<p class="pcenter">1_M^G(g):= (|G| ⋅ |g^G ∩ M|) / (|M| ⋅ |g^G|),</p>
<p>where <span class="SimpleMath">g^G = { g^x; x ∈ G }</span>, with <span class="SimpleMath">g^x = x^-1 g x</span>, denotes the conjugacy class of <span class="SimpleMath">g</span> in <span class="SimpleMath">G</span>. So we have <span class="SimpleMath">1_M^G(1) = |G|/|M|</span> and thus <span class="SimpleMath">|g^G ∩ M| = |g^G| ⋅ 1_M^G(g) / 1_M^G(1)</span>.</p>
<p>Doubly counting the set <span class="SimpleMath">{ (s^x, M^y); x, y ∈ G, s^x ∈ M^y }</span> yields <span class="SimpleMath">|M^G| ⋅ |s^G ∩ M| = |s^G| ⋅ |{ M^x; x ∈ G, s ∈ M^x }|</span> and thus <span class="SimpleMath">|{ M^x; x ∈ G, s ∈ M^x }| = |M^G| ⋅ 1_M^G(s) / 1_M^G(1) ≤ 1_M^G(s)</span>. (If <span class="SimpleMath">M</span> is a <em>maximal</em> subgroup of <span class="SimpleMath">G</span> then either <span class="SimpleMath">M</span> is normal in <span class="SimpleMath">G</span> or self-normalizing, and in the latter case the inequality is in fact an equality.)</p>
<p>Let <span class="SimpleMath">Π</span> denote the multiset of <em>primitive</em> permutation characters of <span class="SimpleMath">G</span>, i. e., of the permutation characters <span class="SimpleMath">1_M^G</span> where <span class="SimpleMath">M</span> ranges over representatives of the conjugacy classes of maximal subgroups of <span class="SimpleMath">G</span>.</p>
<p>Define</p>
<p class="pcenter">δ(s, g^G):= |g^G| ⋅ max{ 0, 1 - ∑_{π ∈ Π} π(g) ⋅ π(s) / π(1) }</p>
<p>and <span class="SimpleMath">d(s, g^G):= |{ x ∈ g^G; ⟨ s, x ⟩ = G }|</span>, the contribution of the class <span class="SimpleMath">g^G</span> to the vertex degree of <span class="SimpleMath">s</span>. Then we have <span class="SimpleMath">d(Γ(G), s) = ∑_{x ∈ R} d(s, x^G)</span> and</p>
<p><div class="pcenter"><table> <tr> <td class="tdright"><span class="SimpleMath">d(s, g^G)</span></td> <td class="tdcenter"><span class="SimpleMath">=</span></td> <td class="tdleft"><span class="SimpleMath">|g^G| - |⋃_{M ∈ M(G,s)} { x ∈ g^G; ⟨ x, s ⟩ ⊆ M }|</span></td> </tr> <td class="tdright"><span class="SimpleMath"> </span></td> <td class="tdcenter"><span class="SimpleMath">≥</span></td> <td class="tdleft"><span class="SimpleMath">|g^G| ⋅ max{ 0, 1 - Σ_{M ∈ M(G,s)} 1_M^G(g) / 1_M^G(1) }</span></td> <tr> <td class="tdright"><span class="SimpleMath"> </span></td> <td class="tdcenter"><span class="SimpleMath">=</span></td> <td class="tdcenter"><span class="SimpleMath">|g^G| ⋅ max{ 0, 1 - Σ_{M ∈ M(G,s)} 1_M^G(g) / 1_M^G(1) }</span></td> </tr> <tr> <td class="tdright"><span class="SimpleMath"> </span></td> <td class="tdcenter"><span class="SimpleMath">≥</span></td> <td class="tdcenter"><span class="SimpleMath">|g^G| ⋅ max{ 0, 1 - Σ_{M ∈ M(G,s)/∼} 1_M^G(g) ⋅ 1_M^G(s) / 1_M^G(1) }</span></td> </tr> <tr> <td class="tdright"><span class="SimpleMath"> </span></td> <td class="tdcenter"><span class="SimpleMath">=</span></td> <td class="tdcenter"><span class="SimpleMath">δ(s, g^G)</span></td> </tr> </table> </div></p>
<p>So <span class="SimpleMath">δ(s):= ∑_x ∈ R δ(s, x^G)</span> is a lower bound for the vertex degree of <span class="SimpleMath">s</span>; this bound can be computed if <span class="SimpleMath">Π</span> is known.</p>
<p>For computing the vertex degrees of the iterated closures of <span class="SimpleMath">Γ(G)</span>, we define <span class="SimpleMath">d^(0)(s, g^G):= d(s, g^G)</span> and</p>
<p>d^(i+1)(s,g^G):= |g^G| if d^(i)(Г(G),s) + d^(i)(Г(G),g) ≥ |G|-1, and d^(i+1)(s,g^G):= d^(i)(s,g^G) otherwise. </Alt> <!-- %T Attila: o.k.?? --> Then <M>d(&cl;^{(i)}(\Gamma(G)), s) = \sum_{{x \in R}} d^{(i)}(s, g^G)</M> holds. <P/> Analogously, we set <M>\delta^{(0)}(s, g^G):= \delta(s, g^G)</M>, <Alt Only="LaTeX"><![CDATA[ \[ \delta^{(i+1)}(s, g^G):= \left\{ \begin{array}{lcl} |g^G| & ; & \delta^{(i)}(s) + \delta^{(i)}(g) \geq |G|-1 \\ \delta^{(i)}(s, g^G) & ; & \mbox{\rm otherwise} \end{array} \right. \]</p>
<p>δ^(i+1)(s, g^G):= |g^G| if δ^(i)(s) + δ^(i)(g) ≥ |G|-1, δ^(i+1)(s, g^G):= δ^(i)(s, g^G) otherwise, and <span class="SimpleMath">δ^(i)(s):= ∑_{x ∈ R} δ^(i)(s, x^G)</span>, a lower bound for <span class="SimpleMath">d(cl^(i)(Γ(G)), s)</span> that can be computed if <span class="SimpleMath">Π</span> is known.</p>
<p><a id="X825776BA8687E475" name="X825776BA8687E475"></a></p>
<h5>4.2-2 <span class="Heading">Checking the Criteria</span></h5>
<p>Let us assume that we know lower bounds <span class="SimpleMath">β(s)</span> for the vertex degrees <span class="SimpleMath">d(cl^(i)(Γ(G)), s)</span>, for some fixed <span class="SimpleMath">i</span>, and let us choose representatives <span class="SimpleMath">s_1, s_2, ..., s_l</span> of the nonidentity conjugacy classes of <span class="SimpleMath">G</span> such that <span class="SimpleMath">β(s_1) ≤ β(s_2) ≤ ⋯ ≤ β(s_l)</span> holds. Let <span class="SimpleMath">c_k = |s_k^G|</span> be the class lengths of these representatives.</p>
<p>Then the first <span class="SimpleMath">c_1</span> vertex degrees, ordered by increasing size, are larger than or equal to <span class="SimpleMath">β(s_1)</span>, the next <span class="SimpleMath">c_2</span> vertex degrees are larger than or equal to <span class="SimpleMath">β(s_2)</span>, and so on.</p>
<p>Then the set of indices in the <span class="SimpleMath">k</span>-th nonidentity class of <span class="SimpleMath">G</span> for which Pósa's criterion is not guaranteed by the given bounds is</p>
<p class="pcenter">{ x; c_1 + c_2 + ⋯ + c_k-1 < x ≤ c_1 + c_2 + ⋯ c_k, x < (|G| - 1) / 2, β(s_k) < x+1 }.</p>
<p>This is an interval <span class="SimpleMath">{ L_k, L_k + 1, ..., U_k }</span> with</p>
<p class="pcenter">L_k = max{ 1 + c_1 + c_2 + ⋯ + c_k-1, β(s_k) }</p>
<p>and</p>
<p class="pcenter">U_k = min{ c_1 + c_2 + ⋯ + c_k, ⌊ |G|/2 ⌋ - 1 } .</p>
<p>(Note that the generating graph has <span class="SimpleMath">m = |G|-1</span> vertices, and that <span class="SimpleMath">x < m/2</span> is equivalent to <span class="SimpleMath">x ≤ ⌊ |G|/2 ⌋ - 1</span>.)</p>
<p>The generating graph <span class="SimpleMath">Γ(G)</span> satisfies Pósa's criterion if all these intervals are empty, i. e., if <span class="SimpleMath">L_k > U_k</span> holds for <span class="SimpleMath">1 ≤ k ≤ l</span>.</p>
<p>The set of indices for which Chvátal's criterion is not guaranteed is the intersection of</p>
<p class="pcenter">{ m-k; 1 ≤ m-k < m/2, d_k < k }</p>
<p>with the set of indices for which Pósa's criterion is not guaranteed.</p>
<p>Analogously to the above considerations, the set of indices <span class="SimpleMath">m-x</span> in the former set for which Chvátal's criterion is not guaranteed by the given bounds and such that <span class="SimpleMath">x</span> is an index in the <span class="SimpleMath">k</span>-th nonidentity class of <span class="SimpleMath">G</span> is</p>
<p class="pcenter">{ m-x; c_1 + c_2 + ⋯ + c_k-1 < x ≤ c_1 + c_2 + ⋯ c_k, 1 ≤ m-x < (|G| - 1) / 2, β(s_k) < x }.</p>
<p>This is again an interval <span class="SimpleMath">{ L^'_k, L^'_k + 1, ..., U^'_k }</span> with</p>
<p class="pcenter">L^'_k = max{ 1, m - ( c_1 + c_2 + ⋯ + c_k ) }</p>
<p>and</p>
<p class="pcenter">U^'_k = min{ m - ( c_1 + c_2 + ⋯ + c_k-1 ) - 1, ⌊ |G|/2 ⌋ - 1, m-1 - β(s_k) } .</p>
<p>The generating graph <span class="SimpleMath">Γ(G)</span> satisfies Chvátal's criterion if the union of the intervals <span class="SimpleMath">{ L^'_k, L^'_k + 1, ..., U^'_k }</span>, for <span class="SimpleMath">1 ≤ k ≤ l</span> is disjoint to the union of the intervals <span class="SimpleMath">{ L_k, L_k + 1, ..., U_k }</span>, for <span class="SimpleMath">1 ≤ k ≤ l</span>.</p>
<p><a id="X7B56BE5384BAD54E" name="X7B56BE5384BAD54E"></a></p>
<h4>4.3 <span class="Heading"><strong class="pkg">GAP</strong> Functions for the Computations</span></h4>
<p>We describe two approaches to compute, for a given group <span class="SimpleMath">G</span>, vertex degrees for the generating graph of <span class="SimpleMath">G</span> or lower bounds for them, by calculating exact vertex degrees from <span class="SimpleMath">G</span> itself (see Section <a href="chap4.html#X802B2ED2802334B0"><span class="RefLink">4.3-1</span></a>) or by deriving lower bounds for the vertex degrees using just character-theoretic information about <span class="SimpleMath">G</span> and its subgroups (see Section <a href="chap4.html#X87FE2DDD7F086D2F"><span class="RefLink">4.3-2</span></a>). Finally, Section <a href="chap4.html#X8677A8B1788ACD2C"><span class="RefLink">4.3-3</span></a> deals with deriving lower bounds of vertex degrees of iterated closures.</p>
<p><a id="X802B2ED2802334B0" name="X802B2ED2802334B0"></a></p>
<h5>4.3-1 <span class="Heading">Computing Vertex Degrees from the Group</span></h5>
<p>In this section, the task is to compute the vertex degrees <span class="SimpleMath">d(s,g^G)</span> using explicit computations with the group <span class="SimpleMath">G</span>.</p>
<p>The function <code class="code">IsGeneratorsOfTransPermGroup</code> checks whether the permutations in the list <code class="code">list</code> generate the permutation group <code class="code">G</code>, <em>provided that</em> <code class="code">G</code> is transitive on its moved points. (Note that testing the necessary condition that the elements in <code class="code">list</code> generate a transitive group is usually much faster than testing generation.) This function has been used already in <a href="chapBib.html#biBProbGenArxiv">[Breb]</a>.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsGeneratorsOfTransPermGroup:= function( G, list )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> local S;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> if not IsTransitive( G ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> Error( "<G> must be transitive on its moved points" );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> S:= SubgroupNC( G, list );</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> return IsTransitive( S, MovedPoints( G ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> and Size( S ) = Size( G );</span>
<span class="GAPprompt">></span> <span class="GAPinput">end;;</span>
</pre></div>
<p>The function <code class="code">VertexDegreesGeneratingGraph</code> takes a <em>transitive</em> permutation group <span class="SimpleMath">G</span> (in order to be allowed to use <code class="code">IsGeneratorsOfTransPermGroup</code>), the list <code class="code">classes</code> of conjugacy classes of <span class="SimpleMath">G</span> (in order to prescribe an ordering of the classes), and a list <code class="code">normalsubgroups</code> of proper normal subgroups of <span class="SimpleMath">G</span>, and returns the matrix <span class="SimpleMath">[ d(s, g^G) ]_s, g</span> of vertex degrees, with rows and columns indexed by nonidentity class representatives ordered as in the list <code class="code">classes</code>. (The class containing the identity element may be contained in <code class="code">classes</code>.)</p>
<p>The following criteria are used in this function.</p>
<ul>
<li><p>The function tests the (non)generation only for representatives of <span class="SimpleMath">C_G(g)</span>-<span class="SimpleMath">C_G(s)</span>-double cosets, where <span class="SimpleMath">C_G(g):= { x ∈ G; g x = x g }</span> denotes the centralizer of <span class="SimpleMath">g</span> in <span class="SimpleMath">G</span>. Note that for <span class="SimpleMath">c_1 ∈ C_G(g)</span>, <span class="SimpleMath">c_2 ∈ C_G(s)</span>, and a representative <span class="SimpleMath">r ∈ G</span>, we have <span class="SimpleMath">⟨ s, g^c_1 r c_2 ⟩ = ⟨ s, g^r ⟩^c_2</span>. If <span class="SimpleMath">⟨ s, g^r ⟩ = G</span> then the double coset <span class="SimpleMath">D = C_G(g) r C_G(s)</span> contributes <span class="SimpleMath">|D|/|C_G(g)|</span> to the vertex degree <span class="SimpleMath">d(s, g^G)</span>, otherwise the contribution is zero.</p>
</li>
<li><p>We have <span class="SimpleMath">d(s, g^G) ⋅ |C_G(g)| = d(g, s^G) ⋅ |C_G(s)|</span>. (To see this, either establish a bijection of the above double cosets, or doubly count the edges between elements of the conjugacy classes of <span class="SimpleMath">s</span> and <span class="SimpleMath">g</span>.)</p>
</li>
<li><p>If <span class="SimpleMath">⟨ s_1 ⟩ = ⟨ s_2 ⟩</span> and <span class="SimpleMath">⟨ g_1 ⟩ = ⟨ g_2 ⟩</span> hold then we have <span class="SimpleMath">d(s_1, g_1^G) = d(s_2, g_1^G) = d(s_1, g_2^G) = d(s_2, g_2^G)</span>, so only one of these values must be computed.</p>
</li>
<li><p>If both <span class="SimpleMath">s</span> and <span class="SimpleMath">g</span> are contained in one of the normal subgroups given then <span class="SimpleMath">d(s, g^G)</span> is zero.</p>
</li>
<li><p>If <span class="SimpleMath">G</span> is not a dihedral group and both <span class="SimpleMath">s</span> and <span class="SimpleMath">g</span> are involutions then <span class="SimpleMath">d(s, g^G)</span> is zero.</p>
</li>
</ul>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">BindGlobal( "VertexDegreesGeneratingGraph",</span>
<span class="GAPprompt">></span> <span class="GAPinput"> function( G, classes, normalsubgroups )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> local nccl, matrix, cents, powers, normalsubgroupspos, i, j, g_i,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> nsg, g_j, gen, pair, d, pow;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> if not IsTransitive( G ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> Error( "<G> must be transitive on its moved points" );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> classes:= Filtered( classes,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> C -> Order( Representative( C ) ) <> 1 );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> nccl:= Length( classes );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> matrix:= [];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> cents:= [];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> powers:= [];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> normalsubgroupspos:= [];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> for i in [ 1 .. nccl ] do</span>
<span class="GAPprompt">></span> <span class="GAPinput"> matrix[i]:= [];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if IsBound( powers[i] ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> # The i-th row equals the earlier row 'powers[i]'.</span>
<span class="GAPprompt">></span> <span class="GAPinput"> for j in [ 1 .. i ] do</span>
<span class="GAPprompt">></span> <span class="GAPinput"> matrix[i][j]:= matrix[ powers[i] ][j];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> matrix[j][i]:= matrix[j][ powers[i] ];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> od;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> else</span>
<span class="GAPprompt">></span> <span class="GAPinput"> # We have to compute the values.</span>
<span class="GAPprompt">></span> <span class="GAPinput"> g_i:= Representative( classes[i] );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> nsg:= Filtered( [ 1 .. Length( normalsubgroups ) ],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> i -> g_i in normalsubgroups[i] );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> normalsubgroupspos[i]:= nsg;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> cents[i]:= Centralizer( G, g_i );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> for j in [ 1 .. i ] do</span>
<span class="GAPprompt">></span> <span class="GAPinput"> g_j:= Representative( classes[j] );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if IsBound( powers[j] ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> matrix[i][j]:= matrix[i][ powers[j] ];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> matrix[j][i]:= matrix[ powers[j] ][i];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> elif not IsEmpty( Intersection( nsg, normalsubgroupspos[j] ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> or ( Order( g_i ) = 2 and Order( g_j ) = 2</span>
<span class="GAPprompt">></span> <span class="GAPinput"> and not IsDihedralGroup( G ) ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> matrix[i][j]:= 0;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> matrix[j][i]:= 0;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> else</span>
<span class="GAPprompt">></span> <span class="GAPinput"> # Compute $d(g_i, g_j^G)$.</span>
<span class="GAPprompt">></span> <span class="GAPinput"> gen:= 0;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> for pair in DoubleCosetRepsAndSizes( G, cents[j],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> cents[i] ) do</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if IsGeneratorsOfTransPermGroup( G,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ g_i, g_j^pair[1] ] ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> gen:= gen + pair[2];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> od;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> matrix[i][j]:= gen / Size( cents[j] );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if i <> j then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> matrix[j][i]:= gen / Size( cents[i] );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> od;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> # For later, provide information about algebraic conjugacy.</span>
<span class="GAPprompt">></span> <span class="GAPinput"> for d in Difference( PrimeResidues( Order( g_i ) ), [ 1 ] ) do</span>
<span class="GAPprompt">></span> <span class="GAPinput"> pow:= g_i^d;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> for j in [ i+1 .. nccl ] do</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if not IsBound( powers[j] ) and pow in classes[j] then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> powers[j]:= i;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> break;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> od;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> od;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> od;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> return matrix;</span>
<span class="GAPprompt">></span> <span class="GAPinput">end );</span>
</pre></div>
<p><a id="X87FE2DDD7F086D2F" name="X87FE2DDD7F086D2F"></a></p>
<h5>4.3-2 <span class="Heading">Computing Lower Bounds for Vertex Degrees</span></h5>
<p>In this section, the task is to compute the lower bounds <span class="SimpleMath">δ(s, g^G)</span> for the vertex degrees <span class="SimpleMath">d(s, g^G)</span> using character-theoretic methods.</p>
<p>We provide <strong class="pkg">GAP</strong> functions for computing the multiset <span class="SimpleMath">Π</span> of the primitive permutation characters of a given group <span class="SimpleMath">G</span> and for computing the lower bounds <span class="SimpleMath">δ(s, g^G)</span> from <span class="SimpleMath">Π</span>.</p>
<p>For many almost simple groups, the <strong class="pkg">GAP</strong> libraries of character tables and of tables of marks contain information for quickly computing the primitive permutation characters of the group in question. Therefore, the function <code class="code">PrimitivePermutationCharacters</code> takes as its argument not the group <span class="SimpleMath">G</span> but its character table <span class="SimpleMath">T</span>, say. (This function is shown already in <a href="chapBib.html#biBProbGenArxiv">[Breb]</a>.)</p>
<p>If <span class="SimpleMath">T</span> is contained in the <strong class="pkg">GAP</strong> Character Table Library (see <a href="chapBib.html#biBCTblLib">[Bre25]</a>) then the complete set of primitive permutation characters can be easily computed if the character tables of all maximal subgroups and their class fusions into <span class="SimpleMath">T</span> are known (in this case, we check whether the attribute <code class="func">Maxes</code> (<a href="../doc/chap3.html#X8150E63F7DBDF252"><span class="RefLink">CTblLib: Maxes</span></a>) of <span class="SimpleMath">T</span> is bound) or if the table of marks of <span class="SimpleMath">G</span> and the class fusion from <span class="SimpleMath">T</span> into this table of marks are known (in this case, we check whether the attribute <code class="func">FusionToTom</code> (<a href="../doc/chap3.html#X7B1AAED68753B1BE"><span class="RefLink">CTblLib: FusionToTom</span></a>) of <span class="SimpleMath">T</span> is bound). If the attribute <code class="func">UnderlyingGroup</code> (<a href="../../../doc/ref/chap70.html#X81E41D3880FA6C4C"><span class="RefLink">Reference: UnderlyingGroup for tables of marks</span></a>) of <span class="SimpleMath">T</span> is bound then the group stored as the value of this attribute can be used to compute the primitive permutation characters. The latter happens if <span class="SimpleMath">T</span> was computed from the group <span class="SimpleMath">G</span>; for tables in the <strong class="pkg">GAP</strong> Character Table Library, this is not the case by default.</p>
<p>The <strong class="pkg">GAP</strong> function <code class="code">PrimitivePermutationCharacters</code> tries to compute the primitive permutation characters of a group using this information; it returns the required list of characters if this can be computed this way, otherwise <code class="keyw">fail</code> is returned. (For convenience, we use the <strong class="pkg">GAP</strong> mechanism of <em>attributes</em> in order to store the permutation characters in the character table object once they have been computed.)</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">DeclareAttribute( "PrimitivePermutationCharacters",</span>
<span class="GAPprompt">></span> <span class="GAPinput"> IsCharacterTable );</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">InstallOtherMethod( PrimitivePermutationCharacters,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ IsCharacterTable ],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> function( tbl )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> local maxes, i, fus, poss, tom, G;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> if HasMaxes( tbl ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> maxes:= List( Maxes( tbl ), CharacterTable );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> for i in [ 1 .. Length( maxes ) ] do</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fus:= GetFusionMap( maxes[i], tbl );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if fus = fail then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fus:= PossibleClassFusions( maxes[i], tbl );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> poss:= Set( fus,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> map -> InducedClassFunctionsByFusionMap(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> maxes[i], tbl,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ TrivialCharacter( maxes[i] ) ], map )[1] );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if Length( poss ) = 1 then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> maxes[i]:= poss[1];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> else</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return fail;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> else</span>
<span class="GAPprompt">></span> <span class="GAPinput"> maxes[i]:= TrivialCharacter( maxes[i] )^tbl;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> od;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return maxes;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> elif HasFusionToTom( tbl ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> tom:= TableOfMarks( tbl );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> maxes:= MaximalSubgroupsTom( tom );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return PermCharsTom( tbl, tom ){ maxes[1] };</span>
<span class="GAPprompt">></span> <span class="GAPinput"> elif HasUnderlyingGroup( tbl ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> G:= UnderlyingGroup( tbl );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return List( MaximalSubgroupClassReps( G ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> M -> TrivialCharacter( M )^tbl );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> return fail;</span>
<span class="GAPprompt">></span> <span class="GAPinput">end );</span>
</pre></div>
<p>The next function computes the lower bounds <span class="SimpleMath">δ(s, g^G)</span> from the two lists <code class="code">classlengths</code> of conjugacy class lengths of the group <span class="SimpleMath">G</span> and <code class="code">prim</code> of all primitive permutation characters of <span class="SimpleMath">G</span>. (The first entry in <code class="code">classlengths</code> is assumed to represent the class containing the identity element of <span class="SimpleMath">G</span>.) The return value is the matrix that contains in row <span class="SimpleMath">i</span> and column <span class="SimpleMath">j</span> the value <span class="SimpleMath">δ(s, g^G)</span>, where <span class="SimpleMath">s</span> and <span class="SimpleMath">g</span> are in the conjugacy classes represented by the <span class="SimpleMath">(i+1)</span>-st and <span class="SimpleMath">(j+1)</span>-st column of <code class="code">tbl</code>, respectively. So the row sums of this matrix are the values <span class="SimpleMath">δ(s)</span>.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">LowerBoundsVertexDegrees:= function( classlengths, prim )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> local sizes, nccl;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> nccl:= Length( classlengths );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return List( [ 2 .. nccl ],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> i -> List( [ 2 .. nccl ],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> j -> Maximum( 0, classlengths[j] - Sum( prim,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> pi -> classlengths[j] * pi[j] * pi[i]</span>
<span class="GAPprompt">></span> <span class="GAPinput"> / pi[1] ) ) ) );</span>
<span class="GAPprompt">></span> <span class="GAPinput">end;;</span>
</pre></div>
<p><a id="X8677A8B1788ACD2C" name="X8677A8B1788ACD2C"></a></p>
<h5>4.3-3 <span class="Heading">Evaluating the (Lower Bounds for the) Vertex Degrees</span></h5>
<p>In this section, the task is to compute (lower bounds for) the vertex degrees of iterated closures of a generating graph from (lower bounds for) the vertex degrees of the graph itself, and then to check the criteria of Pósa and Chvátal.</p>
<p>The arguments of all functions defined in this section are the list <code class="code">classlengths</code> of conjugacy class lengths for the group <span class="SimpleMath">G</span> (including the class of the identity element, in the first position) and a matrix <code class="code">bounds</code> of the values <span class="SimpleMath">d^(i)(s, g^G)</span> or <span class="SimpleMath">δ^(i)(s, g^G)</span>, with rows and columns indexed by nonidentity class representatives <span class="SimpleMath">s</span> and <span class="SimpleMath">g</span>, respectively. Such a matrix is returned by the functions <code class="code">VertexDegreesGeneratingGraph</code> or <code class="code">LowerBoundsVertexDegrees</code>, respectively.</p>
<p>The function <code class="code">LowerBoundsVertexDegreesOfClosure</code> returns the corresponding matrix of the values <span class="SimpleMath">d^(i+1)(s, g^G)</span> or <span class="SimpleMath">δ^(i+1)(s, g^G)</span>, respectively.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">LowerBoundsVertexDegreesOfClosure:= function( classlengths, bounds )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> local delta, newbounds, size, i, j;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> delta:= List( bounds, Sum );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> newbounds:= List( bounds, ShallowCopy );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> size:= Sum( classlengths );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> for i in [ 1 .. Length( bounds ) ] do</span>
<span class="GAPprompt">></span> <span class="GAPinput"> for j in [ 1 .. Length( bounds ) ] do</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if delta[i] + delta[j] >= size - 1 then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> newbounds[i][j]:= classlengths[ j+1 ];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> od;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> od;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> return newbounds;</span>
<span class="GAPprompt">></span> <span class="GAPinput">end;;</span>
</pre></div>
<p>Once the values <span class="SimpleMath">d^(i)(s, g^G)</span> or <span class="SimpleMath">δ^(i)(s, g^G)</span> are known, we can check whether Pósa's or Chvátal's criterion is satisfied for the graph <span class="SimpleMath">cl^(i)(Γ(G))</span>, using the function <code class="code">CheckCriteriaOfPosaAndChvatal</code> shown below. (Of course a <em>negative</em> result is meaningless in the case that only lower bounds for the vertex degrees are used.)</p>
<p>The idea is to compute the row sums of the given matrix, and to compute the intervals <span class="SimpleMath">{ L_k, L_k + 1, ..., U_k }</span> and <span class="SimpleMath">{ L^'_k, L^'_k + 1, ..., U^'_k }</span> that were introduced in Section <a href="chap4.html#X825776BA8687E475"><span class="RefLink">4.2-2</span></a>.</p>
<p>The function <code class="code">CheckCriteriaOfPosaAndChvatal</code> returns, given the list of class lengths of <span class="SimpleMath">G</span> and the matrix of (bounds for the) vertex degrees, a record with the components <code class="code">badForPosa</code> (the list of those pairs <span class="SimpleMath">[ L_k, U_k ]</span> with the property <span class="SimpleMath">L_k ≤ U_k</span>), <code class="code">badForChvatal</code> (the list of pairs of lower and upper bounds of nonempty intervals where Chvátal's criterion may be violated), and <code class="code">data</code> (the sorted list of triples <span class="SimpleMath">[ δ(g_k), |g_k^G|, ι(k) ]</span>, where <span class="SimpleMath">ι(k)</span> is the row and column position of <span class="SimpleMath">g_k</span> in the matrix <code class="code">bounds</code>). The ordering of class lengths must of course be compatible with the ordering of rows and columns of the matrix, and the identity element of <span class="SimpleMath">G</span> must belong to the first entry in the list of class lengths.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">CheckCriteriaOfPosaAndChvatal:= function( classlengths, bounds )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> local size, degs, addinterval, badForPosa, badForChvatal1, pos,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> half, i, low1, upp2, upp1, low2, badForChvatal, interval1,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> interval2;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> size:= Sum( classlengths );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> degs:= List( [ 2 .. Length( classlengths ) ],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> i -> [ Sum( bounds[ i-1 ] ), classlengths[i], i ] );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> Sort( degs );</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> addinterval:= function( intervals, low, upp )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if low <= upp then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> Add( intervals, [ low, upp ] );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> end;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> badForPosa:= [];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> badForChvatal1:= [];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> pos:= 1;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> half:= Int( size / 2 ) - 1;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> for i in [ 1 .. Length( degs ) ] do</span>
<span class="GAPprompt">></span> <span class="GAPinput"> # We have pos = c_1 + c_2 + \cdots + c_{i-1} + 1</span>
<span class="GAPprompt">></span> <span class="GAPinput"> low1:= Maximum( pos, degs[i][1] ); # L_i</span>
<span class="GAPprompt">></span> <span class="GAPinput"> upp2:= Minimum( half, size-1-pos, size-1-degs[i][1] ); # U'_i</span>
<span class="GAPprompt">></span> <span class="GAPinput"> pos:= pos + degs[i][2];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> upp1:= Minimum( half, pos-1 ); # U_i</span>
<span class="GAPprompt">></span> <span class="GAPinput"> low2:= Maximum( 1, size-pos ); # L'_i</span>
<span class="GAPprompt">></span> <span class="GAPinput"> addinterval( badForPosa, low1, upp1 );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> addinterval( badForChvatal1, low2, upp2 );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> od;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> # Intersect intervals.</span>
<span class="GAPprompt">></span> <span class="GAPinput"> badForChvatal:= [];</span>
<span class="GAPprompt">></span> <span class="GAPinput"> for interval1 in badForPosa do</span>
<span class="GAPprompt">></span> <span class="GAPinput"> for interval2 in badForChvatal1 do</span>
<span class="GAPprompt">></span> <span class="GAPinput"> addinterval( badForChvatal,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> Maximum( interval1[1], interval2[1] ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> Minimum( interval1[2], interval2[2] ) );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> od;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> od;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> return rec( badForPosa:= badForPosa,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> badForChvatal:= Set( badForChvatal ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> data:= degs );</span>
<span class="GAPprompt">></span> <span class="GAPinput">end;;</span>
</pre></div>
<p>Finally, the function <code class="code">HamiltonianCycleInfo</code> assumes that the matrix <code class="code">bounds</code> contains lower bounds for the vertex degrees in the generating graph <span class="SimpleMath">Γ</span>, and returns a string that describes the minimal <span class="SimpleMath">i</span> with the property that the given bounds suffice to show that <span class="SimpleMath">cl^(i)(Γ)</span> satisfies Pósa's or Chvátal's criterion, if such a closure exists. If no closure has this property, the string <code class="code">"no decision"</code> is returned.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">HamiltonianCycleInfo:= function( classlengths, bounds )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> local i, result, res, oldbounds;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> i:= 0;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> result:= rec( Posa:= fail, Chvatal:= fail );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> repeat</span>
<span class="GAPprompt">></span> <span class="GAPinput"> res:= CheckCriteriaOfPosaAndChvatal( classlengths, bounds );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if result.Posa = fail and IsEmpty( res.badForPosa ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> result.Posa:= i;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if result.Chvatal = fail and IsEmpty( res.badForChvatal ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> result.Chvatal:= i;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> i:= i+1;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> oldbounds:= bounds;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> bounds:= LowerBoundsVertexDegreesOfClosure( classlengths,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> bounds );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> until oldbounds = bounds;</span>
<span class="GAPprompt">></span> <span class="GAPinput"></span>
<span class="GAPprompt">></span> <span class="GAPinput"> if result.Posa <> fail then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if result.Posa <> result.Chvatal then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return Concatenation(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> "Chvatal for ", Ordinal( result.Chvatal ), " closure, ",</span>
<span class="GAPprompt">></span> <span class="GAPinput"> "Posa for ", Ordinal( result.Posa ), " closure" );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> else</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return Concatenation( "Posa for ", Ordinal( result.Posa ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> " closure" );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> elif result.Chvatal <> fail then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return Concatenation( "Chvatal for ", Ordinal( result.Chvatal ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> " closure" );</span>
<span class="GAPprompt">></span> <span class="GAPinput"> else</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return "no decision";</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput">end;;</span>
</pre></div>
<p><a id="X7A221012861440E2" name="X7A221012861440E2"></a></p>
<h4>4.4 <span class="Heading">Character-Theoretic Computations</span></h4>
<p>In this section, we apply the functions introduced in Section <a href="chap4.html#X7B56BE5384BAD54E"><span class="RefLink">4.3</span></a> to character tables of almost simple groups that are available in the <strong class="pkg">GAP</strong> Character Table Library.</p>
<p>Our first examples are the sporadic simple groups, in Section <a href="chap4.html#X86CE51E180A3D4ED"><span class="RefLink">4.4-1</span></a>, then their automorphism groups are considered in Section <a href="chap4.html#X7DC6DFCC83502CC3"><span class="RefLink">4.4-3</span></a>. Smal | | |