Toward Barrington's theorem: the group-theoretic core #
Barrington's theorem builds a width-5 permutation branching program for any
NC¹ formula by representing a Boolean function through a fixed non-identity
permutation. This module formalizes the reusable, group-theoretic heart of that
construction (roadmap track M3), independent of the eventual S₅ choice of
permutations.
The central notion is BP.Computes σ p f: the program p represents the
Boolean function f through the permutation σ, meaning it evaluates to σ
exactly when f holds and to 1 (the identity) otherwise. The closure lemmas
proved here are the moves in Barrington's inductive construction:
- conjugation changes the representing permutation, either by wrapping the
program (
Computes_conj) or pointwise with no length overhead (Computes_conjugate); - negation flips the function while inverting the permutation, either by
appending a constant (
Computes_not) or by folding that constant into the final instruction (Computes_not_compact); - the commutator trick (
Computes_and) representsf ∧ gthrough the commutator⁅σ, τ⁆— choosingσ, τto be5-cycles inS₅whose commutator is again a5-cycle is exactly what makes theANDgate work.
Main definitions and results #
BPInstr.inverse,BP.inverse,BP.eval_inverse— inverting a program inverts the permutation it evaluates to.BPInstr.const,BPInstr.eval_const— constant instructions.BPInstr.conjugate,BP.conjugate,BP.eval_conjugate— length-preserving pointwise conjugation.BPInstr.postMul,BP.postMul,BP.eval_postMul— fold a final constant into the last instruction, adding an instruction only to the empty program.BP.Computes,BP.Computes_conj,BP.Computes_not,BP.Computes_not_compact,BP.Computes_and.
A constant instruction applies the permutation c regardless of the input.
Equations
- Complexity.BPInstr.const c = { var := 0, perm0 := c, perm1 := c }
Instances For
A constant instruction always evaluates to its permutation.
Conjugate both branches of an instruction by the same permutation.
Equations
Instances For
Conjugate every instruction of a branching program. Unlike wrapping with constant instructions, this operation preserves length exactly.
Equations
Instances For
Pointwise conjugation preserves program length exactly.
Fold a final constant multiplication into the last instruction. The empty program has no last instruction, so it becomes a singleton constant program.
Equations
- p.postMul c = if p = [] then [Complexity.BPInstr.const c] else List.modifyLast (fun (ins : Complexity.BPInstr w) => ins.postMul c) p
Instances For
Folding a final constant uses the original length, except that an empty program needs one instruction.
Invert a branching program: reverse the instruction list and invert each instruction.
Equations
Instances For
Computes σ p f : the branching program p represents the Boolean function
f through the permutation σ — it evaluates to σ when f holds and to
the identity otherwise.
Equations
Instances For
Conjugation of the representing permutation. Wrapping a program between a
constant τ and a constant τ⁻¹ conjugates the permutation it represents.
Length-preserving conjugation. Conjugating every instruction changes the representing permutation without adding constant instructions.
Negation. Appending a constant σ⁻¹ to a program that represents f
through σ yields a program representing ¬f through σ⁻¹.
Compact negation. Multiplying the final selected permutation by σ⁻¹
represents ¬f through σ⁻¹. The multiplication is folded into the last
instruction, so the length becomes only max 1 p.length.
The commutator trick (Barrington's AND gate). If p represents f
through σ and q represents g through τ, then the commutator program
p q p⁻¹ q⁻¹ represents f ∧ g through the commutator ⁅σ, τ⁆.
When both f and g hold the four factors multiply to σ τ σ⁻¹ τ⁻¹ = ⁅σ, τ⁆;
if either fails, the corresponding factor collapses to 1 and the product
telescopes to the identity.
Base case — constant true. A single constant-σ instruction represents
the constant function true through σ.
Base case — a literal. The single instruction reading variable i, which
applies σ when the bit is true and the identity when it is false,
represents the projection fun α => α i through σ.
Disjunction is representable. By De Morgan (f ∨ g = ¬(¬f ∧ ¬g)), the
negation and commutator constructions combine to represent f ∨ g. With the
base cases (Computes_false, Computes_true, Computes_var) and negation,
this gives a functionally complete set of moves for width-w permutation
branching programs — the abstract engine of Barrington's induction.