Menu Close

Números que no son cuadrados

Definir las funciones

   noCuadrados :: [Integer]
   graficaNoCuadrados :: Integer -> IO ()

tales que

  • noCuadrados es la lista de los números naturales que no son cuadrados. Por ejemplo,
     λ> 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
    Numeros_que_no_son_cuadrados_300
    (graficaNoCuadrados 3000) dibuja
    Numeros_que_no_son_cuadrados_3000
    (graficaNoCuadrados 30000) dibuja
    Numeros_que_no_son_cuadrados_30000

Comprobar con QuickCheck que el término de noCuadrados en la posición n-1 es (n + floor(1/2 + sqrt(n))).

Soluciones

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.

7 soluciones de “Números que no son cuadrados

  1. angruicam1
    import Data.List               (genericTake, genericIndex)
    import Test.QuickCheck
    import Graphics.Gnuplot.Simple (plotList, Attribute (Key))
     
    noCuadrados :: [Integer]
    noCuadrados = aux 2 [1..]
      where aux n (x:xs) = ys ++ aux (n+2) zs
              where (ys,zs) = splitAt n xs
     
    graficaNoCuadrados :: Integer -> IO ()
    graficaNoCuadrados n =
      plotList
      [Key Nothing]
      (zipWith (-) (genericTake n noCuadrados) [0..])
     
    -- Propiedad
    -- =========
     
    -- La propiedad es
    prop_noCuadrados :: (Positive Integer) -> Bool
    prop_noCuadrados (Positive n) =
      genericIndex noCuadrados (n-1)
      == n + floor (1/2 + sqrt (fromIntegral n))
     
    -- La comprobación es
    --    λ> quickCheck prop_noCuadrados
    --    +++ OK, passed 100 tests.
  2. jaibengue
    import Graphics.Gnuplot.Simple
    import Test.QuickCheck
     
    noCuadrados :: [Integer]
    noCuadrados = aux [2..] 4
      where aux (x:xs) z | x == z    = aux xs ((floor(sqrt(fromIntegral z))+1)^2)
                         | otherwise = x : aux xs z
     
    graficaNoCuadrados :: Integer -> IO ()
    graficaNoCuadrados n = plotList [] (aux (take (fromIntegral n) noCuadrados))
      where aux :: [Integer] -> [Integer]
            aux (y:ys) = (1+(floor(sqrt (fromIntegral y)))) : (aux ys)
            aux _ = []
     
    prop_noCuadrados :: Integer -> Property
    prop_noCuadrados n = n>0 ==> noCuadrados !! (t-1) ==  (n + (floor (1/2 + sqrt(fromIntegral n))))
      where t = fromIntegral n
     
    -- Y la comprobación es:
     
    -- λ> quickCheck prop_noCuadrados
    -- +++ OK, passed 100 tests.
    -- (0.01 secs, 3,991,304 bytes)
  3. albcarcas1
     
    import Graphics.Gnuplot.Simple
    import Test.QuickCheck
    import Data.List  (genericTake)
     
    noCuadrados :: [Integer]
    noCuadrados = filter (noCuadrado) [2..]
     
    noCuadrado :: Integer -> Bool
    noCuadrado n |length a == 1 && even (head a) = False
                 |otherwise = True
      where a = (map length (group (primeFactors n)))
     
    graficaNoCuadrados :: Integer -> IO ()
    graficaNoCuadrados n = plotList [Title "Numeros que no son cuadrados", 
                                     Key Nothing] 
                           (zipWith (-) (genericTake n noCuadrados) [0..])  
     
    prop_noCuadrados :: Integer -> Property
    prop_noCuadrados n = n > 0 ==> noCuadrados !! (fromIntegral n-1) ==  
                                   (n + (floor (1/2 + sqrt(fromIntegral n))))
    • antgongar

      La definición de noCuadrado es incorrecta. Por ejemplo,

      λ> noCuadrado 36
      True

      pero 36 es el cuadrado de 6.

  4. menvealer
    import Data.List
    import Graphics.Gnuplot.Simple
     
    noCuadrados :: [Integer]
    noCuadrados = [x | x <- [1..], (not . esCuadrado) x]
     
    esCuadrado :: Integer -> Bool
    esCuadrado n = elem n [x^2 | x <- [1..(floor.sqrt.fromIntegral) n]]
     
    graficaNoCuadrados :: Integer -> IO ()
    graficaNoCuadrados n =
      plotList [Key Nothing,
                Title ("No cuadrados hasta" ++ " " ++ show n)]
               (zipWith (-) noCuadrados [0..n])
  5. anadebla
    import Data.List
    import Graphics.Gnuplot.Simple
     
    noCuadrados :: [Integer]
    noCuadrados =
      nub [x | x <- [2..]
             , (raizCuadradaEntera x) * (raizCuadradaEntera x)  /= x]
     
    raizCuadradaEntera :: Integer -> Integer
    raizCuadradaEntera n = truncate (sqrt (fromIntegral n))
     
    graficaNoCuadrados :: Integer -> IO ()
    graficaNoCuadrados n =
      plotList [ Title ("Grafica Diferencia con su posicion No Cuadrados hasta n, para n = " ++ show n)
               , Key Nothing]
               (genericTake n (noCuadradosPosicion))
     
    noCuadradosPosicion :: [Integer]
    noCuadradosPosicion = [sum [x,-y] | (x,y) <- zip noCuadrados ([1..])]
  6. carbremor
    import Data.List
    import Graphics.Gnuplot.Simple
    import Control.Applicative
     
    noCuadrados :: [Integer]
    noCuadrados = concat $ (zipWith entre <*> tail) cuadrados
      where
        cuadrados = [n * n | n <- [1..]]
        entre n m = [n+1 .. m-1]
     
    -- Eficiencia
     
    -- λ> 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]
    -- (0.01 secs, 133,008 bytes)
     
    -- λ>  noCuadrados !! 258
    -- 275
    -- (0.04 secs, 124,344 bytes)
     
    -- λ>  genericLength(show(noCuadrados !! 25^378-8))
    -- 564
    -- (0.02 secs, 149,688 bytes)
     
    -- λ> noCuadrados !! 25^375 
    --18223642531500045957913062965842663289344226711176211217138728315956858997202735631855641013326051126299348620788459324466169779359523403583687117539543481521788500874368310345411295517397336946998392384488924758661435432752827225578319391010864658319515124984498559401119538137465219068290309136796140672041881111525138814440121251942415868896909814490207920964720866917897099320294765960247930646490972072999326789370646562620822064722399331168918177792691758947026943449336071997249237160839565061291805061750351081513165450091830699737779257463027398998751
    -- (0.03 secs, 565,608 bytes)
     
     
    -- Gráfica
     
    graficaNoCuadrados :: Integer -> IO()
    graficaNoCuadrados n  = plotList []  (zipWith (-) (genericTake n noCuadrados) [0..])
     
     
    -- Propiedad
    prop_noCuadrados :: Integer -> Property
    prop_noCuadrados n = n>0 ==> noCuadrados !! (t-1) ==  (n + (floor (1/2 + sqrt(fromIntegral n))))
      where t = fromIntegral n
     
    -- λ> quickCheck prop_noCuadrados
    -- +++ OK, passed 100 tests.
    -- (0.06 secs, 3,785,792 bytes)

Leave a Reply

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.