Fiz um programa baseado no algoritmo de Fermat para fatoração de inteiros. O objetivo desse programa é achar os fatores de um inteiro n, caso contrário esse numero n é primo.
O problema encontrado foi que ele pede para inserir o numero duas vezes ao inves de 1 e ao serem inseridos esses números dá como resultado “Falha na segmentação”.
/* Metodo de Fermat
Autor: Gustavo R. Grosch, Higor H. P. Nucci
Orientadora: Adriana B. P. Molgora
Esse método procura por fatores de um número n, onde esses fatores (em seu melhor caso) estão
perto da raiz quadrada de n.
*/
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <gmp.h>
#include <stdarg.h>
typedef int bool;
const bool false = 0;
const bool true = 1;
int main()
{
/* Inicializando as variáveis usando a biblioteca GNU Multi Precision Arithmetic Library */
mpz_t x;
mpz_t n;
mpz_t teste;
mpz_t y;
mpz_t rop;
mpz_t temp;
mpz_t res;
mpz_t sobra;
mpz_t op;
mpz_init(x);
mpz_init(y);
mpz_init(teste);
mpz_init(rop);
mpz_init(temp);
mpz_init(res);
mpz_init(sobra);
mpz_init(op);
bool primo = false, quadrado = false;
unsigned long int num;
/* Variáveis usadas para calcular o tempo decorrido */
clock_t tInicio ,tFinal;
double tMedia=0, tValor;
printf("Entre com o valor: \n");
gmp_scanf("%Zd\n", n);
printf("1");
tInicio = clock();
/* Calculando a raíz quadrada de n, onde x recebe o resultado */
mpz_root(x, n, 2);
/* Elevando o valor de x ao quadrado */
mpz_pow_ui(rop, x, 2);
/* Verifica se n é um quadrado perfeito, caso contrário continue*/
int compara = mpz_cmp (rop, n);
if(compara < 0) {
/* Incrementa x para começar o cálculo */
mpz_add_ui(x, x, 1);
/* Elevando o valor de x ao quadrado */
mpz_pow_ui(rop, x, 2);
/* x² - n */
mpz_sub(temp, rop, n);
/* raiz do resultado acima */
mpz_rootrem(y, sobra, temp, 2);
/* Condição de parada: se x >= (n + 1)/2 */
mpz_add_ui(op, n, 1);
mpz_fdiv_q_2exp(res, op, 2);
/* Enquanto y não for um inteiro continua (sobra != 0) */
while ((mpz_cmp(sobra, 0) != 0) && (mpz_cmp(x, res) < 0)) {
mpz_add_ui(x, x, 1);
mpz_mul(rop, x, x);
mpz_sub(temp, rop, n);
mpz_rootrem(y, sobra, temp, 2);
}
}else{
quadrado = true;
}
mpz_add_ui(temp, n, 1);
mpz_fdiv_q_2exp(res, temp, 2);
if ((mpz_cmp(x, res) == 0)){
primo = true;
}
tFinal = clock();
tValor = ((tFinal-tInicio)/(CLOCKS_PER_SEC/1000));
if ((!quadrado) && (!primo)){
mpz_add(rop, x, y);
mpz_sub(res, x, y);
gmp_printf("Os valores correspondentes são x = %Zd\n", rop);
gmp_printf(" e y = %Zd\n", res);
printf("o tempo para achar a resposta foi de %f milissegundos.", tValor);
}else{
if (quadrado){
gmp_printf("%Zd é um quadrado perfeito.", n);
printf("o tempo para achar a resposta foi de %f milissegundos.", tValor);
}else{
if (primo){
gmp_printf("%Zd é um número primo.", n);
printf("o tempo para achar a resposta foi de %f milissegundos.", tValor);
}
}
}
/* Limpando as variáveis */
mpz_clear(x);
mpz_clear(n);
mpz_clear(teste);
mpz_clear(y);
mpz_clear(rop);
mpz_clear(temp);
mpz_clear(res);
mpz_clear(sobra);
mpz_clear(op);
return EXIT_SUCCESS;
}
Caso alguém saiba o que pode estar acontecendo, agradeceria de coração.