为什么认为分解大整数很困难?


17

我在某处读到,发现最有效的算法可以计算时间的因数,但是我写的代码是或可能是具体取决于快速除法和模数。我敢肯定我在某个地方误解了一些东西,但是我不确定在哪里。这就是我以伪代码形式编写。O(exp⁡((64/9⋅b)1/3⋅(log⁡b)2/3)O(n)O(nlog⁡n)

function factor(number) -> list
    factors = new list
    if number < 0
        factors.append(-1)
        number = -number
    i = 2
    while i <= number
        while number % i == 0
            factors.append(i)
            number /= i
        i++
    return factors

3
Google“伪多项式”。
— 拉斐尔

该算法实际上非常慢-如果数字是质数,则在迭代(数字)次时循环。有一个非常简单的参数,可让您摆脱sqrt(数字)迭代的麻烦。
— gnasher729 2015年

Answers:


26

您正在将数字与表示n所需的位数混淆。这里b =以表示所需要的比特的数目Ñ(所以b ≈ LG Ñ)。这有很大的不同。甲ø (Ñ ) -time算法是Ô (2 b) -time算法-在比特数的指数。相比之下,您发现的“高效”算法的运行时间在b中为次幂。nnb=nb≈lg⁡nO(n)O(2b)b

n=2,000,000b=21nO(2b1/3)O(2b)O(n)

参见https://en.wikipedia.org/wiki/Integer_factorization


1
I knew it was something simple like that.
— EnderShadow

3
@EnderShadow: Also, the kind of numbers whose factoring is considered hard using currently available hardware, and used e.g. in RSA encryption, have b>1,000 (i.e. n>21,000) or so. As an exercise, assuming that you computer can run your O(n) algorithm at, say, one billion iterations per second, calculate how many years it would take to factor n≈21,000. (If your initial reaction is "that can't be right!", you've probably calculated it correctly.)
— Ilmari Karonen

1

您在这里大概有两个问题,一个关于您的代码的一般性问题和一个特定的问题。具体的一个在另一个答案中处理。标题中关于保理复杂性的一般问题非常深刻。不幸的是,没有(除大多数情况外)“很多专家尝试过并失败”以外,没有强大的科学证据表明保理是在P之外的,并且一些专家猜测它在P内;它被视为复杂性理论中最重要的(也是很难解决的)开放问题之一。经过数十年的“重击”,最佳算法是指数级的。分解复杂性是已知的“很少有的特殊问题”之一,它位于“完整的” P和NP 之间,但至今尚未归类。

如所指出的,直到1980年代中期RSA加密系统中使用(“大致”)复杂性才成为问题,其中加密安全性取决于假设。(另外两个“不太令人鼓舞”的相关数据点:在2000年代早期,著名/著名的AKS算法证明了用于P时间量子分解和素数测试的Shors算法已在P中使用。)可能的积极结果是,它的准多项式时间比NP complete弱(假设P≠NP和NP complete具有指数时间下限),但在技术上仍然“困难”。

到目前为止,尚未找到对此关键主题的出色调查。但是也可以


另一个看似“边缘情况”的可能情况是因式分解可以在P中进行,但仍然没有可行的算法。又名星系算法
— vzn

应该提到的是,RSA是关于分解两个大质数的乘积(有人知道质数并将它们相乘,而其他人被给予乘积并应该找到质数)。可以想象,可能有一种算法可以分解两个大素数的乘积,但不能分解两个以上大素数的乘积。正如大质数(但事先不知道是大质数)的因式分解可以在多项式时间内完成。
— gnasher729
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.