Java encuentra un biginteger dentro de un rango específico

Estoy desarrollando una aplicación con Java que necesita encontrar dos enteros grandes (Y y Z) que cumplan estas dos condiciones:

Y^k < N  and Z^j < N < Z^(j+1)

N, k y j son conocidos. N es un gran número entero (1024 bits).

Mis implementaciones actuales encuentran Y y Z eligiendo un BigInteger aleatorio y prueban si se cumplen las condiciones. Pero el problema es que a veces lleva mucho tiempo encontrar la solución o no encuentra ninguna (probablemente el bitSize no se calculó correctamente). ¿Hay alguna manera de acelerar esto?

El código:

BigInteger getMessage(int bitSize, int lowerBound, int upperBound, BigInteger module)
{
        boolean foundOne = false;
        BigInteger candidate = null;
        while( !foundOne )
        {
                candidate = new BigInteger(bitSize,random);
                foundOne = (upperBound == 0 || candidate.pow(upperBound).compareTo(module) > 0 ) && (lowerBound == 0 || candidate.pow(lowerBound).compareTo(module) < 0);
        }

        return candidate;
}
Respuesta 1

Utiliza la búsqueda binaria. Por ejemplo, para encontrar Z, comience con Zmin = 0 y Zmax = N. Calcule Zmid = (Zmin + Zmax) / 2, luego compare Zmid ^ j versus N. si Zmin ^ j <N, luego configure Zmin = Zmid. De lo contrario, establezca Zmax = Zmid. Eventualmente, se reducirá a la Z correcta en el tiempo O (log (N)).

Respuesta: 2

Una forma es resolver la ecuación directamente tomando el logaritmo de tus expresiones:

   k * log (Y) < log (N)
=> log (Y) < log (N) / k

   j * log (Z) < log (N) < (j + 1) * log (Z)
=> log (Z) < log (N) / j AND log (Z) > log (N) / (j + 1)

Una vez que haya determinado un valor para log(Y)y log(Z), puede tomar el exponencial (para el registro neperiano o la potencia de 10 para el registro 10) de su resultado para volver a Y y Z.

Puede leer aquí sobre varias formas de calcular el registro de un BigInteger. Parece sensato ejecutar el cálculo en BigDecimal, luego redondear (arriba o abajo) a BigInteger y verificar que funciona.

Respuesta: 3

Me gustaría cargar una imagen en mi programa, pero de inmediato mi jar ejecutable también podrá hacerlo. Tan nuevo ImageIcon (URL); a JLabel realmente no funciona. Todos mis archivos java están en la carpeta src, en ...

Tengo un problema para que xjc genere una clase con una extensión de grupo de elección que mantenga el orden. El siguiente esquema es un ejemplo. <xs: complexType name = "base"> <xs: elección ...

Quiero escribir un pequeño programa que pueda encontrar el primer número primo largo de 10 dígitos del número euler. El número en el lugar 99 es el número que estoy buscando, pero isPrim () ...

Quería diseñar una relación de muchos a muchos con la clave de composición a través de hibernación. Usé 3 clases, incluidas la clase book, orders y orderDetail, excepto la clase key de composición. En la base de datos, hay ...