Parsimonious Reductions

A parsimonious reduction is a transformation from one problem to another problem such that the number of solutions is preserved. More precisely, a parsimonious reduction is a typical (polynomial time) many-one reduction that additionally does not increase the number of solutions in the transformed instance. Parsimonious reductions are used to prove hardness for counting complexity classes, such as $\#P$.

Definitions

For a formal definition of parsimonious reductions, we first define a computational problem as a tuple of a language with a corresponding solution set, which include the certificates encoded as strings of 0s and 1s.

Definition (Computational problem) A computational problem $\Pi$ is a tuple $(\mathcal{I},\mathcal{S})$, such that

There are several notions on parsimonious reductions. In general, a parsimonious reduction guarantees that the number of solutions of the first problem is in relation to the number of solutions of the second problem, which is typically referred to as weakly parsimonious. I.e. there is a function $f: \mathbb{N} \rightarrow \mathbb{N}$ mapping the number of solutions $n$ in the first problem to a number of solutions $f(n)$ in the second problem. The most strict definition is the following of strongly parsimonious reductions, which require a bijective mapping between the solutions of the instances, which is computable in polynomial time. Accordingly, strongly parsimonious reductions are also weakly parsimonious.

Definition (Strongly Parsimonious Reduction) Let $\Pi = (\mathcal{I},\mathcal{S})$ and $\Pi' = (\mathcal{I}',\mathcal{S}')$ be two computational problems. We say that there is a strongly parsimonious reduction from $\Pi$ to $\Pi'$, and write $\Pi \leq_{SPR} \Pi'$, if

Applications

Parsimonious reductions are used to show hardness for counting complexity classes. Among these are