<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="../feed.xsl" type="text/xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">

<channel>
<title>Susam's Notes</title>
<link>https://susam.net/tag/notes.html</link>
<atom:link rel="self" type="application/rss+xml" href="https://susam.net/tag/notes.xml"/>
<description>Feed for Susam's Notes Pages</description>

<item>
<title>Mar '26 Notes</title>
<link>https://susam.net/26c.html</link>
<guid isPermaLink="false">mtsnt</guid>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<description>
<![CDATA[
<p>
  This is my third set of <a href="tag/notes.html">monthly notes</a>
  for this year.  In these notes, I capture various interesting facts
  and ideas I have stumbled upon during the month.  Like in the last
  two months, I have been learning and exploring algebraic graph
  theory.  The two main books I have been reading are <em>Algebraic
  Graph Theory</em> by Godsil and Royle and <em>Algebraic Graph
  Theory</em>, 2nd ed. by Norman Biggs.  Much of what appears here
  comes from my study of these books as well as my own explorations
  and attempts to distill the ideas.  This post is quite heavy on
  mathematics but there are some non-mathematical, computing-related
  notes towards the end.
</p>
<p>
  The level of exposition is quite uneven throughout these notes.
  After all, they aren't meant to be a polished exposition but rather
  notes I take for myself.  In some places I build concepts from first
  principles, while in others I gloss over details and focus only on
  the main results.
</p>
<p>
  Sometime during the second half of the month, I also
  developed an open-source tool called
  <a href="https://codeberg.org/susam/wander">Wander Console</a> on a
  whim.  It lets anyone with a website host a decentralised web
  console that recommends interesting websites from the 'small web' of
  independent, personal websites.  Check my console
  here: <a href="wander/">wander/</a>.
</p>
<p>
  Although the initial version was ready after just about 1.5 hours of
  development during a break I was taking from studying algebraic
  graph theory, the
  subsequent <a href="https://news.ycombinator.com/item?id=47422759">warm
  reception on Hacker News</a> and a
  <a href="https://codeberg.org/susam/wander/issues/1">growing
  community</a> around it, along with the resulting feature requests
  and bug fixes, ended up taking more time than I had anticipated, at
  the expense of my algebraic graph theory studies.  With a full-time
  job, it becomes difficult to find time for both open source
  development and mathematical studies.  But eventually, I managed to
  return to my studies while making Wander Console improvements only
  occasionally during breaks from my studies.
</p>
<h2 id="contents">Contents<a href="#contents"></a></h2>
<ol>
  <li><a href="#group-theory">Group Theory</a>
    <ol type="a">
      <li><a href="#permutation">Permutation</a></li>
      <li><a href="#group-homomorphism">Group Homomorphism</a></li>
      <li><a href="#group-homomorphism-preserves-identities">Group Homomorphism Preserves Identity</a></li>
      <li><a href="#group-homomorphism-preserves-inverses">Group Homomorphism Preserves Inverses</a></li>
      <li><a href="#image-of-a-group-homomorphism">Image of a Group Homomorphism</a></li>
      <li><a href="#group-monomorphism">Group Monomorphism</a>
        <ol type="i">
          <li><a href="#standard-proof">Standard Proof</a></li>
          <li><a href="#alternate-arrangement">Alternate Proof</a></li>
        </ol>
      </li>
      <li><a href="#permutation-representation">Permutation Representation</a></li>
      <li><a href="#group-action">Group Action</a>
        <ol type="i">
          <li><a href="#why-right-action">Why Right Action?</a></li>
          <li><a href="#group-action-example-1">Example 1</a></li>
          <li><a href="#group-action-example-2">Example 2</a></li>
        </ol>
      </li>
      <li><a href="#group-actions-induce-permutations">Group Actions Induce Permutations</a></li>
      <li><a href="#group-actions-determine-permutation-representations">Group Actions Determine Permutation Representations</a></li>
      <li><a href="#permutation-representations-determine-group-actions">Permutation Representations Determine Group Actions</a></li>
      <li><a href="#bijection-between-group-actions-and-permutation-representations">Bijection Between Group Actions and Permutation Representations</a></li>
      <li><a href="#orbits">Orbits</a></li>
      <li><a href="#stabilisers">Stabilisers</a></li>
      <li><a href="#orbit-stabiliser-theorem">Orbit-Stabiliser Theorem</a></li>
      <li><a href="#faithful-actions">Faithful Actions</a></li>
      <li><a href="#semiregular-actions">Semiregular Actions</a></li>
      <li><a href="#transitive-actions">Transitive Actions</a></li>
      <li><a href="#conjugacy">Conjugacy</a>
        <ol type="i">
          <li><a href="#conjugation-as-group-action">Conjugation as Group Action</a></li>
          <li><a href="#right-conjugation-vs-left-conjugation">Right Conjugation vs Left Conjugation</a></li>
        </ol>
      </li>
      <li><a href="#conjugate-groups">Conjugate Subgroups</a></li>
      <li><a href="#conjugacy-of-stabilisers">Conjugacy of Stabilisers</a></li>
    </ol>
  </li>
  <li><a href="#algeraic-graph-theory">Algebraic Graph Theory</a>
    <ol type="a">
      <li><a href="#stabiliser-index">Stabiliser Index</a></li>
      <li><a href="#strongly-connected-directed-graph">Strongly Connected Directed Graph</a></li>
      <li><a href="#shunting">Shunting</a></li>
      <li><a href="#automorphisms-preserve-successor-relation">Automorphisms Preserve Successor Relation</a></li>
      <li><a href="#test-of-s-arc-transitivity">Test of \( s \)-arc Transitivity</a></li>
      <li><a href="#moore-graphs">Moore Graphs</a></li>
      <li><a href="#generalised-polygons">Generalised Polygons</a></li>
    </ol>
  </li>
  <li><a href="#computing">Computing</a>
    <ol type="a">
      <li><a href="#select-between-lines-inclusive">Select Between Lines, Inclusive</a></li>
      <li><a href="#select-between-lines-exclusive">Select Between Lines, Exclusive</a></li>
      <li><a href="#signing-and-verification-with-ssh-key">Signing and Verification with SSH Key</a></li>
      <li><a href="#block-ip-address-with-nftables">Block IP Address with nftables</a></li>
      <li><a href="#debian-logrotate-setup">Debian Logrotate Setup</a></li>
    </ol>
  </li>
</ol>
<h2 id="group-theory">Group Theory<a href="#group-theory"></a></h2>
<h3 id="permutation">Permutation<a href="#permutation"></a></h3>
<p>
  A <em>permutation</em> of a set \( X \) is a bijection \( X \to X
 .  \)
</p>
<p>
  For example, take \( X = \{ 1, 2, 3, 4, 5, 6 \} \) and define the
  map

  \[
    \pi : X \to X; \; x \mapsto 1 + ((x + 1) \bmod 6).
  \]

  This maps

  \begin{align*}
    1 &amp;\mapsto 3, \\
    2 &amp;\mapsto 4, \\
    3 &amp;\mapsto 5, \\
    4 &amp;\mapsto 6, \\
    5 &amp;\mapsto 1, \\
    6 &amp;\mapsto 2.
  \end{align*}
</p>
<p>
  We can describe permutations more succinctly using cycle notation.
  The cycle notation of a permutation \( \pi \) consists of one or
  more sequences written next to each other such that the sequences
  are pairwise disjoint and \( \alpha \) maps each element in a
  sequence to the next element on its right.  If the sequence is
  finite, then \( \alpha \) maps the final element back to the first
  one.  Any element that does not appear in any sequence is mapped to
  itself.  For example the cycle notation for the above permutation is
  \( (1 3 5)(2 4 6).  \)
</p>
<h3 id="group-homomorphism">Group Homomorphism<a href="#group-homomorphism"></a></h3>
<p>
  A map \( \phi : G \to H \) from a group \( (G, \ast) \) to a group
  \( (H, \cdot) \) is a <em>group homomorphism</em> if, for all \( x, y
  \in G, \)

  \[
    \phi(x \ast y) = \phi(x) \cdot \phi(y).
  \]

  We say that a group homomorphism is a map between groups that
  <em>preserves</em> the group operation.  In other words, a group
  homomorphism <em>sends</em> products in \( G \) to products in \( H
 .  \)  For example, consider the groups \( (\mathbb{Z}, +) \) and \(
  (\mathbb{Z}_3, +).  \)  Then the map

  \[
    \phi : \mathbb{Z} \to \mathbb{Z}_3; \; n \mapsto n \bmod 3
  \]

  is a group homomorphism because

  \[
    \phi(x + y)
    = (x + y) \bmod 3
    = (x \bmod 3) + (y \bmod 3)
    = \phi(x) + \phi(y)
  \]

   for all \( x, y \in \mathbb{Z}.  \)  As another example, consider
   the groups \( (\mathbb{R}_{\gt 0}, \times) \) and \( (\mathbb{R},
   +).  \)  Then the map

  \[
    \log : \mathbb{R}_{\gt 0} \to \mathbb{R}
  \]

  is a group homomorphism because

  \[
    \log(m \times n) = \log m + \log n.
  \]

  Note that a group homomorphism preserves the identity element.  For
  example, \( 1 \) is the identity element of \( (\mathbb{R}_{\gt 0},
  \times) \) and \( 0 \) is the identity element of \( (\mathbb{R}, +)
  \) and indeed \( \log 1 = 0.  \)  Also, a group homomorphism
  preserves inverses.  Indeed \( \log m^{-1} = -\log m \) for all \( m
  \in \mathbb{R}_{\gt 0}.  \)  These observations are proved in the
  next two sections.
</p>
<h3 id="group-homomorphism-preserves-identities">Group Homomorphism Preserves Identity<a href="#group-homomorphism-preserves-identities"></a></h3>
<p>
  Let \( \phi : G \to H \) be a group homomorphism from \( (G, \ast)
  \) to \( (H, \cdot).  \)  Let \( e_1 \) be the identity in \( G \)
  and let \( e_2 \) be the identity in \( H.  \)  Then \( \phi(e_1) =
  e_2.  \)


  The proof is straightforward.  Note first that

  \[
    \phi(e_1) \cdot \phi(e_1)
    = \phi(e_1 \ast e_1)
    = \phi(e_1)
  \]

  Multiplying both sides on the right by \( \phi(e_1)^{-1}, \) we get

  \[
    (\phi(e_1) \cdot \phi(e_1)) \cdot \phi(e_1)^{-1}
    = \phi(e_1) \cdot \phi(e_1)^{-1}.
  \]

  Using the associative and inverse properties of groups, we can
  simplify both sides to get

  \[
    \phi(e_1) = e_2.
  \]
</p>
<h3 id="group-homomorphism-preserves-inverses">Group Homomorphism Preserves Inverses<a href="#group-homomorphism-preserves-inverses"></a></h3>
<p>
  Let \( \phi : G \to H \) be a group homomorphism from \( (G, \ast)
  \) to \( (H, \cdot).  \)  Let \( e_1 \) be the identity in \( G \)
  and let \( e_2 \) be the identity in \( H.  \)  Then for all \( x \in
  G, \) \(\phi(x^{-1}) = (\phi(x))^{-1}.  \)

  The proof of this is straightforward too.  Note that

  \[
    \phi(x) \cdot \phi(x^{-1})
    = \phi(x \ast x^{-1})
    = \phi(e_1)
    = e_2.
  \]

  Thus \( \phi(x^{-1}) \) is an inverse of \( \phi(x), \) so

  \[
    \phi(x^{-1}) = (\phi(x))^{-1}.
  \]

  The image of the inverse of an element is the inverse of the image
  of that element.
</p>
<h3 id="image-of-a-group-homomorphism">Image of a Group Homomorphism<a href="#image-of-a-group-homomorphism"></a></h3>
<p>
  Let \( \phi : G \to H \) be a group homomorphism.  Then the image of
  the \( \phi, \) denoted

  \[
    \phi(G) = \{ \phi(x) : x \in G \}
  \]

  is a subgroup of \( H.  \)  We will prove this now.
</p>
<p>
  Let \( a, b \in \phi(G).  \)  Then \( a = \phi(x) \) and \( b =
  \phi(y) \) for some \( x, y \in G.  \)  Now \( ab = \phi(x)\phi(y) =
  \phi(xy) \in \phi(G).  \)  Therefore \( \phi(G) \) satisfies the
  closure property.
</p>
<p>
  Let \( e_1 \) and \( e_2 \) be the identities in \( G \) and \( H \)
  respectively.  Since a group homomorphism preserves the identity, \(
  \phi(e_1) = e_2.  \)  Hence the identity of \( H \) lies in \(
  \phi(G).  \)
</p>
<p>
  Finally, let \( a \in \phi(G).  \)  Then \( a = \phi(x) \) for some
  \( x \in G.  \)  Then \( a^{-1} = \phi(x)^{-1} = \phi(x^{-1}) \in
  \phi(G).  \)  Therefore \( \phi(G) \) satisfies the inverse property
  as well.  Therefore \( \phi(G) \) is a subgroup of \( H.  \)
</p>
<h3 id="group-monomorphism">Group Monomorphism<a href="#group-monomorphism"></a></h3>
<p>
  A map \( \phi : G \to H \) from a group \( (G, \ast) \) to a group
  \( (H, \cdot) \) is a <em>group monomorphism</em> if \( \phi \) is a
  homomorphism and is injective.  In other words, a homomorphism \(
  \phi \) is called a monomorphism if, for all \( x, y \in G, \)

  \[
  \phi(x) = \phi(y) \implies x = y.
  \]

  Let \( e_1 \) be the identity element of \( G \) and let \( e_2 \)
  be the identity element of \( H.  \)  A useful result in group theory
  states that a homomorphism \( \phi : G \to H \) is a monomorphism if
  and only if its kernel is trivial, i.e.

  \[
    \ker(\phi) = \{ x \in G : \phi(x) = e_2 \} = \{ e_1 \}.
  \]

  Let us prove this now.
</p>
<h4 id="standard-proof">Standard Proof<a href="#standard-proof"></a></h4>
<p>
  Suppose \( \phi : G \to H \) is a monomorphism.  Since a
  homomorphism preserves the identity element, we have \( \phi(e_1) =
  e_2.  \)  Therefore

  \[
    e_1 \in \ker(\phi).
  \]

  Let \( x \in \ker(\phi).  \)  Then \( \phi(x) = e_2 = \phi(e_1).  \)
  Since \( \phi \) is injective, \( x = e_1.  \)  Therefore

  \[
    \ker(\phi) = \{ e_1 \}.
  \]

  Conversely, suppose \( \ker(\phi) = \{ e_1 \}.  \)  Let \( x, y \in G
  \) such that \( \phi(x) = \phi(y).  \)  Then

  \[
    \phi(x \ast y^{-1})
    = \phi(x) \cdot \phi(y^{-1})
    = \phi(x) \cdot (\phi(y))^{-1}
    = \phi(y) \cdot (\phi(y))^{-1}
    = e_2.
  \]

  Hence

  \[
    x \ast y^{-1} \in \ker(\phi) = \{ e_1 \},
  \]

  so

  \[
    x \ast y^{-1} = e_1.
  \]

  Multiplying both sides on the right by \( y, \) we obtain

  \[
    x = y.
  \]

  This completes the proof.
</p>
<h4 id="alternate-arrangement">Alternate Proof<a href="#alternate-arrangement"></a></h4>
<p>
  Here I briefly discuss an alternate way to think about the above
  proof.  The above proof is how most texts usually present these
  arguments.  In particular, the proof of injectivity typically
  proceeds by showing that equal images imply equal preimages.  It's a
  standard proof technique.  When I think about these proofs, however,
  the contrapositive argument feels more intuitive to me.  I prefer to
  think about how unequal preimages must have unequal images.
  Mathematically, there is no difference at all but the contrapositive
  argument has always felt the most natural to me.  Let me briefly
  describe how this proof runs in my mind when I think about it more
  intuitively.
</p>
<p>
  Suppose \( \phi \) is a monomophorism.  Since a homomorphism
  preserves the identity element, clearly \( \phi(e_1) = e_2.  \)
  Since \( \phi \) is injective, it cannot map two distinct elements
  of \( G \) to \( e_2.  \)  Thus \( e_1 \) is the only element of \( G
  \) that \( \phi \) maps to \( e_2 \) which means \( \ker(\phi) = \{
  e_1 \}.  \)
</p>
<p>
  To prove the converse, suppose \( \ker(\phi) = \{ e_1 \}.  \)
  Consider distinct elements \( x, y \in G.  \)  Since \( x \ne y, \)
  we have \( x \ast y^{-1} \ne e_1.  \)  Therefore \( x \ast y^{-1}
  \notin \ker(\phi).  \)  Thus \( \phi(x \ast y^{-1}) \ne e_2.  \)
  Since \( \phi \) is a homomorphism,

  \[
    \phi(x \ast y^{-1})
    = \phi(x) \cdot \phi(y^{-1})
    = \phi(x) \cdot \phi(y)^{-1}.
  \]

  Therefore \( \phi(x) \cdot \phi(y)^{-1} \ne e_2 \) which implies

  \[
    \phi(x) \ne \phi(y).
  \]

  This proves that \( \ker(\phi) = \{ e_1 \} \) implies that \( \phi
  \) is injective and thus a monomorphism.
</p>
<h3 id="permutation-representation">Permutation Representation<a href="#permutation-representation"></a></h3>
<p>
  Let \( G \) be a group and \( X \) a set.  Then a homomorphism

  \[
    \phi : G \to \operatorname{Sym}(X)
  \]

  is called a <em>permutation representation</em> of \( G \) on \( X
 .  \)  The homomorphism \( \phi \) maps each \( g \in G \) to a
  permutation of \( X.  \)  We say that each \( g \in G \)
  <em>induces</em> a permutation of \( X.  \)
</p>
<p>
  For example, let \( G = (\mathbb{Z}_3, +) \) and \( X = \{ 0, 1, 2,
  3, 4, 5 \}.  \)  Define the map \( \phi : G \to \operatorname{Sym}(X)
  \) by

  \begin{align*}
    \phi(0) &amp;= (), \\
    \phi(1) &amp;= (024)(135), \\
    \phi(2) &amp;= (042)(153).
  \end{align*}

  It is easy to verify that this is a homomorphism.  Here is one way
  to verify it:

  \begin{align*}
    \phi(0)\phi(1) &amp;= ()(024)(135) = (024)(135) = \phi(0 + 1), \\
    \phi(0)\phi(2) &amp;= ()(042)(153) = (042)(153) = \phi(0 + 2), \\
    &amp;\;\,\vdots \\
    \phi(2)\phi(1) &amp;= (042)(153)(024)(135) = () = \phi(0) = \phi(2 + 1), \\
    \phi(2)\phi(2) &amp;= (042)(153)(042)(153) = (024)(135) = \phi(1) = \phi(2 + 2).
  \end{align*}

  We will meet this homomorphism again in the form of group action \(
  \alpha \) in the next section.
</p>
<h3 id="group-action">Group Action<a href="#group-action"></a></h3>
<p>
  Let \( G \) be a group with identity element \( e.  \)  Let \( X \)
  be a set.  A right action of \( G \) on \( X \) is a map

  \[
    \alpha : X \times G \to X
  \]

  such that

  \begin{align*}
    \alpha(x, e)            &amp;= x, \\
    \alpha(\alpha(x, g), h) &amp;= \alpha(x, gh)
  \end{align*}

  for all \( x \in X \) and all \( g, h \in G.  \)  The two conditions
  above are called the identity and compatibility properties of the
  group action respectively.  Note that in a right action, the product
  \( gh \) is applied left to right: \( g \) acts first and then \( h
  \) acts.  If we denote \( \alpha(x, g) \) as \( x^g, \) then the
  notation for the two conditions can be simplified to \( x^e = x \)
  and \( (x^g)^h = x^{gh} \) for all \( g, h \in G.  \)
</p>
<h4 id="why-right-action">Why Right Action?<a href="#why-right-action"></a></h4>
<p>
  We discuss right group actions here instead of left group actions
  because we want to use the notation \( \alpha(x, g) = x^g, \) which
  is quite convenient while studying permutations and graph
  automorphisms.  It is perfectly possible to use left group actions
  to study permutations as well.  However, we lose the benefit of the
  convenient \( x^g \) notation.  In a left group action, the
  compatibility property is \( \alpha(g, \alpha(h, x)) = \alpha(gh, x)
 , \) so if we were to use the notation \( \alpha(g, x) = x^g, \) the
  compatibility property would look like \( (x^h)^g = x^{gh}.  \)  This
  reverses the order of exponents which can be confusing.  Right group
  actions avoid this notational inconvenience.
</p>
<h4 id="group-action-example-1">Example 1<a href="#group-action-example-1"></a></h4>
<p>
  Let \( G = \mathbb{Z}_3 \) be the group under addition modulo \( 3
 .  \)  Let \( X = \{ 0, 1, 2, 3, 4, 5 \}.  \)  Define an action \(
  \alpha \) of \( G \) on \( X \) by

  \[
    \alpha(x, g) = x^g = (x + 2g) \bmod 6.
  \]

  Each \( g \in G \) acts as a permutation of \( X.  \)  For example,
  the element \( 0 \in \mathbb{Z}_3 \) acts as the identity
  permutation.  The element \( 1 \in \mathbb{Z}_3 \) acts as the
  permutation \( (0 2 4)(1 3 5).  \)  The element \( 2 \in \mathbb{Z}_3
  \) acts as the permutation \( (0 4 2)(1 5 3).  \)  The following
  table shows how each \( g \in G \) permutes \( X.  \)

  \[
    \begin{array}{c|ccc}
      x_{\downarrow} \backslash g_{\rightarrow} &amp; 0 &amp; 1 &amp; 2 \\
      \hline
      0 &amp; 0 &amp; 2 &amp; 4 \\
      1 &amp; 1 &amp; 3 &amp; 5 \\
      2 &amp; 2 &amp; 4 &amp; 0 \\
      3 &amp; 3 &amp; 5 &amp; 1 \\
      4 &amp; 4 &amp; 0 &amp; 2 \\
      5 &amp; 5 &amp; 1 &amp; 3 \\
    \end{array}
  \]

  From the table we see that each \( g \in G \) permutes the elements
  of \( \{ 0, 2, 4 \} \) among themselves.  Similarly, the elements of
  \( \{ 1, 3, 5 \} \) are permuted among themselves.  These sets \(
  \{0, 2, 4 \} \) and \( \{ 1, 3, 5 \} \) are called the
  <em>orbits</em> of the action.  The concept of orbits is formally
  introduced in its <a href="#orbits">own section further below</a>.
</p>
<h4 id="group-action-example-2">Example 2<a href="#group-action-example-2"></a></h4>
<p>
  Now let \( G = \mathbb{Z}_6 \) be the group under addition modulo \(
  6.  \)  Let \( X = \{ 0, 1, \dots, 8 \}.  \)  Define an action \(
  \beta \) of \( G \) on \( X \) by

  \[
    \beta(x, g) = x^g = (x + 3g) \bmod 9.
  \]

  Now the table for the action looks like this:

  \[
    \begin{array}{c|cccccc}
      x_{\downarrow} \backslash g_{\rightarrow} &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5 \\
      \hline
      0 &amp; 0 &amp; 3 &amp; 6 &amp; 0 &amp; 3 &amp; 6 \\
      1 &amp; 1 &amp; 4 &amp; 7 &amp; 1 &amp; 4 &amp; 7 \\
      2 &amp; 2 &amp; 5 &amp; 8 &amp; 2 &amp; 5 &amp; 8 \\
      3 &amp; 3 &amp; 6 &amp; 0 &amp; 3 &amp; 6 &amp; 0 \\
      4 &amp; 4 &amp; 7 &amp; 1 &amp; 4 &amp; 7 &amp; 1 \\
      5 &amp; 5 &amp; 8 &amp; 2 &amp; 5 &amp; 8 &amp; 2 \\
      6 &amp; 6 &amp; 0 &amp; 3 &amp; 6 &amp; 0 &amp; 3 \\
      7 &amp; 7 &amp; 1 &amp; 4 &amp; 7 &amp; 1 &amp; 4 \\
      8 &amp; 8 &amp; 2 &amp; 5 &amp; 8 &amp; 2 &amp; 5
    \end{array}
  \]

  This action splits \( X \) into three orbits \( \{ 0, 3, 6 \}, \) \(
  \{ 1, 4, 7 \} \) and \( \{ 2, 5, 8 \}.  \)
</p>
<h3 id="group-actions-induce-permutations">Group Actions Induce Permutations<a href="#group-actions-induce-permutations"></a></h3>
<p>
  Earlier, we saw an example of a group action and observed that each
  element of the group acts as a permutation.  That was not merely a
  coincidence.  It is indeed a general property of group actions.
  Whenever a group \( G \) acts on a set \( X, \) each element \( g
  \in G \) determines a bijection \( X \to X.  \)  In other words,
  every element of \( G \) acts as a permutation of \( X.  \)  Let us
  see why this must be the case.
</p>
<p>
  Consider the group action \( \alpha : X \times G \to X.  \)  Fix \( g
  \in G \) and let \( x \) vary over \( X \) to obtain the map

  \[
    \alpha_g : X \to X; \; x \mapsto \alpha(x, g).
  \]

  We show that \( \alpha_g \) is a bijection.  First we prove
  injectivity.  Let \( e \) be the identity element of \( G.  \)
  Let \( x, y \in X.  \)  Then

  \begin{align*}
    \alpha_g(x) = \alpha_g(y)
    &amp; \implies \alpha(x, g) = \alpha(y, g) \\
    &amp; \implies \alpha(\alpha(x, g), g^{-1}) = \alpha(\alpha(y, g), g^{-1}) \\
    &amp; \implies \alpha(x, gg^{-1}) = \alpha(y, gg^{-1}) \\
    &amp; \implies \alpha(x, e) = \alpha(y, e) \\
    &amp; \implies x = y.
  \end{align*}

  The \( x^g \) notation allows us to write the above proof more
  conveniently as follows:

  \begin{align*}
    \alpha_g(x) = \alpha_g(y)
    &amp; \implies \alpha(x, g) = \alpha(y, g) \\
    &amp; \implies (x^g)^{g^{-1}} = (y^g)^{g^{-1}} \\
    &amp; \implies x^{g g^{-1}} = y^{g g^{-1}} \\
    &amp; \implies x^e = y^e \\
    &amp; \implies x = y.
  \end{align*}

  This completes the proof of injectivity.  Now we prove surjectivity.
  Let \( y \in X.  \)  Take \( x = \alpha(y, g^{-1}).  \)  Then

  \[
    \alpha_g(x)
    = \alpha(x, g)
    = \alpha(\alpha(y, g^{-1}), g)
    = \alpha(y, g^{-1} g)
    = \alpha(y, e)
    = y.
  \]

  Again, if we write \( x = y^{g^{-1}}, \) the above step can be
  written more succinctly as

  \[
    \alpha_g(x) = x^g = (y^{g^{-1}})^g = y^{(g^{-1} g)} = y^e = y.
  \]

  Thus every element \( y \in X \) has a preimage in \( X \) under \(
  \alpha_g.  \)  Hence \( \alpha_g \) is surjective.  Since we have
  already shown that \( \alpha_g \) is injective, we now conclude that
  \( \alpha_g \) is bijective.  Therefore \( \alpha_g \) is a
  permutation of \( X.  \)  Stated symbolically,

  \[
    \alpha_g \in \operatorname{Sym}(X).
  \]

  Note that

  \[
    \alpha_g(x) = \alpha(x, g) = x^g.
  \]

  Thus both \( \alpha_g(x) \) and \( x^g \) serve as convenient
  shorthands for \( \alpha(x, g).  \)
</p>
<h3 id="group-actions-determine-permutation-representations">Group Actions Determine Permutation Representations<a href="#group-actions-determine-permutation-representations"></a></h3>
<p>
  We have seen that each group element \( g \in G \) induces (acts as)
  a permutation of \( X.  \)  Precisely speaking, each \( g \in G \)
  determines a permutation \( \alpha_g \) of \( X.  \)  Now define a
  map

  \[
    \phi: G \to \operatorname{Sym}(X); \; g \mapsto \alpha_g.
  \]

  We now show that this map is a homomorphism.  This means that we
  want to show that \( \phi(gh) = \phi(g) \phi(h).  \)  Since \(
  \phi(g), \phi(h) \in \operatorname{Sym}(X), \) the right-hand side
  is a product of permutations of \( X.  \)  We first define the
  product of two permutations \( \pi, \rho : X \to X \) by

  \[
    \pi \rho : X \to X; \; x \mapsto \rho(\pi(x)).
  \]

  In other words, \( \pi \rho = \rho \circ \pi.  \)  Now

  \begin{align*}
    \phi(gh)(x)
    &amp; = \alpha_{gh}(x) \\
    &amp; = \alpha(x, gh) \\
    &amp; = \alpha(\alpha(x, g), h) \\
    &amp; = \alpha_h(\alpha_g(x)) \\
    &amp; = (\alpha_h \circ \alpha_g)(x) \\
    &amp; = (\alpha_g \alpha_h)(x) \\
    &amp; = (\phi(g) \phi(h))(x).
  \end{align*}

  Since the above equality holds for all \( x \in X, \) we conclude
  that

  \[
    \phi(gh) = \phi(g) \phi(h).
  \]

  Hence \( \phi \) is a group homomorphism from \( G \) to \(
  \operatorname{Sym}(X).  \)  Therefore \( \phi \) is a permutation
  representation of \( G \) on \( X.  \)  It maps each group element \(
  g \in G \) to a permutation \( \alpha_g \in \operatorname{Sym}(X).  \)
</p>
<p>
  Note the multiple levels of abstraction here.  The group action \(
  \alpha : X \times G \to X \) determines a permutation representation
  \( \phi : G \to \operatorname{Sym}(X).  \)  Each element \( g \in G
  \) together with the group action \( \alpha \) determines a
  permutation \( \alpha_g : X \to X.  \)
</p>
<p>
  Also note that \( \phi(g)(x) = \alpha_g(x) = \alpha(g, x) = x^g.  \)
  In fact, \( \phi(g) = \alpha_g.  \)
</p>
<h3 id="permutation-representations-determine-group-actions">Permutation Representations Determine Group Actions<a href="#permutation-representations-determine-group-actions"></a></h3>
<p>
  Consider a permutation representation \( \phi : G \to
  \operatorname{Sym}(X).  \)  Define a map

  \[
    \alpha : X \times G \to X; \; (x, g) \mapsto \phi(g)(x).
  \]

  First we verify the identity property of group actions.  Since \(
  \phi \) is a homomorphism, it preserves the identity element.
  Therefore \( \phi(e) \) is the identity permutation.  Hence

  \[
    \alpha(x, e) = \phi(e)(x) = x
  \]

  Now we verify the compatibility property of the action.  For all \(
  g, h \in G \) and \( x \in X, \) we have

  \begin{align*}
    \alpha(\alpha(x, g), h)
    &amp; = \alpha(\phi(g)(x), h) \\
    &amp; = \phi(h)(\phi(g)(x)) \\
    &amp; = (\phi(h) \circ \phi(g))(x) \\
    &amp; = (\phi(g)\phi(h))(x) \\
    &amp; = \phi(gh)(x) \\
    &amp; = \alpha(x, gh).
  \end{align*}

  This completes the proof of the fact that every permutation
  representation determines a group action.
</p>
<h3 id="bijection-between-group-actions-and-permutation-representations">Bijection Between Group Actions and Permutation Representations<a href="#bijection-between-group-actions-and-permutation-representations"></a></h3>
<p>
  There is a bijection between the group actions \( \alpha : X \times
  G \to X \) and permutation representations \( \phi : G \to
  \operatorname{Sym}(X).  \)  We now show that these two constructions
  are inverses of each other.
</p>
<p>
  Given a right action \( \alpha : X \times G \to X, \) define

  \[
    \phi_{\alpha} : G \to \operatorname{Sym}(X)
    \quad \text{by} \quad
    \phi_{\alpha}(g)(x) = \alpha(x, g).
  \]

  Given a permutation representation \( \phi : G \to
  \operatorname{Sym}(X), \) define

  \[
    \alpha_{\phi} : X \times G \to X
    \quad \text{by} \quad
    \alpha_{\phi}(x, g) = \phi(g)(x).
  \]

  We now show that these two constructions undo each other.  Take an
  arbitrary group action \( \alpha : X \times G \to X \) and construct
  the corresponding permutation representation \( \phi_{\alpha}.  \)
  Then take this permutation representation and construct the group
  action \( \alpha_{\phi_{\alpha}}.  \)  But

  \[
    \alpha_{\phi_{\alpha}}(x, g)
    = \phi_{\alpha}(g)(x)
    = \alpha(x, g).
  \]

  Therefore \( \alpha_{\phi_{\alpha}} = \alpha.  \)  Similarly,
  starting with the permutation representation \( \phi, \) we get

  \[
    \phi_{\alpha_{\phi}}(g)(x)
    = \alpha_{\phi}(x, g)
    = \phi(g)(x).
  \]

  Therefore \( \phi_{\alpha_{\phi}} = \phi.  \)  Hence there is a
  bijection between group actions \( \alpha : X \times G \to X \) and
  permutation representations: \( \phi : G \to \operatorname{Sym}(X)
 .  \)  In fact, a group action and the corresponding permutation
  representation contain the same information, namely how the elements
  \( g \in G \) acts as permutations of \( X.  \)  For this reason,
  many advanced texts do not make any distinction between the group
  action and its permutation representation.  They often use them
  interchangeably even though technically they have different domains.
</p>
<h3 id="orbits">Orbits<a href="#orbits"></a></h3>
<p>
  Let \( G \) act on a set \( X.  \)  For an element \( x \in X, \) the
  <em>orbit</em> of \( x \) under the action of \( G \) is the set of
  all elements of \( X \) that can be reached from \( x \) by the
  action of elements of \( G.  \)  Symbolically, the orbit of \( x \)
  is the set

  \[
    x^G = \{ x^g : g \in G \}.
  \]

  In other words, the orbit of \( x \) contains every element of \( X
  \) that \( x \) can be moved to by the group action.  If \( y \in
  x^G, \) then there exists some \( g \in G \) such that \( y = x^g
 .  \)
</p>
<p>
  The orbits of a group action partition the set \( X.  \)  That is,
  every element of \( X \) lies in exactly one orbit and two orbits
  are either identical or disjoint.  Thus the group action decomposes
  the set \( X \) into disjoint subsets (the orbits), each consisting
  of elements that can be transformed into one another by the action
  of \( G.  \)
</p>
<h3 id="stabilisers">Stabilisers<a href="#stabilisers"></a></h3>
<p>
  Let \( G \) be a group acting on a set \( X.  \)  For an element
  \( x \in X, \) the <em>stabiliser</em> of \( x \) is the set

  \[
    G_x = \{ g \in G : x^g = x \}.
  \]

  The stabiliser \( G_x \) consists of all elements of \( G \) that
  fix the element \( x.  \)  The stabiliser \( G_x \) is a subgroup of
  \( G.  \)  Indeed, the identity element \( e \in G \) satisfies \(
  x^e = x, \) so \( e \in G_x.  \)  If \( g, h \in G_x, \) then \(
  x^{gh} = (x^g)^h = x.  \)  If \( g \in G_x, \) then \( x^{g^{-1}} =
  (x^g)^{g^{-1}} = x.  \)
</p>
<p>
  Intuitively, the stabiliser measures how much symmetry of the group
  action leaves the element \( x \) unchanged.  The larger the
  stabiliser, the more elements of \( G \) fix \( x.  \)
</p>
<h3 id="orbit-stabiliser-theorem">Orbit-Stabiliser Theorem<a href="#orbit-stabiliser-theorem"></a></h3>
<p>
  Let \( G \) be a group acting on a set \( X.  \)  The
  orbit-stabiliser theorem states that for any \( x \in X, \)

  \[
    \lvert G_x \rvert \cdot \lvert x^G \rvert = \lvert G \rvert.
  \]

  Stated differently, the index of the stabiliser \( G_x \) in the
  group \( G \) is given by

  \[
    [ G : G_x ]
    = \lvert G_x \backslash G \rvert
    = \lvert G \rvert / \lvert G_x \rvert
    = \lvert x^G \rvert.
  \]

  There is a bijection between the right cosets of \( G_x \) and the
  elements of \( x^G.  \)  Demonstrating this bijection proves the
  above equation.  We will work with right cosets of \( G_x.  \)
  Define

  \[
    \phi : G_x \backslash G \to x^G; \; G_x g \mapsto x^g.
  \]

  We want to show that \( \phi \) is a bijection.  But first we need
  to show that \( \phi \) is well defined.  A coset \( G_x g \in G_x
  \backslash G \) can also be written as

  \[
    G_x g = G_x h
  \]

  for some \( h \in G.  \)  If \( x^g \ne x^h, \) then \( \phi \) would
  not be well defined, since \( \phi \) must assign each coset in \(
  G_x \backslash G \) to exactly one element in the orbit \( x^G \) in
  order to be a function.  This can be shown using the following
  equivalences:

  \begin{align*}
    G_x g = G_x h
    &amp; \iff hg^{-1} \in G_x \\
    &amp; \iff x = x^{h g^{-1}} \\
    &amp; \iff x^g = x^h \\
  \end{align*}

  This proves two things at once.  The fact that

  \[
    G_x g = G_x h \implies x^g = x^h
  \]

  proves that when the same coset is written using two different
  representatives, the image does not change.  Therefore \( \phi \) is
  well defined.  Further

  \[
    x^g = x^h \implies G_x g = G_x h
  \]

  proves that \( \phi \) is injective.  To show that \( \phi \) is
  surjective, let \( y \in x^G.  \)  Then \( y = x^g \) for some \( g
  \in G.  \)  Since \( \phi(G_x g) = x^g, \) we get

  \[
    \phi(G_x g) = y.
  \]

  Thus every element of \( x^G \) is the image of some right coset \(
  G_x g \) under \( \phi.  \)  This completes the proof of a bijection
  between the right cosets of \( G_x \) and the elements of \( x^G.  \)
  Therefore \( \lvert G_x \backslash G \rvert = \lvert x^G \rvert \)
  and hence \( \lvert G \rvert / \lvert G_x \rvert = \lvert x^G \rvert
 , \) which establishes the orbit-stabiliser theorem.
</p>
<h3 id="faithful-actions">Faithful Actions<a href="#faithful-actions"></a></h3>
<p>
  Let \( G \) act on a set \( X.  \)  The action is called
  <em>faithful</em> if distinct elements of \( G \) induce distinct
  permutations of \( X.  \)  In other words, the only element of \( G
  \) that acts as the identity permutation of \( X \) is the identity
  element \( e \in G.  \)  Symbolically, the action is faithful if

  \[
    g \ne e \implies \exists x \in X, \; x^g \ne x.
  \]

  Equivalently,

  \[
    \forall x \in X, \; x^g = x \implies g = e.
  \]

  The action is faithful if the only element of \( G \) that fixes
  every element of \( X \) is the identity, i.e.

  \[
    \bigcap_{x \in X} G_x = \{ e \}.
  \]

  Recall that every group action determines a permutation
  representation \( \phi : G \to \operatorname{Sym}(X).  \)  From this
  point of view, the action is faithful precisely when the permutation
  representation is faithful, that is, when the homomorphism \( \phi
  \) is injective (or equivalently when \( \ker(\phi) = \{ e \} \)).
  In other words, the action is faithful if and only if the associated
  homomorphism \( \phi \) is a monomorphism.
</p>
<h3 id="semiregular-actions">Semiregular Actions<a href="#semiregular-actions"></a></h3>
<p>
  A group action of \( G \) on \( X \) is called <em>semiregular</em>
  if no non-identity element of \( G \) fixes any element of \( X.  \)
  In other words, whenever \( g \ne e, \) the permutation of \( X \)
  induced by \( g \) moves every element of \( X.  \)  Symbolically,

  \[
    g \ne e \implies \forall x \in X, \; x^g \ne x.
  \]

  Equivalently,

  \[
    \exists x \in X, \; x^g = x \implies g = e.
  \]

  The action is semiregular if

  \[
    \forall x \in X, \; G_x = \{ e \}.
  \]

  This is a stronger property than faithfulness.  Faithfulness only
  guarantees that when \( g \ne e, \) the element \( g \) moves at
  least one element of \( X.  \)  But semiregularity guarantees that
  when \( g \ne e, \) the element \( g \) moves every element of \( X
 .  \)  Therefore every semiregular action is faithful, but not every
  faithful action is semiregular.
</p>
<h3 id="transitive-actions">Transitive Actions<a href="#transitive-actions"></a></h3>
<p>
  Let \( G \) act on a set \( X.  \)  The action is called
  <em>transitive</em> if there is only one orbit.  In other words, the
  action is transitive if every element of \( X \) can be reached from
  any other element by the action of some element of \( G.  \)
  Symbolically, the action is transitive if

  \[
    \forall x, y \in X \; \exists g \in G, \; x^g = y.
  \]

  Equivalently, the action is transitive if

  \[
    x^G = X
  \]

  for some (and hence every) \( x \in X.  \)
</p>
<h3 id="conjugacy">Conjugacy<a href="#conjugacy"></a></h3>
<p>
  Let \( G \) be a group.  Let \( x, g \in G.  \)  The element

  \[
    g^{-1} x g
  \]

  is called a <em>conjugate</em> of \( x \) by \( g.  \)  Any element
  \( y \in G \) that can be written as \( g^{-1} x g \) for some \( g
  \in G \) is said to be a conjugate of \( x.  \)  The conjugacy class
  of \( x \) in \( G \) is the set

  \[
    x^G = \{ g^{-1} x g : g \in G \}.
  \]

  In other words, the conjugacy class of \( x \) is the set of all
  elements of \( G \) that are conjugate to \( x.  \)  At first,
  reusing the orbit notation \( x^G \) for the conjugacy class may
  seem like an abuse of notation.  However, we will see in the next
  section that the conjugacy class is precisely the orbit of \( x \)
  under the action of \( G \) on itself by conjugation.  Thus \( x^G
  \) is in fact a natural and accurate notation for the conjugacy
  class.
</p>
<h4 id="conjugation-as-group-action">Conjugation as Group Action<a href="#conjugation-as-group-action"></a></h4>
<p>
  Conjugation can be seen as an action of a group on itself.  Define
  the map

  \[
    \alpha : G \times G \to G; \; (x, g) \mapsto g^{-1} x g.
  \]

  Note that

  \[
    \alpha(x, e) = e^{-1} x e = x
  \]

  and

  \[
    \alpha(\alpha(x, g), h)
    = h^{-1} (g^{-1} x g) h
    = (gh)^{-1} x (gh)
    = \alpha(x, gh).
  \]

  Therefore \( \alpha \) satisfies the two defining properties of a
  right group action.  The conjugacy class \( x^G \) is precisely the
  orbit of \( x \) under the conjugation action.  Therefore the orbits
  of the conjugation action of \( G \) on itself are the conjugacy
  classes of \( G.  \)
</p>
<h4 id="right-conjugation-vs-left-conjugation">Right Conjugation vs Left Conjugation<a href="#right-conjugation-vs-left-conjugation"></a></h4>
<p>
  We observed above that the conjugation action is a right action of a
  group on itself.  Let \( x, g \in G \) and let

  \[
    y = g^{-1} x g.
  \]

  Now let \( h = g^{-1}.  \)  Then we can write the above equation as

  \[
    y = h x h^{-1}.
  \]

  According to the previous section, \( y \) is the conjugate of \( x
  \) by \( g.  \)  However, many texts call \( y \) the conjugate of \(
  x \) by \( h.  \)  Both are valid perspectives.  In both
  perspectives, \( x \) and \( y \) are conjugates of each other.
  Precisely,
</p>
<ul>
  <li>
    In the first perspective, we have \( y = g^{-1} x g \) and we say
    that \( y \) is a conjugate of \( x \) by \( g.  \)  A corollary is
    that \( x \) is a conjugate of \( y \) by \( g^{-1}.  \)
  </li>
  <li>
    In the second perspective, we have \( y = h x h^{-1} \) and we say
    that \( y \) is a conjugate of \( x \) by \( h.  \)  A corollary is
    that \( x \) is a conjugate of \( y \) by \( h^{-1}.  \)
  </li>
</ul>
<p>
  Although in both perspectives, \( x \) and \( y \) are conjugates of
  each other, the group element by which one is conjugated to the
  other is different.  This leads to different group actions as well.
</p>
<p>
  When we say that \( y = g^{-1} x g \) is a conjugate of \( x \) by
  \( g, \) the group action

  \[
    \alpha : G \times G \to G; \; (x, g) \mapsto g^{-1} x g.
  \]

  is a right group action as demonstrated in the previous section.
  But when we say that \( y = h x h^{-1} \) is a conjugate of \( x \)
  by \( h, \) the conjugation action is no longer a right group action
  because the compatibility property is violated:

  \[
    \alpha(\alpha(x, g), h)
    = h ( g x g^{-1} ) h^{-1}
    = (hg) x (hg)^{-1}
    = \alpha(x, hg).
  \]

  We get \( \alpha(x, hg) \) instead of the required \( \alpha(x, gh)
 .  \)  So with the second perspective, the group action is no longer a
  right action.  Instead it is a left action since

  \[
    \alpha(g, \alpha(h, x))
    = g (h x h^{-1}) g^{-1}
    = (gh) x (gh)^{-1}
    = \alpha(gh, x).
  \]

  In this post we will work only with the first perspective because we
  will use right actions throughout.
</p>
<h3 id="conjugate-groups">Conjugate Subgroups<a href="#conjugate-groups"></a></h3>
<p>
  Let \( G \) be a group.  Let \( H \le G.  \)  Define

  \[
    g^{-1} H g = \{ g^{-1} h g : h \in H \}.
  \]

  We say that \( g^{-1} H g \) is a conjugate of \( H \) by \( g.  \)
</p>
<h3 id="conjugacy-of-stabilisers">Conjugacy of Stabilisers<a href="#conjugacy-of-stabilisers"></a></h3>
<p>
  Let \( G \) be a group acting on a set \( X.  \)  Let \( x \in X \)
  and \( g \in G.  \)  Then

  \[
    g^{-1} G_x g = G_{x^g}.
  \]

  That is, \( G_{x^g} \) is a conjugate of \( G_x \) by \( g.  \)  This
  result can be summarised as follows: stabilisers of elements in the
  same orbit are conjugate.  Or more explicitly: the stabiliser of \(
  x^g \) is a conjugate of the stabiliser of \( x \) by \( g.  \)  The
  proof is straightforward.  Let \( h \in G.  \)  Then

  \begin{align*}
    h \in g^{-1} G_x g
    &amp; \iff g^{-1} (g h g^{-1}) g \in g^{-1} G_x g \\
    &amp; \iff g h g^{-1} \in G_x \\
    &amp; \iff x^{g h g^{-1}} = x \\
    &amp; \iff (x^g)^h = x^g \\
    &amp; \iff h \in G_{x^g}.
  \end{align*}

  Therefore \( g^{-1} G_x g = G_{x^g}.  \)
</p>
<h2 id="algeraic-graph-theory">Algebraic Graph Theory<a href="#algeraic-graph-theory"></a></h2>
<h3 id="stabiliser-index">Stabiliser Index<a href="#stabiliser-index"></a></h3>
<p>
  In a vertex-transitive graph \( \Gamma, \) for any \( x \in
  V(\Gamma) \) and all \( y \in V(\Gamma), \) there exists \( g \in G
  \) such that \( x^g = y.  \)  Therefore \( x^G = V(\Gamma).  \)  Thus
  by the <a href="#orbit-stabiliser-theorem">orbit-stabiliser
  theorem</a>,

  \[
    [ G : G_x ]
    = \lvert G_x \backslash G \rvert
    = \lvert x^G \rvert
    = \lvert V(\Gamma) \rvert.
  \]
</p>
<h3 id="strongly-connected-directed-graph">Strongly Connected Directed Graph<a href="#strongly-connected-directed-graph"></a></h3>
<p>
  A <em>path</em> in a directed graph \( \Gamma \) is a sequence of
  vertices \( v_0, \dots, v_r \) of distinct vertices such that \(
  (v_{i - 1}, v_i) \) is an arc of \( \Gamma \) for \( i = 1, \dots, r
 .  \)
</p>
<p>
  A directed graph is <em>strongly connected</em> if for every ordered
  pair of vertices \( (u, v) \) there is a path from \( u \) to \( v
 .  \)
</p>
<h3 id="shunting">Shunting<a href="#shunting"></a></h3>
<p>
  Let \( \alpha = ( \alpha_0, \dots, \alpha_s ) \) and \( \beta = (
  \beta_0, \dots, \beta_s ) \) be two \( s \)-arcs in a graph \(
  \Gamma.  \)  We say that \( \beta \) is a successor of \( \alpha \)
  if \( \beta_i = \alpha_{i + 1} \) for \( 0 \le i \le s - 1.  \)  We
  also say that \( \alpha \) can be <em>shunted</em> onto \( \beta.  \)
</p>
<p>
  In section 4.2 of Godsil and Royle, there is a rather technical
  setup which first defines \( X^{(s)} \) as the directed graph with
  the \( s \)-arcs of a graph \( X \) as its vertices such that \(
  (\alpha, \beta) \) is an arc of \( X^{(s)} \) if and only if \(
  \alpha \) can be shunted onto \( \beta \) in \( X.  \)  Then it goes
  on to show that if \( X \) is a connected graph with a minimum
  degree two and \( X \) is not a cycle, then \( X^{(s)} \) is
  strongly connected for all \( s \ge 0.  \)
</p>
<p>
  That is a very technical way of saying that in a connected graph \(
  X \) that is not a cycle and has a minimum degree two, any \( s
  \)-arc \( \alpha \) can be sent to any \( s \)-arc \( \beta \) by
  repeated shunting.  The proof is quite technical too and pretty
  long, so I'll omit it here.
</p>
<h3 id="automorphisms-preserve-successor-relation">Automorphisms Preserve Successor Relation<a href="#automorphisms-preserve-successor-relation"></a></h3>
<p>
  We will obtain a nifty result here that will prove to be very useful
  in the next section.  Let \( S(\gamma) \) denote the set of all
  successors of the \( s \)-arc \( \gamma \) of a graph.  Let \( g \)
  be an automorphism of the graph.  Then

  \[
    \delta \in S(\gamma) \iff \delta^g \in S(\gamma^g).
  \]

  This follows directly from the fact that automorphisms preserve
  adjacency, so they must preserve successor relation as well.  A
  corollary of this is that for an automorphism \( h, \) we have

  \[
    \delta^{h^{-1}} \in S(\gamma) \iff \delta \in S(\gamma^h).
  \]

  This is the form that will be useful soon.
</p>
<h3 id="test-of-s-arc-transitivity">Test of \( s \)-arc Transitivity<a href="#test-of-s-arc-transitivity"></a></h3>
<p>
  The results in the previous two sections lead to a remarkably simple
  proof of the fact that the Petersen graph is \( 3 \)-arc transitive.
  Let us see how.
</p>
<p>
  Let \( P \) be the Petersen graph whose vertices are the \( 2
  \)-subsets of \( \{ 1, 2, 3, 4, 5 \} \) with adjacency given by
  disjointness of the \( 2 \)-subsets.  Then \( \operatorname{Aut}(P)
  \cong S_5 \) since any permutation of \( \{ 1, 2, 3, 4, 5 \} \)
  induces a permutation of the vertices that preserves disjointness
  and hence adjacency.  We will use the shorthand \( ab \) to
  represent each vertex \( \{ a, b \} \) of \( P.  \)  Consider the \(
  3 \)-arc

  \[
    \alpha = (12, 34, 15, 23).
  \]

  It has exactly two successors, namely

  \[
    \beta_1 = (34, 15, 23, 14), \quad \beta_2 = (34, 15, 23, 45).
  \]

  Let \( g_1 = (13)(245) \) and \( g_2 = (13524).  \)  Then

  \begin{align*}
    \alpha^{g_1}
    &amp; = (12, 34, 15, 23)^{(13)(245)} = (34, 15, 23, 14) = \beta_1, \\
    \alpha^{g_2}
    &amp; = (12, 34, 15, 23)^{(13524)} = (34, 51, 23, 45) = \beta_2.
  \end{align*}

  Let \( H = \langle g_1, g_2 \rangle \le \operatorname{Aut}(P).  \)
  Consider an \( s \)-arc \( \alpha^h \) for some \( h \in H.  \)  Let
  \( \delta \in S(\alpha^h).  \)  Then by the result in the previous
  section, we get

  \[
    \delta^{h^{-1}} \in S(\alpha)
    = \{ \beta_1, \beta_2 \}
    = \{ \alpha^{g_1}, \alpha^{g_2} \}.
  \]

  Therefore

  \[
    \delta \in \{ \alpha^{g_1 h}, \alpha^{g_2 h} \}.
  \]

  Thus

  \[
    \delta \in \alpha^{H}.
  \]

  We started with an \( s \)-arc \( \alpha^h \in \alpha^H \) and
  showed that its successors \( \delta \) also lie in \( \alpha^H.  \)
  Thus the orbit \( \alpha^H \) is closed under taking successors.
</p>
<p>
  Now by the <a href="#shunting">shunting result</a> discussed
  previously, \( \alpha \) can be sent to any \( 3 \)-arc of \( P \)
  by repeated shunting.  Therefore all \( 3 \)-arcs of \( P \) belong
  to \( \alpha^H.  \)  Therefore the automorphisms in \( H \) can send
  any \( 3 \)-arc of \( P \) to any other thus making \( P \) \( 3
  \)-arc transitive.
</p>
<h3 id="moore-graphs">Moore Graphs<a href="#moore-graphs"></a></h3>
<p>
  Graphs with diameter \( d \) and girth \( 2d + 1 \) are known as
  Moore graphs.
</p>
<p>
  There are an infinite number of Moore graphs with diameter \( 1 \)
  since the complete graphs \( K_n, \) where \( n \ge 3, \) have
  diameter \( 1 \) and girth \( 3.  \)
</p>
<p>
  There are three known Moore graphs of diameter \( 2.  \)  They are \(
  C_5, \) \( J(5, 2, 0) \) also known as the Petersen graph and the
  Hoffman-Singleton graph.  They are respectively \( 2 \)-regular, \(
  3 \)-regular and \( 7 \)-regular.  There is a famous result that
  proves that a Moore graph must be \( 2 \)-regular, \( 3 \)-regular,
  \( 7 \)-regular or \( 57 \)-regular.  It is unknown currently
  whether a \( 57 \)-regular Moore graph of diameter \( 2 \) exists.
</p>
<p>
  There are infinitely many Moore graphs of diameter \( d \ge 3 \)
  because the odd cycles \( C_{2d + 1} \) are \( 2 \)-regular graphs
  with diameter \( d \) and girth \( 2d + 1 \) for all \( d \ge 1.  \)
  However, there are no \( k \)-regular Moore graphs for diameter \( d
  \ge 3 \) when \( k \ge 3.  \)
</p>
<h3 id="generalised-polygons">Generalised Polygons<a href="#generalised-polygons"></a></h3>
<p>
  Bipartite graphs with diameter \( d \) and girth \( 2d \) are known
  as generalised polygons.  This is easy to understand.  If we take a
  classical \( d \)-gon and create the incidence graph of its vertices
  and edges, then the incidence graph is the cycle \( C_{2d} \) which
  has diameter \( d \) and girth \( 2d.  \)
</p>
<p>
  The converse is not always true.  For example,
  the <a href="https://en.wikipedia.org/wiki/Heawood_graph">Heawood
  graph</a> which has diameter \( d = 3 \) and girth \( 2d = 6.  \)  It
  is the incidence graph of Fano plane, which is a projective plane
  rather than a classical \( d \)-gon.
</p>
<p>
  Although a generalised polygon is not always the incidence graph of
  a classical polygon, the idea behind the definition comes from a
  simple observation.  If we take a classical \( d \)-gon and form the
  incidence graph of its vertices and edges, we obtain the cycle \(
  C_{2d}.  \)  This graph is bipartite and has diameter \( d \) and
  girth \( 2d.  \)  The definition of a generalised polygon abstracts
  these properties.  Any bipartite graph with diameter \( d \) and
  girth \( 2d \) is called a generalised polygon, even when it is not
  the incidence graph of a classical \( d \)-gon.  In this way the
  definition allows much richer graphs than simple cycles.
</p>
<h2 id="computing">Computing<a href="#computing"></a></h2>
<h3 id="select-between-lines-inclusive">Select Between Lines, Inclusive<a href="#select-between-lines-inclusive"></a></h3>
<p>
  Select text between two lines, including both lines:
</p>
<pre><code>sed '/pattern1/,/pattern2/!d'</code></pre>
<pre><code>sed -n '/pattern1/,/pattern2/p'</code></pre>
<p>
  Here are some examples:
</p>
<pre><samp>$ <kbd>printf 'A\nB\nC\nD\nE\nF\nG\nH\n' | sed '/C/,/F/!d'</kbd>
C
D
E
F
$ <kbd>printf 'A\nB\nC\nD\nE\nF\nG\nH\n' | sed -n '/C/,/F/p'</kbd>
C
D
E
F</samp></pre>
<h3 id="select-between-lines-exclusive">Select Between Lines, Exclusive<a href="#select-between-lines-exclusive"></a></h3>
<p>
  Select text between two lines, excluding both lines:
</p>
<pre><code>sed '/pattern1/,/pattern2/!d; //d'</code></pre>
<p>
  Here is an example usage:
</p>
<pre><samp>$ <kbd>printf 'A\nB\nC\nD\nE\nF\nG\nH\n' | sed '/C/,/F/!d; //d'</kbd>
D
E</samp></pre>
<p>
  The negated command <code>!d</code> deletes everything not matched
  by the 2-address range <code>/C/,/F/</code>, i.e. it deletes
  everything before the line matching <code>/C/</code> as well as
  everything after the line matching <code>/F/</code>.  So we are left
  with only the lines from <code>C</code> to <code>F</code>,
  inclusive.  Finally, <code>//</code> (the empty regular expression)
  reuses the most recently used regular expression.  So
  when <code>/C/,/F/</code> matches <code>C</code>, the
  command <code>//d</code> also matches <code>C</code> and deletes it.
  Similarly, <code>F</code> is deleted too.  That's how we are left
  with the lines between <code>C</code> and <code>F</code>, exclusive.
</p>
<p>
  Here are some excerpts from
  <a href="https://pubs.opengroup.org/onlinepubs/9799919799/utilities/sed.html">POSIX.1-2024</a>
  that help understand the <code>!d</code> and <code>//d</code>
  commands better:
</p>
<blockquote>
  A function can be preceded by a <code>'!'</code> character, in which
  case the function shall be applied if the addresses do not select
  the pattern space.  Zero or more &lt;blank&gt; characters shall be
  accepted before the <code>'!'</code> character.  It is unspecified
  whether &lt;blank&gt; characters can follow the <code>'!'</code>
  character, and conforming applications shall not follow
  the <code>'!'</code> character with &lt;blank&gt; characters.
</blockquote>
<blockquote>
  If an RE is empty (that is, no pattern is specified) <em>sed</em>
  shall behave as if the last RE used in the last command applied
  (either as an address or as part of a substitute command) was
  specified.
</blockquote>
<h3 id="signing-and-verification-with-ssh-key">Signing and Verification with SSH Key<a href="#signing-and-verification-with-ssh-key"></a></h3>
<p>
  Here are some minimal commands to demonstrate how we can sign some
  text using SSH key and then later verify it.
</p>
<pre><code>ssh-keygen -t ed25519 -f key
echo hello &gt; hello.txt
ssh-keygen -Y sign -f key.pub -n file hello.txt
echo "jdoe $(cat key.pub)" &gt; allowed.txt
ssh-keygen -Y verify -f allowed.txt -I jdoe -n file -s hello.txt.sig &lt; hello.txt</code></pre>
<p>
  Here are some examples that demonstrate what the outputs and
  signature file look like:
</p>
<pre><samp>$ <kbd>ssh-keygen -Y sign -f key.pub -n file hello.txt</kbd>
Signing file hello.txt
Write signature to hello.txt.sig</samp></pre>
<pre><samp>$ <kbd>cat hello.txt.sig</kbd>
-----BEGIN SSH SIGNATURE-----
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgAwP6RnmFVrZO0m/nRIHyvr2S19
itsKegj9p/BZKqP1sAAAAEZmlsZQAAAAAAAAAGc2hhNTEyAAAAUwAAAAtzc2gtZWQyNTUx
OQAAAEB8ylqjCLgInF8DvROnLSm1UUWd0VuLPesI+1NhMrV9BjH5lf0w20kHunJW3qRIjw
Jfs9+q/e47KdlR8wBQaHYD
-----END SSH SIGNATURE-----</samp></pre>
<pre><samp>$ <kbd>ssh-keygen -Y verify -f allowed.txt -I jdoe -n file -s hello.txt.sig &lt; hello.txt</kbd>
Good "file" signature for jdoe with ED25519 key SHA256:9ZJuUJNMy1UXo3AlQy8L7baD3LOfEbgQ30ELIt+8wWc</samp></pre>
<h3 id="block-ip-address-with-nftables">Block IP Address with nftables<a href="#block-ip-address-with-nftables"></a></h3>
<p>
  Here is a sequence of commands to create an nftables rule from
  scratch to block an IP address:
</p>
<pre><samp>$ <kbd>sudo nft list ruleset</kbd>
$ <kbd>sudo nft add table inet filter</kbd>
$ <kbd>sudo nft list ruleset</kbd>
table inet filter {
}
$ <kbd>sudo nft add chain inet filter input { type filter hook input priority 0 \; }</kbd>
$ <kbd>sudo nft list ruleset</kbd>
table inet filter {
        chain input {
                type filter hook input priority filter; policy accept;
        }
}
$ <kbd>sudo nft add rule inet filter input ip saddr 172.236.0.216 drop</kbd>
$ <kbd>sudo nft list ruleset</kbd>
table inet filter {
        chain input {
                type filter hook input priority filter; policy accept;
                ip saddr 172.236.0.216 drop
        }
}</samp></pre>
<p>
  Here is how to undo the above setup step by step:
</p>
<pre><samp>$ <kbd>sudo nft -a list ruleset</kbd>
table inet filter { # handle 1
        chain input { # handle 1
                type filter hook input priority filter; policy accept;
                ip saddr 172.236.0.216 drop # handle 2
        }
}
$ <kbd>sudo nft delete rule inet filter input handle 2</kbd>
$ <kbd>sudo nft list ruleset</kbd>
table inet filter {
        chain input {
                type filter hook input priority filter; policy accept;
        }
}
$ <kbd>sudo nft delete chain inet filter input</kbd>
$ <kbd>sudo nft list ruleset</kbd>
table inet filter {
}
$ <kbd>sudo nft delete table inet filter</kbd>
$ <kbd>sudo nft list ruleset</kbd>
$</samp></pre>
<p>
  Finally, the following command deletes all rules, chains and tables.
  It wipes the entire ruleset, so use it with care.
</p>
<pre><samp>$ <kbd>sudo nft flush ruleset</kbd>
$ <kbd>sudo nft list ruleset</kbd>
$</samp></pre>
<p>
  All outputs above were obtained using nftables v1.1.3 on Debian 13.2
  (Trixie).
</p>
<h3 id="debian-logrotate-setup">Debian Logrotate Setup<a href="#debian-logrotate-setup"></a></h3>
<p>
  Observed on Debian 11.5 (Bullseye) that <code>logrotate</code> is
  set up on it via <code>systemd</code>.  Here are some outputs that
  show what the setup is like:
</p>
<pre><samp>$ <kbd>sudo systemctl status logrotate.service</kbd>
● logrotate.service - Rotate log files
     Loaded: loaded (/lib/systemd/system/logrotate.service; static)
     Active: inactive (dead) since Mon 2026-03-30 00:00:17 UTC; 19h ago
TriggeredBy: <span class="c2">●</span> logrotate.timer
       Docs: man:logrotate(8)
             man:logrotate.conf(5)
    Process: 2148235 ExecStart=/usr/sbin/logrotate /etc/logrotate.conf (code=exited, status=0/SUCCESS)
   Main PID: 2148235 (code=exited, status=0/SUCCESS)
        CPU: 574ms

Mar 30 00:00:16 spweb systemd[1]: Starting Rotate log files...
Mar 30 00:00:17 spweb systemd[1]: logrotate.service: Succeeded.
Mar 30 00:00:17 spweb systemd[1]: Finished Rotate log files.
$ <kbd>sudo systemctl status logrotate.timer</kbd>
● logrotate.timer - Daily rotation of log files
     Loaded: loaded (/lib/systemd/system/logrotate.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Mon 2026-01-19 19:19:34 UTC; 2 months 9 days ago
    Trigger: Tue 2026-03-31 00:00:00 UTC; 4h 7min left
   Triggers: <span class="c2">●</span> logrotate.service
       Docs: man:logrotate(8)
             man:logrotate.conf(5)

Warning: journal has been rotated since unit was started, output may be incomplete.
$ <kbd>sudo systemctl list-timers logrotate</kbd>
NEXT                        LEFT         LAST                        PASSED  UNIT            ACTIVATES
Tue 2026-03-31 00:00:00 UTC 4h 7min left Mon 2026-03-30 00:00:16 UTC 19h ago logrotate.timer logrotate.service

1 timers listed.
Pass --all to see loaded but inactive timers, too.
$ <kbd>head /lib/systemd/system/logrotate.service</kbd>
[Unit]
Description=Rotate log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
RequiresMountsFor=/var/log
ConditionACPower=true

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf

$ <kbd>cat /lib/systemd/system/logrotate.timer</kbd>
[Unit]
Description=Daily rotation of log files
Documentation=man:logrotate(8) man:logrotate.conf(5)

[Timer]
OnCalendar=daily
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target
$ <kbd>grep -vE '^#|^$' /etc/logrotate.conf</kbd>
weekly
rotate 4
create
include /etc/logrotate.d
$ <kbd>ls -l /etc/logrotate.d/</kbd>
total 40
-rw-r--r-- 1 root root 120 Aug 21  2022 alternatives
-rw-r--r-- 1 root root 173 Jun 10  2021 apt
-rw-r--r-- 1 root root 130 Oct 14  2019 btmp
-rw-r--r-- 1 root root  82 May 26  2018 certbot
-rw-r--r-- 1 root root 112 Aug 21  2022 dpkg
-rw-r--r-- 1 root root 128 May  4  2021 exim4-base
-rw-r--r-- 1 root root 108 May  4  2021 exim4-paniclog
-rw-r--r-- 1 root root 329 May 29  2021 nginx
-rw-r--r-- 1 root root 374 May 20  2022 rsyslog
lrwxrwxrwx 1 root root  28 Mar 17 01:52 <span class="c3">susam</span> -&gt; /opt/susam.net/etc/logrotate
-rw-r--r-- 1 root root 145 Oct 14  2019 wtmp</samp></pre>
<p>
  To force log rotation right now, execute:
</p>
<pre><code>sudo systemctl start logrotate.service</code></pre>
<!-- ### -->
<p>
  <a href="https://susam.net/26c.html">Read on website</a> |
  <a href="https://susam.net/tag/notes.html">#notes</a> |
  <a href="https://susam.net/tag/mathematics.html">#mathematics</a> |
  <a href="https://susam.net/tag/linux.html">#linux</a> |
  <a href="https://susam.net/tag/technology.html">#technology</a>
</p>
]]>
</description>
</item>
<item>
<title>Feb '26 Notes</title>
<link>https://susam.net/26b.html</link>
<guid isPermaLink="false">ntfts</guid>
<pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate>
<description>
<![CDATA[
<p>
  Since last month, I have been collecting brief notes on ideas and
  references that caught my attention during each month but did not
  make it into full articles.  Some of these fragments may eventually
  grow into standalone posts, though most will probably remain as they
  are.  At the very least, this approach allows me to keep a record of
  them.
</p>
<p>
  Most of <a href="26a.html">last month's notes</a> grew out of my
  reading of <em>Algebraic Graph Theory</em> by Godsil and Royle.  I
  am still exploring and learning this subject.  This month, however,
  I dove into another book with the same title but this book is
  written by Norman Biggs.  As a result, many of the notes that follow
  are drawn from Biggs's treatment of the topic.
</p>
<p>
  Since I already had a good understanding of the subject from the
  earlier book, I decided to skip the first fourteen chapters of the
  new book.  I began with Chapter 15, which discusses automorphisms of
  graphs and then moved on to the following chapters on graph
  symmetries.  My main reason for picking up Biggs's book was to
  understand Tutte's well known result that any \( s \)-arc-transitive
  finite cubic graph must satisfy \( s \le 5.  \)  While I did not
  reach that chapter this month, I made substantial progress with the
  book.  I hope to work through the proof of Tutte's theorem next
  month.
</p>
<h2 id="contents">Contents<a href="#contents"></a></h2>
<ol>
  <li><a href="#degree-of-vertices-in-an-orbit">Degree of Vertices in an Orbit</a></li>
  <li><a href="#regular-non-vertex-transitive-graphs">Regular Non-Vertex-Transitive Graphs</a></li>
  <li><a href="#vertex-transitive-but-not-edge-transitive">Vertex-Transitive But Not Edge-Transitive</a></li>
  <li><a href="#edge-transitive-but-not-vertex-transitive">Edge-Transitivex But Not Vertex-Transitive</a></li>
  <li><a href="#bipartiteness-as-a-necessary-condition">Bipartiteness as a Necessary Condition</a></li>
  <li><a href="#graph-with-an-automorphism-group">Graph with an Automorphism Group</a></li>
  <li><a href="#permutation-groups-need-not-be-automorphism-groups">Permutation Groups Need Not Be Automorphism Groups</a></li>
  <li><a href="#symmetric-graphs">Symmetric Graphs</a></li>
</ol>
<h2 id="degree-of-vertices-in-an-orbit">Degree of Vertices in an Orbit<a href="#degree-of-vertices-in-an-orbit"></a></h2>
<p>
  If two vertices of a graph belong to the same orbit, then they have
  the same degree.  In other words, for a graph \( X, \) if \( x, y
  \in V(X) \) and there is an automorphism \( \alpha \) such that \(
  \alpha(x) = y, \) then \( \deg(x) = \deg(y).  \)
</p>
<p>
  The proof is quite straightforward.  Let

  \begin{align*}
    N(x) &amp;= \{ v_1, \dots, v_r \}, \\
    N(y) &amp;= \{ w_1, \dots, w_s \}
  \end{align*}

  represent the neighbours of \( x \) and \( y \) respectively.
  Therefore we have

  \[
    x \sim v_1, \; \dots, \; x \sim v_r.
  \]

  Since an automorphism preserves adjacency, we get

  \[
    \alpha(x) \sim \alpha(v_1), \; \dots, \;
    \alpha(x) \sim \alpha(v_r).
  \]

  Substituting \( \alpha(x) = y, \) we get

  \[
    y \sim \alpha(v_1), \; \dots, \; y \sim \alpha(v_r).
  \]

  Thus

  \[
    \alpha(N(x))
    = \{ \alpha(v_1), \; \dots, \; \alpha(v_r) \}
    \subseteq N(y).
  \]

  A similar argument works in reverse as well.  By the definition of
  automorphism, if \( \alpha \) is an automorphism, so is \(
  \alpha^{-1}.  \)  From the definition of \( N(y) \) above, we have

  \[
    y \sim w_1, \; \dots, \; y \sim w_s.
  \]

  Therefore

  \[
    \alpha^{-1}(y) \sim \alpha^{-1}(w_1), \; \dots, \;
    \alpha^{-1}(y) \sim \alpha^{-1}(w_s).
  \]

  This is equivalent to

  \[
    x \sim \alpha^{-1}(w_1), \; \dots, \; x \sim \alpha^{-1}(w_s).
  \]

  Thus

  \[
    \alpha^{-1}(N(y))
    = \{ \alpha^{-1}(w_1), \; \dots, \; \alpha^{-1}(w_s) \}
    \subseteq N(x)
  \]

  This can be rewritten as

  \[
    \{ \alpha^{-1}(w_1), \; \dots, \; \alpha^{-1}(w_s) \}
    \subseteq \{ v_1, \dots, v_r \}.
  \]

  Therefore

  \[
    N(y)
    = \{ w_1, \dots, w_s \}
    \subseteq \{ \alpha(v_1), \dots, \alpha(v_r) \}
    = \alpha(N(x)).
  \]

  We have shown that \( \alpha(N(x)) \subseteq N(y) \) and \( N(y)
  \subseteq \alpha(N(x)).  \)  Thus

  \[
    \alpha(N(x)) = N(y).
  \]

  Thus

  \[
    \lvert N(y) \rvert = \lvert \alpha(N(x)) \rvert = r.
  \]

  Therefore both \( x \) and \( y \) have \( r \) neighbours each.
  Hence \( \deg(x) = \deg(y).  \)
</p>
<h2 id="regular-non-vertex-transitive-graphs">Regular Non-Vertex-Transitive Graphs<a href="#regular-non-vertex-transitive-graphs"></a></h2>
<p>
  The <a href="https://en.wikipedia.org/wiki/Frucht_graph">Frucht graph</a>
  and the
  <a href="https://en.wikipedia.org/wiki/Folkman_graph">Folkman
  graph</a> are examples of graphs that are \( k \)-regular but not
  vertex-transitive.  In fact, the Folkman graph is a semi-symmetric
  graph, i.e. it is regular and edge-transitive but not
  vertex-transitive.
</p>
<h2 id="vertex-transitive-but-not-edge-transitive">Vertex-Transitive But Not Edge-Transitive<a href="#vertex-transitive-but-not-edge-transitive"></a></h2>
<p>
  The circular ladder graph \( CL_3, \) i.e. the triangular prism
  graph, is vertex-transitive but not edge-transitive.
</p>
<p>
  Every vertex has the same local structure.  Every vertex has degree
  \( 3 \) and it lies on exactly one of the two triangles and it has
  exactly one 'vertical' edge connecting it to the corresponding edge
  on the other triangle.  Any vertex can be sent to any other by an
  automorphism.
</p>
<p>
  Since triangle edges are in a triangle and vertical edges are in no
  triangle, no automorphism can send a triangle edge to a vertical
  edge or vice versa.  Therefore the graph is not edge-transitive.
</p>
<h2 id="edge-transitive-but-not-vertex-transitive">Edge-Transitivex But Not Vertex-Transitive<a href="#edge-transitive-but-not-vertex-transitive"></a></h2>
<p>
  The complete bipartite graphs \( K_{m,n} \) with \( m \ne n \) are
  edge-transitive but not vertex-transitive.
</p>
<p>
  Every edge connects one vertex from the \( m \)-part to one vertex
  from the \( n \)-part.  Any permutation of vertices inside the \( m
  \)-part preserves adjacency.  Similarly, any permutation of vertices
  inside the \( n \)-part preserves adjacency.
</p>
<p>
  Take two arbitrary edges

  \[
    uv, \; u'v' \in E(K_{m,n})
  \]

  where \( u, u' \) are vertices that lie in the \( m \)-part and \(
  v, v' \) are vertices that lie in the \( n \)-part.  Permute
  vertices within the \( m \)-part to send \( u \) to \( u'.  \)
  Similarly, permute vertices within the \( n \)-part to send \( v \)
  to \( v'.  \)  This gives an automorphism that sends the edge \( uv
  \) to \( u'v'.  \)  In this manner we can find an automorphism that
  sends any edge to any other.  Therefore, \( K_{m,n} \) is
  edge-transitive.
</p>
<p>
  However, \( K_{m,n} \) is not vertex-transitive since no
  automorphism can send a vertex in the \( m \)-part to a vertex in
  the \( n \)-part since the vertices in the \( m \)-part have degree
  \( n \) and the vertices in the \( n \)-part have degree \( m.  \)
</p>
<h2 id="bipartiteness-as-a-necessary-condition">Bipartiteness as a Necessary Condition<a href="#bipartiteness-as-a-necessary-condition"></a></h2>
<p>
  If a connected graph is edge-transitive but not vertex-transitive,
  then it must be bipartite.
</p>
<h2 id="graph-with-an-automorphism-group">Graph with an Automorphism Group<a href="#graph-with-an-automorphism-group"></a></h2>
<p>
  In 1938, Frucht proved that for every finite abstract group \( G, \)
  there exists a graph whose automorphism group is isomorphic to \( G
 .  \)
</p>
<p>
  Remarkably, this result remains valid even when we restrict our
  attention to cubic graphs.  That is, for every finite abstract group
  \( G, \) there exists a cubic graph whose automorphism group is
  isomorphic to \( G.  \)  Moreover, the result has been extended to
  graphs satisfying various additional graph-theoretical properties,
  such as \( k \)-connectivity, \( k \)-regularity and prescribed
  chromatic number.
</p>
<h2 id="permutation-groups-need-not-be-automorphism-groups">Permutation Groups Need Not Be Automorphism Groups<a href="#permutation-groups-need-not-be-automorphism-groups"></a></h2>
<p>
  Consider the following specialised version of the problem discussed
  in the previous section: Given a permutation group on a set \( X, \)
  must there exist a graph with vertex set \( X \) whose automorphism
  group is precisely that permutation group?
</p>
<p>
  The answer is no.  Consider the cyclic group \( C_3 \) acting on \(
  X = \{ a, b, c \}.  \)  There is no graph \( \Gamma \) with \(
  V(\Gamma) = X \) and \( \operatorname{Aut}(\Gamma) \cong C_3.  \)  If
  we take \( \Gamma = K_3, \) then \( C_3 \subset S_3 =
  \operatorname{Aut}(K_3) \) but \( C_3 \ne \operatorname{Aut}(K_3)
 .  \)
</p>
<h2 id="symmetric-graphs">Symmetric Graphs<a href="#symmetric-graphs"></a></h2>
<p>
  It is interesting that while we study graph symmetry through
  concepts such as graph automorphisms, vertex-transitivity,
  edge-transitivity, etc. the name <em>symmetric graph</em> is
  reserved for graphs that are \( 1 \)-arc-transitive.  A
  vertex-transitive graph or an edge-transitive graph need not be
  \(1\)-arc-transitive and therefore need not be symmetric.
</p>
<p>
  However, every \( s \)-arc-transitive graph is \(1 \)-arc-transitive
  for \( s \ge 1.  \)  Consequently, every \( s \)-arc-transitive graph
  is symmetric.  Moreover, every distance-transitive graph is also \(
  1 \)-arc-transitive and hence symmetric.
</p>
<p>
  Formally, we say that a graph \( \Gamma \) is \( 1 \)-arc-transitive
  (or equivalently, symmetric) if for all \( 1 \)-arcs \( uv \) and \(
  u'v' \) of \( \Gamma, \) there is an automorphism \( \alpha \in
  \operatorname{Aut}(\Gamma) \) such that \( \alpha(uv) = u'v'.  \)
</p>
<p>
  Stated in more basic terms, we can say that \( \Gamma \) is
  symmetric if for all \( u, v, u', v' \in V(\Gamma) \) satisfying \(
  u \sim v \) and \( u' \sim v', \) there exists \( \alpha \in
  \operatorname{Aut}(\Gamma) \) such that \( \alpha(u) = u' \) and \(
  \alpha(v) = v'.  \)
</p>
<p>
  Switching gears now, we say that \( \Gamma \) is distance-transitive
  if for all \( u, v, u', v' \in V(\Gamma) \) satisfying \( d(u, v) =
  d(u', v'), \) there exists \( \alpha \in \operatorname{Aut}(\Gamma)
  \) such that \( \alpha(u) = u' \) and \( \alpha(v) = v'.  \)  Since
  all \( 1 \)-arcs \( uv \) and \( u'v' \) satisfy \( d(u, v) = d(u',
  v') = 1, \) distance-transitivity implies that there is an
  automorphism that sends \( uv \) to \( u'v'.  \)  Therefore a
  distance-transitive graph is also \( 1 \)-arc-transitive.
</p>
<p>
  To summarise, a graph must possess a certain degree of symmetry in
  order to be called symmetric.  It turns out that merely having a
  non-trivial automorphism group is not sufficient.  Even being
  vertex-transitive or edge-transitive is not enough for a graph to be
  called symmetric.  The graph needs to be at least \( 1
  \)-arc-transitive to be called symmetric.
</p>
<p>
  Another interesting aspect of this terminology is that the property
  of being asymmetric is not the exact opposite of being symmetric.
  For example, a vertex-transitive graph need not be symmetric.
  However, that does not make it asymmetric.  A graph is called
  asymmetric if it has no non-trivial automorphisms, i.e. its
  automorphism group contains only the identity permutation.  Thus, if
  a graph has at least two vertices and is vertex-transitive, it must
  admit a non-trivial automorphism that maps one vertex to another.
  So while such a vertex-transitive may not be symmetric, it isn't
  asymmetric either.
</p>
<!-- ### -->
<p>
  <a href="https://susam.net/26b.html">Read on website</a> |
  <a href="https://susam.net/tag/notes.html">#notes</a> |
  <a href="https://susam.net/tag/mathematics.html">#mathematics</a>
</p>
]]>
</description>
</item>
<item>
<title>Jan '26 Notes</title>
<link>https://susam.net/26a.html</link>
<guid isPermaLink="false">ntjts</guid>
<pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate>
<description>
<![CDATA[
<p>
  In these monthly notes, I jot down ideas and references I
  encountered during the month that I did not have time to expand into
  their own posts.  A few of these may later develop into independent
  posts but most of them will likely not.  In any case, this format
  ensures that I record them here.  I spent a significant part of this
  month studying the book <em>Algebraic Graph Theory</em> by Godsil
  and Royle, so many of the notes here are about it.  There are a few
  non-mathematical, technical notes towards the end.
</p>
<h2 id="contents">Contents<a href="#contents"></a></h2>
<ol>
  <li><a href="#cayley-graphs">Cayley Graphs</a></li>
  <li><a href="#vertex-transitive-graphs">Vertex-Transitive Graphs</a></li>
  <li><a href="#arc-transitive-graphs">Arc-Transitive Graphs</a></li>
  <li><a href="#bipartite-graphs-and-cycle-parity">Bipartite Graphs and Cycle Parity</a></li>
  <li><a href="#tutte-theorem">Tutte's Theorem</a></li>
  <li><a href="#tutte-8-cage">Tutte's 8-Cage</a></li>
  <li><a href="#lcg">Linear Congruential Generator</a></li>
  <li><a href="#cat-n">Numbering Lines</a></li>
</ol>
<h2 id="cayley-graphs">Cayley Graphs<a href="#cayley-graphs"></a></h2>
<p>
  Let \( G \) be a group and let \( C \subseteq G \) such that \( C \)
  is closed under taking inverses and does not contain the identity,
  i.e.

  \[
    \forall x \in C, \; x^{-1} \in C, \qquad e \notin C.
  \]

  Then the Cayley graph \( X(G, C) \) is the graph with the vertex set
  \( V(X(G, C)) \) and edge set \( E(X(G, C)) \) defined by

  \begin{align*}
    V(X(G, C)) &amp;= G, \\
    E(X(G, C)) &amp;= \{ gh : hg^{-1} \in C \}.
  \end{align*}

  The set \( C \) is known as the connection set.
</p>
<h2 id="vertex-transitive-graphs">Vertex-Transitive Graphs<a href="#vertex-transitive-graphs"></a></h2>
<p>
  A graph \( X \) is <em>vertex-transitive</em> if its automorphism
  group acts transitively on its set of vertices \( V(X).  \)
  Intuitively, this means that no vertex has a special role.  We can
  'move' the graph around so that any chosen vertex becomes any other
  vertex.  In other words, all vertices are indistinguishable.  The
  graph looks the same from each vertex.
</p>
<p>
  The \( k \)-cube \( Q_k \) is vertex-transitive.  So are the Cayley
  graphs \( X(G, C).  \)  However the path graph \( P_3 \) is not
  vertex-transitive since no automorphism can send the middle vertex
  of valency \( 2 \) to an end vertex of valency \( 1.  \)
</p>
<h2 id="arc-transitive-graphs">Arc-Transitive Graphs<a href="#arc-transitive-graphs"></a></h2>
<p>
  The cube \( Q_3 \) is \( 2 \)-arc-transitive but not \( 3
  \)-arc-transitive.  In \( Q_3, \) a \( 3 \)-arc belonging to a \( 4
  \)-cycle cannot be sent to a \( 3 \)-arc that does not belong to a
  \( 4 \)-cycle.  This is easy to explain.  The end vertices of a \( 3
  \)-arc belonging to a \( 4 \)-cycle are adjacent but the end
  vertices of a \( 3 \)-arc not belonging to a \( 4 \)-cycle are not
  adjacent.  Therefore, no automorphism can map the end vertices of
  the first \( 3 \)-arc to those of the second \( 3 \)-arc.
</p>
<p>
  For intuition, imagine that a traveller stands on a vertex and
  chooses an edge to move along.  They do this \( s \) times thereby
  walking along an arc of length \( s, \) also known as an \( s
  \)-arc.  By the definition of \( s \)-arcs, the traveller is not
  allowed to backtrack from one vertex to the previous one
  immediately.  In an \( s \)-arc-transitive graph, these arcs look
  the same no matter which vertex they start from or which edges they
  choose.  In the cube, this is indeed true for \( s = 2.  \)  All arcs
  of length \( 2 \) are indistinguishable.  No matter which arc of
  length \( 2 \) the traveller has walked along, the graph would look
  the same from their perspective at each vertex along the arc.
  However, this no longer holds good for arcs of length \( 3 \) since
  there are two distinct kinds of arcs of length \( 3.  \)  The first
  kind ends at a distance of \( 1 \) from the starting vertex of the
  arc (when the arc belongs to a \( 4 \)-cycle).  The second kind ends
  at a distance \( 3 \) from the starting vertex of the arc (when the
  arc does not belong to a \( 4 \)-cycle).  Therefore the cube is not
  \( 3 \)-arc-transitive.
</p>
<h2 id="bipartite-graphs-and-cycle-parity">Bipartite Graphs and Cycle Parity<a href="#bipartite-graphs-and-cycle-parity"></a></h2>
<p>
  A graph is bipartite if and only if it contains no cycles of odd
  length.  Equivalently, every cycle in a bipartite graph has even
  length.  Conversely, if every cycle in a graph has even length, then
  the graph is bipartite.
</p>
<h2 id="tutte-theorem">Tutte's Theorem<a href="#tutte-theorem"></a></h2>
<p>
  For any \( s \)-arc-transitive cubic graph, \( s \le 5.  \)  This was
  demonstrated by W. T. Tutte in 1947.  A proof can be found in
  Chapter 18 of <em>Algebraic Graph Theory</em> by Norman Biggs.
</p>
<p>
  In 1973, Richward Weiss established a more general theorem that
  proves that for any \( s \)-arc-transitive graph, \( s \le 7.  \)
  The bound is weaker but it applies to all graphs rather than only to
  cubic ones.
</p>
<h2 id="tutte-8-cage">Tutte's 8-Cage<a href="#tutte-8-cage"></a></h2>
<p>
  The book <em>Algebraic Graph Theory</em> by Godsil and Royle offers
  the following two descriptions of Tutte's 8-cage on 30 vertices:
</p>
<blockquote>
  Take the cube and an additional vertex \( \infty.  \)  In each set of
  four parallel edges, join the midpoint of each pair of opposite
  edges by an edge, then join the midpoint of the two new edges by an
  edge, and finally join the midpoint of this edge to \( \infty.  \)
</blockquote>
<blockquote>
  Construct a bipartite graph \( T \) with the fifteen edges as one
  colour class and the fifteen \( 1 \)-factors as the other, where
  each edge is adjacent to the three \( 1 \)-factors that contain it.
</blockquote>
<p>
  It can be shown that both descriptions construct a cubic bipartite
  graph on \( 30 \) vertices of girth \( 8.  \)  It can be further
  shown that there is a unique cubic bipartite graph on \( 30 \)
  vertices with girth \( 8.  \)  As a result both descriptions above
  construct the same graph.
</p>
<h2 id="lcg">Linear Congruential Generator<a href="#lcg"></a></h2>
<p>
  Here is a simple linear congruential generator (LCG) implementation
  in JavaScript:
</p>
<pre><code>function srand (seed) {
  let x = seed
  return function () {
    x = (1664525 * x + 1013904223) % 4294967296
    return x
  }
}</code></pre>
<p>
  Here is an example usage:
</p>
<pre><samp>&gt; <kbd>const rand = srand(0)</kbd>
undefined
&gt; <kbd>rand()</kbd>
1013904223
&gt; <kbd>rand()</kbd>
1196435762
&gt; <kbd>rand()</kbd>
3519870697</samp></pre>
<h2 id="cat-n">Numbering Lines<a href="#cat-n"></a></h2>
<p>
  Both BSD and GNU <code>cat</code> can number output lines with
  the <code>-n</code> option.  For example:
</p>
<pre><samp>$ <kbd>printf 'foo\nbar\nbaz\n' | cat -n</kbd>
     1  foo
     2  bar
     3  baz</samp></pre>
<p>
  However I have always used <code>nl</code> for this.  For example:
</p>
<pre><samp>$ <kbd>printf 'foo\nbar\nbaz\n' | nl</kbd>
     1  foo
     2  bar
     3  baz</samp></pre>
<p>
  While <code>nl</code> is
  <a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/nl.html">specified
  in POSIX</a>, the <code>cat -n</code> option
  <a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/cat.html">is
  not</a>.
</p>
<!-- ### -->
<p>
  <a href="https://susam.net/26a.html">Read on website</a> |
  <a href="https://susam.net/tag/notes.html">#notes</a> |
  <a href="https://susam.net/tag/mathematics.html">#mathematics</a> |
  <a href="https://susam.net/tag/programming.html">#programming</a> |
  <a href="https://susam.net/tag/javascript.html">#javascript</a> |
  <a href="https://susam.net/tag/shell.html">#shell</a>
</p>
]]>
</description>
</item>


</channel>
</rss>
