I have a bunch of boolean functions, say $b_1,b_2,\dots,b_k \colon \{0,1\}^m \to \{0,1\}^n$, all given in terms of circuits.
I want to determine for which inputs they pairwise agree, that is, I want to compute, for all $b_i, b_j$ with $i \neq j$ the set $X_{i,j} \subseteq \{0,1\}^m$ of inputs such that $b_i(x) = b_j(x)$ for all $x \in X_{i,j}$ and $b_i(x) \neq b_j(x)$ for all $x \not\in X_{i,j}$. The question now is what is the most efficient way to do this in practice.
At the moment, my (naive) approach is to compute, for each pair $(i,j)$, the CNF-formula for $b_i \wedge b_j$ and then use a SAT solver to enumerate all models of this formula. This works but requires (at least) quadratically many SAT calls (at least one call for each pair $(i,j)$).
Now I am wondering if there is a better approach by transforming the $b_i$ first into some normal form, so that I can then compare these normal forms cheaply. One possibility would be to compute the full truth table for all $b_i$ (saved as a bitvector, for example). Then the comparison of $b_i$ and $b_j$ would boil down to simply AND-ing their bitvector representations (which is essentially for free). But the problem with this approach is that computing the full truth tables might be too expensive (when $m$ gets larger).
These two approach are somewhat orthogonal: The SAT approach requires little to no preprocessing but a lot of work for the comparisons. The truth table approach requires a lot of work for the preprocessing (= computing the truth tables), but the comparisons are then essentially for free.
Ideally, I am looking for some intermediate approach, where I put in some work in the beginning (computing some normal forms of the $b_i$) and then put in some work for the comparisons.
Anybody aware of any good approaches for my problem?