## DNF counting

Define

- conjunction $m$ clauses
- each a disjunction

Complexity:

- $\SP$-complete.
- Define PRAS, FPRAS

Rare events

- Idea: choose random assignment, count satisfying fraction
- if $p$ small, huge sample size
- importance sampling biases samples toward event.

Coverage algorithm

- given $m$ sets $A_i \subseteq V$, count $\cup A_i$
- problem: random $a \in V$ too rarely satisfies
- Idea:
**Bias**sample to create better odds of interesting event- work in $\uplus A_i$
- size $n$ known
- can sample uniformly from it
- dense subset of right size
- “canonical” assignment is “first” copy of assignment for given clause
- canonical items number same as $\cup A_i$

- Analysis
- assignment $a$, satisfies $s_a$ clauses.
- $\sum_a (s_a/n)(1/s_a) = m/n$
- We know $n$, so can deduce $m$
- How many trials needed? Till get $O(\mu_{\epsilon\delta})$ success
- prob. OK at least $1/m$, so $\Olog(m)$ trials suff.

- unbiased estimator (expectation equals correct value)

### Counting Versus Generation

Counting via generation

- DNF-counting uses
*generation*to (approximately)*count* - Counting is basically probability estimation
- If can generate samples from known set
- Can estimate probability $p$ of event $A$
- As special case (uniform sampling), can count number of points in $A$

- Limiting factor: $p$ cannot be too small
- Sometimes can change sample space to achieve this

Converse: if you can count, you can generate

- Most basic, if can enumerate items in set, can pick one
- Because then you just need to pick a random integer
- And then map to corresponding enumerated item

Generalize beyond direct enumeration:

- e.g., generate a permutation
- could do an $n!$ enumeration
- instead, use knowledge that first item is uniformly distributed
- i.e., use
*counting*knowledge of how many samples have each first item - So, uniformly generate first item
- Then recurse (this is using self-reducibility)

- We already have a satisying assignment generator implicitly
- But suppose we just have a black box for counting satisfying assignments
- Count how many have $x_1$ true and how many have $x_1$ false
- Flip an appropriately biased coin to set $x_1$
- Recurse on other variables
- This approach works for any self-reducible problem

We'll dive deeper into this later.