|
|
|
|
Quelle chap4_mj.html
Sprache: HTML
|
|
| products/Sources/formale Sprachen/GAP/pkg/ctbllib/doc2/chap4_mj.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>
< script type= "text/javascript"
src= "https://cdn.jsdelivr.net/npm/mathjax@2/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</ script>
< 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_mj.html">Top</a> <a href="chap1_mj.html">1</a> <a href="chap2_mj.html">2</a> <a href="chap3_mj.html">3</a> <a href="chap4_mj.html">4</a> <a href="chap5_mj.html">5</a> <a href="chap6_mj.html">6</a> <a href="chap7_mj.html">7</a> <a href="chap8_mj.html">8</a> <a href="chap9_mj.html">9</a> <a href="chap10_mj.html">10</a> <a href="chap11_mj.html">11</a> <a href="chapBib_mj.html">Bib</a> <a href="chapInd_mj.html">Ind</a> </div>
<div class="chlinkprevnexttop"> <a href="chap0_mj.html">[Top of Book]</a> <a href="chap0_mj.html#contents">[Contents]</a> <a href="chap3_mj.html">[Previous Chapter]</a> <a href="chap5_mj.html">[Next Chapter]</a> </div>
<p id="mathjaxlink" class="pcenter"><a href="chap4.html">[MathJax off]</a></p>
<p><a id="X7D5919C182B1A462" name="X7D5919C182B1A462"></a></p>
<div class="ChapSects"><a href="chap4_mj.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_mj.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_mj.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_mj.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_mj.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_mj.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_mj.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_mj.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_mj.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_mj.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_mj.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_mj.html#X867D338F7F453092">4.4-2 <span class="Heading">The Monster</span></a>
</span>
<span class="ContSS"><br /><span class="nocss"> </span><a href="chap4_mj.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_mj.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 \leq n \leq 13\)</span></span></a>
</span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap4_mj.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_mj.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_mj.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_mj.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_mj.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_mj.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_mj.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_mj.html#biBNW12">[NW13]</a>) and the nonexistence of maximal subgroups with socle <span class="SimpleMath">\(PSL(2, 27)\)</span> (see <a href="chapBib_mj.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_mj.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_mj.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_mj.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_mj.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_mj.html#X7B56BE5384BAD54E"><span class="RefLink">4.3</span></a>. Then Section <a href="chap4_mj.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_mj.html#biBCTblLib">[Bre25]</a>. Computations using also the groups are shown in Section <a href="chap4_mj.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^{\times}\)</span> the set of nonidentity elements in <span class="SimpleMath">\(G\)</span>. We define the <em>generating graph</em> <span class="SimpleMath">\(\Gamma(G)\)</span> as the undirected graph on the vertex set <span class="SimpleMath">\(G^{\times}\)</span> by joining two elements <span class="SimpleMath">\(x, y \in G^{\times}\)</span> by an edge if and only if <span class="SimpleMath">\(\langle x, y \rangle = G\)</span> holds. For <span class="SimpleMath">\(x \in G^{\times}\)</span>, the <em>vertex degree</em> <span class="SimpleMath">\(d(\Gamma, x)\)</span> is <span class="SimpleMath">\(|\{ y \in G^{\times}; \langle x, y \rangle = G \}|\)</span>. The <em>closure</em> <span class="SimpleMath">\(cl(\Gamma)\)</span> of the graph <span class="SimpleMath">\(\Gamma\)</span> with <span class="SimpleMath">\(m\)</span> vertices is defined as the graph with the same vertex set as <span class="SimpleMath">\(\Gamma\)</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">\(\Gamma\)</span> or if <span class="SimpleMath">\(d(\Gamma, x) + d(\Gamma, y) \geq m\)</span>. We denote iterated closures by <span class="SimpleMath">\(cl^{(i)}(\Gamma) = cl(cl^{(i-1)}(\Gamma))\)</span>, where <span class="SimpleMath">\(cl^{(0)}(\Gamma) = \Gamma\)</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">\(\Gamma(G)\)</span> being connected, and <a href="chapBib_mj.html#biBGMN">[BGL+10, Conjecture 1.6]</a> states that this condition is also sufficient. By <a href="chapBib_mj.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">\(\Gamma\)</span> contains a Hamiltonian cycle (i. e., a closed path in <span class="SimpleMath">\(\Gamma\)</span> that visits each vertex exactly once) can be answered using the following sufficient criteria (see <a href="chapBib_mj.html#biBGMN">[BGL+10]</a>). Let <span class="SimpleMath">\(d_1 \leq d_2 \leq \cdots \leq d_m\)</span> be the vertex degrees in <span class="SimpleMath">\(\Gamma\)</span>.</p>
<dl>
<dt><strong class="Mark">Pósa's criterion:</strong></dt>
<dd><p>If <span class="SimpleMath">\(d_k \geq k+1\)</span> holds for <span class="SimpleMath">\(1 \leq k < m/2\)</span> then <span class="SimpleMath">\(\Gamma\)</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 \geq k+1\)</span> or <span class="SimpleMath">\(d_{m-k} \geq m-k\)</span> holds for <span class="SimpleMath">\(1 \leq k < m/2\)</span> then <span class="SimpleMath">\(\Gamma\)</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_mj.html#biBBGK">[BGK08]</a> (the computations for that paper are shown in <a href="chapBib_mj.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 \in G^{\times}\)</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)/\sim\)</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="center">\[
1_M^G(g):= (|G| \cdot |g^G \cap M|) / (|M| \cdot |g^G|),
\]</p>
<p>where <span class="SimpleMath">\(g^G = \{ g^x; x \in 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 \cap M| = |g^G| \cdot 1_M^G(g) / 1_M^G(1)\)</span>.</p>
<p>Doubly counting the set <span class="SimpleMath">\(\{ (s^x, M^y); x, y \in G, s^x \in M^y \}\)</span> yields <span class="SimpleMath">\(|M^G| \cdot |s^G \cap M| = |s^G| \cdot |\{ M^x; x \in G, s \in M^x \}|\)</span> and thus <span class="SimpleMath">\(|\{ M^x; x \in G, s \in M^x \}| = |M^G| \cdot 1_M^G(s) / 1_M^G(1) \leq 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">\(\Pi\)</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="center">\[
\delta(s, g^G):= |g^G| \cdot \max\left\{ 0, 1 - \sum_{{\pi \in \Pi}}
\pi(g) \cdot \pi(s) / \pi(1) \right\}
\]</p>
<p>and <span class="SimpleMath">\(d(s, g^G):= |\{ x \in g^G; \langle s, x \rangle = 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(\Gamma(G), s) = \sum_{{x \in 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">\(\delta(s):= \sum_{x \in R} \delta(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">\(\Pi\)</span> is known.</p>
<p>For computing the vertex degrees of the iterated closures of <span class="SimpleMath">\(\Gamma(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">\(\delta^{(i)}(s):= \sum_{{x \in R}} \delta^{(i)}(s, x^G)\)</span>, a lower bound for <span class="SimpleMath">\(d(cl^{(i)}(\Gamma(G)), s)\)</span> that can be computed if <span class="SimpleMath">\(\Pi\)</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">\(\beta(s)\)</span> for the vertex degrees <span class="SimpleMath">\(d(cl^{(i)}(\Gamma(G)), s)\)</span>, for some fixed <span class="SimpleMath">\(i\)</span>, and let us choose representatives <span class="SimpleMath">\(s_1, s_2, \ldots, s_l\)</span> of the nonidentity conjugacy classes of <span class="SimpleMath">\(G\)</span> such that <span class="SimpleMath">\(\beta(s_1) \leq \beta(s_2) \leq \cdots \leq \beta(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">\(\beta(s_1)\)</span>, the next <span class="SimpleMath">\(c_2\)</span> vertex degrees are larger than or equal to <span class="SimpleMath">\(\beta(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="center">\[
\{ x; c_1 + c_2 + \cdots + c_{k-1} < x \leq c_1 + c_2 + \cdots c_k,
x < (|G| - 1) / 2, \beta(s_k) < x+1 \}.
\]</p>
<p>This is an interval <span class="SimpleMath">\(\{ L_k, L_k + 1, \ldots, U_k \}\)</span> with</p>
<p class="center">\[
L_k = \max\left\{ 1 + c_1 + c_2 + \cdots + c_{k-1},
\beta(s_k) \right\}
\]</p>
<p>and</p>
<p class="center">\[
U_k = \min\left\{ c_1 + c_2 + \cdots + c_k,
\left\lfloor |G|/2 \right\rfloor - 1 \right\} .
\]</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 \leq \left\lfloor |G|/2 \right\rfloor - 1\)</span>.)</p>
<p>The generating graph <span class="SimpleMath">\(\Gamma(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 \leq k \leq l\)</span>.</p>
<p>The set of indices for which Chvátal's criterion is not guaranteed is the intersection of</p>
<p class="center">\[
\{ m-k; 1 \leq 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="center">\[
\{ m-x; c_1 + c_2 + \cdots + c_{k-1} < x \leq c_1 + c_2 + \cdots c_k,
1 \leq m-x < (|G| - 1) / 2, \beta(s_k) < x \}.
\]</p>
<p>This is again an interval <span class="SimpleMath">\(\{ L^{\prime}_k, L^{\prime}_k + 1, \ldots, U^{\prime}_k \}\)</span> with</p>
<p class="center">\[
L^{\prime}_k = \max\left\{ 1, m - ( c_1 + c_2 + \cdots + c_k ) \right\}
\]</p>
<p>and</p>
<p class="center">\[
U^{\prime}_k = \min\left\{ m - ( c_1 + c_2 + \cdots + c_{k-1} ) - 1,
\left\lfloor |G|/2 \right\rfloor - 1,
m-1 - \beta(s_k) \right\} .
\]</p>
<p>The generating graph <span class="SimpleMath">\(\Gamma(G)\)</span> satisfies Chvátal's criterion if the union of the intervals <span class="SimpleMath">\(\{ L^{\prime}_k, L^{\prime}_k + 1, \ldots, U^{\prime}_k \}\)</span>, for <span class="SimpleMath">\(1 \leq k \leq l\)</span> is disjoint to the union of the intervals <span class="SimpleMath">\(\{ L_k, L_k + 1, \ldots, U_k \}\)</span>, for <span class="SimpleMath">\(1 \leq k \leq 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_mj.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_mj.html#X87FE2DDD7F086D2F"><span class="RefLink">4.3-2</span></a>). Finally, Section <a href="chap4_mj.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_mj.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 \in 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 \in C_G(g)\)</span>, <span class="SimpleMath">\(c_2 \in C_G(s)\)</span>, and a representative <span class="SimpleMath">\(r \in G\)</span>, we have <span class="SimpleMath">\(\langle s, g^{c_1 r c_2} \rangle = \langle s, g^r \rangle^{c_2}\)</span>. If <span class="SimpleMath">\(\langle s, g^r \rangle = 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) \cdot |C_G(g)| = d(g, s^G) \cdot |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">\(\langle s_1 \rangle = \langle s_2 \rangle\)</span> and <span class="SimpleMath">\(\langle g_1 \rangle = \langle g_2 \rangle\)</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">\(\delta(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">\(\Pi\)</span> of the primitive permutation characters of a given group <span class="SimpleMath">\(G\)</span> and for computing the lower bounds <span class="SimpleMath">\(\delta(s, g^G)\)</span> from <span class="SimpleMath">\(\Pi\)</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_mj.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_mj.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_mj.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_mj.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_mj.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">\(\delta(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">\(\delta(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">\(\delta(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">\(\delta^{(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">\(\delta^{(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">\(\delta^{(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)}(\Gamma(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, \ldots, U_k \}\)</span> and <span class="SimpleMath">\(\{ L^{\prime}_k, L^{\prime}_k + 1, \ldots, U^{\prime}_k \}\)</span> that were introduced in Section <a href="chap4_mj.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 \leq 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">\([ \delta(g_k), |g_k^G|, \iota(k) ]\)</span>, where <span class="SimpleMath">\(\iota(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">\(\Gamma\)</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)}(\Gamma)\)</span> satisfies Pósa's or Chvátal's criterion, if such a closure exists. If no closure has this property, the string < | | |