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(N−1)/2=945≡1(mod91)a(N−1)/2=945≡1(mod91)aaa(N+1)/4=923≡81(mod91)a(N+1)/4=923≡81(mod91)812≡9(mod91)812≡9(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(N−1)/2≡1(modN)a(N−1)/2≡1(modN)(a(N+1)/4)2≡a(modN)(a(N+1)/4)2≡a(modN)a(N+1)/2≡a(modN)a(N+1)/2≡a(modN)a(N+1)/2≡a×a(N−1)/2(modN)a(N+1)/2≡a×a(N−1)/2(modN)a(N−1)/2≡1(modN)a(N−1)/2≡1(modN)aaa(N+1)/2≡a(modN)a(N+1)/2≡a(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.11NN1111−1−1NNNNN=4k+3N=4k+3