RKA3JV - E aí, pessoal!
Tudo bem?
Nesta aula, vamos fazer o teste
de primalidade de Fermat.
Para isso, vamos determinar uma série
de instruções que possam provar
se um número inteiro de entrada é composto
ou primo com alto grau de precisão.
Claro, seria mais fácil calcular isso
em qualquer máquina.
E mesmo que um número
de entrada aumente,
isso ainda deveria ser mais rápido,
correto?
Até agora nós aprendemos que
precisamos reconhecer um padrão
que todos os números primos têm,
e que alguns compostos não.
E no vídeo em que fizemos uma
demonstração visual do Teorema de Fermat,
vimos uma regra bastante interessante
que era, dado um número primo "p"
e o inteiro "a", que é menor do que "p",
sabemos que "p" divide "aᵖ - a".
E escrevemos isso como, "aᵖ = a mod p".
Geralmente, você encontra
o teorema deste jeito.
E como "a" e "p" não têm um fator comum,
já que "p" é primo,
podemos cancelar estes elementos.
E, às vezes, você vai encontrar escrito
"aᵖ⁻¹ = 1 mod p".
E lembre-se de que só podemos fazer isso,
porque o maior divisor comum
entre "a" e "p" é 1.
Agora, podemos ver uma demonstração
de como isso funciona
para entender melhor o processo.
Note que se você colocar um
número primo para o "p",
o resultado vai ser sempre igual a 1,
não importa o "a" que você escolha.
Mas, se colocarmos um número
composto para o "p",
podemos ver que normalmente
o resultado não vai ser 1.
A maioria das vezes
vai ser diferente de 1.
O resultado vai ser composto.
Isto é uma prova de que o "p"
que escolhemos não pode ser primo.
Essa é essência do teste.
E antes de prosseguir,
vamos construir uma estrutura
aqui para ele
utilizando o padrão
que eu mostrei.
Primeiro, nós temos uma entrada
que vai ser um número inteiro "p".
Depois, geramos um número
inteiro aleatório
que é menor do que o "p" escolhido.
E aí, perguntamos:
o maior divisor comum
entre "a" e "p" é 1?
Se não, ou seja, se o MDC entre "a" e "p"
é maior do que 1,
eles vão compartilhar de
um fator comum, correto?
E, com isso, o "p" vai ser
um número composto.
Com isso, o resultado vai ser
um número composto.
Agora, se tivermos.
Sim, podemos responder à pergunta-chave.
"aᵖ⁻¹ mod p = 1?
Se não, vamos ter que "p" é composto,
e paramos por aqui.
Caso contrário, se a equação
for igual a 1,
"p" deve ser primo, correto?
E eu codifiquei essa série
de instruções aqui
e vamos ver o que acontece?
Do lado esquerdo,
nós temos o teste de Fermat.
Do lado direito, nós temos
o teste de divisão experimental.
Veja que parece que sempre vai dar certo.
Só de olhar você consegue ver que
os valores são sempre os mesmos,
não importa o valor que eu
modifique no meu algoritmo.
Porém, eu encontro um problema aqui.
Eu coloquei o número 511
e o Teorema de Fermat está
dizendo que é primo.
Já o teste da divisão experimental,
diz que é composto.
O que será que está acontecendo?
O 511, de fato, não é um número primo.
E vamos voltar aqui na nossa equação
e ver o que aconteceu.
Este é um exemplo do que
chamamos de falso primo.
É um número composto,
mas existem alguns "a"
que escolhemos que resultam em 1.
E eles são chamados de enganadores.
Isso porque eles nos fazem pensar
que a resposta é um número primo.
E note que mudando o "a",
encontramos muitos
números compostos
que eu vou chamar
de testemunhas.
Eles não são enganadores.
Agora, podemos utilizar a mesma lógica
que usamos no teste de divisibilidade,
onde geramos um novo "a"
e torcemos para não encontrar
um enganador.
Agora, nós conseguimos ver que
estes enganadores
dividem o número total do grupo
que estamos selecionando.
Isso significa que no máximo
metade das escolhas
ou metade dos elementos
selecionados neste grupo,
podem ser enganadores.
Então, desde que o "a"
seja encontrado aleatoriamente,
a chance de encontrar uma testemunha,
que é o que queremos,
é pelo menos a metade.
E depois de ter repetições,
a probabilidade de que nenhuma
testemunha seja encontrada
com um número composto é
no máximo 1/2ᵗ.
Depois de 20 tentativas,
por exemplo,
a probabilidade de sair um
número primo erroneamente
é de uma em um milhão,
aproximadamente.
É aquele caso onde continuamos
com uma má sorte
em gerar os "a" aleatórios
e toda vez encontramos um enganador.
E agora sim podemos ver
nosso teste em ação.
Com o maior número de tentativas,
parece que o teste está funcionando
perfeitamente, correto?
Note que, no pior caso,
que sabemos que é quando temos
um algoritmo com este primo,
a máquina vai ter um trabalho muito
grande para gerar o teste de Fermat.
É muito mais eficiente que
a divisão experimental.
Principalmente,
porque o número de passos
não aumenta com a entrada.
Por exemplo,
graficamente relacionando
o tempo e o tamanho da entrada,
vai ser algo, mais ou menos, assim.
Basicamente, no teste de Fermat
nunca temos que nos preocupar
com o algoritmo rodando milhões
e milhões de vezes
de repetições como fizemos antes.
Então, o que eu quero dizer é que isso
nada mais é do que matemática aplicada.
Ou seja, pegamos um padrão
que alguém descobriu
e colocamos uma grande quantidade
de repetições no computador,
isso através de programação.
Mas, neste sistema aqui,
tem uma pequena falha.
Será que você consegue encontrar?
Eu vou deixar aqui como
exercício e pesquisa.
Então, não perca tempo
e tente buscar a resposta.
Eu espero que esta aula
tenha lhes ajudado
e até a próxima, pessoal!