Menu Close

Menor potencia de 2 que comienza por n

Definir las funciones

   menorPotencia            :: Integer -> (Integer,Integer)
   graficaMenoresExponentes :: Integer -> IO ()

tales que

  • (menorPotencia n) es el par (k,m) donde m es la menor potencia de 2 que empieza por n y k es su exponentes (es decir, 2^k = m). Por ejemplo,
     menorPotencia 3             ==  (5,32)
     menorPotencia 7             ==  (46,70368744177664)
     fst (menorPotencia 982)     ==  3973
     fst (menorPotencia 32627)   ==  28557
     fst (menorPotencia 158426)  ==  40000
  • (graficaMenoresExponentes n) dibuja la gráfica de los exponentes de 2 en las menores potencias de los n primeros números enteros positivos. Por ejemplo, (graficaMenoresExponentes 200) dibuja
    Menor_potencia_de_2_que_comienza_por_n

Soluciones

import Data.List               (isPrefixOf)
import Graphics.Gnuplot.Simple (Attribute (Key, PNG), plotList)
 
-- 1ª definición
-- =============
 
menorPotencia :: Integer -> (Integer,Integer)
menorPotencia n =
  head [(k,m) | (k,m) <- zip [0..] potenciasDe2
              , cs `isPrefixOf` show m]
  where cs = show n
 
-- potenciasDe 2 es la lista de las potencias de dos. Por ejemplo,
--    take 12 potenciasDe2  ==  [1,2,4,8,16,32,64,128,256,512,1024,2048]
potenciasDe2 :: [Integer]
potenciasDe2 = iterate (*2) 1
 
-- 2ª definición 
-- =============
 
menorPotencia2 :: Integer -> (Integer,Integer)
menorPotencia2 n = aux (0,1)
  where aux (k,m) | cs `isPrefixOf` show m = (k,m)
                  | otherwise              = aux (k+1,2*m)
        cs = show n
 
-- 3ª definición 
-- =============
 
menorPotencia3 :: Integer -> (Integer,Integer)
menorPotencia3 n =
  until (isPrefixOf n1 . show . snd) (\(x,y) -> (x+1,2*y)) (0,1)
  where n1 = show n
 
-- Comparación de eficiencia
-- =========================
 
--    λ> maximum [fst (menorPotencia n) | n <- [1..1000]]
--    3973
--    (3.69 secs, 1,094,923,696 bytes)
--    λ> maximum [fst (menorPotencia2 n) | n <- [1..1000]]
--    3973
--    (5.13 secs, 1,326,382,872 bytes)
--    λ> maximum [fst (menorPotencia3 n) | n <- [1..1000]]
--    3973
--    (4.71 secs, 1,240,498,128 bytes)
 
graficaMenoresExponentes :: Integer -> IO ()
graficaMenoresExponentes n =
  plotList [ Key Nothing
           , PNG "Menor_potencia_de_2_que_comienza_por_n.png"
           ]
           (map (fst . menorPotencia) [1..n])
Inicial

5 soluciones de “Menor potencia de 2 que comienza por n

  1. angruicam1
    import Data.List               (isPrefixOf)
    import Graphics.Gnuplot.Simple (plotList, Attribute (Key))
     
    menorPotencia :: Integer -> (Integer,Integer)
    menorPotencia n =
      until (isPrefixOf n’ . show . snd) ((x,y) -> (x+1,2*y)) (0,1)
      where n’ = show n
     
    -- Gráfica
    -- =======
     
    graficaMenoresExponentes :: Integer -> IO ()
    graficaMenoresExponentes n =
      plotList
      [Key Nothing]
      (map (fst . menorPotencia) [1..n])
  2. jaiturrod
    import Data.List
     
    menorPotencia :: Integer -> (Integer,Integer)
    menorPotencia n =
      head [(a,b) | (a,b) <- pares, isPrefixOf (show n) (show b)]
     
    pares :: [(Integer, Integer)]
    pares = [(a,b) | (a,b) <- zip [0..] (iterate (*2) 1)]
  3. albcarcas1
    import Data.List (isPrefixOf)
    import Graphics.Gnuplot.Simple 
     
    menorPotencia :: Integer -> (Integer,Integer)
    menorPotencia n = aux n parPotencias
      where aux n (x:xs) | isPrefixOf (show n) (show (snd x)) = x
                         | otherwise                          = aux n xs
     
    parPotencias :: [(Integer,Integer)]
    parPotencias = zip [0..] (iterate (2*) 1)
     
    graficaMenoresExponentes :: Integer -> IO ()
    graficaMenoresExponentes n =
      plotList [Title "Grafica Menores Exponentes", Key Nothing] 
               (map (fst . menorPotencia) [1..n])
  4. alerodrod5
    import Data.List               (isPrefixOf)
    import Graphics.Gnuplot.Simple (plotList, Attribute (Key))
     
    menorPotencia :: Integer -> (Integer,Integer)
    menorPotencia x =
      head [(n,2^n) | n <- [1..], isPrefixOf (show x) (show $ 2^n)]
     
    graficaMenoresExponentes :: Integer -> IO ()
    graficaMenoresExponentes n =
      plotList [Key Nothing]
               (map (fst . menorPotencia) [1..n])

    LocalWords: Key

  5. carbremor
    import Graphics.Gnuplot.Simple
    import Data.List
     
    menorPotencia :: Integer -> (Integer, Integer)
    menorPotencia n = head [ (k, m) | (k, (d, m)) <- zip [0..] $ zip dp2 potencias2, let r = d - nDigitos n, r >= 0 && n == (m `div` (10^r))]
     
    -- λ> menorPotencia 7 
    -- (46,70368744177664)
    -- (0.01 secs, 208,216 bytes)
     
    potencias2 :: [Integer]
    potencias2 = scanl (a b -> a+b) 1 potencias2
     
    -- λ> take 12 potencias2
    -- [1,2,4,8,16,32,64,128,256,512,1024,2048]
    -- (0.09 secs, 115,168 bytes)
     
    nDigitos :: Integer -> Integer
    nDigitos = toInteger . ceiling . logBase 10 . fromIntegral . (+1)
     
    -- λ> nDigitos 64848748
    -- 8
    -- (0.01 secs, 73,080 bytes)
     
    dp2 :: [Integer]
    dp2 = map nDigitos potencias2
     
    -- λ> take 15 dp2
    -- [1,1,1,1,2,2,2,3,3,3,4,4,4,4,5]
    -- (0.01 secs, 113,088 bytes)
     
    -- Gráfica
     
    graficaMenoresExponentes :: Integer -> IO ()
    graficaMenoresExponentes n =
      plotList
      [Key Nothing]
      (map (fst . menorPotencia) [1..n])

Escribe tu solución

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