Parsimonious reductions and #P-completeness #
A parsimonious reduction from a counting function f : α → ℕ to g : β → ℕ is a function
r : α → β, computable in polynomial time, that preserves counts exactly: f a = g (r a) for
every instance a Valiant, Arora and Barak, Section 17.3. A
counting function is #P-hard when every function in #P, with any encoding of its instances,
reduces to it parsimoniously, and #P-complete when it also belongs to #P.
Parsimonious reductions compose (ParsimoniousReducible.trans) and #P is closed under them
(ParsimoniousReducible.mem_SharpP, from exact-count precomposition SharpP.comp_mem).
Main definitions #
Cslib.Complexity.ParsimoniousReducible: parsimonious polynomial-time reductions.Cslib.Complexity.SharpPHard,Cslib.Complexity.SharpPComplete.
Main results #
Cslib.Complexity.ParsimoniousReducible.refl,Cslib.Complexity.ParsimoniousReducible.trans: parsimonious reducibility is a preorder.Cslib.Complexity.ParsimoniousReducible.mem_SharpP:#Pis closed under parsimonious reductions.Cslib.Complexity.SharpPHard.trans: hardness transfers along parsimonious reductions.
References #
Every function in #P, with any encoding of its instances, reduces parsimoniously to g. This
is HardUnder for ParsimoniousReducible.
Instances For
g is in #P and every function in #P reduces parsimoniously to it. This is CompleteUnder
for ParsimoniousReducible (sharpPComplete_iff_completeUnder), with its second conjunct stated as
SharpPHard.
Instances For
#P-hardness is hardness for #P under ParsimoniousReducible.
#P-completeness is completeness for #P under ParsimoniousReducible.
Every counting function reduces parsimoniously to itself by the identity function.
Parsimonious reductions compose.
#P-hardness transfers along a parsimonious reduction.