Por que fatorar números inteiros grandes é considerado difícil?

17

I ler, que o algoritmo mais eficiente encontrado pode calcular os factores em o tempo, mas o código que escreveu é S ( n ) ou possivelmente O ( n log n ), dependendo da rapidez da divisão e do módulo.Tenho certeza de que não entendi algo em algum lugar, mas não sei onde. Aqui está o que escrevi em forma de pseudo-código.O(exp((64/9b)1/3(registrob)2/3)O(n)O(nregistron)

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
fonte
3
Google "pseudo polinomial".
Raphael
Esse algoritmo é realmente muito lento - se number for um número primo no loop enquanto itera (número) vezes. Há um argumento muito simples que permite escapar com iterações sqrt (número).
precisa saber é o seguinte

Respostas:

26

Você está confundindo o número com o número de bits necessários para representar n . Aqui b = o número de bits necessários para representar n (então b lg n ). Isso faz uma grande diferença. Um algoritmo de tempo O ( n ) é um algoritmo de tempo O ( 2 b ) - exponencial no número de bits. Em comparação, o algoritmo "eficiente" encontrado possui um tempo de execução subexponencial em b .nnb=nblgnO(n)O(2b)b

Exemplo: considere (2 milhões). Então b = 21 bits são suficientes para representar o número n . Assim, um algoritmo que é O ( 2 b 1 / 3 ) será muito mais rápida do que um algoritmo que é O ( 2 b ) . Um algoritmo O ( n ) se enquadra na última categoria, ou seja, muito lento.n=2,000,000b=21nO(2b1/3)O(2b)O(n)

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

DW
fonte
1
Eu sabia que era algo simples assim.
EnderShadow
3
@EnderShadow: Além disso, o tipo de números cuja factoring é considerado difícil utilizando hardware actualmente disponíveis, e por exemplo, usado na criptografia RSA, têm (ou seja, n > 2 mil ) ou menos. Como um exercício, assumindo que o seu computador pode executar o seu O ( n ) algoritmo, digamos, um bilhão de iterações por segundo, calcular quantos anos levaria para fator n 2 mil . (Se a sua reação inicial for "que não pode estar certa!", Você provavelmente já a calculou corretamente.)b>1.000n>21.000O(n)n21.000
Ilmari Karonen
1

você tem aproximadamente duas perguntas aqui, uma geral e uma específica sobre seu código. o específico é tratado na outra resposta. a pergunta geral no título sobre a complexidade do fatoramento é muito profunda. infelizmente, não há fortes evidências científicas de que o fatoramento esteja fora de P, exceto (a maioria das circunstâncias) "muitos especialistas tentaram e falharam" e alguns especialistas conjecturam que está dentro de P; é considerado um dos principais (e muito difíceis de resolver) problemas abertos da teoria da complexidade. após décadas de "ataque pesado", os melhores algoritmos são exponenciais. a complexidade da fatoração é um dos "poucos problemas excepcionais" que se sabe "entre" P e NP completo, mas ainda não foi classificado como até agora.

como é apontado, a complexidade não era muito problemática até ser usada ("aproximadamente") nos sistemas de criptografia RSA em meados da década de 1980, onde a segurança criptográfica depende da suposição. (outros dois pontos de dados relacionados "não exatamente encorajadores": o algoritmo Shors para fatoração quântica no tempo P e teste de primalidade foi comprovado em P no início dos anos 2000 no famoso / célebre algoritmo AKS .) um possível resultado positivo seria que está no tempo quase-polinomial , que é mais fraco que o NP completo (supondo que P ≠ NP e NP completo tenham um limite exponencial de tempo ), mas ainda tecnicamente "difícil".

até agora, não encontramos uma grande pesquisa sobre este assunto importante. no entanto, veja também

vzn
fonte
Outro possível cenário aparentemente "de ponta a ponta" é que o fatoramento poderia estar em P, mas ainda não existe um algoritmo viável. aka algoritmos galácticos
vzn
Deve-se mencionar que o RSA é sobre fatorar o produto de dois primos grandes (onde alguém conhece os primos e apenas os multiplica, e alguém recebe o produto e deve encontrá-los). É concebível que possa haver um algoritmo que possa fatorar produtos de dois primos grandes, mas não produtos com mais de dois primos grandes. Da mesma forma que números de fatoração que são números primos grandes (mas que não são conhecidos anteriormente como números primos grandes) podem ser feitos em tempo polinomial.
precisa saber é o seguinte