If you're seeing this message, it means we're having trouble loading external resources on our website.

Se você está atrás de um filtro da Web, certifique-se que os domínios *.kastatic.org e *.kasandbox.org estão desbloqueados.

Conteúdo principal

Resumo (o que vem a seguir?)

Por que fatoração é difícil, porém gerar números primos é fácil? Para onde vamos a partir daqui? Versão original criada por Brit Cruise.

Quer participar da conversa?

  • Avatar starky ultimate style do usuário Gabriel Santos
    Olá pessoal, agradeço muito pelo conteúdo produzido por vocês, pois a faculdade me passou um trabalho onde tenho que desenvolver um software de criptografia, e adivinha qual eu escolhi? RSA!
    Eu acreditava que criptografar era algo impossível de uma pessoa comum aprender, porém, assistindo os vídeos, consegui aplicar! Uau kkkkk
    Bem, eu ainda tenho alguns problemas, como gerar números primos aleatórios e checar se são realmente primos ou não, então, minha única saída (que tornou meu software muito limitado) foi calcular na folha de papel mesmo meus três conjuntos de chaves aplicados. Ah, lógico que nesse caso considerei números primos (P1 e P2) de até três dígitos.
    No entanto, minha meta é melhorar o software para trabalhar com números primos aleatórios e calcular as chaves por si só. Ou seja, adicionar uma função aonde ele calcule as chaves para mim (pelo menos com primos de até 20 dígitos). Para isso, estou estudando muito, às vezes fico com isso na cabeça que nem consigo dormir '-' kkkkk.
    Bem, ainda não consegui nada de útil, porém, tem um vídeo na coletânea de "Teste de primalidade" onde é mostrado uma espiral de primos (se não me engano, o vídeo é "Espiral de densidade para os números primos") e, por ironia do destino, eu tinha visto conteúdos sobre o número de ouro da matemática (1,618).
    Comparando a espiral dos números primos com a da função áurea, percebi que ambos são muito parecidos, logo, pode-se afirmar que há alguma relação deles com o número de ouro? Ou talvez haja um padrão Fibonacci para os primos? Estou tentando encontrar algo relacionado a isso para aplicar no algoritmo, mas ainda não encontrei kkkkk.
    Como essas questões interessantes, deixo aqui para a discussão...
    (5 votos)
    Avatar Default Khan Academy avatar do usuário
Você entende inglês? Clique aqui para ver mais debates na versão em inglês do site da Khan Academy.

Transcrição de vídeo

RKA4JL - Parabéns! Chegamos em um ponto de ramificação em nossa lição. Algumas ideias diferentes foram introduzidas, então é importante nos orientarmos antes de avançarmos em várias direções. O que motivou essa lição? Bem, aprendemos sobre encriptação RSA. E o RSA dependia de duas coisas: a primeira é que a fatoração dos números primos é difícil. Então, se eu multiplicar dois números primos grandes, P1 e P2, e eu te der N, eu posso confiar que você levará muito tempo para encontrar esses primos, talvez mais que sua vida inteira. A segunda é que o RSA requer que aqueles primos grandes que gerei sejam fáceis, o que significa que eu poderia gerar rapidamente um número primo grande. Então, vamos retornar ao primeiro problema: a dificuldade da fatoração de primos. Bom, o que há na fatoração dos primos, ou simplesmente nos próprios números primos, que torna os problemas difíceis? Para descobrir isso nós começamos com o problema principal. Dado "x", "x" é primo ou composto? Esse é um teste de primariedade. Terminamos construindo algumas soluções para este problema, e fazendo isso percebemos que esse problema era computacionalmente caro. Ou seja, não há solução instantânea para esse problema. À medida que nosso número de entrada cresceu, a quantidade de tempo ou de passos envolvidos para um algoritmo encontrar a solução também cresceu. E o quanto ele cresceu? Nós realmente entenderemos melhor agora porque podemos predizer esse espaço de busca usando o teorema de números primos. Mas a verdadeira questão pode ser pensada como um gráfico onde, no eixo vertical, temos o número de passos que cada algoritmo precisa para ser executado. Então, você pode simplesmente entendê-lo como tempo. E no eixo "x" está o tamanho da entrada. Conforme o tamanho da entrada cresceu, também cresceu o tempo levado. O problema que tivemos é que a forma dessa curva é inaceitável porque nesse cenário, uma vez que N atinja até mesmo 20 dígitos, no pior dos casos, não podemos mais resolver o problema. E se jogássemos uma entrada de centenas de dígitos no nossa algoritmo, podemos concordar que ele não funcionaria. Então é praticamente impossível checar se um número grande como entrada é primo usando nossas estratégias atuais. Agora, vamos voltar ao primeiro ponto. De acordo com o nossa atual entendimento nesta lição, a fatoração deve ser mais difícil que um teste de primariedade, isto é, existem mais passos envolvidos em achar a fatoração prima de algum número versus apenas dizer se ele é um número primo ou não. Isso porque a fatoração requer que encontremos todos os fatores primos para alguma entrada N, enquanto o teste de primariedade apenas requer que encontremos um divisor. E um lembrete legal disso é que alguns usuários têm realmente transformado esses testes de primariedade em algoritmos de fatoração de primos simplesmente por repeti-lo após encontrar o primeiro divisor. Então, o teste de primariedade é apenas um tipo de uma sub-rotina dentro do algoritmo de fatoração principal. Então, se retornamos a este gráfico, um algoritmo de fatoração seria algo parecido com isso. Conforme a entrada cresce, nosso algoritmo de fatoração seria esta linha acima da linha do teste primariedade. E perceba que em qualquer situação nós sempre temos um limite computacional, ou seja, o número de passos primitivos que podemos calcular, que é baseado no poder computacional em qualquer situação dada e a quantidade de tempo que temos. E quando você pensar nisso como uma linha horizontal, ou um limiar nesse gráfico, qualquer coisa acima dessa linha está fora de alcance. Não é prático de resolver. E nessa lição estávamos limitados pela placa do computador do andarilho, que é bastante lenta, motivo pelo qual não podíamos executar testes de primariedade em números de até mesmo vinte dígitos. Contudo, mesmo se tivéssemos, digamos, mil computadores executando por um ano, isso simplesmente empurraria essa linha horizontal para cima, para um outro limiar. E isso nos permitiria executar testes em números maiores. Mas como se pode ver, sempre atingiríamos algum limite onde a entrada é tão grande que não podemos mais resolver os problemas. Agora, isso nos leva a vários tipos de questões interessantes. Identificarei dois, que serão os que vou explorar a seguir. Primeiro de tudo: até agora eu não tenho sido muito precisa sobre essas curvas de crescimento. Contudo, seria útil se, para qualquer algoritmo que você me desse, não importa o que ele esteja tentando resolver e não importa sequer em qual máquina ele esteja sendo executado, nós pudéssemos desenhar alguma curva de crescimento correspondente neste gráfico simplesmente olhando a descrição do algoritmo. Se nós pudéssemos fazer isso, poderíamos identificar categorias de certas formas de crescimento que nos diriam o quão difícil será resolver um problema. E dessa maneira, nós podemos julgar um logaritmo antes mesmo de o executarmos. Isso é muito importante para se pensar. E você poderia me entregar seu algoritmo escrito em um pedaço de papel e eu poderia vê-lo e dizer: "Eu sei que esse algoritmo não pode ser resolvido com o tamanho de entrada necessário". E isso nos leva a uma lição de complexidade de tempo, uma ferramenta conceitual incrivelmente importante que precisaremos. E se você já ouviu: "Isso é executado em tempo polinomial", ou "tempo exponencial", esses são termos que vieram da complexidade de tempo. Próximo. Muitos de vocês devem estar pensando: "Bom, como nós estamos gerando esses números primos aleatórios na prática?". Esse é o segundo ponto que mencionei sobre o RSA. Vamos apenas passar por isso rapidamente. Para gerar números primos grandes e aleatórios de centenas de dígitos, nós temos de seguir estas instruções: Gere um número aleatório e teste se ele é primo. Se é primo, nós terminamos. Se não, tente novamente até encontrarmos um número primo. Neste procedimento de três passos, o que é mais importante é o segundo passo. É testar se é primo. Se não pudermos fazer este passo, isso não funcionará. Então, como isso está funcionando atualmente? Bom, é baseado em uma alteração sutil da definição do nosso problema. E o mais importante: o uso da aleatoriedade. Isso nos leva a uma outra lição sobre algoritmos aleatórios. Finalmente, se houver qualquer outra pergunta importante que você tenha, por favor, poste-as abaixo e poderemos planejar lições. Por exemplo, existem algumas matemáticas mais profundas que ainda temos para explorar a fim de acelerar nosso atual teste experimental de primariedade da divisão aleatória. E o que mais você está pensando? Por favor, compartilhe abaixo.