Matrices de Hadamard
Las matrices de Hadamard se definen recursivamente como sigue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
λ> hadamard 0 ( 1 ) λ> hadamard 1 ( 1 1 ) ( 1 -1 ) λ> hadamard 2 ( 1 1 1 1 ) ( 1 -1 1 -1 ) ( 1 1 -1 -1 ) ( 1 -1 -1 1 ) λ> hadamard 3 ( 1 1 1 1 1 1 1 1 ) ( 1 -1 1 -1 1 -1 1 -1 ) ( 1 1 -1 -1 1 1 -1 -1 ) ( 1 -1 -1 1 1 -1 -1 1 ) ( 1 1 1 1 -1 -1 -1 -1 ) ( 1 -1 1 -1 -1 1 -1 1 ) ( 1 1 -1 -1 -1 -1 1 1 ) ( 1 -1 -1 1 -1 1 1 -1 ) |
En general, la n-ésima matriz de Hadamard, H(n), es
1 2 |
( H(n-1) H(n-1) ) ( H(n-1) -H(n-1) ) |
Definir la función
1 |
hadamard :: Int -> Matrix Int |
tal que (hadamard n) es la n-ésima matriz de Hadamard.
Comprobar con QuickCheck que para todo número natural n, el producto de la n-ésima matriz de Hadamard y su traspuesta es igual al producto de 2^n por la matriz identidad de orden 2^n.
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import Data.Matrix (Matrix, identity, joinBlocks, scaleMatrix, transpose) import Test.QuickCheck hadamard :: Int -> Matrix Int hadamard 0 = identity 1 hadamard n = joinBlocks (a, a, a, b) where a = hadamard (n-1) b = scaleMatrix (-1) a -- La propiedad es prop_Hadamard :: (Positive Int) -> Bool prop_Hadamard (Positive n) = h * transpose h == scaleMatrix (2^n) (identity (2^n)) where h = hadamard n -- La comprobación es -- λ> quickCheckWith (stdArgs {maxSize=7}) prop_Hadamard -- +++ OK, passed 100 tests. |
Otras soluciones
- Se pueden escribir otras soluciones en los comentarios.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>