Números que no son cuadrados
Definir las funciones
1 2 |
noCuadrados :: [Integer] graficaNoCuadrados :: Integer -> IO () |
tales que
- noCuadrados es la lista de los números naturales que no son cuadrados. Por ejemplo,
1 2 |
λ> take 25 noCuadrados [2,3,5,6,7,8,10,11,12,13,14,15,17,18,19,20,21,22,23,24,26,27,28,29,30] |
- (graficaNoCuadrados n) dibuja las diferencias entre los n primeros elementos de noCuadrados y sus posiciones. Por ejemplo, (graficaNoCuadrados 300) dibuja
(graficaNoCuadrados 3000) dibuja
(graficaNoCuadrados 30000) dibuja
Comprobar con QuickCheck que el término de noCuadrados en la posición n-1 es (n + floor(1/2 + sqrt(n))).
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 |
import Data.List (genericIndex) import Graphics.Gnuplot.Simple import Test.QuickCheck -- 1ª definición -- ============= noCuadrados :: [Integer] noCuadrados = aux [0..] cuadrados where aux xs (y:ys) = as ++ aux bs ys where (as,_:bs) = span (<y) xs cuadrados :: [Integer] cuadrados = [x^2 | x <- [0..]] -- 2ª definición -- ============= noCuadrados2 :: [Integer] noCuadrados2 = aux 2 [1..] where aux n (_:xs) = ys ++ aux (n+2) zs where (ys,zs) = splitAt n xs -- Definición de graficaNoCuadrados -- ================================ graficaNoCuadrados :: Integer -> IO () graficaNoCuadrados n = plotList [ Key Nothing , PNG ("Numeros_que_no_son_cuadrados_" ++ show n ++ ".png") ] (zipWith (-) noCuadrados [0..n-1]) -- La propiedad es prop_noCuadrados :: Positive Integer -> Bool prop_noCuadrados (Positive n) = noCuadrados `genericIndex` (n-1) == n + floor (1/2 + sqrt (fromIntegral n)) -- La comprobación es -- λ> quickCheck prop_noCuadrados -- +++ OK, passed 100 tests. |
La definición de noCuadrado es incorrecta. Por ejemplo,
pero 36 es el cuadrado de 6.