En general, la n-ésima matriz de Hadamard, H(n), es
( H(n-1) H(n-1) )
( H(n-1) -H(n-1) )
( H(n-1) H(n-1) )
( H(n-1) -H(n-1) )
Definir la función
hadamard :: Int -> Matrix Int
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
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.
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>
import Data.Matrix
-- 1ª solución-- ===========
kronecker ::Num t => Matrix t -> Matrix t -> Matrix t
kronecker a b =
matrix (m*p)(n*q) f
where m = nrows a
n = ncols a
p = nrows b
q = ncols b
f (i,j)= a !(k+1,r+1)* b!(l+1,s+1)where(k,l)=quotRem(i-1) p
(r,s)=quotRem(j-1) q
-- 2ª solución-- ===========
kronecker2 a b = bloqueFila a b (ncols a)where
bloque (i,j) a b = scaleMatrix (a!(i,j)) b
bloqueFila a b 1= bloqueColumna 1 a b
bloqueFila a b n = bloqueFila a b (n-1)<|> bloqueColumna n a b
bloqueColumna j a b = aux a b (nrows a)where aux a b 1= bloque (1,j) a b
aux a b n = aux a b (n-1)<-> bloque (n,j) a b
-- 3ª solución-- ===========
kronecker3 ::Num t => Matrix t -> Matrix t -> Matrix t
kronecker3 a b =foldl1(<->)[foldl1(<|>)[scaleMatrix (a!(i,j)) b
| j <-[1..ncols b]]| i <-[1..nrows a]]
import Data.Matrix
-- 1ª solución
-- ===========
kronecker :: Num t => Matrix t -> Matrix t -> Matrix t
kronecker a b =
matrix (m*p) (n*q) f
where m = nrows a
n = ncols a
p = nrows b
q = ncols b
f (i,j) = a !(k+1,r+1) * b!(l+1,s+1)
where (k,l) = quotRem (i-1) p
(r,s) = quotRem (j-1) q
-- 2ª solución
-- ===========
kronecker2 a b = bloqueFila a b (ncols a)
where
bloque (i,j) a b = scaleMatrix (a!(i,j)) b
bloqueFila a b 1 = bloqueColumna 1 a b
bloqueFila a b n = bloqueFila a b (n-1) <|> bloqueColumna n a b
bloqueColumna j a b = aux a b (nrows a)
where aux a b 1 = bloque (1,j) a b
aux a b n = aux a b (n-1) <-> bloque (n,j) a b
-- 3ª solución
-- ===========
kronecker3 :: Num t => Matrix t -> Matrix t -> Matrix t
kronecker3 a b =
foldl1 (<->) [foldl1 (<|>) [scaleMatrix (a!(i,j)) b
| j <- [1..ncols b]]
| i <- [1..nrows a]]
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>
Pensamiento
«La resolución de problemas es una habilidad práctica como, digamos, la natación. Adquirimos cualquier habilidad práctica por imitación y práctica. Tratando de nadar, imitas lo que otras personas hacen con sus manos y pies para mantener sus cabezas sobre el agua, y, finalmente, aprendes a nadar practicando la natación. Al intentar resolver problemas, hay que observar e imitar lo que hacen otras personas al resolver problemas y, finalmente, se aprende a resolver problemas haciéndolos.»
En general, la n-ésima matriz de Hadamard, H(n), es
( H(n-1) H(n-1) )
( H(n-1) -H(n-1) )
( H(n-1) H(n-1) )
( H(n-1) -H(n-1) )
Definir la función
hadamard :: Int -> Matrix Int
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
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.
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.