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
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.
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
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.