为啥要在 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)
的反函数并非微不足道,可能会引起混淆。此外,N
和NlogN
之间确实存在细微差别,但1
、logN
和N
之间则不然。以上是关于为啥要在 NP 中分解,而不是在 P 中分解?的主要内容,如果未能解决你的问题,请参考以下文章