Existe algum algoritmo eficiente para teste de primalidade para números que são da forma

8

Eu estava lendo o CLRS e ele pediu para mostrar que se é um primo da forma e é um resíduo quadrático, então é uma raiz quadrada (também é possível mostrar facilmente que é uma raiz quadrada).pp4k+34k+3umaaumak+1ak+1uma-kak

Fiquei me perguntando se usando o fato anterior e também que sabíamos que tínhamos um número da forma (não necessariamente primário), então talvez haja um teste de primalidade diferente para (algum?) usando a função de raiz quadrada (ou seja, ).N=4k+3N=4k+3NNSQRTN(uma)=umak+1SQRTN(a)=ak+1

Então o algoritmo que eu pensei que era o seguinte:

Escolha um resíduo quadrático (QR) (pode-se fazer isso facilmente verificando se um ^ {\ frac {p-1} {2}} \ equiv 1 \ pmod p se mantém). Depois de termos um QR, calcule a ^ {k + 1} = x_a e verifique se x_a ^ 2 é igual a a . Se for verdade, concluímos que a é primo. Caso contrário, escolhemos um QR a '\ in \ mathbb {Z} ^ * _ N diferente e repetimos o algoritmo. Pode-se repetir esse algoritmo k vezes. Se após k vezes não houver sucesso, conclua que o número é composto.umaZNaZNap121(modp)ap121(modp)ak+1=xaak+1=xax2ax2aaaaaaZNaZNkkkk

Tenho principalmente intuições sobre por que é uma prova correta, mas não formal. Desde o primeiro fato de que xa=ak+1xa=ak+1 é uma raiz quadrada quando pp é primo, isso significa que x2aa(modp)x2aa(modp) . Portanto, se aa é um QR, a verificação será aprovada (metade do tempo escolheremos um QR, portanto, provavelmente escolheremos um QR não é apenas 1/2).

No entanto, se NN é composto, ao que parece, não temos garantia de que x2aa(modN)x2aa(modN) . Portanto, se não funcionar, temos certeza de que não é primo. Mas se ele se sustenta, então, se sua prima está certa, mas se é composta, podemos estar errados? Basicamente, é possível usar a função SQRT quando N=4k+3N=4k+3 para decidir se NN é primo ou não?


Também pensei em outro algoritmo que merecia sua própria pergunta: calcular uma raiz quadrada de número e ter mais de duas raízes é uma maneira confiável de decidir a primalidade?

Charlie Parker
fonte
@Kyle Jones, alguma chance de você estar disposto a restaurar (recuperar) sua resposta? Eu acho que tem uma boa visão - não a apreciei à primeira vista, mas em uma inspeção mais aprofundada, acho que é um bom exemplo.
DW
@DW OK. Não achei que tivesse muito valor, dada sua resposta mais abrangente, mas trarei de volta se você achar que vale a pena.
Kyle Jones
Eu tive uma nova idéia depois de revisar Miller-Rabin. O que você acha do meu algoritmo recém-proposto? @KyleJones
Charlie Parker
@CharlieParker Se você tiver uma nova pergunta, faça-a em um post separado. Se você editar esta pergunta para invalidar as respostas existentes, isso anulará o propósito de ter um repositório de perguntas e respostas.
Kry Jones #
@KyleJones é difícil de decidir, porque é realmente sobre o mesmo tópico. O que você sugere? Posso abrir uma nova pergunta, mas não tinha certeza se era apropriado.
Charlie Parker

Respostas:

5

Deixe-me começar com um contra-exemplo em que seu algoritmo fornece a resposta errada: ou seja, onde é composto, mas seu algoritmo conclui que é primo. Suponha que e . Então, , para que passe no seu cheque para ser um QR. Além disso, e , portanto, isso passa no seu segundo teste, seu algoritmo será concluir que 91 é primo. No entanto, 91 não é primo: . Assim, seu algoritmo tirou a conclusão errada neste caso. Isso demonstra que seu algoritmo pode gerar respostas incorretas em pelo menos alguns casos.NNN=91N=91a=9a=9a(N1)/2=9451(mod91)a(N1)/2=9451(mod91)aaa(N+1)/4=92381(mod91)a(N+1)/4=92381(mod91)8129(mod91)8129(mod91)91=7×1391=7×13


Na verdade, há um problema mais sério com seu algoritmo. Não há número que seu algoritmo produzirá "composto". Pensa que todos os números são primos. Mais precisamente, para cada , seu algoritmo fará um loop para sempre (tentando encontrar um número que passe no teste QR, em vão) ou finalizará e emitirá "prime". Portanto, seu algoritmo está o mais errado possível.NNNN

Você pode ver isso aplicando alguma teoria dos números. Você pode testar se é um QR e um segundo teste com base no insight da raiz quadrada. Se passar no primeiro teste, ele passará no segundo.aaaa

Aqui está o porquê. O teste de QR é bem sucedido se . O seu segundo teste é bem sucedido se . O último é equivalente a . Mas . Portanto, se , então (multiplicando ambos os lados por ), vemos imediatamente que devemos ter .a(N1)/21(modN)a(N1)/21(modN)(a(N+1)/4)2a(modN)(a(N+1)/4)2a(modN)a(N+1)/2a(modN)a(N+1)/2a(modN)a(N+1)/2a×a(N1)/2(modN)a(N+1)/2a×a(N1)/2(modN)a(N1)/21(modN)a(N1)/21(modN)aaa(N+1)/2a(modN)a(N+1)/2a(modN)

Cada um dos aprovados em seu algoritmo equivale basicamente a procurar um que passa no primeiro teste e, em seguida, verificar se ele passa no segundo teste - mas, com base na percepção anterior, vemos que qualquer que passa no primeiro teste será garantir a aprovação no segundo teste também. Portanto, se o algoritmo encontrar algum valor que passe no teste QR, o segundo teste passará automaticamente e o algoritmo emitirá "prime".kkaaaaaa

A lição a aprender: sempre que você achar que possui um algoritmo que parece promissor, vale a pena codificá-lo e experimentá-lo em alguns casos de teste e verificar se ele parece funcionar bem. Experimentá-lo em alguns casos de teste não substitui uma prova de correção , mas pode ser uma maneira útil de eliminar rapidamente algum algoritmo incorreto.


Finalmente, sobre a sua verdadeira pergunta: podemos usar algo assim para criar um teste de primalidade? Bem, você pode pensar no teste de primalidade de Miller-Rabin como vagamente baseado em algo assim. Eles são baseados em uma caracterização de como as raízes quadradas de devem parecer, se for primo. Se você encontrar uma raiz quadrada de que não seja ou , poderá concluir que não é primo. No entanto, não se limita aos números da forma , portanto, nesse sentido, é definitivamente diferente.11NN111111NNNNN=4k+3N=4k+3

DW
fonte
Eu tive uma nova idéia depois de revisar Miller-Rabin. O que você acha do meu algoritmo recém-proposto?
Charlie Parker
1
@CharlieParker, em vez de editar a pergunta de uma maneira que invalide as respostas existentes, geralmente preferimos que você faça uma nova pergunta. Eu sugiro que você faça isso. (Dica: pense em como planeja calcular o sqrt ...)
DW
3

A congruência é verdadeira para todos os primos da forma correta, mas também é verdadeira para alguns números compostos, o que torna a congruência sozinha inútil como teste de primalidade.pp

Exemplo: defina como o número , que é obviamente composto e tem a forma com . é , então mod produz o resíduo quadrático = . = = ; aplicar mod àquele produz . Agora, o teste: No mod é suposto ser a raiz quadrada de ( ) somente se for primo, maspp15154k+34k+3k=3k=310000100001002100210000100001515aa101010k+110k+11041041000010000pp1010pp 1010aa1010pp102102 = que é mod , então passou no teste de primazia. No entanto, sabemos que é composto.1001001010pppppp

Isso está demonstrando que, mesmo que seu método para escolher QR's seja perfeito, o algoritmo ainda pode errar. Por exemplo, aqui seria uma forma razoável de escolher : escolher um número aleatório , quadrado ele, e chamar o resultado (isto é, ). Então você sabe que é garantidamente um QR e não há necessidade de testá-lo usando o teste que você listou. Se foi assim que seu algoritmo escolheu , o exemplo acima mostra que seu algoritmo pode dar a resposta errada em alguns casos (por exemplo, , ).umaarrumaaa=r2modNa=r2modNaaaap=15p=15r=5r=5

Kyle Jones
fonte
Gostaria de saber se há algum erro em seus cálculos ou se eu entendi errado o algoritmo proposto. não passa no teste QR: , não . Portanto, de acordo com meu entendimento do algoritmo proposto, não seria aceito como QR e o algoritmo não tentaria fazer mais cálculos com ele. Estou assumindo que a maneira como o algoritmo encontra um QR aceitável é escolher aleatoriamente e testar se ; isso parece ser o que o texto está sugerindo. a=10a=10a(N1)/2=10710(mod15)a(N1)/2=10710(mod15)11a=10a=10aaa(N1)/21(modN)a(N1)/21(modN)
DW
@DW OK. Sua resposta é totalmente melhor de qualquer maneira.
Kyle Jones
1
Ahh, olhando um pouco mais de perto, vejo o que está acontecendo: 10 é realmente um QR, mas a verificação erroneamente pensa que não é um QR. Então, se a forma como o algoritmo trabalhou como escolher um número aleatório , quadrado-lo e chamar resultado (ou seja, ), então a sua resposta seria um contra válida - e isso não é uma interpretação irracional do algoritmo proposto. Legal, boa resposta! a(N1)/2=1(modN)raa=r2modN
DW