Exponenciação modular no java

Saudações.
Existe alguma função pronta no java para tratar de exponenciação modular ? como a pow(a, b, m) do python ?

att,
Fábio

Tem, mas não para inteiros primitivos. Pra isso tem que usar a classe java.math.BigInteger, que possui o método modPow.

Ex:

BigInteger a = BigInteger.valueOf(3);
BigInteger b = BigInteger.valueOf(4);
BigInteger m = BigInteger.valueOf(6);

System.out.println(a.modPow(b, m)); // 3

Claro que se você tivesse valores do tipo int ou long, daria para fazer Math.pow(a, b) % m, mas podem ocorrer problemas de overflow caso o valor de ab fique muito grande. Por exemplo, se a for 1234567, b for 8486754 e m for 452344, BigInteger funciona, mas Math.pow não.

Neste caso, BigInteger é o mais indicado.

4 curtidas

Agradeço pelo retorno.

Aproveitando, sobre o conceito de inteiros primitivos, onde poderia conseguir material acadêmico para embasar este conceito numa dissertação, por exemplo ?

E sobre o tipo BigInteger, ele poderia ser utilizado para grandezas aplicadas a criptografia RSA, por exemplo ? Caso não, qual seria a maneira de lidar em java com este tipo de criptografia ?

att,
Fábio

1 curtida

O conceito de “tipo primitivo” é meio controverso, cada linguagem define de um jeito diferente.

Em Java a distinção é bem forte, ela trata como “primitivos” os tipos que não tem classe (int, double, entre outros, que são apenas um conjunto de bytes, mas como não são classes, não herdam de Object, não possuem métodos, etc). Outras linguagens não tem essa diferença: C#, por exemplo, chama-os de “Tipos Numéricos Integrais”, e diferente do Java, eles possuem métodos (42.ToString() é perfeitamente válido em C#). Só pra citar mais uma, em JavaScript, string é um tipo primitivo, mas em Java não.

Ou seja, é uma definição arbitrária, cada linguagem define de um jeito. Tem mais algumas coisas aqui e aqui, mas enfim, não sei se existe material acadêmico sobre isso.


As API’s de criptografia, até onde sei, costumam usar BigInteger. Exemplos: aqui e aqui.

2 curtidas