User talk:ForgeGod
Constructing the Integer Graph
[edit]Given a 3CNF-formula , let m be the number of clauses in and n be the number of variables in . We'll construct a weighted, directed graph such that (1) each satisfying assignment for will have a corresponding cycle cover in where the sum of the weights of each cycle cover will be and (2) all other cycle covers in will have weights summing to 0. Where is the number of satisfying assignments for , then, this graph will be such that the permanent of its adjacency matrix (which we can also denote as since there is a one-to-one mapping of such graphs to adjacency matrices) is . Thus, by solving Perm(), we will be able to determine the number of satisfying assignments of , .
To specify , we first note that for each of the n variables in , there is a variable node in . Additionally, for each of the m clauses in , there is a clause component in that functions as a sort of "black box." For present purposes, all that needs to be noted about is that it has 3 input edges and 3 output edges. The input edges come either from variable nodes or from previous clause components (e.g., for some ) and the output edges go either to variable nodes or to later clause components (e.g., for some ). The first input and output edges correspond with the first variable of the clause j, and so on. Thus far, we have specified all of the nodes that will appear in the graph .
Now for the edges. For each variable of , we'll make a true cycle (T-cycle) and a false cycle (F-cycle) in . To create the T-cycle, we start at the variable node for and draw an edge to the clause component that corresponds to the first clause in which appears. If is the first variable in the clause of corresponding to , this edge will be the first input edge of , and so on. Thence, we draw an edge to the next clause component corresponding to the next clause of in which appears, connecting it from the appropriate output edge of to the appropriate input edge of the next clause component. And so on. After the last clause in which appears, we connect the appropriate output edge of the corresponding clause component back to 's variable node. Of course, this completes the cycle. To create the F-cycle, we follow the same procedure but connect 's variable node to those clause components in which ~ appears and finally back to 's variable node. All of these edges outside the clause components we term external edges or, alternatively, muggle edges, and all of them have weight 1. Inside the clause components, we term the edges internal edges or, alternatively, magical Leprechaun edges. We don't need to worry about their weights for now. Now, clearly, every muggle edge is part of a T-cycle or an F-cycle (but not both--that would require magic, or at least inconsistency).
Note that the graph is of size linear in , so the construction can be done in polytime (assuming that the clause components don't cause trouble, which they don't).
A Very Nice Property of the Graph
[edit]Now, has the very nice property that its cycle covers correspond to variable assignments for . This property is very nice because if I were you I'd be rather angry if I read this far and didn't have this property, and we can take it for granted that I'm not doing this just to make you angry. Unless you're a muggle. Anyway, for a cycle cover Z of , we can say that Z induces an assignment of values for the variables in just in case Z contains all of the muggle edges in 's T-cycle and none of the muggle edges in 's F-cycle for all variables that the assignment makes true, and vice versa for all variables that the assignment makes false. Although any given cycle cover Z need not induce an assignment for , any one that does induces exactly one assignment, and the same assigment induced depends only on the muggle edges of Z.
The sort of Z's that don't induce assigments are the ones with cycles that "jump" inside the clause components. That is, if for every , at least one of 's input edges is in Z, and every output edge of the clause components is in Z when the corresponding input edge is in Z, then we can say that Z is proper with respect to each clause component, and we can be assured the Z will produce a satisfying assignment for . This is because proper Z's contain either the complete T-cycle or the complete F-cycle of every variable in as well as each including edges going into and coming out of each clause component. Thus, these Z's assign either true or false (but, of course, never both) to each and ensure that each clause is satisfied. Further, all such Z's have weight , and any other Z's have weight . The reasons for this depend on the construction of the clause components, and are outlined below.
The Clause Component
[edit]To understand the relevant properties of the clause components , we need one more notion: that of an M-completion. Recall that in the previous section, a cycle cover Z induced a satisfying assignment just in case its muggle edges satisfied certain properties. Now for any cycle cover of , we'll consider only its muggle edges, the subset M. So let M be a set of muggle edges. A set of Leprechaun edges L is an M-completion just in case is a cycle cover of . Further, denote the set of all M-completions by and the set of all resulting cycle covers of by .
Now, recall that construction of was such that each muggle edge had weight 1, so the weight of , the cycle covers resulting from any M, depends only on the Leprechaun edges involved. We add here the premise that the construction of the clause components is such that the sum over possible M-completions of the weight of the Leprechaun edges in each clause component, where M is proper relative to the clause component, is 12. Otherwise the weight of the Leprechaun edges is 0. (For now, we just specify this. Below, we give a reference to its proof.) Since there are m clause components, and the selection of sets of Leprechaun edges, L, within each clause component is independent of the selection of sets of Leprechaun edges in other clause components, so we can multiply everything to get the weight of . So the weight of each , where M induces a satisfying assignment, is . Further, where M does not induce a satisfying assignment, we know (from above) that M is not proper with respect to some , so the product of the weights of Leprechuan edges in will be .
As for an explicit construction of the clause components, I suggest you believe they are simply magic. However, for the skeptical among you, the clause component is a weighted, directed graph with 7 nodes with edges weighted and nodes arranged to yield the properties specified above. The adjacency matrix A for this graph is given in Appendix A of Ben-Dor and Halevi (1993); checking that A has the necessary properties is left as a trivial exercise for the interested reader.
Here, finally, we can get to the point of all this: since the sum of weights of all the cycle covers inducing any particular satisfying assignment is , and the sum of weights of all over cycle covers is 0, we have Perm(). Provided we can efficiently compute Perm() for our integer graph , our proof will be complete. The following section establishes the efficiency of this computation.
Invite
[edit]Gregbard 04:18, 14 July 2007 (UTC)
- Thanks. Challenge accepted.ForgeGod (talk) 19:08, 17 May 2014 (UTC)
AfD nomination of Permanent is sharp-P-complete
[edit]An article that you have been involved in editing, Permanent is sharp-P-complete, has been listed for deletion. If you are interested in the deletion discussion, please participate by adding your comments at Wikipedia:Articles for deletion/Permanent is sharp-P-complete. Thank you. --Tznkai (talk) 19:10, 15 December 2008 (UTC)