<buttonid="sidebar-toggle"class="icon-button"type="button"title="Toggle Table of Contents"aria-label="Toggle Table of Contents"aria-controls="sidebar">
<inputtype="search"name="search"id="searchbar"name="searchbar"placeholder="Search this book ..."aria-controls="searchresults-outer"aria-describedby="searchresults-header">
<p>A permutation is a one-to-one and onto mapping of a set onto itself. A permutation can be
factored uniquely into a composition of cycles (up to ordering of cycles, and rotation of
each cycle).</p>
<p>We sometimes use <ahref="https://en.wikipedia.org/wiki/Permutation#Cycle_notation">cycle notation</a>
to write permutations. Let <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mopen">(</span><spanclass="mord mathnormal">a</span><spanclass="mspace"></span><spanclass="mord mathnormal">b</span><spanclass="mspace"></span><spanclass="mord mathnormal">c</span><spanclass="mclose">)</span></span></span></span> denote a cycle where <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">a</span></span></span></span> maps to <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.69444em;vertical-align:0em;"></span><spanclass="mord mathnormal">b</span></span></span></span>, <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.69444em;vertical-align:0em;"></span><spanclass="mord mathnormal">b</span></span></span></span> maps to
<spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">c</span></span></span></span>, and <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">c</span></span></span></span> maps to <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">a</span></span></span></span> (with the obvious generalisation to arbitrary-sized cycles).
Writing two or more cycles next to each other denotes a composition of the corresponding
permutations. For example, <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mopen">(</span><spanclass="mord mathnormal">a</span><spanclass="mspace"></span><spanclass="mord mathnormal">b</span><spanclass="mclose">)</span><spanclass="mspace"></span><spanclass="mopen">(</span><spanclass="mord mathnormal">c</span><spanclass="mspace"></span><spanclass="mord mathnormal">d</span><spanclass="mclose">)</span></span></span></span> denotes the permutation that maps <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">a</span></span></span></span> to <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.69444em;vertical-align:0em;"></span><spanclass="mord mathnormal">b</span></span></span></span>,
<spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.69444em;vertical-align:0em;"></span><spanclass="mord mathnormal">b</span></span></span></span> to <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">a</span></span></span></span>, <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">c</span></span></span></span> to <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.69444em;vertical-align:0em;"></span><spanclass="mord mathnormal">d</span></span></span></span>, and <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.69444em;vertical-align:0em;"></span><spanclass="mord mathnormal">d</span></span></span></span> to <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">c</span></span></span></span>.</p>
<h2><aclass="header"href="#constructing-the-permutation"id="constructing-the-permutation">Constructing the permutation</a></h2>
<p>From this we have the equality-constraint sets <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mopen">{</span><spanclass="mord mathnormal">a</span><spanclass="mpunct">,</span><spanclass="mspace"style="margin-right:0.16666666666666666em;"></span><spanclass="mord mathnormal">b</span><spanclass="mpunct">,</span><spanclass="mspace"style="margin-right:0.16666666666666666em;"></span><spanclass="mord mathnormal">c</span><spanclass="mclose">}</span></span></span></span> and <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mopen">{</span><spanclass="mord mathnormal">d</span><spanclass="mpunct">,</span><spanclass="mspace"style="margin-right:0.16666666666666666em;"></span><spanclass="mord mathnormal">e</span><spanclass="mclose">}</span></span></span></span>. We want to
<p>We need to keep track of the set of cycles, which is a
<ahref="https://en.wikipedia.org/wiki/Disjoint-set_data_structure">set of disjoint sets</a>.
Efficient data structures for this problem are known; for the sake of simplicity we choose
one that is not asymptotically optimal but is easy to implement.</p>
<p>We represent the current state as:</p>
<ul>
<li>an array <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.87381em;vertical-align:-0.19444em;"></span><spanclass="mord"><spanclass="mord mathsf">m</span><spanclass="mord mathsf">a</span><spanclass="mord mathsf">p</span><spanclass="mord mathsf">p</span><spanclass="mord mathsf">i</span><spanclass="mord mathsf">n</span><spanclass="mord mathsf"style="margin-right:0.01389em;">g</span></span></span></span></span> for the permutation itself;</li>
<li>an auxiliary array <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.44444em;vertical-align:0em;"></span><spanclass="mord"><spanclass="mord mathsf">a</span><spanclass="mord mathsf">u</span><spanclass="mord mathsf">x</span></span></span></span></span> that keeps track of a distinguished element of each
cycle;</li>
<li>another array <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.67937em;vertical-align:0em;"></span><spanclass="mord"><spanclass="mord mathsf">s</span><spanclass="mord mathsf">i</span><spanclass="mord mathsf">z</span><spanclass="mord mathsf">e</span><spanclass="mord mathsf">s</span></span></span></span></span> that keeps track of the size of each cycle.</li>
</ul>
<p>We have the invariant that for each element <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">x</span></span></span></span> in a given cycle <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.68333em;vertical-align:0em;"></span><spanclass="mord mathnormal"style="margin-right:0.07153em;">C</span></span></span></span>, <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mord"><spanclass="mord mathsf">a</span><spanclass="mord mathsf">u</span><spanclass="mord mathsf">x</span></span><spanclass="mopen">(</span><spanclass="mord mathnormal">x</span><spanclass="mclose">)</span></span></span></span>
points to the same element <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.5782em;vertical-align:-0.0391em;"></span><spanclass="mord mathnormal">c</span><spanclass="mspace"style="margin-right:0.2777777777777778em;"></span><spanclass="mrel">∈</span><spanclass="mspace"style="margin-right:0.2777777777777778em;"></span></span><spanclass="base"><spanclass="strut"style="height:0.68333em;vertical-align:0em;"></span><spanclass="mord mathnormal"style="margin-right:0.07153em;">C</span></span></span></span>. This allows us to quickly decide whether two given
elements <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">x</span></span></span></span> and <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.625em;vertical-align:-0.19444em;"></span><spanclass="mord mathnormal"style="margin-right:0.03588em;">y</span></span></span></span> are in the same cycle, by checking whether
size of the cycle containing <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">x</span></span></span></span>. (This is guaranteed only for
<spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mord"><spanclass="mord mathsf">s</span><spanclass="mord mathsf">i</span><spanclass="mord mathsf">z</span><spanclass="mord mathsf">e</span><spanclass="mord mathsf">s</span></span><spanclass="mopen">(</span><spanclass="mord"><spanclass="mord mathsf">a</span><spanclass="mord mathsf">u</span><spanclass="mord mathsf">x</span></span><spanclass="mopen">(</span><spanclass="mord mathnormal">x</span><spanclass="mclose">)</span><spanclass="mclose">)</span><spanclass="mclose">)</span></span></span></span>, not for <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mord"><spanclass="mord mathsf">s</span><spanclass="mord mathsf">i</span><spanclass="mord mathsf">z</span><spanclass="mord mathsf">e</span><spanclass="mord mathsf">s</span></span><spanclass="mopen">(</span><spanclass="mord mathnormal">x</span><spanclass="mclose">)</span></span></span></span>.)</p>
<p>The algorithm starts with a representation of the identity permutation:
for all <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">x</span></span></span></span>, we set <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mord"><spanclass="mord mathsf">m</span><spanclass="mord mathsf">a</span><spanclass="mord mathsf">p</span><spanclass="mord mathsf">p</span><spanclass="mord mathsf">i</span><spanclass="mord mathsf">n</span><spanclass="mord mathsf"style="margin-right:0.01389em;">g</span></span><spanclass="mopen">(</span><spanclass="mord mathnormal">x</span><spanclass="mclose">)</span><spanclass="mspace"style="margin-right:0.2777777777777778em;"></span><spanclass="mrel">=</span><spanclass="mspace"style="margin-right:0.2777777777777778em;"></span></span><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">x</span></span></span></span>, <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mord"><spanclass="mord mathsf">a</span><spanclass="mord mathsf">u</span><spanclass="mord mathsf">x</span></span><spanclass="mopen">(</span><spanclass="mord mathnormal">x</span><spanclass="mclose">)</span><spanclass="mspace"style="margin-right:0.2777777777777778em;"></span><spanclass="mrel">=</span><spanclass="mspace"style="margin-right:0.2777777777777778em;"></span></span><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">x</span></span></span></span>, and
<li>Check whether <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><spanclass="mord"><spanclass="mord mathit">l</span><spanclass="mord mathit">e</span><spanclass="mord mathit">f</span><spanclass="mord mathit">t</span></span></span></span></span> and <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><spanclass="mord"><spanclass="mord mathit">r</span><spanclass="mord mathit">i</span><spanclass="mord mathit">g</span><spanclass="mord mathit">h</span><spanclass="mord mathit">t</span></span></span></span></span> are already in the same cycle, i.e.
whether <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mord"><spanclass="mord mathsf">a</span><spanclass="mord mathsf">u</span><spanclass="mord mathsf">x</span></span><spanclass="mopen">(</span><spanclass="mord"><spanclass="mord mathit">l</span><spanclass="mord mathit">e</span><spanclass="mord mathit">f</span><spanclass="mord mathit">t</span></span><spanclass="mclose">)</span><spanclass="mspace"style="margin-right:0.2777777777777778em;"></span><spanclass="mrel">=</span><spanclass="mspace"style="margin-right:0.2777777777777778em;"></span></span><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mord"><spanclass="mord mathsf">a</span><spanclass="mord mathsf">u</span><spanclass="mord mathsf">x</span></span><spanclass="mopen">(</span><spanclass="mord"><spanclass="mord mathit">r</span><spanclass="mord mathit">i</span><spanclass="mord mathit">g</span><spanclass="mord mathit">h</span><spanclass="mord mathit">t</span></span><spanclass="mclose">)</span></span></span></span>. If so, there is
nothing to do.</li>
<li>Otherwise, <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><spanclass="mord"><spanclass="mord mathit">l</span><spanclass="mord mathit">e</span><spanclass="mord mathit">f</span><spanclass="mord mathit">t</span></span></span></span></span> and <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><spanclass="mord"><spanclass="mord mathit">r</span><spanclass="mord mathit">i</span><spanclass="mord mathit">g</span><spanclass="mord mathit">h</span><spanclass="mord mathit">t</span></span></span></span></span> belong to different cycles. Make
<spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><spanclass="mord"><spanclass="mord mathit">l</span><spanclass="mord mathit">e</span><spanclass="mord mathit">f</span><spanclass="mord mathit">t</span></span></span></span></span> the larger cycle and <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><spanclass="mord"><spanclass="mord mathit">r</span><spanclass="mord mathit">i</span><spanclass="mord mathit">g</span><spanclass="mord mathit">h</span><spanclass="mord mathit">t</span></span></span></span></span> the smaller one, by swapping them
<li>Following the mapping around the right (smaller) cycle, for each element <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.43056em;vertical-align:0em;"></span><spanclass="mord mathnormal">x</span></span></span></span> set
<li>Splice the smaller cycle into the larger one by swapping <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mord"><spanclass="mord mathsf">m</span><spanclass="mord mathsf">a</span><spanclass="mord mathsf">p</span><spanclass="mord mathsf">p</span><spanclass="mord mathsf">i</span><spanclass="mord mathsf">n</span><spanclass="mord mathsf"style="margin-right:0.01389em;">g</span></span><spanclass="mopen">(</span><spanclass="mord"><spanclass="mord mathit">l</span><spanclass="mord mathit">e</span><spanclass="mord mathit">f</span><spanclass="mord mathit">t</span></span><spanclass="mclose">)</span></span></span></span>
<p>For example, given two disjoint cycles <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mopen">(</span><spanclass="mord mathnormal">A</span><spanclass="mspace"></span><spanclass="mord mathnormal"style="margin-right:0.05017em;">B</span><spanclass="mspace"></span><spanclass="mord mathnormal"style="margin-right:0.07153em;">C</span><spanclass="mspace"></span><spanclass="mord mathnormal"style="margin-right:0.02778em;">D</span><spanclass="mclose">)</span></span></span></span> and <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mopen">(</span><spanclass="mord mathnormal"style="margin-right:0.05764em;">E</span><spanclass="mspace"></span><spanclass="mord mathnormal"style="margin-right:0.13889em;">F</span><spanclass="mspace"></span><spanclass="mord mathnormal">G</span><spanclass="mspace"></span><spanclass="mord mathnormal"style="margin-right:0.08125em;">H</span><spanclass="mclose">)</span></span></span></span>:</p>
<pre><codeclass="language-plaintext">A +---> B
^ +
| |
+ v
D <---+ C E +---> F
^ +
| |
+ v
H <---+ G
</code></pre>
<p>After adding constraint <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.68333em;vertical-align:0em;"></span><spanclass="mord mathnormal"style="margin-right:0.05017em;">B</span><spanclass="mspace"style="margin-right:0.2777777777777778em;"></span><spanclass="mrel">≡</span><spanclass="mspace"style="margin-right:0.2777777777777778em;"></span></span><spanclass="base"><spanclass="strut"style="height:0.68333em;vertical-align:0em;"></span><spanclass="mord mathnormal"style="margin-right:0.05764em;">E</span></span></span></span> the above algorithm produces the cycle:</p>
<pre><codeclass="language-plaintext">A +---> B +-------------+
<p>If we did not check whether <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><spanclass="mord"><spanclass="mord mathit">l</span><spanclass="mord mathit">e</span><spanclass="mord mathit">f</span><spanclass="mord mathit">t</span></span></span></span></span> and <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><spanclass="mord"><spanclass="mord mathit">r</span><spanclass="mord mathit">i</span><spanclass="mord mathit">g</span><spanclass="mord mathit">h</span><spanclass="mord mathit">t</span></span></span></span></span> were already in the same
cycle, then we could end up undoing an equality constraint. For example, if we have the
<p>and we tried to implement adding an equality constraint just using step 4 of the above
algorithm, then we would end up constructing the cycle <spanclass="katex"><spanclass="katex-html"aria-hidden="true"><spanclass="base"><spanclass="strut"style="height:1em;vertical-align:-0.25em;"></span><spanclass="mopen">(</span><spanclass="mord mathnormal">a</span><spanclass="mspace"></span><spanclass="mord mathnormal">b</span><spanclass="mclose">)</span><spanclass="mspace"></span><spanclass="mopen">(</span><spanclass="mord mathnormal">c</span><spanclass="mspace"></span><spanclass="mord mathnormal">d</span><spanclass="mclose">)</span></span></span></span>, rather than the