这个P!= NP证明缺少什么?

时间:2009-12-12 08:56:20

标签: p-np computer-science-theory

我试图恢复密码。考虑到这一点,我认识到“密码恢复”这个问题是NP问题的一个很好的例子。如果您知道密码,则很容易在多项式时间内验证密码。但是如果您不知道密码,则必须搜索可能显示为指数时间的整个空间。

现在我的问题是:这不是证明P!= NP,因为“密码恢复”是NP的一个元素,可以显示需要多于多项式时间才能运行?

7 个答案:

答案 0 :(得分:17)

如果您显示解决“密码恢复”的任何算法需要多于多项式时间,那么它确实证明P≠NP。

否则,如果您只显示一个特定解决方案需要的时间超过多项式时间,则不会显示任何内容。我可以编写一个需要指数时间的排序(随机数组,直到它被排序),但这并不意味着没有多项式解决方案。

答案 1 :(得分:7)

NP并不意味着“非多项式”,如果这就是你的想法(如果你不是,我会提前道歉!)。它意味着“非确定性多项式”。非确定性算法是等同于算法的无限数量的并行实例的算法。例如,通过暴力找到正确的密码是非确定性多项式:如果您想象检查密码,如果您的猜测恰好是正确的,则在密码长度上采用线性(即多项式)时间,但您需要并行检查任意数量的可能密码(k ^ n),然后使用这种方法找到解决方案的成本是非确定性多项式。

非确定性算法也可以被认为是一个状态在某些步骤分支的算法。一个简单的例子就是一个非确定性有限自动机(NFA) - 有时你不知道状态之间要采用什么边缘,所以你要把它们都拿走。很容易证明每个NFA都等同于一个确定性的FA,因此认为同样可以用于其他有趣的算法类别是很诱人的。不幸的是,对于多项式算法的一般情况很难这样做,而一般的怀疑是它们不等价,即P!= NP。

答案 2 :(得分:4)

问题出在NP的原因是正确的:如果可以在多项式时间内验证,则它在NP中。 NP中甚至非常简单的问题。基本上,所有P都包含在NP中。 (*)

现在,您可以通过以下方式将此转变为P!= NP的证据:

1)显示“密码恢复”是NP完全的。也就是说,NP中的任何问题都可以在多项式时间内减少为“密码恢复”。 (即有一种有效的算法可以将任何其他NP问题转换为“密码恢复”。)

2)然后,就像Pavel Shved所提到的那样,仅仅表明直观算法是非多项式是不够的。您必须证明不存在用于解决“密码恢复”的多项式算法。这是一项非常艰巨的任务。

(*)Edmund也是对的:NP表示非确定性机器上的多项式。多项式验证本质上是非确定性机器选择的路径。

答案 3 :(得分:2)

  1. 如上所述,“密码恢复”不是决策问题。
  2. 你还没有证明“密码恢复”没有多项式时间算法,你只是在直觉上论证它没有。仅仅因为解决方案空间巨大并不意味着没有快速的算法来找到解决方案;例如,一组n!个不同的整数有n个排列,但只有一个按升序排序,但我们可以在n log n时间找到它。有关更有趣的示例,请参阅Project Euler #67
  3. 即使您将“密码恢复”重新定义为决策问题并且能够证明没有多项式时间算法来解决它,您现在必须证明“密码恢复”是NP完全的。< / LI>

    有关P / NP /等的详细信息。见previous question

答案 4 :(得分:1)

问题并未显示密码恢复是非多项式的,因为显然它是 - 您必须搜索指数的答案空间。

实际上,“密码恢复”实际上并不是对标准computational problem的描述。似乎正式地,密码破解算法采用某种“oracle”来回答给定字符串是否是正确的密码。但是,P和NP是用图灵机定义的,它以字符串作为输入。

答案 5 :(得分:1)

此问题的正式声明将接受散列值(和salt)作为输入,并尝试查找将生成该散列的 密码:您的基本已知密文冲突查找问题。

根据哈希的质量,此可能不需要指数时间。实际上,广泛使用的许多密码散列已经识别出比密钥空间搜索运行得更快的攻击。<​​/ p>

也就是说:您(以及其他一些响应者)假设密码修改例程具有设计者希望他们拥有的所有属性。这必须证明

答案 6 :(得分:0)

写这个答案是因为我在某个时候有了这个想法,而且这里的答案并不令人满意。

你已经证明P = / = NP存在一个&#39; Oracle&#39; (这是告诉密码是否正确的事情。)

已经证明,你实际上无法通过使用Oracles来证明原始的P vs NP(这种技术被称为相对化)。

为了证明原始问题,您必须根据图灵机定义Oracle。换句话说,您必须描述密码验证程序对输入执行的操作,然后证明在给定密码验证程序代码的情况下,没有可以猜测密码的算法。

请注意,您必须为任何可能的快速密码验证程序执行此操作。密码验证器算法的唯一要求是它在密码长度方面以polinomial时间运行。

因此,考虑到在polinoomial时间内检查密码是否正确的任何可能的算法,你必须编写一个算法来读取验证者算法并尝试猜测密码是否在polinoomial时间。如果您能够证明或证明存在这样的算法,那么您已经解决了这个问题。