<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Prime Factorization on kenji.blog</title><link>http://kenji.blog/pt/tags/prime-factorization/</link><description>Recent content in Prime Factorization on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>pt</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 23:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/pt/tags/prime-factorization/index.xml" rel="self" type="application/rss+xml"/><item><title>Limites da Fatoração de Primos e Explicação da Notação Big O (O) da Complexidade Computacional</title><link>http://kenji.blog/pt/p/prime-factorization-limits-big-o-notation/</link><pubDate>Fri, 11 Sep 2026 23:00:00 +0900</pubDate><guid>http://kenji.blog/pt/p/prime-factorization-limits-big-o-notation/</guid><description>&lt;img src="http://kenji.blog/p/prime-factorization-limits-big-o-notation/img/eyecatch.jpg" alt="Featured image of post Limites da Fatoração de Primos e Explicação da Notação Big O (O) da Complexidade Computacional" />&lt;h1 id="introdução-por-que-a-fatoração-de-primos-é-difícil">Introdução: Por que a fatoração de primos é &amp;ldquo;difícil&amp;rdquo;?
&lt;/h1>&lt;p>Na sociedade moderna da internet, a razão pela qual podemos desfrutar de compras online e trocar informações confidenciais com segurança deve-se à existência da &amp;ldquo;tecnologia de criptografia&amp;rdquo;. E a base da segurança dessa tecnologia (especialmente a criptografia RSA, amplamente utilizada) baseia-se no fato matemático de que &amp;ldquo;a fatoração de números inteiros gigantes em primos é extremamente difícil&amp;rdquo;.&lt;/p>
&lt;p>À primeira vista, a fatoração de primos pode parecer uma tarefa simples, apenas &amp;ldquo;decompor um número em multiplicações de números primos&amp;rdquo;, mas à medida que o número de dígitos aumenta, ela se transforma em um problema tão difícil que mesmo o supercomputador mais rápido do mundo não conseguiria resolvê-lo, mesmo se operasse por dezenas ou centenas de anos. A fatoração de primos que normalmente aprendemos na escola é, no máximo, o simples trabalho de dividir por $2$, $3$ ou $5$, mas quando confrontada com o produto de primos desconhecidos com centenas de dígitos, essa abordagem simples desmorona completamente.&lt;/p>
&lt;p>Neste artigo, partiremos do conceito de &amp;ldquo;complexidade computacional (notação Big-O: $\mathcal{O}$)&amp;rdquo;, que é fundamental na ciência da informação e da computação, para explicar em detalhes, e de forma matemática, quanto tempo de computação é necessário para vários algoritmos de fatoração de primos (como a divisão por tentativa, algoritmo $\rho$ de Pollard, crivo do corpo de números geral, etc.). Em seguida, vamos desvendar minuciosamente por que a fatoração de primos de números gigantescos é praticamente impossível em computadores clássicos, como isso protege nossas informações e privacidade, e até como os computadores quânticos irão subverter essa premissa.&lt;/p>
&lt;hr>
&lt;h1 id="definição-rigorosa-de-complexidade-computacional-e-notação-big-o-mathcalo">Definição Rigorosa de Complexidade Computacional e Notação Big O ($\mathcal{O}$)
&lt;/h1>&lt;p>Ao avaliar o desempenho ou a eficiência de um algoritmo, não basta simplesmente medir o &amp;ldquo;tempo de execução do programa (em segundos)&amp;rdquo;. Isso ocorre porque o tempo de execução depende fortemente do desempenho do computador utilizado (frequência do clock da CPU, velocidade da memória, etc.), da linguagem de programação e da otimização do compilador.&lt;/p>
&lt;p>Portanto, a &lt;strong>Complexidade de Tempo (Time Complexity)&lt;/strong> é usada como uma métrica de avaliação universal independente de hardware ou ambiente, e a notação para expressá-la é a &lt;strong>Notação Big O (Big-O Notation)&lt;/strong>. A notação Big O é uma notação matemática que expressa como o tempo de execução (ou número de etapas de execução) de um algoritmo aumenta em relação ao tamanho dos dados de entrada $N$ quando este se torna muito grande (taxa de crescimento assintótico).&lt;/p>
&lt;h2 id="definição-matemática-da-notação-assintótica">Definição Matemática da Notação Assintótica
&lt;/h2>&lt;p>Na ciência da computação, para funções $f(n)$ e $g(n)$, $f(n) = \mathcal{O}(g(n))$ é matematicamente definido da seguinte forma:&lt;/p>
$$ \exists c > 0, \exists n_0 > 0 \text{ s.t. } \forall n \ge n_0, 0 \le f(n) \le c \cdot g(n) $$
&lt;p>Isso significa que &amp;ldquo;quando o tamanho da entrada $n$ é grande o suficiente ($n \ge n_0$), o crescimento da função $f(n)$ é limitado superiormente por algum múltiplo constante de $g(n)$&amp;rdquo;. Ou seja, indica um &amp;ldquo;Limite Superior (Upper Bound)&amp;rdquo; em que o tempo de processamento do algoritmo se enquadrará em um múltiplo constante de $g(n)$ mesmo no pior dos casos.&lt;/p>
&lt;p>Da mesma forma, há $\Omega$ (Big Omega) como uma notação que mostra o limite inferior, e $\Theta$ (Big Theta) como uma notação para quando os limites superior e inferior coincidem, mas geralmente, a notação $\mathcal{O}$ é a mais frequentemente usada ao discutir a complexidade computacional no pior caso de um algoritmo.&lt;/p>
&lt;h2 id="principais-classes-de-complexidade-computacional">Principais Classes de Complexidade Computacional
&lt;/h2>&lt;p>Existem várias classes representativas de complexidade computacional. Vamos analisá-las na ordem do menor tempo de execução (mais eficiente).&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>$\mathcal{O}(1)$ : Tempo constante (Constant time)&lt;/strong>
Um algoritmo cujo tempo de execução não muda independentemente de quão grande o tamanho da entrada $N$ se torne. Exemplos incluem acessar um valor especificando um índice de matriz, ou pesquisar em uma tabela hash (no caso ideal).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>$\mathcal{O}(\log N)$ : Tempo logarítmico (Logarithmic time)&lt;/strong>
Um algoritmo altamente eficiente em que, mesmo que o tamanho da entrada dobre, o tempo de execução aumenta apenas por uma constante. A &amp;ldquo;Busca Binária (Binary Search)&amp;rdquo;, que procura um valor desejado em uma matriz classificada, é um exemplo típico. Mesmo que a quantidade de dados seja de 1 bilhão, você pode encontrar os dados desejados com apenas cerca de 30 comparações.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>$\mathcal{O}(N)$ : Tempo linear (Linear time)&lt;/strong>
O tempo de execução aumenta em proporção ao tamanho da entrada. Se os dados aumentarem 10 vezes, o tempo também aumentará 10 vezes. A &amp;ldquo;Busca Linear&amp;rdquo;, que verifica todos os elementos de uma matriz sequencialmente, é um exemplo.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>$\mathcal{O}(N \log N)$ : Tempo linearítmico (Linearithmic time)&lt;/strong>
Embora seja ligeiramente mais lento que $\mathcal{O}(N)$, enquadra-se na categoria de eficiência. Muitos algoritmos de classificação práticos e de alta velocidade têm essa complexidade, como o Merge Sort e o Quick Sort (complexidade média).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>$\mathcal{O}(N^2)$ : Tempo polinomial / Tempo quadrático (Quadratic time)&lt;/strong>
Quando o tamanho da entrada dobra, o tempo de execução quadruplica, e se aumentar 10 vezes, aumenta 100 vezes. Processos simples usando loops duplos, Bubble Sort e Insertion Sort são exemplos. Quando o volume de dados excede dezenas de milhares, o processamento leva tempo. Essas complexidades computacionais expressas na forma de $\mathcal{O}(N^k)$ são chamadas coletivamente de &lt;strong>Tempo Polinomial (Polynomial time)&lt;/strong>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>$\mathcal{O}(2^N)$ : Tempo exponencial (Exponential time)&lt;/strong>
O tempo de execução dobra apenas adicionando 1 ao tamanho da entrada. É extremamente ineficiente e, apenas por $N$ chegar a 40 ou 50, o cálculo não terminará em um tempo realista, mesmo nos computadores mais avançados. Exemplos incluem a pesquisa exaustiva do problema da mochila (knapsack problem) ou abordagens simples para o problema do caixeiro-viajante.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>$\mathcal{O}(N!)$ : Tempo fatorial (Factorial time)&lt;/strong>
Aumenta ainda mais rápido do que $\mathcal{O}(2^N)$. São algoritmos que tentam todas as permutações, como no problema do caixeiro-viajante.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>O diagrama Mermaid a seguir é uma comparação esquemática da taxa de crescimento do tempo de execução (número de etapas) de cada complexidade computacional em relação ao aumento de $N$.&lt;/p>
&lt;div class="mermaid">graph TD
classDef poly fill:#a8e6cf,stroke:#333,stroke-width:2px;
classDef subexp fill:#ffd3b6,stroke:#333,stroke-width:2px;
classDef exp fill:#ffaaa5,stroke:#333,stroke-width:2px;
Poly["Tempo Polinomial O(n^k)"]:::poly
SubExp["Tempo Subexponencial L_n"]:::subexp
Exp["Tempo Exponencial O(2^n)"]:::exp
GNFS["GNFS (Crivo do Corpo de Números Geral)"]:::subexp
Pollard["Algoritmo rho de Pollard"]:::exp
Trial["Divisão por Tentativa"]:::exp
Easy["Viável (Realista)"]:::poly
Hard["Intratável (Difícil)"]:::exp
Poly --- Easy
Exp --- Hard
Trial --> Exp
Pollard --> Exp
GNFS --> SubExp
Poly -.-> SubExp
SubExp -.-> Exp&lt;/div>
&lt;p>Acredito que agora você entende o quão importante é a diferença na complexidade computacional na seleção de algoritmos. Na tecnologia de criptografia, o fato de os problemas exigirem &amp;ldquo;tempo exponencial&amp;rdquo; ou &amp;ldquo;complexidades computacionais próximas a isso&amp;rdquo; (ou seja, problemas que não são fáceis de resolver) é usado intencionalmente para garantir a segurança.&lt;/p>
&lt;hr>
&lt;h1 id="a-estrutura-da-criptografia-rsa-e-o-problema-da-fatoração-de-primos">A Estrutura da Criptografia RSA e o Problema da Fatoração de Primos
&lt;/h1>&lt;p>Para entender por que a fatoração de primos é importante, vamos rever brevemente a estrutura da criptografia RSA. A criptografia RSA é um sistema de criptografia de chave pública desenvolvido em 1977 por três pessoas: Ronald Rivest, Adi Shamir e Leonard Adleman.&lt;/p>
&lt;h3 id="etapas-de-geração-de-chaves">Etapas de Geração de Chaves
&lt;/h3>&lt;ol>
&lt;li>Dois números primos muito grandes, $p$ e $q$, são selecionados aleatoriamente. (Por exemplo, cada um com 1024 bits de comprimento)&lt;/li>
&lt;li>Eles são multiplicados para calcular $N = p \times q$. Este $N$ é divulgado para o mundo inteiro como parte da chave pública. (Terá 2048 bits de comprimento)&lt;/li>
&lt;li>Calcula-se a função totiente de Euler $\phi(N) = (p-1)(q-1)$.&lt;/li>
&lt;li>Um número inteiro $e$ co-primo de $\phi(N)$ é escolhido, e isso também se torna a chave pública.&lt;/li>
&lt;li>Calcula-se a chave privada $d$ tal que $e \times d \equiv 1 \pmod{\phi(N)}$.&lt;/li>
&lt;/ol>
&lt;p>O que é extremamente importante aqui é o fato de que &lt;strong>&amp;ldquo;para descriptografar a mensagem, é necessária a chave privada $d$, e para calcular $d$, $\phi(N)$ é necessário, e para calcular $\phi(N)$, $N$ deve ser fatorado em primos $p$ e $q$&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>A multiplicação de números primos gigantescos $p \times q$ termina num instante, mas descobrir os $p$ e $q$ originais (fatorá-los) a partir do resultado $N$ é irremediavelmente difícil. Essa propriedade de &amp;ldquo;função de via única (One-way function)&amp;rdquo; é o próprio núcleo da criptografia RSA.&lt;/p>
&lt;p>Existe um ponto muito importante a se notar aqui. O &amp;ldquo;tamanho da entrada $n$&amp;rdquo; no problema de fatoração não é o tamanho do próprio número $N$, mas &amp;ldquo;o número de bits necessários para representar o número $N$&amp;rdquo;.
Se o número de dígitos ao expressar o inteiro $N$ em formato binário for $n$, então $n \approx \log_2 N$. Em outras palavras, a complexidade computacional do algoritmo deve ser avaliada não em relação a $N$, mas em relação a $n = \log_2 N$ (ou $\ln N$).&lt;/p>
&lt;hr>
&lt;h1 id="história-e-complexidade-dos-algoritmos-de-fatoração-de-primos">História e Complexidade dos Algoritmos de Fatoração de Primos
&lt;/h1>&lt;p>A partir daqui, explicaremos em detalhes os mecanismos e as complexidades computacionais de vários algoritmos que decompõem um dado número composto $N$ em um produto de números primos. É também a história de como a humanidade tem desafiado os limites da fatoração de primos.&lt;/p>
&lt;h2 id="1-divisão-por-tentativa-trial-division">1. Divisão por Tentativa (Trial Division)
&lt;/h2>&lt;p>O algoritmo mais intuitivo e primitivo é o &amp;ldquo;método de divisão por tentativa&amp;rdquo;. É um método de testar sequencialmente se $N$ pode ser dividido por números primos a partir de $2$.&lt;/p>
&lt;h3 id="visão-geral-do-algoritmo">Visão Geral do Algoritmo
&lt;/h3>&lt;p>Ele utiliza a propriedade de que os fatores primos de $N$ nunca excederão no máximo $\sqrt{N}$ (como $\sqrt{N} \times \sqrt{N} = N$, qualquer fator primo maior do que isso será necessariamente pareado com um fator primo igual ou inferior a $\sqrt{N}$).
Portanto, verificamos se ele é divisível por todos os números (ou números primos) até $2, 3, 5, 7, \dots, \lfloor\sqrt{N}\rfloor$.&lt;/p>
&lt;h3 id="avaliação-da-complexidade-computacional">Avaliação da Complexidade Computacional
&lt;/h3>&lt;p>No pior dos casos (por exemplo, quando $N$ é o produto de dois grandes primos), é necessário realizar divisões até $\sqrt{N}$.
Como mencionado acima, o tamanho da entrada $n$ é $n = \log_2 N$, portanto, pode ser expresso como $N = 2^n$.
Consequentemente, o número máximo de passos computacionais é proporcional a:&lt;/p>
$$ \sqrt{N} = \sqrt{2^n} = (2^n)^{1/2} = 2^{n/2} $$
&lt;p>Isso significa que, para um comprimento de bit $n$, a complexidade computacional é &lt;strong>$\mathcal{O}(2^{n/2})$&lt;/strong>. Em outras palavras, a divisão por tentativa é um &lt;strong>&amp;ldquo;algoritmo de tempo exponencial puro&amp;rdquo;&lt;/strong> em relação a $n$.
Para cada aumento de 1 bit (o número dobra), o tempo de computação é multiplicado por aproximadamente $\sqrt{2} \approx 1.414$. Se $N$ for um número que excede 1024 bits (cerca de 300 dígitos decimais), os cálculos não terminariam nem mesmo se o tempo gasto equivalesse à idade do universo.&lt;/p>
&lt;h2 id="2-método-de-fatoração-de-fermat-fermats-factorization-method">2. Método de Fatoração de Fermat (Fermat&amp;rsquo;s Factorization Method)
&lt;/h2>&lt;p>Este é um método concebido pelo matemático do século 17, Pierre de Fermat. Dado um número composto ímpar $N$, ele tenta expressar $N$ como a diferença de dois quadrados perfeitos.&lt;/p>
$$ N = x^2 - y^2 = (x - y)(x + y) $$
&lt;p>Se tais $x$ e $y$ forem encontrados, $a = x - y$ e $b = x + y$ se tornam os fatores de $N$.
No algoritmo, incrementamos sequencialmente $x$ a partir de $\lceil \sqrt{N} \rceil$ e verificamos se $x^2 - N$ é um quadrado perfeito (o quadrado de algum número inteiro $y$).
Este método funciona extremamente rápido quando os dois fatores primos $p$ e $q$ são valores muito próximos. No entanto, em um caso geral (onde $p$ e $q$ são valores aleatoriamente distantes um do outro), ele acaba exigindo o mesmo tempo exponencial do método da divisão por tentativa.&lt;/p>
&lt;h2 id="3-algoritmo-rho-de-pollard-pollards-rho-algorithm">3. Algoritmo $\rho$ de Pollard (Pollard&amp;rsquo;s rho algorithm)
&lt;/h2>&lt;p>Um dos algoritmos criados para romper as barreiras do método de divisão por tentativa foi o &amp;ldquo;algoritmo $\rho$ (rho) de Pollard&amp;rdquo;, publicado por John Pollard em 1975.&lt;/p>
&lt;h3 id="visão-geral-do-algoritmo-1">Visão Geral do Algoritmo
&lt;/h3>&lt;p>Este método aplica o conceito probabilístico chamado &amp;ldquo;Paradoxo do Aniversário (Birthday Paradox)&amp;rdquo; e a periodicidade de sequências de números pseudoaleatórios (o fato de a sua forma lembrar a letra grega $\rho$ é a origem do nome).&lt;/p>
&lt;p>Ele gera uma sequência usando alguma função de geração de números pseudoaleatórios $f(x) = (x^2 + 1) \pmod N$, e encontra dois valores dentro da sequência tais que $x_i \equiv x_j \pmod p$ ($p$ sendo um fator primo desconhecido de $N$).
Neste momento, $x_i - x_j$ é um múltiplo de $p$, portanto, ao calcular o máximo divisor comum $\gcd(|x_i - x_j|, N)$, é possível extrair $p$ (ou seja, o fator primo de $N$) com alta probabilidade. Combinando-o com o algoritmo de detecção de ciclos de Robert Floyd (o algoritmo da lebre e da tartaruga), ele calcula eficientemente, limitando o uso de memória a $\mathcal{O}(1)$.&lt;/p>
&lt;h3 id="avaliação-da-complexidade-computacional-1">Avaliação da Complexidade Computacional
&lt;/h3>&lt;p>Sabe-se que o número de passos necessários para o algoritmo $\rho$ de Pollard encontrar um fator primo $p$ é de aproximadamente $\mathcal{O}(\sqrt{p})$.
No pior caso (quando $N$ é o produto de dois primos do mesmo tamanho $p$ e $q$, resultando em $p \approx \sqrt{N}$), a complexidade é $\mathcal{O}(N^{1/4})$.&lt;/p>
&lt;p>Expresso em termos do tamanho da entrada $n = \log_2 N$:&lt;/p>
$$ N^{1/4} = (2^n)^{1/4} = 2^{n/4} $$
&lt;p>Portanto, a complexidade computacional é &lt;strong>$\mathcal{O}(2^{n/4})$&lt;/strong>.
Em comparação com $\mathcal{O}(2^{n/2})$ da divisão por tentativa, houve uma aceleração drástica e, na prática, é um algoritmo incrivelmente poderoso para decompor números de escala média (dezenas de dígitos). No entanto, ele ainda não superou a barreira do &amp;ldquo;tempo exponencial&amp;rdquo; em relação ao comprimento de bit $n$, sendo impotente contra números gigantescos de 2048 bits (cerca de 600 dígitos em base decimal), como os usados na criptografia RSA.&lt;/p>
&lt;h2 id="4-crivo-quadrático-de-múltiplos-polinômios-mpqs-multiple-polynomial-quadratic-sieve">4. Crivo Quadrático de Múltiplos Polinômios (MPQS: Multiple Polynomial Quadratic Sieve)
&lt;/h2>&lt;p>Na década de 1980, Carl Pomerance inventou o &amp;ldquo;Crivo Quadrático (Quadratic Sieve: QS)&amp;rdquo;. É uma extensão do conceito de &amp;ldquo;diferença de quadrados&amp;rdquo; de Fermat.
O método de Fermat procurava diretamente por $x^2 - y^2 = N$, mas o crivo quadrático busca uma condição mais branda.&lt;/p>
$$ x^2 \equiv y^2 \pmod N $$
&lt;p>
e
&lt;/p>
$$ x \not\equiv \pm y \pmod N $$
&lt;p>Se conseguirmos encontrar tal par de $x$ e $y$, então $x^2 - y^2 = (x - y)(x + y)$ será um múltiplo de $N$. Assim, calculando $\gcd(x - y, N)$ ou $\gcd(x + y, N)$, podemos obter um fator primo não trivial de $N$.&lt;/p>
&lt;p>No crivo quadrático, nós buscamos extensivamente por $x$ tal que $x^2 \pmod N$ seja um &amp;ldquo;número cujos fatores primos contêm apenas primos pequenos (que é chamado de número $B$-suave)&amp;rdquo;, e alinhamos os resultados de sua fatoração em forma de matriz (um sistema de equações lineares sobre o campo binário $\mathbb{F}_2$). Em seguida, multiplicamos as múltiplas relações usando a eliminação de Gauss e afins, e construímos $x^2 \equiv y^2 \pmod N$ ajustando de forma que o lado direito seja um quadrado perfeito (onde o expoente de cada fator primo é par).&lt;/p>
&lt;p>O crivo quadrático era o algoritmo mais rápido do mundo antes do surgimento do crivo do corpo de números geral, e ainda é considerado o método mais rápido da atualidade para a fatoração de números com 100 dígitos ou menos.&lt;/p>
&lt;h2 id="5-aprofundamento-no-crivo-do-corpo-de-números-geral-general-number-field-sieve-gnfs">5. Aprofundamento no Crivo do Corpo de Números Geral (General Number Field Sieve: GNFS)
&lt;/h2>&lt;p>Atualmente, aquele considerado &amp;ldquo;o mais rápido do mundo&amp;rdquo; na fatoração de primos para números gigantes com mais de 100 dígitos é o &lt;strong>Crivo do Corpo de Números Geral (GNFS)&lt;/strong>. Foi concebido no final da década de 1980, e é um algoritmo muito avançado que utiliza descobertas profundas da teoria algébrica dos números (corpos de números), desenvolvendo ainda mais o crivo quadrático.&lt;/p>
&lt;p>Quando se trata de ataques à criptografia RSA (fatoração de primos a partir de chaves públicas), o GNFS é aquele que continua constantemente a quebrar recordes mundiais. Houve um relatório de que em 2020 foi bem-sucedida a fatoração em primos de um número composto de 829 bits (250 dígitos decimais) (RSA-250), mas isso exigiu o funcionamento em paralelo de uma rede de milhares de computadores por um longo período de tempo.&lt;/p>
&lt;h3 id="estrutura-matemática-do-algoritmo">Estrutura Matemática do Algoritmo
&lt;/h3>&lt;p>O GNFS é bastante complexo, mas basicamente progride seguindo estas etapas:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Seleção de Polinômio (Polynomial Selection):&lt;/strong>
Para $N$, selecionamos um certo inteiro $m$ e um polinômio irredutível $f(X)$ com coeficientes pequenos tal que $f(m) \equiv 0 \pmod N$. Isso define um anel de inteiros $\mathbb{Z}[\alpha]$ do corpo algébrico (corpo de números) pela adjunção de uma raiz $\alpha$ de $f(X)$.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Crivagem (Sieving):&lt;/strong>
Procuramos números suaves simultaneamente em &amp;ldquo;dois mundos diferentes&amp;rdquo;: o anel de inteiros racionais $\mathbb{Z}$ sobre o corpo racional e o anel de inteiros algébricos $\mathbb{Z}[\alpha]$ sobre o corpo algébrico. Especificamente, buscamos massivamente pares $(a, b)$ onde as normas do inteiro racional $a - bm$ e do inteiro algébrico $a - b\alpha$ possam ser completamente decompostas sobre um conjunto predeterminado de primos pequenos (Base de Fatores: Factor Base).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Redução de Matriz (Matrix Reduction):&lt;/strong>
Representamos o imenso número de pares suaves encontrados como uma matriz (uma enorme matriz esparsa). Determinamos o espaço solução sobre o campo binário $\mathbb{F}_2$ usando o algoritmo de Lanczos (por exemplo, método de Lanczos em bloco). Não é incomum que essas matrizes atinjam proporções de milhões de linhas por milhões de colunas.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Cálculo da Raiz Quadrada (Square Root):&lt;/strong>
Das soluções da matriz, construímos quadrados gigantes em cada um dos &amp;ldquo;dois mundos diferentes&amp;rdquo;, para finalmente deduzir a relação $X^2 \equiv Y^2 \pmod N$. E então calculamos $\gcd(X-Y, N)$ para obter o fator primo.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="complexidade-computacional-do-crivo-do-corpo-de-números-geral-tempo-subexponencial-sub-exponential-time">Complexidade Computacional do Crivo do Corpo de Números Geral: Tempo Subexponencial (Sub-exponential time)
&lt;/h3>&lt;p>A maior conquista do GNFS foi reduzir a complexidade computacional da fatoração de primos de um &amp;ldquo;tempo exponencial puro&amp;rdquo; para um &lt;strong>&amp;ldquo;tempo subexponencial (Sub-exponential time)&amp;rdquo;&lt;/strong>.
A complexidade de tempo assintótica do GNFS é expressa através do uso de uma notação especial chamada notação L (L-notation) da seguinte forma:&lt;/p>
$$ L_N[\gamma, c] = \exp\left( (c + o(1)) (\ln N)^\gamma (\ln \ln N)^{1-\gamma} \right) $$
&lt;p>Onde, $N$ é o número a ser fatorado e $\ln$ é o logaritmo natural.
$\gamma$ é um parâmetro que assume o valor $0 \le \gamma \le 1$, e indica o &amp;ldquo;grau&amp;rdquo; de complexidade do algoritmo.&lt;/p>
&lt;ul>
&lt;li>Quando $\gamma = 0$, $L_N[0, c]$ se torna $(\ln N)^c$, implicando tempo polinomial $\mathcal{O}(n^c)$. (Eficiente)&lt;/li>
&lt;li>Quando $\gamma = 1$, $L_N[1, c]$ se torna $e^{c \ln N} = N^c$, implicando tempo exponencial $\mathcal{O}(2^{cn})$. (Ineficiente)&lt;/li>
&lt;/ul>
&lt;p>No caso do GNFS, este parâmetro torna-se o seguinte:&lt;/p>
$$ L_N\left[\frac{1}{3}, \left(\frac{64}{9}\right)^{1/3}\right] = e^{\left(\sqrt[3]{\frac{64}{9}} + o(1)\right) (\ln N)^{1/3} (\ln \ln N)^{2/3}} $$
&lt;p>Nesta equação, a constante $c = (64/9)^{1/3} \approx 1.923$.
Reescrevendo em termos de tamanho de entrada $n \approx \ln N$ (proporcional ao comprimento do bit), o comportamento da complexidade computacional se assemelha aproximadamente a:&lt;/p>
$$ \mathcal{O}\left( \exp\left( 1.923 \cdot n^{1/3} (\ln n)^{2/3} \right) \right) $$
&lt;p>Você pode ver que a parte do expoente não depende de $n$ à potência de 1, mas depende de $n^{1/3}$ (a raiz cúbica de $n$).
Enquanto o algoritmo $\rho$ de Pollard possuía $\mathcal{O}(2^{n/4})$, isto é, $\mathcal{O}(\exp(c \cdot n^1))$, no GNFS o grau de $n$ foi reduzido para $1/3$.
Isto significa que, embora não tenha chegado ao tempo polinomial ($\gamma=0$), o aumento da complexidade é consideravelmente mais brando do que o do tempo exponencial puro ($\gamma=1$). Este é o motivo de ser chamado de &amp;ldquo;tempo subexponencial&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h1 id="os-limites-da-criptografia-moderna-e-os-computadores-quânticos">Os Limites da Criptografia Moderna e os Computadores Quânticos
&lt;/h1>&lt;p>Como vimos, a humanidade conseguiu evoluir os algoritmos da divisão por tentativa para o GNFS, concentrando seu brilhantismo matemático na tentativa de suplantar o obstáculo imposto pela fatoração. Contudo, mesmo com o GNFS, a fatoração de primos continua incapaz de ser resolvida em &amp;ldquo;tempo polinomial&amp;rdquo; num computador clássico.&lt;/p>
&lt;h2 id="o-problema-p-vs-np-e-a-posição-da-fatoração-de-primos">O Problema P vs NP e a Posição da Fatoração de Primos
&lt;/h2>&lt;p>Um dos maiores problemas não resolvidos da ciência da computação é a hipótese &amp;ldquo;P = NP&amp;rdquo;.
O problema de fatoração de primos pertence a NP (uma classe de problemas onde, uma vez fornecida uma resposta, a corretude pode ser testada em tempo polinomial), no entanto, não está provado que ele seja NP-completo (a classe de problemas mais complexos da categoria NP).
Adicionalmente, se ele pertence a P (uma classe de problemas solucionáveis em tempo polinomial, ou seja, onde existe um algoritmo em tempo polinomial), ainda não se sabe.&lt;/p>
&lt;p>Muitos estudiosos preveem que a fatoração de primos pertence a uma classe intermediária que não é P nem NP-completo (NP-intermediário). Se fosse descoberto um algoritmo em tempo polinomial (por exemplo, $\mathcal{O}(n^3)$) num computador clássico, seria um evento colossal que colapsaria sistemas de criptografia mundiais, mas até então tal algoritmo ainda não foi encontrado. Estima-se que decifrar a criptografia RSA-2048 exigiria mais tempo que o tempo de vida do universo, mesmo se o desempenho do computador clássico melhorasse consoante à lei de Moore.&lt;/p>
&lt;h2 id="o-computador-quântico-como-um-divisor-de-águas-algoritmo-de-shor">O Computador Quântico como um &amp;ldquo;Divisor de Águas&amp;rdquo;: Algoritmo de Shor
&lt;/h2>&lt;p>A criptografia RSA, robusta diante dos computadores clássicos, entra em um panorama diametralmente distinto com a viabilidade dos &amp;ldquo;computadores quânticos&amp;rdquo;, que funcionam baseados em princípios inteiramente diversos.
O &lt;strong>&amp;ldquo;Algoritmo de Shor (Shor&amp;rsquo;s algorithm)&amp;rdquo;&lt;/strong>, revelado por Peter Shor em 1994, utiliza a transformada quântica de Fourier para solucionar de maneira notável o problema da fatoração de primos em &lt;strong>tempo polinomial $\mathcal{O}(n^3)$&lt;/strong> (ou mais precisamente, requerendo no contexto das portas lógicas quânticas, cerca de $\mathcal{O}(n^2 \log n \log \log n)$).&lt;/p>
&lt;p>No diagrama Mermaid abaixo, note o contraste nas complexidades computacionais para algoritmos clássicos versus quânticos.&lt;/p>
&lt;div class="mermaid">graph LR
classDef classical fill:#f9f871,stroke:#333,stroke-width:2px;
classDef quantum fill:#00c9a7,stroke:#333,stroke-width:2px;
subgraph "Computadores Clássicos"
C1["Divisão por Tentativa: O(2^(n/2))"]:::classical
C2["GNFS: Subexponencial L_n(1/3)"]:::classical
end
subgraph "Computadores Quânticos"
Q1["Algoritmo de Shor: O(n^3) Polinomial"]:::quantum
end
C1 --> C2
C2 -. "Limite da Física Clássica" .-> Q1&lt;/div>
&lt;p>Com o algoritmo de Shor, o processo de &amp;ldquo;identificação de períodos&amp;rdquo;, um gargalo severo em algoritmos clássicos, é resolvido quase de modo imediato e contíguo via o emprego do emaranhamento quântico (quantum entanglement) e da sobreposição quântica integrados à &amp;ldquo;Transformada Quântica de Fourier (QFT)&amp;rdquo;.
Se este puder ser posto em marcha utilizando um computador quântico de dimensão viável (pouco ruído e abundância de qubits lógicos), assevera-se que a criptografia RSA-2048, outrora percebida como impenetrável, estaria sucumbindo por inteiro de horas até poucos dias.&lt;/p>
&lt;p>Face a semelhante prenúncio, analistas criptográficos ao redor do globo, aliados ao NIST (Instituto Nacional de Padrões e Tecnologia dos EUA), correm rapidamente para conduzir tarefas de padronização orientadas para a &amp;ldquo;Criptografia Pós-Quântica (Post-Quantum Cryptography: PQC)&amp;rdquo;, com o desafio de continuar sendo dificultoso de quebrar mesmo para os computadores quânticos. A Criptografia Baseada em Reticulados (Lattice-based cryptography) constitui um modelo preponderante disso, pois tem seus embasamentos protetivos calçados numa complexidade matemática fundamentalmente alheia à fatoração de primos (como no problema do vetor mais curto).&lt;/p>
&lt;hr>
&lt;h1 id="conclusão">Conclusão
&lt;/h1>&lt;p>Neste compêndio, investigamos mais profundamente abordando desde o limiar da complexidade (notação Big O), prosseguindo por todo o processo evolutivo dos algoritmos para fatorar números primos e até seus constrangimentos restritivos matemáticos.&lt;/p>
&lt;ul>
&lt;li>A &lt;strong>Notação Big O ($\mathcal{O}$)&lt;/strong> exprime o crescimento do número das etapas computacionais quando confrontado ao desenvolvimento do tamanho de entrada $n$, sendo um indicativo crítico em que perdura uma colossal barreira que no terreno prático é insuperável dividindo o tempo polinomial ao exponencial.&lt;/li>
&lt;li>O &lt;strong>método de divisão por tentativa&lt;/strong> e o &lt;strong>algoritmo $\rho$ de Pollard&lt;/strong> configuram-se algoritmos puros no estrato do &amp;ldquo;tempo exponencial&amp;rdquo; e demonstram incapacidade de lidar frente à números magnos.&lt;/li>
&lt;li>O &lt;strong>Crivo do Corpo de Números Geral (GNFS)&lt;/strong>, reputado o preeminente algoritmo clássico mais rápido do mundo até hoje, atinge um desempenho de &amp;ldquo;tempo subexponencial&amp;rdquo; servindo-se da intrincada Teoria Algébrica dos Números, não se qualificando ainda na ordem de tempo polinomial e resultando que números avantajados peçam de intervalos incrivelmente estratosféricos.&lt;/li>
&lt;li>Esse exato preceito (altamente considerado verossímil) do qual &lt;strong>&amp;ldquo;Um algoritmo clássico com capacidade para desatar as dificuldades num ritmo de tempo polinomial de fato é inexistente&amp;rdquo;&lt;/strong> afiança e atesta as engrenagens de segurança providas pelo RSA, amparando integralmente nosso atual tecido social e digital.&lt;/li>
&lt;li>Em contraponto a isso, atrelado com o vislumbramento propiciado por &lt;strong>computadores quânticos conjuntamente ao algoritmo de Shor&lt;/strong>, a viabilidade técnica no tangente à fatoração em ritmo de ordem polinomial passa agora a ser imaginável na área teórica, fazendo com que as ferramentas cifradas estejam em vias de uma contundente migração a favor de um ciclo futurista (a criptografia pós-quântica).&lt;/li>
&lt;/ul>
&lt;p>As circunstâncias ditando que um termo teórico peculiar qual a complexidade algorítmica detém implicações retas à segurança da vida ordinária e quotidiana é singularmente uma entre as facetas atrativas e formidáveis que englobam a Ciência da Informação e Matemática. Pedimos gentilmente sua plena atenção a respeito da jornada percorrida pelo seguimento inovador desses aparatos, em vista aos andamentos de construção pertinentes às computações quânticas com atrelações que delineiam os moldes evolutivos referentes a essa seara criptográfica.&lt;/p></description></item></channel></rss>