Documentation

Complexity.Computability.Circuit.Boolean.ACC0.Basic

Definition, divisibility monotonicity, and Boolean closure of ACC⁰ #

ACC⁰ (Cslib.Circuits.Boolean.ACC0) is the union of the modular constant-depth circuit classes AC0Mod q over all fixed moduli q ≥ 2 [Bar89], Vollmer, Chapter 4, Arora and Barak, Section 14.2: the languages over Bool decided at every input length by polynomial-size, constant-depth nonuniform circuits over negations, unbounded fan-in conjunctions and disjunctions, and unbounded fan-in MOD_q gates (modGate q). Since modGate 0 is disjunction and modGate 1 is the constant false, the union over all q : ℕ gives the same class (ACC0_eq_iUnion_AC0Mod).

Repeating each input wire of a MOD_q gate k ≥ 1 times multiplies the Hamming weight by k, and (w * k) % (q * k) = (w % q) * k, so a single MOD_{q * k} gate simulates a MOD_q gate (AC0Mod_subset_AC0Mod_mul_right, AC0Mod_subset_AC0Mod_of_dvd). Two circuits with moduli q₁ and q₂ therefore embed into the common modulus q₁ * q₂, making ACC0 closed under complement, intersection, and union (ACC0.compl, ACC0.inf, ACC0.sup). By Håstad's and Razborov–Smolensky's lower bounds for parity, AC0 ⊂ AC0Mod 2 ⊆ ACC0 (AC0_ssubset_AC0Mod_two, AC0_ssubset_ACC0) and AC0Mod p ⊂ ACC0 for every odd prime p (AC0Mod_ssubset_ACC0).

Main definitions #

Main results #

References #

Degenerate moduli q = 0, 1 and divisibility monotonicity for AC0Mod #

For q = 0, modGate 0 m tests whether the Hamming weight is nonzero, which is the unbounded disjunction .or m.

@[simp]
theorem Cslib.Circuits.Boolean.modGate_one (m : ℕ) (x : Fin m → Bool) :

For q = 1, modGate 1 m is the constant false.

For q = 2, modGate 2 m is the m-bit parity function parity m.

A circuit over the AC⁰ basis simulating an operation of AC⁰[0].

Instances For
    @[simp]

    AC⁰[0] = AC⁰: modulo 0, a MOD_0 gate is an unbounded OR gate.

    A circuit over the AC⁰ basis simulating an operation of AC⁰[1].

    Instances For
      @[simp]

      AC⁰[1] = AC⁰: modulo 1, a MOD_1 gate is the constant false.

      Repeating each of the m coordinates of x k times via finProdFinEquiv multiplies the Hamming weight by k.

      theorem Cslib.Circuits.Boolean.modGate_mul_right (q m : ℕ) {k : ℕ} (hk : 0 < k) (x : Fin m → Bool) :
      (modGate (q * k) (m * k) fun (j : Fin (m * k)) => x (finProdFinEquiv.symm j).1) = modGate q m x

      A MOD_q gate on m inputs is computed by a single MOD_{q * k} gate on m * k inputs when 0 < k, by repeating each input wire k times.

      A circuit over the AC⁰[q * k] basis simulating a single operation of AC⁰[q].

      Instances For
        theorem Cslib.Circuits.Boolean.AC0Mod_subset_AC0Mod_mul_right (q : ℕ) {k : ℕ} (hk : 0 < k) :
        AC0Mod q ⊆ AC0Mod (q * k)

        AC⁰[q] ⊆ AC⁰[q * k] for every k > 0: a MOD_{q * k} gate simulates a MOD_q gate by repeating each wire k times.

        theorem Cslib.Circuits.Boolean.AC0Mod_subset_AC0Mod_mul_left {k : ℕ} (hk : 0 < k) (q : ℕ) :
        AC0Mod q ⊆ AC0Mod (k * q)

        AC⁰[q] ⊆ AC⁰[k * q] for every k > 0.

        theorem Cslib.Circuits.Boolean.AC0Mod_subset_AC0Mod_of_dvd {q q' : ℕ} (hq' : 0 < q') (h : q ∣ q') :
        AC0Mod q ⊆ AC0Mod q'

        Divisibility monotonicity: if q ∣ q' and 0 < q', then AC⁰[q] ⊆ AC⁰[q'].

        Definition of ACC⁰ and closure properties #

        ACC⁰: the class of languages over Bool decided at every input length by constant-depth, polynomial-size circuits over negation, unbounded fan-in conjunction and disjunction, and unbounded fan-in MOD_q gates for some fixed modulus q ≥ 2 [Bar89], Vollmer, Chapter 4.

        Instances For

          Membership in ACC⁰: a language belongs to ACC0 iff it belongs to AC0Mod q for some modulus q ≥ 2.

          AC⁰ ⊆ ACC⁰: every AC⁰ language belongs to AC⁰[2] ⊆ ACC⁰.

          AC⁰[q] ⊆ ACC⁰ for every modulus q : ℕ (including q = 0, 1).

          ACC⁰ is the union of AC⁰[q] over all q : ℕ.

          Membership in ACC⁰ is equivalent to membership in AC⁰[q] for some q : ℕ.

          The modular counting language Language.ofSlices (modGate q) is in AC⁰[q].

          The modular counting language Language.ofSlices (modGate q) is in ACC⁰.

          AC⁰ is strictly contained in AC⁰[2].

          AC⁰ is strictly contained in ACC⁰.

          AC⁰[p] is strictly contained in ACC⁰ for every odd prime p, witnessed by parity [Raz87], [Smo87].

          The empty language is in AC⁰[q].

          The full language is in AC⁰[q].

          AC⁰[q] is closed under complement.

          theorem Cslib.Circuits.Boolean.AC0Mod.inf {q : ℕ} {L M : Language Bool} (hL : L ∈ AC0Mod q) (hM : M ∈ AC0Mod q) :
          L ⊓ M ∈ AC0Mod q

          AC⁰[q] is closed under intersection.

          theorem Cslib.Circuits.Boolean.AC0Mod.sup {q : ℕ} {L M : Language Bool} (hL : L ∈ AC0Mod q) (hM : M ∈ AC0Mod q) :
          L ⊔ M ∈ AC0Mod q

          AC⁰[q] is closed under union.

          The empty language is in ACC⁰.

          The full language is in ACC⁰.

          ACC⁰ is closed under complement.

          theorem Cslib.Circuits.Boolean.ACC0.inf {L M : Language Bool} (hL : L ∈ ACC0) (hM : M ∈ ACC0) :
          L ⊓ M ∈ ACC0

          ACC⁰ is closed under intersection: circuits with moduli q₁ and q₂ embed into AC⁰[q₁ * q₂].

          theorem Cslib.Circuits.Boolean.ACC0.sup {L M : Language Bool} (hL : L ∈ ACC0) (hM : M ∈ ACC0) :
          L ⊔ M ∈ ACC0

          ACC⁰ is closed under union: circuits with moduli q₁ and q₂ embed into AC⁰[q₁ * q₂].

          ACC⁰ ⊆ TC⁰ Vollmer, Chapter 4: every AC⁰[q] is contained in TC⁰.