为啥要在 NP 中分解,而不是在 P 中分解?

Posted

技术标签:

【中文标题】为啥要在 NP 中分解,而不是在 P 中分解?【英文标题】:Why is factoring in NP, but not in P?为什么要在 NP 中分解,而不是在 P 中分解? 【发布时间】:2013-12-03 03:54:24 【问题描述】:

因式分解:给定一个整数 N,找到整数 1

我知道素数测试在 P 中,但为什么不考虑因式呢?

这是我的算法:

For each a = 1 ... sqrt(N)
    if(N % a == 0)
        b = N/a
        add (a,b) to the result
    Endif
EndFor

这在 O(sqrt(N)) 中运行。

【问题讨论】:

输入的大小是表示它所需的位数,而不是输入的值。 obligatory Wikipedia reference 如果您真的问为什么密码学有效而 RSA 之类的东西如此难以破解,那么您就错过了 分解。 多项式时间素性测试算法与这个算法完全不同,顺便说一句。 @phoeagon 如果在 SO 上发布了一个解决 P vs NP 问题的 6 班轮,那不是很神奇吗? 【参考方案1】:

单个数值的输入大小,通过其二进制表示的长度来衡量。准确地说,输入数值n 的大小与log_2(n) 成正比。因此,您的算法在指数时间内运行。

例如,假设我们使用您的算法分解一个数字N。如果N 是素数,您必须至少测试sqrt(N) 因素。 (或者您也可以为此计算一个素数表,但它仍然不是线性的)。

无论如何,您测试sqrt(N) 次。但是问题的大小定义为S=log2(N)。所以我们有N=2^S。因此它是一个sqrt(2^S)=2^(S/2),它是指数的。

【讨论】:

对不起,我仍然不明白为什么它是指数时间。所以,对于输入大小 N,它实际上是 2^N,你的意思是? @Nayana 算法运行在 O(sqrt(2^n)) = 大约 O(1.414^n),其中 n 是存储输入数 N 所需的位数(即 n = log2(N))。 @interjay 好的,知道了!输入大小非常小,因此与问题的大小相比,看似正常的时间也变成了指数:) @phoeagon 我认为 Abhishek Bansal 之前所说的也有点道理。假设我们传递一个数组并尝试在数组中找到一个特定的数字。一个问题的运行显然是O(N),但是问题的大小又是S=log2(N),因为它是通过它的二进制表示的长度来衡量的?这种解释使每个多项式时间算法都呈指数级...... @Nayana 或尝试这样想。单个数值作为输入的问题很可能是一个数学问题,因此预计会操纵巨大的数字。此外,如果我们考虑到小于V 的值数组中的O(logV) 部分,那么我们必须进行替换。 O(NlogN) 的反函数并非微不足道,可能会引起混淆。此外,NNlogN 之间确实存在细微差别,但1logNN 之间则不然。

以上是关于为啥要在 NP 中分解,而不是在 P 中分解?的主要内容,如果未能解决你的问题,请参考以下文章

Spark:如何在 pyspark 或 scala spark 中分解数据并添加列名?

我们可以使用 IN 语句在多个查询中分解 SQL 连接吗

从任意长的可迭代对象中分解元素(*式方法)

推荐系统推荐系统中分解共现矩阵的优点与局限性

在 Hive 中分解结构数组

在 Pandas 中分解多个列