Tablas de operaciones binarias
Para representar las operaciones binarias en un conjunto finito A con n elementos se pueden numerar sus elementos desde el 0 al n-1. Entonces cada operación binaria en A se puede ver como una lista de listas xss tal que el valor de aplicar la operación a los elementos i y j es el j-ésimo elemento del i-ésimo elemento de xss. Por ejemplo, si A = {0,1,2} entonces las tabla de la suma y de la resta módulo 3 en A son
| 1 2 3 4 |    0 1 2    0 2 1    1 2 0    1 0 2    2 0 1    2 1 0    Suma     Resta | 
Definir las funciones
| 1 2 3 4 |    tablaOperacion :: (Int -> Int -> Int) -> Int -> [[Int]]    tablaSuma      :: Int -> [[Int]]    tablaResta     :: Int -> [[Int]]    tablaProducto  :: Int -> [[Int]] | 
tales que
- (tablaOperacion f n) es la tabla de la operación f módulo n en [0..n-1]. Por ejemplo,
| 1 2 3 4 |      tablaOperacion (+) 3  ==  [[0,1,2],[1,2,0],[2,0,1]]      tablaOperacion (-) 3  ==  [[0,2,1],[1,0,2],[2,1,0]]      tablaOperacion (-) 4  ==  [[0,3,2,1],[1,0,3,2],[2,1,0,3],[3,2,1,0]]      tablaOperacion (\x y -> abs (x-y)) 3  ==  [[0,1,2],[1,0,1],[2,1,0]] | 
- (tablaSuma n) es la tabla de la suma módulo n en [0..n-1]. Por ejemplo,
| 1 2 |      tablaSuma 3  ==  [[0,1,2],[1,2,0],[2,0,1]]      tablaSuma 4  ==  [[0,1,2,3],[1,2,3,0],[2,3,0,1],[3,0,1,2]] | 
- (tablaResta n) es la tabla de la resta módulo n en [0..n-1]. Por ejemplo,
| 1 2 |      tablaResta 3  ==  [[0,2,1],[1,0,2],[2,1,0]]      tablaResta 4  ==  [[0,3,2,1],[1,0,3,2],[2,1,0,3],[3,2,1,0]] | 
- (tablaProducto n) es la tabla del producto módulo n en [0..n-1]. Por ejemplo,
| 1 2 |      tablaProducto 3  ==  [[0,0,0],[0,1,2],[0,2,1]]      tablaProducto 4  ==  [[0,0,0,0],[0,1,2,3],[0,2,0,2],[0,3,2,1]] | 
Comprobar con QuickCheck, si parato entero positivo n de verificar las siguientes propiedades:
- La suma, módulo n, de todos los números de (tablaSuma n) es 0.
- La suma, módulo n, de todos los números de (tablaResta n) es 0.
- La suma, módulo n, de todos los números de (tablaProducto n) es n/2 si n es el doble de un número impar y es 0, en caso contrario.
Soluciones
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import Test.QuickCheck tablaOperacion :: (Int -> Int -> Int) -> Int -> [[Int]] tablaOperacion f n =   [[f i j `mod` n | j <- [0..n-1]] | i <- [0..n-1]] tablaSuma :: Int -> [[Int]] tablaSuma = tablaOperacion (+) tablaResta :: Int -> [[Int]] tablaResta = tablaOperacion (-) tablaProducto :: Int -> [[Int]] tablaProducto = tablaOperacion (*) -- (sumaTabla xss) es la suma, módulo n, de los elementos de la tabla de -- operación xss (donde n es el número de elementos de xss). Por -- ejemplo,  --    sumaTabla [[0,2,1],[1,1,2],[2,1,0]]  ==  1 sumaTabla :: [[Int]] -> Int sumaTabla = sum . concat -- La propiedad de la tabla de la suma es prop_tablaSuma :: (Positive Int) -> Bool prop_tablaSuma (Positive n) =   sumaTabla (tablaSuma n) == 0 -- La comprobación es --    λ> quickCheck prop_tablaSuma --    +++ OK, passed 100 tests. -- La propiedad de la tabla de la resta es prop_tablaResta :: (Positive Int) -> Bool prop_tablaResta (Positive n) =   sumaTabla (tablaResta n) == 0 -- La comprobación es --    λ> quickCheck prop_tablaResta --    +++ OK, passed 100 tests. -- La propiedad de la tabla del producto es prop_tablaProducto :: (Positive Int) -> Bool prop_tablaProducto (Positive n)   | even n && odd (n `div` 2) = suma == n `div` 2   | otherwise                 = suma == 0   where suma = sumaTabla (tablaProducto n) | 
Pensamiento
¿Tu verdad? No, la Verdad,
y ven conmigo a buscarla.
La tuya guárdatela.Antonio Machado