Ir al contenido principal

Grado exponencial


El grado exponencial de un número n es el menor número x mayor que 1 tal que n es una subcadena de \(n^x\). Por ejemplo, el grado exponencial de 2 es 5 ya que 2 es una subcadena de 32 (que es \(2^5\)) y no es subcadena de las anteriores potencias de 2 (2, 4 y 16). El grado exponencial de 25 es 2 porque 25 es una subcadena de 625 (que es \(25^2\)).

Definir la función

gradoExponencial :: Integer -> Integer

tal que (gradoExponencial n) es el grado exponencial de n. Por ejemplo,

gradoExponencial 2      ==  5
gradoExponencial 25     ==  2
gradoExponencial 15     ==  26
gradoExponencial 1093   ==  100
gradoExponencial 10422  ==  200
gradoExponencial 11092  ==  300

Soluciones

import Test.QuickCheck
import Data.List (genericLength, isInfixOf)

-- 1ª definición
-- =============

gradoExponencial :: Integer -> Integer
gradoExponencial n =
  head [e | e <- [2..]
          , show n `isInfixOf` show (n^e)]

-- 2ª definición
-- =============

gradoExponencial2 :: Integer -> Integer
gradoExponencial2 n =
  2 + genericLength (takeWhile noSubcadena (potencias n))
  where c             = show n
        noSubcadena x = not (c `isInfixOf`show x)

-- (potencias n) es la lista de las potencias de n a partir de n^2. Por
-- ejemplo,
--    λ> take 10 (potencias 2)
--    [4,8,16,32,64,128,256,512,1024,2048]
potencias :: Integer -> [Integer]
potencias n =
  iterate (*n) (n^2)

-- Equivalencia
-- ============

-- La propiedad es
prop_gradosExponencial_equiv :: (Positive Integer) -> Bool
prop_gradosExponencial_equiv (Positive n) =
  gradoExponencial n == gradoExponencial2 n

-- La comprobación es
--    λ> quickCheck prop_gradosExponencial_equiv
--    +++ OK, passed 100 tests.

Referencia

Basado en la sucesión A045537 de la OEIS.