因式分解:给定整数N,找到两个小于N的正整数a和b(1 < a, b < N),使得它们的乘积等于N。如果这样的a和b不存在,那么N是一个质数。
我知道判断质数可以用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))。
因式分解:给定整数N,找到两个小于N的正整数a和b(1 < a, b < N),使得它们的乘积等于N。如果这样的a和b不存在,那么N是一个质数。
我知道判断质数可以用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))。
单个数字的输入大小是通过其二进制表示的长度来衡量的。准确地说,输入数值n
的大小与log_2(n)
成比例。因此,您的算法运行时间为指数级。
例如,假设我们正在使用您的算法分解一个数字N
。如果N
是质数,则您至少需要测试sqrt(N)
个因子。(或者您可以为此计算一个素数表,但仍然不是线性的)。
无论如何,您会进行sqrt(N)
次测试。但问题的规模定义为S=log2(N)
。所以我们有N=2^S
。因此它是一个sqrt(2^S)=2^(S/2)
,这是指数级的。
V
的值数组的 O(logV)
部分,则必须进行替换。O(NlogN)
的反函数并不简单,可能会引起混淆。此外,在 N
和 NlogN
之间确实存在很小的差异,但在 1
、logN
和 N
之间却不是这样。 - phoeagon