Documentation

TauCeti.Combinatorics.SimpleGraph.Connectivity.STNumbering

st-numberings and bipolar acyclic orientations of simple graphs #

An st-numbering of a finite simple graph G on V with chosen source s and sink t is a bijection V ≃ Fin (Fintype.card V) assigning 0 to s and Fintype.card V - 1 to t such that every vertex other than s and t has both a lower-numbered neighbour and a higher-numbered neighbour. Directing each edge from its lower-numbered endpoint to its higher-numbered endpoint yields a bipolar acyclic orientation of G: it has no positive-length directed closed paths, and whenever G is preconnected (in particular whenever s and t are adjacent or V has at least three vertices), s is the unique source, t is the unique sink, and every vertex lies on a directed path from s to t.

On a finite vertex type with at least three vertices and s ≠ t, Lempel, Even, and Cederbaum characterized the existence of an st-numbering by 2-vertex-connectivity of G ⊔ edge s t (and hence of G itself when G.Adj s t). The existence direction is proved here by iteratively attaching open ears to a partial vertex list starting at [s, t] via the fan lemma (SimpleGraph.IsVertexConnected.exists_fan), inserting the internal vertices of each new ear between its two attachment vertices.

Main definitions #

Main results #

References #

structure SimpleGraph.STNumbering {V : Type u} (G : SimpleGraph V) [Fintype V] (s t : V) :

An st-numbering of a finite simple graph G with source s and sink t is a bijection V ≃ Fin (Fintype.card V) sending s to 0 and t to Fintype.card V - 1 such that every vertex other than s and t has both a lower-numbered neighbour and a higher-numbered neighbour.

Instances For

    Basic numbering API #

    theorem SimpleGraph.STNumbering.ext {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} {n₁ n₂ : G.STNumbering s t} (h : ∀ (v : V), n₁.numbering v = n₂.numbering v) :
    n₁ = n₂

    Two st-numberings are equal when they assign the same index to every vertex.

    theorem SimpleGraph.STNumbering.ext_iff {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} {n₁ n₂ : G.STNumbering s t} :
    n₁ = n₂ ↔ ∀ (v : V), n₁.numbering v = n₂.numbering v
    theorem SimpleGraph.STNumbering.ext_val {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} {n₁ n₂ : G.STNumbering s t} (h : ∀ (v : V), ↑(n₁.numbering v) = ↑(n₂.numbering v)) :
    n₁ = n₂

    Two st-numberings are equal when they assign the same natural number to every vertex.

    theorem SimpleGraph.STNumbering.val_numbering_injective {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :
    Function.Injective fun (v : V) => ↑(n.numbering v)

    The natural-number values of an st-numbering are injective.

    theorem SimpleGraph.STNumbering.nonempty {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} :
    ∀ (x : G.STNumbering s t), Nonempty V

    A graph admitting an st-numbering has a nonempty vertex type.

    theorem SimpleGraph.STNumbering.card_pos {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :

    A graph admitting an st-numbering has positive vertex count.

    @[simp]
    theorem SimpleGraph.STNumbering.val_numbering_source {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :
    ↑(n.numbering s) = 0
    @[simp]
    theorem SimpleGraph.STNumbering.val_numbering_sink {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :
    ↑(n.numbering t) = Fintype.card V - 1
    theorem SimpleGraph.STNumbering.numbering_source {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :
    n.numbering s = ⟨0, ⋯⟩

    Explicit Fin value of the source in an st-numbering.

    theorem SimpleGraph.STNumbering.numbering_sink {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :

    Explicit Fin value of the sink in an st-numbering.

    @[simp]
    theorem SimpleGraph.STNumbering.val_numbering_eq_zero_iff {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) {v : V} :
    ↑(n.numbering v) = 0 ↔ v = s

    A vertex receives number 0 if and only if it is the source s.

    @[simp]
    theorem SimpleGraph.STNumbering.val_numbering_eq_card_sub_one_iff {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) {v : V} :
    ↑(n.numbering v) = Fintype.card V - 1 ↔ v = t

    A vertex receives number Fintype.card V - 1 if and only if it is the sink t.

    theorem SimpleGraph.STNumbering.source_eq_sink_iff {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :

    In an st-numbering, s = t holds exactly when the graph has a single vertex.

    theorem SimpleGraph.STNumbering.source_ne_sink {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} [Nontrivial V] (n : G.STNumbering s t) :
    s ≠ t

    On a nontrivial vertex type, the source and sink of an st-numbering are distinct.

    theorem SimpleGraph.STNumbering.numbering_source_le {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (v : V) :

    The source s has the minimum number among all vertices.

    @[simp]
    theorem SimpleGraph.STNumbering.not_lt_numbering_source {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (v : V) :
    @[simp]
    theorem SimpleGraph.STNumbering.numbering_source_lt_iff {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) {v : V} :

    A vertex has strictly larger number than s if and only if it is distinct from s.

    theorem SimpleGraph.STNumbering.le_numbering_sink {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (v : V) :

    The sink t has the maximum number among all vertices.

    @[simp]
    theorem SimpleGraph.STNumbering.not_numbering_sink_lt {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (v : V) :
    @[simp]
    theorem SimpleGraph.STNumbering.lt_numbering_sink_iff {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) {v : V} :

    A vertex has strictly smaller number than t if and only if it is distinct from t.

    Endpoint copy, reversal, supergraph transport, and isomorphism transport #

    def SimpleGraph.STNumbering.copy {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) {s' t' : V} (hs : s = s') (ht : t = t') :
    G.STNumbering s' t'

    Copy an st-numbering across equalities of its source and sink vertices.

    Instances For
      @[simp]
      theorem SimpleGraph.STNumbering.copy_numbering {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) {s' t' : V} (hs : s = s') (ht : t = t') :
      @[simp]
      theorem SimpleGraph.STNumbering.copy_rfl {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :
      n.copy ⋯ ⋯ = n
      def SimpleGraph.STNumbering.symm {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :

      Reverse an st-numbering via Fin.revPerm, exchanging the source s and the sink t.

      Instances For
        @[simp]
        theorem SimpleGraph.STNumbering.symm_numbering_apply {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (v : V) :
        theorem SimpleGraph.STNumbering.val_symm_numbering {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (v : V) :
        ↑(n.symm.numbering v) = Fintype.card V - 1 - ↑(n.numbering v)

        Explicit natural-number formula for the reversed st-numbering.

        @[simp]
        theorem SimpleGraph.STNumbering.symm_symm {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :
        n.symm.symm = n
        @[simp]
        theorem SimpleGraph.STNumbering.symm_copy {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) {s' t' : V} (hs : s = s') (ht : t = t') :
        (n.copy hs ht).symm = n.symm.copy ht hs

        Reversing the order on Fin (Fintype.card V) identifies st-numberings with ts-numberings.

        Instances For
          @[simp]
          theorem SimpleGraph.STNumbering.symmEquiv_apply {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :
          (symmEquiv G s t) n = n.symm
          @[simp]
          theorem SimpleGraph.STNumbering.symmEquiv_symm {V : Type u} [Fintype V] (G : SimpleGraph V) (s t : V) :
          (symmEquiv G s t).symm = symmEquiv G t s
          def SimpleGraph.STNumbering.mapLe {V : Type u} [Fintype V] {G H : SimpleGraph V} {s t : V} (hGH : G ≤ H) (n : G.STNumbering s t) :

          Transport an st-numbering to a supergraph on the same vertex type.

          Instances For
            @[simp]
            theorem SimpleGraph.STNumbering.mapLe_numbering {V : Type u} [Fintype V] {G H : SimpleGraph V} {s t : V} (hGH : G ≤ H) (n : G.STNumbering s t) :
            @[simp]
            theorem SimpleGraph.STNumbering.mapLe_refl {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :
            mapLe ⋯ n = n
            @[simp]
            theorem SimpleGraph.STNumbering.mapLe_mapLe {V : Type u} [Fintype V] {G H : SimpleGraph V} {s t : V} {K : SimpleGraph V} (hGH : G ≤ H) (hHK : H ≤ K) (n : G.STNumbering s t) :
            mapLe hHK (mapLe hGH n) = mapLe ⋯ n

            Supergraph transport of st-numberings composes transitively.

            @[simp]
            theorem SimpleGraph.STNumbering.symm_mapLe {V : Type u} [Fintype V] {G H : SimpleGraph V} {s t : V} (hGH : G ≤ H) (n : G.STNumbering s t) :
            (mapLe hGH n).symm = mapLe hGH n.symm
            def SimpleGraph.STNumbering.map {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} {W : Type u_1} [Fintype W] {G' : SimpleGraph W} (n : G.STNumbering s t) (e : G ≃g G') :
            G'.STNumbering (e s) (e t)

            Transport an st-numbering along a graph isomorphism.

            Instances For
              @[simp]
              theorem SimpleGraph.STNumbering.val_map_numbering {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} {W : Type u_1} [Fintype W] {G' : SimpleGraph W} (n : G.STNumbering s t) (e : G ≃g G') (w : W) :
              ↑((n.map e).numbering w) = ↑(n.numbering (e.symm w))
              theorem SimpleGraph.STNumbering.val_map_numbering_apply {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} {W : Type u_1} [Fintype W] {G' : SimpleGraph W} (n : G.STNumbering s t) (e : G ≃g G') (v : V) :
              ↑((n.map e).numbering (e v)) = ↑(n.numbering v)

              Evaluating n.map e at e v recovers the natural-number index of v.

              @[simp]
              theorem SimpleGraph.STNumbering.map_refl {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) :
              theorem SimpleGraph.STNumbering.map_trans {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} {W : Type u_1} {X : Type u_2} [Fintype W] [Fintype X] {G' : SimpleGraph W} {G'' : SimpleGraph X} (n : G.STNumbering s t) (e₁ : G ≃g G') (e₂ : G' ≃g G'') :
              (n.map e₁).map e₂ = n.map (RelIso.trans e₁ e₂)

              Transport of st-numberings along graph isomorphisms composes functorially.

              @[simp]
              theorem SimpleGraph.STNumbering.symm_map {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} {W : Type u_1} [Fintype W] {G' : SimpleGraph W} (n : G.STNumbering s t) (e : G ≃g G') :
              (n.map e).symm = n.symm.map e
              def SimpleGraph.Iso.stNumberingEquiv {V : Type u} [Fintype V] {W : Type u_1} [Fintype W] {G : SimpleGraph V} {H : SimpleGraph W} (e : G ≃g H) (s t : V) :
              G.STNumbering s t ≃ H.STNumbering (e s) (e t)

              A graph isomorphism induces an equivalence of st-numberings.

              Instances For
                @[simp]
                theorem SimpleGraph.Iso.stNumberingEquiv_apply {V : Type u} [Fintype V] {W : Type u_1} [Fintype W] {G : SimpleGraph V} {H : SimpleGraph W} (e : G ≃g H) (s t : V) (n : G.STNumbering s t) :
                (e.stNumberingEquiv s t) n = n.map e
                @[simp]
                theorem SimpleGraph.Iso.val_stNumberingEquiv_symm_numbering {V : Type u} [Fintype V] {W : Type u_1} [Fintype W] {G : SimpleGraph V} {H : SimpleGraph W} (e : G ≃g H) (s t : V) (m : H.STNumbering (e s) (e t)) (v : V) :
                ↑(((e.stNumberingEquiv s t).symm m).numbering v) = ↑(m.numbering (e v))

                Induced bipolar orientation and quiver transport #

                The orientation induced by an st-numbering, directing every edge from its lower-numbered endpoint to its higher-numbered endpoint.

                Instances For
                  @[simp]
                  theorem SimpleGraph.STNumbering.mem_toOrientation {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (d : G.Dart) :

                  A dart belongs to n.toOrientation exactly when its first endpoint has a strictly smaller number than its second endpoint.

                  @[simp]
                  theorem SimpleGraph.STNumbering.toOrientation_copy {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) {s' t' : V} (hs : s = s') (ht : t = t') :

                  Reversing an st-numbering reverses every dart of its induced orientation.

                  Construct the oriented-quiver arrow over an edge directed toward its higher-numbered endpoint.

                  Instances For

                    Transport arrows of OrientedQuiver G n.toOrientation across OrientedQuiver.homEquiv to pairs of an adjacency proof and a strict numbering inequality.

                    Instances For
                      @[simp]
                      theorem SimpleGraph.STNumbering.homEquiv_arrow {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) {u v : V} (h : G.Adj u v) (hlt : n.numbering u < n.numbering v) :
                      (n.homEquiv u v) (n.arrow h hlt) = ⟨h, hlt⟩
                      @[simp]
                      theorem SimpleGraph.STNumbering.homEquiv_symm_apply {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) {u v : V} (h : G.Adj u v) (hlt : n.numbering u < n.numbering v) :
                      (n.homEquiv u v).symm ⟨h, hlt⟩ = n.arrow h hlt

                      An arrow from u to v exists in OrientedQuiver G n.toOrientation if and only if u and v are adjacent with n.numbering u < n.numbering v.

                      There is no arrow from u to v in OrientedQuiver G n.toOrientation if and only if u and v are not adjacent with n.numbering u < n.numbering v.

                      The orientation induced by an st-numbering is acyclic.

                      Along any positive-length directed path in OrientedQuiver G n.toOrientation, the endpoint number is strictly greater than the start number.

                      Monotone walks, source, sink, and directed reachability #

                      theorem SimpleGraph.STNumbering.exists_walk_from_source_of_ne_sink {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) {v : V} (hvt : v ≠ t) :
                      ∃ (p : G.Walk s v), ∀ x ∈ p.support, n.numbering x ≤ n.numbering v

                      Every vertex v ≠ t is joined from s by a walk in G whose vertices all have numbers at most n.numbering v.

                      theorem SimpleGraph.STNumbering.exists_walk_to_sink_of_ne_source {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) {v : V} (hvs : v ≠ s) :
                      ∃ (p : G.Walk v t), ∀ x ∈ p.support, n.numbering v ≤ n.numbering x

                      Every vertex v ≠ s is joined to t by a walk in G whose vertices all have numbers at least n.numbering v.

                      theorem SimpleGraph.STNumbering.preconnected_of_reachable {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (hst : G.Reachable s t) :

                      If t is reachable from s, any graph admitting an st-numbering is preconnected.

                      theorem SimpleGraph.STNumbering.connected_of_reachable {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (hst : G.Reachable s t) :

                      If t is reachable from s, any graph admitting an st-numbering is connected.

                      theorem SimpleGraph.STNumbering.preconnected_of_adj {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (hst : G.Adj s t) :

                      If s and t are adjacent, any graph admitting an st-numbering is preconnected.

                      theorem SimpleGraph.STNumbering.connected_of_adj {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (hst : G.Adj s t) :

                      If s and t are adjacent, any graph admitting an st-numbering is connected.

                      On at least three vertices, any graph admitting an st-numbering is preconnected, even if s and t are not adjacent.

                      On at least three vertices, any graph admitting an st-numbering is connected.

                      The vertex s is a quiver source of OrientedQuiver G n.toOrientation.

                      The vertex t is a quiver sink of OrientedQuiver G n.toOrientation.

                      Every vertex v ≠ t is reachable from s in OrientedQuiver G n.toOrientation (with no connectedness hypothesis on G).

                      Every vertex v ≠ s can reach t in OrientedQuiver G n.toOrientation (with no connectedness hypothesis on G).

                      When G is preconnected, every vertex of OrientedQuiver G n.toOrientation is reachable from s.

                      When G is preconnected, every vertex of OrientedQuiver G n.toOrientation can reach t.

                      When G is preconnected, s is the unique source of OrientedQuiver G n.toOrientation.

                      When G is preconnected, t is the unique sink of OrientedQuiver G n.toOrientation.

                      theorem SimpleGraph.STNumbering.forall_not_adj_and_numbering_lt_iff {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (hG : G.Preconnected) {v : V} :
                      (∀ (u : V), ¬(G.Adj u v ∧ n.numbering u < n.numbering v)) ↔ v = s

                      When G is preconnected, s is the unique vertex with no lower-numbered neighbour.

                      theorem SimpleGraph.STNumbering.forall_not_adj_and_lt_numbering_iff {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (hG : G.Preconnected) {v : V} :
                      (∀ (w : V), ¬(G.Adj v w ∧ n.numbering v < n.numbering w)) ↔ v = t

                      When G is preconnected, t is the unique vertex with no higher-numbered neighbour.

                      2-vertex-connectivity from an st-numbering #

                      theorem SimpleGraph.STNumbering.isVertexConnected_two_sup_edge {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (h3 : 3 ≤ Fintype.card V) :
                      (G ⊔ edge s t).IsVertexConnected 2

                      On at least three vertices, admitting an st-numbering makes G ⊔ SimpleGraph.edge s t 2-vertex-connected.

                      theorem SimpleGraph.STNumbering.isVertexConnected_two {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (n : G.STNumbering s t) (h3 : 3 ≤ Fintype.card V) (hst : G.Adj s t) :

                      On at least three vertices with G.Adj s t, admitting an st-numbering makes G itself 2-vertex-connected.

                      Existence of st-numberings via open-ear insertion #

                      theorem SimpleGraph.nonempty_stNumbering_of_isVertexConnected_two_sup_edge {V : Type u} [Fintype V] {G : SimpleGraph V} {s t : V} (hst : s ≠ t) (hG : (G ⊔ edge s t).IsVertexConnected 2) :

                      Lempel–Even–Cederbaum theorem (existence). Let s ≠ t be distinct vertices of a finite simple graph G such that G ⊔ SimpleGraph.edge s t is 2-vertex-connected. Then G admits an st-numbering.

                      Any 2-vertex-connected finite simple graph admits an st-numbering between any two distinct vertices s ≠ t.

                      theorem SimpleGraph.IsVertexConnected.nonempty_stNumbering {V : Type u} [Fintype V] {G : SimpleGraph V} (hG : G.IsVertexConnected 2) {s t : V} (hst : G.Adj s t) :

                      Any 2-vertex-connected finite simple graph admits an st-numbering across any chosen edge G.Adj s t.

                      Lempel–Even–Cederbaum theorem. On a finite vertex type with at least three vertices, a simple graph G admits an st-numbering for distinct vertices s ≠ t if and only if G ⊔ SimpleGraph.edge s t is 2-vertex-connected.

                      Lempel–Even–Cederbaum theorem for adjacent endpoints. On a finite vertex type with at least three vertices, a simple graph G with G.Adj s t admits an st-numbering if and only if G is 2-vertex-connected.