Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sileno De Oliveira Brito

Como implementar o teste AKS em C

Recommended Posts

Estou tentando implementar um algoritmo eficiente para verificar se um número é primo ou não. O algoritmo que resolvi implementar é o Teste de AKS.

 

Informações sobre o algoritmo pode ser encontradas no seguintes links:

http://teal.gmu.edu/courses/ECE746/project/F06_Project_resources/Salembier_Southerington_AKS.pdf

 

O Algoritmo tem 14 linhas, contudo ainda não consegui transcrever todas elas.

 

O código abaixo é o algoritmo original, tal como foi escrito.

 

     Input: Integer n > 1
     1. if (n = ab with b > 1) then output COMPOSITE;
     2. r := 2;
     3. while (r < n) {
     4. if (gcd(n,r) is not 1) then output COMPOSITE;
     5. if (r is prime greater than 2) then {
     6. let q be the largest factor of r-1;
     7. if (q > 4sqrt(r)log n) and not(n(r-1)/q = 1 (mod r)) then
     8. break;
     9. r := r + 1;
     10. }
     11. for a := 1 to 2sqrt(r)log n {
     12. if not( (x-a)n = (xn-a) (mod xr-1,n))then output COMPOSITE;
     13. }
     14. output PRIME;

 

Meu código.

 

int teste(double number){
    double n = number; // Número a ser verificado se é primo ou não
    double a, b;
    double r;
    double q;
    double x;
  
    if (n <= 1) {
        return EXIT_SUCCESS;
    }


    if (n == pow(a, b) && b > 1) {
        return EXIT_FAILURE;
    }
    r = 2;
    while (r < n) {
        /**
         * smcf.gcd Função criada para calcular o MMC, baseada no Algoritmo de Euclides
         */
        if (smcf.gcd(n, r) != 1) {
            return EXIT_FAILURE;
        }
        /**
         * @todo Linha 5???
         * @todo Linha 6???
         */


        if (((q > 4 * sqrt(r) * log(n)) && modf(pow(n, (r - 1) / q), &r)) != 1) {
            break;
        }
        r += 1;
    }


    for (a = 1; a < 2 * sqrt(r) * log(n); a++) {
        if (pow(x - a, n) != ((pow(x, n) - a) * modf((pow(x, r) - 1), &n))) {
            return EXIT_FAILURE;
        }
        return EXIT_SUCCESS;
    }

 

Não consegui entender a linha 5 e 6 do algoritmo original, logo não consegui implementar, também não entendi, também não entendi de onde vem as variáveis x,a,b

Compartilhar este post


Link para o post
Compartilhar em outros sites

A primeira linha do seu código já está errada. Observe que a entrada do algoritmo é n > 1. 1 não é classificado como primo, já que a definição indica a existência de dois divisores distintos.

 

A primeira linha do pseudocódigo verifica se n é uma potência perfeita e vc precisa, a princípio, limitar uma das variáveis para poder iterar sobre a outra: http://mathoverflow.net/questions/106313/algorithm-for-detecting-prime-powers

 

O máximo divisor comum (GCD) pode ser calculado com operações binárias ao invés de divisão simples. http://en.wikipedia.org/wiki/Binary_GCD_algorithm

 

Dei uma lida no pdf e não encontrei a versão do algoritmoq que vc está implementando. É bom ler o trabalho porque já foram escritas várias versões otimizadas, além de ter algumas explicações para o pseudocódigo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.