dado una extraña long x
, estoy buscando long y
tal que su módulo de productos 2**64
(es decir, utilizando la aritmética desbordante normal) es igual a 1. Para poner en claro lo que quiero decir: Esto podría ser calculado en unos pocos miles de años de esta manera:Java inversa módulo 2 ** 64
for (long y=1; ; y+=2) {
if (x*y == 1) return y;
}
sé que esto puede ser resuelto rápidamente usando el algoritmo de Euclides extendido, pero se requiere la capacidad de representar todos los números involucrados (que van hasta 2**64
, por lo que incluso sin firmar la aritmética no ayudaría). Usar BigInteger
seguramente ayudaría, pero me pregunto si hay una manera más simple, posiblemente usando el algoritmo euclidiano extendido implementado para longs positivos.
Hacker's Delight [sugiere] (http://www.hackersdelight.org/HDcode/mulinv.c.txt) un algoritmo para mod 2^32. Intentaré alguna variante de eso, aunque probaría mucho, por supuesto. (Tal vez podría valer la pena incluirlo en Guava ...) –
@Louis Wasserman: Buen enlace ... mientras tanto, creo que tengo algo 3 veces más rápido, publicaré mis resultados más tarde. Por cierto, necesitaba 'pow (long, long)' (que falta en 'LongMath') para un enfoque. – maaartinus
'pow (long, long)' está deliberadamente ausente porque llevar todo a una potencia que no encaja en un 'int' está esencialmente garantizado para desbordarse. (Aunque supongo que eso es lo que quiere en su caso.) –