Tenho qe implementar um teste de primalidade, a fatoração por Fermat.
O problema é que para números grandes, os valores saem errados.
public static boolean fatoracaoFermat (long num){
//false representa que num eh composto e true que eh primo
boolean resultado = false;
//Os comandos do metodo so serao executados caso o numero seja impar
if (num%2 != 0){
long x = (long)Math.floor(Math.sqrt(num));
double y = 0;
System.out.println("x inicial = "+x+". E y inicial = "+y);
//Esse if modica as variaveis x e y. Mas so e executado se x nao for um quadrado perfeito
if (x*x != num){
while(true){
x++; y = Math.sqrt(x*x - num);
if (x == (long)((num + 1)/2)) {resultado = true; break;}
if (y == Math.floor(y)) break;
}
}
long y2 = (long)(Math.round(y));
System.out.println("x final = "+x+". E y final = "+y2);
long fator1 = x - y2;
long fator2 = x + y2;
//Impressao do resultado da fatoracao por Fermat
System.out.println("Resultado da fatoracao por Fermat");
if (resultado)
System.out.println(num + " e primo");
else
System.out.println(num + " e composto: "+num+" = "+fator1+" x "+fator2);
}
else System.out.println(num + " e par e portanto composto");
return resultado;
}
Para o número 1759003855257, o resultado sai errado.... ela sai:
Z:\aa>java fermat 1759003855257
x inicial = 1326274. E y inicial = 0.0
x final = 75125595. E y final = 75113887
Resultado da fatoracao por Fermat
1759003855257 e composto: 1759003855257 = 11708 x 150239482
Mas 11708 x 150239482 = 1759003855256.
Alguém sabe como comparar se um número do tipo double possui um valor inteiro quando o número é grande?