Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Impressum chap41.html   Sprache: HTML

 
 products/sources/formale Sprachen/GAP/doc/ref/chap41.html


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>GAP (ref) - Chapter 41: Group Actions</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="chap41"  onload="jscontent()">


<div class="chlinktop"><span class="chlink1">Goto Chapter: </span><a href="chap0.html">Top</a>  <a href="chap1.html">1</a>  <a href="chap2.html">2</a>  <a href="chap3.html">3</a>  <a href="chap4.html">4</a>  <a href="chap5.html">5</a>  <a href="chap6.html">6</a>  <a href="chap7.html">7</a>  <a href="chap8.html">8</a>  <a href="chap9.html">9</a>  <a href="chap10.html">10</a>  <a href="chap11.html">11</a>  <a href="chap12.html">12</a>  <a href="chap13.html">13</a>  <a href="chap14.html">14</a>  <a href="chap15.html">15</a>  <a href="chap16.html">16</a>  <a href="chap17.html">17</a>  <a href="chap18.html">18</a>  <a href="chap19.html">19</a>  <a href="chap20.html">20</a>  <a href="chap21.html">21</a>  <a href="chap22.html">22</a>  <a href="chap23.html">23</a>  <a href="chap24.html">24</a>  <a href="chap25.html">25</a>  <a href="chap26.html">26</a>  <a href="chap27.html">27</a>  <a href="chap28.html">28</a>  <a href="chap29.html">29</a>  <a href="chap30.html">30</a>  <a href="chap31.html">31</a>  <a href="chap32.html">32</a>  <a href="chap33.html">33</a>  <a href="chap34.html">34</a>  <a href="chap35.html">35</a>  <a href="chap36.html">36</a>  <a href="chap37.html">37</a>  <a href="chap38.html">38</a>  <a href="chap39.html">39</a>  <a href="chap40.html">40</a>  <a href="chap41.html">41</a>  <a href="chap42.html">42</a>  <a href="chap43.html">43</a>  <a href="chap44.html">44</a>  <a href="chap45.html">45</a>  <a href="chap46.html">46</a>  <a href="chap47.html">47</a>  <a href="chap48.html">48</a>  <a href="chap49.html">49</a>  <a href="chap50.html">50</a>  <a href="chap51.html">51</a>  <a href="chap52.html">52</a>  <a href="chap53.html">53</a>  <a href="chap54.html">54</a>  <a href="chap55.html">55</a>  <a href="chap56.html">56</a>  <a href="chap57.html">57</a>  <a href="chap58.html">58</a>  <a href="chap59.html">59</a>  <a href="chap60.html">60</a>  <a href="chap61.html">61</a>  <a href="chap62.html">62</a>  <a href="chap63.html">63</a>  <a href="chap64.html">64</a>  <a href="chap65.html">65</a>  <a href="chap66.html">66</a>  <a href="chap67.html">67</a>  <a href="chap68.html">68</a>  <a href="chap69.html">69</a>  <a href="chap70.html">70</a>  <a href="chap71.html">71</a>  <a href="chap72.html">72</a>  <a href="chap73.html">73</a>  <a href="chap74.html">74</a>  <a href="chap75.html">75</a>  <a href="chap76.html">76</a>  <a href="chap77.html">77</a>  <a href="chap78.html">78</a>  <a href="chap79.html">79</a>  <a href="chap80.html">80</a>  <a href="chap81.html">81</a>  <a href="chap82.html">82</a>  <a href="chap83.html">83</a>  <a href="chap84.html">84</a>  <a href="chap85.html">85</a>  <a href="chap86.html">86</a>  <a href="chap87.html">87</a>  <a href="chapBib.html">Bib</a>  <a href="chapInd.html">Ind</a>  </div>

<div class="chlinkprevnexttop"> <a href="chap0.html">[Top of Book]</a>   <a href="chap0.html#contents">[Contents]</a>    <a href="chap40.html">[Previous Chapter]</a>    <a href="chap42.html">[Next Chapter]</a>   </div>

<p id="mathjaxlink" class="pcenter"><a href="chap41_mj.html">[MathJax on]</a></p>
<p><a id="X87115591851FB7F4" name="X87115591851FB7F4"></a></p>
<div class="ChapSects"><a href="chap41.html#X87115591851FB7F4">41 <span class="Heading">Group Actions</span></a>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap41.html#X83661AFD7B7BD1D9">41.1 <span class="Heading">About Group Actions</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap41.html#X81B8F9CD868CD953">41.2 <span class="Heading">Basic Actions</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7FE417DD837987B4">41.2-1 OnPoints</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7960924D84B5B18F">41.2-2 OnRight</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X832DF5327ECA0E44">41.2-3 OnLeftInverse</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X85AA04347CD117F9">41.2-4 OnSets</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X832CC5F87EEA4A7E">41.2-5 OnTuples</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X80DAA1D2855B1456">41.2-6 OnPairs</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7C10492081D72376">41.2-7 OnSetsSets</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7E23686E7A9D3A20">41.2-8 OnSetsDisjointSets</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7ADE244E819035FF">41.2-9 OnSetsTuples</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7FF556CD7E6739A9">41.2-10 OnTuplesSets</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X844E902382EB4151">41.2-11 OnTuplesTuples</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X86DC2DD5829CAD9A">41.2-12 OnLines</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7FA394D27E721E2B">41.2-13 OnIndeterminates</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7BA8D76586F1F06E">41.2-14 Permuted</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X85124D197F0F9C4D">41.2-15 OnSubspacesByCanonicalBasis</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap41.html#X82181CA07A5B2056">41.3 <span class="Heading">Action on canonical representatives</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap41.html#X81E0FF0587C54543">41.4 <span class="Heading">Orbits</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X80E0234E7BD79409">41.4-1 Orbit</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X86BCAE17869BBEAA">41.4-2 Orbits</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X86BC8B958123F953">41.4-3 <span class="Heading">OrbitsDomain</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X799910CF832EDC45">41.4-4 OrbitLength</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X8032F73078DF2DDB">41.4-5 <span class="Heading">OrbitLengths</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X8520E2487F7E98AF">41.4-6 <span class="Heading">OrbitLengthsDomain</span></a>
</span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap41.html#X797BD60E7ACEF1B1">41.5 <span class="Heading">Stabilizers</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7C34EC437EF598BF">41.5-1 OrbitStabilizer</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X86FB962786397E02">41.5-2 Stabilizer</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X78C3A8568414BC44">41.5-3 OrbitStabilizerAlgorithm</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap41.html#X7A9389097BAF670D">41.6 <span class="Heading">Elements with Prescribed Images</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X857DC7B085EB0539">41.6-1 RepresentativeAction</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap41.html#X87F73CCA7921DE65">41.7 <span class="Heading">The Permutation Image of an Action</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X78E6A002835288A4">41.7-1 <span class="Heading">ActionHomomorphism</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X85A8E93D786C3C9C">41.7-2 Action</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X86FF54A383B73967">41.7-3 SparseActionHomomorphism</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap41.html#X7FED50ED7ACA5FB2">41.8 <span class="Heading">Action of a group on itself</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X784D417D87F4E58D">41.8-1 FactorCosetAction</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X8561DEBA79E01ABD">41.8-2 RegularActionHomomorphism</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X835317A7847477D4">41.8-3 AbelianSubfactorAction</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap41.html#X807AA91E841D132B">41.9 <span class="Heading">Permutations Induced by Elements and Cycles</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7807A33381DCAB26">41.9-1 <span class="Heading">Permutation</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X81D4EA42810974A0">41.9-2 PermutationCycle</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X80AF6E0683CA7F14">41.9-3 Cycle</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7F559E897B333758">41.9-4 CycleLength</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7F3B387A7FD8AE5E">41.9-5 Cycles</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X83040A6080C2C6C6">41.9-6 CycleLengths</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X87FDA6838065CDCB">41.9-7 <span class="Heading">CycleIndex</span></a>
</span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap41.html#X850A84618421392A">41.10 <span class="Heading">Tests for Actions</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X79B15750851828CB">41.10-1 <span class="Heading">IsTransitive</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X8295D733796B7A37">41.10-2 <span class="Heading">Transitivity</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X8166A6A17C8D6E73">41.10-3 <span class="Heading">RankAction</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7B77040F8543CD6E">41.10-4 <span class="Heading">IsSemiRegular</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7CF02C4785F0EAB5">41.10-5 <span class="Heading">IsRegular</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7CB1D74280F92AFC">41.10-6 <span class="Heading">Earns</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X84C19AD68247B760">41.10-7 <span class="Heading">IsPrimitive</span></a>
</span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap41.html#X7E9D3D0B7A9A8572">41.11 <span class="Heading">Block Systems</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X84FE699F85371643">41.11-1 <span class="Heading">Blocks</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X79936EB97AAD1144">41.11-2 <span class="Heading">MaximalBlocks</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7941DB6380B74510">41.11-3 <span class="Heading">RepresentativesMinimalBlocks</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X835658B07B28EF3B">41.11-4 AllBlocks</a></span>
</div></div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap41.html#X7FD3D2D2788709B7">41.12 <span class="Heading">External Sets</span></a>
</span>
<div class="ContSSBlock">
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X8264C3C479FF0A8B">41.12-1 IsExternalSet</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7C90F648793E47DD">41.12-2 ExternalSet</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7B9DB15D80CE28B4">41.12-3 ActingDomain</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X86153CB087394DC1">41.12-4 FunctionAction</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X86A0CC1479A5932A">41.12-5 HomeEnumerator</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X879DE63C7858453C">41.12-6 IsExternalSubset</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X87D1EA1486D86233">41.12-7 ExternalSubset</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7E081F568407317F">41.12-8 IsExternalOrbit</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7FB656AE7A066C35">41.12-9 ExternalOrbit</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7BAFF02B7D6DF9F2">41.12-10 StabilizerOfExternalSet</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X867262FA82FDD592">41.12-11 <span class="Heading">ExternalOrbits</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7A64EF807CE8893E">41.12-12 <span class="Heading">ExternalOrbitsStabilizers</span></a>
</span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X8048AE727A7F1A2F">41.12-13 CanonicalRepresentativeOfExternalSet</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X8071A8D784DC8325">41.12-14 CanonicalRepresentativeDeterminatorOfExternalSet</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X85E9A6A77B8D00B8">41.12-15 ActorOfExternalSet</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X8190A8247F29A5C7">41.12-16 UnderlyingExternalSet</a></span>
<span class="ContSS"><br /><span class="nocss">  </span><a href="chap41.html#X7A3D87DE809FBFD4">41.12-17 SurjectiveActionHomomorphismAttr</a></span>
</div></div>
</div>

<h3>41 <span class="Heading">Group Actions</span></h3>

<p>A <em>group action</em> is a triple <span class="SimpleMath">(G, Ω, μ)</span>, where <span class="SimpleMath">G</span> is a group, <span class="SimpleMath">Ω</span> a set and <span class="SimpleMath">μ : Ω × G → Ω</span> a function that is compatible with the group arithmetic. We call <span class="SimpleMath">Ω</span> the <em>domain</em> of the action.</p>

<p>In <strong class="pkg">GAP</strong>, <span class="SimpleMath">Ω</span> can be a duplicate-free collection (an object that permits access to its elements via the <span class="SimpleMath">Ω[n]</span> operation, for example a list), it does not need to be sorted (see <code class="func">IsSet</code> (<a href="chap21.html#X80CDAF45782E8DCB"><span class="RefLink">21.17-4</span></a>)).</p>

<p>The acting function <span class="SimpleMath">μ</span> is a binary <strong class="pkg">GAP</strong> function that returns the image <span class="SimpleMath">μ( x, g )</span> for a point <span class="SimpleMath">x ∈ Ω</span> and a group element <span class="SimpleMath">g ∈ G</span>.</p>

<p>In <strong class="pkg">GAP</strong>, groups always act from the right, that is <span class="SimpleMath">μ( μ( x, g ), h ) = μ( x, gh )</span>.</p>

<p><strong class="pkg">GAP</strong> does not test whether the acting function <span class="SimpleMath">μ</span> satisfies the conditions for a group operation but silently assumes that is does. (If it does not, results are unpredictable.)</p>

<p>The first section of this chapter, <a href="chap41.html#X83661AFD7B7BD1D9"><span class="RefLink">41.1</span></a>, describes the various ways how operations for group actions can be called.</p>

<p>Functions for several commonly used action are already built into <strong class="pkg">GAP</strong>. These are listed in section <a href="chap41.html#X81B8F9CD868CD953"><span class="RefLink">41.2</span></a>.</p>

<p>The sections <a href="chap41.html#X87F73CCA7921DE65"><span class="RefLink">41.7</span></a> and <a href="chap41.html#X7FED50ED7ACA5FB2"><span class="RefLink">41.8</span></a> describe homomorphisms and mappings associated to group actions as well as the permutation group image of an action.</p>

<p>The other sections then describe operations to compute orbits, stabilizers, as well as properties of actions.</p>

<p>Finally section <a href="chap41.html#X7FD3D2D2788709B7"><span class="RefLink">41.12</span></a> describes the concept of <q>external sets</q> which represent the concept of a <em><span class="SimpleMath">G</span>-set</em> and underly the actions mechanism.</p>

<p><a id="X83661AFD7B7BD1D9" name="X83661AFD7B7BD1D9"></a></p>

<h4>41.1 <span class="Heading">About Group Actions</span></h4>

<p>The syntax which is used by the operations for group actions is quite flexible. For example we can call the operation <code class="func">OrbitsDomain</code> (<a href="chap41.html#X86BC8B958123F953"><span class="RefLink">41.4-3</span></a>) for the orbits of the group <var class="Arg">G</var> on the domain <var class="Arg">Omega</var> in the following ways:</p>


<dl>
<dt><strong class="Mark"><code class="code">OrbitsDomain</code><span class="SimpleMath">( G, Ω[, μ] )</span></strong></dt>
<dd><p>The acting function <span class="SimpleMath">μ</span> is optional. If it is not given, the built-in action <code class="func">OnPoints</code> (<a href="chap41.html#X7FE417DD837987B4"><span class="RefLink">41.2-1</span></a>) (which defines an action via the caret operator <code class="code">^</code>) is used as a default.</p>

</dd>
<dt><strong class="Mark"><code class="code">OrbitsDomain</code><span class="SimpleMath">( G, Ω, gens, acts[, μ] )</span></strong></dt>
<dd><p>This second version of <code class="func">OrbitsDomain</code> (<a href="chap41.html#X86BC8B958123F953"><span class="RefLink">41.4-3</span></a>) permits one to implement an action induced by a homomorphism: If the group <span class="SimpleMath">H</span> acts on <span class="SimpleMath">Ω</span> via <span class="SimpleMath">μ</span> and <span class="SimpleMath">φ : G → H</span> is a homomorphism, <span class="SimpleMath">G</span> acts on <span class="SimpleMath">Ω</span> via the induced action <span class="SimpleMath"'( x, g ) = μ( x, g^φ ).



<p>Here <span class="SimpleMath">gens</span> must be a set of generators of <span class="SimpleMath">G</span> and <span class="SimpleMath">acts</span> the images of <span class="SimpleMath">gens</span> under <span class="SimpleMath">φ</span>. <span class="SimpleMath">μ</span> is the acting function for <span class="SimpleMath">H</span>. Again, the function <span class="SimpleMath">μ</span> is optional and <code class="func">OnPoints</code> (<a href="chap41.html#X7FE417DD837987B4"><span class="RefLink">41.2-1</span></a>) is used as a default.</p>

<p>The advantage of this notation is that <strong class="pkg">GAP</strong> does not need to construct this homomorphism <span class="SimpleMath">φ</span> and the range group <var class="Arg">H</var> as <strong class="pkg">GAP</strong> objects. (If a small group <span class="SimpleMath">G</span> acts via complicated objects <span class="SimpleMath">acts</span> this otherwise could lead to performance problems.)</p>

<p><strong class="pkg">GAP</strong> does not test whether the mapping <span class="SimpleMath">gens ↦ acts</span> actually induces a homomorphism and the results are unpredictable if this is not the case.</p>

</dd>
<dt><strong class="Mark"><code class="code">OrbitsDomain</code><span class="SimpleMath">( xset )</span></strong></dt>
<dd><p>A third variant is to call the operation with an external set, which then provides <span class="SimpleMath">G</span>, <span class="SimpleMath">Ω</span> and <span class="SimpleMath">μ</span>. You will find more about external sets in Section <a href="chap41.html#X7FD3D2D2788709B7"><span class="RefLink">41.12</span></a>.</p>

</dd>
</dl>
<p>For operations like <code class="func">Stabilizer</code> (<a href="chap41.html#X86FB962786397E02"><span class="RefLink">41.5-2</span></a>) of course the domain must be replaced by an element of the domain of the action.</p>

<p><a id="X81B8F9CD868CD953" name="X81B8F9CD868CD953"></a></p>

<h4>41.2 <span class="Heading">Basic Actions</span></h4>

<p><strong class="pkg">GAP</strong> already provides acting functions for the more common actions of a group. For built-in operations such as <code class="func">Stabilizer</code> (<a href="chap41.html#X86FB962786397E02"><span class="RefLink">41.5-2</span></a>) special methods are available for many of these actions.</p>

<p>If one needs an action for which no acting function is provided by the library it can be implemented via a <strong class="pkg">GAP</strong> function that conforms to the syntax</p>

<p><code class="code">actfun( omega, g )</code></p>

<p>where <code class="code">omega</code> is an element of the action domain, <code class="code">g</code> is an element of the acting group, and the return value is the image of <code class="code">omega</code> under <code class="code">g</code>.</p>

<p>For example one could define the following function that acts on pairs of polynomials via <code class="func">OnIndeterminates</code> (<a href="chap41.html#X7FA394D27E721E2B"><span class="RefLink">41.2-13</span></a>):</p>


<div class="example"><pre>
OnIndeterminatesPairs:= function( polypair, g )
  return [ OnIndeterminates( polypair[1], g ),
           OnIndeterminates( polypair[2], g ) ];
end;
</pre></div>

<p>Note that this function <em>must</em> implement a group action from the <em>right</em>. This is not verified by <strong class="pkg">GAP</strong> and results are unpredictable otherwise.</p>

<p><a id="X7FE417DD837987B4" name="X7FE417DD837987B4"></a></p>

<h5>41.2-1 OnPoints</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnPoints</code>( <var class="Arg">pnt</var>, <var class="Arg">g</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>returns <code class="code"><var class="Arg">pnt</var> ^ <var class="Arg">g</var></code>. This is for example the action of a permutation group on points, or the action of a group on its elements via conjugation, that is, if both <var class="Arg">pnt</var> and <var class="Arg">g</var> are elements from a common group then <code class="code"><var class="Arg">pnt</var> ^ <var class="Arg">g</var></code> is equal to <var class="Arg">g</var><span class="SimpleMath">^{-1}</span><code class="code">*</code><var class="Arg">pnt</var><code class="code">*</code><var class="Arg">g</var>. The action of a matrix group on vectors from the right is described by both <code class="func">OnPoints</code> and <code class="func">OnRight</code> (<a href="chap41.html#X7960924D84B5B18F"><span class="RefLink">41.2-2</span></a>).</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">OnPoints( 1, (1,2,3) );</span>
2
<span class="GAPprompt">gap></span> <span class="GAPinput">OnPoints( (1,2), (1,2,3) );</span>
(2,3)
<span class="GAPprompt">gap></span> <span class="GAPinput">g:= Group( (1,2,3), (2,3,4) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit( g, 1, OnPoints );</span>
[ 1, 2, 3, 4 ]
</pre></div>

<p><a id="X7960924D84B5B18F" name="X7960924D84B5B18F"></a></p>

<h5>41.2-2 OnRight</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnRight</code>( <var class="Arg">pnt</var>, <var class="Arg">g</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>returns <code class="code"><var class="Arg">pnt</var> * <var class="Arg">g</var></code>. This is for example the action of a group on its elements via right multiplication, or the action of a group on the cosets of a subgroup. The action of a matrix group on vectors from the right is described by both <code class="func">OnPoints</code> (<a href="chap41.html#X7FE417DD837987B4"><span class="RefLink">41.2-1</span></a>) and <code class="func">OnRight</code>.</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">OnRight( [ 1, 2 ], [ [ 1, 2 ], [ 3, 4 ] ] );</span>
[ 7, 10 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">OnRight( (1,2,3), (2,3,4) );</span>
(1,3)(2,4)
<span class="GAPprompt">gap></span> <span class="GAPinput">g:= Group( (1,2,3), (2,3,4) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit( g, (), OnRight );</span>
[ (), (1,2,3), (2,3,4), (1,3,2), (1,3)(2,4), (1,2)(3,4), (2,4,3),
  (1,4,2), (1,4,3), (1,3,4), (1,2,4), (1,4)(2,3) ]
</pre></div>

<p><a id="X832DF5327ECA0E44" name="X832DF5327ECA0E44"></a></p>

<h5>41.2-3 OnLeftInverse</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnLeftInverse</code>( <var class="Arg">pnt</var>, <var class="Arg">g</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>returns <span class="SimpleMath"><var class="Arg">g</var>^{-1}</span> <code class="code">* <var class="Arg">pnt</var></code>. Forming the inverse is necessary to make this a proper action, as in <strong class="pkg">GAP</strong> groups always act from the right.</p>

<p><code class="func">OnLeftInverse</code> is used for example in the representation of a right coset as an external set (see <a href="chap41.html#X7FD3D2D2788709B7"><span class="RefLink">41.12</span></a>), that is, a right coset <span class="SimpleMath">Ug</span> is an external set for the group <span class="SimpleMath">U</span> acting on it via <code class="func">OnLeftInverse</code>.)</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">OnLeftInverse( [ 1, 2 ], [ [ 1, 2 ], [ 3, 4 ] ] );</span>
[ 0, 1/2 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">OnLeftInverse( (1,2,3), (2,3,4) );</span>
(1,2,4)
<span class="GAPprompt">gap></span> <span class="GAPinput">g:= Group( (1,2,3), (2,3,4) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit( g, (), OnLeftInverse );</span>
[ (), (1,3,2), (2,4,3), (1,2,3), (1,3)(2,4), (1,2)(3,4), (2,3,4),
  (1,2,4), (1,3,4), (1,4,3), (1,4,2), (1,4)(2,3) ]
</pre></div>

<p><a id="X85AA04347CD117F9" name="X85AA04347CD117F9"></a></p>

<h5>41.2-4 OnSets</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnSets</code>( <var class="Arg">set</var>, <var class="Arg">g</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>Let <var class="Arg">set</var> be a proper set (see <a href="chap21.html#X80ABC25582343910"><span class="RefLink">21.19</span></a>). <code class="func">OnSets</code> returns the proper set formed by the images of all points <span class="SimpleMath">x</span> of <var class="Arg">set</var> via the action function <code class="func">OnPoints</code> (<a href="chap41.html#X7FE417DD837987B4"><span class="RefLink">41.2-1</span></a>), applied to <span class="SimpleMath">x</span> and <var class="Arg">g</var>.</p>

<p><code class="func">OnSets</code> is for example used to compute the action of a permutation group on blocks.</p>

<p>(<code class="func">OnTuples</code> (<a href="chap41.html#X832CC5F87EEA4A7E"><span class="RefLink">41.2-5</span></a>) is an action on lists that preserves the ordering of entries.)</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">OnSets( [ 1, 3 ], (1,2,3) );</span>
[ 1, 2 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">OnSets( [ (2,3), (1,2) ], (1,2,3) );</span>
[ (2,3), (1,3) ]
<span class="GAPprompt">gap></span> <span class="GAPinput">g:= Group( (1,2,3), (2,3,4) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit( g, [ 1, 2 ], OnSets );</span>
[ [ 1, 2 ], [ 2, 3 ], [ 1, 3 ], [ 3, 4 ], [ 1, 4 ], [ 2, 4 ] ]
</pre></div>

<p><a id="X832CC5F87EEA4A7E" name="X832CC5F87EEA4A7E"></a></p>

<h5>41.2-5 OnTuples</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnTuples</code>( <var class="Arg">tup</var>, <var class="Arg">g</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>Let <var class="Arg">tup</var> be a list. <code class="func">OnTuples</code> returns the list formed by the images of all points <span class="SimpleMath">x</span> of <var class="Arg">tup</var> via the action function <code class="func">OnPoints</code> (<a href="chap41.html#X7FE417DD837987B4"><span class="RefLink">41.2-1</span></a>), applied to <span class="SimpleMath">x</span> and <var class="Arg">g</var>.</p>

<p>(<code class="func">OnSets</code> (<a href="chap41.html#X85AA04347CD117F9"><span class="RefLink">41.2-4</span></a>) is an action on lists that additionally sorts the entries of the result.)</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">OnTuples( [ 1, 3 ], (1,2,3) );</span>
[ 2, 1 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">OnTuples( [ (2,3), (1,2) ], (1,2,3) );</span>
[ (1,3), (2,3) ]
<span class="GAPprompt">gap></span> <span class="GAPinput">g:= Group( (1,2,3), (2,3,4) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit( g, [ 1, 2 ], OnTuples );</span>
[ [ 1, 2 ], [ 2, 3 ], [ 1, 3 ], [ 3, 1 ], [ 3, 4 ], [ 2, 1 ],
  [ 1, 4 ], [ 4, 1 ], [ 4, 2 ], [ 3, 2 ], [ 2, 4 ], [ 4, 3 ] ]
</pre></div>

<p><a id="X80DAA1D2855B1456" name="X80DAA1D2855B1456"></a></p>

<h5>41.2-6 OnPairs</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnPairs</code>( <var class="Arg">tup</var>, <var class="Arg">g</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>is a special case of <code class="func">OnTuples</code> (<a href="chap41.html#X832CC5F87EEA4A7E"><span class="RefLink">41.2-5</span></a>) for lists <var class="Arg">tup</var> of length 2.</p>

<p><a id="X7C10492081D72376" name="X7C10492081D72376"></a></p>

<h5>41.2-7 OnSetsSets</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnSetsSets</code>( <var class="Arg">set</var>, <var class="Arg">g</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>implements the action on sets of sets. For the special case that the sets are pairwise disjoint, it is possible to use <code class="func">OnSetsDisjointSets</code> (<a href="chap41.html#X7E23686E7A9D3A20"><span class="RefLink">41.2-8</span></a>). <var class="Arg">set</var> must be a sorted list whose entries are again sorted lists, otherwise an error is triggered (see <a href="chap41.html#X82181CA07A5B2056"><span class="RefLink">41.3</span></a>).</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">OnSetsSets( [ [ 1, 2 ], [ 3, 4 ] ], (1,2,3) );</span>
[ [ 1, 4 ], [ 2, 3 ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">g:= Group( (1,2,3), (2,3,4) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit( g, [ [ 1, 2 ], [ 3, 4 ] ], OnSetsSets );</span>
[ [ [ 1, 2 ], [ 3, 4 ] ], [ [ 1, 4 ], [ 2, 3 ] ],
  [ [ 1, 3 ], [ 2, 4 ] ] ]
</pre></div>

<p><a id="X7E23686E7A9D3A20" name="X7E23686E7A9D3A20"></a></p>

<h5>41.2-8 OnSetsDisjointSets</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnSetsDisjointSets</code>( <var class="Arg">set</var>, <var class="Arg">g</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>implements the action on sets of pairwise disjoint sets (see also <code class="func">OnSetsSets</code> (<a href="chap41.html#X7C10492081D72376"><span class="RefLink">41.2-7</span></a>)). <var class="Arg">set</var> must be a sorted list whose entries are again sorted lists, otherwise an error is triggered (see <a href="chap41.html#X82181CA07A5B2056"><span class="RefLink">41.3</span></a>).</p>

<p><a id="X7ADE244E819035FF" name="X7ADE244E819035FF"></a></p>

<h5>41.2-9 OnSetsTuples</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnSetsTuples</code>( <var class="Arg">set</var>, <var class="Arg">g</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>implements the action on sets of tuples. <var class="Arg">set</var> must be a sorted list, otherwise an error is triggered (see <a href="chap41.html#X82181CA07A5B2056"><span class="RefLink">41.3</span></a>).</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">OnSetsTuples( [ [ 1, 2 ], [ 3, 4 ] ], (1,2,3) );</span>
[ [ 1, 4 ], [ 2, 3 ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">g:= Group( (1,2,3), (2,3,4) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit( g, [ [ 1, 2 ], [ 3, 4 ] ], OnSetsTuples );</span>
[ [ [ 1, 2 ], [ 3, 4 ] ], [ [ 1, 4 ], [ 2, 3 ] ],
  [ [ 1, 3 ], [ 4, 2 ] ], [ [ 2, 4 ], [ 3, 1 ] ],
  [ [ 2, 1 ], [ 4, 3 ] ], [ [ 3, 2 ], [ 4, 1 ] ] ]
</pre></div>

<p><a id="X7FF556CD7E6739A9" name="X7FF556CD7E6739A9"></a></p>

<h5>41.2-10 OnTuplesSets</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnTuplesSets</code>( <var class="Arg">set</var>, <var class="Arg">g</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>implements the action on tuples of sets. <var class="Arg">set</var> must be a list whose entries are again sorted lists, otherwise an error is triggered (see <a href="chap41.html#X82181CA07A5B2056"><span class="RefLink">41.3</span></a>).</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">OnTuplesSets( [ [ 2, 3 ], [ 3, 4 ] ], (1,2,3) );</span>
[ [ 1, 3 ], [ 1, 4 ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">g:= Group( (1,2,3), (2,3,4) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit( g, [ [ 1, 2 ], [ 3, 4 ] ], OnTuplesSets );</span>
[ [ [ 1, 2 ], [ 3, 4 ] ], [ [ 2, 3 ], [ 1, 4 ] ],
  [ [ 1, 3 ], [ 2, 4 ] ], [ [ 3, 4 ], [ 1, 2 ] ],
  [ [ 1, 4 ], [ 2, 3 ] ], [ [ 2, 4 ], [ 1, 3 ] ] ]
</pre></div>

<p><a id="X844E902382EB4151" name="X844E902382EB4151"></a></p>

<h5>41.2-11 OnTuplesTuples</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnTuplesTuples</code>( <var class="Arg">set</var>, <var class="Arg">g</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>implements the action on tuples of tuples.</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">OnTuplesTuples( [ [ 2, 3 ], [ 3, 4 ] ], (1,2,3) );</span>
[ [ 3, 1 ], [ 1, 4 ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">g:=Group((1,2,3),(2,3,4));;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit(g,[[1,2],[3,4]],OnTuplesTuples);</span>
[ [ [ 1, 2 ], [ 3, 4 ] ], [ [ 2, 3 ], [ 1, 4 ] ],
  [ [ 1, 3 ], [ 4, 2 ] ], [ [ 3, 1 ], [ 2, 4 ] ],
  [ [ 3, 4 ], [ 1, 2 ] ], [ [ 2, 1 ], [ 4, 3 ] ],
  [ [ 1, 4 ], [ 2, 3 ] ], [ [ 4, 1 ], [ 3, 2 ] ],
  [ [ 4, 2 ], [ 1, 3 ] ], [ [ 3, 2 ], [ 4, 1 ] ],
  [ [ 2, 4 ], [ 3, 1 ] ], [ [ 4, 3 ], [ 2, 1 ] ] ]
</pre></div>

<p><a id="X86DC2DD5829CAD9A" name="X86DC2DD5829CAD9A"></a></p>

<h5>41.2-12 OnLines</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnLines</code>( <var class="Arg">vec</var>, <var class="Arg">g</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>Let <var class="Arg">vec</var> be a <em>normed</em> row vector, that is, its first nonzero entry is normed to the identity of the relevant field, see <code class="func">NormedRowVector</code> (<a href="chap23.html#X785DC60D8482695D"><span class="RefLink">23.2-1</span></a>). The function <code class="func">OnLines</code> returns the row vector obtained from first multiplying <var class="Arg">vec</var> from the right with <var class="Arg">g</var> (via <code class="func">OnRight</code> (<a href="chap41.html#X7960924D84B5B18F"><span class="RefLink">41.2-2</span></a>)) and then normalizing the resulting row vector by scalar multiplication from the left.</p>

<p>This action corresponds to the projective action of a matrix group on one-dimensional subspaces.</p>

<p>If <var class="Arg">vec</var> is a zero vector or is not normed then an error is triggered (see <a href="chap41.html#X82181CA07A5B2056"><span class="RefLink">41.3</span></a>).</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">OnLines( [ 1, 2 ], [ [ 1, 2 ], [ 3, 4 ] ] );</span>
[ 1, 10/7 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">gl:=GL(2,5);;v:=[1,0]*Z(5)^0;</span>
[ Z(5)^0, 0*Z(5) ]
<span class="GAPprompt">gap></span> <span class="GAPinput">h:=Action(gl,Orbit(gl,v,OnLines),OnLines);</span>
Group([ (2,3,5,6), (1,2,4)(3,6,5) ])
</pre></div>

<p><a id="X7FA394D27E721E2B" name="X7FA394D27E721E2B"></a></p>

<h5>41.2-13 OnIndeterminates</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnIndeterminates</code>( <var class="Arg">poly</var>, <var class="Arg">perm</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>A permutation <var class="Arg">perm</var> acts on the multivariate polynomial <var class="Arg">poly</var> by permuting the indeterminates as it permutes points.</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">x:=Indeterminate(Rationals,1);; y:=Indeterminate(Rationals,2);;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">OnIndeterminates(x^7*y+x*y^4,(1,17)(2,28));</span>
x_17^7*x_28+x_17*x_28^4
<span class="GAPprompt">gap></span> <span class="GAPinput">Stabilizer(Group((1,2,3,4),(1,2)),x*y,OnIndeterminates);</span>
Group([ (1,2), (3,4) ])
</pre></div>

<p><a id="X7BA8D76586F1F06E" name="X7BA8D76586F1F06E"></a></p>

<h5>41.2-14 Permuted</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ Permuted</code>( <var class="Arg">list</var>, <var class="Arg">perm</var> )</td><td class="tdright">( method )</td></tr></table></div>
<p>The following example demonstrates <code class="func">Permuted</code> (<a href="chap21.html#X7B5A19098406347A"><span class="RefLink">21.20-17</span></a>) being used to implement a permutation action on a domain:</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">g:=Group((1,2,3),(1,2));;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">dom:=[ "a""b""c" ];;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit(g,dom,Permuted);</span>
[ [ "a""b""c" ], [ "c""a""b" ], [ "b""a""c" ],
  [ "b""c""a" ], [ "a""c""b" ], [ "c""b""a" ] ]
</pre></div>

<p><a id="X85124D197F0F9C4D" name="X85124D197F0F9C4D"></a></p>

<h5>41.2-15 OnSubspacesByCanonicalBasis</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnSubspacesByCanonicalBasis</code>( <var class="Arg">bas</var>, <var class="Arg">mat</var> )</td><td class="tdright">( function )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OnSubspacesByCanonicalBasisConcatenations</code>( <var class="Arg">basvec</var>, <var class="Arg">mat</var> )</td><td class="tdright">( function )</td></tr></table></div>
<p>implements the operation of a matrix group on subspaces of a vector space. <var class="Arg">bas</var> must be a list of (linearly independent) vectors which forms a basis of the subspace in Hermite normal form. <var class="Arg">mat</var> is an element of the acting matrix group. The function returns a mutable matrix which gives the basis of the image of the subspace in Hermite normal form. (In other words: it triangulizes the product of <var class="Arg">bas</var> with <var class="Arg">mat</var>.)</p>

<p><var class="Arg">bas</var> must be given in Hermite normal form, otherwise an error is triggered (see <a href="chap41.html#X82181CA07A5B2056"><span class="RefLink">41.3</span></a>).</p>

<p><a id="X82181CA07A5B2056" name="X82181CA07A5B2056"></a></p>

<h4>41.3 <span class="Heading">Action on canonical representatives</span></h4>

<p>A variety of action functions assumes that the objects on which it acts are given in a particulaform, for example canonical representatives. Affected actions are for example <code class="func">OnSetsSets</code> (<a href="chap41.html#X7C10492081D72376"><span class="RefLink">41.2-7</span></a>), <code class="func">OnSetsDisjointSets</code> (<a href="chap41.html#X7E23686E7A9D3A20"><span class="RefLink">41.2-8</span></a>), <code class="func">OnSetsTuples</code> (<a href="chap41.html#X7ADE244E819035FF"><span class="RefLink">41.2-9</span></a>), <code class="func">OnTuplesSets</code> (<a href="chap41.html#X7FF556CD7E6739A9"><span class="RefLink">41.2-10</span></a>), <code class="func">OnLines</code> (<a href="chap41.html#X86DC2DD5829CAD9A"><span class="RefLink">41.2-12</span></a>) and <code class="func">OnSubspacesByCanonicalBasis</code> (<a href="chap41.html#X85124D197F0F9C4D"><span class="RefLink">41.2-15</span></a>).</p>

<p>If orbit seeds or domain elements are not given in the required form <strong class="pkg">GAP</strong> will issue an error message:</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit(SymmetricGroup(5),[[2,4],[1,3]],OnSetsSets);</span>
Error, Action not well-defined. See the manual section
``Action on canonical representatives''.
</pre></div>

<p>In this case the affected domain elements have to be brought in canonical form, as documented for the respective action function. For interactive use this is most easily done by acting with the identity element of the group.</p>

<p>(A similar error could arise if a user-defined action function is used which actually does not implement an action from the right.)</p>

<p><a id="X81E0FF0587C54543" name="X81E0FF0587C54543"></a></p>

<h4>41.4 <span class="Heading">Orbits</span></h4>

<p>If a group <span class="SimpleMath">G</span> acts on a set <span class="SimpleMath">Ω</span>, the set of all images of <span class="SimpleMath">x ∈ Ω</span> under elements of <span class="SimpleMath">G</span> is called the <em>orbit</em> of <span class="SimpleMath">x</span>. The set of orbits of <span class="SimpleMath">G</span> is a partition of <span class="SimpleMath">Ω</span>.</p>

<p><a id="X80E0234E7BD79409" name="X80E0234E7BD79409"></a></p>

<h5>41.4-1 Orbit</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ Orbit</code>( <var class="Arg">G</var>[, <var class="Arg">Omega</var>], <var class="Arg">pnt</var>[, <var class="Arg">gens</var>, <var class="Arg">acts</var>][, <var class="Arg">act</var>] )</td><td class="tdright">( operation )</td></tr></table></div>
<p>The orbit of the point <var class="Arg">pnt</var> is the list of all images of <var class="Arg">pnt</var> under the action of the group <var class="Arg">G</var> w.r.t. the action function <var class="Arg">act</var> or <code class="func">OnPoints</code> (<a href="chap41.html#X7FE417DD837987B4"><span class="RefLink">41.2-1</span></a>) if no action function is given.</p>

<p>(Note that the arrangement of points in this list is not defined by the operation.)</p>

<p>The orbit of <var class="Arg">pnt</var> will always contain one element that is <em>equal</em> to <var class="Arg">pnt</var>, however for performance reasons this element is not necessarily <em>identical</em> to <var class="Arg">pnt</var>, in particular if <var class="Arg">pnt</var> is mutable.</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">g:=Group((1,3,2),(2,4,3));;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit(g,1);</span>
[ 1, 3, 2, 4 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbit(g,[1,2],OnSets);</span>
[ [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 2, 3 ], [ 3, 4 ], [ 2, 4 ] ]
</pre></div>

<p>(See Section <a href="chap41.html#X81B8F9CD868CD953"><span class="RefLink">41.2</span></a> for information about specific actions.)</p>

<p><a id="X86BCAE17869BBEAA" name="X86BCAE17869BBEAA"></a></p>

<h5>41.4-2 Orbits</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ Orbits</code>( <var class="Arg">G</var>, <var class="Arg">seeds</var>[, <var class="Arg">gens</var>, <var class="Arg">acts</var>][, <var class="Arg">act</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">‣ Orbits</code>( <var class="Arg">G</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">‣ Orbits</code>( <var class="Arg">xset</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>returns a duplicate-free list of the orbits of the elements in <var class="Arg">seeds</var> under the action <var class="Arg">act</var> of <var class="Arg">G</var> or under <code class="func">OnPoints</code> (<a href="chap41.html#X7FE417DD837987B4"><span class="RefLink">41.2-1</span></a>) if no action function is given.</p>

<p>For a permutation group <var class="Arg">G</var>, one may also invoke this as <code class="code">Orbits(<var class="Arg">G</var>)</code>, which returns all the orbits of its natural action on the set of points moved by it. For example the group <span class="SimpleMath">⟨ (1,2,3), (4,5) ⟩</span> has the orbits <span class="SimpleMath">{1,2,3}</span> and <span class="SimpleMath">{4,5}</span>.</p>

<p>(Note that the arrangement of orbits or of points within one orbit is not defined by the operation.)</p>

<p><a id="X86BC8B958123F953" name="X86BC8B958123F953"></a></p>

<h5>41.4-3 <span class="Heading">OrbitsDomain</span></h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OrbitsDomain</code>( <var class="Arg">G</var>, <var class="Arg">Omega</var>[, <var class="Arg">gens</var>, <var class="Arg">acts</var>][, <var class="Arg">act</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">‣ OrbitsDomain</code>( <var class="Arg">G</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">‣ OrbitsDomain</code>( <var class="Arg">xset</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>returns a list of the orbits of <var class="Arg">G</var> on the domain <var class="Arg">Omega</var> (given as lists) under the action <var class="Arg">act</var> or under <code class="func">OnPoints</code> (<a href="chap41.html#X7FE417DD837987B4"><span class="RefLink">41.2-1</span></a>) if no action function is given.</p>

<p>This operation is often faster than <code class="func">Orbits</code> (<a href="chap41.html#X86BCAE17869BBEAA"><span class="RefLink">41.4-2</span></a>). The domain <var class="Arg">Omega</var> must be closed under the action of <var class="Arg">G</var>, otherwise an error can occur.</p>

<p>For a permutation group <var class="Arg">G</var>, one may also invoke this as <code class="code">OrbitsDomain(<var class="Arg">G</var>)</code>, which returns all the orbits of its natural action on the set of points moved by it.</p>

<p>(Note that the arrangement of orbits or of points within one orbit is not defined by the operation.)</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">g:=Group((1,3,2),(2,4,3));;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Orbits(g,[1..5]);</span>
[ [ 1, 3, 2, 4 ], [ 5 ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">OrbitsDomain(g,Arrangements([1..4],3),OnTuples);</span>
[ [ [ 1, 2, 3 ], [ 3, 1, 2 ], [ 1, 4, 2 ], [ 2, 3, 1 ], [ 2, 1, 4 ],
      [ 3, 4, 1 ], [ 1, 3, 4 ], [ 4, 2, 1 ], [ 4, 1, 3 ],
      [ 2, 4, 3 ], [ 3, 2, 4 ], [ 4, 3, 2 ] ],
  [ [ 1, 2, 4 ], [ 3, 1, 4 ], [ 1, 4, 3 ], [ 2, 3, 4 ], [ 2, 1, 3 ],
      [ 3, 4, 2 ], [ 1, 3, 2 ], [ 4, 2, 3 ], [ 4, 1, 2 ],
      [ 2, 4, 1 ], [ 3, 2, 1 ], [ 4, 3, 1 ] ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">OrbitsDomain(g,GF(2)^2,[(1,2,3),(1,4)(2,3)],</span>
<span class="GAPprompt">></span> <span class="GAPinput">[[[Z(2)^0,Z(2)^0],[Z(2)^0,0*Z(2)]],[[Z(2)^0,0*Z(2)],[0*Z(2),Z(2)^0]]]);</span>
[ [ <an immutable GF2 vector of length 2> ],
  [ <an immutable GF2 vector of length 2>,
      <an immutable GF2 vector of length 2>,
      <an immutable GF2 vector of length 2> ] ]
</pre></div>

<p>(See Section <a href="chap41.html#X81B8F9CD868CD953"><span class="RefLink">41.2</span></a> for information about specific actions.)</p>

<p><a id="X799910CF832EDC45" name="X799910CF832EDC45"></a></p>

<h5>41.4-4 OrbitLength</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OrbitLength</code>( <var class="Arg">G</var>[, <var class="Arg">Omega</var>], <var class="Arg">pnt</var>[, <var class="Arg">gens</var>, <var class="Arg">acts</var>][, <var class="Arg">act</var>] )</td><td class="tdright">( operation )</td></tr></table></div>
<p>computes the length of the orbit of <var class="Arg">pnt</var> under the action function <var class="Arg">act</var> or <code class="func">OnPoints</code> (<a href="chap41.html#X7FE417DD837987B4"><span class="RefLink">41.2-1</span></a>) if no action function is given.</p>

<p><a id="X8032F73078DF2DDB" name="X8032F73078DF2DDB"></a></p>

<h5>41.4-5 <span class="Heading">OrbitLengths</span></h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OrbitLengths</code>( <var class="Arg">G</var>, <var class="Arg">seeds</var>[, <var class="Arg">gens</var>, <var class="Arg">acts</var>][, <var class="Arg">act</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">‣ OrbitLengths</code>( <var class="Arg">G</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">‣ OrbitLengths</code>( <var class="Arg">xset</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>computes the lengths of all the orbits of the elements in <var class="Arg">seeds</var> under the action <var class="Arg">act</var> of <var class="Arg">G</var>.</p>

<p>For a permutation group <var class="Arg">G</var>, one may also invoke this as <code class="code">OrbitLengths(<var class="Arg">G</var>)</code>, which returns the lengths of all the orbits of its natural action on the set of points moved by it. For example the group <span class="SimpleMath">⟨ (1,2,3), (5,6) ⟩</span> has the orbit lengths 2 and 3.</p>

<p><a id="X8520E2487F7E98AF" name="X8520E2487F7E98AF"></a></p>

<h5>41.4-6 <span class="Heading">OrbitLengthsDomain</span></h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OrbitLengthsDomain</code>( <var class="Arg">G</var>, <var class="Arg">Omega</var>[, <var class="Arg">gens</var>, <var class="Arg">acts</var>][, <var class="Arg">act</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">‣ OrbitLengthsDomain</code>( <var class="Arg">G</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">‣ OrbitLengthsDomain</code>( <var class="Arg">xset</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>computes the lengths of all the orbits of <var class="Arg">G</var> on <var class="Arg">Omega</var>.</p>

<p>This operation is often faster than <code class="func">OrbitLengths</code> (<a href="chap41.html#X8032F73078DF2DDB"><span class="RefLink">41.4-5</span></a>). The domain <var class="Arg">Omega</var> must be closed under the action of <var class="Arg">G</var>, otherwise an error can occur.</p>

<p>For a permutation group <var class="Arg">G</var>, one may also invoke this as <code class="code">OrbitLengthsDomain(<var class="Arg">G</var>)</code>, which returns the length of all the orbits of its natural action on the set of points moved by it.</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">g:=Group((1,3,2),(2,4,3));;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">OrbitLength(g,[1,2,3,4],OnTuples);</span>
12
<span class="GAPprompt">gap></span> <span class="GAPinput">OrbitLengths(g,Arrangements([1..4],4),OnTuples);</span>
[ 12, 12 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">g:=Group((1,2,3),(5,6,7));;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">OrbitLengthsDomain(g,[1,2,3]);</span>
[ 3 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">OrbitLengthsDomain(g);</span>
[ 3, 3 ]
</pre></div>

<p><a id="X797BD60E7ACEF1B1" name="X797BD60E7ACEF1B1"></a></p>

<h4>41.5 <span class="Heading">Stabilizers</span></h4>

<p>The <em>stabilizer</em> of a point <span class="SimpleMath">x</span> under the action of a group <span class="SimpleMath">G</span> is the set of all those elements in <span class="SimpleMath">G</spanwhich fix <span class="SimpleMath">x</span>.</p>

<p><a id="X7C34EC437EF598BF" name="X7C34EC437EF598BF"></a></p>

<h5>41.5-1 OrbitStabilizer</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OrbitStabilizer</code>( <var class="Arg">G</var>[, <var class="Arg">Omega</var>], <var class="Arg">pnt</var>[, <var class="Arg">gens</var>, <var class="Arg">acts</var>][, <var class="Arg">act</var>] )</td><td class="tdright">( operation )</td></tr></table></div>
<p>computes the orbit and the stabilizer of <var class="Arg">pnt</var> simultaneously in a single orbit-stabilizer algorithm.</p>

<p>The stabilizer will have <var class="Arg">G</var> as its parent.</p>

<p><a id="X86FB962786397E02" name="X86FB962786397E02"></a></p>

<h5>41.5-2 Stabilizer</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ Stabilizer</code>( <var class="Arg">G</var>[, <var class="Arg">Omega</var>], <var class="Arg">pnt</var>[, <var class="Arg">gens</var>, <var class="Arg">acts</var>][, <var class="Arg">act</var>] )</td><td class="tdright">( function )</td></tr></table></div>
<p>computes the stabilizer in <var class="Arg">G</var> of the point <var class="Arg">pnt</var>, that is the subgroup of those elements of <var class="Arg">G</var> that fix <var class="Arg">pnt</var>. The stabilizer will have <var class="Arg">G</var> as its parent.</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">g:=Group((1,3,2),(2,4,3));;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">stab:=Stabilizer(g,4);</span>
Group([ (1,3,2) ])
<span class="GAPprompt">gap></span> <span class="GAPinput">Parent(stab);</span>
Group([ (1,3,2), (2,4,3) ])
</pre></div>

<p>The stabilizer of a set or tuple of points can be computed by specifying an action of sets or tuples of points.</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">Stabilizer(g,[1,2],OnSets);</span>
Group([ (1,2)(3,4) ])
<span class="GAPprompt">gap></span> <span class="GAPinput">Stabilizer(g,[1,2],OnTuples);</span>
Group(())
<span class="GAPprompt">gap></span> <span class="GAPinput">orbstab:=OrbitStabilizer(g,[1,2],OnSets);</span>
rec(
  orbit := [ [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 2, 3 ], [ 3, 4 ],
      [ 2, 4 ] ], stabilizer := Group([ (1,2)(3,4) ]) )
<span class="GAPprompt">gap></span> <span class="GAPinput">Parent(orbstab.stabilizer);</span>
Group([ (1,3,2), (2,4,3) ])
</pre></div>

<p>(See Section <a href="chap41.html#X81B8F9CD868CD953"><span class="RefLink">41.2</span></a> for information about specific actions.)</p>

<p>The standard methods for all these actions are an orbit-stabilizer algorithm. For permutation groups backtrack algorithms are used. For solvable groups an orbit-stabilizer algorithm for solvable groups, which uses the fact that the orbits of a normal subgroup form a block system (see <a href="chapBib.html#biBSOGOS">[LNS84]</a>) is used.</p>

<p><a id="X78C3A8568414BC44" name="X78C3A8568414BC44"></a></p>

<h5>41.5-3 OrbitStabilizerAlgorithm</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ OrbitStabilizerAlgorithm</code>( <var class="Arg">G</var>, <var class="Arg">Omega</var>, <var class="Arg">blist</var>, <var class="Arg">gens</var>, <var class="Arg">acts</var>, <var class="Arg">pntact</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>This operation should not be called by a user. It is documented however for purposes to extend or maintain the group actions package (the word <q>package</q> here refers to the <strong class="pkg">GAP</strong> functionality for group actions, not to a <strong class="pkg">GAP</strong> package).</p>

<p><code class="func">OrbitStabilizerAlgorithm</code> performs an orbit stabilizer algorithm for the group <var class="Arg">G</var> acting with the generators <var class="Arg">gens</var> via the generator images <var class="Arg">gens</var> and the group action <var class="Arg">act</var> on the element <var class="Arg">pnt</var>. (For technical reasons <var class="Arg">pnt</var> and <var class="Arg">act</var> are put in one record with components <code class="code">pnt</code> and <code class="code">act</code> respectively.)</p>

<p>The <var class="Arg">pntact</var> record may carry a component <var class="Arg">stabsub</var>. If given, this must be a subgroup stabilizing <em>all</em> points in the domain and can be used to abbreviate stabilizer calculations.</p>

<p>The <var class="Arg">pntact</var> component also may contain the boolean entry <code class="code">onlystab</code> set to <code class="keyw">true</code>. In this case the <code class="code">orbit</code> component may be omitted from the result.</p>

<p>The argument <var class="Arg">Omega</var> (which may be replaced by <code class="keyw">false</code> to be ignored) is the set within which the orbit is computed (once the orbit is the full domain, the orbit calculation may stop). If <var class="Arg">blist</var> is given it must be a bit list corresponding to <var class="Arg">Omega</var> in which elements which have been found already will be <q>ticked off</q> with <code class="keyw">true</code>. (In particular, the entries for the orbit of <var class="Arg">pnt</var> still must be all set to <code class="keyw">false</code>). Again the remaining action domain (the bits set initially to <code class="keyw">false</code>) can be used to stop if the orbit cannot grow any longer. Another use of the bit list is if <var class="Arg">Omega</var> is an enumerator which can determine <code class="func">PositionCanonical</code> (<a href="chap21.html#X7B4B10AE81602D4E"><span class="RefLink">21.16-3</span></a>) values very quickly. In this situation it can be worth to search images not in the orbit found so far, but via their position in <var class="Arg">Omega</var> and use a the bit list to keep track whether the element is in the orbit found so far.</p>

<p><a id="X7A9389097BAF670D" name="X7A9389097BAF670D"></a></p>

<h4>41.6 <span class="Heading">Elements with Prescribed Images</span></h4>

<p><a id="X857DC7B085EB0539" name="X857DC7B085EB0539"></a></p>

<h5>41.6-1 RepresentativeAction</h5>

<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ RepresentativeAction</code>( <var class="Arg">G</var>[, <var class="Arg">Omega</var>], <var class="Arg">d</var>, <var class="Arg">e</var>[, <var class="Arg">gens</var>, <var class="Arg">acts</var>][, <var class="Arg">act</var>] )</td><td class="tdright">( function )</td></tr></table></div>
<p>computes an element of <var class="Arg">G</var> that maps <var class="Arg">d</var> to <var class="Arg">e</var> under the given action and returns <code class="keyw">fail</code> if no such element exists.</p>


<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">g:=Group((1,3,2),(2,4,3));;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">RepresentativeAction(g,1,3);</span>
(1,3)(2,4)
<span class="GAPprompt">gap></span> <span class="GAPinput">RepresentativeAction(g,1,3,OnPoints);</span>
(1,3)(2,4)
<span class="GAPprompt">gap></span> <span class="GAPinput">RepresentativeAction(g,(1,2,3),(2,4,3));</span>
(1,2,4)
<span class="GAPprompt">gap></span> <span class="GAPinput">RepresentativeAction(g,(1,2,3),(2,3,4));</span>
fail
<span class="GAPprompt">gap></span> <span class="GAPinput">RepresentativeAction(g,Group((1,2,3)),Group((2,3,4)));</span>
(1,2,4)
<span class="GAPprompt">gap></span> <span class="GAPinput"> RepresentativeAction(g,[1,2,3],[1,2,4],OnSets);</span>
(2,4,3)
<span class="GAPprompt">gap></span> <span class="GAPinput"> RepresentativeAction(g,[1,2,3],[1,2,4],OnTuples);</span>
fail
</pre></div>

<p>(See Section <a href="chap41.html#X81B8F9CD868CD953"><span class="RefLink">41.2</span></a> for information about specific actions.)</p>

<p>Again the standard method for <code class="func">RepresentativeAction</code> is an orbit-stabilizer algorithm, for permutation groups and standard actions a backtrack algorithm is used.</p>

<p><a id="X87F73CCA7921DE65" name="X87F73CCA7921DE65"></a></p>

<h4>41.7 <span class="Heading">The Permutation Image of an Action</span></h4>

--> --------------------

--> maximum size reached

--> --------------------

100%


¤ Dauer der Verarbeitung: 0.27 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge