Menu Close

Impares en filas del triángulo de Pascal

El triángulo de Pascal es un triángulo de números

         1
        1 1
       1 2 1
     1  3 3  1
    1 4  6  4 1
   1 5 10 10 5 1
  ...............

construido de la siguiente forma

  • la primera fila está formada por el número 1;
  • las filas siguientes se construyen sumando los números adyacentes de la fila superior y añadiendo un 1 al principio y al final de la fila.

Definir las funciones

   imparesPascal          :: [[Integer]]
   nImparesPascal         :: [Int]
   grafica_nImparesPascal :: Int -> IO ()

tales que

  • imparesPascal es la lista de los elementos impares en cada una de las filas del triángulo de Pascal. Por ejemplo,
     λ> take 8 imparesPascal
     [[1],[1,1],[1,1],[1,3,3,1],[1,1],[1,5,5,1],[1,15,15,1],[1,7,21,35,35,21,7,1]]
  • nImparesPascal es la lista del número de elementos impares en cada una de las filas del triángulo de Pascal. Por ejemplo,
     λ> take 32 nImparesPascal
     [1,2,2,4,2,4,4,8,2,4,4,8,4,8,8,16,2,4,4,8,4,8,8,16,4,8,8,16,8,16,16,32]
     λ> maximum (take (10^6) nImparesPascal3)
     524288
  • (grafica_nImparesPascal n) dibuja la gráfica de los n primeros términos de nImparesPascal. Por ejemplo, (grafica_nImparesPascal 50) dibuja

y (grafica_nImparesPascal 100) dibuja

Comprobar con QuickCheck que todos los elementos de nImparesPascal son potencias de dos.

Soluciones

import Data.List (transpose)
import Test.QuickCheck
import Graphics.Gnuplot.Simple
 
-- 1ª definición de imparesPascal
-- ==============================
 
imparesPascal :: [[Integer]]
imparesPascal =
  map (filter odd) pascal
 
-- pascal es la lista de las filas del triángulo de Pascal. Por ejemplo,
--    λ> take 7 pascal
--    [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1],[1,6,15,20,15,6,1]]
pascal :: [[Integer]]
pascal = [1] : map f pascal
  where f xs = zipWith (+) (0:xs) (xs++[0])
 
-- 2ª definición de imparesPascal
-- ==============================
 
imparesPascal2 :: [[Integer]]
imparesPascal2 =
  map (filter odd) pascal
 
pascal2 :: [[Integer]]
pascal2 = iterate f [1]
  where f xs = zipWith (+) (0:xs) (xs++[0])
 
-- 1ª definición de nImparesPascal
-- ===============================
 
nImparesPascal :: [Int]
nImparesPascal =
  map length imparesPascal
 
-- 2ª definición de nImparesPascal
-- ===============================
 
nImparesPascal2 :: [Int]
nImparesPascal2 =
  map (length . filter odd) imparesPascal
 
-- 3ª definición de nImparesPascal
-- ===============================
 
--    λ> take 32 nImparesPascal2
--    [1,2,
--     2,4,
--     2,4,4,8,
--     2,4,4,8,4,8,8,16,
--     2,4,4,8,4,8,8,16,4,8,8,16,8,16,16,32]
nImparesPascal3 :: [Int]
nImparesPascal3 = 1 : zs
  where zs = 2 : concat (transpose [zs, map (*2) zs])
 
-- Definición de grafica_nImparesPascal
-- =========================================
 
grafica_nImparesPascal :: Int -> IO ()
grafica_nImparesPascal n =
  plotListStyle
    [ Key Nothing
    , PNG ("Impares_en_filas_del_triangulo_de_Pascal_" ++ show n ++ ".png")
    ]
    (defaultStyle {plotType = LinesPoints})
    (take n nImparesPascal3)
 
-- Propiedad de nImparesPascal
-- ===========================
 
-- La propiedad es
prop_nImparesPascal :: Positive Int -> Bool
prop_nImparesPascal (Positive n) =
  esPotenciaDeDos (nImparesPascal3 !! n)
 
-- (esPotenciaDeDos n) se verifica si n es una potencia de dos. Por
-- ejemplo,
--    esPotenciaDeDos 16  ==  True
--    esPotenciaDeDos 18  ==  False
esPotenciaDeDos :: Int -> Bool
esPotenciaDeDos 1 = True
esPotenciaDeDos n = even n && esPotenciaDeDos (n `div` 2)
 
-- La comprobación es
--    λ> quickCheck prop_nImparesPascal
--    +++ OK, passed 100 tests.

Pensamiento

De lo que llaman los hombres
virtud, justicia y bondad,
una mitad es envidia,
y la otra no es caridad.

Antonio Machado

Medio

6 soluciones de “Impares en filas del triángulo de Pascal

  1. frahidzam
    import Data.List (nub)
    import Data.Numbers.Primes (primeFactors)
    import Graphics.Gnuplot.Simple
     
    imparesPascal :: [[Integer]]
    imparesPascal = map (filter odd) (iterate f [1])
      where f xs = zipWith (+) (0:xs) (xs++[0])
     
    nImparesPascal :: [Int]
    nImparesPascal = map length imparesPascal
     
    grafica_nImparesPascal :: Int -> IO ()
    grafica_nImparesPascal n =
      plotList [ Key Nothing
               , PNG "n_Impares_Pascal.png"]
               (take n nImparesPascal)
     
    prop_nImparesPascal :: Int -> Property
    prop_nImparesPascal n =
      n > 0 ==> nub (primeFactors (nImparesPascal !! n)) == [2]
    • frahidzam
      import Data.List (nub)
      import Data.Numbers.Primes (primeFactors)
      import Graphics.Gnuplot.Simple
       
      imparesPascal :: [[Integer]]
      imparesPascal = map (filter odd) (iterate f [1])
        where f xs = zipWith (+) (0:xs) (xs++[0])
       
      nImparesPascal :: [Int]
      nImparesPascal = 1 : zs where
        zs = 2 : (concat (transpose [zs, map (*2) zs]))
       
      grafica_nImparesPascal :: Int -> IO ()
      grafica_nImparesPascal n =
        plotList [ Key Nothing
                 , PNG "n_Impares_Pascal.png"]
                 (take n nImparesPascal)
       
      prop_nImparesPascal :: Int -> Property
      prop_nImparesPascal n =
        n > 0 ==> nub (primeFactors (nImparesPascal !! n)) == [2]
  2. berarcmat
    import Graphics.Gnuplot.Simple
    import Data.Numbers.Primes (primeFactors)
    import Data.List (nub)
     
    imparesPascal :: [[Integer]]
    imparesPascal = [filter odd xs | xs <- trianguloPascal]
     
    trianguloPascal :: [[Integer]]
    trianguloPascal = [1] : iterate pares [1,1]
     
    pares :: [Integer] -> [Integer]
    pares xs = head xs: adyacentesSuma xs ++ [last xs]
     
    adyacentesSuma :: [Integer] -> [Integer]
    adyacentesSuma xs  = [a + b | (a,b) <- zip xs (tail xs)]
     
    nImparesPascal :: [Int]
    nImparesPascal = [length xs | xs <- imparesPascal]
     
    grafica_nImparesPascal :: Int -> IO ()
    grafica_nImparesPascal n =
      plotList [ Key Nothing
               , PNG "grafica_nImparesPascal.png"]
               (nImparesPascal)
     
    prop_nImparesPascal :: Int -> Property
    prop_nImparesPascal n =
      n > 0 ==> nub (primeFactors (nImparesPascal !! n)) == [2]
  3. adogargon
    import Graphics.Gnuplot.Simple
     
    imparesPascal :: [[Integer]]
    imparesPascal = map (filter odd) pascal
     
    pascal :: [[Integer]]
    pascal = [fila x | x <- [0..]]
     
    fila :: Integer -> [Integer]
    fila x = [combinatorio x n | n <- [0..x]]
     
    combinatorio :: Integer -> Integer -> Integer
    combinatorio n x =
      factorial n `div` (factorial x * factorial (n-x)) 
     
    factorial :: Integer -> Integer
    factorial 0 = 1
    factorial x = product [1..x]
     
    nImparesPascal :: [Int]
    nImparesPascal = map length imparesPascal
     
    grafica_nImparesPascal :: Int -> IO ()
    grafica_nImparesPascal n =
      plotList [ Key Nothing
               , PNG "grafica_nImparesPascal.png"]
               (nImparesPascal)
  4. luipromor
    import Graphics.Gnuplot.Simple
     
    imparesPascal :: [[Integer]]
    imparesPascal = map (filter odd) pascal
      where
        pascal = [[combinatoria n x | x <- [0..n]] |  n <- [0..]]
        combinatoria n x = div (product [1..n]) (product [1..x] * product [1..n-x])
     
    nImparesPascal :: [Int]
    nImparesPascal = map length imparesPascal
     
    grafica_nImparesPascal :: Int -> IO ()
    grafica_nImparesPascal n =
      plotList [Key Nothing]
               (take n nImparesPascal)
  5. luipromor
    imparesPascal          :: [[Integer]]
    imparesPascal = map (filter odd) pascal
      where pascal = [[ combinatoria n x | x <- [0..n]] |  n <- [0..]]
              where combinatoria n x = div ( product [1..n]) (product[1..x] * product[1..(n-x)])
     
    nImparesPascal         :: [Int]
    nImparesPascal = map length imparesPascal
     
    grafica_nImparesPascal :: Int -> IO ()
    grafica_nImparesPascal n = plotList [Key Nothing] (take n nImparesPascal)
     
    prop_pascal :: Int -> Property
    prop_pascal n = n>=0 ==> all f  (drop 1 (take n nImparesPascal))
      where f x = (nub.primeFactors) x == [2]

Escribe tu solución

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