Para um algoritimo preciso pegar o resultado da raiz quadrada de 600851475143, mas o Math.sqrt() não suporta o tamanho do arquivo =/. E o BigInteger não tem nenhuma operação de raiz quadrada. Alguém conhece outra api?
double res = Math.pow(600851475143d, 1/2);
package guj;
import java.math.BigInteger;
public class ISqrt {
/**
* http://en.wikipedia.org/wiki/Integer_square_root
* @param n The integer value
* @return isqrt (n)
*/
public static BigInteger isqrt (BigInteger n) {
if (n.signum() == -1)
throw new ArithmeticException("Can't evaluate square roots of negative numbers");
else if (n.signum() == 0)
return BigInteger.ZERO;
BigInteger xk = n, xk1;
BigInteger two = BigInteger.valueOf(2L);
while (true) {
xk1 = xk.add(n.divide(xk)).divide(two);
if (xk1.subtract(xk).abs().compareTo(BigInteger.ONE) <= 0)
break;
xk = xk1;
}
return xk1;
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println (ISqrt.isqrt(BigInteger.valueOf (1234).multiply(BigInteger.valueOf(1236))));
System.out.println (ISqrt.isqrt(BigInteger.valueOf (123456789).multiply(BigInteger.valueOf(123456789))));
}
}
Valeu pessoal =), tenho que pegar algum livro de Teoria dos Números para fazer certas coisas na mão.