Tamanho das Variáveis (int,long,double)?

E o seguinte estou fazendo um programa para criptografia RSA e estou tendo problemas nos resultados por que os números são muito grandes e as variáveis (int, long, etc…etc…) tem um limite.

Por exemplo.

long num = (long) Math.pow(3,39); System.out.println(num % 121);

Conferindo o resultado na calculadora, o resultado deveria dar 81, mas esta dando 70.

Quando diminuo o valor do expoênte do Math.pow de 39 para 29 o resultado da certinho (81).

Sei que isso dever ser por causa do limite que o long tem, mas como eu resolvo isso!!

Ja tentei usar o double, float etc.etc…
Tem tambem a classe BigInteger, mas não consegui usar!!

Alguem pode me da uma luz?!!

    BigInteger big = new BigInteger("3");
    big = big.pow(39);
    System.out.println(big.longValue()%121);

BigInteger tem tudo isso que você precisa para RSA, prontinho para usar.

Ele foi pensado para ser usado com assinaturas digitais.

Só que você tem de usar as funções corretas.

Por exemplo. você tem “pow” e “modPow”.

Com “modPow” e “add” já dá para fazer um RSA de acordo com a definição.

Com “probablePrime” dá para você criar um primo para você poder criar o par de chaves (pública e privada).

Tente usar java.math.BigDecimal
Para saber os ranges dos numeros veja as constantes. Na classe Integer tem a constante Integer.MAX_VALUE, e assim por diante.

import java.math.BigInteger;

class ModPow {
    public static void main(String[] args) {
        // você quer calcular 3 elevado a 39, módulo 121.
        BigInteger bi3 = new BigInteger ("3");
        BigInteger bi39 = new BigInteger ("39");        
        BigInteger bi121 = new BigInteger ("121");        
        BigInteger result = bi3.modPow (bi39, bi121);
        System.out.println (result); // deve imprimir 81
    }
}

Thingol, aproveitando a brecha:
Esses dias implementei um programinha em C para pegar a qtdade de memoria / disco disponivel:
-> http://www.guj.com.br/posts/list/30176.java
No caso do Linux, o SO retorna a qtdade de blocos livres e o tamanho de cada bloco. Precisei multiplicar as 2 informações para chegar à qtdade de bytes.
Vc sabe qual o melhor tipo em C para fazer essas operações ?

Acho que um disco tão cedo não vai chegar a 2 ^ 64 bytes.
Use um inteiro de 64 bits.
No GCC/g++ o tipo é long long (“a pr0n type”) e no Microsoft Visual C++ o tipo é __int64.
Para imprimir um long long, use “%lld” (no caso do GCC/g++) ou “%I64d” (no caso do MSVC++).

No BigInteger tem algum metodo para calcular o MDC de dois números.

O método chama-se gcd. Consulte o javadoc
http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigInteger.html#gcd(java.math.BigInteger)
para maiores informações.
(Não use programação por tentativa e erro; consulte o manual.)

import java.math.BigInteger;

class TesteMDC {
    public static void main(String[] args) {
        // você quer calcular 3 elevado a 39, módulo 121.
        BigInteger bi1 = new BigInteger ("123456");
        BigInteger bi2 = new BigInteger ("654321");        
        BigInteger mdc = bi1.gcd (bi2);
        System.out.println (mdc);  // MDC (123456, 654321)
    }
}