Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Práctica 8
Aritmética modular
En Matemática Discreta has estudiado la relación de congruencia módulo .
Ya sabes que ℤ = {0, 1, 2, … , − 1}
La función mod de Matlab sirve para trabajar en aritmética modular. Por ejemplo: mod(26, 3) = 2
Podemos observar, viendo la tabla de multiplicar de ℤ en la tabla 1, que todos los números no nulos
de ℤ son inversibles: para cada uno de ellos siempre hay otro que multiplicado por él da como
resultado la unidad. Así, el inverso de 2 módulo 5 es el 3 ya que 3 × 2 = 6 = 1(mod 5) .
0 1 2 3 4
0 0 0 0 0 0
1 0 1 2 3 4
2 0 2 4 1 3
3 0 3 1 4 2
4 0 4 3 2 1
Sin embargo, como podemos ver con la tabla de multiplicar en ℤ mostrada en la tabla 2, no todos los
números no nulos en ℤ son inversibles.
× 0 1 2 3 4 5
0 0 0 0 0 0 0
1 0 1 2 3 4 5
2 0 2 4 0 2 4
3 0 3 0 3 0 3
4 0 4 2 0 4 2
5 0 5 4 3 2 1
Observación: Es fácil saber cuándo un número x es inversible en ℤ ya que puede demostrarse (visto
en Matemática Discreta) que basta con que sea primo relativo con el módulo m , o lo que es lo mismo
que el máximo común divisor de ambos sea 1, es decir: mcd ( m , x ) = 1 .
En el caso particular de que el módulo m sea un número primo, todos los elementos no nulos de ℤ
serán primos relativos con él y, por lo tanto, serán inversibles.
Matlab trae incorporada una función que calcula el máximo común divisor de dos números: la función
“gcd” (greatest common divisor). Así, por ejemplo: (2, 9) = 1
Ejemplo
Calcular el valor de la siguiente expresión módulo 31:
(7 − 2) (1 − 5) (23 + 4)
(2 − 3)(5 + 4)
Veamos:
(7 − 2) (1 − 5) (23 + 4) = 5 × (−4) × 27 = −540 = 18 ( 31)
(2 − 3)(5 + 4) = −9 = 22
Por lo tanto:
( !") (#! ) ("$%&) #'
= ""
("!$)( %&)
Sabemos que una matriz ) es inversible si y sólo si tiene determinante no nulo y que su inversa viene
#
dada por: )!# = |+| (, -())).
a b 1 d − b
Si A = y A ≠ 0 ⇒ A −1 =
c d A − c a
Cuando trabajamos módulo también podremos aplicar la fórmula anterior pero será necesario que
#
|)| sea un número inversible módulo (porque aparece ) , por lo tanto, el |)| debe ser primo
|+|
1
= |)|!# ( )
|)|
4 2
Por ejemplo, la matriz: A = no será inversible módulo 15 ya que el determinante vale 10 que
1 3
no es primo relativo con el módulo: el 10 no tiene inverso módulo 15.
4 2
Sin embargo, la matriz A = sí que será inversible módulo 7 ya que: A = 10 = 3 (mod 7) y 3
1 3
tiene inverso módulo 7 que es el 5 ya que: 3 × 5 = 1 (mod 7 ) .
103 − 102
En la aritmética habitual: A = −1
−1
4
10 10
3 − 102 1 3 − 2 3 − 2 15 − 10 1 4
A −1 = 10 4
= = 5 = = (mod 7)
10 10 10 − 1 4 − 1 4 − 5 20 2 6
−1
2 1 3
Calcular la inversa de A = 2 1 2 módulo 5
0 4 1
Vamos a cifrar una imagen digital con escala de grises entre 0 y 255. El método que vamos a ver a
continuación está inspirado en un trabajo de Lester Hill publicado en 1929. Se sigue investigando
actualmente en este método de cifrado proponiendo distintos autores algunas variantes, como puedes
ver por Internet. Basta con escribas en un buscador: image encryption Hill.
Supongamos que indicamos por A a la matriz correspondiente a la imagen original. Vamos a coger los
niveles de gris de dos en dos, empezando en la esquina superior izquierda de la matriz y moviéndonos
de izquierda a derecha y de arriba a abajo: el primer bloque será {a11 , a12 }, el segundo bloque será
{a13 , a14 }, y así sucesivamente.
Cada bloque de dos niveles de gris de la imagen original se va a transformar en otros dos números
mediante un producto matricial con una matriz secreta K de tamaño 2 × 2 (esto por supuesto se puede
cambiar y elegir como queramos).
Supongamos que el bloque que estamos procesando es: {103, 101} que se corresponde con los dos
primeros niveles de gris de la imagen ), es decir: )(1,1) = 103, )(1,2) = 101
21 35
Supongamos que elegimos como clave la matriz secreta es: K =
18 79
Como vemos los números {5698, 9833} exceden el valor 255 (máximo nivel de gris) y por lo tanto no
se corresponden con niveles de gris de una imagen. Para conseguir que el resultado proporcione
números entre 0 y 255, tomaremos módulo 256:
21 35 103 5698 66
= = (mod 256)
18 79 101 9833 105
Álgebra Lineal (Ingeniería Informática Práctica 8 pág. 5
Ahora el píxel que tenía nivel de gris 103 lo pondremos a 66 en la imagen cifrada y el píxel de al lado
que tenía nivel de gris 101 será puesto a 105. Es decir, si 2 es la imagen cifrada: 2(1,1) = 66,
2(1,2) = 105. De esta misma forma razonaremos con los dos píxeles siguientes, es decir el píxel
)(1,3), )(1,4). Y así sucesivamente.
De esta manera, vamos transformando cada par de valores de gris consecutivos por otro par de valores
de gris diferentes. De esta forma conseguimos cifrar la imagen. La imagen cifrada obtenida en este
caso se muestra en a continuación:
Tu trabajo consistirá en tomar la imagen “matricial.png” de la página web y descifrarla sabiendo que
21 35
hemos empleado en el cifrado la matriz K = y módulo 256.
18 79
) será una matriz uint8 (como puedes ver con la orden whos A). Pues bien, para poder trabajar con
normalidad con los elementos de ) debes cambiar el tipo a double. Por eso las primeras órdenes del
código que debes hacer serán:
A=imread('matricial.png');
A=double(A);
Supongamos que 2 es una matriz del mismo tamaño que la original que usas para almacenar los
niveles de gris descifrados. Esa matriz 2 será double. Pues bien para mostrarla por pantalla como una
imagen es obligatorio convertirla antes en uint8, es decir, debes escribir:
imshow(uint8(B))
Álgebra Lineal (Ingeniería Informática Práctica 8 pág. 6
67 249
(Sol. La matriz inversa de 4 es 4 !# = 0 1 ó . 256 )
150 209
P ( x) = s + a1 x + a 2 x 2
P ( x) = s + a1 x + a 2 x 2 = 1234 + 166 x + 94 x 2
Calculamos 6 puntos cualesquiera del polinomio del polinomio, por ejemplo:
(1, 1494), (3, 2578), (4, 3402), (6, 5614), (8, 8578), (11, 14434)
El distribuidor reparte aleatoriamente estos puntos entre sus seis empleados de confianza. Sólo cuando
se junten al menos tres de ellos tendremos datos suficientes para poder construir el polinomio P (x ) .
Una vez construido el polinomio será fácil recuperar el secreto s ya que: s = P (0)
Supongamos que al empleado nº 1 se le da el primer punto, al empleado nº 2 el segundo punto, y así en
adelante.
Como el polinomio desconocido tiene 3 coeficientes a determinar hará falta un mínimo de tres puntos
para poder determinarlo. Ahora bien, si se juntan tres o más sí que podrán reconstruir el polinomio.
Por ejemplo, supongamos que se juntan los empleados 2, 3, 5 y 6. El sistema a resolver sería:
Álgebra Lineal (Ingeniería Informática Práctica 8 pág. 7
s + 3 a1 + 9 a 2 = 2578
s + 4 a1 + 16 a 2 = 3402
s + 8 a1 + 64 a 2 = 8578
s + 11a1 + 121 a 2 = 14434
lo tanto, el sistema tiene solución única. Además, como r ( A* ) = 3 , cualesquiera tres ecuaciones nos
sirven para obtener la solución del sistema (hay una ecuación redundante). Usando la orden A\B,
comprueba que se obtiene la solución correcta.
La idea de Shamir es sencilla, el secreto se hace coincidir con el término independiente del polinomio
y el grado del polinomio depende del número mínimo de empleados que deben juntarse para poder
obtenerlo.
Para un esquema (6, 3) como el anterior, el polinomio debía ser de grado 2, para que el polinomio a
determinar tenga 3 incógnitas y hagan falta como mínimo 3 puntos para poder determinarlo.
Nº empleado 1 2 3 4 5
Punto (-1, 5) (1/2, 115/2) (1, 73) (2, 200) (3/2, 115)
Con lápiz y papel averiguar el secreto, a través de planteamiento y la resolución de los sistemas de
ecuaciones lineales correspondientes, en los siguientes casos:
Podríamos aplicar el método de reparto de secretos de Shamir, estudiado anteriormente, para el reparto
de una imagen digital. Sin embargo, vamos a hacer un esquema sencillo de reparto de secretos (2, 2)
con otro método diferente. La imagen original se muestra a la izquierda de la figura 3 y es de tamaño
256 × 256.
El dueño del secreto elegirá una matriz clave K inversible módulo 256 (bastará con que tenga
determinante impar) y la descompondrá en la suma de dos matrices: una K 1 formada por números
B1 = K 1 A (mod 256)
B 2 = K 2 A (mod 256)
Los dos participantes conocerán la matriz K solamente y sus respectivas sombras. Cuando se junten
los dos podrán recuperar la imagen secreta ya que:
B1 + B2 = K 1 A + K 2 A = ( K 1 + K 2 ) A = K A ⇒ A = K −1 ( B1 + B2 ) (mod 256)
Ejercicio 7 (ordenador)
En Moodle encontrarás las imágenes sombra1.png y sombra2.png. Ambas imágenes son las dos
sombras del esquema (2, 2) anterior aunque para otra imagen secreta. La matriz clave empleada fue:
3 121 206 47
45 0 155 25
K =
164 97 253 135
53 41 211 0
Esta matriz tiene la ventaja de ser autoinversible módulo 256, es decir, su inversa coincide con ella
misma, como puedes comprobar con Matlab con la orden mod(K*K, 256). Verás que te devuelve la
matriz identidad. Debes recuperar la imagen secreta a partir de las dos sombras.