Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
Carregando comentários...