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.