Menu Close

La sucesión ECG

 

La sucesión ECG estás definida por a(1) = 1, a(2) = 2 y, para n >= 3, a(n) es el menor natural que aún no está en la sucesión tal que a(n) tiene algún divisor común con a(n-1).

Los primeros términos de la sucesión son 1, 2, 4, 6, 3, 9, 12, 8, 10, 5, 15, …

Al dibujar su gráfica, se parece a la de los electrocardiogramas (abreviadamente, ECG). Por ello, la sucesión se conoce como la sucesión ECG.

Definir las funciones

   sucECG :: [Integer]
   graficaSucECG :: Int -> IO ()

tales que

  • sucECG es la lista de los términos de la sucesión ECG. Por ejemplo,
     λ> take 20 sucECG
     [1,2,4,6,3,9,12,8,10,5,15,18,14,7,21,24,16,20,22,11]
     λ> sucECG !! 6000
     6237
  • (graficaSucECG n) dibuja la gráfica de los n primeros términos de la sucesión ECG. Por ejemplo, (graficaSucECG 160) dibuja

Soluciones


import Data.List (delete)
import Graphics.Gnuplot.Simple
 
sucECG :: [Integer]
sucECG = 1 : ecg 2 [2..]
  where ecg x zs = f zs
          where f (y:ys) | gcd x y > 1 = y : ecg y (delete y zs)
                         | otherwise   = f ys
 
graficaSucECG :: Int -> IO ()
graficaSucECG n =
  plotList [ Key Nothing
           , PNG "La_sucesion_ECG.png" 
           ]
           (take n sucECG)
Ejercicio

4 soluciones de “La sucesión ECG

  1. Enrique Zubiría
    import Graphics.Gnuplot.Simple
     
    sucECG :: [Integer]
    sucECG = 1:2:map ecg (zip (tail sucECG) [2..])
      where ecg (x, p) = head [n | n <- [3..], gcd n x /= 1 && not (elem n (take p sucECG))]
     
    graficaSucECG :: Int -> IO ()
    graficaSucECG n = do
      plotList [ Key Nothing
               , PNG "graficas/graficaSucECG.png"
               ]
               (take n sucECG)
  2. fercarnav
    import Data.List
    import Data.Numbers.Primes
    import Graphics.Gnuplot.Simple
     
    sucECG ::  [Integer]
    sucECG =  1:2: sucECG2 2 [3..]
     
    sucECG2 :: Integer -> [Integer] ->  [Integer]
    sucECG2 x ys
      | x == 4 = 6: sucECG2 6 (delete 6 ys)
      | mod x 2 == 0 && isPrime (div x 2) = [div x 2,div (3*x) 2] ++sucECG2 (div (3*x) 2) (delete (div (3*x) 2) (delete (div x 2) ys))
      | otherwise =y:sucECG2 y (delete y ys)
      where y = head [n | n <- ys, gcd x n /= 1]
     
    graficaSucECG :: Int -> IO ()
    graficaSucECG n = do
      plotList [ Key Nothing
               , PNG "graficas/graficaSucECG.png"
               ]
               (take n sucECG)
  3. rafpueleo
    factores :: Integer -> [Integer]
    factores n = [ x | x <- [2..n], n `mod` x == 0]
     
    sucECG :: [Integer]
    sucECG = [1] ++ listaSuc 2 [1..]
      where listaSuc n (xs) = head [ y | y <- xs, elementoComun (factores y) (factores n)] : listaSuc (head[y | y <- xs, elementoComun (factores y) (factores n)]) (delete  (head [ y | y <- xs, elementoComun (factores y) (factores n)]) xs)
            elementoComun [] _ = False
            elementoComun (x:xs) (ys) | x `elem` ys = True
                                      |otherwise = elementoComun xs ys
  4. rebgongor
    import Data.List
    import Graphics.Gnuplot.Simple
     
    sucECG :: [Integer]
    sucECG = 1 : 2 : electro 2 [3..]
      where electro x xs = f xs
              where f (y:ys) | gcd x y > 1 = y : electro y (delete y xs)
                             | otherwise = f ys
     
     
     
    graficaSucECG :: Int -> IO ()
    graficaSucECG n = do
      plotList [Key Nothing, PNG "graficaSucECG.png"]
               (take n sucECG)

Los comentarios están cerrados.