loops/doc/chap6_mj.html

690 lines
60 KiB
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="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
<title>GAP (Loops) - Chapter 6: Methods Based on Permutation 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="chap6" 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="chapA_mj.html">A</a> <a href="chapB_mj.html">B</a> <a href="chapBib_mj.html">Bib</a> <a href="chapInd_mj.html">Ind</a> </div>
<div class="chlinkprevnexttop">&nbsp;<a href="chap0_mj.html">[Top of Book]</a>&nbsp; <a href="chap0_mj.html#contents">[Contents]</a>&nbsp; &nbsp;<a href="chap5_mj.html">[Previous Chapter]</a>&nbsp; &nbsp;<a href="chap7_mj.html">[Next Chapter]</a>&nbsp; </div>
<p id="mathjaxlink" class="pcenter"><a href="chap6.html">[MathJax off]</a></p>
<p><a id="X794A04C5854D352B" name="X794A04C5854D352B"></a></p>
<div class="ChapSects"><a href="chap6_mj.html#X794A04C5854D352B">6 <span class="Heading">Methods Based on Permutation Groups</span></a>
<div class="ContSect"><span class="tocline"><span class="nocss">&nbsp;</span><a href="chap6_mj.html#X8731D818827C08F3">6.1 <span class="Heading">Parent of a Quasigroup</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7BC856CC7F116BB0">6.1-1 Parent</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X79975EC6783B4293">6.1-2 Position</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X832295DE866E44EE">6.1-3 PosInParent</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss">&nbsp;</span><a href="chap6_mj.html#X83EDF04F7952143F">6.2 <span class="Heading">Subquasigroups and Subloops</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7DD511FF864FCDFF">6.2-1 Subquasigroup</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X84E6744E804AE830">6.2-2 Subloop</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X87AC8B7E80CE9260">6.2-3 <span class="Heading">IsSubquasigroup and IsSubloop</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X859B6C8183537E75">6.2-4 AllSubquasigroups</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X81EF252585592001">6.2-5 AllSubloops</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X835F48248571364F">6.2-6 RightCosets</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X85C65D06822E716F">6.2-7 RightTransversal</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss">&nbsp;</span><a href="chap6_mj.html#X78AA3D177CCA49FF">6.3 <span class="Heading">Translations and Sections</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7B45B48C7C4D6061">6.3-1 <span class="Heading">LeftTranslation and RightTranslation</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7EB9197C80FB4664">6.3-2 <span class="Heading">LeftSection and RightSection</span></a>
</span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss">&nbsp;</span><a href="chap6_mj.html#X78ED50F578A88046">6.4 <span class="Heading">Multiplication Groups</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X87302BE983A5FC61">6.4-1 <span class="Heading">LeftMutliplicationGroup, RightMultiplicationGroup and MultiplicationGroup</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X847256B779E1E7E5">6.4-2 <span class="Heading">RelativeLeftMultiplicationGroup, RelativeRightMultiplicationGroup and RelativeMultiplicationGroup</span></a>
</span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss">&nbsp;</span><a href="chap6_mj.html#X8740D61178ACD217">6.5 <span class="Heading">Inner Mapping Groups</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7EE1E78C856C6F7C">6.5-1 <span class="Heading">LeftInnerMapping, RightInnerMapping, MiddleInnerMapping</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X79CDA09A7D48BF2B">6.5-2 <span class="Heading">LeftInnerMappingGroup, RightInnerMappingGroup, MiddleInnerMappingGroup</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X82513A3B7C3A6420">6.5-3 InnerMappingGroup</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss">&nbsp;</span><a href="chap6_mj.html#X7B45C2AF7C2E28AB">6.6 <span class="Heading">Nuclei, Commutant, Center, and Associator Subloop</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7DF536FC85BBD1D2">6.6-1 <span class="Heading">LeftNucles, MiddleNucleus, and RightNucleus</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X84D389677A91C290">6.6-2 <span class="Heading">Nuc, NucleusOfQuasigroup and NucleusOfLoop</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7C8428DE791F3CE1">6.6-3 Commutant</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7C1FBE7A84DD4873">6.6-4 Center</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7F7FDE82780EDD7E">6.6-5 AssociatorSubloop</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss">&nbsp;</span><a href="chap6_mj.html#X85B650D284FE39F3">6.7 <span class="Heading">Normal Subloops and Simple Loops</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X838186F9836F678C">6.7-1 IsNormal</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7BDEA0A98720D1BB">6.7-2 NormalClosure</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7D8E63A7824037CC">6.7-3 IsSimple</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss">&nbsp;</span><a href="chap6_mj.html#X87F66DB383C29A4A">6.8 <span class="Heading">Factor Loops</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X83E1953980E2DE2F">6.8-1 FactorLoop</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X870FCB497AECC730">6.8-2 NaturalHomomorphismByNormalSubloop</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss">&nbsp;</span><a href="chap6_mj.html#X821F40748401D698">6.9 <span class="Heading">Nilpotency and Central Series</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X78A4B93781C96AAE">6.9-1 IsNilpotent</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7D5FC62581A99482">6.9-2 NilpotencyClassOfLoop</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7E7C2D117B55F6A0">6.9-3 IsStronglyNilpotent</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7ED37AA07BEE79E0">6.9-4 UpperCentralSeries</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X817BDBC2812992ED">6.9-5 LowerCentralSeries</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss">&nbsp;</span><a href="chap6_mj.html#X83A38A6C7EDBCA63">6.10 <span class="Heading">Solvability, Derived Series and Frattini Subloop</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X79B10B337A3B1C6E">6.10-1 IsSolvable</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7A82DC4680DAD67C">6.10-2 DerivedSubloop</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7A9AA1577CEC891F">6.10-3 DerivedLength</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X85BD2C517FA7A47E">6.10-4 <span class="Heading">FrattiniSubloop and FrattinifactorSize</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X855286367A2D5A54">6.10-5 FrattinifactorSize</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss">&nbsp;</span><a href="chap6_mj.html#X81F3496578EAA74E">6.11 <span class="Heading">Isomorphisms and Automorphisms</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X801067F67E5292F7">6.11-1 IsomorphismQuasigroups</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7D7B10D6836FCA9F">6.11-2 IsomorphismLoops</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X82373C5479574F22">6.11-3 QuasigroupsUpToIsomorphism</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X8308F38283C61B20">6.11-4 LoopsUpToIsomorphism</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X87677B0787B4461A">6.11-5 AutomorphismGroup</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7A42812B7B027DD4">6.11-6 QuasigroupIsomorph</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7BD1AC32851286EA">6.11-7 LoopIsomorph</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X85B3E22679FD8D81">6.11-8 IsomorphicCopyByPerm</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X8121DE3A78795040">6.11-9 IsomorphicCopyByNormalSubloop</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X7D09D8957E4A0973">6.11-10 Discriminator</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X812F0DEE7C896E18">6.11-11 AreEqualDiscriminators</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss">&nbsp;</span><a href="chap6_mj.html#X7E996BDD81E594F9">6.12 <span class="Heading">Isotopisms</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X84C5ADE77F910F63">6.12-1 IsotopismLoops</a></span>
<span class="ContSS"><br /><span class="nocss">&nbsp;&nbsp;</span><a href="chap6_mj.html#X841E540B7A7EF29F">6.12-2 LoopsUpToIsotopism</a></span>
</div></div>
</div>
<h3>6 <span class="Heading">Methods Based on Permutation Groups</span></h3>
<p>Most calculations in the <strong class="pkg">LOOPS</strong> package are delegated to groups, taking advantage of the various permutations and permutation groups associated with quasigroups. This chapter explains in detail how the permutations associated with a quasigroup are calculated, and it also describes some of the core methods of <strong class="pkg">LOOPS</strong> based on permutations. Additional core methods can be found in Chapter <a href="chap7_mj.html#X7910E575825C713E"><span class="RefLink">7</span></a>.</p>
<p><a id="X8731D818827C08F3" name="X8731D818827C08F3"></a></p>
<h4>6.1 <span class="Heading">Parent of a Quasigroup</span></h4>
<p>Let <span class="SimpleMath">\(Q\)</span> be a quasigroup and <span class="SimpleMath">\(S\)</span> a subquasigroup of <span class="SimpleMath">\(Q\)</span>. Since the multiplication in <span class="SimpleMath">\(S\)</span> coincides with the multiplication in <span class="SimpleMath">\(Q\)</span>, it is reasonable not to store the multiplication table of <span class="SimpleMath">\(S\)</span>. However, the quasigroup <span class="SimpleMath">\(S\)</span> then must know that it is a subquasigroup of <span class="SimpleMath">\(Q\)</span>.</p>
<p><a id="X7BC856CC7F116BB0" name="X7BC856CC7F116BB0"></a></p>
<h5>6.1-1 Parent</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; Parent</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: The parent quasigroup of the quasigroup <var class="Arg">Q</var>.</p>
<p>When <var class="Arg">Q</var> is not created as a subquasigroup of another quasigroup, the attribute <code class="code">Parent(<var class="Arg">Q</var>)</code> is set to <var class="Arg">Q</var>. When <var class="Arg">Q</var> is created as a subquasigroup of a quasigroup <var class="Arg">H</var>, we set <code class="code">Parent(<var class="Arg">Q</var>)</code> equal to <code class="code">Parent(<var class="Arg">H</var>)</code>. Thus, in effect, <code class="code">Parent(<var class="Arg">Q</var>)</code> is the largest quasigroup from which <var class="Arg">Q</var> has been created.</p>
<p><a id="X79975EC6783B4293" name="X79975EC6783B4293"></a></p>
<h5>6.1-2 Position</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; Position</code>( <var class="Arg">Q</var>, <var class="Arg">x</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: The position of <var class="Arg">x</var> among the elements of <var class="Arg">Q</var>.<br /></p>
<p>Let <var class="Arg">Q</var> be a quasigroup with parent <var class="Arg">P</var>, where <var class="Arg">P</var> is some <span class="SimpleMath">\(n\)</span>-element quasigroup. Let <var class="Arg">x</var> be an element of <var class="Arg">Q</var>. Then <code class="code"><var class="Arg">x</var>![1]</code> is the position of <var class="Arg">x</var> among the elements of <var class="Arg">P</var>, i.e., <code class="code"><var class="Arg">x</var>![1] = Position(Elements(<var class="Arg">P</var>),<var class="Arg">x</var>)</code>.</p>
<p>While referring to elements of <var class="Arg">Q</var> by their positions, the user should understand whether the positions are meant among the elements of <var class="Arg">Q</var>, or among the elements of the parent <var class="Arg">P</var> of <var class="Arg">Q</var>. Since it requires no calculation to obtain <code class="code"><var class="Arg">x</var>![1]</code>, we always use the position of an element in its parent quasigroup in <strong class="pkg">LOOPS</strong>. In this way, many attributes of a quasigroup, including its Cayley table, are permanently tied to its parent.</p>
<p>It is now clear why we have not insisted that Cayley tables of quasigroups must have entries covering the entire interval <span class="SimpleMath">\(1\)</span>, <span class="SimpleMath">\(\dots\)</span>, <span class="SimpleMath">\(n\)</span> for some <span class="SimpleMath">\(n\)</span>.</p>
<p><a id="X832295DE866E44EE" name="X832295DE866E44EE"></a></p>
<h5>6.1-3 PosInParent</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; PosInParent</code>( <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: When <var class="Arg">S</var> is a list of quasigroup elements (not necessarily from the same quasigroup), returns the corresponding list of positions of elements of <var class="Arg">S</var> in the corresponding parent, i.e., <code class="code">PosInParent(<var class="Arg">S</var>)[i] = <var class="Arg">S</var>[i]![1] = Position(Parent(<var class="Arg">S</var>[i]),<var class="Arg">S</var>[i])</code>.<br /></p>
<p>Quasigroups with the same parent can be compared as follows. Assume that <span class="SimpleMath">\(A\)</span>, <span class="SimpleMath">\(B\)</span> are two quasigroups with common parent <span class="SimpleMath">\(Q\)</span>. Let <span class="SimpleMath">\(G_A\)</span>, <span class="SimpleMath">\(G_B\)</span> be the canonical generating sets of <span class="SimpleMath">\(A\)</span> and <span class="SimpleMath">\(B\)</span>, respectively, obtained by the method <code class="code">GeneratorsSmallest</code> (see Section <a href="chap5_mj.html#X7BD5B55C802805B4"><span class="RefLink">5.5</span></a>). Then we define <span class="SimpleMath">\(A&lt;B\)</span> if and only if <span class="SimpleMath">\(G_A&lt;G_B\)</span> lexicographically.</p>
<p><a id="X83EDF04F7952143F" name="X83EDF04F7952143F"></a></p>
<h4>6.2 <span class="Heading">Subquasigroups and Subloops</span></h4>
<p><a id="X7DD511FF864FCDFF" name="X7DD511FF864FCDFF"></a></p>
<h5>6.2-1 Subquasigroup</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; Subquasigroup</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: When <var class="Arg">S</var> is a subset of elements or indices of a quasigroup (resp. loop) <var class="Arg">Q</var>, returns the smallest subquasigroup (resp. subloop) of <var class="Arg">Q</var> containing <var class="Arg">S</var>.</p>
<p>We allow <var class="Arg">S</var> to be a list of elements of <var class="Arg">Q</var>, or a list of integers representing the positions of the respective elements in the parent quasigroup (resp. loop) of <var class="Arg">Q</var>.</p>
<p>If <var class="Arg">S</var> is empty, <code class="code">Subquasigroup(<var class="Arg">Q</var>,<var class="Arg">S</var>)</code> returns the empty set if <var class="Arg">Q</var> is a quasigroup, and it returns the one-element subloop of <var class="Arg">Q</var> if <var class="Arg">Q</var> is a loop.</p>
<p><strong class="button">Remark:</strong> The empty set is sometimes considered to be a subquasigroup of <var class="Arg">Q</var> (although not in <strong class="pkg">LOOPS</strong>). The above convention is useful for handling certain situations, for instance when the user calls <code class="code">Center(<var class="Arg">Q</var>)</code> for a quasigroup <var class="Arg">Q</var> with empty center.</p>
<p><a id="X84E6744E804AE830" name="X84E6744E804AE830"></a></p>
<h5>6.2-2 Subloop</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; Subloop</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>This is an analog of <code class="code">Subquasigroup(<var class="Arg">Q</var>,<var class="Arg">S</var>)</code> that can be used only when <var class="Arg">Q</var> is a loop. Since there is no difference in the outcome while calling <code class="code">Subquasigroup(<var class="Arg">Q</var>,<var class="Arg">S</var>)</code> or <code class="code">Subloop(<var class="Arg">Q</var>,<var class="Arg">S</var>)</code> when <var class="Arg">Q</var> is a loop, it is safe to always call <code class="code">Subquasigroup(<var class="Arg">Q</var>,<var class="Arg">S</var>)</code>, whether <var class="Arg">Q</var> is a loop or not.</p>
<p><a id="X87AC8B7E80CE9260" name="X87AC8B7E80CE9260"></a></p>
<h5>6.2-3 <span class="Heading">IsSubquasigroup and IsSubloop</span></h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; IsSubquasigroup</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; IsSubloop</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: <code class="code">true</code> if <var class="Arg">S</var> is a subquasigroup (resp. subloop) of a quasigroup (resp. loop) <var class="Arg">Q</var>, <code class="code">false</code> otherwise. In other words, returns <code class="code">true</code> if <var class="Arg">S</var> and <var class="Arg">Q</var> are quasigroups (resp. loops) with the same parent and <var class="Arg">S</var> is a subset of <var class="Arg">Q</var>.</p>
<p><a id="X859B6C8183537E75" name="X859B6C8183537E75"></a></p>
<h5>6.2-4 AllSubquasigroups</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; AllSubquasigroups</code>( <var class="Arg">Q</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: A list of all subquasigroups of a loop <var class="Arg">Q</var>.</p>
<p><a id="X81EF252585592001" name="X81EF252585592001"></a></p>
<h5>6.2-5 AllSubloops</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; AllSubloops</code>( <var class="Arg">Q</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: A list of all subloops of a loop <var class="Arg">Q</var>.</p>
<p><a id="X835F48248571364F" name="X835F48248571364F"></a></p>
<h5>6.2-6 RightCosets</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; RightCosets</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>Returns: If <var class="Arg">S</var> is a subloop of <var class="Arg">Q</var>, returns a list of all right cosets of <var class="Arg">S</var> in <var class="Arg">Q</var>.</p>
<p>The coset <var class="Arg">S</var> is listed first, and the elements of each coset are ordered in the same way as the elements of <var class="Arg">S</var>, i.e., if <var class="Arg">S</var><span class="SimpleMath">\( = [s_1,\dots,s_m]\)</span>, then <var class="Arg">S</var><span class="SimpleMath">\(x=[s_1x,\dots,s_mx]\)</span>.</p>
<p><a id="X85C65D06822E716F" name="X85C65D06822E716F"></a></p>
<h5>6.2-7 RightTransversal</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; RightTransversal</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: A right transversal of a subloop <var class="Arg">S</var> in a loop <var class="Arg">Q</var>. The transversal consists of the list of first elements from the right cosets obtained by <code class="code">RightCosets(<var class="Arg">Q</var>,<var class="Arg">S</var>)</code>.</p>
<p>When <var class="Arg">S</var> is a subloop of <var class="Arg">Q</var>, the right transversal of <var class="Arg">S</var> with respect to <var class="Arg">Q</var> is a subset of <var class="Arg">Q</var> containing one element from each right coset of <var class="Arg">S</var> in <var class="Arg">Q</var>.</p>
<p><a id="X78AA3D177CCA49FF" name="X78AA3D177CCA49FF"></a></p>
<h4>6.3 <span class="Heading">Translations and Sections</span></h4>
<p>When <span class="SimpleMath">\(x\)</span> is an element of a quasigroup <span class="SimpleMath">\(Q\)</span>, the left translation <span class="SimpleMath">\(L_x\)</span> is a permutation of <span class="SimpleMath">\(Q\)</span>. In <strong class="pkg">LOOPS</strong>, all permutations associated with quasigroups and their elements are permutations in the sense of <strong class="pkg">GAP</strong>, i.e., they are bijections of some interval <span class="SimpleMath">\(1\)</span>, <span class="SimpleMath">\(\dots\)</span>, <span class="SimpleMath">\(n\)</span>. Moreover, following our convention, the numerical entries of the permutations point to the positions among elements of the parent of <span class="SimpleMath">\(Q\)</span>, not among elements of <span class="SimpleMath">\(Q\)</span>.</p>
<p><a id="X7B45B48C7C4D6061" name="X7B45B48C7C4D6061"></a></p>
<h5>6.3-1 <span class="Heading">LeftTranslation and RightTranslation</span></h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; LeftTranslation</code>( <var class="Arg">Q</var>, <var class="Arg">x</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; RightTranslation</code>( <var class="Arg">Q</var>, <var class="Arg">x</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: If <var class="Arg">x</var> is an element of a quasigroup <var class="Arg">Q</var>, returns the left translation (resp. right translation) by <var class="Arg">x</var> in <var class="Arg">Q</var>.</p>
<p><a id="X7EB9197C80FB4664" name="X7EB9197C80FB4664"></a></p>
<h5>6.3-2 <span class="Heading">LeftSection and RightSection</span></h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; LeftSection</code>( <var class="Arg">Q</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; RightSection</code>( <var class="Arg">Q</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: The left section (resp. right section) of a quasigroup <var class="Arg">Q</var>.<br /></p>
<p>Here is an example illustrating the main features of the subquasigroup construction and the relationship between a quasigroup and its parent.</p>
<p>Note how the Cayley table of a subquasigroup is created only upon explicit demand. Also note that changing the names of elements of a subquasigroup (subloop) automatically changes the names of the elements of the parent subquasigroup (subloop). This is because the elements are shared.</p>
<div class="example"><pre>
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">M := MoufangLoop( 12, 1 );; S := Subloop( M, [ M.5 ] );</span>
&lt;loop of order 3&gt;
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">[ Parent( S ) = M, Elements( S ), PosInParent( S ) ];</span>
[ true, [ l1, l3, l5], [ 1, 3, 5 ] ]
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">HasCayleyTable( S );</span>
false
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">SetLoopElmName( S, "s" );; Elements( S ); Elements( M );</span>
[ s1, s3, s5 ]
[ s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12 ]
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">CayleyTable( S );</span>
[ [ 1, 3, 5 ], [ 3, 5, 1 ], [ 5, 1, 3 ] ]
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">LeftSection( S );</span>
[ (), (1,3,5), (1,5,3) ]
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">[ HasCayleyTable( S ), Parent( S ) = M ];</span>
[ true, true ]
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">L := LoopByCayleyTable( CayleyTable( S ) );; Elements( L );</span>
[ l1, l2, l3 ]
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">[ Parent( L ) = L, IsSubloop( M, S ), IsSubloop( M, L ) ];</span>
[ true, true, false ]
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">LeftSection( L );</span>
[ (), (1,2,3), (1,3,2) ]
</pre></div>
<p><a id="X78ED50F578A88046" name="X78ED50F578A88046"></a></p>
<h4>6.4 <span class="Heading">Multiplication Groups</span></h4>
<p><a id="X87302BE983A5FC61" name="X87302BE983A5FC61"></a></p>
<h5>6.4-1 <span class="Heading">LeftMutliplicationGroup, RightMultiplicationGroup and MultiplicationGroup</span></h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; LeftMultiplicationGroup</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; RightMultiplicationGroup</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; MultiplicationGroup</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: The left multiplication group, right multiplication group, resp. multiplication group of a quasigroup <var class="Arg">Q</var>.</p>
<p><a id="X847256B779E1E7E5" name="X847256B779E1E7E5"></a></p>
<h5>6.4-2 <span class="Heading">RelativeLeftMultiplicationGroup, RelativeRightMultiplicationGroup and RelativeMultiplicationGroup</span></h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; RelativeLeftMultiplicationGroup</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; RelativeRightMultiplicationGroup</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; RelativeMultiplicationGroup</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: The relative left multiplication group, the relative right multiplication group, resp. the relative multiplication group of a quasigroup <var class="Arg">Q</var> with respect to a subquasigroup <var class="Arg">S</var> of <var class="Arg">Q</var>.</p>
<p>Let <span class="SimpleMath">\(S\)</span> be a subquasigroup of a quasigroup <span class="SimpleMath">\(Q\)</span>. Then the <em>relative left multiplication group</em> of <span class="SimpleMath">\(Q\)</span> with respect to <span class="SimpleMath">\(S\)</span> is the group <span class="SimpleMath">\(\langle L(x)|x\in S\rangle\)</span>, where <span class="SimpleMath">\(L(x)\)</span> is the left translation by <span class="SimpleMath">\(x\)</span> in <span class="SimpleMath">\(Q\)</span> restricted to <span class="SimpleMath">\(S\)</span>. The <em>relative right multiplication group</em> and the <em>relative multiplication group</em> are defined analogously.</p>
<p><a id="X8740D61178ACD217" name="X8740D61178ACD217"></a></p>
<h4>6.5 <span class="Heading">Inner Mapping Groups</span></h4>
<p>By a result of Bruck, the left inner mapping group of a loop is generated by all <em>left inner mappings</em> <span class="SimpleMath">\(L(x,y) = L_{yx}^{-1}L_yL_x\)</span>, and the right inner mapping group is generated by all <em>right inner mappings</em> <span class="SimpleMath">\(R(x,y) = R_{xy}^{-1}R_yR_x\)</span>.</p>
<p>In analogy with group theory, we define the <em>conjugations</em> or the <em>middle inner mappings</em> as <span class="SimpleMath">\(T(x) = L_x^{-1}R_x\)</span>. The <em>middle inner mapping grroup</em> is then the group generated by all conjugations.</p>
<p><a id="X7EE1E78C856C6F7C" name="X7EE1E78C856C6F7C"></a></p>
<h5>6.5-1 <span class="Heading">LeftInnerMapping, RightInnerMapping, MiddleInnerMapping</span></h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; LeftInnerMapping</code>( <var class="Arg">Q</var>, <var class="Arg">x</var>, <var class="Arg">y</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; RightInnerMapping</code>( <var class="Arg">Q</var>, <var class="Arg">x</var>, <var class="Arg">y</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; MiddleInnerMapping</code>( <var class="Arg">Q</var>, <var class="Arg">x</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: The left inner mapping <span class="SimpleMath">\(L(\)</span><var class="Arg">x</var>,<var class="Arg">y</var><span class="SimpleMath">\()\)</span>, the right inner mapping <span class="SimpleMath">\(R(\)</span><var class="Arg">x</var>,<var class="Arg">y</var><span class="SimpleMath">\()\)</span>, resp. the middle inner mapping <span class="SimpleMath">\(T(\)</span><var class="Arg">x</var><span class="SimpleMath">\()\)</span> of a loop <var class="Arg">Q</var>.</p>
<p><a id="X79CDA09A7D48BF2B" name="X79CDA09A7D48BF2B"></a></p>
<h5>6.5-2 <span class="Heading">LeftInnerMappingGroup, RightInnerMappingGroup, MiddleInnerMappingGroup</span></h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; LeftInnerMappingGroup</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; RightInnerMappingGroup</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; MiddleInnerMappingGroup</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: The left inner mapping group, right inner mapping group, resp. middle inner mapping group of a loop <var class="Arg">Q</var>.</p>
<p><a id="X82513A3B7C3A6420" name="X82513A3B7C3A6420"></a></p>
<h5>6.5-3 InnerMappingGroup</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; InnerMappingGroup</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: The inner mapping group of a loop <var class="Arg">Q</var>.<br /></p>
<p>Here is an example for multiplication groups and inner mapping groups:</p>
<div class="example"><pre>
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">M := MoufangLoop(12,1);</span>
&lt;Moufang loop 12/1&gt;
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">LeftSection(M)[2];</span>
(1,2)(3,4)(5,6)(7,8)(9,12)(10,11)
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">Mlt := MultiplicationGroup(M); Inn := InnerMappingGroup(M);</span>
&lt;permutation group of size 2592 with 23 generators&gt;
Group([ (4,6)(7,11), (7,11)(8,10), (2,6,4)(7,9,11), (3,5)(9,11), (8,12,10) ])
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">Size(Inn);</span>
216
</pre></div>
<p><a id="X7B45C2AF7C2E28AB" name="X7B45C2AF7C2E28AB"></a></p>
<h4>6.6 <span class="Heading">Nuclei, Commutant, Center, and Associator Subloop</span></h4>
<p>See Section <a href="chap2_mj.html#X83EDF04F7952143F"><span class="RefLink">2.3</span></a> for the relevant definitions.</p>
<p><a id="X7DF536FC85BBD1D2" name="X7DF536FC85BBD1D2"></a></p>
<h5>6.6-1 <span class="Heading">LeftNucles, MiddleNucleus, and RightNucleus</span></h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; LeftNucleus</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; MiddleNucleus</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; RightNucleus</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: The left nucleus, middle nucleus, resp. right nucleus of a quasigroup <var class="Arg">Q</var>.</p>
<p><a id="X84D389677A91C290" name="X84D389677A91C290"></a></p>
<h5>6.6-2 <span class="Heading">Nuc, NucleusOfQuasigroup and NucleusOfLoop</span></h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; Nuc</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; NucleusOfQuasigroup</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; NucleusOfLoop</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: These synonymous attributes return the nucleus of a quasigroup <var class="Arg">Q</var>.</p>
<p>Since all nuclei are subquasigroups of <var class="Arg">Q</var>, they are returned as subquasigroups (resp. subloops). When <var class="Arg">Q</var> is a loop then all nuclei are in fact groups, and they are returned as associative loops.</p>
<p><strong class="button">Remark:</strong> The name <code class="code">Nucleus</code> is a global function of <strong class="pkg">GAP</strong> with two variables. We have therefore used <code class="code">Nuc</code> rather than <code class="code">Nucleus</code> for the nucleus. This abbreviation is sometimes used in the literature, too.</p>
<p><a id="X7C8428DE791F3CE1" name="X7C8428DE791F3CE1"></a></p>
<h5>6.6-3 Commutant</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; Commutant</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: The commutant of a quasigroup <var class="Arg">Q</var>.</p>
<p><a id="X7C1FBE7A84DD4873" name="X7C1FBE7A84DD4873"></a></p>
<h5>6.6-4 Center</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; Center</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: The center of a quasigroup <var class="Arg">Q</var>.</p>
<p>If <var class="Arg">Q</var> is a loop, the center of <var class="Arg">Q</var> is a subgroup of <var class="Arg">Q</var> and it is returned as an associative loop.</p>
<p><a id="X7F7FDE82780EDD7E" name="X7F7FDE82780EDD7E"></a></p>
<h5>6.6-5 AssociatorSubloop</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; AssociatorSubloop</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: The associator subloop of a loop <var class="Arg">Q</var>.</p>
<p>We calculate the associator subloop of <var class="Arg">Q</var> as the smallest normal subloop of <var class="Arg">Q</var> containing all elements <span class="SimpleMath">\(x\backslash\alpha(x)\)</span>, where <span class="SimpleMath">\(x\)</span> is an element of <var class="Arg">Q</var> and <span class="SimpleMath">\(\alpha\)</span> is a left inner mapping of <var class="Arg">Q</var>.</p>
<p><a id="X85B650D284FE39F3" name="X85B650D284FE39F3"></a></p>
<h4>6.7 <span class="Heading">Normal Subloops and Simple Loops</span></h4>
<p><a id="X838186F9836F678C" name="X838186F9836F678C"></a></p>
<h5>6.7-1 IsNormal</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; IsNormal</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: <code class="code">true</code> if <var class="Arg">S</var> is a normal subloop of a loop <var class="Arg">Q</var>.</p>
<p>A subloop <span class="SimpleMath">\(S\)</span> of a loop <span class="SimpleMath">\(Q\)</span> is <em>normal</em> if it is invariant under all inner mappings of <span class="SimpleMath">\(Q\)</span>.</p>
<p><a id="X7BDEA0A98720D1BB" name="X7BDEA0A98720D1BB"></a></p>
<h5>6.7-2 NormalClosure</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; NormalClosure</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: The normal closure of a subset <var class="Arg">S</var> of a loop <var class="Arg">Q</var>.</p>
<p>For a subset <span class="SimpleMath">\(S\)</span> of a loop <span class="SimpleMath">\(Q\)</span>, the <em>normal closure</em> of <span class="SimpleMath">\(S\)</span> in <span class="SimpleMath">\(Q\)</span> is the smallest normal subloop of <span class="SimpleMath">\(Q\)</span> containing <span class="SimpleMath">\(S\)</span>.</p>
<p><a id="X7D8E63A7824037CC" name="X7D8E63A7824037CC"></a></p>
<h5>6.7-3 IsSimple</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; IsSimple</code>( <var class="Arg">Q</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: <code class="code">true</code> if <var class="Arg">Q</var> is a simple loop.</p>
<p>A loop <span class="SimpleMath">\(Q\)</span> is <em>simple</em> if <span class="SimpleMath">\(\{1\}\)</span> and <span class="SimpleMath">\(Q\)</span> are the only normal subloops of <span class="SimpleMath">\(Q\)</span>.</p>
<p><a id="X87F66DB383C29A4A" name="X87F66DB383C29A4A"></a></p>
<h4>6.8 <span class="Heading">Factor Loops</span></h4>
<p><a id="X83E1953980E2DE2F" name="X83E1953980E2DE2F"></a></p>
<h5>6.8-1 FactorLoop</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; FactorLoop</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: When <var class="Arg">S</var> is a normal subloop of a loop <var class="Arg">Q</var>, returns the factor loop <var class="Arg">Q</var><span class="SimpleMath">\(/\)</span><var class="Arg">S</var>.</p>
<p><a id="X870FCB497AECC730" name="X870FCB497AECC730"></a></p>
<h5>6.8-2 NaturalHomomorphismByNormalSubloop</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; NaturalHomomorphismByNormalSubloop</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: When <var class="Arg">S</var> is a normal subloop of a loop <var class="Arg">Q</var>, returns the natural projection from <var class="Arg">Q</var> onto <var class="Arg">Q</var><span class="SimpleMath">\(/\)</span><var class="Arg">S</var>.</p>
<div class="example"><pre>
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">M := MoufangLoop( 12, 1 );; S := Subloop( M, [ M.3 ] );</span>
&lt;loop of order 3&gt;
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">IsNormal( M, S );</span>
true
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">F := FactorLoop( M, S );</span>
&lt;loop of order 4&gt;
<span class="GAPprompt">gap&gt;</span> <span class="GAPinput">NaturalHomomorphismByNormalSubloop( M, S );</span>
MappingByFunction( &lt;loop of order 12&gt;, &lt;loop of order 4&gt;,
function( x ) ... end )
</pre></div>
<p><a id="X821F40748401D698" name="X821F40748401D698"></a></p>
<h4>6.9 <span class="Heading">Nilpotency and Central Series</span></h4>
<p>See Section <a href="chap2_mj.html#X869CBCE381E2C422"><span class="RefLink">2.4</span></a> for the relevant definitions.</p>
<p><a id="X78A4B93781C96AAE" name="X78A4B93781C96AAE"></a></p>
<h5>6.9-1 IsNilpotent</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; IsNilpotent</code>( <var class="Arg">Q</var> )</td><td class="tdright">( property )</td></tr></table></div>
<p>Returns: <code class="code">true</code> if <var class="Arg">Q</var> is a nilpotent loop.</p>
<p><a id="X7D5FC62581A99482" name="X7D5FC62581A99482"></a></p>
<h5>6.9-2 NilpotencyClassOfLoop</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; NilpotencyClassOfLoop</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: The nilpotency class of a loop <var class="Arg">Q</var> if <var class="Arg">Q</var> is nilpotent, <code class="code">fail</code> otherwise.</p>
<p><a id="X7E7C2D117B55F6A0" name="X7E7C2D117B55F6A0"></a></p>
<h5>6.9-3 IsStronglyNilpotent</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; IsStronglyNilpotent</code>( <var class="Arg">Q</var> )</td><td class="tdright">( property )</td></tr></table></div>
<p>Returns: <code class="code">true</code> if <var class="Arg">Q</var> is a strongly nilpotent loop.</p>
<p>A loop <span class="SimpleMath">\(Q\)</span> is said to be <em>strongly nilpotent</em> if its multiplication group is nilpotent.</p>
<p><a id="X7ED37AA07BEE79E0" name="X7ED37AA07BEE79E0"></a></p>
<h5>6.9-4 UpperCentralSeries</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; UpperCentralSeries</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: When <var class="Arg">Q</var> is a nilpotent loop, returns the upper central series of <var class="Arg">Q</var>, else returns <code class="code">fail</code>.</p>
<p><a id="X817BDBC2812992ED" name="X817BDBC2812992ED"></a></p>
<h5>6.9-5 LowerCentralSeries</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; LowerCentralSeries</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: When <var class="Arg">Q</var> is a nilpotent loop, returns the lower central series of <var class="Arg">Q</var>, else returns <code class="code">fail</code>.</p>
<p>The <em>lower central series</em> for loops is defined analogously to groups.</p>
<p><a id="X83A38A6C7EDBCA63" name="X83A38A6C7EDBCA63"></a></p>
<h4>6.10 <span class="Heading">Solvability, Derived Series and Frattini Subloop</span></h4>
<p>See Section <a href="chap2_mj.html#X869CBCE381E2C422"><span class="RefLink">2.4</span></a> for definitions of solvability an derived subloop.</p>
<p><a id="X79B10B337A3B1C6E" name="X79B10B337A3B1C6E"></a></p>
<h5>6.10-1 IsSolvable</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; IsSolvable</code>( <var class="Arg">Q</var> )</td><td class="tdright">( property )</td></tr></table></div>
<p>Returns: <code class="code">true</code> if <var class="Arg">Q</var> is a solvable loop.</p>
<p><a id="X7A82DC4680DAD67C" name="X7A82DC4680DAD67C"></a></p>
<h5>6.10-2 DerivedSubloop</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; DerivedSubloop</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: The derived subloop of a loop <var class="Arg">Q</var>.</p>
<p><a id="X7A9AA1577CEC891F" name="X7A9AA1577CEC891F"></a></p>
<h5>6.10-3 DerivedLength</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; DerivedLength</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: If <var class="Arg">Q</var> is solvable, returns the derived length of <var class="Arg">Q</var>, else returns <code class="code">fail</code>.</p>
<p><a id="X85BD2C517FA7A47E" name="X85BD2C517FA7A47E"></a></p>
<h5>6.10-4 <span class="Heading">FrattiniSubloop and FrattinifactorSize</span></h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; FrattiniSubloop</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: The Frattini subloop of <var class="Arg">Q</var>. The method is implemented only for strongly nilpotent loops.</p>
<p><em>Frattini subloop</em> of a loop <span class="SimpleMath">\(Q\)</span> is the intersection of maximal subloops of <span class="SimpleMath">\(Q\)</span>.</p>
<p><a id="X855286367A2D5A54" name="X855286367A2D5A54"></a></p>
<h5>6.10-5 FrattinifactorSize</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; FrattinifactorSize</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p><a id="X81F3496578EAA74E" name="X81F3496578EAA74E"></a></p>
<h4>6.11 <span class="Heading">Isomorphisms and Automorphisms</span></h4>
<p><a id="X801067F67E5292F7" name="X801067F67E5292F7"></a></p>
<h5>6.11-1 IsomorphismQuasigroups</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; IsomorphismQuasigroups</code>( <var class="Arg">Q</var>, <var class="Arg">L</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: An isomorphism from a quasigroup <var class="Arg">Q</var> to a quasigroup <var class="Arg">L</var> if the quasigroups are isomorphic, <code class="code">fail</code> otherwise.</p>
<p>If an isomorphism exists, it is returned as a permutation <span class="SimpleMath">\(f\)</span> of <span class="SimpleMath">\(1,\dots,|\)</span><var class="Arg">Q</var><span class="SimpleMath">\(|\)</span>, where <span class="SimpleMath">\(i^f=j\)</span> means that the <span class="SimpleMath">\(i\)</span>th element of <var class="Arg">Q</var> is mapped onto the <span class="SimpleMath">\(j\)</span>th element of <var class="Arg">L</var>. Note that this convention is used even if the underlying sets of <var class="Arg">Q</var>, <var class="Arg">L</var> are not indexed by consecutive integers.</p>
<p><a id="X7D7B10D6836FCA9F" name="X7D7B10D6836FCA9F"></a></p>
<h5>6.11-2 IsomorphismLoops</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; IsomorphismLoops</code>( <var class="Arg">Q</var>, <var class="Arg">L</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: An isomorphism from a loop <var class="Arg">Q</var> to a loop <var class="Arg">L</var> if the loops are isomorphic, <code class="code">fail</code> otherwise, with the same convention as in <code class="code">IsomorphismQuasigroups</code>.</p>
<p><a id="X82373C5479574F22" name="X82373C5479574F22"></a></p>
<h5>6.11-3 QuasigroupsUpToIsomorphism</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; QuasigroupsUpToIsomorphism</code>( <var class="Arg">ls</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: Given a list <var class="Arg">ls</var> of quasigroups, returns a sublist of <var class="Arg">ls</var> consisting of representatives of isomorphism classes of quasigroups from <var class="Arg">ls</var>.</p>
<p><a id="X8308F38283C61B20" name="X8308F38283C61B20"></a></p>
<h5>6.11-4 LoopsUpToIsomorphism</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; LoopsUpToIsomorphism</code>( <var class="Arg">ls</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: Given a list <var class="Arg">ls</var> of loops, returns a sublist of <var class="Arg">ls</var> consisting of representatives of isomorphism classes of loops from <var class="Arg">ls</var>.</p>
<p><a id="X87677B0787B4461A" name="X87677B0787B4461A"></a></p>
<h5>6.11-5 AutomorphismGroup</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; AutomorphismGroup</code>( <var class="Arg">Q</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: The automorphism group of a loop or quasigroups <var class="Arg">Q</var>, with the same convention on permutations as in <code class="code">IsomorphismQuasigroups</code>.<br /></p>
<p><strong class="button">Remark:</strong> Since two isomorphisms differ by an automorphism, all isomorphisms from <var class="Arg">Q</var> to <var class="Arg">L</var> can be obtained by a combination of <code class="code">IsomorphismLoops(<var class="Arg">Q</var>,<var class="Arg">L</var>)</code> (or <code class="code">IsomorphismQuasigroups(<var class="Arg">Q</var>,<var class="Arg">L</var>)</code>) and <code class="code">AutomorphismGroup(<var class="Arg">L</var>)</code>. <br /></p>
<p>While dealing with Cayley tables, it is often useful to rename or reorder the elements of the underlying quasigroup without changing the isomorphism type of the quasigroups. <strong class="pkg">LOOPS</strong> contains several functions for this purpose.</p>
<p><a id="X7A42812B7B027DD4" name="X7A42812B7B027DD4"></a></p>
<h5>6.11-6 QuasigroupIsomorph</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; QuasigroupIsomorph</code>( <var class="Arg">Q</var>, <var class="Arg">f</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: When <var class="Arg">Q</var> is a quasigroup and <var class="Arg">f</var> is a permutation of <span class="SimpleMath">\(1,\dots,|\)</span><var class="Arg">Q</var><span class="SimpleMath">\(|\)</span>, returns the quasigroup defined on the same set as <var class="Arg">Q</var> with multiplication <span class="SimpleMath">\(*\)</span> defined by <span class="SimpleMath">\(x*y = \)</span><var class="Arg">f</var><span class="SimpleMath">\((\)</span><var class="Arg">f</var><span class="SimpleMath">\({}^{-1}(x)\)</span><var class="Arg">f</var><span class="SimpleMath">\({}^{-1}(y))\)</span>.</p>
<p><a id="X7BD1AC32851286EA" name="X7BD1AC32851286EA"></a></p>
<h5>6.11-7 LoopIsomorph</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; LoopIsomorph</code>( <var class="Arg">Q</var>, <var class="Arg">f</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: When <var class="Arg">Q</var> is a loop and <var class="Arg">f</var> is a permutation of <span class="SimpleMath">\(1,\dots,|\)</span><var class="Arg">Q</var><span class="SimpleMath">\(|\)</span> fixing <span class="SimpleMath">\(1\)</span>, returns the loop defined on the same set as <var class="Arg">Q</var> with multiplication <span class="SimpleMath">\(*\)</span> defined by <span class="SimpleMath">\(x*y = \)</span><var class="Arg">f</var><span class="SimpleMath">\((\)</span><var class="Arg">f</var><span class="SimpleMath">\({}^{-1}(x)\)</span><var class="Arg">f</var><span class="SimpleMath">\({}^{-1}(y))\)</span>. If <var class="Arg">f</var><span class="SimpleMath">\((1)=c\ne 1\)</span>, the isomorphism <span class="SimpleMath">\((1,c)\)</span> is applied after <var class="Arg">f</var>.</p>
<p><a id="X85B3E22679FD8D81" name="X85B3E22679FD8D81"></a></p>
<h5>6.11-8 IsomorphicCopyByPerm</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; IsomorphicCopyByPerm</code>( <var class="Arg">Q</var>, <var class="Arg">f</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: <code class="code">LoopIsomorphism(<var class="Arg">Q</var>,<var class="Arg">f</var>)</code> if <var class="Arg">Q</var> is a loop, and <code class="code">QuasigroupIsomorphism(<var class="Arg">Q</var>,<var class="Arg">f</var>)</code> if <var class="Arg">Q</var> is a quasigroup.</p>
<p><a id="X8121DE3A78795040" name="X8121DE3A78795040"></a></p>
<h5>6.11-9 IsomorphicCopyByNormalSubloop</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; IsomorphicCopyByNormalSubloop</code>( <var class="Arg">Q</var>, <var class="Arg">S</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: When <var class="Arg">S</var> is a normal subloop of a loop <var class="Arg">Q</var>, returns an isomorphic copy of <var class="Arg">Q</var> in which the elements are ordered according to the right cosets of <var class="Arg">S</var>. In particular, the Cayley table of <var class="Arg">S</var> will appear in the top left corner of the Cayley table of the resulting loop.<br /></p>
<p>In order to speed up the search for isomorphisms and automorphisms, we first calculate some loop invariants preserved under isomorphisms, and then we use these invariants to partition the loop into blocks of elements preserved under isomorphisms. The following two operations are used in the search.</p>
<p><a id="X7D09D8957E4A0973" name="X7D09D8957E4A0973"></a></p>
<h5>6.11-10 Discriminator</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; Discriminator</code>( <var class="Arg">Q</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: A data structure with isomorphism invariants of a loop <var class="Arg">Q</var>.</p>
<p>See <a href="chapBib_mj.html#biBVo">[Voj06]</a> or the file <code class="file">iso.gi</code> for more details. The format of the discriminator has been changed from version 3.2.0 up to accommodate isomorphism searches for quasigroups.</p>
<p>If two loops have different discriminators, they are not isomorphic. If they have identical discriminators, they may or may not be isomorphic.</p>
<p><a id="X812F0DEE7C896E18" name="X812F0DEE7C896E18"></a></p>
<h5>6.11-11 AreEqualDiscriminators</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; AreEqualDiscriminators</code>( <var class="Arg">D1</var>, <var class="Arg">D2</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: <code class="code">true</code> if <var class="Arg">D1</var>, <var class="Arg">D2</var> are equal discriminators for the purposes of isomorphism searches.</p>
<p><a id="X7E996BDD81E594F9" name="X7E996BDD81E594F9"></a></p>
<h4>6.12 <span class="Heading">Isotopisms</span></h4>
<p>At the moment, <strong class="pkg">LOOPS</strong> contains only slow methods for testing if two loops are isotopic. The method works as follows: It is well known that if a loop <span class="SimpleMath">\(K\)</span> is isotopic to a loop <span class="SimpleMath">\(L\)</span> then there exist a principal loop isotope <span class="SimpleMath">\(P\)</span> of <span class="SimpleMath">\(K\)</span> such that <span class="SimpleMath">\(P\)</span> is isomorphic to <span class="SimpleMath">\(L\)</span>. The algorithm first finds all principal isotopes of <span class="SimpleMath">\(K\)</span>, then filters them up to isomorphism, and then checks if any of them is isomorphic to <span class="SimpleMath">\(L\)</span>. This is rather slow already for small orders.</p>
<p><a id="X84C5ADE77F910F63" name="X84C5ADE77F910F63"></a></p>
<h5>6.12-1 IsotopismLoops</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; IsotopismLoops</code>( <var class="Arg">K</var>, <var class="Arg">L</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: <code class="code">fail</code> if <var class="Arg">K</var>, <var class="Arg">L</var> are not isotopic loops, else it returns an isotopism as a triple of bijections on <span class="SimpleMath">\(1,\dots,|\)</span><var class="Arg">K</var><span class="SimpleMath">\(|\)</span>.</p>
<p><a id="X841E540B7A7EF29F" name="X841E540B7A7EF29F"></a></p>
<h5>6.12-2 LoopsUpToIsotopism</h5>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">&#8227; LoopsUpToIsotopism</code>( <var class="Arg">ls</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Returns: Given a list <var class="Arg">ls</var> of loops, returns a sublist of <var class="Arg">ls</var> consisting of representatives of isotopism classes of loops from <var class="Arg">ls</var>.</p>
<div class="chlinkprevnextbot">&nbsp;<a href="chap0_mj.html">[Top of Book]</a>&nbsp; <a href="chap0_mj.html#contents">[Contents]</a>&nbsp; &nbsp;<a href="chap5_mj.html">[Previous Chapter]</a>&nbsp; &nbsp;<a href="chap7_mj.html">[Next Chapter]</a>&nbsp; </div>
<div class="chlinkbot"><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="chapA_mj.html">A</a> <a href="chapB_mj.html">B</a> <a href="chapBib_mj.html">Bib</a> <a href="chapInd_mj.html">Ind</a> </div>
<hr />
<p class="foot">generated by <a href="http://www.math.rwth-aachen.de/~Frank.Luebeck/GAPDoc">GAPDoc2HTML</a></p>
</body>
</html>