如果我有决定问题A,并希望证明它是NP完全的。是否足以证明另一个NP完全问题多项式地减少到A,或者我必须证明另一个NP完全问题多项式转换为A?
也就是说,我可以显示
procedure solve_SAT
...
call solve_A
call solve_A
call solve_A
...
end
或者我只限于使用solve_A,如图所示
procedure solve_SAT
input = ...
result = call solve_A(input)
return result
end
我发现一些消息来源说前者,而其他消息来源说后者,这对我来说有点混乱。
答案 0 :(得分:2)
假设您有一个决策问题A,并且您希望证明它是NP-Complete,那么实现它的方法是,采用现有的NP-Complete问题并将其减少到A. 这里减少的意思是多项式时间减少。
所以假设你想表明3-SAT是NP-Complete,那么你可以显示SAT问题的减少。
这里要注意的重要一点是减少必须是多时间。是否多次调用solve_A()并不重要。只要您对solve_A()进行多项式调用,就可以选择多次调用solve_A()。
为什么会这样?你可以通过矛盾来证明这一点。 假设你有一个3SAT的多时间算法。那么你也可以在多时间解决SAT问题。由于对多项式函数的多项式数量的调用仍然是多项式的。 因此,除非P = NP,否则这意味着SAT也可以使用新发现的3SAT多时间算法在多项式时间内求解。但我们知道SAT是NP-Complete,因此3SAT也必须是NP-Complete。
简而言之,为了展示NP-Completeness,需要做两件事。
证书的存在。 从现有的NP-Complete问题中减少。
答案 1 :(得分:1)
如果你的solve_SAT程序只使用一定数量的solve_A调用,那么A的多项式时间算法就意味着SAT的多项式时间算法。这不符合SAT的确切定义,但这意味着除非P = NP,否则不存在A的多项式时间算法。
答案 2 :(得分:0)
今天确定的NP完全性的定义是,需要从已知NP完全问题到您的问题的多项式多次或Karp减少来显示NP完全性。这也称为多项式变换,对应于您只能调用一次solve_A函数的示例。
您的另一个示例,您可以在其中调用solve_A,多项式次数对应于图灵或库克减少。从NP完全问题到你的问题的图灵减少的存在证明了你的问题的NP-硬度,这被认为是与NP完全性不同的属性。