Documentation

DescriptiveComplexity.Problems.Hamilton.CountingUndirectedHardness

#Hamilton Circuit is parsimoniously #P-complete #

DescriptiveComplexity.sharpHamCircuit_sharpP_parsimoniousComplete, by a reduction from the directed problem (DescriptiveComplexity.sharpDirHamCircuit_parsimonious_sharpHamCircuit), order-free and without a domain formula.

The reduction of the library in the other direction, doubling each edge, is not parsimonious for edge sets: an undirected circuit becomes its two orientations. The classical reduction in this direction is. Each vertex x is split into a path (i, x) – (m, x) – (o, x), and an arc x → y becomes the edge (o, x) – (i, y) (DescriptiveComplexity.Split.SArc).

The middle vertex has its two path neighbours and nothing else, so a circuit passes through it, in one direction or the other. Entering a vertex by i and leaving it by o forces the same at the next vertex – were it entered by o, its i would be reached twice – and so, by induction along the circuit (DescriptiveComplexity.IsCircuit.induction), at every vertex (DescriptiveComplexity.Split.forward_all). An undirected circuit of the split graph thus has an orientation in which every vertex is traversed i, m, o, and that orientation is a directed circuit of the graph, read on the edges (o, x) – (i, y). Directed circuits and edge sets correspond bijectively (DescriptiveComplexity.Split.splitEquiv).

Both directions of the correspondence build a circuit from a potential (DescriptiveComplexity.isCircuit_of_potential): the position of the vertex in the other circuit.

The three copies of a vertex.

  • i : T3

    The entry copy.

  • m : T3

    The middle copy.

  • o : T3

    The exit copy.

Instances For
    Dependency graph
    @[instance_reducible]
    Equations
    Dependency graph
    @[instance_reducible]
    Equations
    • One or more equations did not get rendered due to their size.
    Dependency graph
    Dependency graph
    Dependency graph
    def DescriptiveComplexity.Split.SEdge {A : Type} (R : A → A → Prop) (p q : T3 × A) :

    The edges of the split graph.

    Equations
    Instances For
      Dependency graph
      theorem DescriptiveComplexity.Split.sedge_symm {A : Type} {R : A → A → Prop} {p q : T3 × A} (h : SEdge R p q) :
      SEdge R q p
      Dependency graph

      From a directed circuit to a circuit of the split graph #

      theorem DescriptiveComplexity.Split.isCircuit_sarc {A : Type} [Finite A] [Nonempty A] {R Nxt : A → A → Prop} (h : IsCircuit R Nxt) :
      IsCircuit (SEdge R) (SArc Nxt)

      A directed circuit, split, is a circuit of the split graph.

      Dependency graph

      From a circuit of the split graph to a directed circuit #

      theorem DescriptiveComplexity.Split.through_m {A : Type} [Finite A] {R : A → A → Prop} {N : T3 × A → T3 × A → Prop} (hN : IsCircuit (SEdge R) N) (x : A) :

      The circuit passes through the middle copy of a vertex, one way or the other.

      Dependency graph
      theorem DescriptiveComplexity.Split.forward_all {A : Type} [Finite A] {R : A → A → Prop} {N : T3 × A → T3 × A → Prop} (hN : IsCircuit (SEdge R) N) {x₀ : A} (h₀ : N (T3.i, x₀) (T3.m, x₀)) (x : A) :

      If one vertex is traversed forward, all are.

      Dependency graph
      theorem DescriptiveComplexity.Split.exists_circuit_of_forward {A : Type} [Finite A] {R : A → A → Prop} {N : T3 × A → T3 × A → Prop} [Nonempty A] (hN : IsCircuit (SEdge R) N) (hfwd : ∀ (x : A), N (T3.i, x) (T3.m, x)) :
      (IsCircuit R fun (x y : A) => N (T3.o, x) (T3.i, y)) ∧ ∀ (p q : T3 × A), N p q ↔ SArc (fun (x y : A) => N (T3.o, x) (T3.i, y)) p q

      A forward circuit of the split graph is a split directed circuit.

      Dependency graph

      The correspondence #

      theorem DescriptiveComplexity.Split.sarc_sym_iff {A : Type} {Nxt : A → A → Prop} (x y : A) :
      SArc Nxt (T3.o, x) (T3.i, y) ∨ SArc Nxt (T3.i, y) (T3.o, x) ↔ Nxt x y

      A split relation is read back on its exit-to-entry arcs.

      Dependency graph
      noncomputable def DescriptiveComplexity.Split.splitEquiv {A : Type} [Finite A] [Nonempty A] (R : A → A → Prop) :
      { Nxt : A → A → Prop // IsCircuit R Nxt } ≃ { E : T3 × A → T3 × A → Prop // IsUCircuit (SEdge R) E }

      The undirected circuits of the split graph are the directed circuits of the graph, bijectively.

      Equations
      • One or more equations did not get rendered due to their size.
      Instances For
        Dependency graph

        The interpretation #

        Dependency graph

        The interpretation splitting each vertex of a digraph in three.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          Dependency graph

          The interpreted universe is three copies of the input.

          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            Dependency graph
            Dependency graph

            #Directed Hamilton Circuit reduces parsimoniously to #Hamilton Circuit, by splitting each vertex in three; no order and no domain formula are needed.

            Equations
            • One or more equations did not get rendered due to their size.
            Instances For
              Dependency graph
              Dependency graph

              #Hamilton Circuit is parsimoniously #P-complete: counting the Hamilton circuits of an undirected graph, as sets of edges. Registered in the Lax archive as Lax280166.HamCircuitComplete.sharpHamCircuit_sharpP_parsimoniousComplete.

              Dependency graph

              SharpHamCircuit is #P-complete: parsimoniously, hence under subtractive reductions.

              Dependency graph