¿Por qué se considera difícil factorizar enteros grandes?

17

Leí en alguna parte que el algoritmo más eficiente encontró puede calcular los factores en tiempo, pero el código que he escrito es O ( n ) o posiblemente O ( n log n ) dependiendo de qué tan rápida sea la división y el módulo. Estoy bastante seguro de que he entendido mal algo en alguna parte, pero no estoy seguro de dónde. Esto es lo que escribí en forma de pseudocódigo.O(exp((64/9b)1/3(logb)2/3)O(n)O(nlogn)

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
EnderShadow
fuente
3
Google "pseudo polinomio".
Raphael
Ese algoritmo es realmente muy lento: si el número es un número primo, el ciclo se repite (número) veces. Hay un argumento muy simple que le permite salirse con las iteraciones sqrt (número).
gnasher729

Respuestas:

26

Está confundiendo el número con el número de bits necesarios para representar n . Aquí b = el número de bits necesarios para representar n (entonces b lg n ). Esto hace una diferencia enorme. Un algoritmo de tiempo O ( n ) es un algoritmo de tiempo O ( 2 b ) , exponencial en el número de bits. En comparación, el algoritmo "eficiente" que encontró tiene un tiempo de ejecución subexponencial en b .nnb=nblgnO(n)O(2b)b

Ejemplo: considere (2 millones). Entonces b = 21 bits son suficientes para representar el número n . Por lo tanto, un algoritmo que es O ( 2 b 1 / 3 ) será mucho más rápido que un algoritmo que es O ( 2 b ) . Un algoritmo O ( n ) cae en la última categoría, es decir, muy lento.n=2,000,000b=21nO(2b1/3)O(2b)O(n)

Ver https://en.wikipedia.org/wiki/Integer_factorization

DW
fuente
1
Sabía que era algo así de simple.
EnderShadow
3
b>1,000n>21,000O(n)n21,000
1

Tiene aproximadamente dos preguntas aquí, una general y una específica sobre su código. el específico se maneja en la otra respuesta. La pregunta general en el título sobre la complejidad de la factorización es muy profunda. desafortunadamente no hay evidencia científica sólida de que el factoring esté fuera de P aparte de (la mayoría de las veces circunstanciales) "muchos expertos lo han intentado y fallado" y algunos expertos conjeturan que está dentro de P; Es considerado como uno de los problemas abiertos más importantes (y muy difíciles de resolver) de la teoría de la complejidad. Después de décadas de "ataque pesado", los mejores algoritmos son exponenciales. la complejidad de factorización es uno de los "pocos problemas excepcionales" que se sabe que se encuentra "entre" P y NP completos, pero hasta ahora no se ha clasificado como ninguno.

Como se señaló, la complejidad no fue un gran problema hasta que se utilizó ("aproximadamente") en los criptosistemas RSA a mediados de la década de 1980, donde la seguridad criptográfica depende de la suposición. (otros dos puntos de datos relacionados "no exactamente alentadores": se demostró que el algoritmo Shors para la factorización cuántica del tiempo P y las pruebas de primalidad estaban en P a principios de la década de 2000 en el famoso / famoso algoritmo AKS ). Un posible resultado positivo sería que está en tiempo cuasipolinomial , que es más débil que NP completo (suponiendo que P ≠ NP y NP completo tiene un límite inferior exponencial de tiempo ) pero aún técnicamente "duro".

No he encontrado una gran encuesta sobre este tema clave hasta ahora. sin embargo ver también

vzn
fuente
Otro posible escenario de "caso límite" es que la factorización podría estar en P pero todavía no existe un algoritmo factible. también conocido como algoritmos galácticos
vzn
Cabe mencionar que RSA se trata de factorizar el producto de dos números primos grandes (donde alguien conoce los números primos y simplemente los multiplica, y otra persona recibe el producto y se supone que debe encontrar los números primos). Es concebible que pueda haber un algoritmo que pueda factorizar productos de dos números primos grandes, pero no productos de más de dos números primos grandes. Del mismo modo que la factorización de números que son números primos grandes (pero que no se sabía que eran números primos grandes) se puede hacer en tiempo polinómico.
gnasher729