Teste de Primalidade - Tópicos Scaler (2023)

Visão geral

Oteste de primalidadeé um algoritmo para determinar se um determinado inteiro positivo é um número primo ou não. Existem muitos métodos para verificar se um número é primo ou não, como,o método escolar,Método de Divisão de Julgamento,Teste de primalidade de Fermat, eTeste de primalidade de Miller-Rabin.

Âmbito do artigo

  • Neste artigo vamos discutir diferentestestes de primalidadeemestruturas de dados.
  • Todostestes de primalidadesão explicados usando etapas e pseudocódigo neste artigo.
  • A análise da complexidade de cada método também será discutida neste artigo.
  • Os programas são executados emC++,Java, ePitãoneste artigo.

:::

Algoritmo para determinar se um dado inteiro positivo é um número primo ou não:

  • método escolar
  • Método de Divisão de Julgamento
  • Teste de primalidade de Fermat
  • Teste de Primalidade de Miller-Rabin

O que é Teste de Primalidade?

Oteste de primalidadeé um algoritmo para determinar se um dado inteiro positivo é um número primo ou não.

Teste de Primalidade - Tópicos Scaler (1)

A primalidade de um número também pode ser verificada determinando se é um número composto ou não, porque se o número não for umnúmero compostonem1, então deve ser um número primo.

Exemplo

Código Fonte - C++17

Código Fonte - Java (1.8)

Código fonte - Python 3

A saída é a mesma para todas as implementações, pois elas executam a mesma coisa, sendo a única diferença a linguagem de programação.

Saída

(Video) ADVANCED STATISTICS 6-Q3,Q4 ISS,ISI MSTAT,IIT JAM MATHEMATICAL STATISTICS,IAS SATISTICS OPTIONAL

Nos exemplos acima, estamos verificando se o número dado é um número primo ou não, para isso, estamos iterando de222paran1n-1n1para verificar se esses números dividem o número dado. Se o fizerem, então o número dado não é um número primo, caso contrário, é um número primo.

método escolar

Ométodo escolaré uma solução simples que vem primeiro à mente de todos para verificação de primalidade, pois é a mais simples de todas.

NoMétodo Escolaralgoritmo, iteramos todos os números de222paran1n-1n1(o número a ser verificado énnn) e verifique se eles dividem o númeronnn.

Teste de Primalidade - Tópicos Scaler (2)

Análise de Complexidade

Complexidade de tempo:O(N)SOBRE)O(N)

Ocomplexidade de tempoda verificação de primalidade do Método Escolar éO(N)SOBRE)O(N)enquanto iteramosN2N-2N2vezes.

Complexidade Espacial:O(1)O(1)O(1)

Ocomplexidade do espaçoaqui é constante.

O algoritmo no exemplo acima é apenas School Method.

Método Escolar Otimizado

NoMétodo Escolar, podemos fazer algumas otimizações como:

  • Em vez de verificar aténnn, vamos verificar atén\sqrt{n}nporque um fator dennnmaior quen\sqrt{n}ndeve ser um múltiplo de um número menor quen\sqrt{n}nque já foi verificado e não deve ser verificado novamente.
  • Vamos primeiro verificar a divisibilidade dennnpor222e333, então verifique sua divisibilidade por números da forma6k16k-16k1e6k+16k+16k+1Começando àsk=1k=1k=1. Fazemos isso porque qualquer inteiro maior que444pode ser expresso na forma de6k16k-16k1,6k6k6k,6k+16k+16k+1,6k+26k+26k+2,6k+36k+36k+3, e6k+46k+46k+4(parak>0k>0k>0), mas inteiros da forma6k6k6k,6k+26k+26k+2,6k+36k+36k+3, e6k+46k+46k+4será divisível por222ou333.

Vamos dar uma olhada em sua implementação na seção abaixo.

Implementação do Método Escolar Otimizado

Código Fonte - C++17

Código Fonte - Java (1.8)

Código fonte - Python 3

A saída é a mesma para todas as implementações, pois elas executam a mesma coisa, sendo a única diferença a linguagem de programação.

Saída

Nos exemplos acima, estamos verificando se o número dado é um número primo ou não, para isso, primeiro verificamos sua divisibilidade por222e333, verificando então sua divisibilidade por números da forma6k16k-16k1e6k+16k+16k+1. Se o número dado for divisível por qualquer número, então não é um número primo, senão é.

Análise de Complexidade

Complexidade de tempo:O(N)O(\sqrt{N})O(N)

O assintóticocomplexidade de tempoda verificação de primalidade do Método Escolar Otimizado éO(N)O(\sqrt{N})O(N)porque nós iteramosN/6\sqrt{N}/6N/6(eu+=6i+=6eu+=6no loop for) vezes neste algoritmo.

Complexidade Espacial:O(1)O(1)O(1)

Ocomplexidade do espaçoaqui é constante.

Método de Divisão de Julgamento

OMétodo de Divisão de Julgamentoé um algoritmo de verificação de primalidade no qual aceitamos algum inteironnn, verifique se algum número de2paran\sqrt{n}ndivide o inteiro dado, se um divisor for encontrado, entãonnné um número composto, caso contrário, é um número primo. É muito semelhante ao método escolar.

Teste de Primalidade - Tópicos Scaler (3)

Análise de Complexidade

Complexidade de tempo:O(N)O(\sqrt{N})O(N)

Ocomplexidade de tempoda verificação de primalidade do The Trial Division éO(N)O(\sqrt{N})O(N)enquanto iteramosN1\sqrt{N}-1N1vezes.

Complexidade Espacial:O(1)O(1)O(1)

Ocomplexidade do espaçoaqui é constante.

Teste de primalidade de Fermat

OPrimalidade de FermatO teste é um método probabilístico para determinar se o inteiro dado é um número primo provável ou não.

É baseado emPequeno Teorema de Fermatque afirma sepppé um número primo eaaanão é divisível porppp, entãoap11(modp)a^{p-1} \equiv 1\;(mod\;p)ap11(modp), ou sejaap1=kp+1a^{p-1} = k*p + 1ap1=kp+1(ondekkké uma constante inteira).

Se quisermos testarppppara um número primo, então vamos pegar alguns números inteiros aleatóriosaaaque não são divisíveis porpppe veja se a congruência se mantém ou não. Se a congruência não for válida para um valor deaaa, então será uma prova de quepppé um número composto, mas se a congruência for válida para mais de um valor deaaa, entãopppé um provável número primo.

Passos do Algoritmo

  • Repita o seguintekkkvezes (maior valor dekkkindica maior probabilidade de resultados corretos):
    • Lidar com casos de canto parap<3p<3p<3(pppé o número a ser testado).
    • Escolha um número aleatórioaaano intervalo1<a<p1 < a < p1<a<p.
    • Seap1̸1(modp)a^{p-1} \not\equiv 1\;(mod\;p)ap1̸1(modp), então retorneFaeuseFalsoFaeuse.
  • RetornarTrvocêeVerdadeiroTrvocêe,pppé provavelmente um número primo.

Exemplo

Vamos supor, temos que verificar sen=221n = 221n=221é um número primo ou não. Vamos escolher aleatoriamente um númeroaaano intervalo1<a<2211 < um < 2211<a<221. Em seguida, verificaremos se a congruência é válida ou não.

Paraa=38a = 38a=38,

3822111(mod221)38^{221-1} \equiv 1\;(mod\;221)3822111(mod221), comoap11(modp)a^{p-1} \equiv 1\;(mod\;p)ap11(modp)=>382201(mod221)=> 38^{220} \equiv 1\;(mod\;221)=>382201(mod221),

Agora pode haver dois casos,221221221é um número primo, ou383838é um mentiroso Fermat. Para prosseguir, vamos pegara=24a=24a=24.

mas,24220̸1(mod221)24^{220} \not\equiv 1\;(mod\;221)24220̸1(mod221), como2422081(mod221)24^{220} \equiv 81\;(mod\;221)2422081(mod221).

Isso prova que221221221é um número composto e383838é Fermat mentiroso,242424sendo a testemunha de Fermat para a composição de221221221.

Análise de Complexidade

Complexidade de tempo:O(keuog(N))O(K*log(N))O(keuog(N))

Aqui,kkké o número de iterações eNNNé o número a ser testado quanto à primalidade.euog(N)registro(N)euog(N)é a complexidade de tempo para computaçãoap1a^{p-1}ap1e o algoritmo é repetidokkkvezes. Então a complexidade de tempo éO(keuog(N))O(K*log(N))O(keuog(N)).

Complexidade Espacial:O(1)O(1)O(1)

Não há necessidade de espaço extra, portanto a complexidade do espaço é constante.

O pequeno teorema de Fermat é usado para mais um teste de Primalidade, chamado de Teste de Primalidade de Miller-Rabin.

Teste de Primalidade de Miller-Rabin

OTeste de Primalidade de Miller-Rabintambém é um método probabilístico para determinar se o inteiro dado é um número primo ou não, semelhante ao Teste de Primalidade de Fermat. Também é baseado no Pequeno Teorema de Fermat (discutido na seção acima).

Este teste foi descoberto por Gary Lee Miller em1976, posteriormente modificado por Michael Oser Rabin em1980.

O resultado deste teste será se o número dado é um número composto ou um provável número primo. Os prováveis ​​números primos noTeste de Primalidade de Miller-Rabinsão chamados de números prováveis ​​fortes, pois têm uma chance maior de ser um número primo do que noTeste de Primalidade de Fermat.

Um númeronnné dito ser um número primo provável forte para basearaaase uma dessas relações de congruência (relações de equivalência na aritmética de módulo,AB(modC)A \equiv B(mod\;C)AB(modC)significaAAAé congruente comBBBmóduloCCC) detém:

  • ad1(modn)a^d \equiv 1\;(mod\;n)ad1(modn)
  • a2rd1(modn)a^{2^{r}*d} \equiv -1\;(mod\;n)a2rd1(modn)

Passos do Algoritmo

nnné o número a ser testado.

kkkindica a precisão do teste.

dddé um número ímpar tal quen1n-1n1pode ser escrito na forma ded2rd*2^rd2r(Desdennné estranho,n1n-1n1deve ser par er>0r>0r>0).

eusPreume(euntn,euntk)isPrime(int\; n, int\; k)eusPreume(euntn,euntk)

  • Lidar com casos base paran<3n <3n<3.
  • sennné par, retorneFaeuseFalsoFaeuse.
  • Encontrar um número ímparddd.
  • Faça o seguintekkkvezes:
    • Verifique semeueueuerTest(n,d)==faeusemillerTest(n, d)==falsemeueueuerTest(n,d)==faeuse, se sim, retorneFaeuseFalsoFaeuse.
  • RetornarTrvocêeVerdadeiroTrvocêe.

meueueuerRabeunTest(euntn,euntd)millerRabinTest(int \;n, int \;d)meueueuerRabeunTest(euntn,euntd)

  • Escolha um número aleatórioaaano intervalo2an22 \leq a \leq n-22an2.
  • CalcularErro de análise do KaTeX: Esperado 'EOF', obtido '%' na posição 15: x = pow(a, d) %̲ n.
  • RetornarTrvocêeVerdadeiroTrvocêesex==1orx==n1x==1 \;ou \;x==n-1x==1orx==n1.
  • Faça o loop a seguir atéd==n1d == n-1d==n1.
    • x=(xx)%nx = (x*x)\%nx=(xx)%n.
    • RetornarFaeuseFalsoFaeusesex==1x==1x==1.
    • RetornarTrvocêeVerdadeiroTrvocêesex==n1x==n-1x==n1.

Implementação daTeste de Primalidade de Miller-Rabin

Código Fonte - C++17

Código Fonte - Java (1.8)

Código fonte - Python 3

A saída é a mesma para todas as implementações, pois elas executam a mesma coisa, sendo a única diferença a linguagem de programação.

Saída

Nos exemplos acima, estamos verificando se o número dado é um provável número primo ou um número composto, para isso, estamos utilizando o Teste de Primalidade de Miller-Rabin. Se a função retornarTrvocêeVerdadeiroTrvocêe, então o número dado é um provável número primo, caso contrário, é um número composto.

O Teste de Miller-Rabin, sendo uma extensão do Teste de Primalidade de Fermat, é mais preciso do que o Teste de Primalidade de Fermat, portanto, é preferível a ele.

Análise de Complexidade

Complexidade de tempo:O(keuog3(N)O(K*log^3(N)O(keuog3(N)

Ocomplexidade de tempodo teste de primalidade de Miller-Rabin éO(keuog3(N)O(K*log^3(N)O(keuog3(N), ondeNNNé o número a ser verificado quanto à primalidade ekkké o número de iterações executadas para precisão de acordo com o requisito.

Complexidade Espacial:O(1)O(1)O(1)

Não há necessidade de espaço extra, portanto a complexidade do espaço é constante.

Conclusão

  • testes de primalidadesão usados ​​para determinar se um determinado número é primo ou não.
  • O método School é um algoritmo ingênuo deO(N)SOBRE)O(N)complexidade do tempo.
  • O método Optimized School e o algoritmo Trial Division têm uma complexidade de tempo deO(n)O(\sqrt{n})O(n).
  • OTeste de primalidade de Fermate o teste de primalidade de Miller-Rabin retornam se um número é composto ou um primo provável e são baseados no Pequeno Teorema de Fermat.
  • A complexidade temporal doTeorema da Primalidade de FermatéO(keuog(N))O(K*log(N))O(keuog(N)).
  • A complexidade temporal doTeste de Primalidade de Miller-RabinéO(keuog3(N)O(K*log^3(N)O(keuog3(N).

References

Top Articles
Latest Posts
Article information

Author: Nathanael Baumbach

Last Updated: 09/01/2023

Views: 5375

Rating: 4.4 / 5 (75 voted)

Reviews: 90% of readers found this page helpful

Author information

Name: Nathanael Baumbach

Birthday: 1998-12-02

Address: Apt. 829 751 Glover View, West Orlando, IN 22436

Phone: +901025288581

Job: Internal IT Coordinator

Hobby: Gunsmithing, Motor sports, Flying, Skiing, Hooping, Lego building, Ice skating

Introduction: My name is Nathanael Baumbach, I am a fantastic, nice, victorious, brave, healthy, cute, glorious person who loves writing and wants to share my knowledge and understanding with you.