简单的方程求解

时间:2011-03-31 18:20:29

标签: algorithm math

想想如下的方程式系统:

a* = b + f + g
b* = a + c + f + g + h
c* = b + d + g + h + i
d* = c + e + h + i + j
e* = d + i + j   
f* = a + b + g + k + l
g* = a + b + c + f + h + k + l + m
h* = b + c + d + g + i + l + m + n
...  

a, b, c, ... element of { 0, 1 }
a*, b*, c*, ... element of { 0, 1, 2, 3, 4, 5, 6, 7, 8 }
+ ... a normal integer addition

给出了一些变量a,b,c ... a *,b *,c * ....我想在逻辑上尽可能多地计算其他变量(a,b,c ......但不是*,b *,c * ......)。

示例:

given: a = 0; b = 0; c = 0; 
given: a* = 1; b* = 2; c* = 1; 

a* = b + f + g          ==> 1 = 0 + f + g         ==> 1 = f + g
b* = a + c + f + g + h  ==> 2 = 0 + 0 + f + g + h ==> 2 = f + g + h
c* = b + d + g + h + i  ==> 1 = 0 + d + g + h + i ==> 1 = d + g + h + i

1 = f + g
2 = f + g + h     ==> 2 = 1 + h         ==> h = 1
1 = d + g + h + i ==> 1 = d + g + 1 + i ==> d = 0; g = 0; i = 0;

1 = f + g ==> 1 = f + 0 ==> f = 1

other variables calculated: d = 0; f = 1; g = 0; h = 1; i = 0;

有人能想出一种自动执行此操作的方法吗? 在这个例子中可能有蛮力,但后来大约有400个a,b,c ......变量和400个a *,b *,c * ......变量。

2 个答案:

答案 0 :(得分:4)

这听起来有点像constraint propogation。你可能会发现“Solving every Sudoku Puzzle”是一个很好的阅读,以获得一般的想法。

答案 1 :(得分:0)

问题是NP完全。看看方程组:

2 = a + c + d1
2 = b + c + d2
2 = a + b + c + d3

假设d1,d2,d3是仅使用一次的虚拟变量,因此不添加di = 0或di = 1的其他约束。因此,如果a = 0,则从第一个等式开始,c = 1。如果b = 0则从第二个等式得到c = 1,如果a = 1且b = 1则从第三个得到c = 0,因此我们得到关系

 c = a NAND b.

因此,我们可以使用这样的方程组来表达任何布尔电路,因此可以将布尔满足性问题简化为求解这样的方程组。