Evaluación modular
Anterior | Capítulo 5. Conceptos de GEL | Siguiente

## Evaluación modular

Genius implementa aritmética modular. Para usarla, simplemente añada «mod <entero>» después de la expresión. Ejemplo: `2^(5!) * 3^(6!) mod 5` Podría ser posible realizar aritmética modular trabajando con enteros y aplicando el módulo al final con el operador `%`, que simplemente devuelve el resto, pero puede requerir más tiempo o ser imposible cuando se trabaja con valores muy elevados. Por ejemplo `10^(10^10) % 6` puede que no funcione (el exponente es demasiado grande), sin embargo `10^(10^10) mod 6` es instantáneo. La primera expresión primero intenta calcular el entero `10^(10^10)` y luego el resto de la división por 6, mientras que la segunda expresión calcula el módulo 6 de todo primero que nada.

Dados dos números enteros a y b, puede calcular el inverso multiplicativo de a módulo b usando números racionales (desde luego, el inverso debe existir). Ejemplos:

    10^-1 mod 101
    1/10 mod 101

Puede obtener la evaluación modular de una matriz, calcular potencias, la matriz inversa y dividir. Ejemplo:

    A = [1,2;3,4]
    B = A^-1 mod 5
    A*B mod 5

Es la matriz identidad, pues B es la matriz inversa de A módulo 5.

Algunas funciones como `sqrt` o `log` trabajan de una manera diferente en modo módulo. Éstas utilizarán sus versiones discretas trabajando en el entorno de enteros que el usuario ha seleccionado. Por ejemplo:

    genius> sqrt(4) mod 7
    =
    [2, 5]
    genius> 2*2 mod 7
    = 4

`sqrt` devolverá todas las raíces cuadradas posibles.

No concatene operadores mod, solo colóquelos al final del cálculo, todos los cálculos en la expresión que está a la izquierda se llevarán a cabo bajo aritmética mod. Si coloca un operador mod dentro de un mod seguramente obtendrá resultados inesperados. Si solo quiere aplicar mod a un único número y controlar cuándo se toma el resto, es mejor utilizar el operador `%`. Cuando necesita concatenar varias expresiones en una aritmética modular con diferentes divisores, lo mejor es simplemente dividir la expresión en varias y usar variables temporales para evitar un mod dentro de un mod.

Anterior | Subir | Siguiente
Comentarios | Inicio | Lista de operadores GEL