Raiz Quadrada de Bignteger

Boa tarde Galera,

preciso da ajuda de vocês. Estou terminando o trabalho da faculdade e preciso saber a raíz de um determinado numero, tipo assim:

Tenho um numero grande com nDigitos, os quais eu conto ao inseri-los em uma lista.
Tenho um valor (vr) refente a concatenação dos digitos acima em formato BigInteger.
Preciso saber o seguinte:

:arrow: RAIZ (nDigitos-1) de vr

ou seja:

[b]nDigitos = 4; vr = 1331;

Raiz(4-1) de 1331
Resultado = 11[/b]

Ja fiz de tudo e nada deu certo.
Vcs poderia me salvar mais essa vez.
Obrigado

você pode utilizar o método pow do próprio BigInteger, ou mesma forma exponencialmente, inclusive com expoentes negativos.

Expoentes negativos são equivalentes à divisão , não ha raiz. Raiz é feita com expoentes fracionários, coisa que, o pow não aceita.

Use o método de Newton-Raphson.

Se quiser uma solução pronta, procure no Google com as palavras-chave:

newton square root java biginteger

Por exemplo,

http://www.cs.umbc.edu/~stephens/crypto/CIPHERS/BigIntegerMath.java

acho q única saída é pegar o doubleValue

BigDecimal bigDec = new BigDecimal(23.1); Double result = Math.sqrt(bigDec.doubleValue());

oops, o exemplo q usei foi com BigDecimal. mas funciona com BigInteger tb.

Ocorre que se o número tiver mais de 307 casas decimais, não pode ser transformado em um double (Double.MAX_VALUE = 1,797693134862315708145274237317e+308).
Então não devemos transformar o número para Double para obter sua raiz quadrada se ele tem de funcionar para qualquer BigInteger.

pelo menos foi o que eu interpretei conforme citação comentário retirado do método

agora vendo direitinho, me embananei todo. acho que tava tombando de sono, mas que bosta. era a função sqrt, inverti as bolas. :smiley:
foi mal “RAM WEB” acabei te complicando né!

Não tentei, mas acho que por bissecção sai isso aí:

private static final BigDecimal DOIS = new BigDecimal(2);

public static BigDecimal raiz(BigDecimal valor, int precisao) {
    switch (valor.signum()) {
        case -1: throw new IllegalArgumentException("Não existe raiz quadrada de número negativo.");
        case 0: return BigDecimal.ZERO;
    }
    BigDecimal min = BigDecimal.ZERO;
    BigDecimal max = valor;
    BigDecimal pivo = valor.divide(DOIS);
    final BigDecimal erroMaximo = BigDecimal.TEN.pow(-precisao);
    BigDecimal erro = valor.subtract(pivo.multiply(pivo));

    // while (|valor - pivo^2| > erroMaximo)
    while (erro.abs().compareTo(erroMaximo) == 1) {
        if (erro.signum() == -1) {
            max = pivo;
        } else {
            min = pivo;
        }
        pivo = min.add(max).divide(DOIS);
        erro = valor.subtract(pivo.multiply(pivo));
    }
    return pivo;
}

public static BigDecimal raiz(BigInteger valor, int precisao) {
    return raiz(new BigDecimal(valor), precisao);
}

Newton-Raphson é bem melhor. Se quiser, pode usar esse aí como base.

EDIT: Agora analisei o link do thingol, é bem melhor lá.