Alters

BigInteger - Funciones complejas: Potenciación de BigInteger

Hola de nuevo!

En esta entrada, vamos a seguir ahondando en la arquitectura de BigInteger.
En este caso, vamos a entrar en la operación de potenciación de BigInteger.

  • ¿No es la entrada que buscabas? Entra en el índice
  • ¿Buscas el código fuente? Aquí lo tienes

¡Vamos allá!


En esta entrada, estamos en la zona de operaciones más complejas, y quizá menos usadas.
Este tipo de operaciones (de tercer nivel) se basan en la utilización de operaciones de segundo nivel (multiplicación, principalmente), por lo que el coste de estas operaciones es exponencial a medida que crecen los números.

No obstante, la arquitectura está bastante optimizada (no quiero presumir), y el incremento en el coste computacional no es tan elevado a medida que aumenta el número de dígitos de BigInteger.

Para el caso de la potenciación de BigInteger, la optimización a la que se llegó fue el generar un valor binario asociado al exponente para reducir en gran número el cálculo.
Esto ya os lo adelantaba hace algún tiempo :D

Igualmente, vamos a hacer una explicación de la función, como con el resto.

Primero, como siempre, se validan los datos de entrada y se copian a variables intermedias; seguidamente, se realizan algunas validaciones para evitar cálculos innecesarios

  • Si el exponente es 0, el resultado será 1
  • Si el exponente es 1, el resultado será "a"

Tener en cuenta que el exponente siempre será un valor entero, y (por motivos de capacidad), el exponente no puede superar 1.023, ya que un número "n" elevado a esa potencia supera los 4.096 dígitos de longitud. Seguro.

En caso que el exponente esté entre 1 y 1023, se binariza el exponente y se calculan las potencias en formato a^2^n, que se van sumando según lo indique la codificación binaria del exponente.

Finalmente, se copian los datos a la salida y se libera memoria.

Como podéis ver, al usar operaciones ya explicadas, se hace mucho más sencillo ir entendiendo los conceptos una vez la base está clara.



Y con esto terminamos una de las operaciones complejas... solo queda una operación más!

¡Nos vemos!

No hay comentarios:

Publicar un comentario